Playwright .NET录制HAR失败:Firefox无输出、Chromium卡在CloseAsync
Playwright录制HAR异常问题解决方案
问题根因及修复方案
1. 处理Chromium卡在CloseAsync的问题
Chromium卡住的核心原因是页面点击购物车链接后触发了未完成的网络请求或页面跳转,HAR录制需要等待所有悬停请求处理完毕才会结束,导致CloseAsync无限等待。
修复方式:
- 点击链接后添加等待逻辑,确认页面跳转、请求全部处理完成
- 可选配置
RecordHarContent参数限制录制内容,或者给CloseAsync添加超时兜底 - 录制HAR建议统一使用无头模式,避免Headless=false模式下用户手动操作触发额外未完成请求
2. 处理Firefox不生成HAR文件的问题
Firefox对应版本的Playwright绑定存在已知的录制HAR兼容性问题,需要额外配置:
- 必须显式设置
RecordHarMode为HarMode.Full - 确保HAR路径的目录有写入权限,路径不要包含中文字符或特殊符号
- 若使用较旧版本的Playwright,升级到v1.30及以上版本可修复大部分Firefox HAR录制缺陷
修复后的示例代码
using Microsoft.Playwright; using System.IO; static async Task Main() { var playwright = await Playwright.CreateAsync(); var currentDir = Directory.GetCurrentDirectory(); // 提前确认输出目录存在 if (!Directory.Exists(currentDir)) { Directory.CreateDirectory(currentDir); } Console.WriteLine("Trying Firefox"); var firefox = await playwright.Firefox.LaunchAsync(new BrowserTypeLaunchOptions { Headless = true }); await TryWith(firefox, Path.Combine(currentDir, "firefoxHar.har")); Console.WriteLine("Trying Chromium"); var chromium = await playwright.Chromium.LaunchAsync(new BrowserTypeLaunchOptions { Headless = true }); await TryWith(chromium, Path.Combine(currentDir, "chromium.har")); } static async Task TryWith(IBrowser browser, string harPath) { var context = await browser.NewContextAsync(new BrowserNewContextOptions() { RecordHarPath = harPath, // 显式设置HAR录制模式,适配Firefox兼容性 RecordHarMode = HarMode.Full, IgnoreHTTPSErrors = true }); var page = await context.NewPageAsync(); // 等待页面网络空闲再执行后续操作 await page.GotoAsync("https://www.microsoft.com", new PageGotoOptions { WaitUntil = WaitUntilState.NetworkIdle }); var link = await page.QuerySelectorAsync("a#uhf-shopping-cart"); // 确认元素可交互后再点击 await link.WaitForElementStateAsync(ElementState.Enabled); // 点击后同步等待页面跳转完成 await Task.WhenAll( page.WaitForNavigationAsync(new PageWaitForNavigationOptions { WaitUntil = WaitUntilState.NetworkIdle }), link.ClickAsync() ); Console.WriteLine("Closing Context"); // 添加30秒超时兜底,避免无限等待 await context.CloseAsync(new BrowserContextCloseOptions { Timeout = 30000 }); Console.WriteLine("Closing Browser"); await browser.CloseAsync(); }
额外排查项
- 运行程序时确保当前账号对HAR输出目录有写入权限,避免权限不足导致HAR文件生成失败
- 若仍有问题,可先尝试录制简单静态页的HAR,排除目标网站特殊请求逻辑导致的录制失败
- 检查系统的防火墙、代理设置,避免请求被拦截导致请求悬停未完成
内容的提问来源于stack exchange,提问作者StevenDenman
相关产品推荐
相关产品推荐

