uiautomator2是一个可以使用 Python 对 Android 设备进行 UI 自动化的库。其底层基于Google uiautomator,Google 提供的uiautomator库可以获取屏幕上任意一个 APP 的任意一个控件属性,并对其进行任意操作,目前仅支持 android 平台的原生应用测试。

uiautomator2有如下特点:

功能丰富 :设备和开发机可以脱离数据线,可通过 WiFi 互联;

得心应手 :集成了 openstf/minicap 加快截图速度 , 集成了 openstf/minitouch 达到精确实时控制设备 , 修复了 xiaocong/uiautomator 经常性退出的问题;

深度整合 :代码进行了重构和精简,方便维护;

安装

pip install --pre -U uiautomator2

weditor安装

作者的python版本为3.8,安装最新的weditor会失败,所以需要指定weditor的版本

pip install weditor==0.6.4

运行

python -m weditor

使用参考:干货分享|APP自动化测试抓元素利器——weditor - 知乎 (zhihu.com)

连接设备

设备环境调控

手机链接pc,输入adb命令adb devices发现设备后表明设备已连接成功

pc终端输入命令,以安装atx-agent至手机,命令如下:

python -m uiautomator2 init

初始化

通过adb devices获取设备的UUID,然后输进参数即可

import uiautomator2 as u2  //依赖包
d = u2.connect('9568940ECCBB')

API

运行应用

d.app_start("com.xueqiu.android")

停止应用

d.app_stop("com.xueqiu.android")

点击

分长按和点击两种,如下:

# 通过text点击
d(text="Settings").click()

# 长按有Settings文本的元素
d(text="Settings").long_click()

# 点击坐标(相对坐标,适应不同分辨率)
w,h = d1.window_size()
d.click(0.5*w, 0.5*h)

ui2支持 android 中 UiSelector 类中的所有定位方式(也就是d后面括号的形参)可以进该网站查询:UiSelector | Android Developers (google.cn),列举如下:

名称

描述

text

指定text文本的元素

textContains

text中包含有指定文本的元素

textMatches

text符合指定正则的元素

textStartsWith

text以指定文本开头的元素

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

指定包名的元素

packageNameMatches

packageName为符合正则的元素

resourceId

为指定resourceId的元素

resourceIdMatches

resourceId为符合指定正则的元素

index

元素索引

滑动

w,h = d.window_size()
d.swipe(0.1*w,0.5*h,0.8*w,0.5*h) # 从(0.1,0.5)滑动到(0.8,0.5)
d.swipe_ext("up", 0.5) # 向上滑动0.5,可以为up、down、left和right

拖拽

# 从sx,sy坐标拖拽至ex,ey坐标
d.drag(sx, sy, ex, ey)

滚动

# 垂直滚动到页面顶部/横向滚动到最左侧
d(scrollable=True).scroll.toBeginning()
d(scrollable=True).scroll.horiz.toBeginning()
# 垂直滚动到页面最底部/横向滚动到最右侧
d(scrollable=True).scroll.toEnd()
d(scrollable=True).scroll.horiz.toEnd()
# 垂直向后滚动到指定位置/横向向右滚动到指定位置
d(scrollable=True).scroll.to(description="指定位置")
d(scrollable=True).scroll.horiz.to(description="指定位置")
# 垂直向前滚动(横向同理)
d(scrollable=True).scroll.forward()
# 垂直向前滚动到指定位置(横向同理)
d(scrollable=True).scroll.forward.to(description="指定位置")

获取元素文本

d.xpath('//*[@resource-id="subject"]/android.widget.EditText[1]').get().text
d(resourceId="com.netease.mobimail:id/fab_compose").get_text()

元素等待

# 等待元素的出现
d(text="Settings").wait(timeout=10.0)

# 等待元素消失,返回True或者False,timout默认为全局设置的等待时间
d(text='Settings').wait_gone(timeout=20)

发送文本

d(text="Settings").set_text("你好")
d.send_keys("你好", clear=True) # 清除文本框后输入你好

模拟按键

d.press("home")

支持的按键分别为:

参数

功能

home

主页键

back

返回键

left

左键

right

右键

up

上键

down

下键

center

中键

menu

菜单键

search

搜索键

enter

确认键

delete/del

删除键

recent/recent apps

近期应用键

volume_up

音量+

volume_down

音量-

volume_mute

静音键

camera

相机键

power

电源键

弹窗处理

点击确认按钮

d.alert.accept()

点击取消按钮

d.alert.dismiss()

获取弹窗的文本

text = d.alert.text
print(text)

判断弹窗是否存在

if(d.alert.exists):
    pass

输入法切换

# 切换成ui2的输入法,这里会隐藏掉系统原本的输入法,默认是使用系统输入法
# 当传入False时会使用系统默认输入法,默认为Fasle
d.set_fastinput_ime(True)
# 查看当前输入法
d.current_ime()
#返回值
('com.github.uiautomator/.FastInputIME', True)

截图

d.screenshot('test.png')

录屏

进行录屏之前,需要安装如下库:

pip install -U "uiautomator2[image]" -i https://pypi.doubanio.com/simple

开始录屏

d.screenrecord('./test.mp4')

结束录屏

d.screenrecord.stop()

执行bash命令

d.bash("dumpsys wifi | grep mWifiInfo") # 检查wifi网络状态

d.bash("svc wifi disable") # 关闭wifi
d.bash("svc wifi enable") # 开启wifi

d.bash("svc data disable") # 关闭数据网络
d.bash("svc data enable") # 开启数据网络

与Airtest合作

因为uiautomator2的图像识别比Airtest差,可以用Airtest弥补这个缺陷,Airtest与uiautomator2并未冲突,这两个框架可以同时启动。

from airtest.core.api import *
import uiautomator2 as u2

dev = connect_device("Android://127.0.0.1:5037/xxxxx")
d = u2.connect('xxxxx')

d.app_start("com.taobao.taobao")
touch(Template(r"taobao.png"))
文章作者: Vsoapmac
版权声明: 本站所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 soap的会员制餐厅
自动化测试 第三方库 个人分享 框架
喜欢就支持一下吧