You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

PuppeteerSharp浏览器断开致导航失败问题求助(附代码)

解决PuppeteerSharp导航时「Browser has disconnected」错误

我之前也踩过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,这样才会用下载的兼容版本。

额外小提示

  • 别同时用BrowserFetcherExecutablePath,二选一就行,不然版本肯定乱;
  • 导航的时候可以调整WaitUntil参数,比如只保留Networkidle2,减少不必要的等待,也能降低出错概率。

内容的提问来源于stack exchange,提问作者leo

火山引擎 最新活动