Skip to content

Latest commit

 

History

History
123 lines (96 loc) · 3.55 KB

dialogs.md

File metadata and controls

123 lines (96 loc) · 3.55 KB
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

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 [method: Dialog.accept] or [method: Dialog.dismiss] it.

page.on('dialog', dialog => dialog.accept());
await page.locator('button').click();
page.onDialog(dialog -> dialog.accept());
page.locator("button").click();
page.on("dialog", lambda dialog: dialog.accept())
await page.locator("button".click())
page.on("dialog", lambda dialog: dialog.accept())
page.locator("button").click()
page.Dialog += (_, dialog) => dialog.AcceptAsync();
await page.Locator("button").ClickAsync();

:::note [event: Page.dialog] listener must handle the dialog. Otherwise your action will stall, be it [method: Locator.click] 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:

:::warning WRONG! :::

page.on('dialog', dialog => console.log(dialog.message()));
await page.locator('button').click(); // Will hang here
page.onDialog(dialog -> System.out.println(dialog.message()));
page.locator("button").click(); // Will hang here
page.on("dialog", lambda dialog: print(dialog.message))
await page.locator("button").click() # Will hang here
page.on("dialog", lambda dialog: print(dialog.message))
page.locator("button").click() # Will hang here
page.Dialog += (_, dialog) => Console.WriteLine(dialog.Message);
await page.Locator("button").ClickAsync(); // Will hang here

:::note If there is no listener for [event: Page.dialog], all dialogs are automatically dismissed. :::

beforeunload dialog

When [method: Page.close] is invoked with the truthy [option: runBeforeUnload] value, the 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 });
page.onDialog(dialog -> {
  assertEquals("beforeunload", dialog.type());
  dialog.dismiss();
});
page.close(new Page.CloseOptions().setRunBeforeUnload(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)
page.Dialog += (_, dialog) =>
{
    Assert.AreEqual("beforeunload", dialog.Type);
    dialog.DismissAsync();
};
await page.CloseAsync(runBeforeUnload: true);