Uiautomator2实现Android自动化测试详解

目录

1、UIautomator2框架原理

2、UIautomator2使用

2.1、安装

2.2、元素定位工具-weditor

2.3、设备连接

2.4、全局配置

2.4.1、通过settings设置

2.4.2、通过属性设置

2.5、APP相关操作

2.5.1、安装应用

2.5.2、启动应用

2.5.3、等待应用启动

2.5.4、结束应用

2.5.5、卸载应用

2.5.6、获取当前上层APP的信息

2.5.7、获取指定APP的信息

2.6、设备相关操作

2.6.1、获取设备信息

2.6.2、 获取屏幕分辨率

2.6.3、获取设备IP地址

2.6.4、锁屏亮屏

2.6.5、截屏

2.6.6、按键

2.6.7、输入法切换

2.6.8、录屏

2.6.9、文件的上传下载

2.8、元素定位

2.8.1、定位方法

2.8.2、支持的定位方法

2.8.3、 组合定位

2.8.4、子元素定位

2.8.5、兄弟元素定位

2.8.6、多级定位

2.8.9、相对定位

2.8.10、xpath定位

2.9、元素操作

2.9.1、点击

2.9.2、长按

2.9.3、滑动

2.9.4、多点滑动

2.9.5、拖动

2.9.6、放大缩小

2.9.7、滚动

2.9.8、toast操作

2.9.9、文本相关操作

2.9.10、弹窗监测

1、UIautomator2框架原理

如上图所示,python-uiautomator2 主要分为两个部分,python 客户端,移动设备

  • python 端: 执行脚本,脚本通过封装成HTTP 请求发送到移动设备
  • 移动设备:通过 atx-agent 来接受 HTTP 请求,并将这些请求转换为 uiautomator2可识别的指令来实现自动化操作。atx-agent 充当了一个桥梁的角色。

完整流程

  1. 在移动设备上安装atx-agent(守护进程), 通过atx-agent启动 uiautomator2 服务 (默认 7912 端口) 进行监听
  2. 在 PC 上编写测试脚本并执行(相当于发送 HTTP 请求到移动设备的 server 端)
  3. 移动设备通过 WIFI 或 USB 接收到 PC 上发来的 HTTP 请求,执行指定的操作

2、UIautomator2使用

2.1、安装

pip3 install -U uiautomator2

  • 初始化环境,安装包含httprpc服务的apk到手机+atx-agent, minicap, minitouch,注:1.3.0之后的版本,执行python代码u2.connect()时会自动监测和推送这些文件。

python3 -m uiautomator2 init

  • 检查是否安装成功
    • cmd

uiautomator2 verison

  • Python

import uiautomator2 as u2

d = u2.connect() # 连接设备
print(d.info)

2.2、元素定位工具-weditor

1、安装:

  • 注意:这里指定安装0.6.4版本的,如果默认安装最新的,很可能会出现安装失败的问题,这里推荐指定安装。

pip install weditor==0.6.4

2、启动weditor

python -m weditor

3、连接Android设备

2.3、设备连接

1、默认一个设备的情况

import uiautomator2 as u2
# 连接设备
d = u2.connect() 

# 当PC与设备在同一网段时,可以使用IP地址和端口号通过WIFI连接,无需连接USB线
# 默认使用端口号7912
u2.connect("10.0.0.1:7912")
u2.connect("10.0.0.1")
u2.connect("http://10.0.0.1")
u2.connect("http://10.0.0.1:7912")
等价于
u2.connect_wifi("10.0.0.1:7912")

2、多个设备时指定设备连接

import uiautomator2 as u2
# 连接设备,xxx:表示指定设备的设备号,可使用命令adb devices查看
d = u2.connect("xxx") 
等价于
d = u2.connect_usb("xxx")

2.4、全局配置

2.4.1、通过settings设置

1、查看settings默认设置

print(d.settings)

# 默认配置如下:
{
# 截屏失败时返回空白截屏(不抛出异常)
'fallback_to_blank_screenshot': False,
# 操作延迟,(0, 0)表示元素点击前等待0秒,点击后等待0S再执行后续操作
'operation_delay': (0, 0),
# opretion_delay生效的方法,默认为click和swipe
# 还可以设置press,send_keys,long_click等方式
'operation_delay_methods': ['click', 'swipe'],
# 元素默认等待时间(隐式等待)
'wait_timeout': 20.0,
# xpath日志
'xpath_debug': False
 }

2、通过settIng修改默认配置

