技术分享 | app自动化测试(Android)--高级定位技巧
XPath高级定位技巧
XPath 简介
XPath 的英文全称为:XML Path Language,意旨对 XML 中的元素进行路径定位的一种语言,它可适用 XML 标记语言,Html 标记语言,app Dom 结构。XPath 是自动化工具的定位基础,可适用于 Selenium 工具,Appium 工具,Appcrawler 工具。由于前面章节已经对 XPath 进行说明,本篇只做举例说明。
XPath 基本语法
下面是 XPath 的常用方法:
XPath 模糊定位技巧
contains( )方法是模糊匹配的定位方法,对于一个元素的属性不固定,就可以模糊匹配。如://[contains(@content-desc, '帮助')],示例代码:
PYTHON 版本
driver.find_element(By.XPATH,
'//*[contains(@text, "注册")]')
driver.find_element(By.XPATH,
'//*[contains(@content-desc, "搜索")]')
driver.find_element(By.XPATH,
'//*[contains(@resource-id, "login_phone")]')
JAVA 版本
driver.findElement(By.xpath(
"//*[contains(@text, \"注册\")]"));
driver.findElement(By.xpath(
"//*[contains(@content-desc, \"搜索\")]"));
driver.findElement(By.xpath(
"//*[contains(@resource-id, \"login_phone\")]"));
XPath 组合定位技巧
通过 XPath 可以同时匹配 2 个甚至多个属性来完成元素定位。这里常用的属性有 text、resource-id、class、index、content-desc 等,这些属性任意组合完成定位,示例代码:
PYTHON 版本
driver.find_element(
By.XPATH,'//*[@text="我的" and @resource-id="tab_name"]'
).click()
driver.find_element(
By.XPATH,'//*[@text="注册/登录" and @index="1"]'
).click()
JAVA 版本
driver.findElement(By.xpath(
"//*[@text=\"我的\" and @resource-id=\"tab_name\"]")).click();
driver.findElement(By.xpath(
"//*[@text=\"注册/登录\" and @index=\"1\"]")).click();
XPath 层级定位
通常定位元素的时候可能会涉及到通过子元素去定位父元素,或者父元素定位子元素,或者定位兄弟元素,xpath 支持父子关系,兄弟关系元素的查找。示例代码如下:
PYTHON 版本
# 通过子元素定位父元素
# 方法一:..
driver.find_element_by_xpath(
'//*[@text="手机号"]/..').tag_name
# 方法二 parent::*
driver.find_element_by_xpath(
'[@text="手机号"]/parent::*').tag_name
#通过元素定位兄弟元素
driver.find_element_by_xpath(
'//*[@text="手机号"]/../li'
).tag_name
JAVA 版本
// 通过子元素定位父元素
// 方法一:..
driver.findElement(By.xpath(
"//*[@text=\"手机号\"]/..")).getTagName();
// 方法二 parent::*
driver.findElement(By.xpath(
"[@text=\"手机号\"]/parent::*")).getTagName();
// 通过元素定位兄弟元素
driver.findElement(By.xpath(
"//*[@text=\"手机号\"]/../li"
)).getTagName();
案例
场景一:
应用:雪球 apk
可以使用 uiautomatorviewer 工具进行 dom 分析,然后对分析到的元素进行 XPath 定位,比如下面的搜索框,可以使用元素的多种属性进行定位,常用的有 text,resource-id,class,content-desc 等属性。
推荐使用 resource-id 进行定位,通常情况下,它是页面唯一的属性,其 XPath 如下:
PYTHON 版本
driver.find_element(
By.XPATh, '//*[contains(@resource-id, "tv_search")]')
# 或者也可写成下面这样
driver.find_element(By.ID, 'tv_search')
JAVA 版本
driver.findElement(By.xpath("//*[contains(@resource-id,
\"tv_search\")]"));
// 或者也可写成下面这样
driver.findElement(By.id("tv_search"));
场景二:
如下图,获取 “BABA” 所对应的股票价格 “187.11”,可以使用 XPath 父子关系来进行元素定
代码如下:
PYTHON 版本
curr_price = self.driver.find_element(
MobileBy.XPATH,"//*[@text='BABA']/../../..\
//*[@resource-id='com.xueqiu.android:id/current_price']")
JAVA 版本
MobileElement curr_price = driver.findElement(
By.xpath("//*[@text=\"BABA\"]/../../..//\
*[@resource-id='com.xueqiu.android:id/current_price']"));
Android UiAutomator定位技巧
UiAutomator 是 Android SDK 自带的一个测试框架,这个测试框架提供了一系列的 API,可以与 Android APP 进行交互,例如打开菜单,点击,滑动等。当 Appium 的 Caps 参数 uiautomationName 设置为 UiAutomator2 时,就能够实现与手机端的 UiAutomator 进行通信并且使用 UiAutomator 执行测试代码。如果不进行设置,默认也是使用 UiAutomator2 工作引擎。UiAutomator1 是较老的工作引擎,如果想测试较老版本的 Android 系统(低于 Android4.4 版本)需要设置 uiautomationName="UiAutomator1"。
由于 Android UiAutomator 是 Android SDK 中自带的工作引擎,使用这种定位方式,速度上要比 Xpath 定位方式快很多。但由于写法比较特殊,调试起来要相对麻烦,如果定位语句编写不当,脚本编辑器也不会给出任何提示信息。只能在运行的时候校验对错。
下面就单独介绍基于 uiautomator 定位元素的方法,基本语法如下:
- Python 版本
driver.find_element_by_android_uiautomator()
- Java 版本
driver.findElement(MobileBy.AndroidUIAutomator());
常用的方法有:
UiSelector() # 实现元素定位
UiScrollable() # 实现滚动查找元素
通过 TEXT 文本定位
UiSelector( ) 与 XPath 类似,可以通过元素的 text 属性来定位元素。语法格式如下:
new UiSelector().text("text文本")
同样也能用模糊查询的用法去定位元素
例如: new UiSelector().textContains("手机") 示例代码:
- Python 版本
driver.find_element_by_android_uiautomator(
'new UiSelector().textContains("手机")').click()
- Java 版本
driver.findElementByAndroidUIAutomator(\
"new UiSelector().textContains(\"手机\")").click();
通过 RESOURCEID 定位
uiautomator 同样也能进行 id 定位,格式为 new UiSelector().resourceId("resource-id属性"),示例代码:
- Python 版本
driver.find_element_by_android_uiautomator(
'new UiSelector().resourceId("rl_login_phone")').click()
- Java 版本
driver.findElementByAndroidUIAutomator("new UiSelector().\
resourceId(\"rl_login_phone\")").click();
通过 CLASSNAME 定位
页面上的 class 属性一般不唯一,此时可以根据下标进行定位,格式为 new UiSelector().className("className"),一般会使用find_elements完成定位,示例代码:
- Python 版本
driver.find_elements_by_android_uiautomator(
'new UiSelector().\
className("android.widget.TextView")')[5].click()
- Java 版本
driver.findElementsByAndroidUIAutomator("new UiSelector().\
className(\"android.widget.TextView\")")[5].click();
通过 DESCRIPTION 定位
同样的,也支持 contenet-desc 定位方式,格式为:new UiSelector().description("contenet-des属性"),示例代码:
- Python 版本
driver.find_element_by_android_uiautomator(
'new UiSelector().description("搜索")').click()
- Java 版本
driver.findElementByAndroidUIAutomator("new \
UiSelector().description(\"搜索\")").click();
组合定位方式
Uiautomator 也支持组合元素查找功能,示例代码:
- Python 版本
driver.find_element_by_android_uiautomator(
'new UiSelector().resourceId(\
"com.xueqiu.android:id/tv_login_phone").text("手机号")').click()
- Java 版本
driver.findElementByAndroidUIAutomator("new UiSelector().resourceId(\
\"com.xueqiu.android:id/tv_login_phone\").text(\"手机号\")").click();
滚动查找元素
Uiautomator 使用 UiScrollable() 实现了滚动查找元素的功能,可以指定滑动到某个元素,示例代码:
- Python 版本
driver.find_element_by_android_uiautomator(
'new UiScrollable(new UiSelector().scrollable(true)\
.instance(0)).scrollIntoView(new UiSelector()\
.text("我的").instance(0));').click()
- Java 版本
driver.findElementByAndroidUIAutomator(\
"new UiScrollable(new UiSelector().scrollable(true)\
.instance(0)).scrollIntoView(new UiSelector().\
text(\"我的\").instance(0));").click();
上面的代码,在当前的页面滚动的查找 text 文本是“我的”这个元素,找到之后执行点击操作。
css selector元素定位
Appium Server 从 1.19.0 这个版本开始,元素定位增加了 css selector 的支持。appium-uiautomator2-driver 会将 css selector 定位器转化成 android uiautomator 定位方式。
注意:appium inspector 暂时没有添加这种定位方式。
由于 UiSelector() 的表达式是 Java 的语法格式,编写定位元素的表达式很复杂,代码编写工具(比如 Pycharm,VSCode,IntelliJ IDEA等)也不会有任何提示错误信息。只能是运行时才能发现表达式的错误。官方提供了 css selector 的语法,会自动转成 android uiautomator 的语法结构,这种原生的定位元素的方式,定位速度要更快一些。
详情参考官方:https://github.com/appium/appium-uiautomator2-driver/pull/410
源码地址:https://github.com/appium/appium-uiautomator2-driver/blob/master/lib/css-converter.js
id 定位
可以使用 css selector 语法定位。如下代码,#igk 表示 css selector 定位符
- Python 版本
driver.find_element_by_css_selector('#igk')
对应 ID 定位器代码如下:
driver.find_element_by_id('android:id/igk')
- Java 版本
driver.findElementByCssSelector("#igk").click();
对应 ID 定位器代码如下:
driver.findElementById("android:id/igk").click();
class name 定位
如下代码,表示 css selector 定位符为 .android.widget.ImageView 的元素
- Python 版本
driver.find_element_by_css_selector('.android.widget.ImageView')
对应 class name 定位器代码如下:
driver.find_element_by_class_name("android.widget.ImageView")
- Java 版本
driver.findElementByCssSelector(".android.widget.ImageView");
对应 class name 定位器代码如下:
driver.findElementByClassName("android.widget.ImageView");
text 定位
如下代码,表示 css selector 定位符为 *[text='工作台']" 的元素:
- Python 版本
driver.find_element_by_css_selector("*[text='工作台']")
对应 xpath 定位器代码如下:
driver.find_element_by_xpath("//*[@text='工作台']")
- Java 版本
driver.findElementByCssSelector("*[text=\"工作台\"]");
对应 xpath 定位器代码如下:
driver.findElementByXPath("//*[@text=\"工作台\"]");
description 定位
如下代码,表示 css selector 定位符为 *[description="ContentDescription"] 的元素:
- Python 版本
driver.find_element_by_css_selector('*[description="ContentDescription"]')
对应 accessibility id 定位器代码如下:
driver.find_element_by_accessibility_id("ContentDescription")
- Java 版本
driver.findElementByCssSelector("*[description=\"ContentDescription\"]");
对应 accessibility id 定位器代码如下:
driver.findElementByAccessibilityId("ContentDescription");
️ 你好呀,喜欢这篇文章的话烦请点个“赞”哦!万分感谢~(▽) PS:有问题可以联系我们哦~v ceshiren001
技术分享 | app自动化测试(Android)--高级定位技巧的更多相关文章
- 技术分享 | app自动化测试(Android)--App 控件定位
原文链接 客户端的页面通过 XML 来实现 UI 的布局,页面的 UI 布局作为一个树形结构,而树叶被定义为节点.这里的节点也就对应了要定位的元素,节点的上级节点,定义了元素的布局结构.在 XML 布 ...
- 技术分享 | app自动化测试(Android)--元素定位方式与隐式等待
原文链接 元素定位是 UI 自动化测试中最关键的一步,假如没有定位到元素,也就无法完成对页面的操作.那么在页面中如何定位到想要的元素,本小节讨论 Appium 元素定位方式. Appium的元素定位方 ...
- 技术分享 | app自动化测试(Android)--App 控件交互
原文链接 常用操作 点击操作 通常获取到元素之后,可以调用 click() 方法来实现对这个元素的点击操作.示例代码如下: python 版本 driver.find_element_by_id(&q ...
- 技术分享 | app测试中常用的Android模拟器
原文链接 Emulator Emualor 是 Android Studio 自带的模拟器,是官方提供的工具,Android 开发最常使用的就是这一款. 它功能非常齐全,电话本.通话等功能都可正常使用 ...
- 技术分享 | App常见bug解析
原文链接 功能Bug 内容显示错误 前端页面展示的内容有误. 这种错误的产生有两种可能 1.前端代码写的文案错误 2.接口返回值错误 功能错误 功能错误是在测试过程中最常见的类型之一,也就是产品的功能 ...
- 老李分享:android app自动化测试工具合集
老李分享:android app自动化测试工具合集 poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试,测试工具开发等工作为目标.如果对课程感兴趣,请大家咨 ...
- 爱奇艺技术分享:爱奇艺Android客户端启动速度优化实践总结
本文由爱奇艺技术团队原创分享,原题<爱奇艺Android客户端启动优化与分析>. 1.引言 互联网领域里有个八秒定律,如果网页打开时间超过8秒,便会有超过70%的用户放弃等待,对Andro ...
- 腾讯技术分享:Android版手机QQ的缓存监控与优化实践
本文内容整理自公众号腾讯Bugly,感谢原作者的分享. 1.问题背景 对于Android应用来说,内存向来是比较重要的性能指标.内存占用过高,会影响应用的流畅度,甚至引发OOM,非常影响用户体验.因此 ...
- Android Native App自动化测试实战讲解(上)(基于python)
1.Native App自动化测试及Appuim框架介绍 android平台提供了一个基于java语言的测试框架uiautomator,它一个测试的Java库,包含了创建UI测试的各种API和执行自动 ...
随机推荐
- Mxnet速查_CPU和GPU的mnist预测训练_模型导出_模型导入再预测_导出onnx并预测
需要做点什么 方便广大烟酒生研究生.人工智障炼丹师算法工程师快速使用mxnet,所以特写此文章,默认使用者已有基本的深度学习概念.数据集概念. 系统环境 python 3.7.4 mxnet 1.9. ...
- eclipse 执行main方法 错误: 找不到或无法加载主类
检查环境变量是否正确 JAVA_HOME JAVA的实际安装目录 CLASSPATH .;%JAVA_HOME%\lib;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\ ...
- Struts2-EL表达式为什么能获取值栈数据
1.EL表达式能获取域对象值 2.向域对象里面放值使用setAttribute方法,获取使用getAttribute方法 3.底层增强request对象里面的方法getAttribute方法 (1)首 ...
- Spring-Bean的依赖注入分析-01
###我们先通过一个例子弄明白为什么要使用依赖注入### 1.创建业务层UserService接口及UserServiceImpl实现类(接口代码省略) public class UserServic ...
- spatialite-tools 安装
spatialite-tools 安装 官网 https://www.gaia-gis.it/fossil/spatialite-tools/index 下载地址 https://www.gaia-g ...
- 前端CSS浮动、定位、溢出、z-index、透明度
一.浮动float 在 CSS 中,任何元素都可以浮动. 浮动元素会生成一个块级框,而不论它本身是何种元素. 关于浮动的两个特点: 浮动的框可以向左或向右移动,直到它的外边缘碰到包含框或另一个浮动框的 ...
- 推荐个我在用的免费翻译软件,支持多家翻译API整合
前段时间发了个关于<Spring支持PHP>的视频:点击查看 然后有小伙伴留言说:"你这个翻译好像很好用的样子". 的确,我自己也觉得很好用.之前视频没看过的不知道是哪 ...
- 论文解读(AutoSSL)《Automated Self-Supervised Learning for Graphs》
论文信息 论文标题:Automated Self-Supervised Learning for Graphs论文作者:Wei Jin, Xiaorui Liu, Xiangyu Zhao, Yao ...
- 09. 树莓派ASP.NET环境配置
在树莓派上部署ASP.NET环境(树莓派做ASP.NET项目服务器),之后Windows上开发的ASP.NET项目可以部署在树莓派上.配置过程如下: 前言:本篇文章内容是根据mono官网上查阅的配置教 ...
- zookeeper篇-zk的选举机制
点赞再看,养成习惯,微信搜索「小大白日志」关注这个搬砖人. 文章不定期同步公众号,还有各种一线大厂面试原题.我的学习系列笔记. 说说zk的选举机制 基础概念 zxid=事务id=一个时间戳,代表当前事 ...