Xpath高阶定位技巧,轻松玩转App测试元素定位!

简介: XPath是一种用于XML文档中节点定位的语言,支持逻辑运算符(and、or、not)、轴定位、谓词和内置函数。

image.png

简介

XPath 是一种用于在 XML 文档中定位和选择节点的语言。它可以通过使用路径表达式来指定节点的位置,并支持使用各种条件进行过滤和匹配。以下是一些常见的 XPath 高阶定位方法:

  1. 使用逻辑运算符,如 and、or、not,将多个条件组合起来进行定位。
  2. 使用轴定位,通过预定义的轴(如子节点、父节点、兄弟节点等)来获取相对于当前节点的其他节点集合。
  3. 使用谓词,查找特定节点或包含特定值的节点,谓词嵌入方括号中。
  4. 使用内置函数,执行一些复杂的操作,如字符串处理、数值计算等。

Xpath 高级定位技巧

包含-contains()

  • Xpath 表达式中的一个函数,contains 会匹配符合某属性中包含 xx 字符串的元素。例如//*[contains(@text,"hogwarts")]则会匹配text属性的属性值中包含hogwarts的元素
  • contains()函数的使用格式
//*[contains(@属性,"属性值")]
  • 特点
    • contains() 函数定位的元素很容易为 list
    • contains() 函数内的属性名需要用 @ 开始
  • 示例
  • 打开雪球 apk,在搜索框中输入阿里,界面如下:

image.png

  1. 打开并连接元素定位工具,示例使用的工具Appium Inspector,点击如下图所示的搜索图标。

image.png

  1. 定位策略选择XPATH,定位当前界面中text属性包含阿里的元素。
//*[contains(@text,"阿里")]

image.png

  1. 点击查找后,呈现共有 12 个元素符合text属性中包含阿里,同时也符合之前提到的定位的元素很容易有多个这一特点。

image.png

XPath 轴

XPath 轴是 XPath 语言中的一个重要概念,它可以根据节点之间的关系来选择节点。XPath 轴定义了节点的一个集合,这个集合由满足特定条件的节点组成。

可以通过过定位一个节点,定位到当前的节点的兄弟节点、父节点、爷爷节点、祖先节点等等。

image.png

父子-当前节点的父节点
  • 定位到当前节点的父节点,格式如下:
//*[@text="阿里巴巴"]/..//*[@text="阿里巴巴"]/parent::*
  • 示例:定位 text 属性为阿里巴巴的元素的父节点

在这里插入图片描述

  1. 定位 text 属性为阿里巴巴的元素。
//*[@text="阿里巴巴"]

image.png

  1. 再定位父节点,两个表达式都可以。
//*[@text="阿里巴巴"]/..//*[@text="阿里巴巴"]/parent::*

image.png

父子节点

从当前节点定位到它的子节点,使用示例如下:

//*[@resource-id="com.xueqiu.android:id/stock_layout"]/child::*

定位的顺序为:

  1. 搜索阿里巴巴后,进入下面的页面,定位下图的元素。

image.png

  1. 使用 resource-id 定位当前节点
//*[@resource-id="com.xueqiu.android:id/stock_layout"]

image.png

  1. 再定位当前节点的子节点,定位到两个节点
//*[@resource-id="com.xueqiu.android:id/stock_layout"]/child::*
爷孙节点

从当前节点定位到父级节点的的父级节点,使用示例如下:

//*[@text="HK"]/../..
//*[@text="HK"]/parent::*/parent::*

定位顺序为:

  1. 定位当前元素的爷节点

image.png

  1. 爷节点的定位如图

image.png

  1. 先定位到当前节点,再寻找两层的父节点。
//*[@resource-id="com.xueqiu.android:id/stockName"]/../..

image.png

爷孙节点

从当前节点定位到子节点的子节点,使用示例为:

//*[@resource-id="com.xueqiu.android:id/stock_layout"]/child::*/child::*

定位顺序为:

  1. 定位当前节点的孙子节点

image.png

  1. 先定位到当前节点,在定位两层的儿子节点,即可定位到孙子节点。
//*[@resource-id="com.xueqiu.android:id/stock_layout"]

image.png

祖先节点 - ANCESTOR
  • 返回当前节点的所有祖先节点

示例表示是找到元素包含文本 HK 并且它的所有祖先元素中属性 class 为 android.widget.LinearLayout 和 android.widget.RelativeLayout 的节点,其中这两个属性值分别是常用的线性布局类和相对布局类,使用方式如下:

