Android自动化测试实践:uiautomator2 核心功能与应用指南

Android自动化测试实践:uiautomator2 核心功能与应用指南

uiautomator2 是一个用于Android应用的自动化测试Python库,支持多设备并行测试操作。它提供了丰富的API来模拟用户对App的各种操作,如安装、卸载、启动、停止以及清除应用数据等。此外,uiautomator2 支持多种设备连接方式,包括USB、模拟器默认连接以及通过WiFi(TCP/IP)连接。

核心功能:

  1. 设备连接与操作:支持USB和WiFi(TCP/IP)方式连接设备,提供了查看设备列表的命令和示例代码。
  2. 应用管理:能够安装和卸载应用,启动、停止以及获取正在运行的应用列表。
  3. 节点选择器:提供多种节点选择器,如基于文本、类名、描述、元素状态、包名、资源ID等来定位UI元素。
  4. 节点操作:支持获取匹配节点列表、节点存在性判断、节点计数,以及查找父级节点、子节点和同级元素。
  5. 事件操作:模拟用户交互,如点击、输入文本、滑动屏幕等。
  6. 坐标定位:获取元素坐标并执行坐标点击。
  7. 提示信息获取:能够获取系统提示语。

适用场景:

  • 自动化测试:为Android应用提供自动化测试解决方案,提高测试效率。
  • 应用开发:辅助开发者在开发过程中快速定位和测试UI元素。
  • 教育与研究:作为学习和研究Android自动化测试工具的资源。

使用注意:

  • 确保设备开启了开发者选项和USB调试。
  • 对于WiFi连接,需要先通过USB连接设备并设置TCP/IP端口,然后通过IP地址和端口号进行连接。

附加工具:

  • weditor:一个节点查看工具,帮助用户更方便地进行节点选择和测试。

img

APP的操作

url = "apk下载地址"
d.app_install(url)d.app_uninstall("包名")
d.app_start("包名")
d.app_stop("包名")
d.app_clear("包名")d.app_list_running() #获取正在运行的列表#获取正在运行的包名
print(d.app_current())

连接设备

查看设备列表

  • adb devices

  • 要使用 uiautomator2 查看设备列表,可以使用以下命令: python -m uiautomator2 init

USB模式

注意:开发者选项,打开USB调试

import uiautomator2 as u2# 注意网络代理
u2.wait_timeout = 20  # 设置等待时间为20秒
d = u2.connect_usb()

使用设备号连接

device = u2.connect("46d0c494") # usb连接,需要开启开发者模式,用atx也可以开启开发中模式,cmd输入adb devices获取设备号

模拟器连接

device = u2.connect() # 模拟器默认连接方式

wifi(tcpip )连接

  • USB连接手机,开发者选项,打开USB调试

  • adb tcpip 5555

  • 拔掉USB连接

  • adb connect 192.168.120.139:5555 连接设备

  • adb devices 查看设备列表

  • device = u2.connect(“192.168.0.187:5555”) # tcpip同个局域网连接

如果 adb 连接断开了,可以adb connect 192.168.0.187:5555 再次连接设备,未连接的话,

adb kill-server 重置主机

weditor工具-节点查看

#安装
pip install weditor==0.6.4 -i http://pypi.douban.com/simple --trusted-host pypi.douban.com 
#运行
python -m weditor 

image-20230615144526724

节点操作

选择器

多种节点选择器用于定位UI元素。

  • text、textContains、textMatches、textStartsWith用于根据文本内容定位元素;
  • className、classNameMatches用于根据类名定位元素;
  • description、descriptionContains、descriptionMatches、descriptionStartsWith用于根据元素描述定位元素;
  • checkable、checked、clickable、longClickable、scrollable、focused、selected、enabled、focusable用于根据元素状态定位元素;
  • packageName、packageNameMatches用于根据应用包名定位元素;
  • resourceId、resourceIdMatches用于根据资源ID定位元素;
  • index、instance用于根据元素在页面中的位置定位元素。

多个匹配

import uiautomator2 as u2# 连接设备
d = u2.connect_usb()# 获取所有匹配的节点(节点列表)
nodes = d(resourceId="com.ximalaya.ting.android:id/main_tv_name")
# 获取所有匹配的节点列表de 下标为2的节点
node_3 = d(resourceId="com.ximalaya.ting.android:id/main_tv_name",instance=2)# 判断节点是否存在
if nodes.exists:# 获取匹配的节点数量count = nodes.countprint("匹配的节点数量:", count)# 循环获取节点的text属性for node in nodes:text = node.info["text"]print("节点的text属性:", text)
else:print("没有匹配的节点")

查找父级节点(比较慢)

import uiautomator2 as u2# 连接设备
d = u2.connect_usb()# 获取节点对象
node = d(resourceId="com.example.app:id/parent_node")# 查找父级节点
parent_node = node.parent
print("父级节点:", parent_node)