# 修改截图失败后的默认返回
d.settings["fallback_to_blank_screenshot"] = True
# 修改操作延迟时间
d.settings["operation_delay"] = (3, 3)
# 修改操作延迟方法
d.settings["operation_delay_methods"] = ['click', 'swipe', 'press']
# 修改默认等待时间
d.settings["wait_timeout"] = 10

# 查看是否修改成功
print(d.settings)

2.4.2、通过属性设置

1、http默认请求超时时间

# 默认值60s
d.HTTP_TIMEOUT = 60 

2、等待设备在线时长

# 默认20s
d.WAIT_FOR_DEVICE_TIMEOUT = 60

3、HTTP debug信息

d.debug = True

2.5、APP相关操作

2.5.1、安装应用

# 本地路径安装
d.app_install('tmp.apk')
# url安装
d.app_install('package_url')

2.5.2、启动应用

# 如果已启动且在后台会被拉起到前台
# 如果已启动且在前台,不做任何操作,结束
# 如果未启动,则冷启动该应用
d.app_start("packageName")

# 先kill掉APP,再冷启动APP
d.app_start("packageName", stop=True)

2.5.3、等待应用启动

# 等待此应用变为当前上层应用,返回pid,超时未启动成功则返回0
# front默认为false表示只要该应用在运行中就会返回pid 为true表示等待app成为当前app
d.app_wait('com.xxx', 30, front=True)

2.5.4、结束应用

# 通过包名结束单个应用
d.app_stop("packageName") # 强制结束应用,但是不清除应用数据
d.app_clear('packageName') # 结束应用,并且清除应用数据

# 默认结束所有第三方应用,保留uiautomator两个依赖服务应用
# excludes参数:排除列表中的应用包名
d.app_stop_all(excludes=['com.xxx.xxx'])

2.5.5、卸载应用

# 卸载成功返回true,没有此包或者卸载失败返回False
d.app_uninstall('com.xxx.xxx')

2.5.6、获取当前上层APP的信息

d.app_current()

2.5.7、获取指定APP的信息

d.app_info("com.XXX")

2.6、设备相关操作

2.6.1、获取设备信息

# 输出设备的详细信息,报告设备号,电池,CPU信息等
d.device_info

2.6.2、 获取屏幕分辨率

# 手机竖屏状态返回 (1080,2400)
# 横屏状态返回 (2400,1080)
d.window_size()

2.6.3、获取设备IP地址

d.wlan_ip

2.6.4、锁屏亮屏

# 锁屏
d.screen_off()
# 亮屏
d.screen_on()

2.6.5、截屏

# 截图,save(fp) 传文件路径地址
d.screenshot().save("./tmp.png")

from PIL import Image

# 旋转90度截屏(逆时针旋转)
d.screenshot().transpose(Image.ROTATE_90).save("./tmp2.png")

2.6.6、按键

# 按音量键"+"
d.press('volume_up')

"""
press key via name or key code. Supported key name includes:
    home, back, left, right, up, down, center, menu, search, enter,
    delete(or del), recent(recent apps), volume_up, volume_down,
    volume_mute, camera, power.
"""

2.6.7、输入法切换

# 切换成uiautomator2的输入法,这里会隐藏掉系统原本的输入法,默认是使用系统输入法
# 当传入False时会使用系统默认输入法,默认为Fasle
d.set_fastinput_ime(True)

# 查看当前输入法
d.current_ime()

2.6.8、录屏

  • 需要下载依赖,官方推荐使用镜像下载

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

# 启动录制,默认帧率为20
d.screenrecord('tmp.mp4')
# 执行其它操作
time.sleep(10)
# 停止录制,录制结束后生成视频
d.screenrecord.stop()

2.6.9、文件的上传下载

# 上传文件(从电脑推送到手机) 如果是目录,这里"/sdcrad/"最后一个斜杠一定要加,否则会报错
d.push("test.txt","/sdcrad/")
d.push("test.txt","/sdcrad/test.txt")

# 下载文件(从手机推送到电脑)
d.pull('/sdcard/test.txt','text.txt')

2.7、等待

说明:等待分为强制等待和隐式等待;

  • 强制等待:不管元素是否加载,都强制等待指定时间,实际根据具体情况进行配置,只在使用的地方生效。
  • 隐式等待:在规定时间内如果元素可操作,直接进行操作;不必强制等到指定的时间;如果超过规定的时间,元素不可进行操作会抛出异常。一般会在全局配置的时候进行统一配置,配置每一步的操作都会生效。
# 设置强制等待的时间为3秒,等价于:time.sleep(3)
d.sleep(3)
 
