selenium之xpath
xpath的语法(转载自:http://www.cnblogs.com/jianjialin/archive/2009/02/01/1382056.html),在原文基础上稍做修改。
XPath是XML的查询语言,和SQL的角色很类似。以下面HTML为例,介绍XPath的语法。
<html> <head> </head> <body> <div class="div1" style="height: 40px; width: 1440px;" region="north"> <div class="div11"> <div class="div111"> <div id="div1111"> <p>this is the first p</p> </div> </div> <div class="div112" style="border: none;"> <p>this is the second p</p> </div> </div> </div> <div class="div2"> <div class="div21" style="border: none;"> <div class="div211" style="border: none;"> <p>this is the third p</p> </div> </div> </div> <div class="div3"> <p>this is the fourth p</p> <div class="div31" style="border: none;"> </div> </div> </body> </html>
定位节点
XML是树状结构,类似档案系统内数据夹的结构,XPath也类似档案系统的路径命名方式。不过XPath是一种模式(Pattern),可以选出XML档案中,路径符合某个模式的所有节点出来。例如要选catalog底下的cd中所有price元素可以用:
html/body/div
如果XPath的开头是一个斜线(/)代表这是绝对路径。如果开头是两个斜线(//)表示文件中所有符合模式的元素都会被选出来,即使是处于树中不同的层级也会被选出来。以下的语法会选出文件中所有叫做div的元素(在树中的任何层级都会被选出来):
//div
看到这里时我还是不太清楚/和//的区别,测试如下:
/html/body/div/div/div:可以找到三个div,分别是class为div111、div112、div211的div
//div/div/div:可以找到四个div,分别是class为div111、div1111、div112、div211的div
由此可知,通过/查找时只会找到绝对匹配的元素,通过//查找时可以找到符合条件的元素及其子元素
选择未知的元素
使用星号(Wildcards,*)可以选择未知的元素。
/html/body/*:选择/html/body/下的所有子元素
/html/body/*/p:选择/html/body/下任何一个节点的p节点
//div/*/p:选择父节点类型为任意元素,父父节点为div的所有p节点
/*/*/price:选择有两层父节点,叫做price的所有元素
//*:选择文件中的所有元素
要注意的是,想要存取不分层级的元素,XPath语法必须以两个斜线开头(//),想要存取未知元素才用星号(*),星号只能代表未知名称的元素,不能代表未知层级的元素。
选择分支
使用中括号可以选择分支。
/html/body/div[1]:选择body下的子元素中第一个div元素。XPath的定义中没有第0元素这种东西。
/html/body/cd[last()]:选择body下的最后一个div元素(XPath并没有定义first()这种函式喔,用上例的[1]就可以取出第一个元素)。
/html/body/div[p]:选出body下含有p子元素的所有第一次div元素。
//div[p='thisisthefirstp']:选出div中包含p子节点且p元素的值为thisisthefirstp的所有div元素
//div[p='thisisthefirstp']/p:选出p的值为thisisthefirstp的所有div下的p元素
选择一个以上的路径
使用Or操作数(|)就可以选择一个以上的路径。例如:
/html/body/div/div|/html/body/div/p:选择body下的div下的所有div及p元素
选择属性
在XPath中,除了选择元素以外,也可以选择属性。属性都是以@开头。
//p[@class]:选择所有具有class属性的p元素
//p[@*]:选择含有属性的所有cd元素
//div[@class='UK']:选择country属性值为UK的div元素
//p[@class='UK'][@name='hyddd']:选择class属性值为UK,name属性值为hyddd的p元素
一篇更详细的讲解xpath的文章:
http://www.cnblogs.com/gaojun/archive/2012/08/11/2633908.html