在自动化过程中,经常会遇到点击链接后新窗口 / 新标签页打开的情况。如果不切换窗口直接操作,很容易报错:
selenium.common.exceptions.NoSuchElementException
本文总结 Selenium 中处理多窗口 / 多标签页的基本方式。
🧠 场景描述
例如你点击一个按钮,它在新标签页中打开一个详情页面,此时 driver
还停留在原窗口:
driver.find_element(By.LINK_TEXT, "查看详情").click()
此时如果不切换窗口,就无法定位新页面中的元素。
🛠 方法一:切换到最新打开的窗口
# 获取所有窗口句柄
handles = driver.window_handles
# 切换到最后一个窗口
driver.switch_to.window(handles[-1])
📌 通常点击新链接后,新窗口会在句柄列表最后一个。
🛠 方法二:根据标题判断目标窗口
for handle in driver.window_handles:
driver.switch_to.window(handle)
if "目标页面标题" in driver.title:
break
📌 比较稳妥,适用于多个窗口同时存在的场景。
🛠 方法三:记录原窗口 + 切换回来
# 记录当前窗口句柄
main_window = driver.current_window_handle
# 点击打开新窗口
driver.find_element(By.LINK_TEXT, "查看详情").click()
# 等待新窗口打开
WebDriverWait(driver, 10).until(lambda d: len(d.window_handles) > 1)
# 切换到新窗口
for handle in driver.window_handles:
if handle != main_window:
driver.switch_to.window(handle)
break
# 操作新窗口内容
driver.find_element(By.ID, "download-btn").click()
# 关闭新窗口并切回原窗口
driver.close()
driver.switch_to.window(main_window)
🧨 踩坑提醒
问题 | 解决方案 |
---|---|
新窗口未加载完成 | 加 WebDriverWait 等待句柄变多 |
不知道当前在哪个窗口 | 用 driver.current_window_handle 对比 |
操作新窗口失败 | 没有 switch_to.window() |
操作完新窗口未关闭 | driver.close() 关闭当前窗口即可 |
🧼 小结
- 使用
driver.window_handles
获取所有窗口 - 使用
driver.switch_to.window(handle)
切换句柄 - 切换前记得保存当前窗口
driver.current_window_handle
- 多窗口切换后必须确保元素已加载
📌 延伸建议
- 多窗口之间数据传递的自动化(如表单提交后跳转)
- 多标签页与 iframe 混用的场景(需先
switch_to.frame
再切窗口)