一、Xpath元素定位表達式一般格式
1、基本寫法:
//標簽名[@屬性名=值]
2、疊加用法 支持邏輯運算and/or:
//標簽名稱[@屬性名='值' and @屬性名='值' and @屬性名='值']
//標簽名[@屬性名=值 or @屬性名=值]
3、標簽名通配符:
//*[@@屬性名=值] *為通配符,能夠匹配任何標簽名
二、Xpath元素定位實例
1、通過class屬性定位
1.1、直接使用class定位元素時,class值中間有空格時,只能提取其中的某一個值。
例如:上圖中class="dateItemWrap cursorp",中間有個空格,只能使用:
1 driver.find_element_by_class_name("dateItemWrap") 2 driver.find_element_by_class_name("cursorp")
1.2、通過Xpath進行元素定位時,class必須寫完整://div[@class='dateItemWrap cursorp']
2、使用Xpath的函數contains,可以模糊選取屬性或者文本中的部分包含字符。使用此方法時,class不必寫完整
2.1.1、以上面截圖的class屬性為例://div[contains(@class, ‘dateItemWrap’)]
2.1.2、元素:<input type="submit" value="百度一下" id="su" class="btn self-btn bg s_btn">
Xpath元素定位表達式://input[@id='su' and contains(@class,'bg')]
3、通過text文本定位
text文本在 web 自動化測試當中不是元素屬性,不能使用 @符號去表示。只能使用:text()='文本內容'
3.1、text文本定位案例://*[text()='查詢']
3.2、text文本在元素中往往會有空格等,這時用‘=’是不能定位到元素的,必須用Xpath的函數contains,如下圖:
此時只能使用contains函數://div[contains(text(), '微信支付測試')]
4、使用Xpath使用謂語定位
當一個Xpath定位表達式可以匹配多個元素時,使用謂語定位進行篩選。索引的優先級非常高,手工提升其他部分的優先級(加括號提升優先級),最后才使用索引。[此方法不常用,有很多弊端]
一般在tabal、ul、ol、<>元素中使用,查詢語句:(//a[contains(text(), '新')])[1]
5、組合上下級關系
5.1、/ 在中間表示:父子關系(下標簽)
Xpath定位表達式://div[contains(@class, 'statu-area')]/div[@class='label']
5.2、// 在中間表示:祖先和子孫關系
上圖為例:Xpath定位表達式://div[contains(@class, 'order-detail-container')]//div[@class='label']
三、Xpath軸定位
Xpath軸定位,應用場景是當某個元素的各個屬性及其組合都不足以定位時,那么可以利用其兄弟節點或者父節點等各種可以定位的元素進行定位。
1、表示方法:
//標簽名[@屬性名=值]/軸名稱(元素關系)::標簽名[@屬性名=值]
例://span[@id='s_kw_wrap']/ancestor::form[@name='f']
2、軸定位包含了路徑尋找,如果需要多層往上,軸定位更加方便。
以下是一些常見的軸名稱:
軸名稱 |
結果 |
ancestor |
選取當前節點的所有先輩(父、祖父等)。 |
ancestor-or-self |
選取當前節點的所有先輩(父、祖父等)以及當前節點本身。 |
attribute |
選取當前節點的所有屬性。 |
child |
選取當前節點的所有子元素。 |
descendant |
選取當前節點的所有后代元素(子、孫等)。 |
descendant-or-self |
選取當前節點的所有后代元素(子、孫等)以及當前節點本身。 |
following |
選取文檔中當前節點的結束標簽之后的所有節點。 |
following-sibling |
選取當前節點之后的所有兄弟節點 |
namespace |
選取當前節點的所有命名空間節點。 |
parent |
選取當前節點的父節點。 |
preceding |
選取文檔中當前節點的開始標簽之前的所有節點。 |
preceding-sibling |
選取當前節點之前的所有同級節點。 |
self |
選取當前節點。 |
例1:(ancestor使用)
1 <form name="f" id="form" action="/s" class="fm" onsubmit="javascript:F.call('ps/sug','pssubmit');">
2 <span id="s_kw_wrap" class="bg s_ipt_wr quickdelete-wrap">
3 <span class="soutu-btn"></span>
根據標簽span查找form父輩節點:
Xpath查詢語句://span[@id='s_kw_wrap']/ancestor::form
加上謂語,標記明顯://span[@id='s_kw_wrap']/ancestor::form[@name='f']
例2: (following)
每一個日期的屬性都是一樣的,要想隨意定位一個日期,就必須通過有class='isToday'屬性的元素定位,此時只有含有class='isToday'屬性的元素是唯一的。
Xpath查詢語句://li[@class='isToday']/../../following::div[@class='cursorp'][6]
四、總結
1、什么時候使用到Xpath定位
1.1、沒有明顯特征的元素;
1.2、通過id、class、name等,能夠找到多個元素;
2、使用Xpath定位注意事項
使用前首先在瀏覽器(Ctrl+F)中驗證Xpath表達式的正確性、唯一性;
3、凡是用text()的地方均可以直接用.來進行表示,例如a[text()=’SELENIUM’]和a[.=’SELENIUM’]是等價的。