1. 程式人生 > 其它 >Selenium-xpath定位

Selenium-xpath定位

序言:

前面介紹了利用瀏覽器的debug工具獲取xpath地址,但是這個工具不是萬能的,有時候直接複製貼上會定位不到。這個時候就需要自己手動去寫xpath路徑了。接下來將詳細講解xpath的常用語法。

一、xpath的基本概念和基本語法

可上菜鳥教程和w3cschool檢視相關資料:http://www.runoob.com/xpath/xpath-tutorial.htmlhttp://www.w3school.com.cn/xpath/index.asp

謂語(Predicates)

謂語用來查詢某個特定的節點或者包含某個指定的值的節點。

謂語被嵌在方括號中。

二、下面我們開始介紹xpath的一些常用定位方法

語法:xpath = "//標籤名[@屬性='屬性值']"

1.屬性定位

(1)通過id屬性定位

driver.find_element_by_xpath('//*[@id="kw"]')

(2)通過name屬性定位

element = driver.find_element_by_xpath('//*[@name="wd"]')

(3)通過class屬性定位

element = driver.find_element_by_xpath('//*[@class="s_ipt"]')

(4)通過文字資訊定位或autocomplete屬性等定位。

element = driver.find_element_by_xpath('
//*[@autocomplete="off"]')# 通過autocomplete屬性定位

element = driver.find_element_by_xpath('//*[text()="hao123"]')# 通過文字資訊定位

(5)屬性判斷條件中最常見為id,name,class等等,屬性的類別沒有特殊限制,只要能夠唯一標識一個元素即可。當然在屬性不唯一的時候,如果採取多個條件組合的方式能達到唯一也可以。xpath的邏輯運算可以支援與(and)、或(or)、非(not),以下程式碼以and作為例子:

element = driver.find_element_by_xpath('//*[@id="kw" and @autocomplete="off"]
')

  註釋:與(and):A and B,即既滿足A條件同時也滿足B條件才成立,比如,上面用例中的@id="kw" and @autocomplete="off",只有當id為“kw”,並且autocomplete為“off”時才可定位到。

  或(or): A or B,只要滿足A條件或者滿足B條件就可成立,即A和B兩個條件只要滿足其中一個就成立。

  非(not):not A,只要不滿足A條件就成立。

2.標籤定位 

有時候同一個屬性,同名的比較多,這時候可以通過標籤篩選,定位更精準一點。這個時候我們可以結合上面的xpath路徑基本語法進行定位,比如常用到的/號表示從根節點開始,//號表示從匹配到的元素作為開始節點,用*號表示任意標籤等,以下均以定位hao123為例。

(1)/號表示從根節點開始定位, 其中[N]表示跟它的標籤一樣兄弟元素的第N個(注意:Xpath的索引是從1開始,不同於python語法的索引從0開始)

element = driver.find_element_by_xpath("/html/body/div/div/div[3]/a[2]")# 從根路徑開始定位,其中div[3]表示此用例中/html/body/div/div/路徑下的第3個div標籤。

註釋:一個元素無法通過自身屬性直接定位到,則可以先定位它的父(或父節點的父節點,即它爺爺)元素,然後再找下一級即可,比如以上用例的body節點,它的父節點即為html。

(2)//號表示從匹配選擇的當前節點開始定位

# 以下兩個定位方法均可定位到hao123,放兩個例子只是為了強調元素屬性可在xpath路徑任意節點新增。

element = driver.find_element_by_xpath("//div[@id='s-top-left']/a[2]")# 從滿足id為“s-top-left”的div標籤開始定位。
element = driver.find_element_by_xpath("//a[text()='hao123']")# 從滿足文字資訊為“hao123”的a標籤定位。

(3)*號表示從匹配選擇的當前節點開始定位

# 以下兩個定位方法均可定位到hao123,放兩個例子只是為了強調*可表示xpath路徑的任意節點。

element = driver.find_element_by_xpath("//div/*[text()='hao123']")# 定位文字資訊為“hao123”的所有元素。

element = driver.find_element_by_xpath("//*[text()='hao123']")# 定位文字資訊為“hao123”的所有元素。

3. 模糊匹配定位

  模糊匹配功能非常強大,掌握了模糊匹配功能,基本上沒有定位不到的。以下為模糊定位的常用方法:

# xpath語法支援模糊匹配某個屬性
element = driver.find_element_by_xpath("//a[contains(text(),'ao12')]")
element = driver.find_element_by_xpath("//*[contains(@id,'kw')]")

# xpath語法支援模糊匹配以什麼開始的
element = driver.find_element_by_xpath("//a[starts-with(text(),'hao12')]")
element = driver.find_element_by_xpath("//input[starts-with(@id,'k')]")

# xpath語法支援模糊匹配以什麼結尾的
element = driver.find_element_by_xpath("//input[ends-with(@id,'w')]")# ends-with是xpath2.0的語法
element = driver.find_element_by_xpath("//input[substring(@id,string-length(@id)-string-length('w')+1)='w']")# 此為xpath1.0的語法