1
【示例 8-11】UiAutomator2 的应用与操作
1.连接设备
python-uiautomator2 连接手机的方式有两种,一种是通过 Wi-Fi 连接,另外一种是通
过 USB 连接。Wi-Fi 最便利的地方是可以不用连接数据线,USB 则可以用在 PC 和手机网
络不在一个网段的情况。
(1)通过 Wi-Fi 连接设备
假设设备(IP 地址为 )IP 和 PC 在同一网络中。
示例代码如下。
import uiautomator2 as u2
d = ('')
(2)通过 USB 连接设备
假设所连接的设备序列是 123456789F。
示例代码如下。
import uiautomator2 as u2
d = ('123456789F') # 通过 USB 连接设备。
或者 _usb('123456f')
#d = _usb() 或者 d = (),适用与当前只有一个设备时。
在没有参数的情况下,调用 ()时,UiAutomator2 将从环境变量
ANDROID_DEVICE_IP 获取设备的 IP 地址。如果这个环境变量是空的,UiAutomator2 将
返回 connect_usb,需要确保只有一个设备连接到计算机。
2.使用设备与获取设备信息
(1)检查并维持设备端守护进程处于运行状态
代码如下。
()
(2)打开调试开关
代码如下。
= True
(3)安装应用
只能从 URL 安装,代码如下。
_install(' #引号内为下载 apk 的地址
(4)启动应用
代码如下。
_start('') #引号内为包名称,这里为支付宝
(5)停止应用
代码如下。
#相当于'am force-stop'强制停止应用
_stop('')
#相当于'pm clear' 清空 App 数据
_clear('')
(6)停止所有正在运行的 App
软件测试任务驱动教程
2
代码如下。
# 停止所有
_stop_all()
# 停止所有应用程序,除了
_stop_all(excludes=[''])
(7)跳过弹窗,禁止弹窗
代码如下。
_popups() # 自动跳过弹出窗口
_popups(False) # 禁用自动跳过弹出窗
(8)获取设备信息
代码如下。
# 获取基本信息
# 获取窗口大小
print(_size())
# 设备垂直输出示例:(1080, 1920)
# 设备水平输出示例:(1920, 1080)
# 获取当前应用程序信息。对于某些 android 设备,输出可以为空
print(_app())
#获取设备序列号
print()
#获取 WIFI IP
print(_ip)
#获取详细的设备信息
print(_info)
(9)获取应用信息
代码如下。
_info("")
'''
{
"packageName": "",
"mainActivity": "",
"label": "支付宝",
"versionName": "",
"versionCode": 360,
"size": 108306104
}
'''
# 保存 App 图标
img = _icon("")
("")
3.推拉文件
(1)将文件推送到设备
代码如下。
3
# push 文件夹
("", "/sdcard/")
# push 和重命名
("", "/sdcard/")
# push fileobj
with open("", 'rb') as f:
(f, "/sdcard/")
# 推动和更改文件访问模式
("", "/data/local/tmp/", mode=0o755)
(2)从设备中拉出一个文件
代码如下。
("/sdcard/", "")
# 如果在设备上找不到文件,将会抛出 FileNotFoundError 异常
("/sdcard/", "")
4.屏幕操作
(1)打开/关闭屏幕
代码如下。
_on() #打开屏幕
_off() #关闭屏幕
(2)获取当前屏幕状态
代码如下。
('screenOn') # 需要 Android> =
(3)解锁屏幕
代码如下。
()
# 相当于
# ①发射活动:_IDENTIFY
# ①按【Home】键
5.硬键盘和软键盘操作
代码如下。
("home") #单击【Home】键
("back") #单击【Backspace】键
("left") #单击【←】键
("right") #单击【→】键
("up") #单击【↑】键
("down") #单击【↓】键
("center") #单击确认键
("menu") #单击菜单键
("search") #单击搜索键
("enter") #单击【Enter】键
("delete") #单击【Delete】键
("recent") #单击近期活动键
("volume_up") #音量+
("volume_down") #音量-
软件测试任务驱动教程
4
("volume_mute") #静音
("camera") #相机
("power") #电源键
6.手势与设备的交互
代码如下。
# 单击屏幕
(x,y) # x,y 为单击坐标
# 双击屏幕
_click(x,y)
_click(x,y,) #默认两个单击之间间隔时间为
# 长按
_click(x,y)
_click(x,y,) #长按 (默认)
# 滑动
(sx, sy, ex, ey)
(sx, sy, ex, ey, ) #滑动 (default)
#拖动
(sx, sy, ex, ey)
(sx, sy, ex, ey, ) #拖动 (default)
#滑动点多用于九宫格解锁,提前获取到每个点的相对坐标(这里支持百分比)
#从点(x0, y0)滑到点(x1, y1),再滑到点(x2, y2)
#两点之间的滑动速度是
((x0, y0), (x1, y1), (x2, y2), )
注意:单击、滑动、拖动操作支持百分比位置值。例如,_click(, ) 表示长
按屏幕中心。
7.UI 对象的 5 种定位方式
示例代码如下。
# text、resourceId、description、className、XPath、坐标
# 执行单击 UI 对象
#text 定位单击
d(text="Settings").click()
d(text="Settings", className="").click()
#resourceId 定位单击
d(resourceId=":id/tv_title", className="")
.click()
#description 定位单击
d(description="设置").click()
d(description="设置", className="").click()
#className 定位单击
d(className="").click()
#XPath 定位单击
("//[@index='0']/
.LinearLayout[@index='0']").click()
#坐标单击
5
(182, 1264)
# 等待元素出现(最多 10s),出现后单击
d(text="Settings").click(timeout=10)
# 在 10s 时单击,默认的超时 0
d(text='Skip').click_exists(timeout=)
# 单击直到元素消失,返回布尔值
# maxretry 默认值 10,interval 默认值
d(text="Skip").click_gone(maxretry=10, interval=)
# 单击基准位置偏移
d(text="Settings").click(offset=(, )) # 单击中心位置,同 d(text="Settings").click()
d(text="Settings").click(offset=(0, 0)) # 单击左前位置
d(text="Settings").click(offset=(1, 1)) # 单击右下
# 执行双击 UI 对象
d(text="设置").double_click() # 双击特定 UI 对象的中心
_click(x, y, ) # 两次单击之间的默认持续时间为
#执行长按 UI 对象,长按特定 UI 对象的中心
d(text="Settings").long_click()
_click(x, y, ) # 长按坐标位置 默认
# 将 UI 对象拖向另一个点或另一个 UI 对象
# Android< 不能使用 drag.
# 在 内将 UI 对象拖到屏幕点(x, y)
d(text="Settings").drag_to(x, y, duration=)
# 将 UI 对象拖到另一个 UI 对象的中心位置,时间为
d(text="Settings").drag_to(text="Clock", duration=)
8.XPath 的常见用法
示例代码如下。
# 等待 10s
("//").wait()
# 找到并单击
("//*[@content-desc='分享']").click()
# 检查是否存在
if ("//[contains(@text, 'Se')]").exists:
print("exists")
# 获取所有文本视图文本、属性和中心点
for elem in ("//").all():
print("Text:", )
#获取视图文本
for elem in ("//").all():
print("Attrib:", )
#获取属性和中心点,返回 (100, 200)
for elem in ("//").all():
print("Position:", ())