跳到主要内容

对话框

介绍

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

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

默认情况下,Playwright 会自动关闭对话框,因此您无需处理它们。但是,您可以在触发对话框的动作发生之前注册一个对话框处理程序,以 dialog.accept()dialog.dismiss() 它。

page.on('dialog', dialog => dialog.accept());
await page.getByRole('button').click();
注意

page.on('dialog') 监听器必须处理对话框。否则您的动作将会停滞,无论是 locator.click() 还是其他动作。这是因为 Web 中的对话框是模态的,因此在它们被处理之前会阻止页面的进一步执行。

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

警告

错误!

page.on('dialog', dialog => console.log(dialog.message()));
await page.getByRole('button').click(); // Will hang here
注意

如果没有 page.on('dialog') 的监听器,所有对话框都会自动关闭。

beforeunload 对话框

page.close() 使用 truthy 的 runBeforeUnload 值调用时,页面会运行其 unload 处理程序。这是唯一一种 page.close() 不等待页面实际关闭的情况,因为最终页面可能会保持打开状态。

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

page.on('dialog', async dialog => {
assert(dialog.type() === 'beforeunload');
await dialog.dismiss();
});
await page.close({ runBeforeUnload: true });

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

await page.goto('<url>');

await page.evaluate('(() => {window.waitForPrintDialog = new Promise(f => window.print = f);})()');
await page.getByText('Print it!').click();

await page.waitForFunction('window.waitForPrintDialog');

这将等待在单击按钮后打开打印对话框。确保在单击按钮之前/页面加载之后评估脚本。