selenium UI自動化測試之xpath元素定位方法詳解


前言1

菜鳥教程中對於 xpath 的介紹是一門在 XML 文檔中查找信息的語言。

②xpath 可用來在 XML 文檔中對元素和屬性進行遍歷。

③xpath是 W3C XSLT 標准的主要元素,並且 XQuery 和 XPointer 同時被構建於 XPath 表達之上。

表達式 介紹 備注
/ 根節點 絕對路徑
// 當前節點的所有子節點 相對路徑
* 所有節點元素的  
@ 屬性名的前綴 @class   @id
*[1] [] 下標運算符  
[] [ ]謂詞表達式 //input[@id='kw']
Following-sibling 當前節點之后的同級  
preceding-sibling 當前節點之前的同級  
parent 當前節點的父級節點  

前言2

絕對定位:以/單斜杠開頭,從根節點,嚴格按照順序和位置來表達,父/子,不建議使用。

相對定位:已//雙斜杠開頭,不管元素的位置和順序,在html頁面當中,有沒有匹配表達式的元素。

①//標簽名[@屬性名稱=屬性值]

ele=driver.find_element_by_xpath(//input[@id='kw'])

舉例:如下,在element使用ctrl+f查找,輸入xpath定位。則可以找到對應的元素。

②邏輯運算 and or

//標簽名[@屬性名稱-屬性值 and @屬性名稱=屬性值]

//標簽名[@屬性名稱-屬性值 or @屬性名稱=屬性值]

ele=driver.find_element_by_xpath(//input[@id='kw' and name='wd' ])

③層級定位,元素本身的屬性不能唯一定位找到自己,借助其他比較相近的祖先節點來縮小查找范圍。

如果唯一定位無法找到,有多個值時,就采用層級定位。先找到某一個祖先的節點,再在祖先的子孫后代當中查找元素。

driver.find_element_by_xpath('//span[text()="小美"]/parent::div/following-sibling::div[@class="attend_date_state "]//img')

一、xpath基本定位用法

1、使用id定位 --  driver.find_element_by_xpath('//input[@id="kw"]') 

2、使用class定位 --  driver.find_element_by_xpath('//input[@class="s_ipt"]') 

二、xpath相對路徑/絕對路徑定位

1、相對定位 -- 以// 開頭 如: //form//input[@name="phone"] 

2、 絕對定位 -- 以/ 開頭,但是要從根目錄開始,比較繁瑣,一般不建議使用絕對定位,如: /html/body/div/a 

三、xpath文本、模糊、邏輯定位

1、【文本定位】使用text()元素的text內容 如: //button[text()="登錄"] 

2.、【模糊定位】使用contains()包含函數 如://button[contains(text(),"登錄")] 、//button[contains(@class,"btn")] 

3.、【模糊定位】使用 starts-with -- 匹配以xx開頭的屬性值; ends-with-- 匹配以xx結尾的屬性值;

  如: //button[starts-with(@class,"btn")] 、 //input[ends-with(@class,"-special")] 

4.、使用邏輯運算符 --  and 、 or (適用於元素具有多個屬性值);

  如:   //button[@class='ant-table-scroll' and @title='content'] 、 //button[@class='ant-table-scroll' or @id='pwd'] 

四、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
選取當前節點的所有屬性

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

1、軸運算

①ancestor:祖先節點,包括父節點(通過某一具有唯一定位的元素獲取其所有的祖先節點,根據索引下標取父節點、爺爺節點、、、祖先節點(以此類推:索引下標值越大,越遠離該元素;索引下標值越小,越靠近該元素))

②parent:父節點(取最近的一個節點)

③preceding-sibling:當前元素節點標簽之前的所有兄弟節點(平級)

④preceding:當前元素節點標簽之前的所有節點

⑤following-sibling:當前元素節點標簽之后的所有兄弟節點(平級即同屬於同一個父節點的元素的兄弟節點)

⑥following:當前元素節點標簽之后的所有節點

使用語法:軸名稱 :: 節點名稱 

使用較多場景:頁面顯示為一個表格樣式的數據列

注意:

# 定位 找到元素 -- 做到唯一識別
# 優先使用id
# 舍棄:有下標的出現、有絕對定位的出現、id動態變化時舍棄

2、軸運算

 /.. :  定位當前相對定位元素的父級元素

/../.. :定位當前相對定位元素的爺爺級元素

/../../.. :i定位當前相對定位元素的父級的父級的父級元素

。。。。以此類推

實例:

五、xpath元素定位方式的模糊匹配問題

①用 contains 關鍵字,尋找頁面中style屬性值包含有sp.gif這個關鍵字的所有div元素,其中@后面可以跟該元素任意的屬性名。

driver.find_element_by_xpath('//div[contains(@style,"sp.gif")]').click()

②用 start-with 關鍵字,尋找style屬性以position開頭的div元素,其中@后面可以跟該元素任意的屬性名。

driver.find_element_by_xpath('//div[start-with(@style,"position")]').click()

③用 text 關鍵字,直接查找頁面當中所有的退出二字,經常用於純文字的查找。【*號表示不指定標簽名,在頁面中的所有元素對象范圍內查找】

driver.find_element_by_xpath('//*[text()="退出"]').click()

contains 關鍵字與 text 關鍵字結合使用;一般用於知道超鏈接上顯示的部分或全部文本信息。【包括部分文本或者全部文本內容為‘退出’的a標簽】

driver.find_element_by_xpath('//a[contains(text(), "退出")]').click()

六、xpath元素定位方式中使用邏輯運算符輔助定位元素

① xpath元素定位方式中可使用 andor 輔助定位元素

driver.find_element_by_xpath('//li[@class="ant-dropdown-menu-item" and @role="menuitem"]/a[contains(text(),"修改")]').click()

七、xpath元素定位方式中利用不等於、不包含等關系輔助定位元素

① @屬性值!=xxx;text()!=xxx 等,例如:

//div[@class='el-tab-pane' and @style!='display: none;']//button[[text()='確定']]

② not(contains(@屬性值, 'xxx'));not(contains(text(), 'xxx')) 等,例如:

//div[@class='el-tab-pane' and not(contains(@style,'none'))]//button[[text()='確定']]

③ not (@屬性值='xxx');not(text()='xxx') 等,例如:

//div[@class='el-tab-pane' and not(@style='display: none;')]//button[[text()='確定']]

④某標簽不包含xxx屬性, not(@屬性值) ,例如:

//div[not(@id)]  # 該div標簽不包含id屬性

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM