1suli0 Ответов: 1

Как выполнить навигацию puppeteer sharp, не нарушая сеанс протокола chrome dev?


Я пытаюсь создать веб-скребок, поэтому мне нужно автоматизировать несколько вещей, одна из которых-навигация между страницами.

Я настраиваю обработчик событий, чтобы поймать ответ от websocket, и все работает до того момента, когда мне нужно перейти на другую страницу и начать прослушивать сообщения там.

Я прихожу на страницу, но Хэндлер ничего не берет.

Этот фрагмент кода работает сам по себе.

private async Task NavigateToSportAsync()
        {
            try
            {
                var container = await this._page.WaitForSelectorAsync(".ipo-ClassificationBar_ButtonContainer");
                var sports = await container.QuerySelectorAllAsync(".ipo-ClassificationBarButtonBase");
                bool clicked = false;
                var opitions = new NavigationOptions();
                opitions.WaitUntil = new[] { WaitUntilNavigation.Networkidle0 };
                opitions.Timeout = 4000;

                foreach (var sport in sports)
                {
                    var classesHamdle = await sport.GetPropertyAsync("className");
                    var nameHandle = await sport.GetPropertyAsync("innerText");
                    var classes = classesHamdle.ToString();
                    var name = nameHandle.ToString();

                    if (name.Contains(this._sport) && !classes.Contains("ipo-ClassificationBarButtonBase_Selected"))
                    {
                        await sport.ClickAsync();
                        await this._page.WaitForNavigationAsync(opitions);
                        clicked = true;
                        break;
                    }
                    else if (name.Contains(this._sport) && classes.Contains("ipo-ClassificationBarButtonBase_Selected"))
                    {
                        clicked = true;
                        break;
                    }
                }

                if (!clicked)
                {
                    throw new Exception($"There aren't any matches currently present in {this._sport}");
                }
            }
            catch (Exception ex)
            {
                this._logger.LogWarning($"SPORT NAVIGATION ERROR: " +
                                $"{Environment.NewLine + ex.Message}", true);
            }
        }


Эта функция, по-видимому, является проблемой.

private async Task CheckPageAsync()
        {
            try
            {
                var header = await this._page.EvaluateFunctionAsync<string>(@"() => {
                    let header = document.querySelector('.ipo-ClassificationHeader_HeaderLabel');
                    if (header === null || header.length == 0) {{
                          return '';
                        }}
                    return header.innerText;
                    }");

                while (header != this._sport)
                {
                    this._logger.LogWarning("Not on the right page, trying to navigate...", true);
                    await this.NavigateToSportAsync();
                    //await Task.Delay(2000);
                    header = await this._page.EvaluateFunctionAsync<string>(@"() => {
                    let header = document.querySelector('.ipo-ClassificationHeader_HeaderLabel');
                    if (header === null || header.length == 0) {{
                          return '';
                        }}
                    return header.innerText;
                    }");

                    if (header != this._sport)
                        await Task.Delay(30 * 1000);
                }
            }
            catch (Exception ex)
            {
                this._logger.LogError($"ERROR DURING PAGE CHECK, ERROR: " +
                        $"{Environment.NewLine + ex.Message + Environment.NewLine + ex.StackTrace }", true);
            }
        }


Что я уже пробовал:

Я попытался инициализировать новый сеанс CDP, но, похоже, ничего не сделал, а затем попытался подождать различное количество времени на случай, если страница не будет полностью загружена. Но это не сработало. Я был бы благодарен за любой совет. Чем Вам за ваше терпение и время.

Richard MacCutchan

У меня есть приложение webscraper, но я использую обработчик событий для захвата, когда загрузка страницы завершается. Использование ваших методов означает, что вы должны искать контент в возвращаемых данных, и трудно узнать, когда страница полностью загрузилась.

1 Ответов

Рейтинг:
10

1suli0

Некоторые версии Puppeteer/PuppeteerSharp имеют проблемы с замораживанием. Я исправил свою проблему, понизив ее до версии 1.11.0.

Подробная информация здесь.