您当前的位置:首页 > 电脑百科 > 程序开发 > 框架

APP自动化测试框架-UiAutomator2基础

时间:2022-08-09 11:00:16  来源:  作者:大刚测试开发实战

前言

很早以前,我用uiautomator+JAVA实践过Android App自动化测试,不过今天要提的不是uiautomator,而是uiautomator2。听起来uiautomator2像是uiautomator的升级版,但是这两款框架仅仅是名字上比较相似,实际上没有任何关联。

一、uiautomator/uiautomator2的前生今世

项目地址:
https://Github.com/openatx/uiautomator2

1.官方文档介绍

2.梳理一下脉络

  • 先有的谷歌uiautomator,但是只支持java;
  • 后来一个名为hexiaocong的开发者基于uiautomator封装了Python/ target=_blank class=infotextkey>Python版本,支持python代码运行;
  • 而受其启发,uiautomator2作者开发了uiautomator2。所以它们的诞生顺序应该是:uiautomator(谷歌版)-->uiautomator(python版)-->uiautomator2

3.三款框架对比

框架

支持语言

特点

uiautomator

java

谷歌开源,仅支持Android

xiaocong/uiautomator

python

开源,仅支持Android

uiautomator2

python

开源,仅支持Android

二、uiautomator2简介

1.项目组成

  • uiautomator-server:主服务
  • minicap:实现实时屏幕投屏,以及实时截图
  • minitouch:用于精确实时控制设备
  • atx-agent:运行在设备上的驻守程序,go开发,用于保活设备上相关的服务
  • weditor:类似于uiautomatorviewer,专门为本项目开发的辅助编辑器

2.工作原理

 

1)各部分职责

  • Python:编写脚本,向移动设备发起http请求;
  • 移动设备:运行了封装了uiautomator2的http服务,解析python脚本发起的请求,并转化成uiautomator2可识别的代码;

2)运行过程

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

三、环境搭建

1.安装uiautomator2

pip install uiautomator2pip install -U weditor  # 安装weditor

2.初始化设备

python -m uiautomator2 init

初始化成功会出现如下提示

 

当PC或linux服务器连接了多台adb device的情况下,“python -m uiautomator2 init”默认初始化的是所有设备,若指定设备初始化,则需使用“--serial”参数:

python -m uiautomator2 init --serial $SERIAL  # $SERIAL为手机序列号,可通过adb devices查看

3.init时都干了啥?

执行“python -m uiautomator2 init”命令,会自动往手机上安装一堆东西:

  • app-uiautomator.apk
  • app-uiautomator-test.apk
  • atx-agent
  • minicap
  • minitouch

更多信息详见:
https://github.com/openatx/uiautomator2/wiki/Manual-Init

 

四、基础操作

1.连接设备

uiautomator2提供了3种连接方式

1)通过WiFi连接

import uiautomator2 as u2d = u2.connect('10.0.0.1') # alias for u2.connect_wifi('10.0.0.1')print(d.info)

2)通过USB连接

import uiautomator2 as u2d = u2.connect('123456f') # alias for u2.connect_usb('123456f')print(d.info)

3)通过ADB WiFi连接

import uiautomator2 as u2d = u2.connect_adb_wifi("10.0.0.1:5555")# 等同于# + Shell: adb connect 10.0.0.1:5555# + Python: u2.connect_usb("10.0.0.1:5555")

2.命令行工具

1)截图

uiautomator2 screenshot test.jpg

2)获取当前APP报名及Activity

uiautomator2 current

3)卸载应用

uiautomator2 uninstall <package-name> # 卸载一个包uiautomator2 uninstall <package-name-1> <package-name-2> # 卸载多个包uiautomator2 uninstall --all # 全部卸载

4)停止应用

$ uiautomator2 stop com.example.app # 停止一个app$ uiautomator2 stop --all # 停止所有的app

3.元素定位

1)常见定位方式

ui2支持 android 中 UiSelector 类中的所有定位方式,详细可以查看官网:
https://developer.android.com/reference/android/support/test/uiautomator/UiSelector,以下仅列出几种常见的定位方式:

定位方式

描述

text

通过文本定位

textMatches

通过文本正则匹配定位

className

通过类名定位

classNameMatches

通过类名正则匹配定位

description

通过desc属性定位

descriptionMatches

通过desc属性正则匹配定位

resourceId

通过resourceId定位

resourceIdMatches

通过resourceId正则匹配定位

2)子元素定位及兄弟元素定位

① 子元素定位-child

#查找类名为android.widget.ListView下的Bluetooth元素d(className="android.widget.ListView").child(text="Bluetooth")# 下面这两种方式定位有点不准确,不建议使用d(className="android.widget.ListView").child_by_text("Bluetooth",allow_scroll_search=True)d(className="android.widget.ListView").child_by_description("Bluetooth")

