App 自动化,Appium 凭什么使用 UiAutomator2?
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 自动化,Helium 凭什么取代 Selenium?
App 自动化,Appium 凭什么使用 UiAutomator2?的更多相关文章
- app自动化appium使用内置adb命令
一.Appium-server使用 1.登陆页面 高级设置:可以设置Android 和 IOS 日志级别:dabug非常详尽的日志 记录python代码向他发送的请求以及他在收到请求后做的一系列处理 ...
- robotframework+appium 实现App自动化值环境搭建(一)
第一步: Cmd命令输入pip install robotframework-appiumlibrary 下载和导入appiumlibrary 第二步: 安装JDK,附件有JDK1.8安装包 第三步 ...
- Appium + Python App自动化第一个脚本
今天跟大家讲解一个Appium和Python App自动化的脚本.[1]打开你的夜神模拟器(或者连接你的手机) [2]打开桌面的Appium [3]下载你要测的App的apk文件,放到桌面[4]拖动你 ...
- [python]Appium+python +pytest 实现APP自动化,基于安卓
1.安卓环境搭建 &关于app自动化,个人觉得安装过程比较复杂,脚本难度实现和web自动化差不多封装关键字即可,因此,下面会写安装.启动APP以及过程中遇到的一些坑(这一篇偏向解释给个人) & ...
- app自动化问题点整理
1.配置SDK环境发现adb无法生效: 解决方案: 这个问题一般就是你的环境变量没有配置好,很多同学比较容易出现的点就是win10系统的环境变量配置: 一定要注意打开path添加:%ANDROID_H ...
- App自动化《元素定位方式、元素操作、混合应用、分层设计、代码方式执行Pytest 命令》
坚持原创输出,点击蓝字关注我吧 作者:清菡 博客:oschina.云+社区.知乎等各大平台都有. 目录 一.App 元素定位方式 二.元素操作 三.测试混合应用 四.以代码的方式执行 Pytest 命 ...
- APP自动化框架LazyAndroid使用手册(2)--元素自动抓取
作者:黄书力 概述 前面的一篇博文简要介绍了安卓自动化测试框架LazyAndroid的组成结构和基本功能,本文将详细描述此框架中元素自动抓取工具lazy-uiautomaterviewer的使用方法. ...
- APP自动化框架LazyAndroid使用手册(1)--框架简介
作者:cryanimal QQ:164166060 APP自动化简介 APP自动化,即通过自动化的方式,对APP施行一系列的仿按键输入.触摸屏输入.手势输入等操作,以达到对APP的功能进行自动化测试 ...
- 用java和junit编写app自动化测试用例
package myTest; import static org.junit.Assert.*; import io.appium.java_client.android.AndroidDriver ...
随机推荐
- Python for循环使用 else 语句
Python for循环使用 else 语句: else:当 for 所有的语句代码块正常运行完,才会运行 else 语句. 示例: ''' for 迭代对象 in 序列: 代码块(一行语句或多行代码 ...
- PHP stripos() 函数
实例 查找 "php" 在字符串中第一次出现的位置: <?php高佣联盟 www.cgewang.comecho stripos("I love php, I lo ...
- odoo12的视图常见属性和操作
1.菜单视图属性: 常用属性: name是展示在用户界面中的菜单项标题 action是点击菜单项时运行的窗口操作的XML ID parent是父级菜单项的XML ID.本例中父级项由其它模块创建,因此 ...
- 错误记录:MIME type may not contain reserved characters
最近遇到个问题,随手记录一下! 新做了一个项目,要通过HTTP请求发送ZIP文件到OSS平台,但上传过程中,总是出现下面错误提示: 初步判定,应该是包冲突原因!于是,分析MIME-TYPE获取源码发现 ...
- 一、elasticsearch部署
Elasticsearch官网: https://www.elastic.co/products/elasticsearch 一.Linux单节点部署 1. 解压elasticsearch-5.6.1 ...
- mapstruct解放Java对象转换
摘要 当前web后端开发,都是使用多层工程结构,需要在VO,BO,DTO,DO等各种数据结构中相互转换.这些转换代码都是些比较简单的字段映射,类型转换,重复性工作比较高,可以使用一些工具解放我们的双手 ...
- Flexible实现H5移动端适配小demo
前言 看了宇哥关于移动端适配的分享后,加上目前公司项目也需要做移动端适配,今天就抽空搞了搞.目前业界还是比较推崇手淘使用"rem+viewport"的解决方案,今天自己模仿手淘fl ...
- 基于boost的bind与function的一个简单示例消息处理框架
前两年开始接触boost,boost库真是博大精深:今天简单介绍一下boost中之前用到的的bind与function,感觉挺实用的,分享给大家,我对boost用的也不多,让大家见笑了. 上次文发了一 ...
- python实现单张图像拼接与批量图片拼接
本文实例为大家分享了python实现图像拼接的具体代码,供大家参考,具体内容如下 很多人学习python,不知道从何学起.很多人学习python,掌握了基本语法过后,不知道在哪里寻找案例上手.很多已经 ...
- 一篇文章快速搞懂什么是GitHub
导读:什么是GitHub?Git与GitHub之间是什么关系?我们为什么需要版本控制系统?GitHub如何使用?本文将带你一探究竟. 本文字数:1710,阅读时长大约:13分钟 一.什么是版本控制 按 ...