在做web自動化的時候,經常會遇到點擊一個元素彈出了一個新的窗口,我們需要進入到新的窗口中,進行自動化操作,那么我們如何跳轉到新的窗口上呢?
切換新窗口
在瀏覽器上遇到新的窗口打開的時候,因為腳本不知道我們想要跳轉到那個窗口上,先獲取全部窗口信息,然后進行選擇窗口進行跳轉,這里窗口是通過句柄的方法進行識別的。這里就用到了selenium中的3個方法,獲取當前窗口句柄的方法,和獲取全部窗窗口句柄的方法,以及跳轉到窗口句柄的方法
獲取當前窗口句柄
通過方法: current_window_handle
源碼:
@property def current_window_handle(self): """ Returns the handle of the current window. :Usage: driver.current_window_handle """ if self.w3c: return self.execute(Command.W3C_GET_CURRENT_WINDOW_HANDLE)['value'] else: return self.execute(Command.GET_CURRENT_WINDOW_HANDLE)['value']
獲取全部窗口句柄
通過方法: window_handles
執行完結果為列表顯示內容,最后一個彈出框為最后一個。
源碼:
@property def window_handles(self): """ Returns the handles of all windows within the current session. :Usage: driver.window_handles """ if self.w3c: return self.execute(Command.W3C_GET_WINDOW_HANDLES)['value'] else: return self.execute(Command.GET_WINDOW_HANDLES)['value']
跳轉到對應的窗口
如何查看窗口的句柄已經了解到了,如何跳轉到對應的句柄上呢?我們可以通過方法 switch_to.window()
switch_to_window()和前面說的iframe方法一樣,官方不推薦使用,我們可以通過switch_to.window()方法來操作
源碼:
def switch_to_window(self, window_name): """ Deprecated use driver.switch_to.window """ warnings.warn("use driver.switch_to.window instead", DeprecationWarning, stacklevel=2) self._switch_to.window(window_name)
通過上面的小案例發現,已經從百度跳轉到了博客園的窗口上。這里有點問題,如果當前已經有2個窗口了,我們通過下標1就不能跳轉到最新的窗口上,我們可以通過下標-1的方法,每次都找最后一個,這里最好一個總是新的窗口
通過顯示等待判斷窗口是否出現
我們可以通過顯示等待的方法加上判斷窗口是否出現的方法進行來減少我們的運行時間和避免運行錯誤。
判斷窗口出現方法前面有 new_window_is_opened() 寫過這里需要穿的參數是窗口的數量,通過判斷窗口是否增加
源碼:
class new_window_is_opened(object): """ An expectation that a new window will be opened and have the number of windows handles increase""" def __init__(self, current_handles): self.current_handles = current_handles def __call__(self, driver): return len(driver.window_handles) > len(self.current_handles)
小伙伴們,看完后記得去自己實際操作操作,這樣才能更加的熟能生巧