Не получается кликнуть через Xpath

DmitryiAsp

Client
Регистрация
24.08.2016
Сообщения
90
Благодарностей
6
Баллы
8
Здравствуйте!
Сам пациент, по которому пытаюсь кликнуть, как пример: https://spb.zoon.ru/beauty/salon_ekspress-depilyatsii_depylbrazil_na_prospekte_kima_6/?zutm_source=zbd&zutm_medium=none (фиолетовая кнопка - написать отзыв)
43250

Сниппет использую с форума, но изменил у него xpath путь. Пример кода:
C#:
//Находим элемент кнопки
var elButton = instance.ActiveTab.FindElementByXPath("//span[contains(@class, 'button button-purple button-comment-add button-block js-comment-add')]", 0);
//Определяем, на каком расстоянии от верха страницы находится кнопка
int topInBrowser = int.Parse(elButton.GetAttribute("topInBrowser"));
//Делаем прокрутку на это расстояние
instance.ActiveTab.FullEmulationMouseWheel(0, topInBrowser);
//Ведём курсор мышки к кнопке
instance.ActiveTab.FullEmulationMouseMoveToHtmlElement(elButton);
//Кликаем
instance.ActiveTab.FullEmulationMouseClick("left", "click");
Подскажите пожалуйста, в чем ошибка?
Ошибка звучит так:
Тип Время Сообщение
09:54:12 Выполнение действия CSharp OwnCode Входная строка имела неверный формат.
 

ebrwebrw

Client
Регистрация
20.08.2018
Сообщения
221
Благодарностей
164
Баллы
43
C#:
//Находим элемент кнопки
HtmlElement he = instance.ActiveTab.FindElementByXPath("//button[contains(@class, 'service-online-request-btn')]", 0);

//Делаем прокрутку на это расстояние
instance.ActiveTab.FullEmulationMouseWheel(he,0,0);
//Ведём курсор мышки к кнопке
instance.ActiveTab.FullEmulationMouseMoveToHtmlElement(he);
//Кликаем
instance.ActiveTab.FullEmulationMouseClick("left", "click");

Хотя мб и через var можно, не тестил
 
  • Спасибо
Реакции: DmitryiAsp

DmitryiAsp

Client
Регистрация
24.08.2016
Сообщения
90
Благодарностей
6
Баллы
8
C#:
//Находим элемент кнопки
HtmlElement he = instance.ActiveTab.FindElementByXPath("//button[contains(@class, 'service-online-request-btn')]", 0);

//Делаем прокрутку на это расстояние
instance.ActiveTab.FullEmulationMouseWheel(he,0,0);
//Ведём курсор мышки к кнопке
instance.ActiveTab.FullEmulationMouseMoveToHtmlElement(he);
//Кликаем
instance.ActiveTab.FullEmulationMouseClick("left", "click");

Хотя мб и через var можно, не тестил
Не срабатывает клик-прокрутка, но сниппет без ошибки выполняется. Грубо говоря в инстансе ничего не происходит при выполнении кубика.
Хотя нет, проверил на другом примере, кликает, но не на ту кнопку.
Возможно ли по тексту найти кнопку и кликнуть по ней?
 

ebrwebrw

Client
Регистрация
20.08.2018
Сообщения
221
Благодарностей
164
Баллы
43
Да, то мой косяк, сонный не к той кнопке привязался

HtmlElement he = instance.ActiveTab.FindElementByXPath("//span[contains(@class, 'button button-purple button-comment-add js-comment-add')]", 0);

Попробуй так(замени первую строку), и да, видимо у нас верстка отличается
 
  • Спасибо
Реакции: DmitryiAsp

DmitryiAsp

Client
Регистрация
24.08.2016
Сообщения
90
Благодарностей
6
Баллы
8
Да, то мой косяк, сонный не к той кнопке привязался

HtmlElement he = instance.ActiveTab.FindElementByXPath("//span[contains(@class, 'button button-purple button-comment-add js-comment-add')]", 0);

Попробуй так(замени первую строку), и да, видимо у нас верстка отличается
Огонь.
Если есть возможность, поясните почему при этом коде была ошибка
C#:
var elButton = instance.ActiveTab.FindElementByXPath("//span[contains(@class, 'button button-purple button-comment-add button-block js-comment-add')]", 0);
Чем принципиально отличаются
HtmlElement he и var elButton?
 

ebrwebrw

Client
Регистрация
20.08.2018
Сообщения
221
Благодарностей
164
Баллы
43
У тебя ошибка была на этом моменте, не находило элемент, попробуй подставь мой xpath
int topInBrowser = int.Parse(elButton.GetAttribute("topInBrowser"));
 
  • Спасибо
Реакции: DmitryiAsp

DmitryiAsp

Client
Регистрация
24.08.2016
Сообщения
90
Благодарностей
6
Баллы
8
У тебя ошибка была на этом моменте, не находило элемент, попробуй подставь мой xpath
int topInBrowser = int.Parse(elButton.GetAttribute("topInBrowser"));
Да нет, там ошибка была в том, что я вар использовал, а ты HtmlElement he. xpath то у нас одинаковые были
разобрался
 