//*[@text="HK"]/ancestor::android.widget.LinearLayout//*[@text="HK"]/ancestor::android.widget.RelativeLayout
  • 显式指定要返回的祖先节点,使用方式为:
//*[@text="HK"]/ancestor::android.widget.RelativeLayout[1]

定位的顺序为:

  1. 定位当前节点线性布局的祖先节点
//*[@text="HK"]/ancestor::android.widget.LinearLayout

image.png

  1. 一共定位到了 9 个祖先

image.png

  1. 下一步定位这些祖先节点中距离当前节点最近的祖先节点,同时也是当前节点的父节点。

image.png

  1. 只需要在定位所有祖先的表达时候添加[1]即可。
//*[@text="HK"]/ancestor::android.widget.LinearLayout[1]

image.png

注意: 这里的[1]并不是数组下标的意思,可以理解为,从当前定位的元素向前数一代,也可以理解为向外一层。

兄弟姐妹节点

从当前节点定位到后面的兄弟姐妹节点

  • 定位当前节点后的所有兄弟节点
//*[@text="HK"]/following-sibling::*
  • 定位当前节点后的兄弟节点中的某一个节点,在定位所有兄弟节点后添加条件。
//*[@resource-id="com.xueqiu.android:id/stock_layout"]/following-sibling::*[@resource-id="com.xueqiu.android:id/price_layout"]

定位顺序为:

  1. 定当前节点后的所有兄弟节点

image.png

  1. 使用 XPath 定位,定位到的两个元素就是上图中的两个兄弟。
//*[@resource-id="com.xueqiu.android:id/stock_layout"]/following-sibling::*

image.png

  1. 当元素只有一个兄弟节点时,如果需要定位这些兄弟节点中的某一个,则需要再增加一个条件,在这些兄弟节点中定位到resour-idcom.xueqiu.android:id/price_layout的节点。
//*[@resource-id="com.xueqiu.android:id/stock_layout"]/following-sibling::*[@resource-id="com.xueqiu.android:id/price_layout"]

image.png

从当前节点定位到它前面的兄弟姐妹节点

  • 定位当前节点前的所有兄弟节点
//*[@text="BABA"]/preceding-sibling::*
  • 节点前有多个兄弟节点
//*[@resource-id="com.xueqiu.android:id/add_attention"]/preceding-sibling::*[@resource-id="com.xueqiu.android:id/price_layout"]
  • 示例
  • 定位当前节点后的所有兄弟节点

image.png

  1. 使用 Xpath 定位,表达式如下
//*[@resource-id="com.xueqiu.android:id/add_attention"]/preceding-sibling::*

image.png

  1. 如果定位到的元素为单个时,可直接使用,如果定位到的兄弟节点有多个,定位到某一个兄弟节点同样需要增加过滤条件。例如,需要定位到兄弟节点中,resource-id为com.xueqiu.android:id/stock_layout的元素。
//*[@resource-id="com.xueqiu.android:id/add_attention"]/preceding-sibling::*[@resource-id="com.xueqiu.android:id/stock_layout"]

image.png

XPath 运算符

AND

AND 表示可以在 XPath 表达式中同时具备 2 个条件,在 AND 两个条件都应该为真的情况下,即该元素既有 条件A 又有 条件B 。AND 定位取到的是交集。

  • 示例:定位如下图页面中的红框所框出来的元素。
  1. 使用 resource-id 进行定位时,会定位到多个元素

image.png

  1. 使用and运算符增加筛选条件进行过滤,需要满足符合 resource-id,且文本内容为阿里巴巴的元素。只有两个条件都符合时才会被选中
//*[@resource-id="com.xueqiu.android:id/stockName" and @text="阿里巴巴"]

image.png

OR

OR 表示可以在 XPath 表达式中放置 2 个条件,在 OR 的情况下,两个条件中的任何一个为真,就可定位到该元素。OR 定位获取的是并集。

  • 示例:定位当前页面中resource-id为com.xueqiu.android:id/stockName或文本内容text为加自选的元素,也就是下面 6 个元素:

image.png

//*[@resource-id="com.xueqiu.android:id/stock_layout" or @text="加自选"]
  • 定位结果如图所示:

image.png

总结

  • 包含
  • XPath 轴定位
  • XPath 运算符
