首頁  >  文章  >  web前端  >  如何在 Selenium 中編寫和處理動態 XPath [有策略]

如何在 Selenium 中編寫和處理動態 XPath [有策略]

DDD
DDD原創
2024-11-18 06:35:03260瀏覽

How to Write and Handle Dynamic XPath In Selenium [with Tactics]

自動化測試能夠識別被測應用程式 (AUT) 的 Web 元素至關重要。學習如何找到 Web 元素並在 Selenium 中手動編寫動態 XPath 可能需要很長時間和大量練習。

例如,我們將向您展示如何使用 XPath 在 Selenium 中手動輕鬆地尋找 Web 元素。

定位器是 Selenium 的寶貴功能之一。它們使我們能夠定位網路元素。例如,如果 id、類別名稱、名稱、連結文字等定位器找不到 Web 元素,我們使用 XPath 在網頁上尋找它們。

Selenium 中的動態 XPath 是什麼?

XPath,也稱為 XML 路徑,是 Selenium WebDriver 最常用的定位器之一,用於導覽頁面的 HTML 結構。它可用於使用 HTML 和 XML 文件中的 HTML DOM 結構來定位網頁中的任何元素。

XPath 旨在允許 XML 文件導覽來選擇 XML 文件的單一元素、屬性或其他部分進行特定處理。例如,XPath 產生可靠的定位器,但在效能方面比 CSS 選擇器慢。

XPath 語言用於選擇 HTML 頁面中的元素。使用 XPath,您可以根據標籤名稱、ID、CSS 類別等來尋找頁面上的任何元素。在 Selenium 中,有兩種​​類型的 XPath。

在 Selenium 中使用動態 XPath 找出元素的不同方法:

01 絕對 XPath

這是尋找元素最直接的方法,但「絕對 XPath」的缺點是,如果元素的路徑發生變化,該特定的 XPath 就會失敗。

XPath 的關鍵特性是它以單一正斜線 (/) 開頭,表示您可以使用動態 XPath 從根節點選擇元素。

02 相對 XPath

相對 XPath 是一種路徑從您選擇的節點而不是根節點開始的路徑。

使用相對 XPath 的好處是您不必指定整個 XPath;相反,您可以從中間或介於兩者之間的某個位置開始。

*缺點:*

識別元素將花費更長的時間,因為我們指定了部分路徑而不是精確路徑。

如果多個元素在同一條路徑上,它將選擇識別的第一個元素。

如何在selenium中尋找動態元素的XPath?

從上下文(目前)節點,XPath 軸搜尋 XML 文件中的不同節點。例如,它用於尋找最接近該樹的節點。

XPath 軸是尋找動態元素的方法,使用不包含 ID、類別名稱、名稱或其他識別碼的標準 XPath 方法是不可能找到這些動態元素的。

Axes 方法用於定位因刷新或其他操作而動態變化的元素。例如,Selenium Webdriver 中常用的是 child、parent、ancestor、sibling、previous、self 等軸方法。

當 AUT 變更是測試自動化中最複雜且最耗時的任務之一時,尤其是在軟體開發的早期階段,他們正在修改測試腳本。

因此,開發人員可能會頻繁地將標識符和元素從一個版本更改為另一個版本。此外,AUT 的元素可能在執行過程中動態變化。

為了解決這些問題,自動化測試人員不應為測試案例元素設定固定的 XPath,而應根據特定模式動態編寫 XPath 腳本。

在 Selenium 中建立動態 XPath 的 11 種獨特方法:

以下是在 selenium 中創建動態 XPath 的 11 種獨特且不同的方法:

real-device-cloud-cta.jpg

01 使用單斜線

此機制也稱為絕對 XPath 元素發現。

文法:

html/body/div[1]/div[2]/div[2]/div[1]/form/div[1]/div/div[1]/div/div/input[1]
單斜線用於建立具有絕對路徑的 XPath,即 XPath 設計用於從文件節點/起始節點/父節點開始選擇。

02 使用雙斜線

此機制也稱為使用相對 XPath 尋找元素。

雙斜線用於建立具有相對路徑的 XPath,這表示 XPath 可以從文件中的任何位置開始選擇。然後,在整個頁面 (DOM) 中尋找前面的字串。

文法

//form/div[1]/div/div[1]/div/div/input[1]

03 使用單一屬性

語法可以用兩種方式編寫,如下所示。 HTML 標記包含或排除。如果要排除 HTML 標籤,則必須使用 *.

文法

//[@attribute_name='attribute_value']

//*[@attribute_name='attribute_value']

04 使用多個屬性

文法

//[@attribute_name1='attribute_value1'][@attribute_name2='attribute_value2]

//*[@attribute_name1='attribute_value1'][@attribute_name2='attribute_value2]

05 使用 AND

文法

//[@attribute_name1='attribute_value1' 和 @attribute_name2='attribute_value2]

//*[@attribute_name1='attribute_value1' 和 @attribute_name2='attribute_value2]

06 使用 OR

文法

//[@attribute_name1='attribute_value1' 或 @attribute_name2='attribute_value2]

