在 Java 中使用 Selenium WebDriver 在框架之間切換
一、簡介
管理框架和 iframe 是測試自動化工程師的關鍵技能。 Selenium WebDriver 允許我們**以相同的方式使用框架和 iframe** 。
在本教程中,我們將探索幾種使用 Selenium WebDriver 在框架之間切換的不同方法。這些方法包括使用WebElement 、名稱或 ID 以及索引。
到最後,我們將有能力自信地處理 iframe 交互,從而增強自動化測試的範圍和有效性。
2. Frame和iframe的差別
在 Web 開發中經常會遇到術語「框架」和「iframe」。每個在建立和增強網路內容方面都有不同的目的。
框架是一種較舊的 HTML 功能,它將網頁劃分為單獨的部分,每個部分都有自己專用的 HTML 文件。儘管框架已被棄用,但在網路上仍然會遇到它們。
iframe(內嵌框架)**將單獨的 HTML 文件嵌入網頁上的單一框架內**。它們廣泛用於網頁中,用於各種目的,例如無縫合併地圖、社交媒體小部件、廣告或互動形式等外部內容。
3. 使用WebElement
切換到框架
使用WebElement進行切換是最靈活的選項。我們可以使用任何選擇器(例如 ID、名稱、CSS 選擇器或 XPath)來尋找框架,以找到我們想要的特定 iframe:
WebElement iframeElement = driver.findElement(By.cssSelector("#frame_selector"));
driver.switchTo().frame(iframeElement);
為了更可靠的方法,最好使用顯式 wait ,例如ExpectedConditions.frameToBeAvailableAndSwitchToIt() :
WebElement iframeElement = driver.findElement(By.cssSelector("#frame_selector"));
new WebDriverWait(driver, Duration.ofSeconds(10))
.until(ExpectedConditions.frameToBeAvailableAndSwitchToIt(iframeElement))
這有助於確保 iframe 完全加載並準備好進行交互,減少潛在的計時問題,並使我們的自動化腳本在使用 iframe 時更加健壯。
4. 使用名稱或 ID 切換到框架
導航到框架的另一種方法是利用其名稱或 ID 屬性。當這些屬性是唯一的時,這種方法很簡單且特別有用:
driver.switchTo().frame("frame_name_or_id");
使用明確等待**可確保框架已完全載入並準備好進行互動**:
new WebDriverWait(driver, Duration.ofSeconds(10))
.until(ExpectedConditions.frameToBeAvailableAndSwitchToIt("frame_name_or_id"));
5. 使用索引切換到框架
Selenium 讓我們可以使用簡單的數位索引切換到框架。第一幀的索引為0
,第二幀的索引為1
,依此類推。使用索引切換到框架提供了一種靈活且方便的方法,特別是當 iframe 缺乏明確的名稱或 ID 時。
透過指定框架的索引,我們可以無縫地瀏覽網頁中的框架:
driver.switchTo().frame(0);
顯式等待使程式碼更加健壯:
new WebDriverWait(driver, Duration.ofSeconds(10))
.until(ExpectedConditions.frameToBeAvailableAndSwitchToIt(0));
但是,謹慎使用框架索引很重要,因為網頁上框架的順序可能會改變。如果新增或刪除框架,它可能會破壞索引順序,從而導致我們的自動化測試出現潛在的失敗。
6. 切換到嵌套框架
當框架嵌套時,意味著一個或多個框架嵌入到其他框架中,形成父子關係。這種層次結構可以延續到多個級別,從而導致複雜的嵌套框架結構:
<!DOCTYPE html>
<html>
<head>
<title>Frames Example</title>
</head>
<body>
<h1>Main Content</h1>
<p>This is the main content of the web page.</p>
<iframe id="outer_frame" width="400" height="300">
<h2>Outer Frame</h2>
<p>This is the content of the outer frame.</p>
<iframe id="inner_frame" width="300" height="200">
<h3>Inner Frame</h3>
<p>This is the content of the inner frame.</p>
</iframe>
</iframe>
<p>More content in the main page.</p>
</body>
</html>
Selenium 提供了一種簡單的方法來處理它們。要存取嵌套框架結構中的內部框架,我們應該**依序從最外層框架切換到內部框架**。這允許我們在深入層次結構時存取每個框架內的元素:
driver.switchTo().frame("outer_frame");
driver.switchTo().frame("inner_frame");
7. 從框架或巢狀框架切換回來
Selenium 提供了一種透過不同方法從框架和巢狀框架切換回來的機制。要傳回主要內容,我們可以使用方法defaultContent()
:
driver.switchTo().defaultContent()
它本質上退出所有框架,並確保我們後續的互動發生在網頁的主要上下文中。當我們完成框架內的任務並需要在主要內容中繼續我們的操作時,這特別有用。
為了移動到父框架,我們可以使用parentFrame()
方法:
driver.switchTo().parentFrame()
此方法允許我們從子框架轉換回其直接父框架。當我們使用嵌套框架(每個框架嵌入另一個框架中)並且我們需要在它們之間移動時,它特別有價值。
八、結論
在本文中,我們探討了框架以及如何使用 Selenium WebDriver 使用它們。我們已經學習了使用WebElement
、名稱或 ID 以及數字索引在它們之間進行切換的不同方法。這些方法提供了靈活性和精確性。
透過使用顯式等待,我們確保了與框架的可靠交互,減少了潛在問題並使我們的自動化腳本更加健壯。
我們已經學習瞭如何透過從最外層框架順序切換到內部框架來處理嵌套框架,從而允許我們存取複雜嵌套框架結構中的元素。我們也學習如何切換回主要內容以及移動到父框架。
總之,掌握使用 Selenium WebDriver 進行框架和 iframe 處理對於測試自動化工程師至關重要。憑藉知識和技術,我們已做好充分準備,可以自信地處理框架。
與往常一樣,本文中提供的程式碼可以在 GitHub 上取得。