XPath在Selenium WebDriver中的應用
在Selenium自動化中,如果id, class, name, etc常規定位器找不到元素,則XPath會用於在網頁上查找元素。
這次我將從以下三個方面來講解下:
1、什麽是XPath
2、XPath的使用語法
3、在Selenium中使用Xpath處理復雜和動態的元素
1、XPath是XML Path語言的縮寫,主要用於在XML文檔中選擇文檔中的節點。基於XML樹狀文檔結構,XPath可以用於再整棵樹中尋找指定的節點。
XPath定位具備強大的靈活性,在XML文檔樹中的某個節點既可以向前搜索,也可以向後搜索。而CSS定位只能在XML文檔樹中向前搜索;但XPath的定位速度要比CSS慢些。
下圖是XPath的基本格式
XPath的語法:
Xpath=//tagname[@attribute=‘value‘]
//:選擇當前節點,也就是在文檔中全部層級位置位置進行查找。
Tagname: 節點名
@:選擇屬性。
Attribute:節點的屬性名稱。
Value:屬性的值。
2、XPath語法
我們這裏主要講相對路徑,絕對路徑基本上不會用到,知道就行了。
對於相對XPath,路徑從HTML DOM結構的中間開始。 它以雙正斜杠(//)開頭,這意味著它可以在網頁的任何位置搜索元素。
常用格式如下:定位如下圖元素
Relative xpath: //*[@class=‘featured-box‘]//*[text()=‘Testing‘]
3、什麽是XPath軸。
XPath軸從當前上下文節點搜索XML文檔中的不同節點。 XPath軸是用於查找動態元素的方法,否則不能通過沒有ID,ClassName,Name等的普通XPath方法實現。
軸方法用於查找那些在刷新或任何其他操作時動態更改的元素。 Selenium Webdriver中常用的軸方法很少,如子,父,祖先,兄弟,前置,自我等。
在Selenium中使用XPath處理復雜和動態元素
1)基本XPath:
XPath表達式根據XML文檔中的ID,Name,Classname等屬性選擇節點或節點列表,如下所示。
Xpath=//input[@name=‘uid‘]
以下是更多基本的常見表達式:
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表達式中使用的方法。 當任何屬性的值動態變化時使用它,例如登錄信息。
包含功能可以找到具有部分文本的元素,如下例所示。
在此示例中,我們嘗試僅使用屬性的部分文本值來標識元素。 在下面的XPath表達式中,使用部分值‘sub‘代替提交按鈕。 可以觀察到該元素被成功找到。
“type”的完整值為“submit”,但僅使用部分值“sub”。
Xpath的=//* [Contains(@type,‘sub‘)]
‘name‘的完整值是‘btnLogin‘,但只使用部分值‘btn‘。
Xpath=.//*[contains(@name,‘btn‘)]
在上面的表達式中,我們將‘name‘作為屬性,將‘btn‘作為部分值,如下面的屏幕截圖所示。 這將找到2個元素(LOGIN&RESET),因為它們的‘name‘屬性以‘btn‘開頭。
在下面的表達式中,我們將鏈接的“text”作為屬性,將“here”作為部分值,如下面的屏幕截圖所示。
這將找到鏈接(‘here‘),因為它顯示文本‘here
Xpath=//*[contains(text(),‘here‘)]
Xpath=//*[contains(@href,‘guru99.com‘)]
3)使用OR&AND:
在OR表達式中,使用兩個條件,無論第一個條件還是第二個條件都應該為真。 如果任何一個條件為真或兩者兼而有之,它也適用。 意味著任何一個條件都應該是真的找到元素。
在下面的XPath表達式中,它標識單個或兩個條件為true的元素。
Xpath=//*[@type=‘submit‘ OR @name=‘btnReset‘]
在AND表達式中,使用了兩個條件,兩個條件都應該為true才能找到元素。 如果任何一個條件為false,則無法找到元素。Xpath=//input[@type=‘submit‘ and @name=‘btnLogin‘]
4) Start-with 功能: Start-with功能查找刷新時屬性值發生變化的元素或網頁上的任何操作。 在此表達式中,匹配屬性的起始文本用於查找其屬性動態更改的元素。 您還可以找到屬性值為靜態(不更改)的元素。
例如 - :假設特定元素的ID動態變化,如:
Id =“message12”
Id =“message345”
Id =“message8769”
等等..但最初的文字是一樣的。 在這種情況下,我們使用Start-with表達式。
Xpath=//label[starts-with(@id,‘message‘)]
5)Text():在這個表達式中,使用文本函數,我們找到具有精確文本匹配的元素,如下所示。 在我們的例子中,我們找到帶有文本“UserID”的元素。
Xpath=//td[text()=‘UserID‘]
6)XPath軸方法:這些XPath軸方法用於查找復雜或動態元素。 下面我們將看到其中的一些方法。
a)Following:選擇當前節點之後的所有元素()[UserID輸入框是當前節點],如下面的屏幕所示。
Xpath=//*[@type=‘text‘]//following::input
通過使用“following”軸 密碼,登錄和重置按鈕,有3個“輸入”節點匹配。 如果您想專註於任何特定元素,那麽您可以使用以下XPath方法:
Xpath=//*[@type=‘text‘]//following::input[1]
您可以通過輸入[1],[2] ............等來根據需要更改XPath。
輸入為“1”時,下面的屏幕截圖找到特定節點“密碼”輸入框元素
b)Ancestor:Ancestor軸選擇當前節點的所有祖先元素(祖父母,父母等),如下面的屏幕所示。
也就是當前節點的所有上層節點
在下面的表達式中,我們找到當前節點的祖先元素(“ENTERPRISE TESTING”節點)。
Xpath=//*[text()=‘Enterprise Testing‘]//ancestor::div
通過使用“Ancestor”軸匹配13個“div”節點。 如果您想專註於任何特定元素,那麽您可以使用下面的XPath,根據您的要求更改數字1,2;
Xpath=//*[text()=‘Enterprise Testing‘]//ancestor::div[1]
c)Child:選擇當前節點(Java)的所有子元素,如下面的屏幕所示。
Xpath=//*[@id=‘java_technologies‘]/child::li
通過使用“Child”軸匹配71個“li”節點。 如果您想專註於任何特定元素,那麽您可以使用以下xpath:
Xpath=//*[@id=‘java_technologies‘]/child::li[1]
d)Preceding:選擇當前節點之前的所有節點,如下面的屏幕所示。
在下面的表達式中,它標識了“LOGIN”按鈕之前的所有輸入元素,即Userid和password輸入元素。
Xpath=//*[@type=‘submit‘]//preceding::input
通過使用“Preceding”軸匹配2個“輸入”節點。 如果你想專註於任何特定的元素,那麽你可以使用下面的XPath:
Xpath=//*[@type=‘submit‘]//preceding::input[1]
e)follow-sibling:選擇上下文節點的以下兄弟節點。 兄弟姐妹與當前節點位於同一級別,
也就是當前節點的平級節點
如下面的屏幕所示。 它將在當前節點之後找到該元素。
xpath=//*[@type=‘submit‘]//following-sibling::input
f)Parent:選擇當前節點的父節點,如下面的屏幕所示。
Xpath=//*[@id=‘rt-feature‘]//parent::div
使用“parent”軸匹配65個“div”節點。 如果你想專註於任何特定的元素,那麽你可以使用下面的XPath:
Xpath=//*[@id=‘rt-feature‘]//parent::div[1]
g)Self:選擇當前節點或“self”表示它指示節點本身,如下面的屏幕所示。
Xpath =//*[@type=‘password‘]//self::input
h)Descendant:選擇當前節點的所有下層節點
Xpath=//*[@id=‘rt-feature‘]//descendant::a
Xpath=//*[@id=‘rt-feature‘]//descendant::a[1]
XPath Axes是用於查找動態元素的方法,否則通過普通的XPath方法無法找到
XPath在Selenium WebDriver中的應用