ebrwebrw

Client
Регистрация
20.08.2018
Сообщения
221
Благодарностей
164
Баллы
43
Сравни xpath) я button-block не добавил, т.к у меня его нет, возможно у тебя что то тоже там меняется


C#:
//Находим элемент кнопки
var elButton = instance.ActiveTab.FindElementByXPath("//span[contains(@class, 'button button-purple button-comment-add js-comment-add')]", 0);

//Делаем прокрутку на это расстояние
instance.ActiveTab.FullEmulationMouseWheel(elButton,0, 0);
//Ведём курсор мышки к кнопке
instance.ActiveTab.FullEmulationMouseMoveToHtmlElement(elButton);
//Кликаем
instance.ActiveTab.FullEmulationMouseClick("left", "click");
В таком виде тоже работает, а если опускаться по topInBrowser то перемотку делает неадекватную
 
  • Спасибо
Реакции: DmitryiAsp

TwistDanceR

Client
Регистрация
30.05.2019
Сообщения
479
Благодарностей
200
Баллы
43
Огонь.
Если есть возможность, поясните почему при этом коде была ошибка
C#:
var elButton = instance.ActiveTab.FindElementByXPath("//span[contains(@class, 'button button-purple button-comment-add button-block js-comment-add')]", 0);
Чем принципиально отличаются
HtmlElement he и var elButton?
Принципиально на первый взгляд ничем, по сути - ответом. Функции работы с элементами требуют введения именно "Элемента".
"HtmlElement" передает значение типа класса "Элемент", а не "Значение" , как "var/char/string/int/float/double".

Мой вердикт: Когда работаешь с элементами на странице - юзай HtmlElement

P.S. Знания С# у меня на уровне "где-то услышал, чё-то сам понял", но тут вроде бы я ошибок не допустил)
P.S.S. Ещё можно в конце получать ответ C# куба в переменную. Организуй себе проверки, пока не поймешь, что ты имеешь в "конце" (return переменной которую получаешь). и попробуй что дает "var" и что дает "HtmlElement"; (Не забудь что все выводимые переменные должны быть типа string - .ToString() в конце..... ой всё, щас запутаю человека)
 
  • Спасибо
Реакции: DmitryiAsp

DmitryiAsp

Client
Регистрация
24.08.2016
Сообщения
90
Благодарностей
6
Баллы
8
Принципиально на первый взгляд ничем, по сути - ответом. Функции работы с элементами требуют введения именно "Элемента".
"HtmlElement" передает значение типа класса "Элемент", а не "Значение" , как "var/char/string/int/float/double".

Мой вердикт: Когда работаешь с элементами на странице - юзай HtmlElement

P.S. Знания С# у меня на уровне "где-то услышал, чё-то сам понял", но тут вроде бы я ошибок не допустил)
P.S.S. Ещё можно в конце получать ответ C# куба в переменную. Организуй себе проверки, пока не поймешь, что ты имеешь в "конце" (return переменной которую получаешь). и попробуй что дает "var" и что дает "HtmlElement"; (Не забудь что все выводимые переменные должны быть типа string - .ToString() в конце..... ой всё, щас запутаю человека)
Сегодня уже не работает этот сниппет. класс на кнопке у них не изменился. Вообще не понимаю в чем дело.o_O
 

ebrwebrw

Client
Регистрация
20.08.2018
Сообщения
221
Благодарностей
164
Баллы
43
"//span[contains(@class, 'button-comment-add')]"
 
  • Спасибо
Реакции: DmitryiAsp

TwistDanceR

Client
Регистрация
30.05.2019
Сообщения
479
Благодарностей
200
Баллы
43
Сегодня уже не работает этот сниппет. класс на кнопке у них не изменился. Вообще не понимаю в чем дело.o_O
Ну, тебе уже ответили)) Осознай как строить x-path, почему contains и почему только часть класса вписывается, а не весь класс)

А ещё, к слову, на некоторых сайтах может код каждый день обновляться, что-то новое добавляют, что-то старое убирают. Нужно уметь самому позже вернуться и адаптировать свой шаблон под свои нужды) Удачи в освоении
 

DmitryiAsp

Client
Регистрация
24.08.2016
Сообщения
90
Благодарностей
6
Баллы
8
Ну, тебе уже ответили)) Осознай как строить x-path, почему contains и почему только часть класса вписывается, а не весь класс)
Да, уже начинаю курить мануалы. Как обычно - хочешь по быстрому, в итоге в дебри лезть надо. Спасибо)
 

TwistDanceR

Client
Регистрация
30.05.2019
Сообщения
479
Благодарностей
200
Баллы
43
Да, уже начинаю курить мануалы. Как обычно - хочешь по быстрому, в итоге в дебри лезть надо. Спасибо)
Та не такие уж и дебри) В зеннопостере с 5.32(или 33) появилась кнопка "парсить данные". Там есть CSS-селектор и Xpath. Можешь и поиграться и результаты посмотреть.
Всё что осваиваешь в будущем ускорит твои действия)
 

backoff

Client
Регистрация
20.04.2015
Сообщения
6 052
Благодарностей
6 481
Баллы
113
зная это быстро будешь писать xpath

ancestor (предок, батя)
descendant (потомок, пезд*к)
starts-with (начинается с)
contains(содержит ключевое слово)

contains(@class, 'имя_класса')
starts-with(@class, 'имя_класса')

// - Две косые черты, просто запоминанием, что все начинается с них
div – мы говорим, что будем искать в html коде все div (это может быть любой html тег)
[Тут будет запрос] – в этих скобках, будет проходить вся работа.
@class = собачка вначале обязательно, искать только те div у которых есть class
'snippet-card__view' находим только тот class, у которого имя snippet-card__view, не забываем про верхние апострафы ' '


not - не содержит
примеры:
//a[not (@href)] - поиск всех элементов с тегом "а", у которых нет атрибута "href"
//label[not(@for='login')] - поиск всех элементов с тегом "label", у которых нет атрибута "for" со значением "login"

text() - InnerText
примеры
//span[text()='лалала'] - поиск всех элементов с тегом "span", у которых есть текст "лалала"
//a[contains(text(),"Удаленные")] - поиск всех элементов с тегом "a", которые содержат текст "Удаленные"

and - дополнительное условие
пример:
//*[@id='owner_photo_edit' and not(@style='display: none;')]
 
  • Спасибо
Реакции: DmitryiAsp

Fedor5588

Client
Регистрация
04.06.2017
Сообщения
313
Благодарностей
73
Баллы
28
ребят хелпаните, нашел сниппет. в ПМ нормально отрабатывает в ЗП ошибку вываливает: Выполнение действия CSharp OwnCode Входная строка имела неверный формат.

рандом клик в выдаче яд:
Random rand = new Random();//переменная для рандома
HtmlElementCollection hes = instance.ActiveTab.GetDocumentByAddress("0").FindElementsByAttribute("div","class","organic__url-text","regexp");//берем все элементы
HtmlElement he;//переменная для будущего элемента
int i = 0;//счетчик
do{
    int url = rand.Next(0, hes.Count);//выбираем совпадение элемента рандомно
    i++;
    he = instance.ActiveTab.GetDocumentByAddress("0").FindElementByAttribute("div","class","organic__url-text","regexp", url);//берем элемент
    if (Convert.ToInt32(he.GetAttribute("leftInTab")) <= 0 && Convert.ToInt32(he.GetAttribute("topInTab")) <= 0){//если элемент не находится в поле видимости
        continue;//если да, то продолжаем искать
    }
    else{
        break;//если нет, то выходим из цикла
    }
}
while (i!=100);//пока не будет "100", не выходим из цикла
instance.ActiveTab.FullEmulationMouseMoveToHtmlElement(he);//наводим мышь на элемент
System.Threading.Thread.Sleep(rand.Next(500, 1000));//случайно ждем время до клика от 0.5 секунды до 1й
instance.ActiveTab.FullEmulationMouseClick("left", "click");//нажимает левой кнопкой мыши на элемент
 

doc

Client
Регистрация
30.03.2012
Сообщения
8 684
Благодарностей
4 641
Баллы
113
ребят хелпаните, нашел сниппет. в ПМ нормально отрабатывает в ЗП ошибку вываливает: Выполнение действия CSharp OwnCode Входная строка имела неверный формат.

рандом клик в выдаче яд:
Random rand = new Random();//переменная для рандома
HtmlElementCollection hes = instance.ActiveTab.GetDocumentByAddress("0").FindElementsByAttribute("div","class","organic__url-text","regexp");//берем все элементы
HtmlElement he;//переменная для будущего элемента
int i = 0;//счетчик
do{
    int url = rand.Next(0, hes.Count);//выбираем совпадение элемента рандомно
    i++;
    he = instance.ActiveTab.GetDocumentByAddress("0").FindElementByAttribute("div","class","organic__url-text","regexp", url);//берем элемент
    if (Convert.ToInt32(he.GetAttribute("leftInTab")) <= 0 && Convert.ToInt32(he.GetAttribute("topInTab")) <= 0){//если элемент не находится в поле видимости
        continue;//если да, то продолжаем искать
    }
    else{
        break;//если нет, то выходим из цикла
    }
}
while (i!=100);//пока не будет "100", не выходим из цикла
instance.ActiveTab.FullEmulationMouseMoveToHtmlElement(he);//наводим мышь на элемент
System.Threading.Thread.Sleep(rand.Next(500, 1000));//случайно ждем время до клика от 0.5 секунды до 1й
instance.ActiveTab.FullEmulationMouseClick("left", "click");//нажимает левой кнопкой мыши на элемент
искомого элемента нет на странице
 

Fedor5588

Client
Регистрация
04.06.2017
Сообщения
313
Благодарностей
73
Баллы
28
искомого элемента нет на странице
странно, но в пм то он кликает в выдаче на случайную ссылку. может можно что то в коде изменить чтобы это работало. кодер из меня так себе, поэтому прошу прощения сразу)
 

Кто просматривает тему: (Всего: 2, Пользователи: 0, Гости: 2)