跳到主要内容

对话框

介绍

Playwright 可以与网页对话框进行交互,例如 alertconfirmprompt 以及 beforeunload 确认。对于打印对话框,请参见 Print

alert(), confirm(), prompt() 对话框

默认情况下,Playwright 会自动关闭对话框,因此您无需手动处理它们。但是,您可以在触发对话框的操作之前注册一个对话框处理程序,以dialog.accept()dialog.dismiss() 对话框。

page.on("dialog", lambda dialog: dialog.accept())
page.get_by_role("button").click()
备注

page.on("dialog") 监听器必须处理对话框。否则您的操作将会挂起,无论是 locator.click() 还是其他操作。这是因为 Web 中的对话框是模态的,因此在处理之前会阻止页面继续执行。

结果是,以下代码段将永远不会解析:

注意

错误!

page.on("dialog", lambda dialog: print(dialog.message))
page.get_by_role("button").click() # 将在此处挂起
备注

如果没有 page.on("dialog") 的监听器,则所有对话框都会自动关闭。

beforeunload 对话框

当调用 page.close() 并传入为真的 run_before_unload 值时,页面会运行其卸载处理程序。这是唯一一种 page.close() 不等待页面实际关闭的情况,因为在操作结束时页面可能会保持打开状态。

您可以注册一个对话框处理程序来自己处理 beforeunload 对话框:

def handle_dialog(dialog):
assert dialog.type == 'beforeunload'
dialog.dismiss()

page.on('dialog', lambda: handle_dialog)
page.close(run_before_unload=True)

打印对话框

为了断言通过 window.print 触发了打印对话框,您可以使用以下代码片段:

page.goto("<url>")

page.evaluate("(() => {window.waitForPrintDialog = new Promise(f => window.print = f);})()")
page.get_by_text("打印它!").click()

page.wait_for_function("window.waitForPrintDialog")

这将在点击按钮后等待打印对话框打开。请确保在点击按钮之前评估脚本 / 页面加载后评估脚本。