來源:SegmentFault 思否社區
作者:Leofighting
在瀏覽網頁的時候,有時點擊一個連結或者按鈕,會彈出一個新的窗口。
使用 Selenium 進行 Web 自動化測試,如果彈出新窗口時,沒有對窗口進行切換,那麼,WebDriver 對象 的焦點對應的,依然是舊窗口,後續的自動化操作,將繼續在舊窗口中進行。
實例驗證:
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
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 返回的是一個列表,所以,可以通過列表下標來更換當前瀏覽器的窗口句柄,來實現窗口的自由切換:
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 思否社區和文章作者展開更多互動和交流。