跳至主要内容

对话框

简介

Playwright 可以与网页对话框交互,例如 alertconfirmprompt 以及 beforeunload 确认对话框。关于打印对话框,请参阅 Print

alert(), confirm(), prompt() 对话框

默认情况下,对话框会被Playwright自动关闭,因此您无需手动处理。不过,您可以在触发对话框的操作之前注册一个对话框处理程序,以选择Dialog.AcceptAsync()Dialog.DismissAsync()它。

Page.Dialog += async (_, dialog) =>
{
await dialog.AcceptAsync();
};
await Page.GetByRole(AriaRole.Button).ClickAsync();
note

Page.Dialog 监听器必须处理对话框。否则您的操作将会停滞,无论是Locator.ClickAsync()还是其他操作。这是因为网页中的对话框是模态的,因此会阻止页面继续执行,直到它们被处理。

因此,以下代码片段将永远不会解析完成:

warning

错误!

page.Dialog += (_, dialog) => Console.WriteLine(dialog.Message);
await page.GetByRole(AriaRole.Button).ClickAsync(); // Will hang here
note

如果没有为Page.Dialog设置监听器,所有对话框将自动被关闭。

beforeunload 对话框

当调用Page.CloseAsync()并传入真值RunBeforeUnload时,页面会执行其卸载处理程序。这是唯一一种Page.CloseAsync()不会等待页面实际关闭的情况,因为在操作结束时页面可能仍然保持打开状态。

您可以注册一个对话框处理程序来自行处理beforeunload对话框:

Page.Dialog += async (_, dialog) =>
{
Assert.AreEqual("beforeunload", dialog.Type);
await dialog.DismissAsync();
};
await Page.CloseAsync(new() { RunBeforeUnload = true });

为了断言通过window.print触发的打印对话框,您可以使用以下代码片段:

await Page.GotoAsync("<url>");

await Page.EvaluateAsync("(() => {window.waitForPrintDialog = new Promise(f => window.print = f);})()");
await Page.GetByText("Print it!").ClickAsync();

await Page.WaitForFunctionAsync("window.waitForPrintDialog");

这将等待点击按钮后打印对话框打开。请确保在点击按钮前/页面加载后执行脚本。