1. 程式人生 > >python selenium xpath定位方式詳解

python selenium xpath定位方式詳解

xpath是一種在xm文件中定位的語言,詳細簡介,請自行參照百度百科,本文主要總結一下xpath的使用方法,個人看法,如有不足和錯誤,敬請指出。

注意:xpath的定位 同一級別的多個標籤 索引從1開始 而不是0

1. 絕對定位:

   此方法最為簡單,具體格式為

          xxx.find_element_by_xpath("絕對路徑")

    具體例子:

         xxx.find_element_by_xpath("/html/body/div[x]/form/input") x 代表第x個 div標籤,注意,索引從1開始而不是0

        此方法缺點顯而易見,當頁面元素位置發生改變時,都需要修改,因此,並不推薦使用。

2.相對路徑:

相對路徑,以‘//’開頭,具體格式為

 xxx.find_element_by_xpath("//標籤")

具體例子:

xxx.find_element_by_xpath("//input[x]") 定位第x個input標籤,[x]可以省略,預設為第一個

  相對路徑的長度和開始位置並不受限制,也可以採取以下方法

xxx.find_element_by_xpath("//div[x]/form[x]/input[x]"), [x]依然是可以省略的

 

("//*[@id='J_login_form']/dl/dt/input[@id='J_password']"

3.標籤屬性定位:

           3.1標籤屬性定位,相對比較簡單,也要求屬效能夠定位到唯一一個元素,如果存在多個相同條件的標籤,預設只是第一個,具體格式

      xxx.find_element_by_xpath("//標籤[@屬性==‘屬性值’]")

屬性判斷條件:最常見為id,name,class等等,目前屬性的類別沒有特殊限制,只要能夠唯一標識一個元素都是可以的

具體例子

       xxx.find_element_by_xpath("//a[@href='/industryMall/hall/industryIndex.ht']")
       xxx.find_element_by_xpath("//input[@value='確定']")
       xxx.find_element_by_xpath("//div[@class = 'submit']/input")

          當某個屬性不足以唯一區別某一個元素時,也可以採取多個條件組合的方式,具體例子

        xxx..find_element_by_xpath("//input[@type='name' and @name='kw1']")

 

       3.2 當標籤屬性很少,不足以唯一區別元素時,但是標籤中間中間存在唯一的文字值,也可以定位,其具體格式

       xxx.find_element_by_xpath("//標籤[contains(text(),'文字值')]") 

   

     具體例子:

 

        xxx.find_element_by_xpath("//iunpt[contains(text(),'型號:')]")  

       注意:儘量在html中複製此段文字,避免因為肉眼無法分辨的字元導致定位失敗

      

      3.3 其他的屬性值如果太長,也可以採取模糊方法定位,直接上示例

    

       xxx.find_element_by_xpath(“//a[contains(@href, ‘logout’)]”)

 

  3.4 XPath 關於網頁中的動態屬性的定位,例如,ASP.NET應用程式中動態生成id屬性值,可以有以下四種方法:

      a.starts-with      例子: input[starts-with(@id,'ctrl')]              解析:匹配以ctrl開始的屬性值

      b.ends-with        例子:input[ends-with(@id,'_userName')]     解析:匹配以userName結尾的屬性值

      c.contains()        例子:Input[contains(@id,'userName')]        解析:匹配含有userName屬性值

 

當然,如果上面的單一方法不能完成定位,也可以採取組合式定位 類似("//input[@id='kw1']//input[start-with(@id,'nice']/div[1]/form[3])

 

 

 

以上是普通的情況,存在可以定位的屬性,當某個元素的各個屬性及其組合都不足以定位時,我們可以利用其兄弟節點或者父節點等各種可以定位的元素進行定位,先看看xpath中支援的方法:

     1、child  選取當前節點的所有子元素

     2、parent  選取當前節點的父節點

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

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

     5、descendant-or-self選取當前節點的所有後代元素(子、孫等)以及當前節點本身

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

     7、preceding-sibling選取當前節點之前的所有同級節點

     8、following-sibling選取當前節點之後的所有同級節點

     9、preceding   選取文件中當前節點的開始標籤之前的所有節點

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

    11、self  選取當前節點

    12、attribute  選取當前節點的所有屬性

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

 

 

上圖例項,需要點選訂單號為17051915200001的發貨按鈕,這時候不能直接定位到發貨按鈕,而是先要定位到訂單號元素,再定位他的兄弟節點。參照上圖,我們首先定位到td標籤中包含訂單號的td元素,然後選擇其之後的同級節點,following-sibling,我們要找的元素在後面的第8個td標籤下,因此定位可以寫名為下面的格式

Xxx.find_element_by_xpath("//td[contains(text(),’17051915200001’)]/following-sibling::td[8]/a[@class='link']")

 

preceding-sibling 情況類似,但是所有元素的排列順序是相反的(和following-sibling相反),如圖:

 

.. 表示當前節點的父節點

following-sibling::div[1] 表示當前節點的兄弟節點中的 第 1 個 div標籤

 

其他方法的使用方式相同, 11-13目前沒有使用過,也沒有搜尋到實際使用的案例,如果有人知道,希望不吝賜教