跨越边界:原生弹窗与多窗口切换指南
在 Web 自动化中,不仅需要处理页面内部的 HTML 元素,还经常需要应对浏览器级别的「窗口」与「弹窗」挑战。
1. JavaScript 原生弹窗 (Alerts)
原生弹窗是由浏览器直接控制的,不属于 DOM 树的一部分,无法通过 常规 ID/XPath 定位。
如何判断是 Alert 还是普通 Div?
- 普通 Div 弹窗: F12 检查器能看到代码,有 CSS 样式,属于 DOM。
- 原生 Alert: 弹出时浏览器变灰(无法操作背景),且 F12 指针无法选中该框体。
操作代码
PYTHON
# 1. 切换到弹窗上下文
alert = driver.switch_to.alert
# 2. 常用动作
alert.accept() # 点击“确定” (OK)
alert.dismiss() # 点击“取消” (Cancel)
text = alert.text # 获取弹窗显示的文本
alert.send_keys("Hello") # 向 Prompt 输入文字(Chrome 有时不回显,但会提交)
2. 多窗口与标签页管理
当点击链接打开新标签页时,WebDriver 的焦点依然停留在原窗口。你需要手动「切换句柄 (Handle)」。
核心操作流程
- 获取当前句柄:
now_win = driver.current_window_handle - 获取所有句柄:
all_wins = driver.window_handles(列表形式) - 切换窗口:
driver.switch_to.window(handle_id) - 开启新窗口 (Selenium 4+):
driver.switch_to.new_window('tab')或'window'
实战:循环切换到最后一个窗口
PYTHON
all_wins = driver.window_handles
for win in all_wins:
if win != now_win:
driver.switch_to.window(win)
break
# 此时焦点已移至新窗口
3. 浏览器窗口管理 (Window Management)
除了内容交互,你还可以精准控制浏览器的物理属性。
- 尺寸控制:
driver.maximize_window()(最大化)driver.set_window_size(1024, 768)
- 位置控制:
driver.get_window_position()driver.set_window_position(0, 0)
- 视觉留存 (截图):
- 全页截图:
driver.save_screenshot('./page.png') - 元素截图:
element.screenshot('./element.png')
- 全页截图:
4. 最佳实践提示
- 忘记切换句柄: 如果关闭新窗口后不切回原句柄,后续操作会抛出
NoSuchWindowException。 - Alert 抢占: 当原生 Alert 出现时,必须先处理它,否则无法操作页面其他任何元素。
- 截图命名: 建议截图文件名包含时间戳,防止在多次回归中被覆盖。
继续阅读: Web自动化-鼠标键盘模拟与滚动机制