PupeteerSharp: ошибка протокола (Runtime.callFunctionOn): сеанс закрыт - PullRequest
0 голосов
/ 29 мая 2020

Я пытаюсь выполнить следующий код:

            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. При этом появляется следующее сообщение:

Ошибка PrintToPdf на этапе загрузки страницы 1 с сообщением Ошибка протокола (Runtime.callFunctionOn): Сессия закрыта. Скорее всего, страница была закрыта. Причина закрытия: NetworkManager не смог обработать Network.requestWillBeSent. Значение не может быть нулевым. (Параметр «ключ»). в System.Collections.Concurrent.ConcurrentDictionary 2.ThrowKeyNullException() at System.Collections.Concurrent.ConcurrentDictionary 2.GetOrAdd (ключ TKey, Fun c2 valueFactory) at PuppeteerSharp.Helpers.MultiMap 2.Add (ключ TKey, значение TValue) в PuppeteerSharp.Helpers.AsyncDictionaryHelper`2.GetItemAsyn c (TKey key) в PuppeteerSharp.NetworkManager.OnRequestAsyn c (RequestWillBeSentPayload e, String interceptionId) в PuppeteerSharp.NetworkManager.OnRequestWillBeSentAsyn c (RequestWillBeSentgsPayNextManager) в PuppeteerSharp.NetworkManager. Что означает эта ошибка и как ее исправить?

Это работает в функции azure, поддерживаемой экземпляром контейнера azure, если это имеет какое-либо значение

1 Ответ

0 голосов
/ 10 июня 2020

Если это кому-то поможет. Я предполагаю, что вот что происходит: похоже, кукольник имеет некоторую зависимость от операционной системы, в которой он развернут. Это приводит к тому, что некоторые страницы молча кричат ​​sh «Страница была закрыта.». Вы увидите эту ошибку только при следующей попытке доступа к странице. Ошибка, которую я получил выше, означает в основном «ни одна страница не загружена», потому что предыдущий доступ привел к исчезновению chrome. Это проблема не только с pupeteersharp, но и с pupeteer, быстрый поиск по inte rnet показал это.

У меня не было времени go в том, какая зависимость отсутствовала, поэтому Я решил проблему, переместив код из контейнера docker на сервер windows. Тот же код. Новая среда. Без проблем.

Если бы у меня было больше времени, я бы поставил некоторую диагностику в chrome, чтобы попытаться выяснить, как настроить контейнер docker со всем необходимым, чтобы все веб-страницы работали нормально.

...