如何让Playwright不再自动关闭对话框并正常显示?
如何让Playwright允许显示浏览器原生对话框(Alert/Confirm/Prompt)
Playwright默认会自动拦截并关闭所有原生对话框(Alert、Confirm、Prompt),这就是你注入alert()后看不到弹窗的原因。要让对话框正常显示,你需要通过监听页面的Dialog事件来覆盖这个默认行为。
以下是针对你使用的C#版本Playwright的具体解决方案:
步骤1:启动浏览器并创建页面
先按你的代码启动非无头浏览器,可选添加SlowMo参数放慢操作速度,方便观察弹窗:
using Microsoft.Playwright; var playwright = await Playwright.CreateAsync(); var browser = await playwright.Chromium.LaunchAsync(new BrowserTypeLaunchOptions { Headless = false, SlowMo = 1000 // 可选,放慢操作节奏,便于查看对话框 }); var page = await browser.NewPageAsync();
步骤2:注册Dialog事件处理程序
通过监听page.Dialog事件,接管对话框的处理逻辑,阻止Playwright自动关闭:
page.Dialog += async (sender, dialog) => { // 可选:打印对话框信息用于调试 Console.WriteLine($"对话框类型:{dialog.Type},内容:{dialog.Message}"); // 让对话框显示5秒后再关闭,你可以根据需求调整时长 await Task.Delay(5000); await dialog.AcceptAsync(); // 点击对话框的「确定」按钮 // 如果是Confirm或Prompt,也可以用dialog.DismissAsync()模拟点击「取消」 };
步骤3:注入并执行alert代码
现在再注入alert()代码,对话框就会正常显示了:
await page.EvaluateAsync("alert('This is a warning message!');"); // 等待足够时间确保对话框完成显示与关闭 await page.WaitForTimeoutAsync(6000); // 最后关闭浏览器 await browser.CloseAsync();
额外说明
- 如果希望用户手动关闭对话框而非自动关闭,可以移除
Task.Delay()和dialog.AcceptAsync()的调用,但此时Playwright会暂停后续操作,直到你在代码中主动调用AcceptAsync()或DismissAsync(),或者通过其他方式触发处理逻辑。 - 该方法同样适用于
confirm()和prompt()对话框,只需在事件处理程序中根据dialog.Type做对应处理即可。
内容的提问来源于stack exchange,提问作者Marek Havrila
相关产品推荐
相关产品推荐

