1. UiAutomator2 是什么

可能很多人对 UiAutomator2 和 UiAutomator 傻傻分不清楚

UiAutomator 是 Google 开发的一款运行在 Android 设备上的 UI 自动化测试工具,基于JAVA语言,使用它有一个限制,就是必须打包成 APK 或 JAR,然后上传到设备,才能运行

事实上,UiAutomator2 同样有 JAVA和 Python 版,今天我们聊的是 Python 版本的 UiAutomator2

至于 JAVA 版本的可以参考之前写的文章:点我查看

Python 版本的 UiAutomator2 项目地址:

https://github.com/openatx/uiautomator2

2.Appium 和 UiAutomator2

作为移动端自动化的鼻祖,早期版本的 Appium 是基于 UiAutomator 和 Bootstrap.jar

其中,Bootstrap 在 Appium初始化的时候,被推送到 Android 设备上,负责监听 Appium 发过来的请求,并转换后发送给 UiAutomator 去处理,完成自动化操作

最新版本的 Appium 加入了对 UiAutomator2 的支持,原理进行了更新,功能和稳定性更加完善

原理图可以参考:

3.准备

在使用 UiAutomator2 之前,需要做如下准备

1、在 PC 端配置 Android 开发环境

2、使用 pip 安装 uiautomator2 依赖

# 安装依赖
pip3 install -U uiautomator2 # 如果需要截屏,需要安装pillow
pip3 install pillow

3、在手机上安装 atx-agent 应用

ps:atx-agent 作为服务端,一直运行在后台

# 安装apk服务到手机上
python -m uiautomator2 init

4、安装 weditor

WEditor 通过 ip 连接手机,即可以实时查看 App 的界面元素信息

和 Appium DeskTop 类似,可以模拟点击、滑动操作、生成操作源码等功能

首先,通过 pip 安装 weditor 依赖包

# 基于浏览器查看 App 的界面元素
pip3 install -U weditor

然后,在命令行输入 weditor,会自动在浏览器中打开,接着通过 ip 连接对应的设备,即可以获取设备端当前界面的控件信息

信息内容包含:控件的层级关系、控件 ID、文本内容、坐标值等内容

4.实战一下

还是以闲鱼搜索商品为例,聊聊 UiAutomator2 的使用

1、连接设备

使用 UiAutomator2 连接设备有 3 种方式,分别是:

  • 局域网设备 IP 地址

  • USB 连接 + 设备序列号

  • ADB + IP + 端口号

import uiautomator2 as u2

# 方式一:局域网设备ip地址
device = u2.connect(手机ip地址) # 方式二:USB + 设备序列号
device = u2.connect(手机序列号) # 方式三:ADB+
# 首先,设备用USB线连接PC,输入命令:adb tcpip 端口号进行映射
# 拔掉USB线,通过ip地址+端口号进行连接
device = u2.connect_adb_wifi(手机ip地址:端口号)

2、打开闲鱼 APP

调用上面 device 对象中 app_start() 方法,传入应用的包名作为参数可以打开应用

需要注意的是,方法中的第二个参数如果传入 True,可以冷启动 App,默认值为 False

# 打开应用
device.app_start(PACKAGE_NAME, stop=True)

3、点击搜索栏进入搜索界面

首先,全局设置一个隐式等待,保证查找元素的时候避免因为卡顿、网络导致的异常

# 隐式等待20s,保证控件加载完成
device.implicitly_wait(20)

然后,通过 WEditor 定位到搜索入口控件的基本信息

常用的 UiAutomator2 定位方式有 6 种,分别是:

  • ID 定位

  • Text 文本定位

  • Description 定位

  • ClassName 定位

  • Xpath 定位

  • 组合定位

例如:

# 常用的6种定位方式
# 方式一:ID定位
d(resourceId=元素ID).click() # 方式二:Text文本定位
d(text="公众号:AirPython").click() # 方式三:Description值定位
d(description="AirPython").click() # 方式四:ClassName定位
d(className="android.widget.TextView").click() # 方式五:Xpath定位
d.xpath("//*[@content-desc='AirPython']") # 方式六:组合定位
d(className="android.widget.ListView", resourceId=元素ID)

