You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Playwright中获取dialog.message并通过pytest进行断言

问题场景

在Playwright+Pytest的测试任务中,需要捕获浏览器对话框的消息并完成断言验证。目前已实现对话框处理器,但无法将dialog.message传递到测试函数中进行断言。现有代码如下:

对话框处理器:

def dialog_handle(dialog):
    message = dialog.message
    dialog.dismiss()

测试用例:

from playwright.sync_api import Page

def dialog_handle(dialog):
    message = dialog.message
    dialog.dismiss()

def test_dialog(page):
    page.goto('https://dialog.antonzimaiev.repl.co')
    page.on('dialog', dialog_handle)
    page.get_by_role("button", name="Диалог Alert").click()
解决方案

以下三种方法可实现对话框消息的捕获与断言:

方法一:全局变量快速实现

通过全局变量存储捕获的消息,测试函数中直接读取并断言。注意每次测试前重置变量,避免用例间状态污染。

from playwright.sync_api import Page

captured_dialog_message = None

def dialog_handle(dialog):
    global captured_dialog_message
    captured_dialog_message = dialog.message
    dialog.dismiss()

def test_dialog(page):
    global captured_dialog_message
    captured_dialog_message = None  # 重置状态
    page.goto('https://dialog.antonzimaiev.repl.co')
    page.on('dialog', dialog_handle)
    page.get_by_role("button", name="Диалог Alert").click()
    # 执行断言
    assert captured_dialog_message == "这里填写预期的对话框消息"

方法二:闭包捕获变量(无全局变量)

利用Python闭包特性,在测试函数内部定义处理器,直接捕获消息变量,避免全局变量的副作用。

from playwright.sync_api import Page

def test_dialog(page):
    captured_message = None

    def dialog_handle(dialog):
        nonlocal captured_message
        captured_message = dialog.message
        dialog.dismiss()

    page.goto('https://dialog.antonzimaiev.repl.co')
    page.on('dialog', dialog_handle)
    page.get_by_role("button", name="Диалог Alert").click()
    assert captured_message == "这里填写预期的对话框消息"

方法三:Playwright官方推荐方式(wait_for_event)

使用page.expect_dialog()方法等待对话框事件,直接获取dialog对象,流程更可靠,无需额外绑定处理器,是Playwright官方推荐的实现方式。

from playwright.sync_api import Page, expect

def test_dialog(page):
    page.goto('https://dialog.antonzimaiev.repl.co')
    # 点击按钮前先等待对话框事件
    with page.expect_dialog() as dialog_info:
        page.get_by_role("button", name="Диалог Alert").click()
    dialog = dialog_info.value
    dialog.dismiss()
    # 基础断言
    assert dialog.message == "这里填写预期的对话框消息"
    # 或使用Playwright风格的expect断言
    expect(dialog).to_have_message("这里填写预期的对话框消息")
方法对比
  • 全局变量:实现简单,但易受多测试用例的状态污染,需手动重置。
  • 闭包:无全局变量问题,代码更干净,适合单个或少量测试用例。
  • wait_for_event:官方推荐,时序控制更可靠,避免异步场景下的捕获失败,代码简洁易维护。

内容的提问来源于stack exchange,提问作者Egor

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 23:35:18