技术分享 | app自动化测试(Android)--高级定位技巧

本文节选自霍格沃兹测试开发学社内部教材
通常使用定位器定位页面上的元素会发生一些定位不到元素 , 或者定位失败的情况 。 有可能是页面上元素不唯一 , 有可能是页面发生变化 。 这节介绍定位元素的高级用法 , 使用层级关系定位或者多重属性定位的方式来确定元素的唯一性 , 从而更精准 , 更稳定的定位到想要的元素 。
XPath高级定位技巧
XPath简介
XPath的英文全称为:XMLPathLanguage , 意旨对XML中的元素进行路径定位的一种语言 , 它可适用XML标记语言 , Html标记语言 , appDom结构 。 XPath是自动化工具的定位基础 , 可适用于Selenium工具 , Appium工具 , Appcrawler工具 。 由于前面章节已经对XPath进行说明 , 本篇只做举例说明 。
XPath基本语法
下面是XPath的常用方法:
技术分享 | app自动化测试(Android)--高级定位技巧
文章图片
技术分享 | app自动化测试(Android)--高级定位技巧
文章图片
"/"还可表示子元素"//"还可表示子孙元素
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等属性 。