1. UiAutomator2 是什么

可能很多人对 UiAutomator2 和 UiAutomator 傻傻分不清楚

UiAutomator 是 Google 开发的一款运行在 Android 设备上的 UI 自动化测试工具,基于JAVA语言,使用它有一个限制,就是必须打包成 APK 或 JAR,然后上传到设备,才能运行

事实上,UiAutomator2 同样有 JAVA和 Python 版,今天我们聊的是 Python 版本的 UiAutomator2

至于 JAVA 版本的可以参考之前写的文章:点我查看

Python 版本的 UiAutomator2 项目地址:

https://github.com/openatx/uiautomator2

2.Appium 和 UiAutomator2

作为移动端自动化的鼻祖,早期版本的 Appium 是基于 UiAutomator 和 Bootstrap.jar

其中,Bootstrap 在 Appium初始化的时候,被推送到 Android 设备上,负责监听 Appium 发过来的请求,并转换后发送给 UiAutomator 去处理,完成自动化操作

最新版本的 Appium 加入了对 UiAutomator2 的支持,原理进行了更新,功能和稳定性更加完善

原理图可以参考:

3.准备

在使用 UiAutomator2 之前,需要做如下准备

1、在 PC 端配置 Android 开发环境

2、使用 pip 安装 uiautomator2 依赖

# 安装依赖
pip3 install -U uiautomator2 # 如果需要截屏,需要安装pillow
pip3 install pillow

3、在手机上安装 atx-agent 应用

ps:atx-agent 作为服务端,一直运行在后台

# 安装apk服务到手机上
python -m uiautomator2 init

4、安装 weditor

WEditor 通过 ip 连接手机,即可以实时查看 App 的界面元素信息

和 Appium DeskTop 类似,可以模拟点击、滑动操作、生成操作源码等功能

首先,通过 pip 安装 weditor 依赖包

# 基于浏览器查看 App 的界面元素
pip3 install -U weditor

然后,在命令行输入 weditor,会自动在浏览器中打开,接着通过 ip 连接对应的设备,即可以获取设备端当前界面的控件信息

信息内容包含:控件的层级关系、控件 ID、文本内容、坐标值等内容

4.实战一下

还是以闲鱼搜索商品为例,聊聊 UiAutomator2 的使用

1、连接设备

使用 UiAutomator2 连接设备有 3 种方式,分别是:

  • 局域网设备 IP 地址

  • USB 连接 + 设备序列号

  • ADB + IP + 端口号

import uiautomator2 as u2

# 方式一:局域网设备ip地址
device = u2.connect(手机ip地址) # 方式二:USB + 设备序列号
device = u2.connect(手机序列号) # 方式三:ADB+
# 首先,设备用USB线连接PC,输入命令:adb tcpip 端口号进行映射
# 拔掉USB线,通过ip地址+端口号进行连接
device = u2.connect_adb_wifi(手机ip地址:端口号)

2、打开闲鱼 APP

调用上面 device 对象中 app_start() 方法,传入应用的包名作为参数可以打开应用

需要注意的是,方法中的第二个参数如果传入 True,可以冷启动 App,默认值为 False

# 打开应用
device.app_start(PACKAGE_NAME, stop=True)

3、点击搜索栏进入搜索界面

首先,全局设置一个隐式等待,保证查找元素的时候避免因为卡顿、网络导致的异常

# 隐式等待20s,保证控件加载完成
device.implicitly_wait(20)

然后,通过 WEditor 定位到搜索入口控件的基本信息

常用的 UiAutomator2 定位方式有 6 种,分别是:

  • ID 定位

  • Text 文本定位

  • Description 定位

  • ClassName 定位

  • Xpath 定位

  • 组合定位

例如:

# 常用的6种定位方式
# 方式一:ID定位
d(resourceId=元素ID).click() # 方式二:Text文本定位
d(text="公众号:AirPython").click() # 方式三:Description值定位
d(description="AirPython").click() # 方式四:ClassName定位
d(className="android.widget.TextView").click() # 方式五:Xpath定位
d.xpath("//*[@content-desc='AirPython']") # 方式六:组合定位
d(className="android.widget.ListView", resourceId=元素ID)