查找子节点

import uiautomator2 as u2# 连接设备
d = u2.connect_usb()# 获取节点对象
node = d(resourceId="com.example.app:id/parent_node")child_nodes_0 = d(resourceId="com.example.app:id/parent_node").child(resourceId="com.example.app:id/child_node")# 查找所有子节点
child_nodes = node.child
print("所有子节点:", child_nodes)# 或者使用 children() 方法
child_nodes = node.children()
print("所有子节点:", child_nodes)

查找同级元素

text_view = my_icon.sibling(className='android.view.View')
text view.click()

查找(上下左右)的元素 (速度慢)

my = d(resourceId='com.example.app:id/button')
my.left().click()
my.right().click()
my.down().click()
my.up().click()

获取元素坐标

from uiautomator2 import Device# 连接设备
d = Device('设备序列号')# 获取元素
element = d(resourceId='com.example.app:id/button')# 获取元素中心坐标
x, y = element.center()
print(f"元素中心坐标为 ({x}, {y})")

事件操作

元素点击

# 获取元素
element = d(resourceId='com.example.app:id/button')
element.click()

坐标点击

d.click(500,500)

百分比点击

d.click(0.5,0.5)

输入

 node = d(longClickable="true",className="android.widget.EditText")node.send_keys("[炸弹]")

滑动屏幕

坐标系的起点是屏幕左上角(0,0),向右和向下为正坐标系

import uiautomator2 as u2# 获取屏幕的宽度和高度
screen_width = d.info["displayWidth"]
screen_height = d.info["displayHeight"]
# 计算起始点和终点的坐标
start_x = screen_width // 2
start_y = screen_height - 20  # 起始点的y坐标可以根据需要进行调整
end_x = start_x
end_y = start_y - (218 * 6)  # 终点的y坐标可以根据需要进行调整d = u2.connect_usb()# 执行滑动操作
d.swipe(start_x, start_y, end_x, end_y)

获取提示语

d.totast.get_message()

文档参考地址

  • https://blog.csdn.net/qq_32603969/article/details/121459006
  • https://www.jianshu.com/p/38f48390c538
  • 比较全面App自动化测试工具Uiautomator2
  • python+uiautomator2 实现多设备并行

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

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

相关文章

30个!2024重大科学问题、工程技术难题和产业技术问题发布

【SciencePub学术】中国科协自2018年开始,组织开展重大科技问题难题征集发布活动,引导广大科技工作者紧跟世界科技发展大势,聚焦国家重大需求,开展原创性、引领性研究,不断夯实高质量发展的科技支撑。 自2024年征集活动…

C#的五大设计原则-solid原则

什么是C#的五大设计原则,我们用人话来解释一下,希望小伙伴们能学会: 好的,让我们以一种幽默的方式来解释C#的五大设计原则(SOLID): 单一职责原则(Single Responsibility Principle…

鸿蒙开发Ability Kit(程序访问控制):【安全控件概述】

安全控件概述 安全控件是系统提供的一组系统实现的ArkUI组件,应用集成这类组件就可以实现在用户点击后自动授权,而无需弹窗授权。它们可以作为一种“特殊的按钮”融入应用页面,实现用户点击即许可的设计思路。 相较于动态申请权限的方式&am…

构造,析构,拷贝【类和对象(中)】

P. S.:以下代码均在VS2019环境下测试,不代表所有编译器均可通过。 P. S.:测试代码均未展示头文件stdio.h的声明,使用时请自行添加。 博主主页:LiUEEEEE                        …

gin-vue -admin 初始化安装后 进入 后台首页报错

报错原因: 因为 我是使用的phpstudy 小皮的数据库 默认的是MySam 的引擎 mysql 引擎需要是 innoDB 解决办法 : 在linux 的环境下 配置一个数据库 , 我是用的是vmware 虚拟机

《昇思25天学习打卡营第8天|CarpeDiem》

《昇思25天学习打卡营第8天|CarpeDiem》 模型训练构建数据集定义神经网络模型定义超参、损失函数和优化器超参损失函数优化器 训练与评估 打卡 今天是昇思25天学习打卡营的第8天,终于迎来 模型训练 的部分了!!! 兴奋 发癫 模型训…

数据库。

数据库安全性 论述题5’ 编程题10’ sql语言实现权限控制 一、概述 1、不安全因素 (1)⾮授权对数据库的恶意存取和破坏 (2)数据库中重要的数据泄露 (3)安全环境的脆弱性 2、⾃主存取控制⽅法 gr…

基于KMeans的航空公司客户数据聚类分析

