【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"])

 

posted @ 2022-11-09 09:53  闪亮可可仙  阅读(744)  评论(0编辑  收藏  举报