# 设置隐式等待的时间为10
d.implicitly_wait(10)

2.8、元素定位

2.8.1、定位方法

d(定位方法=定位方法的值)

# 示例
#返回一个列表,当没找到元素时,返回一个空列表;存在多个元素时,返回多个列表元素
elements = d(text='Setting')
elements[0].click()
#获取元素个数
print(elements.count)

2.8.2、支持的定位方法

定位方法

描述

text

text是指定文本的元素

textContains

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

textMatches

text符合指定正则的元素

textStartsWith

text以指定文本开头的元素

className

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

packageName为指定包名的元素

packageNameMatches

packageName为符合正则的元素

resourceId

resourceId为指定内容的元素

resourceIdMatches

resourceId为符合指定正则的元素

2.8.3、 组合定位

  • 通过不同属性的组合来完成最终元素的定位,注意:该方式定位一定是同一个层级的,如果是不同层级的则会定位失败。
d(className="xxx",  text="xxx")

2.8.4、子元素定位

  • 该方式定义一定是父子层级的关系才能成功定位,不然会定位失败。
d(className="xxx").child(text="xxx")

2.8.5、兄弟元素定位

  • 注意:返回结果包含元素自己本身
d(text="xxx").sibling(className="android.widget.TextView")

2.8.6、多级定位

d(className="xxx", resourceId="xxx").child_by_text("xxx").child(className="xxxx")

2.8.9、相对定位

d(A).left(B),# 选择A左边的B
d(A).right(B),# 选择A右边的B
d(A).up(B), #选择A上边的B
d(A).down(B),# 选择A下边的B
# 示例
d(text='xxx').right(className="android.widget.TextView")

2.8.10、xpath定位

  • 注意事项:
    • Java uiautoamtor默认是不支持xpath,这是属于uiautoamtor2的扩展功能,速度会比其它定位方式慢
    • 在xpath定位中,uiautoamtor2中的description 定位需要替换为content-desc,resourceId 需要替换为resource-id
# 如果找不到元素,则会报XPathElementNotFoundError错误
# 如果找到多个元素,默认返回第1个
d.xpath('//*[@content-desc="xxx"]')

# 如果想要返回的元素有多个,使用all()方法返回列表
# 使用all方法,当未找到元素时,不会报错,会返回一个空列表
d.xpath('//*[@resource-id="xxx"]').all()

2.9、元素操作

2.9.1、点击

d(text='xxx').click()
#单击直到元素消失,超时时间5,点击间隔1
d(text='xxx').click_gone(maxretry=5, interval=1.0)

2.9.2、长按

d(text='xxx').long_click()

2.9.3、滑动

# 根据坐标滑动从(x1,y1)滑动到(x2,y2)
d.swipe(x1,y1,x1,y2)

# 滑动的扩展方法,支持上下左右的滑动
# "left", "right", "up", "down"
d.swipe_ext("up")

2.9.4、多点滑动

  • 可用来实现图案解锁
# 按下不放手
touch.down(x,y)
# 停住1S
touch.sleep(1)
# 移动
touch.move(x,y)
# 放开
touch.up(x,y)
#实现长按,同一个点按下休眠10S后抬起
d.touch.down(x1,y1).sleep(10).up(x1,y1)
# 实现多点之间的移动
d.touch.down(x1,y1).move(x2,y2).move(x3,y3).up(x3,y3)

2.9.5、拖动

# 在0.5s内将设置拖动至QQ上,拖动元素的中心位置
# duration默认为0.5,实际拖动的时间会比设置的要高
d(description="设置").drag_to(text="QQ", duration=0.5)

# 拖动设置到屏幕的(500, 500)位置上
d(text="设置").drag_to(500,500, duration=0.5)

# 从点(x1,y1)拖动到点(x2,y2)
d.drag(x1,y1,x2,y2)

2.9.6、放大缩小

# 根据坐标进行放大和缩小
d(className="android.widget.FrameLayout").gesture(start1,start2,end1,end2)

#  缩小
d(className="android.widget.FrameLayout").pinch_in(50, 50)
# 放大
d(className="android.widget.FrameLayout").pinch_out(10, 10)

2.9.7、滚动

  • 说明:
    • 设置scrollable属性为True
    • 滚动类型:horiz 为水平 vert 为垂直
    • 所有方法均返回Bool值
    • 滚动方向:forward 向前 、backward 向后 、toBeginning 滚动至开始 、toEnd 滚动至最后 、to 滚动直接某个元素出现
# 垂直滚动到页面顶部/横向滚动到最左侧
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(text="指定位置")
d(scrollable=True).scroll.horiz.to(text="指定位置")
# 垂直向前滚动(横向同理)
d(scrollable=True).scroll.forward()
# 垂直向前滚动到指定位置(横向同理)
d(scrollable=True).scroll.forward.to(text="指定位置")

2.9.8、toast操作

# 获取toast,当没有找到toast消息时,返回default内容
d.toast.get_message(timout=3, default='no toast')
# 清空toast缓存
d.toast.reset()

2.9.9、文本相关操作

# 获取元素文本
d(text="xxx").get_text()

# 设置元素文本
d(text="xxx").set_text()

# 清除元素文本
d(text="xxx").clear_text()

2.9.10、弹窗监测

  • 使用wather进行页面监测,可以用来实现弹框的监测处理
  • 当启动wather时,会新建一个线程进行监控 ,可以添加多个watcher
# 注册监控,当页面内出现有OK时,点击OK
d.watcher.when('OK').click()

# 移除 allow 的监控
d.watcher.remove("allow")

# 移除所有的监控
d.watcher.remove()

# 开始后台监控
d.watcher.start()
d.watcher.start(2.0) # 默认监控间隔2.0s

# 强制运行所有监控
d.watcher.run()

# 停止监控
d.watcher.stop()

# 停止并移除所有的监控,常用于初始化
d.watcher.reset()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/394923.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

day1 2/18

1> 使用fgets统计给定文件的行数 #include<myhead.h> int main(int argc, const char *argv[]) {if(argc!2){printf("enter error\n");return -1;}FILE*fpNULL;if((fpfopen(argv[1],"r"))NULL){perror("fopen error");return -1;}i…

3D模型素材哪家好?推荐六大优质3D模型资源库!

如今越来越多的设计师在寻找合适的3D模型素材用于设计项目中&#xff0c;帮助自己提高工作效率。然而&#xff0c;市面上的3D模型素材琳琅满目&#xff0c;质量参差不齐。那么&#xff0c;哪家的3D模型素材比较好呢?本文将为你推荐六大优质3D模型资源库&#xff0c;助你轻松找…

《2024巨量引擎日化行业白皮书》丨附下载

✦ ✦✦ ✦✦ ✦✦ ✦ 中国日化行业在2022年短暂承压之后&#xff0c;随着生活恢复常态&#xff0c;迎来新的发展契机&#xff0c;2023年呈回稳向上态势。以抖音为代表的内容电商是行业增长的主要驱动力&#xff0c;内容场和货架场互通互联&#xff0c;促进行业全域化释放潜能…

信息安全风险管理

信息安全风险管理 系统外部可能造成的损害,称为威胁;系统内部可能造成的损害,称为脆弱性。系统风险则是威胁利用脆弱性造成损坏的可能性。 蛋的裂缝可以看作“鸡蛋”系统的脆弱性,而苍蝇可以看作威胁,苍蝇叮有缝的蛋表示威胁利用脆弱性造成了破坏。 风险评估 风险评估就…

OpenAI全新发布文生视频模型:Sora!

OpenAI官网原文链接&#xff1a;https://openai.com/research/video-generation-models-as-world-simulators#fn-20 我们探索视频数据生成模型的大规模训练。具体来说&#xff0c;我们在可变持续时间、分辨率和宽高比的视频和图像上联合训练文本条件扩散模型。我们利用对视频和…

一键安装ROS适用于Ubuntu22/20/18

一键安装ROS适用于Ubuntu22/20/18 1、简介 ROS&#xff08;Robot Operating System&#xff0c;机器人操作系统&#xff09;是一个用于机器人软件开发的框架。它提供了一套工具和库&#xff0c;用于机器人应用程序的开发、测试和部署。ROS是由美国斯坦福大学机器人实验室&…

AlexNet的出现推动深度学习的巨大发展

尽管AlexNet&#xff08;2012&#xff09;的代码只比LeNet&#xff08;1998&#xff09;多出几行&#xff0c;但学术界花了很多年才接受深度学习这一概念&#xff0c;并应用其出色的实验结果。 AlexNet&#xff08;由Alex Krizhevsky、Ilya Sutskever和Geoffrey Hinton共同设计…

Linux------环境变量

目录 前言 一、环境变量 二、添加PATH环境变量 三、HOME环境变量 四、查看所有环境变量 1.指令获取 2.代码获取 2.1 getenv 2.2main函数的第三个参数 2.3 全局变量environ 五、环境变量存放地点 六、添加自命名环境变量 七、系统环境变量具有全局属性 八、环境变…

