Dialogs
Playwright can interact with the web page dialogs such as alert
, confirm
, prompt
as well as beforeunload
confirmation.
alert(), confirm(), prompt() dialogs
By default, dialogs are auto-dismissed by Playwright, so you don't have to handle them. However, you can register a dialog handler before the action that triggers the dialog to either dialog.accept(**kwargs) or dialog.dismiss() it.
- 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())
page.on("dialog") listener must handle the dialog. Otherwise your action will stall, be it locator.click(**kwargs) or something else. That's because dialogs in Web are modals and therefore block further page execution until they are handled.
As a result, the following snippet will never resolve:
WRONG!
- 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
If there is no listener for page.on("dialog"), all dialogs are automatically dismissed.
beforeunload dialog
When page.close(**kwargs) is invoked with the truthy run_before_unload
value, the page runs its unload handlers. This is the only case when page.close(**kwargs) does not wait for the page to actually close, because it might be that the page stays open in the end of the operation.
You can register a dialog handler to handle the beforeunload
dialog yourself:
- 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)