python 自动化之 XPATH 语法详解

本贴最后更新于 697 天前,其中的信息可能已经天翻地覆

前言

XPath即为XML路径语言(XML Path Language),它是一种用来确定XML文档中某部分位置的语言,同时也支持HTML。是做web自动化测试必须要掌握的一个技能,web自动化页面元素定位,大多数人都会选择使用Xpath。当然xpath除了可以在web自动化中进行元素定位。在接口自动化中,对于一些返回内容是XML或者HTML的接口,我们也可以使用xpath来定位页面元素的内容。

1、选取节点

XPath 使用路径表达式来选取 XML 文档中的节点或者节点集。这些路径表达式和我们在常规的电脑文件系统中看到的表达式非常相似。

下面列出了最常用的路径表达式:

表达式 描述
nodename 选取此节点的所有子节点。
/ 从根节点选取。
// 从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置。
. 选取当前节点。
.. 选取当前节点的父节点。
@ 选取属性。

在下面的表格中,我们已列出了一些路径表达式以及表达式的结果:

路径表达式 结果
div 选取 div元素的所有子节点。
/div 选取根元素 div。注释:假如路径起始于正斜杠( / ),则此路径始终代表到某元素的绝对路径!
div/a 选取属于div的子元素的所有 a 元素。
//div 选取所有 div子元素
div//p 选择属于 div 元素的后代的所有div元素,而不管它们位于 p 之下的什么位置。
//@lang 选取名为 lang 的所有属性。

2、谓语(条件过滤)

谓语用来查找某个特定的节点或者包含某个指定的值的节点,被嵌在方括号中。

在下面的表格中,我们列出了带有谓语的一些路径表达式,以及表达式的结果:

路径表达式 结果
/ul/li[1] 选取属于ul 子元素的第一个 li 元素。
/ul/li[last()] 选取属于ul子元素的最后一个 li 元素。
/ul/li[last()-1] 选取属于ul子元素的倒数第二个li 元素。
/ul/li[position()<3] 选取最前面的两个属于 ul 元素的子元素的li 元素。
//div[@attr] 选取所有拥有名为attr 的属性的 div 元素。
//div[@attr=’leng] 选取所有 div 元素,且这些元素拥有值为 leng 的 attr 属性。
/div/span[price>99.00] 选取div元素的所有 span 元素,且其中的 price 元素的值须大于 99.00。
/div/ul[price>99.00]/p 选取 div 元素中的ul元素的所有 p 元素,且其中的 price 元素的值须大于99.00。

3、选取未知节点

XPath 通配符可用来选取未知的 XML 元素。

通配符 描述
* 匹配任何元素节点。
@* 匹配任何属性节点。
node() 匹配任何类型的节点。

在下面的表格中,我们列出了一些路径表达式,以及这些表达式的结果:

路径表达式 结果
/div/* 选取 div 元素的所有子元素。
//* 选取文档中的所有元素。
html/node()/a/@* 选择html下面任意节点下的a节点的所有属性
//div[@*] 选取所有带有属性的 div 元素。

4、选取若干路径

通过在路径表达式中使用“|”运算符,您可以选取若干个路径。

#获取div下面的span元素或者pp元素
/div/span/ | /div/pp

5、模糊匹配

[contains(@属性,)]
#选取属性为attr,并且值为100的所有元素。
//li[contains(@attr,100)]

6、XPath 运算符

下面列出了可用在 XPath 表达式中的运算符:

运算符 描述 实例 返回值
| 计算两个节点集 //book| //cd 返回所有拥有 book 和 cd 元素的节点集
+ 加法 6 + 4 10
- 减法 6 - 4 2
* 乘法 6 * 4 24
div 除法 8 div 4 2
= 等于 price=9.80 如果 price 是 9.80,则返回 true。如果 price 是 9.90,则返回 false。
!= 不等于 price!=9.80 如果 price 是 9.90,则返回 true。如果 price 是 9.80,则返回 false。
< 小于 price<9.80 如果 price 是 9.00,则返回 true。如果 price 是 9.90,则返回 false。
<= 小于或等于 price<=9.80 如果 price 是 9.00,则返回 true。如果 price 是 9.90,则返回 false。
> 大于 price>9.80 如果 price 是 9.90,则返回 true。如果 price 是 9.80,则返回 false。
>= 大于或等于 price>=9.80 如果 price 是 9.90,则返回 true。如果 price 是 9.70,则返回 false。
or price=9.80 or price=9.70 如果 price 是 9.80,则返回 true。如果 price 是 9.50,则返回 false。
and price>9.00 and price<9.90 如果 price 是 9.80,则返回 true。如果 price 是 8.50,则返回 false。
mod 计算除法的余数 5 mod 2 1
回帖
请输入回帖内容 ...