自学XPath的一些基础知识
1.XPath的节点
XPath有7中类型节点:元素,属性,文本,命名空间,处理指令,注释以及文档(根)节点
<?xml version="1.0" encoding="UTF-8"?>
<bookstore>(文档节点)
<book>
<title lang="en"(属性节点)(基本值:无子节点)>Harry Potter</title>
<author>J K. Rowling</author>(元素节点)(基本值:无子节点)
<year>2005</year>
<price>29.99</price>
</book>
</bookstore>
基本值:无父或无子的节点
节点关系:
父(每个元素和属性都有父)
子(元素节点可为0,1或多个)
同胞(拥有相同父节点)
先辈:某节点的父,父的父
后代:某节点的子,子的子
2.XPath的语法
<?xml version="1.0" encoding="UTF-8"?>
<bookstore>
<book>
<title lang="eng">Harry Potter</title>
<price>29.99</price>
</book>
<book>
<title lang="eng">Learning XML</title>
<price>39.95</price>
</book>
</bookstore>
选取节点
1)nodename 选取此节点的所有子节点
bookstore
2)/从根节点选取
/bookstore 选取根元素bookstore
bookstore/book选取属于bookstore的子元素的所有book元素
注释:路径起始于/说明是绝对路径,起始于//说明是相对路径
3)//从匹配选择的当前节点选择文档中的节点而不考虑它们的位置
//book选择所有book元素
bookstore//book 选取bookstore元素的后代的所有book元素,而不管它们位于bookstore之下的什么位置
4).选取当前节点
./bookstore 选取bookstore节点
5)..选取当前节点的父节点
../book 选取book节点的父节点bookstore
6)@ 选取属性
//@lang 选取名为 lang 的所有属性
谓语(Predicates)
1)//bookstore/book[1] 选取bookstore的第一个book元素
2)//bookstore/book[last()] 选取bookstore最后一个book元素
3)//bookstore/book[last(-1)] 选取bookstore倒数第二个book元素
4)//bookstore/book[position()<2] 选取bookstore元素的子元素中前两个book元素
5)//title[@lang] 选取所有拥有名为lang属性的title元素
6)//title[@lang='eng'] 选取所有拥有名为lang属性且属性值为eng的title元素
7)/bookstore/book[price>35.00] 选取bookstore元素下所有price>35的book元素
8)/bookstore/book[price>35.00]/title 选取bookstore元素下price>35的book子元素下的title元素
选取未知节点
1)*匹配任何元素节点
/bookstore/* 选取bookstore元素的所有子元素
//* 选取文档中的所有元素
2)@* 匹配任何属性节点
//title[@*] 选取所有带有属性的title元素
3) node() 匹配任何类型节点
选取若干路径
1)//book/title|//book/price 选取book元素的所有title元素和price元素
2)//title|//price 选取文档中所有的title元素和price元素
3)/bookstore/book/title|//price 选择属于bookstore元素的book元素的title元素和文档中所有的price元素
3.XPath的轴(Axes)
轴可以定义相对于当前节点的节点集
------------------------------------------------------------------------------------------------------------------
轴名称 结果
------------------------------------------------------------------------------------------------------------------
ancestor 选取当前节点的所有先辈(父、祖父等)。
ancestor-or-self 选取当前节点的所有先辈(父、祖父等)以及当前节点本身。
attribute 选取当前节点的所有属性。
child 选取当前节点的所有子元素。
descendant 选取当前节点的所有后代元素(子、孙等)。
descendant-or-self 选取当前节点的所有后代元素(子、孙等)以及当前节点本身。
following 选取文档中当前节点的结束标签之后的所有节点。
following-sibling 选取当前节点之后的所有兄弟节点
namespace 选取当前节点的所有命名空间节点。
parent 选取当前节点的父节点。
preceding 选取文档中当前节点的开始标签之前的所有节点。
preceding-sibling 选取当前节点之前的所有同级节点。
self 选取当前节点。
4.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
5.Xpath的优缺点
•缺点
1)性能差,因为使用这种方式进行定位,webdriver会将整个页面的所有元素进行扫描来找到我们所需的元素,所以当脚本中大量使用XPath方式定位,会大大降低脚本的执行速度。
2)Xpath会随着页面的布局的改变而改变,几乎不能维护
•优点
1)可以做布尔逻辑判断,例如//*[@id="kw" and @name="wd"]
2)可以进行模糊定位,contains(),start-with(),ends-with()等