干货 | 一文搞定 uiautomator2 自动化测试工具使用
Google 官方提供了一个 Android 自动化测试工具(Java 库),基于 Accessibility 服务,功能很强,可以对第三方 App 进行测试,获取屏幕上任意一个 App 的任意一个控件属性,并对其进行任意操作,但有两个缺点:1.测试脚本只能使用 Java 语言;2.测试脚本要打包成 jar 或者 apk 包上传到设备上才能运行;实际工作中,我们希望测试逻辑能够用 Python 编写,能够在电脑上运行的时候就控制手机。所以基于这个目的开发了 python-uiautomator2 自动化测试开源工具,其封装了谷歌自带的 uiautomator2 测试框架,可以运行在支持 Python 的任一系统上,目前版本为 V2.10.2。GitHub 开源地址:如图所示,python-uiautomator2 主要分为两个部分,python 客户端,移动设备
python 端: 运行脚本,并向移动设备发送 HTTP 请求;
移动设备:移动设备上运行了封装了 uiautomator2 的 HTTP 服务,解析收到的请求,并转化成 uiautomator2 的代码;
整个过程:
3.在移动设备上安装 atx-agent(守护进程),随后 atx-agent 启动 uiautomator2 服务(默认 7912 端口)进行监听;
4.在 PC 上编写测试脚本并执行(相当于发送 HTTP 请求到移动设备的 server 端);
5.移动设备通过 WIFI 或 USB 接收到 PC 上发来的 HTTP 请求,执行制定的操作;
使用 pip 安装
安装完成后,使用如下 python 代码查看环境是事配置成功
说明:后文中所有代码都需要导入 uiautomator2 库,为了简化我使用 u2 代替,d 代表 driver
能正确打印出设备的信息则表示安装成功
注意:需要安装 adb 工具,并配置到系统环境变量,才能操作手机。
安装有问题可以到 issue 列表查询:
weditor 是一款基于浏览器的 UI 查看器,用来帮助我们查看 UI 元素定位。
因为 uiautomator 是独占资源,所以当 atx 运行的时候 uiautomatorviewer 是不能用的,为了减少 atx 频繁的启停,就需要用到此工具
使用 pip 安装
查看安装是否成功
出现如下信息表示安装成功
运行 weditor
ui2 支持 android 中 UiSelector 类中的所有定位方式,详细可以在这个网址查看 https://developer.android.com/reference/android/support/test/uiautomator/UiSelector
整体内容如下 , 所有的属性可以通过 weditor 查看到
子元素定位 child()兄弟元素定位 sibling()链式调用相对定位支持在 left, right, top, bottom, 即在某个元素的前后左右表格标注有 @property 装饰的类属性方法,均为下方示例方式
exists 其它使用方法:info() 输出信息:可以通过上方信息分别获取元素的所有属性因为 Java uiautoamtor 中默认是不支持 xpath,这是属于 ui2 的扩展功能,速度会相比其它定位方式慢一些在 xpath 定位中,ui2 中的 description 定位需要替换为 content-desc,resourceId 需要替换为 resource-id 使用方法 Android<4.3 时不能使用拖动滑动有两个,一个是在 driver 上操作,一个是在元素上操作元素上操作从元素的中心向元素边缘滑动 driver 上操作即对整个屏幕操作 driver 滑动的扩展方法,可以直接实现滑动,不需要再自己封装定位点 android>4.3 对元素操作封装好的放大缩小操作设置 scrollable 属性为 True;滚动类型:horiz 为水平,vert 为垂直;滚动方向:
forward 向前
backward 向后
toBeginning 滚动至开始
toEnd 滚动至最后
to 滚动直接某个元素出现
所有方法均返回 Bool 值;
5.8.1 输入自定义文本
5.8.2 输入按键
两种方法
目前 press 支持的按键如下
keyevent 是通过 “adb shell input keyevent” 方式输入,支持按键更加丰富
更多详细的按键信息 https://developer.android.com/reference/android/view/KeyEvent.html
5.8.3 输入法切换
5.8.4 模拟输入法功能
可以模拟的功能有 go ,search ,send ,next, done ,previous。
如果使用 press 输入按键无效,可以尝试使用此方法输入
使用 wather 进行界面的监控,可以用来实现跳过测试过程中的弹框
当启动 wather 时,会新建一个线程进行监控
可以添加多个 watcher
用法
2.11.0 版本 新增了一个 watch_context 方法 , 写法相比 watcher 更简洁,官方推荐使用此方法来实现监控,目前只支持 click() 这一种方法。
这里可以用来实现图案解锁
使用 touch 类
这个感觉是比较有用的一个功能,可以在测试用例开始时录制,结束时停止录制,然后如果测试 fail。则上传到测试报告,完美复原操作现场,具体原理后面再去研究。
首先需要下载依赖,官方推荐使用镜像下载:
执行录制:
下载与录制视频同一套依赖。
这个功能是首先手动截取需要点击目标的图片,然后 ui2 在界面中去匹配这个图片,目前我尝试了精确试不是很高,误点率非常高,不建议使用。
可以从本地路径及 url 下载安装 APP,此方法无返回值,当安装失败时,会抛出 RuntimeError 异常
默认当应用在运行状态执行 start 时不会关闭应用,而是继续保持当前界面。
如果需要消除前面的启动状态,则需要加 stop=True 参数。
stop 和 clear 的区别是结束应用使用的命令不同
stop 使用的是 “am force-stop”
clear 使用的是 “pm clear”
卸载全部应用返回的包名列表并一定是卸载成功了,最好使用 verbose=true 打印一下信息,这样可以查看到是否卸载成功
或者可以修改一下源码,使其只输出成功的包名,注释的为增加的代码,未注释的是源码
connect() 可以使用如下其它方式进行连接
8.2.1 获取 driver 信息
8.2.2 获取设备信息
会输出测试设备的所有信息,包括电池,CPU,内存等
8.2.3 获取屏幕分辨率
8.2.4 获取 IP 地址
8.3.1 使用 settings 设置
查看 settings 默认设置
修改默认设置,只需要修改 settings 字典即可
8.3.2 使用方法或者属性设置
http 默认请求超时时间
当设备掉线时,等待设备在线时长
元素查找默认等待时间
打开 HTTP debug 信息
休眠
value 值参考,只要是元组中的任一一个值就可以。
打开通知栏
打开快速设置
8.7.1 导入文件
8.7.2 导出文件
使用 shell 方法执行
8.8.1 执行非阻塞命令
output 返回的是一个整体的字符串,如果需要抽取值,需要对 output 进行解析提取处理
8.8.2 执行阻塞命令(持续执行的命令)
源码描述
因为有 atx-agent 的存在,Uiautomator 会被一直守护着,如果退出了就会被重新启动起来。但是 Uiautomator 又是霸道的,一旦它在运行,手机上的辅助功能、电脑上的 uiautomatorviewer 就都不能用了,除非关掉该框架本身的 uiautomator
使用代码停止
手动停止
直接打开 ATX APP(init 成功后,就会安装上),点击关闭 UIAutomator
以上,欢迎大家一起交流探讨。
评论