对话框
简介
Playwright 可以与网页对话框(如 alert、confirm、prompt 以及 beforeunload 确认框)进行交互。有关打印对话框的内容,请参阅 打印。
alert()、confirm()、prompt() 对话框
默认情况下,Playwright 会自动关闭对话框,因此您无需手动处理它们。不过,您可以在触发对话框的操作之前注册一个对话框处理程序,以执行 dialog.accept()(接受)或 dialog.dismiss()(关闭)。
- 同步
- 异步
page.on("dialog", lambda dialog: dialog.accept())
page.get_by_role("button").click()
page.on("dialog", lambda dialog: dialog.accept())
await page.get_by_role("button".click())
注意
page.on("dialog") 监听器必须处理对话框。否则,您的操作(无论是 locator.click() 还是其他操作)将会挂起。这是因为网页中的对话框是模态的,在处理之前会阻塞页面的后续执行。
因此,以下代码片段将永远不会解决
警告
错误!
- 同步
- 异步
page.on("dialog", lambda dialog: print(dialog.message))
page.get_by_role("button").click() # Will hang here
page.on("dialog", lambda dialog: print(dialog.message))
await page.get_by_role("button").click() # Will hang here
注意
如果没有为 page.on("dialog") 设置监听器,则所有对话框都会被自动关闭。
beforeunload 对话框
当调用 page.close() 并将 run_before_unload 设置为真值(truthy)时,页面会运行其卸载(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)
async def handle_dialog(dialog):
assert dialog.type == 'beforeunload'
await dialog.dismiss()
page.on('dialog', lambda: handle_dialog)
await 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("Print it!").click()
page.wait_for_function("window.waitForPrintDialog")
await page.goto("<url>")
await page.evaluate("(() => {window.waitForPrintDialog = new Promise(f => window.print = f);})()")
await page.get_by_text("Print it!").click()
await page.wait_for_function("window.waitForPrintDialog")
这将等待在点击按钮后打开打印对话框。请确保在点击按钮之前/页面加载后评估脚本。