在做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)
小伙伴们,看完后记得去自己实际操作操作,这样才能更加的熟能生巧