技术分享 | 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");

转发自:https://developer.aliyun.com/article/953406?accounttraceid=9538e112b31148c8aaa6d6eb75910d28nhou

相关文章
|
测试技术 UED Python
App自动化测试:高级控件交互技巧
Appium 的 Actions 类支持在移动应用自动化测试中模拟用户手势,如滑动、长按等,增强交互性测试。ActionChains 是 Selenium 的概念,用于网页交互,而 Actions 专注于移动端。在Python中,通过ActionChains和W3C Actions可以定义手势路径,例如在手势解锁场景中,先点击设置,然后定义触点移动路径执行滑动解锁,最后验证解锁后的元素状态。此功能对于确保应用在复杂交互下的稳定性至关重要。
|
Java 测试技术 持续交付
【入门思路】基于Python+Unittest+Appium+Excel+BeautifulReport的App/移动端UI自动化测试框架搭建思路
本文重点讲解如何搭建App自动化测试框架的思路,而非完整源码。主要内容包括实现目的、框架设计、环境依赖和框架的主要组成部分。适用于初学者,旨在帮助其快速掌握App自动化测试的基本技能。文中详细介绍了从需求分析到技术栈选择,再到具体模块的封装与实现,包括登录、截图、日志、测试报告和邮件服务等。同时提供了运行效果的展示,便于理解和实践。
1322 4
【入门思路】基于Python+Unittest+Appium+Excel+BeautifulReport的App/移动端UI自动化测试框架搭建思路
基于LangChain手工测试用例转App自动化测试生成工具
在传统App自动化测试中,测试工程师需手动将功能测试用例转化为自动化用例。市面上多数产品通过录制操作生成测试用例,但可维护性差。本文探讨了利用大模型直接生成自动化测试用例的可能性,介绍了如何使用LangChain将功能测试用例转换为App自动化测试用例,大幅节省人力与资源。通过封装App底层工具并与大模型结合,记录执行步骤并生成自动化测试代码,最终实现高效自动化的测试流程。
|
机器学习/深度学习 人工智能 测试技术
探索自动化测试的边界:从基础到高级应用
随着软件行业的快速发展,自动化测试已成为确保软件质量和效率的关键工具。本文将深入探讨自动化测试的不同层次,从基本的单元测试到复杂的模拟用户交互的端到端测试。文章将通过具体案例分析,展示如何有效实施自动化测试策略,以及在面对复杂应用场景时如何优化测试流程。此外,我们还将讨论自动化测试的未来趋势,包括人工智能在测试中的应用潜力。通过本文,读者将获得关于自动化测试深度与广度的全面理解,并学会如何在实际工作中灵活运用这些知识以提高软件测试的效率和效果。
|
搜索推荐
App Inventor 2 列表排序,函数式编程轻松实现高级排序算法
本文探讨了列表的函数式编程高级用法,允许根据自定义逻辑进行排序。不仅支持基本数据类型(文本和数字)的升序和降序排序,还能处理复杂结构类型中特定元素的排序。通过示例展示了如何定义比较函数来实现升序和降序,简化了排序操作。
298 0
|
JavaScript Java 测试技术
《手把手教你》系列技巧篇(四十六)-java+ selenium自动化测试-web页面定位toast-下篇(详解教程)
【5月更文挑战第10天】本文介绍了使用Java和Selenium进行Web自动化测试的实践,以安居客网站为例。最后,提到了在浏览器开发者工具中调试和观察页面元素的方法。
256 2
|
测试技术 Python Windows
【如何学习Python自动化测试】—— 多层窗口定位
【如何学习Python自动化测试】—— 多层窗口定位
304 1
|
前端开发 JavaScript 测试技术
自动化测试定位方式那么多,应该选哪个?
本文介绍了移动应用自动化测试中的定位策略,包括 ID、XPath、ClassName、AccessibilityID、Name、XPath 模糊定位、Android UI Automator、iOS Predicate 等。在Web测试中,使用class name、css selector、id等定位元素。选择定位器应遵循与研发约定、优先使用特定属性及组合定位的原则。当元素定位不到时,可能因定位信息错误、元素状态等问题,可通过调整策略、等待元素加载或使用JS操作解决。特殊控件如弹框、下拉框等,需采用特定方法如JS注入或send_keys()处理。
|
Web App开发 JavaScript 测试技术
《手把手教你》系列技巧篇(四十五)-java+ selenium自动化测试-web页面定位toast-上篇(详解教程)
【5月更文挑战第9天】本文介绍了在Appium中处理App自动化测试中遇到的Toast元素定位的方法。Toast在Web UI测试中也常见,通常作为轻量级反馈短暂显示。文章提供了两种定位Toast元素的技巧.
342 0
|
测试技术 Python
App自动化测试中,如何更好地处理弹窗?
在App自动化测试中,处理弹窗异常是保证测试稳定性和可靠性的重要环节。当遇到广告弹窗、升级提示等不定时出现的UI元素时,可以采用黑名单处理方法,如上述Python代码示例,通过尝试点击黑名单中的元素来避免干扰。同时,利用异常处理装饰器可以增强函数功能,保持代码整洁,当异常发生时记录日志、截图并保存页面源代码,便于问题排查。这两种策略能有效提升测试的效率和质量。