对话框

介绍

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() 还是其他操作。因为网页中的对话框是模态的,因此在处理之前会阻塞页面的后续执行。

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

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

如果没有为 page.on('dialog') 注册监听器,所有对话框将会被自动关闭。

beforeunload 对话框

当调用 page.close() 且传入 runBeforeUnload 为真时,页面会运行其卸载处理程序。这是唯一一个 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');

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