XPath定位手册

一、XPath核心定位方法

1.基础路径定位

(1)绝对路径定位

从根节点开始的完整路径,以/开头:

/html/body/div/form/input[@name='password']

(2)相对路径定位

//开头,从当前节点开始搜索:

//input[@name='password']

2.位置索引定位

通过在 [] 中填写规则进行定位:

//ol/li[3]           (第三个li元素)
//table/tr[last()] (最后一行)
//tr[position()<4] (前三行)

3. 属性定位法

通过元素属性值精准匹配,@+属性名=xx值:

//a[@href='https://example.com']
//img[@alt='logo']
//div[@class='header active']

4. 逻辑运算定位

通过逻辑运算匹配出符合条件的元素:

//div[@class='error' or @id='alert']
//input[@type='checkbox' and not(@disabled)]

5. 文本内容定位

(1)精确匹配

通过 text()= 进行精准匹配:

//p[text()='欢迎光临']

(2)模糊匹配

通过 contains()starts-with()ends-with() 进行模糊匹配:

//a[contains(@href, 'logout')]
//h1[starts-with(@class, 'heading-')]

6. 层级关系定位

(1)父子关系

//div[@id='parent']/child::span

(2)祖先-后代关系

//form//input[@type='submit']  (form下的任意层级input)

(3)兄弟关系

//h2[@class='title']/following-sibling::p
//ul[@id='menu']/li[1]/preceding-sibling::li

二、XPath定位黄金原则

1. 稳定性优先原则

  • 避免绝对路径:优先使用相对路径
  • 慎用位置索引:优先通过属性/文本定位
  • 规避动态属性:如style、onclick等易变属性

2. 性能优化原则

  • 缩短路径长度:避免全文档扫描//*
  • 优先ID/Class:浏览器对标准属性优化更好
  • 减少函数调用:contains()比正则更高效

3. 容错设计原则

  • 多方案备份:准备2-3种定位方式
# Python示例:备选定位策略
try:
element = driver.find_element(By.XPATH, "//a[@id='primary']")
except:
element = driver.find_element(By.XPATH, "//nav//a[text()='首页']")
  • 模糊匹配:对动态ID采用部分匹配
//div[starts-with(@id, 'temp-')]

4. 跨浏览器兼容原则

  • 避免XPath 2.0+特性:如if-then-else
  • 慎用轴定位:如following-axis在某些浏览器支持差
  • 优先CSS选择器:对简单定位可混合使用

附录:函数汇总

1. 字符串处理函数

函数 作用 示例
contains() 检查字符串是否包含子串 //div[contains(@id, 'temp-')]
starts-with() 检查字符串是否以子串开头 //input[starts-with(@name, 'user-')]
ends-with() 检查字符串是否以子串结尾(XPath 2.0+) //a[ends-with(@href, '.pdf')]
normalize-space() 去除首尾空格并合并中间空格 //p[normalize-space(text())='Hello']
substring() 截取字符串 //div[@id=substring('abc-123', 5)]
translate() 字符替换 //input[@value=translate('HELLO', 'HEL', 'hel')]

2. 逻辑运算函数

函数 作用 示例 含义
not() 逻辑非 //input[not(@disabled)] 选择所有没有 `disabled` 属性的 `input` 元素
boolean() 转换为布尔值 //div[boolean(@data-valid)] 选择所有具有 `data-valid` 属性的 `div` 元素
and 逻辑与 input[@type='text' and @value='email'] 选择所有 `type` 属性等于 `text` 且 `value` 属性等于 `email` 的 `input` 元素
or 逻辑或 input[@type='text' or @type='email'] 选择所有 `type` 属性等于 `text` 或 `type` 属性等于 `email` 的 `input` 元素

3. 数值计算函数