相关文章
|
9天前
|
Java 测试技术 持续交付
【入门思路】基于Python+Unittest+Appium+Excel+BeautifulReport的App/移动端UI自动化测试框架搭建思路
本文重点讲解如何搭建App自动化测试框架的思路,而非完整源码。主要内容包括实现目的、框架设计、环境依赖和框架的主要组成部分。适用于初学者,旨在帮助其快速掌握App自动化测试的基本技能。文中详细介绍了从需求分析到技术栈选择,再到具体模块的封装与实现,包括登录、截图、日志、测试报告和邮件服务等。同时提供了运行效果的展示,便于理解和实践。
41 4
【入门思路】基于Python+Unittest+Appium+Excel+BeautifulReport的App/移动端UI自动化测试框架搭建思路
|
5月前
|
监控 测试技术 UED
软件测试中的性能瓶颈定位与优化策略
在软件开发的生命周期中,性能测试是确保产品质量的关键步骤之一。本文深入探讨了性能测试的重要性,并提出了一套系统的性能瓶颈定位与优化策略。通过分析现代软件系统中常见的性能问题,结合最新的研究成果和行业最佳实践,文章详细介绍了如何运用科学严谨的方法来识别和解决性能瓶颈。此外,本文还强调了逻辑严密的问题分析框架和数据驱动的决策过程对于提升软件性能的重要性。
|
2月前
|
Java 测试技术 Android开发
Android性能测试——发现和定位内存泄露和卡顿
本文详细介绍了Android应用性能测试中的内存泄漏与卡顿问题及其解决方案。首先,文章描述了使用MAT工具定位内存泄漏的具体步骤,并通过实例展示了如何分析Histogram图表和Dominator Tree。接着,针对卡顿问题,文章探讨了其产生原因,并提供了多种测试方法,包括GPU呈现模式分析、FPS Meter软件测试、绘制圆点计数法及Android Studio自带的GPU监控功能。最后,文章给出了排查卡顿问题的四个方向,帮助开发者优化应用性能。
167 4
Android性能测试——发现和定位内存泄露和卡顿
|
28天前
|
网络协议 Ubuntu 前端开发
好好的容器突然起不来,经定位是容器内无法访问外网了?测试又说没改网络配置,该如何定位网络问题
本文记录了一次解决前端应用集成到主应用后出现502错误的问题。通过与测试人员的沟通,最终发现是DNS配置问题导致的。文章详细描述了问题的背景、沟通过程、解决方案,并总结了相关知识点和经验教训,帮助读者学习如何分析和定位网络问题。
|
2月前
|
测试技术
基于LangChain手工测试用例转App自动化测试生成工具
在传统App自动化测试中,测试工程师需手动将功能测试用例转化为自动化用例。市面上多数产品通过录制操作生成测试用例,但可维护性差。本文探讨了利用大模型直接生成自动化测试用例的可能性,介绍了如何使用LangChain将功能测试用例转换为App自动化测试用例,大幅节省人力与资源。通过封装App底层工具并与大模型结合,记录执行步骤并生成自动化测试代码,最终实现高效自动化的测试流程。
|
2月前
|
缓存 监控 算法
软件测试中的性能瓶颈定位与优化策略
性能瓶颈,如同隐藏在系统深处的“拦路虎”,悄无声息地制约着软件的表现。本文将揭示如何通过一系列科学方法,识别并消除这些障碍,从而显著提升软件性能,确保用户享受到流畅无阻的数字体验。
|
3月前
【Azure App Service】同一个App Service下创建多个测试站点的方式
【Azure App Service】同一个App Service下创建多个测试站点的方式
|
3月前
|
网络协议 安全 前端开发
【应用服务 App Service】Azure 应用服务测试网络访问其他域名及请求超时限制(4分钟 ≈ 230秒)
【应用服务 App Service】Azure 应用服务测试网络访问其他域名及请求超时限制(4分钟 ≈ 230秒)
|
3月前
|
测试技术
一款功能完善的智能匹配1V1视频聊天App应该通过的测试CASE
文章列举了一系列针对1V1视频聊天App的测试用例,包括UI样式、权限请求、登录流程、匹配逻辑、消息处理、充值功能等多个方面的测试点,并标注了每个测试用例的执行状态,如通过(PASS)、失败(FAIL)或需要进一步处理(延期修改、待定、方案再定等)。
66 0
|
3月前
|
Linux C#
【Azure App Service】C#下制作的网站,所有网页本地测试运行无误,发布至Azure之后,包含CHART(图表)的网页打开报错,错误消息为 Runtime Error: Server Error in '/' Application
【Azure App Service】C#下制作的网站,所有网页本地测试运行无误,发布至Azure之后,包含CHART(图表)的网页打开报错,错误消息为 Runtime Error: Server Error in '/' Application