当前位置: 首页 > news >正文

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 实现多设备并行

相关文章:

  • 学习伦敦金技术分析的具体步骤是什么?
  • 第10天:字典和集合任务
  • 阿里云 CosyVoice 语音合成大模型 API 实践
  • HNU电子测试平台与工具2_《计算机串口使用与测量》
  • 视频监控汇聚平台LntonCVS视频监控业务平台具体有哪些功能?
  • 20240702在vmware17.5虚拟机中让ubuntu22.04使用主机的代理上网
  • [图解]SysML和EA建模住宅安全系统-07-to be块定义图
  • 【UML用户指南】-26-对高级行为建模-状态图
  • DC/AC电源模块:为智能家居设备提供恒定的电力供应
  • 深入探索Scala的类型推断机制
  • 【MySQL备份】Percona XtraBackup加密备份实战篇
  • 粤港联动,北斗高质量国际化发展的重要机遇
  • 中间包烘烤器控制
  • 力扣1124.表现良好的最长时间段
  • 边缘混合计算智慧矿山视频智能综合管理方案:矿山安全生产智能转型升级之路
  • (三)从jvm层面了解线程的启动和停止
  • 002-读书笔记-JavaScript高级程序设计 在HTML中使用JavaScript
  • android百种动画侧滑库、步骤视图、TextView效果、社交、搜房、K线图等源码
  • Java 网络编程(2):UDP 的使用
  • JavaScript HTML DOM
  • JavaScript创建对象的四种方式
  • Java精华积累:初学者都应该搞懂的问题
  • Java知识点总结(JDBC-连接步骤及CRUD)
  • oldjun 检测网站的经验
  • Redux系列x:源码分析
  • Webpack4 学习笔记 - 01:webpack的安装和简单配置
  • 程序员该如何有效的找工作?
  • 前端攻城师
  • 深入 Nginx 之配置篇
  • 使用Tinker来调试Laravel应用程序的数据以及使用Tinker一些总结
  • 手机app有了短信验证码还有没必要有图片验证码?
  • 一个6年java程序员的工作感悟,写给还在迷茫的你
  •  一套莫尔斯电报听写、翻译系统
  • 自制字幕遮挡器
  • 继 XDL 之后,阿里妈妈开源大规模分布式图表征学习框架 Euler ...
  • ​io --- 处理流的核心工具​
  • # 详解 JS 中的事件循环、宏/微任务、Primise对象、定时器函数,以及其在工作中的应用和注意事项
  • #我与Java虚拟机的故事#连载02:“小蓝”陪伴的日日夜夜
  • (1)(1.11) SiK Radio v2(一)
  • (9)YOLO-Pose:使用对象关键点相似性损失增强多人姿态估计的增强版YOLO
  • (LeetCode 49)Anagrams
  • (机器学习的矩阵)(向量、矩阵与多元线性回归)
  • (四)七种元启发算法(DBO、LO、SWO、COA、LSO、KOA、GRO)求解无人机路径规划MATLAB
  • (转载)PyTorch代码规范最佳实践和样式指南
  • .md即markdown文件的基本常用编写语法
  • .NET 中什么样的类是可使用 await 异步等待的?
  • .net6 webapi log4net完整配置使用流程
  • .netcore 获取appsettings
  • .NET建议使用的大小写命名原则
  • .NET平台开源项目速览(15)文档数据库RavenDB-介绍与初体验
  • @ 代码随想录算法训练营第8周(C语言)|Day57(动态规划)
  • [AIR] NativeExtension在IOS下的开发实例 --- IOS项目的创建 (一)
  • [AI资讯·0612] AI测试高考物理题,最高准确率100%,OpenAI与苹果合作,将ChatGPT融入系统中,大模型在物理领域应用潜力显现
  • [Asp.net MVC]Asp.net MVC5系列——Razor语法
  • [BPU部署教程] 教你搞定YOLOV5部署 (版本: 6.2)