Android自动化测试实践:uiautomator2 核心功能与应用指南
uiautomator2
是一个用于Android应用的自动化测试Python库,支持多设备并行测试操作。它提供了丰富的API来模拟用户对App的各种操作,如安装、卸载、启动、停止以及清除应用数据等。此外,uiautomator2
支持多种设备连接方式,包括USB、模拟器默认连接以及通过WiFi(TCP/IP)连接。
核心功能:
- 设备连接与操作:支持USB和WiFi(TCP/IP)方式连接设备,提供了查看设备列表的命令和示例代码。
- 应用管理:能够安装和卸载应用,启动、停止以及获取正在运行的应用列表。
- 节点选择器:提供多种节点选择器,如基于文本、类名、描述、元素状态、包名、资源ID等来定位UI元素。
- 节点操作:支持获取匹配节点列表、节点存在性判断、节点计数,以及查找父级节点、子节点和同级元素。
- 事件操作:模拟用户交互,如点击、输入文本、滑动屏幕等。
- 坐标定位:获取元素坐标并执行坐标点击。
- 提示信息获取:能够获取系统提示语。
适用场景:
- 自动化测试:为Android应用提供自动化测试解决方案,提高测试效率。
- 应用开发:辅助开发者在开发过程中快速定位和测试UI元素。
- 教育与研究:作为学习和研究Android自动化测试工具的资源。
使用注意:
- 确保设备开启了开发者选项和USB调试。
- 对于WiFi连接,需要先通过USB连接设备并设置TCP/IP端口,然后通过IP地址和端口号进行连接。
附加工具:
weditor
:一个节点查看工具,帮助用户更方便地进行节点选择和测试。
APP的操作
url = "apk下载地址"
d.app_install(url)
d.app_uninstall("包名")
d.app_start("包名")
d.app_stop("包名")
d.app_clear("包名")
d.app_list_running() #获取正在运行的列表
#获取正在运行的包名
print(d.app_current())
连接设备
查看设备列表
-
adb devices
-
要使用 uiautomator2 查看设备列表,可以使用以下命令: python -m uiautomator2 init
USB模式
注意:开发者选项,打开USB调试
import uiautomator2 as u2
# 注意网络代理
u2.wait_timeout = 20 # 设置等待时间为20秒
d = u2.connect_usb()
使用设备号连接
device = u2.connect("46d0c494") # usb连接,需要开启开发者模式,用atx也可以开启开发中模式,cmd输入adb devices获取设备号
模拟器连接
device = u2.connect() # 模拟器默认连接方式
wifi(tcpip )连接
-
USB连接手机,开发者选项,打开USB调试
-
adb tcpip 5555
-
拔掉USB连接
-
adb connect 192.168.120.139:5555 连接设备
-
adb devices 查看设备列表
-
device = u2.connect(“192.168.0.187:5555”) # tcpip同个局域网连接
如果 adb 连接断开了,可以adb connect 192.168.0.187:5555 再次连接设备,未连接的话,
adb kill-server 重置主机
weditor工具-节点查看
#安装
pip install weditor==0.6.4 -i http://pypi.douban.com/simple --trusted-host pypi.douban.com
#运行
python -m weditor
节点操作
选择器
多种节点选择器用于定位UI元素。
- text、textContains、textMatches、textStartsWith用于根据文本内容定位元素;
- className、classNameMatches用于根据类名定位元素;
- description、descriptionContains、descriptionMatches、descriptionStartsWith用于根据元素描述定位元素;
- checkable、checked、clickable、longClickable、scrollable、focused、selected、enabled、focusable用于根据元素状态定位元素;
- packageName、packageNameMatches用于根据应用包名定位元素;
- resourceId、resourceIdMatches用于根据资源ID定位元素;
- index、instance用于根据元素在页面中的位置定位元素。
多个匹配
import uiautomator2 as u2
# 连接设备
d = u2.connect_usb()
# 获取所有匹配的节点(节点列表)
nodes = d(resourceId="com.ximalaya.ting.android:id/main_tv_name")
# 获取所有匹配的节点列表de 下标为2的节点
node_3 = d(resourceId="com.ximalaya.ting.android:id/main_tv_name",instance=2)
# 判断节点是否存在
if nodes.exists:
# 获取匹配的节点数量
count = nodes.count
print("匹配的节点数量:", count)
# 循环获取节点的text属性
for node in nodes:
text = node.info["text"]
print("节点的text属性:", text)
else:
print("没有匹配的节点")
查找父级节点(比较慢)
import uiautomator2 as u2
# 连接设备
d = u2.connect_usb()
# 获取节点对象
node = d(resourceId="com.example.app:id/parent_node")
# 查找父级节点
parent_node = node.parent
print("父级节点:", parent_node)
查找子节点
import uiautomator2 as u2
# 连接设备
d = u2.connect_usb()
# 获取节点对象
node = d(resourceId="com.example.app:id/parent_node")
child_nodes_0 = d(resourceId="com.example.app:id/parent_node").child(resourceId="com.example.app:id/child_node")
# 查找所有子节点
child_nodes = node.child
print("所有子节点:", child_nodes)
# 或者使用 children() 方法
child_nodes = node.children()
print("所有子节点:", child_nodes)
查找同级元素
text_view = my_icon.sibling(className='android.view.View')
text view.click()
查找(上下左右)的元素 (速度慢)
my = d(resourceId='com.example.app:id/button')
my.left().click()
my.right().click()
my.down().click()
my.up().click()
获取元素坐标
from uiautomator2 import Device
# 连接设备
d = Device('设备序列号')
# 获取元素
element = d(resourceId='com.example.app:id/button')
# 获取元素中心坐标
x, y = element.center()
print(f"元素中心坐标为 ({x}, {y})")
事件操作
元素点击
# 获取元素
element = d(resourceId='com.example.app:id/button')
element.click()
坐标点击
d.click(500,500)
百分比点击
d.click(0.5,0.5)
输入
node = d(longClickable="true",className="android.widget.EditText")
node.send_keys("[炸弹]")
滑动屏幕
坐标系的起点是屏幕左上角(0,0),向右和向下为正坐标系
import uiautomator2 as u2
# 获取屏幕的宽度和高度
screen_width = d.info["displayWidth"]
screen_height = d.info["displayHeight"]
# 计算起始点和终点的坐标
start_x = screen_width // 2
start_y = screen_height - 20 # 起始点的y坐标可以根据需要进行调整
end_x = start_x
end_y = start_y - (218 * 6) # 终点的y坐标可以根据需要进行调整
d = u2.connect_usb()
# 执行滑动操作
d.swipe(start_x, start_y, end_x, end_y)
获取提示语
d.totast.get_message()
文档参考地址
- https://blog.csdn.net/qq_32603969/article/details/121459006
- https://www.jianshu.com/p/38f48390c538
- 比较全面App自动化测试工具Uiautomator2
- python+uiautomator2 实现多设备并行