1. 程式人生 > >XPath在Selenium WebDriver中的應用

XPath在Selenium WebDriver中的應用

end courier 將在 查找 更改 自動 gin 顯示 2個

在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)AncestorAncestor軸選擇當前節點的所有祖先元素(祖父母,父母等),如下面的屏幕所示。

也就是當前節點的所有上層節點

在下面的表達式中,我們找到當前節點的祖先元素(“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中的應用