//*[@attribute_name1='attribute_value1' 或 @attribute_name2='attribute_value2]

07 使用 contains()

Contains() 是一種在熟悉元素屬性值的某些部分時識別動態變化的元素的方法。

當熟悉了元素屬性的值(以指定文字開頭)時,我們可以使用starts-with()方法來識別它。

文法

//[包含(@attribute_name,'attribute_value')]

//*[包含(@attribute_name,'attribute_value')]

#08 使用文字 ()

此機制用於根據網頁文字尋找元素。

Last() 從所有輸入元素中選擇最後一個元素(指定類型)。

文法

//[text()='新的登入外觀即將推出']

//
[text()='即將推出新的登入外觀']

09 使用position(),

根據提供的位置編號從所有輸入元素中選擇元素。

在下面的 XPath 中,[@type='text'] 將定位文字字段,函數 [position()=2] 將識別從頂部數第二個位置的文字字段。

文法

findElement(By.xpath("(//input[@type='text'])[position()=2]"))

findElement(By.xpath("(//input[@type='text'])[2]"))

10 使用索引

我們可以將索引位置放在方括號中來取得第 n 個元素。然後,我們能夠使用下面的 XPath 識別姓氏欄位。

文法

findElement(By.xpath("//label[2]"))

11 使用先前的 XPath 軸

除了祖先、屬性節點和命名空間節點之外,這將選擇文件中出現在目前節點之前的所有節點。

如何從 Selenium 中的清單中選擇 Web 元素?

WebElement select = driver.findElement(By.id(“性別”));
清單選項 = select.findElements(By.tagName(“男”));
for (WebElement 選項: 選項) {
if(“德國”.equals(option.getText()))
option.click();

Selenium 如何處理列錶框?

使用 selectByValue()

選擇列錶框 = new Select(驅動程式。
列錶框。
選擇列錶框 = new Select(驅動程式。
WebElement option = listbox.getFirstSelectedOption();
System.out.println(option.getText()); //列印選定的選項。
//列出所有選定的選項。
//列出所有選項。

如何在 Selenium 中寫出動態 Web 元素?

動態元素是一種 Web 元素,其 ID 不只是 ID,而且任何屬性(例如類別名稱、值等)都是不固定的。

因此,每次重新載入頁面時,它都會發生變化。因此,您無法僅透過定位器處理該元素。

例如,Gmail 收件匣元素的類別名稱會隨著每次登入而變化。

資料庫驅動或會話驅動的動態元素當您變更資料庫元素時,它會影響多個正在測試的應用程式區域。

動態元素是嚴格的內容,其格式在設計中佈局。文字方塊和按鈕通常與動態標識符一起使用。

當您自動化動態網站時,一旦內容發生變化,腳本就會中斷,導致您的測試失敗。然後你每次都需要更新你的測試案例,這是一個耗時的任務。

我們必須始終了解重新載入頁面或啟動新會話時這些元素的行為方式。一旦我們理解了這些元素,我們就可以製定與它們互動的策略。

#01 帶有起始文字的相對 Xpath

與 Selenium 中的部分連結選擇器類似,我們可以使用 Xpath 搜尋與起始文字匹配元素。

#02 後面或前面有節點的相對 Xpath

下面列出了上下文節點之後的所有節點。我們可以使用‘the following’來指定網頁元素清單中下面列出的元素。

#03 文字包含相對 Xpath

很少有動態元素包含靜態值;基於這些價值觀;我們可以使用「contains」函數搜尋這類元素。例如,上面的 HTML 按鈕類別名稱中有一個靜態字串「Hstpl-12345」。例如,我們可以使用 XPath 尋找類別名稱包含單字「Hstpl」的按鈕元素。

#04 索引元素

當 DOM 中存在多個具有相似屬性的元素時,搜尋它們可能會很困難,尤其是當它們是動態的時。

例如,假設頁面上有十個按鈕,您要找出第五個。然後我們尋找帶有「button」標籤的元素,並前往按鈕清單的第五個索引來尋找該元素。

#05 絕對Xpath方法

絕對 Xpath 使用從根元素到特定元素的整個路徑。如下所示,絕對 Xpath 以 HTML 和正斜線 (/) 開頭。要產生 Xpath,請使用 fire path (firebug)。

但是,它們更容易回歸,因為 DOM 中的微小變化會導致它們不正確或引用不同的元素。

因此,在大多數情況下,使用絕對 Xpath 並不被認為是最佳實踐,但它解決了動態元素問題。

#06 IWebElement 介面正在使用。

處理動態元素的另一種方法是尋找具有相同 Tag 名稱的所有元素,然後根據是否包含文字、值或元素屬性來搜尋所需的元素。

結論

本文示範如何使用 XPath 函數 contains()、starts-with() 和 text() 以及屬性和文字來唯一標識 HTML DOM 結構中的元素。

在 Selenium 中,XPath 用於在其他定位器失敗時定位元素。 Selenium XPath 有兩種類型:絕對 XPath 和相對 XPath。

資料來源:本文原刊於 testgrid.io。

以上是如何在 Selenium 中編寫和處理動態 XPath [有策略]的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn