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

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

一、uiautomator/uiautomator2的前生今世

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

1.官方文档介绍

2.梳理一下脉络

先有的谷歌uiautomator,但是只支持java;

后来一个名为hexiaocong的开发者基于uiautomator封装了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)运行过程

移动设备上运行atx-agent守护进程,随后atx-agent启动uiautomator2服务,默认7912端口进行监听;

在PC上编写python脚本并执行(相当于发送 HTTP 请求到移动设备的 server 端);

移动设备通过 WIFI 或 USB 接收到 PC 上发来的 HTTP 请求,执行指定的操作,从而操作移动设备;

三、环境搭建

1.安装uiautomator2
pip install uiautomator2
pip 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 u2

d = u2.connect('10.0.0.1') # alias for u2.connect_wifi('10.0.0.1')
print(d.info)
 

2)通过USB连接

import uiautomator2 as u2

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

3)通过ADB WiFi连接

import uiautomator2 as u2

d = 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,以下仅列出几种常见的定位方式:

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左边的B
d(A).right(B),# 选择A右边的B
d(A).up(B), #选择A上边的B
d(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

用法示例:

d(test="Settings").exists
d.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)  # 元素向上滑动,步长20
d(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框会同步展现元素操作的代码,同时手机界面也会相应同步切换页面。

最后感谢每一个认真阅读我文章的人,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走:

这些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴上万个测试工程师们走过最艰难的路程,希望也能帮助到你! 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

硬盘分区丢失?这样轻松恢复!

​“在我安装操作系统的过程中&#xff0c;我先把C盘&#xff08;100G&#xff09;进行了格式化&#xff0c;而我的D盘大小为297G&#xff0c;然而在Win PE中&#xff0c;所显示的仅是247G&#xff08;CD盘总容量&#xff09;&#xff0c;这247G是空无一物的。让我感到困惑的是…

02、pytest环境准备

工具准备 python官网下载&#xff1a;https://www.python.org/pycharm官网下载&#xff1a;https://www.jetbrains.com.cn/en-us/pycharm/pytest官方文档&#xff1a;https://docs.pytest.org/en/7.4.x/python-office官网文档&#xff1a;http://www.python-office.com/ 参考…

《消息队列MyMQ》——参考RabbitMQ实现

目录 一、什么是消息队列&#xff1f; 二、需求分析 1&#xff09;核心概念 2&#xff09;核心API 3&#xff09;交换机类型 4&#xff09;持久化 5&#xff09;网络通信 ​编辑 6&#xff09;消息应答 三、 模块划分 四、创建核心类 1.ExChange 2.MSGQueue 3.Bind…

NSSCTF 文件上传漏洞题目

目录 [SWPUCTF 2021 新生赛]easyupload1.0 [SWPUCTF 2021 新生赛]easyupload2.0 [SWPUCTF 2021 新生赛]easyupload3.0 [SWPUCTF 2021 新生赛]easyupload1.0 这是一个文件上传漏洞的题目 我们的思路是上传一句话木马&#xff0c;用工具进行连接 先编写一句话木马 将文件后缀…

【深度学习】Stable Diffusion中的Hires. fix是什么?Hires. fix原理

文章目录 **Hires. fix****Extra noise**Upscalers Hires. fix https://github.com/AUTOMATIC1111/stable-diffusion-webui/wiki/Features#hires-fix 提供了一个方便的选项&#xff0c;可以部分地以较低分辨率呈现图像&#xff0c;然后将其放大&#xff0c;最后在高分辨率下添…

【数电笔记】16-卡诺图绘制(逻辑函数的卡诺图化简)

目录 说明&#xff1a; 最小项卡诺图的组成 1. 相邻最小项 2. 卡诺图的组成 2.1 二变量卡诺图 2.2 三表变量卡诺图 2.3 四变量卡诺图 3. 卡诺图中的相邻项&#xff08;几何相邻&#xff09; 说明&#xff1a; 笔记配套视频来源&#xff1a;B站&#xff1b;本系列笔记并…

文献速递:(第三部分)— (超声非破坏性评估中合成和增强训练数据生成与评估的最新研究进展)

文献速递&#xff1a;&#xff08;第三部分&#xff09;— &#xff08;超声非破坏性评估中合成和增强训练数据生成与评估的最新研究进展&#xff09; Title 题目 A review of synthetic and augmented training data for machine learning in ultrasonic non-destructive e…

iOS17桌面待办事项提醒小组件,让的iPhone变身提醒神器

在现代社会&#xff0c;每天都有太多的事情需要处理&#xff0c;而我经常发现自己在繁忙中遗漏一些重要的事项。曾经&#xff0c;我每次都要在纸上记下要做的事情&#xff0c;可事后发现&#xff0c;这也没能解决我的忘性问题。 直到我尝试了一个新的方式&#xff0c;我的iPho…

韵达单号查询,韵达快递查询,用表格导出单号的详细物流信息

批量查询韵达快递单号的物流信息&#xff0c;并以表格的形式导出单号的详细物流信息。 所需工具&#xff1a; 一个【快递批量查询高手】软件 韵达快递单号若干 操作步骤&#xff1a; 步骤1&#xff1a;运行【快递批量查询高手】软件&#xff0c;第一次使用的伙伴记得先注册&…

DCMTK 目录结构

DCMTK 目录结构 经过编译后的DCMTK包含许多文件&#xff0c;在使用的时候我们需要将这些文件包含到对应的项目中&#xff0c;源码编译得到的文件如下&#xff1a; 如果你还没有成功编译&#xff0c;可以参考 dcmtk编译失败后的解决思路&#xff08;附带编译后文件下载&#x…

【生物医学信号处理及其MATLAB应用】Chapter 1 生物医学信号概述

Chapter 1 生物医学信号概述 第一章 生物医学信号概述一、信号二、生物医学信号三、生物医学信号处理的内容三、处理生物医学信号的目的 第一章 生物医学信号概述 一、信号 ​ 信号&#xff1a;携带信息的物理量 ​ 来自于真实世界的信号各不相同&#xff0c;但大致可分为四…

【Linux】编译器-gcc/g++与调试器-gdb的使用

&#x1f440;樊梓慕&#xff1a;个人主页 &#x1f3a5;个人专栏&#xff1a;《C语言》《数据结构》《蓝桥杯试题》《LeetCode刷题笔记》《实训项目》《C》《Linux》 &#x1f31d;每一个不曾起舞的日子&#xff0c;都是对生命的辜负 目录 前言 1.gcc/g语法 2.gcc的使用及…

【教程】苹果推送证书的创建和使用流程详解

​ 摘要 本篇博客主要介绍了苹果推送证书的使用流程。首先&#xff0c;在苹果开发者中心创建推送证书&#xff0c;然后在应用程序中使用该证书进行消息推送。文章详细说明了创建推送证书的步骤&#xff0c;并提供了在应用程序中注册推送服务、发送推送消息以及处理推送消息的相…

Databend 开源周报第 122 期

Databend 是一款现代云数仓。专为弹性和高效设计&#xff0c;为您的大规模分析需求保驾护航。自由且开源。即刻体验云服务&#xff1a;https://app.databend.cn 。 Whats On In Databend 探索 Databend 本周新进展&#xff0c;遇到更贴近你心意的 Databend 。 支持链式函数调…

PWN学习之LLVM入门

一、基本流程 ①找到runOnFunction函数时如何重写的&#xff0c;一般来说runOnFunction都会在函数表最下面,找PASS注册的名称&#xff0c;一般会在README文件中给出&#xff0c;若是没有给出&#xff0c;可通过对__cxa_atexit函数"交叉引用"来定位&#xff1a; ②通…

GEE:Sobel算子卷积和Roberts算子卷积对比

作者:CSDN @ _养乐多_ 本文介绍了Sobel算子卷积和Roberts算子卷积操作的代码,并进行了图像对比,可以观察到两个算子的细微差异。 文章目录 一、Sobel算子和Roberts算子对比二、完整代码三、代码链接一、Sobel算子和Roberts算子对比 详细介绍介绍参考《遥感数字图像处理教程…

MySQL笔记-第03章_基本的SELECT语句

视频链接&#xff1a;【MySQL数据库入门到大牛&#xff0c;mysql安装到优化&#xff0c;百科全书级&#xff0c;全网天花板】 文章目录 第03章_基本的SELECT语句1. SQL概述1.1 SQL背景知识1.2 SQL语言排行榜1.3 SQL 分类 2. SQL语言的规则与规范2.1 基本规则2.2 SQL大小写规范 …

算法-02-排序-冒泡插入选择排序

一般最经典的、最常用的&#xff1a;冒泡排序、插入排序、选择排序、归并排序、快速排序、计数排序、基数排序、桶排序。那么我们如何分析一个"排序算法"呢&#xff1f; 1-分析排序算法要点 时间复杂度&#xff1a;具体是指最好情况、最坏情况、平均情况下的时间复杂…

算法-滑动窗口

一、滑动窗口思想 概念 在数组双指针里&#xff0c;我们介绍过 "对撞型" 和 "快慢型" 两种方式&#xff0c;而滑动窗口思想就是快慢型的特例。 实际使用 计算机网络中有滑动窗口协议&#xff08;Sliding Window Protocol&#xff09;&#xff0c;该协议…

10、pytest通过assert进行断言

官方实例 # content of test_assert1.pydef f():return 3def test_function():assert f() 4def test_assert_desc():a f()# assert a % 2 0assert a % 2 0, "value was odd, should be even"解读与实操 pytest允许你使用标准python断言来验证测试中的期望和值&…