在做web自动化的时候,经常会遇到点击一个元素弹出了一个新的窗口,我们需要进入到新的窗口中,进行自动化操作,那么我们如何跳转到新的窗口上呢?
切换新窗口
在浏览器上遇到新的窗口打开的时候,因为脚本不知道我们想要跳转到那个窗口上,先获取全部窗口信息,然后进行选择窗口进行跳转,这里窗口是通过句柄的方法进行识别的。这里就用到了selenium中的3个方法,获取当前窗口句柄的方法,和获取全部窗窗口句柄的方法,以及跳转到窗口句柄的方法
获取当前窗口句柄
通过方法: current_window_handle
from selenium import webdriver driver = webdriver.Chrome() driver.get("https://www.baidu.com") driver.find_element_by_id("kw").send_keys("博客园") driver.find_element_by_id("su").click() handle = driver.current_window_handle print(handle) CDwindow-C439E20E72721D85DBAD47EEF83BD6CD
获取全部窗口句柄
通过方法: window_handles
执行完结果为列表显示内容,最后一个弹出框为最后一个。
import time from selenium import webdriver driver = webdriver.Chrome() driver.get("https://www.baidu.com") driver.find_element_by_id("kw").send_keys("博客园") driver.find_element_by_id("su").click() handle = driver.current_window_handle print(handle) time.sleep(2) driver.find_element_by_xpath("//*[contains(text(),'开发者的网上家园')]").click() time.sleep(2) handles = driver.window_handles print(handles)
['CDwindow-0EFAD51458B9F6FEE8A46AA3DB578317', 'CDwindow-3197BFABC1F3E841CB3F2E65E388AB4E']
跳转到对应的窗口
如何查看窗口的句柄已经了解到了,如何跳转到对应的句柄上呢?我们可以通过方法 switch_to.window()
switch_to_window()和前面说的iframe方法一样,官方不推荐使用,我们可以通过switch_to.window()方法来操作
import time from selenium import webdriver driver = webdriver.Chrome() driver.get("https://www.baidu.com") driver.find_element_by_id("kw").send_keys("博客园") driver.find_element_by_id("su").click() #打印当前窗口的句柄 handle = driver.current_window_handle print(handle) time.sleep(2) driver.find_element_by_xpath("//*[contains(text(),'开发者的网上家园')]").click() time.sleep(2) # 打印当前全部窗口的句柄 handles = driver.window_handles print(handles) # 跳转到对应的窗口 driver.switch_to.window(handles[-1]) #打印当前窗口的句柄 ha = driver.current_window_handle print(ha) print(driver.title) 博客园 - 开发者的网上家园
通过显示等待判断窗口是否出现
我们可以通过显示等待的方法加上判断窗口是否出现的方法进行来减少我们的运行时间和避免运行错误。
判断窗口出现方法前面有 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)
小伙伴们,看完后记得去自己