C# Selenium. Не получается нажать на кнопку

121
09 октября 2019, 18:20

Создаю приложение, в котором требуется мне взять базу с Avito, на нужной страничке имеется кнопка
<div class="DnHhI"><span class="_2bexo">Загрузить еще</span></div>
Появляется она после нескольких прокрутов.

Прокручиваю страницу с помощью
((IJavaScriptExecutor)chr).ExecuteScript("var timeId=setInterval(function(){window.scrollY<document.body.scrollHeight-window.screen.availHeight?window.scrollTo(0,document.body.scrollHeight):(clearInterval(timeId),window.scrollTo(0,0))},500);");

Пытался нажать с помощью:

chr.FindElement(By.XPath("span[@class='_2bexo']").Click();

И

chr.FindElement(By.XPath("div[@class='DnHhI']").Click();

А также

((IJavaScriptExecutor)chr).ExecuteScript("arguments[0].click()", chr.FindElement(By.XPath("span[@class='_2bexo']")));

Ну и

((IJavaScriptExecutor)chr).ExecuteScript("arguments[0].click()", chr.FindElement(By.XPath("div[@class='DnHhI']")));

В каждом из случаев приложение зацикливается на клике по кнопке

Answer 1

Всем твоим xpath не хватает //

Твой:

chr.FindElement(By.XPath("span[@class='_2bexo']").Click();

А должно быть:

chr.FindElement(By.XPath("//span[@class='_2bexo']").Click();

и т.д., но лучше использовать xpath с текстом:

chr.FindElement(By.XPath("//span[.='Загрузить еще']").Click();

Или:

//div[@data-marker="items"]/div[last()]/span

Или, как пример, можно использовать css selectorы:

div[data-marker="items"] > div:last-child span
[data-marker="items"] > div:nth-child(2) span
Answer 2

Тебе нужно указать нормальный xpath или CssSelector. Ты пытаешся использовать поиск по названию автоматически генеррированного имени класса (судя по названию класса).

А это тебе маловероятно что принесет достаточно хорошую воспроизводимость/стабильность кода.

Как выглядит адекватный xpath?

chr.FindElement(By.XPath(".//div[@data-marker='items']/div/div/../span").Click();
//это я рандомно из головы написал, просто влом разбиратся с структурой страницы

Да и вообще разберись нормально с синтаксисом xpath-а. Это очень облегчает жизнь в целом. Твоя проблема в даном вопросе именно в том что ты не умеешь писать хорошие селекторы. А писать их вместо тебя -- это плохая идея. Ты банально ничему не научишся. Это один из основных навыков при работе с селениумом.

READ ALSO
Windows установить прокси с аутентификацией

Windows установить прокси с аутентификацией

Я изменяю настройки прокси сервера windows с помощью

117
Cookie, которые устанавливает JS

Cookie, которые устанавливает JS

Уже неделю ломаю голову, не могу понять как сделатьДелаю робота для авторизации на сайте и парсинга

106
&ldquo;Невидимый&rdquo; для Grid.RowDefinition элемент

“Невидимый” для Grid.RowDefinition элемент

Скажите, есть ли возможность, чтобы GridRowDefinition у которого Height - Auto, как-бы не видел тот или иной элемент, то есть схлопывался так же, как если...

115