对话框
Playwright 可以与网页对话框进行交互,例如 alert、confirm、prompt 以及 beforeunload 确认。
alert(), confirm(), prompt() dialogs
默认情况下,Playwright 会自动关闭对话框,因此您不必处理它们。但是,您可以在触发对话框的操作之前注册对话框处理程序,以 dialog.accept(**kwargs) 或 dialog.dismiss() 它。
- Sync
- Async
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())
note
page.on("dialog") 监听器 必须处理 对话框。否则您的操作将停滞,无论是 locator.click(**kwargs) 还是其他操作。这是因为 Web 中的对话框是模态的,因此在处理它们之前会阻止进一步的页面执行。
因此,以下代码片段将永远不会解析:
danger
错误!
- Sync
- Async
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
note
如果没有 page.on("dialog") 的监听器,所有对话框都会自动关闭。
beforeunload dialog
当使用真值 run_before_unload 调用 page.close(**kwargs) 时,页面将运行其卸载处理程序。这是 page.close(**kwargs) 不等待页面实际关闭的唯一情况,因为页面可能在操作结束时保持打开状态。
您可以注册一个对话框处理程序来自己处理 beforeunload 对话框:
- Sync
- Async
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)