Selenium 窗口切換

2020-08-06     segmentfault官方

原標題:Selenium 窗口切換

來源:SegmentFault 思否社區

作者:Leofighting

在瀏覽網頁的時候,有時點擊一個連結或者按鈕,會彈出一個新的窗口。

使用 Selenium 進行 Web 自動化測試,如果彈出新窗口時,沒有對窗口進行切換,那麼,WebDriver 對象 的焦點對應的,依然是舊窗口,後續的自動化操作,將繼續在舊窗口中進行。

實例驗證:

# 模擬場景:打開百度,點擊左上角「視頻」連結,列印出當前`WebDriver 對象` 對應的窗口信息 from selenium import webdriver from time import sleep

driver = webdriver.Chrome # 打開瀏覽器driver.maximize_window # 瀏覽器最大化driver.get("https://www.baidu.com/") # 跳轉至百度首頁sleep(1)element = driver.find_element_by_xpath("//div[@id='s-top-left']/a[4]") # 定位「視頻」元素element.click # 點擊sleep(1)print(driver.title) # 百度一下,你就知道print(driver.current_url) # https://www.baidu.com/

driver.quit # 關閉瀏覽器

根據程序的列印結果可知,窗口依然停留在百度首頁,當前的 url :https://www.baidu.com/,由此可推斷,Selenium 沒有按照我們預期那樣,自動切換到新的窗口。

考慮到後續的操作步驟都需要在新窗口進行,就需要對進行窗口切換,Selenium 提供的窗口切換方法是:

WebDriver.switch_to.window

WebDriver 對象有 window_handles 屬性,返回一個列表,裡面記錄了當前瀏覽器所有的窗口句柄。

句柄:對應窗口的 id

# 獲取當前瀏覽器上所有窗口句柄from selenium import webdriverfrom time import sleep

driver = webdriver.Chrome # 打開瀏覽器driver.get("https://www.baidu.com/") # 跳轉至百度首頁sleep(1)element = driver.find_element_by_xpath("//div[@id='s-top-left']/a[4]") # 定位「視頻」元素element.click # 點擊sleep(1)print(driver.current_window_handle) # 當前瀏覽器句柄:CDwindow-1FABF3D9B0B190F9883E66F25481738Eprint(driver.window_handles) # 獲取所有句柄:['CDwindow-1FABF3D9B0B190F9883E66F25481738E', 'CDwindow-0871993F618FDBE540426562AEA2FB32']for handle in driver.window_handles:print(handle)

driver.quit # 關閉瀏覽器

因為 window_handles 返回的是一個列表,所以,可以通過列表下標來更換當前瀏覽器的窗口句柄,來實現窗口的自由切換:

# 模擬場景:通過百度首頁,打開 hao123,再通過 hao123 點擊京東,進入京東首頁,搜索「筆記本電腦」from selenium import webdriverfrom time import sleep

driver = webdriver.Chrome # 打開瀏覽器driver.get("https://www.baidu.com/") # 跳轉至百度首頁sleep(1)element = driver.find_element_by_xpath("//div[@id='s-top-left']/a[2]") # 定位「hao123」元素element.click # 點擊sleep(1)windows1 = driver.window_handles # 獲取所有窗口句柄print(windows1) # 列印句柄列表print(driver.current_window_handle) # 列印切換前的句柄driver.switch_to.window(windows1[-1]) # 切換到最後一個句柄print(driver.current_window_handle) # 列印切換後的句柄element1 = driver.find_element_by_xpath("//li[@data-id='11']//a[1]") # 在 hao123 定位 京東element1.click # 點擊windows2 = driver.window_handles # 第二次獲取所有窗口句柄print(windows2) # 列印句柄列表print(driver.current_window_handle) # 列印切換前的句柄driver.switch_to.window(windows2[-1]) # 第二次切換到最後一個句柄print(driver.current_window_handle) # 列印切換後的句柄element2 = driver.find_element_by_xpath("//input[@aria-label='搜索']") # 定位搜索輸入框element2.send_keys("筆記本電腦") # 輸入內容element3 = driver.find_element_by_class_name("button") # 定位搜索按鈕element3.click # 點擊sleep(3)

driver.quit # 關閉瀏覽器

通過這個實例操作,可以看到,每一次切換窗口,都需要對獲取到最新的句柄位置。

同樣,由於 WebDriver.window_handles 返回的是一個列表,也可以通過下標值來切換到舊的窗口。

總結

SegmentFault 思否社區和文章作者展開更多互動和交流。

文章來源: https://twgreatdaily.com/zh-mo/eiNfxXMBLq-Ct6CZ9kTu.html

Flutter 知識點

2020-08-10