在自动化过程中,经常会遇到点击链接后新窗口 / 新标签页打开的情况。如果不切换窗口直接操作,很容易报错:

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 再切窗口)

添加微信