Xpath定位元素
1、Xpath語法
xpath介紹:XPath即為XML路徑語言(XML Path Language),它是一種用來確定XML文件中
某部分位置的語言。
一,作用和痛點
前面的只能是單一屬性,文字, 標籤名稱。
可以通過 e.find_elment 一層層查詢下去,但是麻煩
綜合各個條件, xpath 表示式,一次查詢
二,xpath介紹和基本語法
基本語法
表示式 描述
nodename 選取此節點的所有子節點。
/ 從根節點選取。絕對路徑
// 從匹配選擇的當前節點選擇文件中的節點,而不考慮它們的位置。相對路徑
. 選取當前節點。
.. 選取當前節點的父節點。
@ 選取屬性。
三,絕對定位和相對定位
絕對路徑:每次從根節點 html 開始
相對路徑:每次只需從第一個已經找到的節點開始。
絕對定位的劣勢:
前端經常變化,加 div 之類的。下次就不能用了。
表達更加繁瑣
四,謂語條件
謂語被嵌在方括號中,用來查詢某個特定的節點或者包含某個指定的值的節點,也就是額外的條件。文
本也可以定位。
1,索引取值:[索引值]
注意點:
索引的順序是從1開始的,不是 0
索引的優先順序比 // 高,建議使用索引的時候前面的部分使用括號包起來
(//a[@class, 'btn-special'][0])
# 查詢第一個元素input元素,
e.find_element_by_xpath("(//input)[1]")
# (//input)[1] 和 //input[1]是有區別的
2,有某個屬性:[@屬性]
# 查詢有value屬性 的input標籤
e.find_element_by_xpath("//input[@value]]")
3,屬性為某個特定值 : [@屬性=值]
# 查詢value等於 百度一下 的input標籤
e.find_element_by_xpath("//input[@value='百度一下']")
4,子元素中屬性為某個特定值:[//子元素/@屬性=值]
# 查詢form, from下有一個option元素的value屬性為 musen
e.find_element_by_xpath("//span[input/@value='百度一下']")
5, 文字 //a[text()='']
# 查詢文字內容為 百度首頁的a標籤
//a[text()='百度首頁']
五,萬用字元和邏輯運算 and or
# 查詢name屬性等於user或者id屬性等於user的input標籤 //input[@name='user' or @id='username'] # 查詢name屬性等於user並且id屬性等於user的input標籤 //input[@name='rsv_enter' and @name='rsv_dl']
注意點:
find_element_by_class_name進行定位 class之間不能有空格
xpath通過class屬性定位的時候,class屬性值可以有空格
六,函式
函式名 說明
starts-with(str1,str2) str1是否以 str2 開頭
contains(str1,str2) str1是否包含 str2
# 查詢 value屬性為 百 開頭的input標籤
//input[starts-with(@value,'百')]
# 查詢 value屬性 包含百度的 input標籤
//input[contains(@value,'百度')]
七, 軸定位
# /軸名稱(元素關係)::節點名稱
# 案例:查詢form標籤子節點中id等於s_btn_wr的span標籤
//form/child::span[@id='s_btn_wr']
# 案例二:查詢form標籤父節點的div標籤
//form/parent::div
# 案例三:查詢title等於蘇寧易購的a標籤 的父節點div 的所有在它之前的兄弟節點
//a[@title='蘇寧易購']/parent::div/preceding-sibling::div
# 案例四:查詢title等於蘇寧易購的a標籤 的父節點div 的所有在它之後的兄弟節點
//a[@title='蘇寧易購']/parent::div/following-sibling::div
軸定位包含了路徑尋找,如果需要多層往上,軸定位更加方便。
兄弟姐妹都可以
軸名稱 結果
child 選取當前節點的所有子元素。
descendant 選取當前節點的所有後代元素(子、孫等)。
parent 選取當前節點的父節點。
ancestor 選取當前節點的所有先輩(父、祖父等)。
following 選取文件中當前節點的結束標籤之後的所有節點。
following-sibling 選取當前節點之後的所有兄弟節點。
preceding 選取文件中當前節點的開始標籤之前的所有節點。
preceding-sibling 選取當前節點之前的所有節點。
2、CSS 選擇器
層級關係
.intro 選擇 class="intro" 的所有元素。
firstname 選擇 id="firstname" 的所有元素。
- 選擇所有元素。
p
選擇所有
div,p
選擇所有
元素和所有
div p
選擇
元素內部的所有
div>p
選擇父元素為
元素的所有
div+p
選擇緊接在
元素之後的所有
[attribute] [target] 選擇帶有 target 屬性所有元素。
[attribute = value] a[title = 蘇寧易購] title屬性等於蘇寧易購的a標籤元素。
[attribute *= value] a[title *= 寧易] title屬性包含寧易的a標籤元素。
[attribute ^= value] a[title ^= 蘇寧] title屬性以蘇寧 開頭的a標籤元素。
[attribute $= value] a[title $= 易購] title屬性以易購 結尾的a標籤元素。
謂語
[attribute] [target] 選擇帶有 target 屬性所有元素。
[attribute = value] a[title = 蘇寧易購] title屬性等於蘇寧易購的a標籤
[attribute *= value] a[title *= 寧易] title屬性包含寧易的a標籤
[attribute ^= value] a[title ^= 蘇寧] title屬性以蘇寧 開頭的a標籤
[attribute $= value] a[title $= 易購] title屬性以易購 結尾的a標籤
索引
nth-of-type:正向索引
# 獲取第五個類屬性為nav-item的div標籤
div.nav-item:nth-of-type(5)
nth-last-of-type:反向索引
# 獲取倒數第2個類屬性為nav-item的div標籤
div.nav-item:nth-last-of-type(2)
3、css和xpath比
css的效率快
CSS 是和 HTML 繫結在一起的,是直接操作HTML的,如果換成 XML 其他的標記語言,就
不行了。
Xpath 是和 DOM 繫結在一起的。所以還需要時間通過HTML去生成 DOM 物件。
只要有 DOM 就可以用 Xpath來定位元素, 也就是說 xpath 得用途更廣,手機也可以用,其
他客戶端也可以用。
xpath 在 IE 中效率會高,其他谷歌和火狐瀏覽器,都會比css慢。
xpath 的功能更多
xpath 在找到一個元素是可以上下移動的。 css 只能進行向下或橫向去找。
xpath可以根據文字內容查詢元素。
對於簡單的元素定位,CSS選擇器表達更加簡潔。但是定位複雜的元素與 Xpath 相比不太友好。