技术分享 | app自动化测试(Android)--App 控件定位

news2024/11/15 12:37:34

客户端的页面通过 XML 来实现 UI 的布局,页面的 UI 布局作为一个树形结构,而树叶被定义为节点。这里的节点也就对应了要定位的元素,节点的上级节点,定义了元素的布局结构。在 XML 布局中可以使用 XPath 进行节点的定位。

App的布局结构

从上面这张图中可以看到最左侧是应用的页面的展示,中间部分展示了这个页面的树形结构的 XML 代码。

其中包含的内容为:

  • 节点 node

  • 节点属性:包括 clickable(是否可点击)、content-desc(内容)、resource-id(元素 id)、text(文本)、bounds(坐标)等。

通过 ID 定位

在 Android 系统元素的 ID 称为 resource-id,使用页面分析工具比如 Appium Inspector 能够获取元素的唯一标识是 ID 属性,可以使用 ID 进行元素定位,方便快捷。

示例代码如下:

  • Python 版本

driver.find_element(By.ID, "android:id/text1").click()

  • Java 版本

driver.findElement(By.id("android:id/text1")).click();

注意 resource-id 对应的属性(包名:id/id 值),在使用这个属性的时候要把它当作一个整体。

通过 Accessibility 定位

当分析工具能抓取到的 content-desc 的属性值是唯一时,可以采用 Accessibility 的定位方式,示例代码:

  • Python 版本

driver.find_element_by_accessibility_id("Accessibility")

  • Java 版本

driver.findElementByAccessibilityId("Accessibility");

通过 XPath 定位

与 Selenium 类似,可以使用 XPath 的定位方式完成页面的元素定位。XPath 分为绝对路径定位与相对路径定位两种形式,下面介绍的都是相对定位的形式。

XPath:resource-id 属性定位

元素可以通过 resource-id 定位。

格式:

//*[@resource-id='resource-id属性']

示例代码:

  • Python 版本

driver.find_element(By.XPATH, \ '//*[@resource-id="rl_login_phone"]')

  • Java 版本

driver.findElement(By.xpath(\ "//*[@resource-id=\"rl_login_phone\"]"));

XPath:text 属性定位

元素可以通过 text 文本属性定位。

格式:

//*[@text=’text文本属性’]

示例代码如下

  • Python 版本

driver.find_element(By.XPATH,'//*[@text="我的"]')

  • Java 版本

driver.findElement(By.xpath("//*[@text=\"我的\"]"));

XPath:class 属性定位

元素可以通过 class 定位。

格式:

//*[@class=’class 属性’]

示例代码:

  • Python 版本

driver.find_element(By.XPATH,\ '//*[@class="android.widget.EditText"]')

  • Java 版本

driver.findElement(By.xpath(\ "//*[@class=\"android.widget.EditText\"]"));

XPath:content-desc 属性定位

元素可以通过 content-desc 定位。

格式:

//*[@content-desc='content-desc 属性']

示例代码:

  • Python 版本
