1、什么是XPATH?
XPath 即XML 路径语言(XML Path Language),用于在 XML 文档中查找信息(在XML文档中对元素和属性进行遍历),也适用于HTML 文档。
2、选取节点
使用路径表达式:
表达式 | 描述 |
nodename(节点名称) | 选取此节点的所有子节点。 |
/ | 从根节点选取。 |
// | 从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置。 |
. | 选取当前节点。 |
.. | 选取当前节点的父节点。 |
@ | 选取属性。 |
查找某个特定的节点或者包含某个指定的值的节点:
路径表达式 | 结果 |
/bookstore/book[1] | 选取属于 bookstore 子元素的第一个 book 元 素。 |
/bookstore/book[last()] | 选取属于 bookstore 子元素的最后一个 book 元素。 |
/bookstore/book[last()-1] | 选取属于 bookstore 子元素的倒数第二个 book 元素。 |
/bookstore/book[position()<3] | 选取最前面的两个属于 bookstore 元素的子 元素的 book 元素。 |
//title[@lang] | 选取所有拥有名为 lang 的属性的 title 元素。 |
//title[@lang=’eng’] | 选取所有 title 元素,且这些元素拥有值为 eng 的 lang 属性。 |
/bookstore/book[price>35.00] | 选取 bookstore 元素的所有 book 元素,且其 中的 price 元素的值须大于 35.00。 |
/bookstore/book[price>35.00]/title | 选取 bookstore 元素中的 book 元素的所有 title 元素,且其中的 price 元素的值须大于 35.00。 |
选取未知节点:(使用通配符)
通配符 | 描述 |
* | 匹配任何元素节点。 |
@* | 匹配任何属性节点。 |
node() | 匹配任何类型的节点。 |
3、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 |
4、节点之间的关系
1. 父(Parent)
2.子(Children)
3.同胞(Sibling)
4.先辈(Ancestor) --- 包括父和父的父
5.后代(Descendant) --- 包括子和子的子
5、使用案例
(1)使用绝对路径:/html/body/div/form/input 绝对路径是 从网页起始标签开始一直到要定位的元素的路径,如果要定位的元素在页面最下面,则这个Xpath 路径会非常长。如果在要定位的元素与页面开始之间的元素有任何增减,元素定位就会失败。
(2)使用相对路径://input 相对路径一般只包含与被定位元素关系最近的几层元素,相对路径写的好的话,页面变动影响最小,而且定位准确。
(3)使用索引定位元素,索引的初始值为1://input[2] 如果一个页面中有多个相似的元素,或是一个层下面有多个同样的元素的时候,需要用索引的方法来定位,否则无法区分。
(4)结合属性值来定位元素://input[@id='username'] 属性定位也是比较常用的方法,如果元素中没有常见的id,name,class 等直接有方法可调用的属性,也可以查找元素中是否有其他能唯一标识元素的属性,如果有,就可以用此方法定位。
(5)使用多个属性定位元素://input[@id='username' and @name='userID'] 多个属性联合定位,更能准确定位到元素。(注意:匹配多个属性:用and连接; 匹配属 性的多个值:contains(..., ...))。
(6)使用属性名来定位元素://input[@button] 此方法可以区分同一种标签,含有不同 属性名的元素。定位相对简单一些儿,但也同样存在着无法区分同种标签含有同种 属性名的多个元素,这个时候要配合索引定位才行。
(7)使用部分属性值匹配元素,用starts-with(),ends-with(),contains(): //input[stars-with(@id,'user')]; //input[ends-with(@id,'name')]; //input[contains(@id,"ernam")] 此方法更加灵活,可以定位属性值不太规律,或 是部分变动,中间有空格的情况。
(8)使用任意属性值匹配元素://input[@*='username'] 此方法相当于模糊查询,只要 欲定位的标签,如input中任何属性值等于‘username’,就能匹配成功。缺点是可能会匹配含有这个属性值的其他元素,所以我们在定位的时候要查看一下这个元素值 在页面中是否唯一。
(9)使用文本匹配元素://input[contains(text(),'text')] 注:获取元素的内容用text()。
6、总结
用Xpath 定位时,先看这个元素是否有明显的,唯一的属性值。如果有, 我们就用相对路径加属性值定位,这是最简单准确的定位方法。如果要定位的元素 不符合这个特征,例如:元素属性是动态的,无法区分这个元素,属性值中间有空 格,等等。那么应该从此元素的上一层开始查找。当遇到了一个符合条件的元素时, 对其写Xpath。然后从这个元素开始,一级级往下写,直到要定位的元素为止。