需要指出的是,当界面属性值不唯一的时候,组合定位就显得很实用

本例直接使用 ID 去找到元素,然后执行点击操作,跳转到搜索界面

# 点击到搜索页面
device(resourceId="com.taobao.idlefish:id/search_bg_img_front",).click()

4、搜索

UiAutomator2 中提供了 send_keys() 方法,用于向输入框中设置文本

注意:参数 clear 如果设置为 True,则在输入内容之前,会先清空输入框,默认值为 False

# 输入内容
device.send_keys("Python", clear=True) # 点击搜索按钮
device(text="搜索").click()

5、滑动

UiAutomator2 提供了两个方法用于滑动界面,分别是:

  • swipe_ext( 滑动方向 )

  • swipe( 开始 x 轴,开始 y 轴,结束 x 轴,结束 y 轴值,滑动时间 )

经过测试发现,滑动操作,swipe_ext() 使用效果不稳定,建议使用 swipe() 函数

for i in range(5):
print('滑动一次')
swipe_custom(device, 0.5, 0.8, 0.5, 0.2, 1.2)

另外,为了保证兼容不同分辨率的设备,建议通过屏幕百分比自定义滑动方法

def swipe_custom(device, start_x_percent, start_y_percent, end_x_percent, end_y_percent, during=1.0, interval=1):
"""
自定义滑动,适配性更高
:param device:
:param start_x_percent:
:param start_y_percent:
:param end_x_percent:
:param end_y_percent:
:param during:
:return:
"""
# 获取屏幕的宽、高度
width, height = device.window_size()
device.swipe(start_x_percent * width, start_y_percent * height, end_x_percent * width, end_y_percent * height,
during) if interval > 0:
sleep(interval)

6、关闭应用

在完成自动化操作后,就可以调用 app_stop() 方法强制关闭应用

# 停止App
device.app_stop(PACKAGE_NAME)

当然,可以在每次操作完,使用 UiAutomator2 提供的方法 app_clear() 清除 App 数据

# 清除App数据
# device.app_clear(PACKAGE_NAME)

5.最后

通过上面的实例,我们发现 UiAutomator2 相比 Appium,语法更简洁易懂,代码量也少了很多

但是由于 Uiautomator2 仅适用于 Android 端,Appium 拥有多语言、跨平台的特性,企业级自动化一般会选择后者

我已经将文中全部源码上传到后台,关注公众号「 AirPython 」后回复「 uiauto2 」即可获得全部源码

如果你觉得文章还不错,请大家 点赞、分享、留言下,因为这将是我持续输出更多优质文章的最强动力!

推荐阅读

带你用 Python 实现自动化群控(入门篇)

聊聊 Python 做微信小程序自动化,那些踩过的坑?

Python 自动化,Helium 凭什么取代 Selenium?

