簡介
在進行元素定位時,如果遇到無法找到的情況,首先需要考慮是否存在嵌套的 frame
窗口或者目標元素位於新打開的窗口中。這時,必須進行相應的 frame
切換或窗口切換操作。
frame
類似於在原始主 HTML
頁面的基礎上嵌套了一個獨立的 HTML
,彼此之間相互獨立且不產生影響。
通常,當打開一個頁面時,光標默認定位在主頁面中。如果頁面由多個 frame
構成,直接定位到具體元素可能會受限。因此,需要在定位元素之前切換到目標 frame
中,以便準確查找所需的元素。
iframe 解析
如圖可以看到 iframe
的標籤。
iframe 的多種切換方式
HTML 代碼示例:
<iframe src="1.html" id="hogwarts_id" name="hogwarts_name"></iframe>
那麼通過傳入 id、name、index 以及 Selenium 的 WebElement 對象來切換 frame:
Pyhton 實現
# index:傳入整型的參數,從 0 開始,這裏的 0 就是第一個 frame
driver.switch_to.frame(0)
#id:iframe 的 id
driver.switch_to.frame("hogwarts_id")
#name: iframe 的 name
driver.switch_to.frame("hogwarts_name")
#WebElement: 傳入 `selenium.webelement` 對象
driver.switch_to.frame(driver.find_element(By.TAG_NAME,"iframe"))
Java 實現
//通過位置index選中frame,0表示第一個frame
driver.switchTo().frame(0);
//通過frame的id或name來選中frame
driver.switchTo().frame("hogwarts_id");
driver.switchTo().frame("hogwarts_name");
//WebElement: 傳入 `selenium.webelement` 對象
driver.switchTo().frame(driver.findElement(By.tagName("iframe")));
iframe 切換回默認頁面
在切換頁面之後,如果還想操作原頁面,則可以使用:
Python 版本
driver.switch_to.default_content()
Java 版本
driver.switchTo().defaultContent();
iframe 多層切換
如圖所示爲多層嵌套結構的 iframe
。
從最外部 iframe
切換到 iframe2
則需要層層切換,當從 iframe2
切換回 iframe1
可以使用父子切換,示例如下:
Python 實現
driver.switch_to.frame("iframe1")
driver.switch_to.frame("iframe2")
# 從 iframe2 切換到上一級 iframe1
driver.switch_to.parent_frame()
# 從 iframe1 切換到上一級 iframe,如果 iframe 已經是最上級,則保持不變
driver.switch_to.parent_frame()
Java 實現
driver.switchTo().frame("iframe1");driver.switchTo().frame("iframe2");
從 iframe2 切換回 iframe1 可以使用父子切換:
# 從iframe2切換到上一級iframe1
driver.switchTo().parent_frame()
# 從iframe1切換到上一級iframe,如果iframe已經是最上級,則保持不變
driver.switchTo().parent_frame()
這個方法是 Selenium
提供的直接從子 frame
切換到父 frame
,可以使用在嵌套的 frame
框架中。
總結
在瀏覽器中,存在一種名爲 frame
的組件,通過常規的定位很難直接找到這個組件內的元素,因此需要進入到該 frame
組件裏,並切換到相應的 frame
句柄,以便準確地定位和操作 frame
裏面的元素。