PuppeteerSharp浏览器断开致导航失败问题求助(附代码)
我之前也踩过PuppeteerSharp版本和Chrome不兼容的坑,你的问题刚好是典型的版本不匹配导致的异常,下面给你详细分析和解决方案:
问题根源
你看到的Navigation failed because browser has disconnected!以及内部的Value cannot be null. (Parameter 'key')错误,本质是PuppeteerSharp 2.0.3这个老版本,和你本地安装的新版Chrome浏览器的DevTools协议不兼容。旧版PuppeteerSharp处理网络请求事件的逻辑,在新版Chrome返回的参数里出现了空值,触发了ConcurrentDictionary的非空校验,直接导致浏览器连接断开。
另外你的代码里还有个小冲突:你既用BrowserFetcher下载Chrome,又在LaunchOptions里指定了本地Chrome的路径,这会让BrowserFetcher的下载完全没用,实际跑的是本地不兼容的Chrome版本,这也是问题加剧的原因。
两种解决方案
方案1:升级PuppeteerSharp到稳定版(推荐)
PuppeteerSharp 2.0.3是好几年前的版本了,早就停止维护,根本适配不了现在的Chrome。直接升级到最新稳定版是最彻底的解决办法:
- 用NuGet包管理器搜索
PuppeteerSharp,把版本更到5.x及以上(建议直接选最新稳定版); - 或者用.NET CLI命令升级:
dotnet add package PuppeteerSharp --version [最新稳定版号]
升级后,把LaunchOptions里的ExecutablePath删掉,让PuppeteerSharp自动下载匹配版本的Chrome,彻底避免版本不兼容:
private static LaunchOptions GetOptions() { return new LaunchOptions { Headless = false, Timeout = 0, // 移除本地Chrome路径配置 Args = new string[] { "--no-sandbox", "--disable-notifications", "--disable-dev-shm-usage", "--disable-setuid-sandbox", "--lang=en-US,en-GB,en" }, Devtools = false, IgnoreHTTPSErrors = true, DumpIO = false }; }
方案2:指定与2.0.3兼容的Chrome版本(临时方案)
如果暂时没法升级PuppeteerSharp,那就得下载和它匹配的旧版Chrome。PuppeteerSharp 2.0.3对应的Chrome revision是756035,修改你的GetPageInstance方法,指定下载这个版本,同时删掉ExecutablePath:
public static async Task<Page> GetPageInstance(LaunchOptions options) { // 硬编码兼容的Chrome版本revision const string compatibleRevision = "756035"; await new BrowserFetcher().DownloadAsync(compatibleRevision); var browser = await Puppeteer.LaunchAsync(options); var page = await browser.NewPageAsync(); return page; }
同样要确保GetOptions里没有ExecutablePath,这样才会用下载的兼容版本。
额外小提示
- 别同时用
BrowserFetcher和ExecutablePath,二选一就行,不然版本肯定乱; - 导航的时候可以调整
WaitUntil参数,比如只保留Networkidle2,减少不必要的等待,也能降低出错概率。
内容的提问来源于stack exchange,提问作者leo




