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

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

客户端的页面通过 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。

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

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

相关文章:

  • C# TCP Server服务端多线程监听RFID读卡器客户端上传的读卡数据
  • 【第2章 Node.js基础】2.2 Node.js回调函数
  • MySQL中表格的自我复制,与复制表格
  • acwing算法基础之搜索与图论--树与图的遍历
  • [第二章—Spring MVC的高级技术] 2.2 置multipart解析器
  • 21 移动网络的前世今生
  • Sa-Token拦截全部接口必须登录-然后自定义注解来匿名登录-作为权限框架支持,并且同时使用了注解和路由的拦截器模式,此部分的配置如下:
  • 虚拟机复制后,无法ping通问题解决
  • Flutter——最详细(AppBar)使用教程
  • 【Linux精讲系列】——vim详解
  • 【Linux】:git基本操作_添加文件_两种场景_查看.git文件 || git修改文件 || 版本回退
  • arima模型python代码
  • 网际报文协议ICMP及ICMP重定向实例详解
  • 数据结构—字符串
  • APISpace IP归属地查询接口案例代码
  • 自己简单写的 事件订阅机制
  • 《Java编程思想》读书笔记-对象导论
  • Consul Config 使用Git做版本控制的实现
  • ES6, React, Redux, Webpack写的一个爬 GitHub 的网页
  • JAVA之继承和多态
  • LeetCode18.四数之和 JavaScript
  • Netty+SpringBoot+FastDFS+Html5实现聊天App(六)
  • Python学习笔记 字符串拼接
  • Sass 快速入门教程
  • vue:响应原理
  • 分享一个自己写的基于canvas的原生js图片爆炸插件
  • 工程优化暨babel升级小记
  • 机器学习学习笔记一
  • 开放才能进步!Angular和Wijmo一起走过的日子
  • 快速构建spring-cloud+sleuth+rabbit+ zipkin+es+kibana+grafana日志跟踪平台
  • 漫谈开发设计中的一些“原则”及“设计哲学”
  • 容器化应用: 在阿里云搭建多节点 Openshift 集群
  • 详解移动APP与web APP的区别
  • 阿里云ACE认证之理解CDN技术
  • 阿里云IoT边缘计算助力企业零改造实现远程运维 ...
  • # MySQL server 层和存储引擎层是怎么交互数据的?
  • # 执行时间 统计mysql_一文说尽 MySQL 优化原理
  • #define 用法
  • #if和#ifdef区别
  • #Java第九次作业--输入输出流和文件操作
  • #QT项目实战(天气预报)
  • (2)(2.4) TerraRanger Tower/Tower EVO(360度)
  • (33)STM32——485实验笔记
  • (NSDate) 时间 (time )比较
  • (顶刊)一个基于分类代理模型的超多目标优化算法
  • (附源码)springboot工单管理系统 毕业设计 964158
  • (附源码)计算机毕业设计ssm本地美食推荐平台
  • (九)信息融合方式简介
  • (提供数据集下载)基于大语言模型LangChain与ChatGLM3-6B本地知识库调优:数据集优化、参数调整、Prompt提示词优化实战
  • (转)scrum常见工具列表
  • (转)编辑寄语:因为爱心,所以美丽
  • .NET 4.0中使用内存映射文件实现进程通讯
  • .NET CORE 第一节 创建基本的 asp.net core
  • .net core 6 集成和使用 mongodb
  • .NET Core Web APi类库如何内嵌运行?