Sparkle CodesSparkle
项目 / web测试 / Day06

多维交互:浏览器弹窗处理与多窗口管理

x
xpx
Jun 17, 2024
Editorial Insight
#Automation#Locators#Selenium

跨越边界:原生弹窗与多窗口切换指南

在 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)」。

核心操作流程

  1. 获取当前句柄: now_win = driver.current_window_handle
  2. 获取所有句柄: all_wins = driver.window_handles (列表形式)
  3. 切换窗口: driver.switch_to.window(handle_id)
  4. 开启新窗口 (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. 最佳实践提示

  1. 忘记切换句柄: 如果关闭新窗口后不切回原句柄,后续操作会抛出 NoSuchWindowException。
  2. Alert 抢占: 当原生 Alert 出现时,必须先处理它,否则无法操作页面其他任何元素。
  3. 截图命名: 建议截图文件名包含时间戳,防止在多次回归中被覆盖。

继续阅读: Web自动化-鼠标键盘模拟与滚动机制

BACK TO BLOG
The End of Interaction