【Uiautomator2】基本使用
一、环境搭建
1.1 安卓设备
确保安卓设备端已开启开发者选项,连接电脑并确保执行adb devices可以看到设备连接状态。
1.2 安装 uiautomator2
运行 pip install -U uiautomator2 安装 uiautomator2。
运行 python -m uiautomator2 init 安装服务到手机(在过去的版本中,这一步是必须执行的,但是从1.3.0之后的版本,当运行 u2.connect() 时就会自动推送这些文件)。
命令行运行python,打开python交互窗口,输入以下命令到窗口中:
import uiautomator2 as u2
d = u2.connect() # connect to device
print(d.info)
看到类似下面的输出,就可以正式开始使用uiatumator2了。
{'currentPackageName': 'com.android.launcher3', 'displayHeight': 1600, 'displayRotation': 0, 'displaySizeDpX': 450, 'displaySizeDpY': 800, 'displayWidth': 900, 'productName': 'PCRT00', 'screenOn': True, 'sdkInt': 25, 'naturalOrientation': True}
1.3 安装 weditor
运行 pip install -U weditor (或指定某一版本)安装weditor。(安装失败时可降低版本)
命令行直接输入weditor(或python -m weditor)会自动打开浏览器,输入设备的ip(WIFI连接)或者序列号(USB连接),点击Connect即可,Dump Hierarchy用于界面同步。
二、常用API
2.1 设备连接
uiautomator2 连接手机的方式有两种,一种是通过WIFI,另外一种是通过USB。两种方法各有优缺点:WIFI可以不用连接数据线,USB则可以用在PC和手机网络不在一个网段的情况下。
2.1.1 通过WIFI连接
import uiautomator2 as u2
d = u2.connect('192.168.0.100')
2.1.2 通过USB连接
import uiautomator2 as u2
d = u2.connect_usb('123456f')
2.2 应用管理
2.2.1 安装应用
d.app_install('http://some-domain.com/some.apk') # app的url
d.app_install(data="./example.apk") # app的本地路径
2.2.2 运行应用
d.app_start(package_name) # package_name:应用包名
d.app_start("com.netease.cloudmusic")
2.2.3 关闭应用
d.app_stop(package_name)
2.2.4 获取当前界面的APP信息
d.app_current()
2.2.5 获取应用信息
d.app_info(package_name)
2.2.6 卸载应用
d.app_uninstall(package_name)
2.3 文件操作
2.3.1 向设备推送文件
d.push(src, dst)
# 将foo.txt推送至设备的/sdcard/文件夹下
d.push("foo.txt", "/sdcard/")
# 将foo.txt推送至设备的/sdcard/文件夹下,并重命名为bar.txt
d.push("foo.txt", "/sdcard/bar.txt")
2.3.2 从设备拉取文件
d.pull(src, dst)
d.pull("/sdcard/01.png", "D:/UIAutomator2/01.png")
2.4 交互
2.4.1 点击
- 点击屏幕上某一点坐标:
d.click(x, y)
- 点击某一元素(元素未找到时报错):
# 输入参数timeout(可选):等待元素出现的超时时间
# 输入参数offset(可选):(x,y)的偏移量,默认(0.5,0.5),点击元素的中心点
# 未找到元素提示UiObjectNotFoundError
d(属性=属性值).click(timeout, offset)
d(text="歌单").click(timeout=10)
- 点击某一元素(元素未找到时不报错):
# 输入参数timeout(可选):等待元素出现的超时时间
# 元素存在返回True, 元素未找到返回False
d(属性=属性值). click_exists(timeout)
d(text="歌单"). click_exists ()
2.4.2 双击
- 双击屏幕某一点坐标:
d.double_click(x, y)
2.4.3 长按
- 长按屏幕某一点坐标:
# duration:长按的时间(浮点型)
d.long_click(x, y, duration)
- 长按某一元素:
# duration:长按的时间(浮点型)
d(属性=属性值).long_click(duration)
2.4.4 拖拽
- 从一点拖拽到另一点:
# duration:拖拽的时长,默认0.5
d.drag(sx, sy, ex, ey, duration)
- 拖拽元素至某一个坐标点:
# x:拖拽终点的x坐标(浮点型)
# y:拖拽终点的y坐标(浮点型)
# duration:拖拽的时长
d(属性=属性值).drag_to(x, y, duration)
2.4.5 滑动
# sx:滑动起点x坐标(浮点型)
# sy:滑动起点y坐标(浮点型)
# ex:滑动终点x坐标(浮点型)
# ey:滑动终点y坐标(浮点型)
d.swipe(sx, sy, ex, ey)
2.5 文本操作
2.5.1 输入文本
d(属性=属性值).send_keys(text)
d(属性=属性值).set_text(text)
2.5.2 获取文本
d(属性=属性值).get_text()
2.5.3 清空文本
d(属性=属性值).clear_text()
2.6 截图
-
屏幕截图:
d.screenshot(filename) # filename:文件保存路径
- 控件截图:
d(属性=属性值).screenshot().save(filepath)
2.7 获取属性
2.7.1 获取元素属性
d(text="每日推荐").info
2.7.2 获取设备属性
- 输出测试设备的所有信息:
d.device_info
- 获取屏幕分辨率:
d.window_size()
- 获取IP地址:
d.wlan_ip
- 获取序列号:
d.serial
2.8 按键操作
- d.press(keynames)
d.press("home") #按下home键
d.press("back") #按下back键
keynames目前支持:home、back、left、right、up、down、center、menu、search、enter、delete ( or del)、recent (recent apps)、volume_up、volume_down、volume_mute、camera、power。
- d.keyevent
d.keyevent('enter')
keyevent 是通过“adb shell input keyevent”方式输入,支持按键更加丰富。
更多详细的按键信息: https://developer.android.com/reference/android/view/KeyEvent.html
2.9 Shell
安卓系统是基于Linux系统开发,也就支持常见的Linux命令,这些命令存在手机/system/bin的目录下,连接手机就可以使用adb shell来执行这些命令。
d.shell(command) # command:字符型或者列表型
# 输出当前工作路径:
output, exit_code = d.shell("pwd")
# 列出当前目录下的文件:
output, exit_code = d.shell(["ls"])