Доброго времени суток!
Примерно пару недель назад ChromeDriver перестал видеть элементы сайта YouTube. Все остальные сайты видит и отлично выполняет то, что от него требуется. Версия Драйвера - 2.41. Проверял версии до 2.3. Вариант с тем, что поменялись идентификаторы нужных элементов отпадают, т.к. GeckoDriver видит их без проблем. На других доступных мне ПК та же ситуация.
Переходить на Gecko нет особого желания, т.к. работает заметно медленнее.
Думал, что проблема с ОС, поскольку нашлось нарушение целостности файловой системы, но данный вопрос был решён, а вот проблемы с ХромДрайвером остались. Везде работает как надо, на YouTube начинает капризничать.
Вопрос: как исправить данную ситуацию? В чём может быть проблема? Ничего не менялось ни в коде, ни в системе, ни в плане железа.
Заранее спасибо!
В Вашем примере меня смутила следующая строка:
Thread.Sleep(2500)
.
Так делать не стоит!
Для этого в Селениуме есть явные ожидания, которые в общем виде реализуются так:
WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(10));
wait.Until<IWebElement>((d) =>{ /* лямбда с условием ожидания */ });
Я в данном случае использовал класс ExpectedConditions
, который уже содержит определенное количество заблаговременно подготовленных для использования в вейте функций.
В частности ExpectedConditions.ElementExists(IWebElement element)
, которая ждёт появления элемента на странице.
После её первого использования узнал, что данный класс активно выпиливают из пакета. Он помечен deprecated
и в целом данную фичу перенесли в отдельный пакет.
Поэтому мы ищем и устанавливаем nuget DotNetSeleniumExtras.WaitHelpers
.
В итоге ожидание появления элемента будет выглядеть следующим образом:
WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(30));
wait.Until(SeleniumExtras.WaitHelpers.ExpectedConditions.ElementExists(By.Id("content-section")));
Второй момент, который меня смущал, это то что не всегда срабатывал PAGE_DOWN
.
Возможно, это из-за рекламы, которая могла перехватывать какие-либо события на странице... но тем не менее PAGE_DOWN
я тоже решил заменить на скрол с помощью JavaScript
:
IJavaScriptExecutor js = (IJavaScriptExecutor)driver;
js.ExecuteScript("window.scrollTo(0, 1000);");
В результате получилось как то так:
IWebDriver driver = new ChromeDriver();
driver.Navigate().GoToUrl("https://www.youtube.com/watch?v=gGIRjErhWr8");
driver.Manage().Window.Maximize();
// скроллим на 1000 пикселей вниз
IJavaScriptExecutor js = (IJavaScriptExecutor)driver;
js.ExecuteScript("window.scrollTo(0, 1000);");
// ждём появления элемента #placeholder-area
WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(30));
wait.Until(SeleniumExtras.WaitHelpers.ExpectedConditions.ElementExists(By.Id("content-section")));
IWebElement input = driver.FindElement(By.Id("placeholder-area"));
input.Click();
у меня работает как часы.
Виртуальный выделенный сервер (VDS) становится отличным выбором
Ассоциация: stackoverflowcom/q/26323373/6677992
Есть ли формат для чисел с целой частью, чтобы разбивал сам по тысячам и тд
Всех приветствую, вот небольшую задачку делаюДостаю из реестра данных о файлах запускающихся при старте системы
Имеется форма веб-приложения, хочу передать данные с нее в объект внутрь ajax, чтобы он в последствии передал их в контроллер, но только примерно...