UIAutomator2是一个安卓App测试的自动化工具,它通过模拟点击实现对App的功能测试。
除了UIAutomator2外,还有Appium、AirTest等App自动测试框架。
自动化框架 | 支持平台 | 语言 | 特点 |
---|---|---|---|
Appium | Android、iOS、Windows | Java、Python、Ruby等 | 跨平台,支持多种编程语言,是APP UI自动化领域的标杆产品 |
AirTest | Android、iOS、Windows | Python | 基于图像识别和UI控件检索技术,适用于游戏和应用测试,上手简单,通过图像识别技术定位UI元素,无需嵌入代码即可进行自动化测试 |
UIAutomator2 | Android | Python | API设计简洁易用,适用于较简单的原生Android应用,支持跨app操作,但无法使用录制功能,适用于对性能要求不高、操作简单的测试场景 |
本文是App测试自动化系列工具之UIAutomator2的使用。
1. 安装python
略
2. 环境准备
2.1. 配置adb
把adb的路径配置到环境变量path
中即可。
从官网下载adb,并将配置adb.exe
所在文件夹配置到环境变量path
中即可。
如果已经通过Android Studio安装过Android SDK,在Android Studio按下ctrl + alt + s
,依次打开Languages & Frameworks -> Android SDK -> SDK Tool
,确认是否安装Android SDK Platform-Tools
,若没安装就安装。安装后在当前页面查看Android SDK Location
配置,然后打开Android SDK Location
配置的路径,找到platform-tools
文件夹,该文件夹下有adb.exe
,将platform-tools
文件夹配置到环境变量path
中即可。
2.2. 安装weditor(也可以用后文的uiautodev替代)
weditor是一款基于浏览器的UI查看器,用于查看UI元素定位。
pip install weditor
查看是否安装成功
weditor --help
注:运行weditor --help
时,可能出现ModuleNotFoundError: No module named 'pkg_resources'
报错,这是因为缺失setuptools,解决办法是执行pip install setuptools
安装setuptools。
2.3. 连接设备
使用真机调试:手机打开开发者模式,通过USB或Wifi连接到电脑;
使用模拟器调试:打开模拟器模拟设备即可。
2.4. 安装uiautomator2
pip install uiautomator2
3. 使用weditor定位元素
运行weditor
python -m weditor
或
weditor
启动后会打开浏览器窗口,当设备连接电脑后,点击"Connect"连接设备,点击"Dump Hierarchy"同步设备当前页面到网页,点击左侧同步的页面即可获取xpath、resourceId、text等信息。
4. 示例代码
import time
import uiautomator2 as u2
# usb连接。可在cmd窗口输入adb devices获取设备号
# device = u2.connect("emulator-5554")
# 只有一个设备时,可以省略参数
device = u2.connect()
print("设备信息:", device.info)
print("已安装应用:", device.app_list())
print("运行中的应用:", device.app_list_running())
print("当前界面的app:", device.app_current())
appPkgName = "tv.danmaku.bili"
# 打开应用
# device.app_start(appPkgName)
# 启动应用前停止应用
device.app_start(appPkgName, stop=True)
# 根据resourceId定位元素,并等待10s待其出现
device(resourceId="tv.danmaku.bili:id/count_down").wait(timeout=10)
# 开屏如果存在跳过按钮就点击
if device(resourceId="tv.danmaku.bili:id/count_down").exists:
device(resourceId="tv.danmaku.bili:id/count_down").click()
print("click skip button by resourceId")
# 根据元素内容单击
device(text="热门").click()
device(text="推荐").click()
# 根据坐标点击
# device.click(100,200)
time.sleep(1)
adTag = '//*[@resource-id="tv.danmaku.bili:id/ad_tint_frame"]/android.widget.ImageView[1]'
adFoundCnt = 0
while adFoundCnt < 10:
adFoundCnt += 1
# 屏幕上滑,滑动距离默认为屏幕宽度的90%。direction取值有"left", "right", "up", "bottom"四种
device.swipe_ext("up")
time.sleep(3)
# 屏幕上滑,滑动距离为屏幕宽度的30%(范围为0-1)
device.swipe_ext("up", scale=0.3)
time.sleep(2)
# 根据xpath长按
if device.xpath(adTag).exists:
device.xpath(adTag).long_click()
# 字符串匹配
device(textContains="感兴").click()
break
def fillAndSearch(text):
# 也可以用device.xpath('//*[@resource-id="tv.danmaku.bili:id/search_plate"]').set_text(text)完成输入
# 让光标定位到输入框
device(resourceId="tv.danmaku.bili:id/search_plate").click()
# 清楚输入框
device.clear_text()
# 输入内容
device.send_keys(text)
device(resourceId="tv.danmaku.bili:id/action_search").click()
time.sleep(2)
if device(resourceId="tv.danmaku.bili:id/search_image").exists:
device(resourceId="tv.danmaku.bili:id/search_image").click()
fillAndSearch("uiautomator2使用")
elif device(resourceId="tv.danmaku.bili:id/search_icon").exists:
device(resourceId="tv.danmaku.bili:id/search_icon").click()
fillAndSearch("uiautomator2使用")
# 点击系统级的返回按钮
device.press("back")
# 关闭app
device.app_stop(appPkgName)
5. uiautomator2定位元素方式及用法
名称 | 描述 |
---|---|
text | text是指定文本的元素 |
textContains | text中包含有指定文本的元素 |
textMatches | text符合指定正则的元素 |
textStartsWith | text以指定文本开头的元素 |
className | className是指定类名的元素 |
classNameMatches | className类名符合指定正则的元素 |
description | description是指定文本的元素 |
descriptionContains | description中包含有指定文本的元素 |
descriptionMatches | description符合指定正则的元素 |
descriptionStartsWith | description以指定文本开头的元素 |
checkable | 可检查的元素,参数为True,False |
checked | 已选中的元素,通常用于复选框,参数为True,False |
clickable | 可点击的元素,参数为True,False |
longClickable | 可长按的元素,参数为True,False |
scrollable | 可滚动的元素,参数为True,False |
enabled | 已激活的元素,参数为True,False |
focusable | 可聚焦的元素,参数为True,False |
focused | 获得了焦点的元素,参数为True,False |
selected | 当前选中的元素,参数为True,False |
packageName | packageName为指定包名的元素 |
packageNameMatches | packageName为符合正则的元素 |
resourceId | resourceId为指定内容的元素 |
resourceIdMatches | resourceId为符合指定正则的元素 |
6. uiautodev的安装与使用
uiautodev是weditor作者开发的另一个UI元素定位工具,界面更加友好。weditor已经不再维护了。
6.1. 安装
pip install uiautodev
或
pip install uiautodev -i https://pypi.doubanio.com/simple
6.2. 查看是否安装成功
uiautodev --help
或
uiauto.dev --help
6.3. 运行
uiautodev
或
uiauto.dev
或
python -m uiautodev
6.4. 使用
uiautodev启动后会打开浏览器窗口。
在网页选择对应的设备;
点击刷新可同步设备当前页面到网页;
点击左侧同步的页面即可获取xpath、resourceId、text等信息,右侧还可查看层级信息。