对话框
简介
Playwright 可以与网页对话框(如 alert、confirm、prompt 以及 beforeunload 确认框)进行交互。有关打印对话框的内容,请参阅 打印。
alert()、confirm()、prompt() 对话框
默认情况下,Playwright 会自动关闭对话框,因此您不必手动处理它们。不过,您可以在触发对话框的操作之前注册一个对话框处理器,以调用 Dialog.accept() 或 Dialog.dismiss() 来进行处理。
page.onDialog(dialog -> dialog.accept());
page.getByRole(AriaRole.BUTTON).click();
注意
Page.onDialog(handler) 监听器必须处理该对话框。否则,您的操作(无论是 Locator.click() 还是其他操作)将会挂起。这是因为网页中的对话框是模态的,在处理完毕之前会阻塞页面的后续执行。
因此,以下代码片段将永远不会解决
警告
错误!
page.onDialog(dialog -> System.out.println(dialog.message()));
page.getByRole(AriaRole.BUTTON).click(); // Will hang here
注意
如果没有为 Page.onDialog(handler) 设置监听器,所有对话框都将被自动关闭(dismiss)。
beforeunload 对话框
当调用 Page.close() 并将 setRunBeforeUnload 设置为 true 时,页面会运行其卸载处理器。这是唯一一种 Page.close() 不会等待页面实际关闭的情况,因为操作结束后页面可能会保持打开状态。
您可以注册一个对话框处理程序来自己处理 beforeunload 对话框
page.onDialog(dialog -> {
assertEquals("beforeunload", dialog.type());
dialog.dismiss();
});
page.close(new Page.CloseOptions().setRunBeforeUnload(true));
打印对话框
为了断言通过 window.print 触发了打印对话框,您可以使用以下代码片段
page.navigate("<url>");
page.evaluate("(() => {window.waitForPrintDialog = new Promise(f => window.print = f);})()");
page.getByText("Print it!").click();
page.waitForFunction("window.waitForPrintDialog");
这将等待在点击按钮后打开打印对话框。请确保在点击按钮之前/页面加载后评估脚本。