1. 程式人生 > >selenium使用xpath定位元素

selenium使用xpath定位元素

在學習XPath之前你應該對XML的節點,元素,屬性,原子值(文字),處理指令,註釋,根節點(文件節點),名稱空間以及對節點間的關係如:父(Parent),子(Children),兄弟(Sibling),先輩(Ancestor),後代(Descendant)等概念有所瞭解。這裡不在說明。

路徑表示式語法: 

  1. 路徑 = 相對路徑 | 絕對路徑
  2. XPath路徑表示式 = 步進表示式 | 相對路徑 "/"步進表示式。
  3. 步進表示式=軸 節點測試 謂詞

說明:

  1. 其中軸表示步進表示式選擇的節點和當前上下文節點間的樹狀關係(層次關係),節點測試指定步進表示式選擇的節點名稱副檔名,謂詞即相當於過濾表示式以進一步過濾細化節點集。
  2. 謂詞可以是0個或多個。多個多個謂詞用邏輯操作符andor連線。取邏輯非用not()函式。

請看一個典型的XPath查詢表示式:/messages/message//child::node()[@id=0],其中/messages/message是路徑(絕對路徑以"/"開始),child::是軸表示在子節點下選擇,node()是節點測試表示選擇所有的節點。[@id=0]是謂詞,表示選擇所有有屬性id並且值為0的節點。

相對路徑與絕對路徑:

如果"/"處在XPath表示式開頭則表示文件根元素,(表示式中間作為分隔符用以分割每一個步進表示式)如:/messages/message/subject是一種絕對路徑表示法,它表明是從文件根開始查詢節點。假設當前節點是在第一個

message節點【/messages/message[1]】,則路徑表示式subject(路徑前沒有"/")這種表示法稱為相對路徑,表明從當前節點開始查詢。具體請見下面所述的"表示式上下文"

1.通過相對路徑的屬性值查詢多個屬性值使用and進行連線。

 

2.通過text函式進行查詢,依舊可以和其他條件聯合使用。記住函式是使用的()結尾

3.使用contains 屬性值 text() 聯合進行定位主要contains的方法不帶等號

//a[contains(text(),'新聞') and contains(@href,'new') and @target='_blank' and text()='新聞']

4.根據索引值進行定位使用last()函式。也可以直接賦索引值,因為標籤個數有可能會變化,儘量使用函式進行加減

 

5使用xpath軸進行定位

軸名稱

結果

ancestor

選取當前節點的所有先輩(父、祖父等)

ancestor-or-self

選取當前節點的所有先輩(父、祖父等)以及當前節點本身

attribute

選取當前節點的所有屬性

child

選取當前節點的所有子元素。

descendant

選取當前節點的所有後代元素(子、孫等)。

descendant-or-self

選取當前節點的所有後代元素(子、孫等)以及當前節點本身。

following

選取文件中當前節點的結束標籤之後的所有節點。

namespace

選取當前節點的所有名稱空間節點

parent

選取當前節點的父節點。

preceding

直到所有這個節點的父輩節點,順序選擇每個父輩節點前的所有同級節點

preceding-sibling

選取當前節點之前的所有同級節點。

self

選取當前節點。

ancestor節點使用方法(descendant的使用方法也是如此):

1.使用當前節點定位,找尋先輩的標籤。

 

2.將祖輩是某個節點作為當前節點唯一祖輩

preceding-sibling(following-sibling用法一致)

找到同級節點標籤為input,屬性為name=ie 並且,想要查詢的節點的標籤是input,name屬性是tn

//input[preceding-sibling::input[@name='ie'] and @name='tn']

找到input標籤屬性name=ie的同級節點下input下屬性name為f

//input[@name='ie']/preceding-sibling::input[@name='f']

parent和child用法類似,代表當前節點的父節點和子節點

其實看過好多部落格,有人說xpath定位比較慢,用了這麼長時間,感覺速度還好啊,個人感覺慢是相對的,1ms和50ms對於肉眼來說可以忽略不計的。