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.count
    print("匹配的节点数量:", 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.mfbz.cn/a/765759.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于索尼基于索尼Spresense的眼睛跟随平台中两个模型的对比

1.模型一(现在使用的) 这个模型是一个简单的神经网络,由三个主要组件组成:输入层、一个全连接层(Affine层)、一个Sigmoid激活函数层和一个Binary Cross Entropy损失层。 以下是每个组件的说明: Input 层:这…

计算机专业的概念需要拓宽|终身学习之旅利:用FlowUs打造个性化学习记录知识库

计算机相关专业长期以来一直是热门选择,这主要得益于技术的快速发展和广泛的应用场景。随着AI技术的不断进步,这一趋势在未来几年内仍有望持续。以下是从不同角度对这个问题的分析: 从AI发展的角度: 技术革新:AI技术…

axios的底层ajax,XMLHttpRequest原理解释及使用方法

定义 ajax全称asychronous JavaScript and XML 意思是异步的 JavaScript和xml, 也就是通过javascript创建XMLHttpRequest (xhr)对象与服务器进行通信 步骤 创建实例对象,初始请求方法和url,设置监听器监听请求完成…

人工智能在音乐创作中的双刃剑:创新与挑战

AI在创造还是毁掉音乐? 简介 最近一个月,轮番上线的音乐大模型,一举将素人生产音乐的门槛降到了最低,并掀起了音乐圈会不会被AI彻底颠覆的讨论。短暂的兴奋后,AI产品的版权归属于谁,创意产业要如何在AI的阴…

经典FC游戏web模拟器--EmulatorJS

简介 EmulatorJS是一个基于JavaScript和Webassembly技术的虚拟环境的实现,可以在网页中运行各种经典FC游戏系统,支持任天堂、世嘉、雅达利等经典红白机。EmulatorJS的诞生使得诸如超级玛丽、坦克大战、魂斗罗等经典FC游戏能够以一种全新的方式回归。本文…

开源模型应用落地-FastAPI-助力模型交互-WebSocket篇(六)

一、前言 使用 FastAPI 可以帮助我们更简单高效地部署 AI 交互业务。FastAPI 提供了快速构建 API 的能力,开发者可以轻松地定义模型需要的输入和输出格式,并编写好相应的业务逻辑。 FastAPI 的异步高性能架构,可以有效支持大量并发的预测请求,为用户提供流畅的交互体验。此外,F…

动手学深度学习 --带你了解chatgpt,跟上AI发展!

本书旨在向读者交付有关深度学习的交互式学习体验。书中不仅阐述深度学习的算法原理,还演示它们的实现和运行。与传统图书不同,本书的每一节都是一个可以下载并运行的 Jupyter记事本,它将文字、公式、图像、代码和运行结果结合在了一起。此外…

【JS】纯web端使用ffmpeg实现的视频编辑器-视频合并

纯前端实现的视频合并 接上篇ffmpeg文章 【JS】纯web端使用ffmpeg实现的视频编辑器 这次主要添加了一个函数,实现了视频合并的操作。 static mergeArgs(timelineList) {const cmd []console.log(时间轴数据,timelineList)console.log("文件1",this.readD…

openGauss真的比PostgreSQL差了10年?

前不久写了MogDB针对PostgreSQL的兼容性文章,我在文中提到针对PostgreSQL而言,MogDB兼容性还是不错的,其中也给出了其中一个能源客户之前POC的迁移报告数据。 But很快我发现总有人回留言喷我,而且我发现每次喷的这帮人是根本不看文…

容器内存

一、容器内存概述 容器本质上还是一个进程,是一个被隔离和限制的进程。因此容器内存和进程内存在表现形式上其实是一样的,这块主要涉及三部分内容:RSS,page cache和swap这三部分,容器基于memory Cgroup对内存进行限制…

Xorbits inference操作实战

1.操作环境 序号软件版本备注1Windows1.版本:Windows 10 专业版2.版本号:21H23.操作系统内部版本:19044.18892Docker Desktop4.24.2 (124339)3WSLUbuntu 22.04 LTS4Python3.105CUDA12.16Dify0.6.6 Xorbits inference 是一个强大且通用的分布…

Python基础001

Python输出语句 print输出字符串 print("中国四大名著:","西游记|","三国演义|","红楼梦|","水浒传") print(6) print(1 1)Python输入语句 input函数 input() input("我的名字是:") p…

在非 antd pro 项目中使用 umi OpenAPI

大家好,我是松柏。自从跟着鱼皮哥使用了ant design pro中的OpenAPI插件之后,我已经无法忍受自己写请求后端接口的方法了,所以这篇文章记录一下如何在非ant design pro项目中使用OpenAPI。 安装依赖 首先我们需要安装包umijs/openapi&#x…

java面试课程-SpringIOC部分源码解析

1.SpringIOC的refresh源码解析 核心: 核心使用的是: 需要完成配置类的解析,各种BeanFactoryProcessor的注册。还有写国际化配置的初始化。Web容器的内部构造。 上面几个方法是refresh方法的内容。注意可以与applicationContext里的内容一起…

Profibus DP主站转Modbus网关连接智能化电表通讯

Profibus DP主站转Modbus网关(XD-MDPBM20),是实现不同工业通信协议之间互联互通的设备,主要将Profibus DP协议转换为Modbus协议,实现数据的双向传输。通过Profibus DP主站转Modbus网关(XD-MDPBM20&#xff…

大Excel表格76M,电脑16G内存打不开,内存利用率100%虚拟内存占用16G还是卡死提示内存不足,如何才能查看里面内容?

环境: Excel2016 问题描述: 大Excel表格76M,电脑16G内存打不开,内存利用率100%虚拟内存占用16G还是卡死提示内存不足,如何才能查看里面内容? 解决方案: 遇到这种情况,说明Excel文件非常大,超出了你当前计算机配置的处理能力。以下是一些解决方法,帮助你尝试打开或…

代码随想录-Day45

198. 打家劫舍 你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。 给定一个代表每个…

编译原理2

推导和短语 推导 推导过程中,每一步推导都是对句型的 最右非终结符 进行替换,最右推导(规范推导); 短语 用 β 替换 A,则 β 就是 关于A 的一个短语; 直接短语是短语范围内的一步推导; 直接短语可能不…

基于python的随机森林回归预测+贝叶斯优化超参数前后训练效果对比

目录 1.导入必要的库 2.导入数据与数据预处理 3.查看数据分布 4.特征选择 5.模型建立与训练 6.训练集预测结果 7.模型评估 8.预测新数据 9.贝叶斯优化超参数 1.导入必要的库 # 导入所需的库 from sklearn.model_selection import cross_val_score import pandas as …

Sentinel实现区分来源

要区分来源就要写代码实现RequestOriginParser接口 ,注意是要实现com.alibaba.csp.sentinel.adapter.servlet.callback.RequestOriginParser 接口,别搞错接口了。 MyRequestOriginParser.java package com.codex.terry.sentinel.origin;import com.ali…