多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
[TOC] ## 4.10 多窗口切换 在页面操作过程中,有时单击某个链接会弹出新的窗口,这时就需要切换到新打开的 窗口中进行操作。WebDriver 提供的 switch_to.window()方法可以实现在不同的窗口间切换。 * current_window_handle:获得当前窗口句柄。 * window_handles:返回所有窗口的句柄到当前会话。 * switch_to.window():切换到相应的窗口。 以百度首页和账号注册页为例,在两个窗口之间的切换如图 4-4 所示。 ![](https://img.kancloud.cn/15/d3/15d36278f08550e0a41edd0101aefc47_1032x755.png) :-: 图 4-4 在两个窗口之间的切换 ``` from selenium import webdriver from time import sleep driver = webdriver.Chrome() driver.implicitly_wait(10) driver.get("https://www.baidu.com") # 获取百度搜索窗口句柄 search_windows = driver.current_window_handle driver.find_element_by_link_text("登录").click() driver.find_element_by_link_text("立即注册").click() # 获取当前所有打开的窗口句柄 all_handles = driver.window_handles # 进入注册窗口 for handle in all_handles: if handle != search_windows: driver.switch_to.window(handle) print(driver.title) driver.find_element_by_name("userName").send_keys("username") driver.find_element_by_name("phone").send_keys("136xxxxxx") sleep(2) # 关闭当前窗口 driver.close() # 回到搜索窗口 driver.switch_to.window(search_windows) print(driver.title) driver.quit() ``` 脚本的执行过程:首先打开百度首页,通过 current_window_handle 获得当前窗口句柄,并赋值给变量 search_handle。接着打开登录弹窗,在登录弹窗上单击“立即注册”链接,从而打开新的注册窗口。通过 window_handles 获得当前所有窗口句柄(包含百度首页和账号注册页),并赋值给变量 all_handles。 循环遍历 all_handles,如果 handle 不等于 search_handle,那么一定是注册窗口,因为在脚本执行过程中只打开了两个窗口。然后,通过 switch_to.window()切换到账号注册页。