Как выполнить навигацию 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, но я использую обработчик событий для захвата, когда загрузка страницы завершается. Использование ваших методов означает, что вы должны искать контент в возвращаемых данных, и трудно узнать, когда страница полностью загрузилась.