当前位置:网站首页>csdn涨薪技术之UI⾃动化⼯具: UiAutomator2
csdn涨薪技术之UI⾃动化⼯具: UiAutomator2
2022-07-19 17:37:00 【测试架构师北凡】
【文章末尾给大家留下了大量的福利】
1、 导读
做过Android自动化测试的同学想必都知道,最开始用的UiAutomator是Google提供的⽤来做安卓⾃动化测试的⼀个Java库,基于Accessibility服务,功能强⼤,但仅⽀持Java语⾔,并原生框架一开始并不⽀持Python。
后面一些Python技术爱好者,实在看不过去了,撸起袖子开发了一款UiAutomator Python
版本,项目地址:
https://github.com/xiaocong/uiautomator
安装及基本使用:
$ pip install uiautomator
from uiautomator import device as d
d.screen.on()
d(text="Clock").click()
2、UiAutomator2
当然,今天介绍的主角是另外一框架框:UiAutomator2
, 有人说UiAutomator2
是不是UiAutomator
的升级版本,功能确实是升级,但两个框架其实并没有任何直接关系,甚至根本不是一波人开发的。
UiAutomator2
框架是阿里的一位大神杰作。
简单介绍一下:
UiAutomator2
是⼀个开源的⾃动化测试⼯具,提供了⼀系列的Python API,⽅便测试⼈员⽤Python编写⾃动化测试脚本。
框架原理图:
项目地址:
https://github.com/openatx/uiautomator2
随着近几年UiAutomator2框架的不断迭代,功能也越发强大了,更多详细功能和介绍建议读者去项目官方地址查阅。
快速开始:
先准备一台开启了开发者选项的安卓手机,连接上电脑,确保执行adb devices可以看到连接上的设备。
安装uiautomator2
pip3 install -U uiautomator2
运行python3 -m uiautomator2 init
安装包含httprpc服务的apk到手机.
命令行运行python打开python交互窗口。然后将下面的命令输入到窗口中。
import uiautomator2 as u2
d = u2.connect() # connect to device
print(d.info)
3、UiAutomator2 特色功能
在Android自动化测试过程中,经常会遇到一些非期望需要操作的弹框,一旦出现这些非预期弹框,势必对自动化执行稳定带来影响,今天要重点介绍的就是UIAutomator2中watcher(观察者)的功能,或者称之为监听者模式。
本质上watcher的设计思路主要是为了解决一些弹窗或者 确认框诸如此类问题。
具体watcher又该怎么用?
1、官方示例:
# 常用写法,注册匿名监控
d.watcher.when("安装").click()
# 注册名为ANR的监控,当出现ANR和Force Close时,点击Force Close
d.watcher("ANR").when(xpath="ANR").when("Force Close").click()
2、用法说明:
d.watcher("WATCHER_NAME").when(text="确认").click(text="确认")
d.watcher("WATCHER_NAME2").when(text="OK").when(text="Wait").press("back", "home")
解释:
第一句表示:注册一个名字为“WATCHER_NAME”的watcher,当存在UiSelector满足“text='确认'”的时候,执行点击操作
第二句表示:注册一个名字为“WATCHER_NAME2”的watcher,当满足两个条件时,依次按back与home键。
3、回调示例
d.watcher.when("抢红包").press("back")
d.watcher.when("//*[@text = 'Out of memory']").call(lambda d: d.shell('am force-stop com.im.qq'))
# 回调说明
def click_callback(d: u2.Device):
d.xpath("确定").click() # 在回调中调用不会再次触发watcher
d.xpath("继续").click() # 使用d.xpath检查元素的时候,会触发watcher(目前最多触发5次)
需要注意的是,即便完成watcher注册了,并不代表已经生效,需要手动开启它,有两种方法:
# 方式一:启动所有的观察者,并一直运行在手机后台
d.watchers.watched = True
# 方式二:强制运行所有监控
d.watchers.run()
其他常用Watcher监控命令:
# 移除ANR的监控
d.watcher.remove("ANR")
# 移除所有的监控
d.watcher.remove()
# 开始后台监控
d.watcher.start()
d.watcher.start(2.0) # 默认监控间隔2.0s
# 强制运行所有监控
d.watcher.run()
# 停止监控
d.watcher.stop()
# 停止并移除所有的监控,常用于初始化
d.watcher.reset()
# 查看当前所有watcher
d.watchers
# 判断 某个/所有观察者中的某个 是否已经被触发过
d.watcher("watcher_name").triggered
d.watchers.triggered
当你使用方式一时,在你不想使用它的时候,需要使用d.watchers.watched = False
手动关闭;当然,你也可以使用下方的remove方法移除某个watcher,如此它便不会再生效,使用d.watchers.run()
,则与方法一不同,它是在这条命令执行的瞬时启动一次,结束后便不会再触发。
4、案例模拟
本案例,假设自动模拟打电话、挂电话操作,如果是使用d.watchers.watched = True,可以先执行脚本,再进行呼叫。
import uiautomator2 as u2
# 连接被叫设备
d = u2.connect('192.168.1.105:62001')
# 注册一个名字为"Phone"的watcher,当存在UiSelector的description="拒绝"时,点击
d.watcher("Phone").when(description="拒绝").click()
# 启动前,查看Phone是否已经注册且触发过
print("Triggered Before:", d.watcher("Phone").triggered)
# 后台启动,持续监控
d.watchers.watched = True
# 查看当前已经注册的watchers
print("Watchers:", d.watchers)
# 启动后,查看Phone是否已经注册且触发过
print("Triggered After:", d.watcher("Phone").triggered)
# 重置watchers的triggered状态
d.watchers.reset()
# 移除Phone这个watcher
d.watcher("Phone").remove()
# 移除后,查看当前已经注册的watchers
print("Watchers:", d.watchers)
也可以将启动方式改成d.watchers.run()
如果是使用d.watchers.run()
,则需要在电话已经处于呼叫的过程中,触发脚本,具体效果,可自行运行尝试。
重点:学习资料学习当然离不开资料,这里当然也给你们准备了600G的学习资料
需要的先关注再私我关键字【000】免费获取哦 注意关键字是:000
疑惑:为什么要先关注呢? 回:因为没关注的话私信回了你看不到
项目实战
app项目,银行项目,医药项目,电商,金融
大型电商项目
全套软件测试自动化测试教学视频
300G教程资料下载【视频教程+PPT+项目源码】
全套软件测试自动化测试大厂面经
python自动化测试++全套模板+性能测试
听说关注我并三连的铁汁都已经升职加薪暴富了哦!!!!
边栏推荐
- Redis cluster setup (one master, two slave and three sentinels) complete version with verification report
- 集合的一些面试题
- 通过屏幕交互绘制贝塞尔曲线
- 【开源】MagicData-RAMC :180小时中文对话式语音数据集正式发布
- 2021-07-05
- P5023 [noip2018 improvement group] solution to the number filling game
- mfc inifile unicode mode读取方法
- koa2学习
- Installing MySQL in centos7
- Wechat applet development uses onreachbottom to realize page bottom loading and paging
猜你喜欢
Installing MySQL in centos7
网易游戏 Flink SQL 平台化实践
PDA-RBCs-NPs 聚多巴胺修饰的红细胞-纳米粒子复合/透明质酸包裹马钱子碱牛血清蛋白纳米粒的制备
2022年度“强国杯”初赛wp(有脚本,过程详细)
UART bus protocol
Welcome to ICASSP 2022 - Greetings from Magic Data
Preparation of inh-rfp-bsa-nps loaded INH and RFP albumin nanoparticles / capataxel loaded albumin nanoparticles
Crazy God redis notes 03
INH-RFP-BSA-NPs载INH和RFP白蛋白纳米粒/载卡巴他赛的白蛋白纳米粒的制备
RoI Pooling 和 ROI align
随机推荐
The difference between BL and LDR jump program
What do nohup and xargs mean
u-boot-1.1.6移植笔记(初级篇)
FileBeat6.4 快速上手
使用 Abp.Zero 搭建第三方登录模块(三):网页端开发
最全的多线程应用教程---总结详细
简述声波滤波器市场
DML中delete和truncate的区别
【转载】pycharm打包.py程序为可执行文件exe
Magicdata Ramc data set evaluation | northwest Polytechnic University champion team sharing
RES-BSANP白藜芦醇白蛋白纳米粒/包裹紫杉烷类的白蛋白纳米颗粒载体
VB变量类型及控制语句(基础篇)
Talk about the progressive use and misunderstanding of mvc-mvp-mvvm
RoI Pooling 和 ROI align
Android 面试题:为什么 Activity 都重建了 ViewModel 还存在?—— Jetpack 系列(3)
VBS脚本COM对象扩展及使用(3)
GL-HSANPs 甘草酸偶联人血清白蛋白包载白藜芦醇/大黄酸磷脂复合物血清蛋白纳米粒的制备
Openzeppelin可升级模板库合约初始化详解
redis集群搭建(一主两从三哨兵)完整版带验证报告
【开源】MagicData-RAMC :180小时中文对话式语音数据集正式发布