💐大家好!我是码银~,欢迎关注💐: CSDN:码银 公众号:码银学编程 实验目的和要求 会用Python创建Kmeans聚类分析模型使用KMeans模型对航空公司客户价值进行聚类分析会对聚类结果进行分析评价 实…

Linux修炼之路之进程概念,fork函数,进程状态

目录 一:进程概念 二:Linux中的进程概念 三:用getpid(),getppid()获取该进程的PID,PPID 四:用fork()来创建子进程 五:操作系统学科的进程状态 六:Linux中的进程状态 接下来的日子会顺顺利利&#xf…

配置windows环境下独立浏览器爬虫方案【不依赖系统环境与chrome】

引言 由于部署浏览器爬虫的机器浏览器版本不同,同时也不想因为部署了爬虫导致影响系统浏览器数据,以及避免爬虫过程中遇到的chrome与webdriver版本冲突。我决定将特定版本的chrome浏览器与webdriver下载到项目目录内,同时chrome_driver在初始…

我使用 GPT-4o 帮我挑西瓜

在 5 月 15 日,OpenAI 旗下的大模型 GPT-4o 已经发布,那时网络上已经传开, 但很多小伙伴始终没有看到 GPT-4o 的体验选项。 在周五的时候,我组建的 ChatGPT 交流群的伙伴已经发现了 GPT-4o 这个选项了,是在没有充值升…

NSSCTF-Web题目21(文件上传-phar协议、RCE-空格绕过)

目录 [NISACTF 2022]bingdundun~ 1、题目 2、知识点 3、思路 [FSCTF 2023]细狗2.0 4、题目 5、知识点 6、思路 [NISACTF 2022]bingdundun~ 1、题目 2、知识点 文件上传,phar伪协议 3、思路 点击upload,看看 这里提示我们可以上传图片或压缩包&…

Unity 解包工具(AssetStudio/UtinyRipper)

文章目录 1.UtinyRipper2.AssetStudio 1.UtinyRipper 官方地址: https://github.com/mafaca/UtinyRipper/ 下载步骤: 2.AssetStudio 官方地址: https://github.com/Perfare/AssetStudio 下载步骤:

STM32mp157aaa按键中断实验

效果图&#xff1a; 源码&#xff1a; #include "key.h" void hal_key1_rcc_gpio_init() {// 使能GPIOF组RCC->MP_AHB4ENSETR | (0x1 << 5);// 设置引脚位输入模式GPIOF->MODER & (~(0X3 << 18));GPIOF->MODER & (~(0X3 << 16))…

VMware创建新虚拟机教程(保姆级别)

&#x1f4e2; 续上一篇 最新超详细VMware虚拟机安装完整教程-CSDN博客 &#xff0c;本章将详细讲解VMware创建虚拟机。 一、创建新的虚拟机 点击【创建新的虚拟机】&#xff01; 点击【自定义&#xff08;高级&#xff09;】> 下一步&#xff01; > 默认下一步&#x…

耐克:老大的烦恼

股价暴跌20%&#xff0c;老大最近比较烦。 今天说说全球&#xff08;最&#xff09;大运动品牌——耐克。 最近耐克发布2023-2024财年业绩&#xff08;截止于2024.5.31&#xff09;&#xff0c;还是爆赚几百亿美元&#xff0c;还是行业第一&#xff0c;但业绩不及预期&#xf…

Redis为什么设计多个数据库

​关于Redis的知识前面已经介绍过很多了,但有个点没有讲,那就是一个Redis的实例并不是只有一个数据库,一般情况下,默认是Databases 0。 一 内部结构 设计如下: Redis 的源码中定义了 redisDb 结构体来表示单个数据库。这个结构有若干重要字段,比如: dict:该字段存储了…

scikit-learn教程

scikit-learn&#xff08;通常简称为sklearn&#xff09;是Python中最受欢迎的机器学习库之一&#xff0c;它提供了各种监督和非监督学习算法的实现。下面是一个基本的教程&#xff0c;涵盖如何使用sklearn进行数据预处理、模型训练和评估。 1. 安装和导入包 首先确保安装了…

【漏洞复现】D-Link NAS 未授权RCE漏洞(CVE-2024-3273)

0x01 产品简介 D-Link 网络存储 (NAS)是中国友讯&#xff08;D-link&#xff09;公司的一款统一服务路由器。 0x02 漏洞概述 D-Link NAS nas_sharing.cgi接口存在命令执行漏洞&#xff0c;该漏洞存在于“/cgi-bin/nas_sharing.cgi”脚本中&#xff0c;影响其 HTTP GET 请求处…

Java 汉诺塔问题 详细分析

汉诺塔 汉诺塔&#xff08;Tower of Hanoi&#xff09;&#xff0c;又称河内塔&#xff0c;是一个源于印度古老传说的益智玩具。大梵天创造世界的时候做了三根金刚石柱子&#xff0c;在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小…