CrossOver For Mac v24.0.0 让Mac可以运行Windows程序的工具

CrossOver For Mac v24.0.0 可以在 Mac 上运行成千上万的 Windows 程序。从办公软件、实用工具、游戏到设计软件&#xff0c;您只需在 Mac 的 dock 轻按一下便可运行。您可以 Windows 程序和 Mac 程序之间随意切换&#xff0c;而这一切无需重启、无需虚拟机&#xff0c;也无需购…

前后端分离(delivery-management)部署文档

1. 前端项目:delivery-management 1.1. 前端项目打包 执行命令:npm run build 或者yarn run build,生成dist目录。 构建流程如下图: 1.2. 文件上传 将打包好的前端项目(dist目录),上传到服务器,并拷贝到nginx安装目录html目录下。 执行上传命令(sftp):put -r E:\…

研狗插件解压密码

请搜索淘宝店铺 模型算法专家店

一起玩儿物联网人工智能小车(ESP32)——63 SD和TF卡模块的使用

摘要&#xff1a;本文介绍SD和TF卡模块的使用方法 前面介绍了非易失性存储的使用方法&#xff0c;由于空间和本身只支持键值对的限制&#xff0c;非易失性存储只适用于少量数据的记录。而不适用于各种声音、图片、大量数据等情况的使用。这时候就需要有文件系统或者更大容量存…

卫星热平衡试验与太阳光模拟器

卫星热模型是一种用于研究卫星的热特性的模型。卫星在太空中接收到的太阳辐射会导致其表面温度的变化&#xff0c;而表面温度的变化会影响卫星的热传导和热辐射&#xff0c;进而影响其冷却和热平衡。 卫星热模型一般涉及以下几个方面的内容&#xff1a; 1. 热辐射模型&#xf…

vue-productionSourceMap作用

当其设置为false时(productionSourceMap: false) 当其设置为true时(productionSourceMap: true) 注:1.当设置为true时,打包后每个文件都有一个.map文件,其目的是为了精确定位代码错误 2.当设置为false时,可减少项目打包大小 3.正式环境禁止使用true,因为其可通过反编译.map文件…

医生门诊涉众利益-《软件方法》自测题解析39

DDD领域驱动设计批评文集 做强化自测题获得“软件方法建模师”称号 《软件方法》各章合集 《软件方法》第6章自测题1 1 [ 单选题 ] 关于用例规约&#xff0c;以下说法正确的是&#xff1a; A) 针对同一个用例&#xff0c;应该为研发团队不同角色准备不同视角的用例规约。…

【7】知识融合

知识融合&#xff08;也称本体对齐、本体匹配、实体对齐&#xff09;&#xff0c;即合并两个知识图谱(本体)&#xff0c;基本的问题都是研究怎样将来自多个来源的关于同一个实体或概念的描述信息融合起来。 需要确认的是&#xff1a; 等价实例&#xff1a;实体的匹配&#xf…

Spring Boot 笔记 024 登录页面

1.1 登录接口 //导入request.js请求工具 import request from /utils/request.js//提供调用注册接口的函数 export const userRegisterService (registerData)>{//借助于UrlSearchParams完成传递const params new URLSearchParams()for(let key in registerData){params.a…

51-2 万字长文,深度解读端到端自动驾驶的挑战和前沿

去年初&#xff0c;我曾打算撰写一篇关于端到端自动驾驶的文章&#xff0c;发现大模型在自动驾驶领域的尝试案例并不多。遂把议题扩散了一点&#xff0c;即从大模型开始&#xff0c;逐渐向自动驾驶垂直领域靠近&#xff0c;最后落地到端到端。这样需要阐述的内容就变成LLM基础模…

CyberDAO:web3时代的引领者

Web3.0正在改写着世界运行的规则&#xff0c;AGI将为人类未来的生产效率、工作方式与目标带来改变&#xff0c;区块链经过十余年发展开启了去中心化新格局&#xff0c;带来生产关系的变革。人类正在从过往以时间换取收入、听命完成工作&#xff0c;转变为以个性化、自主追求人生…

广西物理杂志广西物理杂志社广西物理编辑部2024年第3期目录

专题论析 石笋中放射性核素高纯锗分析方法 王一飞;杨济瑜;欧阳河;梁芳;韦尚佑;沈洪涛; 1-6 基于机器学习方法的快速射电暴分类研究 孙万鹏;张富文; 7-1623《广西物理》投稿&#xff1a;cn7kantougao163.com 基于STM32的简易数字示波器设计 庞成康;黎海明;舒向航;李…
最新文章