App 自动化,Appium 凭什么使用 UiAutomator2?的更多相关文章

  1. app自动化appium使用内置adb命令

    一.Appium-server使用 1.登陆页面 高级设置:可以设置Android 和 IOS 日志级别:dabug非常详尽的日志 记录python代码向他发送的请求以及他在收到请求后做的一系列处理 ...

  2. robotframework+appium 实现App自动化值环境搭建(一)

    第一步: Cmd命令输入pip install robotframework-appiumlibrary  下载和导入appiumlibrary 第二步: 安装JDK,附件有JDK1.8安装包 第三步 ...

  3. Appium + Python App自动化第一个脚本

    今天跟大家讲解一个Appium和Python App自动化的脚本.[1]打开你的夜神模拟器(或者连接你的手机) [2]打开桌面的Appium [3]下载你要测的App的apk文件,放到桌面[4]拖动你 ...

  4. [python]Appium+python +pytest 实现APP自动化,基于安卓

    1.安卓环境搭建 &关于app自动化,个人觉得安装过程比较复杂,脚本难度实现和web自动化差不多封装关键字即可,因此,下面会写安装.启动APP以及过程中遇到的一些坑(这一篇偏向解释给个人) & ...

  5. app自动化问题点整理

    1.配置SDK环境发现adb无法生效: 解决方案: 这个问题一般就是你的环境变量没有配置好,很多同学比较容易出现的点就是win10系统的环境变量配置: 一定要注意打开path添加:%ANDROID_H ...

  6. App自动化《元素定位方式、元素操作、混合应用、分层设计、代码方式执行Pytest 命令》

    坚持原创输出,点击蓝字关注我吧 作者:清菡 博客:oschina.云+社区.知乎等各大平台都有. 目录 一.App 元素定位方式 二.元素操作 三.测试混合应用 四.以代码的方式执行 Pytest 命 ...

  7. APP自动化框架LazyAndroid使用手册(2)--元素自动抓取

    作者:黄书力 概述 前面的一篇博文简要介绍了安卓自动化测试框架LazyAndroid的组成结构和基本功能,本文将详细描述此框架中元素自动抓取工具lazy-uiautomaterviewer的使用方法. ...

  8. APP自动化框架LazyAndroid使用手册(1)--框架简介

    作者:cryanimal  QQ:164166060 APP自动化简介 APP自动化,即通过自动化的方式,对APP施行一系列的仿按键输入.触摸屏输入.手势输入等操作,以达到对APP的功能进行自动化测试 ...

  9. 用java和junit编写app自动化测试用例

    package myTest; import static org.junit.Assert.*; import io.appium.java_client.android.AndroidDriver ...

随机推荐

  1. PHP import_request_variables() 函数

    import_request_variables() 函数将 GET/POST/Cookie 变量导入到全局作用域中.该函数在最新版本的 PHP 中已经不支持.高佣联盟 www.cgewang.com ...

  2. PHP sleep() 函数

    实例 延迟执行当前脚本 5 秒: <?phpecho date('h:i:s') . "<br>"; //sleep for 5 secondssleep(5); ...

  3. PHP addcslashes() 函数

    实例 在字符 "W" 前添加反斜杠: <?php 高佣联盟 www.cgewang.com$str = addcslashes("Hello World!" ...

  4. 下载excel模板,导入数据时需要用到

    页面代码: <form id="form1" enctype="multipart/form-data"> <div style=" ...

  5. luogu P3829 [SHOI2012]信用卡凸包 凸包 点的旋转

    LINK:信用卡凸包 当 R==0的时候显然是一个点的旋转 之后再求凸包即可. 这里先说点如何旋转 如果是根据原点旋转的话 经过一个繁杂的推导可以得到一个矩阵. [cosw,-sinw] [sinw, ...

  6. Vuex详细教程

    1.认识Vuex 1.1Vuex是做什么的 官方解释:Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式.它采用 集中式存储管理 应用的所有组件的状态,并以相应的规则保证状态以一种可预测的 ...

  7. 【JZOJ4726】种花 题解(贪心+堆)

    题目大意:在一个长度为$n$的环型序列中取出$m$个数使这$m$个数的和最大,且要求这$m$个数互不相邻. ---------------------- 考虑维护$nxt$和$lst$,即一个数的前驱 ...

  8. Prometheus监控神器-Alertmanager篇(1)

    本章节主要涵盖了Alertmanager的工作机制与配置文件的比较详细的知识内容,由浅入深的给大家讲解. 警报一直是整个监控系统中的重要组成部分,Prometheus监控系统中,采集与警报是分离的.警 ...

  9. CentOS7 安装 SonarQube

    安装 SonarQube 环境 系统 CentOS 7 数据库 postgresql 10 系统配置 查看系统配置 sysctl vm.max_map_count sysctl fs.file-max ...

  10. GitLab 查看版本号

    cat /opt/gitlab/embedded/service/gitlab-rails/VERSION