一,前言
- uiautomator是Google提供的用来做安卓自动化测试的一个Java库。功能很强,可以对第三方App进行测试,获取屏幕上任意一个APP的任意一个控件属性,并对其进行任意操作,但有两个缺点:
- 测试脚本只能使用Java语言
- 测试脚本必须每次被上传到设备上运行。
-
我们希望测试能够用Python编写,能够在电脑上运行的时候就控制手机,于是就有了uiautomator,后来又有了uiautomator2,详情查看github地址https://github.com/openatx/uiautomator2
-
环境准备
python 3.6
uiautomator2 0.3.3
二,uiautomator2工作原理
- 分为两个部分:
- PC上的python端:运行脚本,并向系统设备发送http请求
- 移动设备:移动设备上运行了封装了uiautomator2的HTTP服务,解析收到的请求,并转化成uiautomator2的代码。
2.整个过程 - 在移动设备上安装atx-agent(守护进程), 随后atx-agent启动 uiautomator2 服务 (默认 7912 端口) 进行监听
- 在 PC 上编写测试脚本并执行(相当于发送 HTTP 请求到移动设备的 server 端)
- 移动设备通过 WIFI 或 USB 接收到 PC 上发来的 HTTP 请求,执行制定的操作
三,安装工具
- 安装工具
- Python2 或者 Python3 均可。(也可以尝试使用 Android 上 Python 客户端:QPython)
- 移动设备
- 环境搭建
- 安装 adb
如命令行可以执行adb devices,则跳过此步骤,从谷歌官网下载 Android Platform Tools https://developer.android.com/studio/releases/platform-tools.html,解压,并加包含adb.exe的目录加入到系统的 PATH 中。
- 安装 python-uiautomator2
pip install --pre -U uiautomator2
- 设备安装 atx-agent
首先设备连接到 PC,并能够通过 adb devices 发现该设备。
# 从github下载atx-agent文件,并推送到手机。在手机上安装包名为`com.github.uiautomator`的apk
$ python -m uiautomator2 init
success
最后提示 success,代表 atx-agent 初始化成功。
- 应用及操作,调用 uiautomator2 的过程
- 配置手机设备参数,设置具体操作的是哪一台手机
- 抓取手机上应用的控件,制定对应的控件来进行操作
- 对抓取到的控件进行操作,比如点击、填写参数等。
- 配置手机设备参数
-
python-uiautomator2 连接手机的方式有两种,一种是通过 WIFI,另外一种是通过 USB。两种方法各有优缺点。
-
WIFI 最便利的地方要数可以不用连接数据线,USB 则可以用在 PC 和手机网络不在一个网段用不了的情况。
6.1 使用 WIFI 连接
- 手机获取到手机的 IP,并确保电脑可以 PING 通手机。手机的 IP 可以在设置-WIFI 设置里面获取到。
- 比如手机的 IP 是192.168.0.100,连接设备的代码为
import uiautomator2 as u2 d = u2.connect('192.168.0.100')
6.2 使用 USB 连接
- 手机的序列号可以通过adb devices获取到,假设序列号是123456f,连接代码为
import uiautomator2 as u2 d = u2.connect_usb('123456f')
-
抓取手机上应用的控件
虽然很想用 Android SDK 内置工具uiautomatorviewer.bat,但是运行 uiautomator2 的时候,uiautomatorviewer.bat运行不起来,两者之间冲突太严重。
于是参考着uiautomatorviewer的界面,可以使用weditor,调用 python-uiautomator2 的两个接口screenshot和dump_hierarchy这样就不会有冲突问题了
weditor的安装使用方法详见第二篇帖子 -
定位方式
- ResourceId 定位: d(resourceId=“com.smartisanos.clock:id/text_stopwatch”).click()
- Text 定位 d(text=“秒表”).click()
- Description 定位 d(description="…").click()
- ClassName 定位 d(className=“android.widget.TextView”).click()
- 操作控件
- click操作:d(text=“Settings”).click()
- long click操作:d(text=“Settings”).long_click()
- 等待元素的出现:d(text=“Settings”).wait(timeout=10.0)
- 中文字符的输入
- 如果可以定位到元素,直接通过 set_text 就可以输入中文:d(text=“Settings”).set_text(“你好”)
- 如果定位不到元素需要使用send_keys方法,以及切换输入法
d.set_fastinput_ime(True)
d.send_keys("你好 Hello")
d.set_fastinput_ime(False) # 输入法用完关掉
- 截图:d.screenshot(“home.jpg”)
- 获取图层信息:xml = d.dump_hierarchy()
- 九宫格解锁
13.1 通常这种方式会用在很多的理财软件,开机密码,等等与安全有关的地方。那改如何用自动化的方式测试它呢。
13.2 其实实现起来也很简单。Uiautomator2 里面有一个 swipe 方法,可以通过传入多个点的坐标来实现解锁九宫格
13.3 说了这么多,直接上代码吧。
13.4 其中(0.235, 0.456) 代表 X(23.5%) Y(45.6%). 这里用绝对坐标也可以。import uiautomator2 as u2 u = u2.connect() # 手机连接到PC即可 u.swipe_points([(0.235, 0.456), (0.503, 0.449), (0.509, 0.601), (0.777, 0.603), (0.771, 0.763), (0.222, 0.75)], 0.2)
13.5 最后的 0.2 代表每一次滑动的时间。