driver.find_element((By.XPATH,\ '//*[@content-desc="搜索"]') 
  • Java 版本

driver.findElement(By.xpath(\ "//*[@content-desc=\"搜索\"]");

uiautomatorviewer介绍

使用 Android SDK(sdk/tools/uiautomatorviewer)路径下自带的 uiautomatorviewer 工具也可以抓取当前页面的元素。

提前配置 sdk/tools/ 路径到环境变量 $PATH 中,直接在命令行输入下面的命令:

uiautomatorviewer

可以打开下面这样一个页面,点击页面左上角第二个图标(Android 手机图标),就可以获取下面的 uiautomatorviewer 快照图:

uiautomatorviewer 抓取快照展示出来的元素属性是经过解析的,如果想要查看 XML DOM 的真实结构可以打印 pagesource ,得到的内容如下,红色框起来的部分为上图的定位的 XML DOM 中的一个节点:

通过图片分析,android.widget.TextView 是文本类型的节点,其中包含的属性信息都在上面的 uiautomatorviewer 快照图中有展示。如果只想定位 Android 系统的页面元素,可以直接使用 uiautomatorviewer,速度快并且不需要配置任何参数,直接点击获取页面的图标就可以将客户端页面抓取出来。

另外,uiautomatorviewer 只能抓取 android8 以下的版本,如果要抓取 android8 以上的版本的页面信息,可以使用 Appium Inspector 或 WEditor。

最后感谢每一个认真阅读我文章的人,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走:

这些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴上万个测试工程师们走过最艰难的路程,希望也能帮助到你! 

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

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

相关文章

物联网AI MicroPython学习之语法 uhashlib哈希算法

学物联网,来万物简单IoT物联网!! uhashlib 介绍 实现二进制数据散列算法,支持sha256,sha1,MD5。 接口介绍 sha256 - 创建一个SHA256哈希对象 参数原型:hash_obj uhashlib.sha256([bytes]) …

CMD命令行中如何切换路径。

问题描述: windows命令行中我记得切换命令是cd E:命令就行了呀。但是现在好像不行了。 问题解决:现在windows命令行中切换命令需要在cd E:之间增加一个/D。注意是/D,不是\D。 具体命令如下:CD /D E: 结果如下如所示&#xff1a…

企业级低代码平台需具备的关键能力解析

低代码是数字化转型浪潮下的产物,国内外已经生产出了很多成熟的产品。目的是让企业以更低的成本、更快的周期、更易操作的方式完成企业数字化布局,以实现内部的高效工作。 一、什么是“企业级”低代码? 首先,我们先回答什么是“…

Mysql数据库 10.SQL语言 储存过程 上

存储过程方法 存储过程介绍 SQL指令执行过程 1.编写SQL指令 2.通过网络传送SQL指令,编写SQL指令后通过数据库连接将指令传送到数据库 3.数据库接收SQL指令 4.当数据库接收到指令后,通过SQL引擎编译并执行SQL指令 5.返回到DBMS显示查询结果 存储过…

基于浣熊算法的无人机航迹规划-附代码

基于浣熊算法的无人机航迹规划 文章目录 基于浣熊算法的无人机航迹规划1.浣熊搜索算法2.无人机飞行环境建模3.无人机航迹规划建模4.实验结果4.1地图创建4.2 航迹规划 5.参考文献6.Matlab代码 摘要:本文主要介绍利用浣熊算法来优化无人机航迹规划。 1.浣熊搜索算法 …

关于卷积神经网络的多通道

多通道输入 当输入的数据包含多个通道时,我们需要构造一个与输入通道数相同通道数的卷积核,从而能够和输入数据做卷积运算。 假设输入的形状为n∗n,通道数为ci​,卷积核的形状为f∗f,此时,每一个输入通道都…

剑指offer全集系列Java版本(2)

目录 反转链表 替换空格 二叉树 链表的中间结点 附录 StringBuffer类中常用的方法 反转链表 反转链表_牛客题霸_牛客网 (nowcoder.com)https://www.nowcoder.com/practice/75e878df47f24fdc9dc3e400ec6058ca?tpId265&tqId39226&rp1&ru/exam/oj/ta&qru…

时序预测 | MATLAB实现基于LSSVM-Adaboost最小二乘支持向量机结合AdaBoost时间序列预测

时序预测 | MATLAB实现基于LSSVM-Adaboost最小二乘支持向量机结合AdaBoost时间序列预测 目录 时序预测 | MATLAB实现基于LSSVM-Adaboost最小二乘支持向量机结合AdaBoost时间序列预测预测效果基本介绍模型描述程序设计参考资料 预测效果 基本介绍 1.MATLAB实现基于LSSVM-Adaboos…

Spring Cloud学习(一)【SpringCloud介绍/服务远程调用】

文章目录 单体架构分布式架构微服务微服务技术对比Spring Cloud 介绍服务拆分及远程调用 单体架构 单体架构: 将业务的所有功能集中在一个项目中开发,打成一个包部署。 优点: 架构简单部署成本低 缺点: 耦合度高 分布式架构 …

小程序day04

目标 自定义组件 创建组件 引用组件 局部引用 全局引用 组件的函数定义到metods节点中,梦回vue2. 样式 数据,方法,属性 下划线开头的称为自定义方法,非下划线开头的都是事件处理函数。 神特么,this.datathis.pro…

【计算系统】分布式训练:DDP单机多卡并行实战

分布式训练:DDP单机多卡并行 1. 分布式训练总览1.1 并行方式1.2 PyTorch中数据并行方法1.3 训练原理1. DataParallel(DP)训练原理2. DistributedDataParallel(DDP)多卡训练的原理 2. PyTorch分布式代码实战2.1 不使用DDP和混合精度加速的代码2.2 使用DDP对代码改造后…

2021年06月 Python(四级)真题解析#中国电子学会#全国青少年软件编程等级考试

Python等级考试(1~6级)全部真题・点这里 一、单选题(共25题,每题2分,共50分) 第1题 对自然数1至n求和,如果将递推式f(n)f(n-1)n(n>1)转化成递归函数,则递归出口是? …

自动出价下机制设计系列 (二) : 面向私有约束的激励兼容机制设计

本文作者:真柏、妙临 欢迎关注:阿里妈妈技术公众号>> 导读:这篇是阿里妈妈在自动出价下机制设计系列的第二篇工作(🔗 第一篇:面向异质目标函数广告主的拍卖机制设计)。在自动出价中&…

猫罐头哪家好?5款良心性价比的猫罐头推荐!

在我们日常的宠物喂养中,猫罐头已经成为了许多猫奴们的必备利器。但面对五花八门的猫罐头品牌,如何为你的猫咪挑选一个既合适又满意的猫罐头呢?作为一家宠物店的老江湖,我已经在宠物行业摸爬滚打了七年,店里的猫儿队伍…

数据库的基础增删查改操作(二)

TOC 一.条件查询的练习题 – 查询英语不及格的同学及英语成绩 ( < 60 ) – 查询语文成绩好于英语成绩的同学 查询语文成绩高于60,英语成绩低于60 查询li开头的学生姓名 1.and与or 查询语文成绩大于80分&#xff0c;且英语成绩大于80分的同学 SELECT * FROM exam_result W…

Anaconda如何创建一个环境

activate env_name 激活环境&#xff0c;env_name&#xff1a;环境名 deactivate env_name 激活环境 conda list …

java八股文(mysql篇)

什么是关系型数据库&#xff1f; 其是建立在关系模型基础上的一种数据库&#xff0c;这种关系分为&#xff1a;一对一&#xff0c;一对多&#xff0c;多对多。 我们的数据存放在表中&#xff0c;在表中会有一至多个字段&#xff0c;一行就是一条数据。 mysql有哪些字段呢&…

pg安装pgagent插件以创建job

一 下载 官方下载地址Download 二 安装 2.1 安装cmake 执行cmake -version查看版本&#xff0c;如果能看到版本信息&#xff0c;就不用重复安装了。 cd /usr/local/ tar xvf cmake-3.16.5-Linux-x86_64.tar.gzcd cmake-3.16.5-Linux-x86_64/binvi /etc/profile 在最后新增…

哇,膜拜,师父竟然懂HARAKIRI的意思(附Linux常用命令)

哇&#xff0c;膜拜&#xff0c;师父竟然懂HARAKIRI的意思 我在看服务器日志的时候&#xff0c;发现有好几行开头都写着HARAKIRI 还以为是什么机制&#xff0c;就去问了问AI&#xff0c;结果它也不懂&#xff0c;百度也没查到 就去问师父&#xff0c;他一下就说出&#xff0c…

Kubernetes - pod详解

Pod基础概念&#xff1a; Pod是kubernetes中最小的资源管理组件&#xff0c;Pod也是最小化运行容器化应用的资源对象。一个Pod代表着集群中运行的一个进程。kubernetes中其他大多数组件都是围绕着Pod来进行支撑和扩展Pod功能的&#xff0c;例如&#xff0c;用于管理Pod运行的S…