1. 程式人生 > 其它 >Selenium | 頁面跳轉後無法定位到元素,怎麼破?

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%+!

⬇️ 點選“閱讀原文”,提升測試核心競爭力!

閱讀原文