Selenium 窗口切換
來源:SegmentFault 思否社區(qū)
作者:Leofighting
在瀏覽網頁的時候,有時點擊一個鏈接或者按鈕,會彈出一個新的窗口。
使用 Selenium 進行 Web 自動化測試,如果彈出新窗口時,沒有對窗口進行切換,那么,WebDriver 對象?的焦點對應的,依然是舊窗口,后續(xù)的自動化操作,將繼續(xù)在舊窗口中進行。
實例驗證:
# 模擬場景:打開百度,點擊左上角“視頻”鏈接,打印出當前`WebDriver 對象` 對應的窗口信息from selenium import webdriverfrom time import sleepdriver = webdriver.Chrome() # 打開瀏覽器driver.maximize_window() # 瀏覽器最大化driver.get("https://www.baidu.com/") # 跳轉至百度首頁sleep(1)element = driver.find_element_by_xpath("http://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 沒有按照我們預期那樣,自動切換到新的窗口。
考慮到后續(xù)的操作步驟都需要在新窗口進行,就需要對進行窗口切換,Selenium 提供的窗口切換方法是:
WebDriver.switch_to.window()
WebDriver 對象有 window_handles 屬性,返回一個列表,里面記錄了當前瀏覽器所有的窗口句柄。
句柄:對應窗口的 id
# 獲取當前瀏覽器上所有窗口句柄from selenium import webdriverfrom time import sleepdriver = webdriver.Chrome() # 打開瀏覽器driver.get("https://www.baidu.com/") # 跳轉至百度首頁sleep(1)element = driver.find_element_by_xpath("http://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 返回的是一個列表,所以,可以通過列表下標來更換當前瀏覽器的窗口句柄,來實現(xiàn)窗口的自由切換:
# 模擬場景:通過百度首頁,打開 hao123,再通過 hao123 點擊京東,進入京東首頁,搜索“筆記本電腦”from selenium import webdriverfrom time import sleepdriver = webdriver.Chrome() # 打開瀏覽器driver.get("https://www.baidu.com/") # 跳轉至百度首頁sleep(1)element = driver.find_element_by_xpath("http://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("http://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("http://input[@aria-label='搜索']") # 定位搜索輸入框element2.send_keys("筆記本電腦") # 輸入內容element3 = driver.find_element_by_class_name("button") # 定位搜索按鈕element3.click() # 點擊sleep(3)driver.quit() # 關閉瀏覽器
通過這個實例操作,可以看到,每一次切換窗口,都需要對獲取到最新的句柄位置。
同樣,由于 WebDriver.window_handles 返回的是一個列表,也可以通過下標值來切換到舊的窗口。
總結


評論
圖片
表情
