【问题标题】:PupeteerSharp: Protocol error (Runtime.callFunctionOn): Session closedPupeteerSharp:协议错误(Runtime.callFunctionOn):会话关闭
【发布时间】:2020-06-10 18:30:29
【问题描述】:

我正在尝试执行以下代码:

            await new BrowserFetcher().DownloadAsync(BrowserFetcher.DefaultRevision);
#if DEBUG
            var chromeLocation = Path.Combine(context.FunctionDirectory, @"../.local-chromium/Win64-706915/chrome-win/chrome.exe");
#endif
            stage = "Start Browser";
            var browser = await Puppeteer.LaunchAsync(new LaunchOptions
            {
                Headless = true,
                Args = new[] { "--no-sandbox", "--shm-size=1gb" }
#if DEBUG
                ,
                ExecutablePath = chromeLocation,
                IgnoreHTTPSErrors = true
#endif
            });
            var page = await browser.NewPageAsync();
            var headers = new Dictionary<string, string> { { "Authorization", $"Bearer {authToken}" } };
            await page.SetExtraHttpHeadersAsync(headers);
            stage = "Load Page";
            await page.GoToAsync(printToPdfRequest.TargetUrl);
            stage = "Load Page 1";
            Thread.Sleep(5000);
            // This waits unti the loader has disappeared or times-out after 30 seconds
            await page.WaitForFunctionAsync("() => document.getElementsByClassName('loader').length > 0 && document.getElementsByClassName('loader')[0].style.length > 0 && document.getElementsByClassName('loader')[0].style[0] === 'display' && document.getElementsByClassName('loader')[0].style['display'] === 'none'");

这在本地工作,但在部署到 docker 容器时在最后一行失败。它失败并显示以下消息:

在阶段加载页面 1 时 PrintToPdf 失败,并显示消息协议错误 (Runtime.callFunctionOn):会话已关闭。很可能页面已关闭。关闭原因:NetworkManager 无法处理 Network.requestWillBeSent。值不能为空。 (参数“键”)。在 System.Collections.Concurrent.ConcurrentDictionary2.ThrowKeyNullException() at System.Collections.Concurrent.ConcurrentDictionary2.GetOrAdd(TKey key, Func2 valueFactory) at PuppeteerSharp.Helpers.MultiMap2.Add(TKey key, TValue value) at PuppeteerSharp.Helpers.AsyncDictionaryHelper`2.GetItemAsync(TKey key) at PuppeteerSharp.NetworkManager .OnRequestAsync(RequestWillBeSentPayload e, String interceptionId) 在 PuppeteerSharp.NetworkManager.OnRequestWillBeSentAsync(RequestWillBeSentPayload e) 在 PuppeteerSharp.NetworkManager.Client_MessageReceived(Object sender, MessageEventArgs e)

这个错误是什么意思,我该如何修复/绕过它?

如果有什么不同的话,这是在一个由天蓝色容器实例支持的天蓝色函数中运行的

【问题讨论】:

标签: azure chromium puppeteer-sharp


【解决方案1】:

如果这对任何人都有帮助。我猜这就是发生的事情:看起来 puppeteer 对它部署到的操作系统有一些依赖。这会导致某些页面静默崩溃“页面已关闭。”。只有在您下次尝试访问该页面时才会看到此错误。我上面收到的错误基本上意味着“没有加载页面”,因为之前的访问导致 chrome 消失了。这不是 pupeteersharp 的问题,但也是 pupeteer 的问题,互联网上的快速搜索显示了这一点。

我没有时间深入了解缺少的依赖项,因此我通过将代码从 docker 容器移动到 Windows 服务器来解决问题。相同的代码。新环境。没问题。

如果我有更多时间,我会在 chrome 中进行一些诊断,以尝试找出如何使用所需的一切设置 docker 容器,以便所有网页都能正常工作。

【讨论】:

    猜你喜欢
    • 2018-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-02
    • 2019-01-08
    • 2021-03-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多