跳到主要内容

对话框

简介

Playwright 可以与网页对话框进行交互,例如alertconfirmprompt 以及 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(); // 会在此处挂起
备注

如果没有为 Page.onDialog(handler) 注册监听器,所有对话框将自动关闭。

beforeunload 对话框

当使用真值 setRunBeforeUnload 值调用 Page.close() 时,页面会运行其卸载处理程序。这是 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");

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