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

相关推荐