对话框
简介
Playwright 可以与网页对话框进行交互,例如alert
、confirm
、prompt
以及 beforeunload
确认框。有关打印对话框,请参阅打印。
alert()、confirm()、prompt() 对话框
默认情况下,Playwright 会自动关闭对话框,因此你无需处理它们。但是,你可以在触发对话框的操作之前注册一个对话框处理程序,以便通过 Dialog.AcceptAsync() 或 Dialog.DismissAsync() 来处理对话框。
Page.Dialog += async (_, dialog) =>
{
await dialog.AcceptAsync();
};
await Page.GetByRole(AriaRole.Button).ClickAsync();
备注
Page.Dialog 监听器 必须处理 对话框。否则,无论是 Locator.ClickAsync() 还是其他操作,都会停滞。这是因为网页中的对话框是模态的,因此在处理之前会阻止页面进一步执行。
因此,以下代码片段永远不会解析:
注意
错误!
page.Dialog += (_, dialog) => Console.WriteLine(dialog.Message);
await page.GetByRole(AriaRole.Button).ClickAsync(); // 会在此处挂起
备注
如果没有为 Page.Dialog 注册监听器,所有对话框将自动关闭。
卸载前(beforeunload)对话框
当使用真值的 RunBeforeUnload 值调用 Page.CloseAsync() 时,页面会运行其卸载处理程序。这是 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");
这将在按钮点击后等待打印对话框打开。确保在点击按钮之前 / 页面加载之后执行该脚本。