对话框
简介
Playwright 可以与网页对话框进行交互,例如 alert、confirm、prompt 以及 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 对话框
当使用真值 runBeforeUnload 调用 page.close() 时,页面会运行其卸载处理程序。这是 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');
这将等待在点击按钮后打开打印对话框。请确保在点击按钮之前/页面加载后评估脚本。