② 兄弟元素定位-sibiling

#查找与google同一级别,类名为android.widget.ImageView的元素d(text="Google").sibling(className="android.widget.ImageView")

③ 链式调用

d(className="android.widget.ListView", resourceId="android:id/list")   .child_by_text("Wi‑Fi", className="android.widget.LinearLayout")   .child(className="android.widget.Switch")   .click()

3)相对定位

d(A).left(B),# 选择A左边的Bd(A).right(B),# 选择A右边的Bd(A).up(B), #选择A上边的Bd(A).down(B),# 选择A下边的B#选择 WIFI 右边的开关按钮d(text='Wi‑Fi').right(resourceId='android:id/widget_frame')

4) Xpath定位

Java uiautoamtor中默认不支持xpath,这是属于ui2的扩展功能,速度会相比其它定位方式慢一些。在xpath定位中,ui2中的description 定位需要替换为content-desc,resourceId 需要替换为resource-id

# 只会返回一个元素,如果找不到元素,则会报XPathElementNotFoundError错误# 如果找到多个元素,默认会返回第0个d.xpath('//*[@resource-id="com.android.launcher3:id/icon"]')# 如果返回的元素有多个,需要使用all()方法返回列表# 使用all方法,当未找到元素时,不会报错,会返回一个空列表d.xpath('//*[@resource-id="com.android.launcher3:id/icon"]').all()

4.元素常用API

方法

描述

返回值

备注

exists()

判断元素是否存在

True,Flase

@property

info()

返回元素的所有信息

字典

@property

get_text()

返回元素文本

字符串

 

set_text(text)

设置元素文本

None

 

clear_text()

清空元素文本

None

 

center()

返回元素的中心点位置

(x,y)

基于整个屏幕的点

send_keys()

发送文本

 

 

用法示例:

d(test="Settings").existsd.exists(text='Wi‑Fi',timeout=5)

5.设备交互

1)单击/双击

d(text='Settings').click()  # 单击d.double_click(x, y)d.double_click(x, y, 0.1) # 双击默认时间间隔0.1s

2)长按

d(text='Settings').longclick()  # 长按

3)滑动

# "left", "right", "up", "down"d(text="Settings").swipe("up", steps=20)  # 元素向上滑动,步长20d(text="Settings").swipe("down", steps=20)  # 元素向下滑动d(text="Settings").swipe("left", steps=20)  # 元素向左滑动d(text="Settings").swipe("right", steps=20)  # 元素向右滑动

4)拖动

d(text="Settings").drag_to(text="Clock", duration=0.25)  # 拖动到某个元素,时长0.25秒d(text="Settings").drag_to(877,733)  # 拖动到屏幕某个坐标点,duration时长默认0.5秒

5)双指操作(元素放大/缩小)

d(text="Settings").pinch_in()  # 缩小d(text="Settings").pinch_out()  # 放大

6)等待元素出现/消失

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

7)屏幕滚动

# 垂直滚动到页面顶部/横向滚动到最左侧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="指定位置")# 滚动直到System元素出现d(scrollable=True).scroll.to(text="System")

8)文本框操作

d.send_keys("test")d.clear_text()  # 清空输入框

9)toast操作

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

10)监控操作

# 移除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()

更多api详见:
https://github.com/openatx/uiautomator2

五、weditor元素定位

1.启动weditor服务

python -m weditor

 

2.访问weditor

默认端口17310,访问地址:http://localhost:17310/,手机连接PC(确保已开启USB调试模式),点击Connect连接设备,当Connect图标变为绿色表示连接成功。

 

3.界面调试

weditor提供了所操作即所得式的元素定位方式,当双击屏幕上的图标或按钮,weditor界面右侧的Coding框会同步展现元素操作的代码,同时手机界面也会相应同步切换页面。

 

感谢

部分内容参考以下:

https://www.cnblogs.com/fnng/p/8486863.html

https://testerhome.com/topics/11357

https://blog.csdn.NET/Master724/article/details/107962349?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522163394586216780265448858%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=163394586216780265448858&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~top_click~default-2-107962349.pc_search_ecpm_flag&utm_term=uiautomator2&spm=1018.2226.3001.4187



