playwright/docs/src/dialogs.md

2.5 KiB

id title
dialogs Dialogs

Playwright can interact with the web page dialogs such as alert, confirm, prompt as well as beforeunload confirmation.

alert(), confirm(), prompt() dialogs

You can register a dialog handler before the action that triggers the dialog to accept or decline it.

page.on('dialog', dialog => dialog.accept());
await page.click('button');
page.on("dialog", lambda dialog: dialog.accept())
await page.click("button")
page.on("dialog", lambda dialog: dialog.accept())
page.click("button")

:::note If your action, be it [method: Page.click], [method: Page.evaluate] or any other, results in a dialog, the action will stall until the dialog is handled. That's because dialogs in Web are modal and block further page execution until they are handled. :::

As a result, following snippet will never resolve:

:::warn WRONG! :::

await page.click('button'); // Will hang here
page.on('dialog', dialog => dialog.accept())

:::warn WRONG! :::

await page.click("button") # Will hang here
page.on("dialog", lambda dialog: dialog.accept())
page.click("button") # Will hang here
page.on("dialog", lambda dialog: dialog.accept())

API reference

  • [Dialog]
  • [method: Dialog.accept]
  • [method: Dialog.dismiss]

beforeunload dialog

When [method: Page.close] is invoked with the truthy [option: runBeforeUnload] value, it page runs its unload handlers. This is the only case when [method: Page.close] 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:

page.on('dialog', async dialog => {
  assert(dialog.type() === 'beforeunload');
  await dialog.dismiss();
});
await page.close({runBeforeUnload: 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)
def handle_dialog(dialog):
    assert dialog.type == 'beforeunload'
    dialog.dismiss()

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