跳到主要内容

对话框处理

简介

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(); // 会在此处挂起

:::注意 如果没有为 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');

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