需要指出的是,当界面属性值不唯一的时候,组合定位就显得很实用

本例直接使用 ID 去找到元素,然后执行点击操作,跳转到搜索界面

# 点击到搜索页面
device(resourceId="com.taobao.idlefish:id/search_bg_img_front",).click()

4、搜索

UiAutomator2 中提供了 send_keys() 方法,用于向输入框中设置文本

注意:参数 clear 如果设置为 True,则在输入内容之前,会先清空输入框,默认值为 False

# 输入内容
device.send_keys("Python", clear=True) # 点击搜索按钮
device(text="搜索").click()

5、滑动

UiAutomator2 提供了两个方法用于滑动界面,分别是:

  • swipe_ext( 滑动方向 )

  • swipe( 开始 x 轴,开始 y 轴,结束 x 轴,结束 y 轴值,滑动时间 )

经过测试发现,滑动操作,swipe_ext() 使用效果不稳定,建议使用 swipe() 函数

for i in range(5):
print('滑动一次')
swipe_custom(device, 0.5, 0.8, 0.5, 0.2, 1.2)

另外,为了保证兼容不同分辨率的设备,建议通过屏幕百分比自定义滑动方法

def swipe_custom(device, start_x_percent, start_y_percent, end_x_percent, end_y_percent, during=1.0, interval=1):
"""
自定义滑动,适配性更高
:param device:
:param start_x_percent:
:param start_y_percent:
:param end_x_percent:
:param end_y_percent:
:param during:
:return:
"""
# 获取屏幕的宽、高度
width, height = device.window_size()
device.swipe(start_x_percent * width, start_y_percent * height, end_x_percent * width, end_y_percent * height,
during) if interval > 0:
sleep(interval)

6、关闭应用

在完成自动化操作后,就可以调用 app_stop() 方法强制关闭应用

# 停止App
device.app_stop(PACKAGE_NAME)

当然,可以在每次操作完,使用 UiAutomator2 提供的方法 app_clear() 清除 App 数据

# 清除App数据
# device.app_clear(PACKAGE_NAME)

5.最后

通过上面的实例,我们发现 UiAutomator2 相比 Appium,语法更简洁易懂,代码量也少了很多

但是由于 Uiautomator2 仅适用于 Android 端,Appium 拥有多语言、跨平台的特性,企业级自动化一般会选择后者

我已经将文中全部源码上传到后台,关注公众号「 AirPython 」后回复「 uiauto2 」即可获得全部源码

如果你觉得文章还不错,请大家 点赞、分享、留言下,因为这将是我持续输出更多优质文章的最强动力!

推荐阅读

带你用 Python 实现自动化群控(入门篇)

聊聊 Python 做微信小程序自动化,那些踩过的坑?

Python 自动化,Helium 凭什么取代 Selenium?

