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. 自述:转职IT ,痛苦一阵子;不转职IT,痛苦一辈子(第一章)

    作为一个从后期制作转职过来的Java工程师,我认为我是幸运的,虽然我的本科专业(影视后期)也是火爆行业,不愁工作,但我不后悔进入这个IT坑,毕竟转行,只痛苦一阵子,但是不转行,可能我会痛苦一辈子. 我 ...

  2. ASP.NET Core 监听SQL Server数据库的实时信息

    1.开发环境: 开发工具:Visual Studio 2019 数据库:SQL Server2012 开发环境:.Net Core 3.1 2.使用技术: Signalr:实现消息推送 SqlDepe ...

  3. PHP timezone_name_get() 函数

    ------------恢复内容开始------------ 实例 返回时区的名称: <?php$tz=timezone_open("Europe/Paris");echo ...

  4. PHP zip_read() 函数

    定义和用法 zip_read() 函数读取打开的 zip 档案中的下一个文件.高佣联盟 www.cgewang.com 如果成功,该函数则返回包含 zip 档案中一个文件的资源.如果没有更多的项目可供 ...

  5. 最新 laravel5.8 连接redis集群

    简介 Redis 是一个开源的,高级键值对存储数据库.由于它包含 字符串 , 哈希 , 列表 , 集合 , 和 有序集合 这些数据类型,所以它通常被称为数据结构服务器. 在使用 Laravel 的 R ...

  6. cobbler多机定制安装

    目录 cobbler多机定制安装 1. cobbler服务端部署 2. 客户端安装 3. 定制安装配置 4. 安装 client1开机 client2开机 cobbler多机定制安装 1. cobbl ...

  7. day18.os模块 对系统进行操作

    一.os操作 1.system()在python中执行系统命令 # os.system("ifconfig") # os.system("touch 1.txt" ...

  8. LeetCode(1)---检查括号出现的合法性

          题目: 检查字符串中"( )","[ ]","{ }" 的合法性,即是否成对出现 eg,如出现"[()]", ...

  9. 嵌入式Linux串口编程简介

    文章目录 简介 用到的API函数 代码 简介 嵌入式Linux下串口编程与Linux系统下的编程没有什么区别,系统API都是一样的.嵌入式设备中串口编程是很常用的,比如会对接一些传感器模块,这些模块大 ...

  10. 用了Dapper之后通篇还是SqlConnection,真的看不下去了

    一:背景 1. 讲故事 前几天看公司一个新项目的底层使用了dapper,大家都知道dapper是一个非常强大的半自动化orm,帮程序员解决了繁琐的mapping问题,用起来非常爽,但我还是遇到了一件非 ...