1. 什麼是XPath?
XPath
是一種XML路徑,用於瀏覽頁面的HTML結構。他是一種語法或者語言用來查詢使用XML路徑表達的網頁中的任意元素。
XPath
的基本形式如下:
Xpath=//tagname[@attribute='value']
- //:選中當前節點
- Tagname:特定節點的標記名
- @:選中屬性的標記符
- Attribute:節點的屬性名字
- Value:屬性值
為了精確查詢網頁中的元素,有以下幾種不同型別的定位器:
XPath定位器 | 查詢不同元素 |
---|---|
ID | 透過元素中的ID查詢元素 |
Classname | 查詢元素中的Class |
Name | 透過元素的名字查詢元素 |
Link text | 透過連結的內容查詢元素 |
XPath | 查詢動態元素並在網頁的各個元素之間遍歷所需的XPath |
CSS path | CSS 路徑也能定位到沒有name、class或者ID的元素 |
2. X-path的型別
XPath有兩種型別:
1)絕對XPath路徑
2)相對XPath路徑
2.1 絕對XPath
這是一種直接查詢元素的方式,不過弊端就是如果元素路徑中有一點兒變動的話,XPath就會獲取失敗。
XPath的關鍵特徵是它以單個正斜槓(/)
開頭,這意味著您可以從根節點中選擇元素。
- Absolute XPath
/html/body/div[2]/div[1]/div/h4[1]/b/html[1]/body[1]/div[2]/div[1]/div[1]/h4[1]/b[1]
2.2 相對XPath
XPath相對路徑從HTML DOM結構的中間部分開始。它以雙正斜槓//
開始。他可以查詢網頁中的任何元素,不需要寫很長的XPath路徑。相對XPath一直讓人偏愛的原因就在於不需要從根元素得到一個完整路徑。
- Relative XPath
Relative XPath: //div[@class='featured-box cloumnsize1']//h4[1]//b[1]
2.3 什麼是XPath axes
XPath axes在XML文件中從當前上下文節點搜尋不同的節點。XPath Axes是查詢動態元素的方法,否則,這是沒有ID、Classname,Name等常規XPath方法無法實現的。
Axes方法用來查詢那些重新整理或者執行其他操作而動態改變的元素。Selenium Webdriver中常用的Axes方法很少,例如孩子(child),父母(parent),祖先(ancestor),兄弟姐妹(sibling),上一級(preceding),自己(self)等。
3. 在selenium中用XPath處理複雜的&動態的元素
1)基本的XPath
XPath表示式根據XML文件中的ID、Name、Classname等基本屬性,選擇節點或節點列表,如下所示:
Xpath=//input[@name='uid']
從這個連結進入頁面:demo.guru99.com/test/selenium-xpath...
一些基本的xpath表示式:
Xpath=//input[@type='text']
Xpath= //label[@id='message23']
Xpath= //input[@value='RESET']
Xpath=//*[@class='barone']
Xpath=//a[@href='http://demo.guru99.com/']
Xpath= //img[@src='//cdn.guru99.com/images/home/java.png']
2)Contains()
Contains()
是一個在XPath表示式中使用的方法。當任何屬性的值動態變化(例如,登入資訊)時,將使用該屬性。
contain
功能可以查詢具有部分文字的元素,如以下示例所示。
在這個例子中,我們嘗試僅僅透過屬性的部分文字值來辨認元素。在下面的XPath表示式中部分值’sub’用來替代提交按鈕。可以觀察到成功找到了元素。
‘Type’的完整值是’submit’但是隻使用了部分值’sub’。
Xpath=//*[contains(@type,'sub')]
‘name’的完整值是’btnLogin’但是隻用了部分值’btn’。
Xpath=//*[contains(@name,'btn')]
在上面的表示式中,我們將“name”作為屬性,將“ btn”作為部分值,如下面的螢幕快照所示。 這將找到2個元素(LOGIN和RESET),因為它們的’name’屬性以’btn’開頭。
同樣,在下面的表示式中,我們將“ id”作為屬性,將“ message”作為部分值。 這將發現2個元素(“使用者ID不能為空”和“密碼不能為空”),因為其“name”屬性以“message”開頭。
Xpath=//*[contains(@id,'message')]
在下面的表示式中,我們將連結中的’text’作為屬性,’here’作為部分值,如下面快照中所示。這將找到連結(‘here’)因為它顯示了文字’here’。
Xpath=//*[contains(text(),'here')]
Xpath=//*[contains(@href,'guru99.com')]
3)使用OR & AND
在OR表示式中,有兩個條件要用到,條件一或者條件二應為真。如果任何一個條件為真或兩者皆為真,則也適用。 意味著任何一種條件都應為真才能找到該元素。
在下面的XPath表示式中,辨認出了單個條件或者兩個條件皆為真的元素。
Xpath=//*[@type='submit' or @name='btnReset']
高亮顯示兩個元素,“LOGIN”元素有’type’屬性,“RESET”元素有’name’屬性。
在AND表示式中,有兩個條件要用到,這兩個條件必須全部為真才能找到元素。如果任意一個條件為假就不能查詢到元素。
Xpath=//input[@type='submit' and @name='btnLogin']
在下面的表示式中,高亮顯示的’LOGIN’元素擁有’type’和’name’屬性。
4)Xpath Starts-with
XPath starts-with()是一個用來查詢屬性值隨著頁面重新整理或者其他動態操作而改變的頁面元素的函式。在這個方法中,屬性的開始檔案被匹配到用來查詢屬性值動態變化的元素。你也可以查詢屬性值是靜態(不變)的元素。
例如:假設特定元素的ID這樣動態變化:
Id=”message12”
Id=”message345”
Id=”message8769”
等等等等…但是初始文字是一樣的。在這種情況下,我們就可以使用Start-with表示式。
在下面的函式中,有兩個以”message”開頭的id元素(例如:’使用者-Id不能為空’&’密碼不能為空’)。在下面的表示式中,XPath查詢到這些以’message’開頭的’ID’元素。
Xpath=//label[starts-with(@id, 'message')]
5)XPath Text() Function
XPath text()函式是一個用來基於頁面元素文字來定位元素的selenium webdriver
的內建函式。它幫助查詢精準的文字元素以及在文字節點集合中定位元素。要定位的元素應為字串形式。
在這個表示式中,使用文字功能,我們找到了具有完全文字匹配的元素,如下所示。在我們的例子中,我們找到了文字為”UserID”的元素。
Xpath=//td[text()='UserID']
6)Xpath軸方法
這些XPath軸方法被用來查詢複雜的或者動態的元素。下面我們會看到一部分這些方法。
為了
舉例說明這些XPath軸方法,我們將會使用Guru99 bank demo站點。
- a)Following
選取文件中當前節點所有元素[UserID輸入框是當前節點],如下所示:
Xpath=//*[@type='text']//following::input
透過使用”following”軸匹配到了3個”input”節點-密碼、登陸、重置按鈕。如果你想集中任意一個特定的元素,那麼你可以用下面的Xpath方法。
Xpath=//*[@type='text']//following::input[1]
你可以根據需求透過放置[1],[2]…等等來更改XPath。
輸入為’1’時,下面的截圖找到了特定的節點是’密碼’輸入框。
b)祖節點
祖先軸選擇當前節點的所有祖先元素(祖父母,父母等),如以下螢幕所示。
在下面的表示式中,我們正在找到當前節點(“ ENTERPRISE TESTING”節點)的祖先元素。
Xpath=//*[text()='Enterprise Testing']//ancestor::div
透過使用“祖先”軸匹配的13個“ div”節點。 如果您想關注任何特定元素,則可以使用下面的XPath,在其中您可以根據需要更改數字1、2:
Xpath=//*[text()='Enterprise Testing']//ancestor::div[1]
您可以根據需要透過輸入[1],[2]…………來更改XPath。
c)子節點
選擇當前節點(Java)的所有子元素,如下螢幕所示。
Xpath=//*[@id='java_technologies']//child::li
透過使用“子”軸可以匹配71個“ li”節點。 如果要關注任何特定元素,則可以使用以下xpath:
Xpath=//*[@id='java_technologies']/child::li[1]
您可以根據需要透過輸入[1],[2]…………來更改XPath。
d)前節點
如下螢幕所示,選擇當前節點之前的所有節點。
在下面的表示式中,它標識“ LOGIN”按鈕之前的所有輸入元素,即Userid和密碼輸入元素。
Xpath=//*[@type='submit']//preceding::input
透過使用“上一個”軸可以匹配2個“輸入”節點。 如果您想關注任何特定元素,則可以使用以下XPath:
Xpath=//*[@type='submit']//preceding::input[1]
您可以根據需要透過輸入[1],[2]…………來更改XPath。
e)繼兄弟姐妹節點
選擇上下文節點的以下同級。 兄弟姐妹與當前節點處於同一級別,如以下螢幕所示。 它將在當前節點之後找到元素。
xpath=//*[@type='submit']//following-sibling::input
一個輸入節點透過使用“跟隨兄弟”軸進行匹配。
f)父節點
選擇當前節點的父節點,如下圖所示:
Xpath=//*[@id='rt-feature']//parent::div
透過使用”父節點”軸匹配到65個”div”節點。如果你想關注任意一個特定的元素那麼你可以使用下面的XPath:
Xpath=//*[@id='rt-feature']//parent::div[1]
您可以根據需要透過輸入[1],[2]…………來更改XPath。
g)節點自身(self)
選擇當前節點或者’self’意味著預示了節點本身,如下所示。
透過’self’軸匹配到一個節點。它總是隻找到一個節點,因為它代表了元素本身。
Xpath =//*[@type='password']//self::input
h)後裔節點
選擇當前節點的後代,如下螢幕所示。
在下面的表示式中,它標識當前元素(“主體環繞”框架元素)的所有元素後代,這意味著向下位於節點(子節點,孫子節點等)下。
Xpath=//*[@id='rt-feature']//descendant::a
透過使用“後代”軸可以匹配12個“link”節點。 如果您想關注任何特定元素,則可以使用以下XPath:
Xpath=//*[@id='rt-feature']//descendant::a[1]
您可以根據需要透過輸入[1],[2]…………來更改XPath。
總結:
需要XPath才能在網頁上查詢元素,以便對該特定元素執行操作。
- XPath有兩種型別:
- 絕對XPath
- 相對XPath
- XPath軸是用於查詢動態元素的方法,否則通常的XPath方法無法找到這些元素的。
- XPath表示式根據XML文件中的ID,Name,Classname等屬性選擇節點或節點列表。
原文連結:www.guru99.com/xpath-selenium.html
本作品採用《CC 協議》,轉載必須註明作者和本文連結