App 自动化,Appium 凭什么使用 UiAutomator2?的更多相关文章

  1. app自动化appium使用内置adb命令

    一.Appium-server使用 1.登陆页面 高级设置:可以设置Android 和 IOS 日志级别:dabug非常详尽的日志 记录python代码向他发送的请求以及他在收到请求后做的一系列处理 ...

  2. robotframework+appium 实现App自动化值环境搭建(一)

    第一步: Cmd命令输入pip install robotframework-appiumlibrary  下载和导入appiumlibrary 第二步: 安装JDK,附件有JDK1.8安装包 第三步 ...

  3. Appium + Python App自动化第一个脚本

    今天跟大家讲解一个Appium和Python App自动化的脚本.[1]打开你的夜神模拟器(或者连接你的手机) [2]打开桌面的Appium [3]下载你要测的App的apk文件,放到桌面[4]拖动你 ...

  4. [python]Appium+python +pytest 实现APP自动化,基于安卓

    1.安卓环境搭建 &关于app自动化,个人觉得安装过程比较复杂,脚本难度实现和web自动化差不多封装关键字即可,因此,下面会写安装.启动APP以及过程中遇到的一些坑(这一篇偏向解释给个人) & ...

  5. app自动化问题点整理

    1.配置SDK环境发现adb无法生效: 解决方案: 这个问题一般就是你的环境变量没有配置好,很多同学比较容易出现的点就是win10系统的环境变量配置: 一定要注意打开path添加:%ANDROID_H ...

  6. App自动化《元素定位方式、元素操作、混合应用、分层设计、代码方式执行Pytest 命令》

    坚持原创输出,点击蓝字关注我吧 作者:清菡 博客:oschina.云+社区.知乎等各大平台都有. 目录 一.App 元素定位方式 二.元素操作 三.测试混合应用 四.以代码的方式执行 Pytest 命 ...

  7. APP自动化框架LazyAndroid使用手册(2)--元素自动抓取

    作者:黄书力 概述 前面的一篇博文简要介绍了安卓自动化测试框架LazyAndroid的组成结构和基本功能,本文将详细描述此框架中元素自动抓取工具lazy-uiautomaterviewer的使用方法. ...

  8. APP自动化框架LazyAndroid使用手册(1)--框架简介

    作者:cryanimal  QQ:164166060 APP自动化简介 APP自动化,即通过自动化的方式,对APP施行一系列的仿按键输入.触摸屏输入.手势输入等操作,以达到对APP的功能进行自动化测试 ...

  9. 用java和junit编写app自动化测试用例

    package myTest; import static org.junit.Assert.*; import io.appium.java_client.android.AndroidDriver ...

随机推荐

  1. Python for循环使用 else 语句

    Python for循环使用 else 语句: else:当 for 所有的语句代码块正常运行完,才会运行 else 语句. 示例: ''' for 迭代对象 in 序列: 代码块(一行语句或多行代码 ...

  2. PHP stripos() 函数

    实例 查找 "php" 在字符串中第一次出现的位置: <?php高佣联盟 www.cgewang.comecho stripos("I love php, I lo ...

  3. odoo12的视图常见属性和操作

    1.菜单视图属性: 常用属性: name是展示在用户界面中的菜单项标题 action是点击菜单项时运行的窗口操作的XML ID parent是父级菜单项的XML ID.本例中父级项由其它模块创建,因此 ...

  4. 错误记录:MIME type may not contain reserved characters

    最近遇到个问题,随手记录一下! 新做了一个项目,要通过HTTP请求发送ZIP文件到OSS平台,但上传过程中,总是出现下面错误提示: 初步判定,应该是包冲突原因!于是,分析MIME-TYPE获取源码发现 ...

  5. 一、elasticsearch部署

    Elasticsearch官网: https://www.elastic.co/products/elasticsearch 一.Linux单节点部署 1. 解压elasticsearch-5.6.1 ...

  6. mapstruct解放Java对象转换

    摘要 当前web后端开发,都是使用多层工程结构,需要在VO,BO,DTO,DO等各种数据结构中相互转换.这些转换代码都是些比较简单的字段映射,类型转换,重复性工作比较高,可以使用一些工具解放我们的双手 ...

  7. Flexible实现H5移动端适配小demo

    前言 看了宇哥关于移动端适配的分享后,加上目前公司项目也需要做移动端适配,今天就抽空搞了搞.目前业界还是比较推崇手淘使用"rem+viewport"的解决方案,今天自己模仿手淘fl ...

  8. 基于boost的bind与function的一个简单示例消息处理框架

    前两年开始接触boost,boost库真是博大精深:今天简单介绍一下boost中之前用到的的bind与function,感觉挺实用的,分享给大家,我对boost用的也不多,让大家见笑了. 上次文发了一 ...

  9. python实现单张图像拼接与批量图片拼接

    本文实例为大家分享了python实现图像拼接的具体代码,供大家参考,具体内容如下 很多人学习python,不知道从何学起.很多人学习python,掌握了基本语法过后,不知道在哪里寻找案例上手.很多已经 ...

  10. 一篇文章快速搞懂什么是GitHub

    导读:什么是GitHub?Git与GitHub之间是什么关系?我们为什么需要版本控制系统?GitHub如何使用?本文将带你一探究竟. 本文字数:1710,阅读时长大约:13分钟 一.什么是版本控制 按 ...