@uzi_no_uzi

Как дождаться загрузки YouTube selenium + phantom.js (c#)?

Пытаюсь спарсить список видео с youtube, захожу на страницу при помощи Selenium + Phantom.js

IWebDriver webDriver = new PhantomJSDriver();
            webDriver.Navigate().GoToUrl(@"https://www.youtube.com");
            try
            {
                WebDriverWait wait = new WebDriverWait(webDriver, TimeSpan.FromSeconds(30));
                IWebElement firstResult = wait.Until(e => e.FindElement(By.CssSelector("ytd-rich-item-renderer")));
                Console.WriteLine(firstResult.Text);
            } catch(Exception e)
            {
                Console.WriteLine(e);
                Console.WriteLine(webDriver.PageSource);
            }
            
            Console.ReadLine();


В коде ожидаю загрузки страницы и появления элемента ytd-rich-item-renderer, но элемент не находит

И в консоль выводится исходный код страницы до выполнения всех скриптов, в чем может быть проблема? Почему за 30 секунд страница полностью не загрузилась?

6140f3a6868e3632990323.png

На скрине видно, что страница еще не прогрузилась и нет нужного элемента.

Также вставлял полученный исходный код, что выдало в консоли в редактор кода, и так же не нашел нужного элемента, страница 100% не успевает выполнить скрипты, но не понятно по какой причине
  • Вопрос задан
  • 96 просмотров
Пригласить эксперта
Ответы на вопрос 1
@spaceatmoon
По скриншотам всё у тебя находит. У тебя искомый элемент динамический и подгружается отдельно. Тем более у тебя нет проверки на количество элементов.

using OpenQA.Selenium;
using OpenQA.Selenium.Firefox;
using OpenQA.Selenium.Support.UI;
....
....
....
using (IWebDriver driver = new FirefoxDriver())
            {
                WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(30));
                driver.Navigate().GoToUrl("https://www.youtube.com");
                wait.Until(web => {
                    var result = driver.FindElements(By.CssSelector("ytd-rich-item-renderer"));
                    return result.Count > 70;
                });
                var result = driver.FindElements(By.CssSelector("ytd-rich-item-renderer"));
                foreach (var element in result)
                {
                    Console.WriteLine(element.Text);
                }
            }


Я попробовал так. Когда я скролю браузер, подгружаются элементы и как только их становится больше 70 тут же переходит к следующему блоку кода.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы