Selenium | 頁面跳轉後無法定位到元素,怎麼破?
本文節選自霍格沃茲測試學院內部教材
要定位一個元素時,怎麼都定位不到的時候就要考慮是不是瀏覽器內嵌了一個 frame 視窗或者要找的元素在新開啟的窗口裡。這時候就需要進行 frame
的切換或者視窗的切換。
frame 類似於在原有主 HTML 的基礎上又巢狀一個 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
-
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"))
iframe切換回預設頁面
在 driver.switch_to.frame()
之後,如果還想操作原頁面,則可以使用
driver.switch_to.default_content()
iframe多層切換
{: width="50%"}
如圖所示多層巢狀的 iframe 從最外部 iframe 切換到 iframe2 則需要層層切換
driver.switch_to.frame("iframe1")driver.switch_to.frame("iframe2")
從 iframe2 切換回 iframe1 可以使用父子切換
# 從 iframe2 切換到上一級 iframe1 driver.switch_to.parent_frame()# 從 iframe1 切換到上一級 iframe,如果 iframe 已經是最上級,則保持不變driver.switch_to.parent_frame()
這個方法是 Selenium 提供的直接從子 frame 切換到父 frame,可以使用在巢狀的 frame 框架中。
多視窗處理
元素有屬性,瀏覽器的視窗其實也有屬性的,瀏覽器視窗的屬性用控制代碼(handle)來識別。
當瀏覽器開啟一個視窗時,如果要在新的視窗操作就需要控制代碼切換。
控制代碼的獲取
當有多個視窗時,可以用 window_handles 列印控制代碼:
>>> browser = webdrver.Chrome()>>> handles = browser.window_handles>>> handles
打印出的 window_handles:
['CDwindow-8012E9EF4DC788A58DC1588E7B8A7C44', 'CDwindow-11D52927C71E7C2B9984F2D1E2856049']
控制代碼的切換
通過列印 handles 可以看出,它是一個列表,那麼就可以通過 switch_to.window()
來切換控制代碼
從上面原始碼中的說明可以看出,switch_to.window()
需要提供一個 windows_name,可以是 name 也可以是 windows
handle。
from selenium import webdriver
browser = webdriver.Chrome()handles = browser.window_handlesprint(handles)browser.switch_to.window(handles[-1])
這裡唯一要注意的是 handles[-1]
是一個列表,這裡的 -1 表示瀏覽器視窗的倒數第一個。
實戰案例
百度搜索“霍格沃茲測試學院”,點選“霍格沃茲測試學院_騰訊課堂”,點選“中高階測試開發「名企定向培養」班-霍格沃茲測試學院”。
程式碼示例:
* * * * * * * * * * * * * * * * * * * * * * * *
from selenium import webdriver
class TestHogwarts: def setup_method(self, method): self.driver = webdriver.Chrome() self.driver.implicitly_wait(3)
def teardown_method(self, method): self.driver.quit()
def test_hogwarts(self): self.driver.get('https://www.baidu.com') #在輸入框中輸入霍格沃茲測試學院 self.driver.find_element_by_id('kw').send_keys('霍格沃茲測試學院') #點選搜尋 self.driver.find_element_by_css_selector('.s_btn').click() #使用link_text點選 self.driver.find_element_by_link_text('霍格沃茲測試學院_騰訊課堂').click() #將獲取到的window_handles賦值給一個變數handles handles = self.driver.window_handles #切換控制代碼 self.driver.switch_to.window(handles[-1]) assert len(self.driver.find_elements_by_css_selector('.ag-title-main')) == 1
在做Web自動化的時候,網頁中 frame 的定位以及多視窗處理,小夥伴們學會了嗎?今天就先講到這裡啦,大家還想看什麼內容的文章也可以留言告訴我們哦!
** 推薦學習**
內容全面升級,4 個月 20+ 專案實戰強化訓練,資深測試架構師、開源專案作者親授 BAT 大廠前沿最佳實踐,
帶你一站式掌握測試開發必備核心技能( 對標阿里P6+,年薪50W+ )! 直推 BAT 名企測試經理,普遍漲薪 50%+!
⬇️ 點選“閱讀原文”,提升測試核心競爭力!
閱讀原文