Tags:UiAutomator2   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,不构成投资建议。投资者据此操作,风险自担。如有任何标注错误或版权侵犯请与我们联系,我们将及时更正、删除。
▌相关推荐
APP自动化测试框架-UiAutomator2基础
前言很早以前,我用uiautomator+java实践过Android APP自动化测试,不过今天要提的不是uiautomator,而是uiautomator2。听起来uiautomator2像是uiautomator的升级版,但是这两款框...【详细内容】
2022-08-09  Search: UiAutomator2  点击:(579)  评论:(0)  加入收藏
python第三方库uiautomator2 操作方法汇总
介绍uiautomator可以对第三方App进行测试,获取屏幕上任意一个APP的任意一个控件属性,并对其进行任意操作连接手机import uiautomator2 as u2#连接手机d = u2.connect(&#39;192...【详细内容】
2020-08-25  Search: UiAutomator2  点击:(1035)  评论:(0)  加入收藏
▌简易百科推荐
Qt与Flutter:在跨平台UI框架中哪个更受欢迎?
在跨平台UI框架领域,Qt和Flutter是两个备受瞩目的选择。它们各自具有独特的优势,也各自有着广泛的应用场景。本文将对Qt和Flutter进行详细的比较,以探讨在跨平台UI框架中哪个更...【详细内容】
2024-04-12  刘长伟    Tags:UI框架   点击:(7)  评论:(0)  加入收藏
Web Components实践:如何搭建一个框架无关的AI组件库
一、让人又爱又恨的Web ComponentsWeb Components是一种用于构建可重用的Web元素的技术。它允许开发者创建自定义的HTML元素,这些元素可以在不同的Web应用程序中重复使用,并且...【详细内容】
2024-04-03  京东云开发者    Tags:Web Components   点击:(11)  评论:(0)  加入收藏
Kubernetes 集群 CPU 使用率只有 13% :这下大家该知道如何省钱了
作者 | THE STACK译者 | 刘雅梦策划 | Tina根据 CAST AI 对 4000 个 Kubernetes 集群的分析,Kubernetes 集群通常只使用 13% 的 CPU 和平均 20% 的内存,这表明存在严重的过度...【详细内容】
2024-03-08  InfoQ    Tags:Kubernetes   点击:(23)  评论:(0)  加入收藏
Spring Security:保障应用安全的利器
SpringSecurity作为一个功能强大的安全框架,为Java应用程序提供了全面的安全保障,包括认证、授权、防护和集成等方面。本文将介绍SpringSecurity在这些方面的特性和优势,以及它...【详细内容】
2024-02-27  风舞凋零叶    Tags:Spring Security   点击:(62)  评论:(0)  加入收藏
五大跨平台桌面应用开发框架:Electron、Tauri、Flutter等
一、什么是跨平台桌面应用开发框架跨平台桌面应用开发框架是一种工具或框架,它允许开发者使用一种统一的代码库或语言来创建能够在多个操作系统上运行的桌面应用程序。传统上...【详细内容】
2024-02-26  贝格前端工场    Tags:框架   点击:(52)  评论:(0)  加入收藏
Spring Security权限控制框架使用指南
在常用的后台管理系统中,通常都会有访问权限控制的需求,用于限制不同人员对于接口的访问能力,如果用户不具备指定的权限,则不能访问某些接口。本文将用 waynboot-mall 项目举例...【详细内容】
2024-02-19  程序员wayn  微信公众号  Tags:Spring   点击:(43)  评论:(0)  加入收藏
开发者的Kubernetes懒人指南
你可以将本文作为开发者快速了解 Kubernetes 的指南。从基础知识到更高级的主题,如 Helm Chart,以及所有这些如何影响你作为开发者。译自Kubernetes for Lazy Developers。作...【详细内容】
2024-02-01  云云众生s  微信公众号  Tags:Kubernetes   点击:(58)  评论:(0)  加入收藏
链世界:一种简单而有效的人类行为Agent模型强化学习框架
强化学习是一种机器学习的方法,它通过让智能体(Agent)与环境交互,从而学习如何选择最优的行动来最大化累积的奖励。强化学习在许多领域都有广泛的应用,例如游戏、机器人、自动驾...【详细内容】
2024-01-30  大噬元兽  微信公众号  Tags:框架   点击:(72)  评论:(0)  加入收藏
Spring实现Kafka重试Topic,真的太香了
概述Kafka的强大功能之一是每个分区都有一个Consumer的偏移值。该偏移值是消费者将读取的下一条消息的值。可以自动或手动增加该值。如果我们由于错误而无法处理消息并想重...【详细内容】
2024-01-26  HELLO程序员  微信公众号  Tags:Spring   点击:(95)  评论:(0)  加入收藏
SpringBoot如何实现缓存预热?
缓存预热是指在 Spring Boot 项目启动时,预先将数据加载到缓存系统(如 Redis)中的一种机制。那么问题来了,在 Spring Boot 项目启动之后,在什么时候?在哪里可以将数据加载到缓存系...【详细内容】
2024-01-19   Java中文社群  微信公众号  Tags:SpringBoot   点击:(91)  评论:(0)  加入收藏
站内最新
站内热门
站内头条