函数 作用 示例
count() 统计节点数 //table[count(tr) > 5]
sum() 求和(XPath 2.0+) sum(//price)

4. 轴函数

函数 方向 作用 示例
child:: 向下 所有子节点(默认轴,可省略) child::p 或 p
parent:: 向上 直接父节点 //h2/parent::div
ancestor:: 向上 所有祖先节点(父节点、祖父节点等) //td/ancestor::table
descendant:: 向下 所有后代节点(子节点、孙节点等) //td/descendant::span
following:: 文档顺序向后 当前节点之后的所有节点(不包括后代) //h2/following::p[1]
following-sibling:: 向后 当前节点之后的同级兄弟节点(同一父节点下) //h2/following-sibling::li
preceding:: 文档顺序向前 当前节点之前的所有节点(不包括祖先) //li[last()]/preceding::li
preceding-sibling:: 向前 当前节点之前的同级兄弟节点(同一父节点下) //li[last()]/preceding-sibling::a

XPath定位手册的更多相关文章

  1. appium -- Xpath定位元素

    如文章<Appium基于安卓的各种FindElement的控件定位方法实践>所述,Appium拥有众多获取控件的方法.其中一种就是根据控件所在页面的XPATH来定位控件. 本文就是尝试通过 ...

  2. java selenium (六) XPath 定位

    xpath 的定位方法, 非常强大.  使用这种方法几乎可以定位到页面上的任意元素. 阅读目录 什么是xpath xpath 是XML Path的简称, 由于HTML文档本身就是一个标准的XML页面, ...

  3. 常用的CSS定位,XPath定位和JPath定位

    CSS定位 举例 描述 div#menu id为menu的div元素 div.action-btn.ok-btn class为action-btn和ok-btn的div元素 table#emailLi ...

  4. selenium之xpath定位和input文本

    selenium之xpath定位和input文本 xpath简单定位: 打开浏览器的F12 在自己需要定位的元素的那里右键 选择copy->xpath selenium获取input下的文本: ...

  5. 5.5.8 XPath定位

    1.什么是XPath XPath定位方式是自动化测试定位技术中的必杀技,几乎可以解决所有的定位难题.它是XML Path语言的缩写,主要用于在XML 文档中选择文档中的节点.基于XML树状文档结构,X ...

  6. selenium+python自动化之xpath定位

    在上一篇简单的介绍了用工具查看目标元素的xpath地址,工具查看比较死板,不够灵活,有时候直接复制粘贴会定位不到.这个时候就需要自己手动的去写xpath了,这一篇详细讲解xpath的一些语法. 什么是 ...

  7. Xpath定位大全

    selenium使用Xpath定位之完整篇   其中有一片文章提到了xpath元素定位,但是该文章中有些并不能适应一些特殊与个性化的场景.在文本中提供xpath元素的定位终极篇,你一定能在这里找到你需 ...

  8. appium的xpath定位

    做自动化,元素定位是我们遇到的第一个困难.总是会有各种各样的问题,导致我们定位不到元素.前面一篇博客也写了元素定位的几种方法,今天主要分享一下xpath的定位方法. 这里我们仍然拿计算器举例. 比如我 ...

  9. Selenium-Python学习——通过XPath定位元素

    用Xpath定位元素的方法总是记不住,经常要翻出各种文档链接参考,干脆把需要用到的内容整到这个笔记中方便查找. Xpath是在XML文档中定位节点的语言.使用 XPath 的主要原因之一是当想要查找的 ...

  10. Robot Framework与Web界面自动化测试学习笔记:利用xpath定位元素

    在rf中,利用selinum2的关键字进行用例编写时,很多关键字的参数是html元素的定位标识. 最简单的方式,是通过id 或name来描述元素定位信息,如 click  button    id=l ...

随机推荐

  1. 使用DVC管理大文件变更历史(基于git)

    DVC(Data Version Control) 是一个专门用于管理数据和二进制文件版本控制 的工具,它特别适合那些需要处理大量非文本文件(如图像.视频.模型.数据集等)的项目. 一般地,如果项目中 ...

  2. 痞子衡嵌入式:不处理i.MXRT1064片内Flash的RESET#引脚可能会导致无法启动或程序跑飞

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是i.MXRT1064片内Flash的RESET#引脚对程序启动和运行的影响. 上一篇文章 <i.MXRT1024/1064片内4M ...

  3. JS高级用法:像大神一样玩转JavaScript

    @charset "UTF-8"; .markdown-body { line-height: 1.75; font-weight: 400; font-size: 15px; o ...

  4. springBoot 使用jpa数据保存数据报数组越界问题

    在User类中定义gender使用的是一个枚举(Male, Female),但是在实际生成的表中该属性是一个int, 于是在保存数据时出现了 java.lang.ArrayIndexOutOfBoun ...

  5. EDR(端点检测与响应)如何提升中小型企业(SMB)的网络安全

    1.什么是 EDR? (What is EDR?) Endpoint Detection and Response (EDR) is a cybersecurity solution... EDR t ...

  6. 【2020.11.30提高组模拟】柱形图(histogram) 题解翻译

    [2020.11.30提高组模拟]柱形图(histogram) 题解 题意简述 有\(n\)个长方体并排这样放着,每种颜色的长方体的宽度都为\(1\),高\(a_i\)长\(b_i\). 求在这些长方 ...

  7. elasticsearch RestHighLevelClient 关于document的常用操作 ---------- 删除篇

    es删除操作大致分为:基于id的单条删除.基于id的批量删除.自定义条件的删除 基于id的单条删除:DeleteRequest 基于id的批量删除:BulkRequest中通过多个DeleteRequ ...

  8. 为博客添加Live图

    为博客添加Live图 Apple提供了很生动的Live实况图,在实际展示的过程中非常生动形象,在撰写博客的过程中,我自己也尝试将博客中嵌入实况图片 其实Apple提供的iCloud网页版为我们提供了很 ...

  9. Go中的数组和切片

    本文参考: https://www.liwenzhou.com/posts/Go/05_array/ https://www.liwenzhou.com/posts/Go/06_slice/ Arra ...

  10. MATLAB 打开报错:错误使用eval,未定义与‘struct‘类型的输入参数相对应的函数‘workspacefunc‘(MAC OS情况下)

    MAC OS情况下遇到这个问题比win会麻烦一点点 第一步:在Matlab中打开文件夹 打开文件夹/Volumes/自己的安装位置/MATLAB_R2022b.app/toolbox/local 第二 ...