Бесплатные пути XPath на заказ

sibbora

Client
Регистрация
23.11.2013
Сообщения
149
Благодарностей
73
Баллы
28
XPath - очень мощный инструмент для поиска целевых элементов на странице. Если на простых сайтах хватает функционала ProjectMaker по автопоиску элементов при "записи действий", то на сложных сайтах - а практически все соцсети относятся к таковым - стабильно работает лишь код с качественно составленными путями XPath.

Создаю эту тему как некий аналог ветки "Бесплатные снипеты на заказ", в которой каждый участник может рассчитывать на бескорыстную помощь в создании C#-кода для своих проектов. Как автор небольшого курса по XPath, могу предложить участникам ресурса посильную помощь в освоении этого инструмента.

Помимо основного содержимого вопроса, прошу приводить ссылку на страницу, на которой будет присутствовать искомый элемент, а также скрин этого элемента или скрин с указанием его места в дереве элементов в ProjectMaker. Прошу также писать, какие действия нужно выполнить на странице для появления элемента, если сразу после перехода по ссылке элемент на ней отсутствует. Если для ответа на вопрос будет необходима регистрация - просьба предоставлять демо-аккаунт.

UPD: по предложению @sanchessam сделал табличку для путей.
 
Последнее редактирование:

sibbora

Client
Регистрация
23.11.2013
Сообщения
149
Благодарностей
73
Баллы
28
Кратко о том что такое XPath: википедия, хабр. Если совсем просто - это способ поиска элементов на странице при помощи составления "запросов", или "путей". Работает это так: мы указываем некую начальную точку в дереве элементов, и затем строим "путь" поиска относительно этого элемента. В качестве начальной точки чаще всего принимается корневой элемент в дерева. В процессе поиска мы можем двигаться вверх или вниз по дереву элементов, а также искать по "соседям", по "стоящим перед" или "стоящим после" элементам. Направления поиска называются осями. В процессе поиска мы можем проверять атрибуты элементов на соответствие различным условиям. Атрибуты мы видим в окошке "Свойства элемента" ProjectMaker. Условия, которые мы формируем в путях XPath, также называются предикатами. В формировании условий нам помогают функции: строковые, числовые, логические, node-set.

Пример простого пути XPath: //input[@id='name']
Пример более сложного пути XPath: //div[starts-with(@class,'userContentWrapper')]/descendant::a[contains(@class,'lfloat')]/following::h5/descendant::a[text()='Name']/following::a[starts-with(@class, 'UFILikeLink')]
 

Dimionix

Moderator
Регистрация
09.04.2011
Сообщения
3 068
Благодарностей
3 122
Баллы
113

BotMastak

Client
Регистрация
04.12.2016
Сообщения
20
Благодарностей
4
Баллы
3
Привет!
Помоги найти путь к выпадающему меню pinterest https://yadi.sk/i/OJZrsUbB3JEyRK

P.S. аккаунт в личку скинул
 

sanchessam

Client
Регистрация
13.10.2016
Сообщения
72
Благодарностей
4
Баллы
8
Думаю многим интересно сеть ВК.
Давайте сделаем коллекцию актуальных путей Xpath для всего что только можно там. Начнем например с лайков постов в группах.

p.s Вообще предлагаю сделать полные подборки всех часто используемых путей для всех основных соц сетей. Возможно даже лучше сделать таблицу Гугл докс и там все собрать.
 
  • Спасибо
Реакции: BotMastak

sibbora

Client
Регистрация
23.11.2013
Сообщения
149
Благодарностей
73
Баллы
28
Привет!
Помоги найти путь к выпадающему меню pinterest https://yadi.sk/i/OJZrsUbB3JEyRK

P.S. аккаунт в личку скинул
Элемент, по наведению на который появляется менюшка: //div[contains(@class, 'headerContainer')]/descendant::div[contains(@class, 'CampbellUserMenu')]

Общий предок для всех пунктов менюшки: //ul[contains(@class, 'CampbellMenuList')]

Первый пункт имеет удобный класс, по которому его можно различать. Путь к пункту "Мой профиль": //a[contains(@class, 'userProfileLink')] - ну или //ul[contains(@class, 'CampbellMenuList')]/descendant::a[contains(@class, 'userProfileLink')] если есть желание перестраховаться.

Остальные пункты различаются только видимым пользователю текстом, позицией и атрибутом href. Различать эти пункты лучше всего по href. Например для пункта "оплата" путь будет таким: //ul[contains(@class, 'CampbellMenuList')]/descendant::a[contains(@href, 'billing')]

Элементы присутствуют в дереве сразу после прогрузки страницы. Инициировать отображение меню для того чтобы кликнуть по пункту не нужно. Пример строки для клика:
Код:
instance.ActiveTab.FindElementByXPath("//ul[contains(@class, 'CampbellMenuList')]/descendant::a[contains(@href, 'billing')]", 0).Click();
Если нужна эмуляция мыши, то будет как-то так:
Код:
Tab Tab1 = instance.ActiveTab;
Tab1.FullEmulationMouseMoveToHtmlElement(Tab1.FindElementByXPath("//div[contains(@class, 'headerContainer')]/descendant::div[contains(@class, 'CampbellUserMenu')]/descendant::img", 0));
Thread.Sleep(1500);
Tab1.FullEmulationMouseMoveToHtmlElement(Tab1.FindElementByXPath("//ul[contains(@class, 'CampbellMenuList')]/descendant::a[contains(@href, 'billing')]", 0));
Tab1.FullEmulationMouseClick("left", "click");
P.S. вместо указания оси "/descendant::" можно просто писать двойную косую черту в середине пути - "//", но я в силу привычки пишу полное имя оси. Плюс необязательно брать родительские блоки, вроде //div[contains(@class, 'headerContainer')], так обычно страхуюсь от появления на странице дублирующихся блоков.
 
Последнее редактирование:

samsonnn

Client
Регистрация
02.06.2015
Сообщения
1 777
Благодарностей
1 447
Баллы
113
Пример более сложного пути XPath: //div[starts-with(@class,'userContentWrapper')]/descendant::a[contains(@class,'lfloat')]/following::h5/descendant::a[text()='Name']/following::a[starts-with(@class, 'UFILikeLink')]
с этого места расскажи пожалуйста поподробнее)
 

sibbora

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

Если кратко разобрать по шагам, то путь работает так:
//div[starts-with(@class,'userContentWrapper')]/descendant::a[contains(@class,'lfloat')]/following::h5/descendant::a[text()='Name']/following::a[starts-with(@class, 'UFILikeLink')] - ищем по всему дереву;
//div[starts-with(@class,'userContentWrapper')]/descendant::a[contains(@class,'lfloat')]/following::h5/descendant::a[text()='Name']/following::a[starts-with(@class, 'UFILikeLink')] - находим div, у которого значение атрибута class начинается со строки "userContentWrapper";
//div[starts-with(@class,'userContentWrapper')]/descendant::a[contains(@class,'lfloat')]/following::h5/descendant::a[text()='Name']/following::a[starts-with(@class, 'UFILikeLink')] - ищем для найденного на предыдущем шаге дива потомка с тегом a, у которого атрибут class содержит строку "lfloat";
//div[starts-with(@class,'userContentWrapper')]/descendant::a[contains(@class,'lfloat')]/following::h5/descendant::a[text()='Name']/following::a[starts-with(@class, 'UFILikeLink')] - ищем элемент с тегом h5, идущий после предыдущего найденного в дереве элементов;
//div[starts-with(@class,'userContentWrapper')]/descendant::a[contains(@class,'lfloat')]/following::h5/descendant::a[text()='Name']/following::a[starts-with(@class, 'UFILikeLink')] - для того ищем ссылку с текстом, равным строке "Name" (подразумевается ник в соцсети).
//div[starts-with(@class,'userContentWrapper')]/descendant::a[contains(@class,'lfloat')]/following::h5/descendant::a[text()='Name']/following::a[starts-with(@class, 'UFILikeLink')] - получаем целевой элемент - ссылка у которой класс начинается с "UFILikeLink", и которая в дереве элементов идёт после предыдущего элемента.

В пути использованы оси descendant, following (те что указаны явно), а также функции starts-with и contains.
 
  • Спасибо
Реакции: samsonnn и Dimionix

sibbora

Client
Регистрация
23.11.2013
Сообщения
149
Благодарностей
73
Баллы
28
Думаю многим интересно сеть ВК.
Начнем например с лайков постов в группах.
ВКонтактик - самая дружелюбная сеть с точки зрения формирования под неё XPath. Всё на поверхности, никаких шаманств с классами как в том же фейсе.

Элемент для лайка в группе:
upload_2017-5-17_18-29-40.png
//span[contains(@class, 'post_like_link')]

Если отталкиваться от контейнера поста, то такой путь: //div[starts-with(@class, '_post')]/descendant::span[contains(@class, 'post_like_link')]

Если прокладывать путь от имени человека, которому ставим лайки - то так: //a[@class='author' and text() ='Ольга Красноглазова']/ancestor::div[starts-with(@class, '_post')]/descendant::span[contains(@class, 'post_like_link')]

Специально для тех кто до сих пор не уверовал в силу XPath ;-) - чтобы лайкнуть пост пользователя Ольга Красноглазова, не нужно перебирать все посты на странице. Можно сделать это одной строкой кода:
Код:
instance.ActiveTab.FindElementByXPath("//a[@class='author' and text() ='Ольга Красноглазова']/ancestor::div[starts-with(@class, '_post')]/descendant::span[contains(@class, 'post_like_link')]", 0).Click();
 

sibbora

Client
Регистрация
23.11.2013
Сообщения
149
Благодарностей
73
Баллы
28
p.s Вообще предлагаю сделать полные подборки всех часто используемых путей для всех основных соц сетей. Возможно даже лучше сделать таблицу Гугл докс и там все собрать.
В одно лицо это сизифов труд. Табличку создал (тыц), буду сбрасывать в неё те пути про которые спрашивают. Если кто хочет поучаствовать в формировании справочника - пишите, предоставлю доступ на редактирование.
 
  • Спасибо
Реакции: sdsfwehbn и BotMastak

BotMastak

Client
Регистрация
04.12.2016
Сообщения
20
Благодарностей
4
Баллы
3
Привет. Не могу не воспользоваться бесплатной услугой :-)
Делаю парсер одного портала. Как составить путь к семейству элементов верхнего меню исключая пункты "Барахолка" и "Форум"
Сайт: onliner.by
Заранее спасибо
 

sibbora

Client
Регистрация
23.11.2013
Сообщения
149
Благодарностей
73
Баллы
28
Привет. Не могу не воспользоваться бесплатной услугой :-)
Делаю парсер одного портала. Как составить путь к семейству элементов верхнего меню исключая пункты "Барахолка" и "Форум"
Сайт: onliner.by
Заранее спасибо
Родительский элемент меню: //ul[@class='b-main-navigation']
upload_2017-5-18_17-51-58.png

Отдельные пункты меню: //a[@class='b-main-navigation__link']. Пункты "Барахолка" и "Форум" отличаются от остальных только ссылками и текстом, исключить их можно например так:
//ul[@class='b-main-navigation']/descendant::a[@class='b-main-navigation__link' and not(contains(@href, 'forum') or contains(@href, 'baraholka'))]

Но вообще смысла особого выделять эти пункты нет. Для парсинга проще сразу переходить по урлам разделов.
 

Valiksim

Client
Регистрация
14.04.2012
Сообщения
1 344
Благодарностей
298
Баллы
83
кто-то успел застолбить тему раньше
Блин, нельзя смеяться над... неумёхами новичками. Только не говори, что ты считаешь, что твой материал будет ниже по уровню... :ca:
 

sibbora

Client
Регистрация
23.11.2013
Сообщения
149
Благодарностей
73
Баллы
28
Блин, нельзя смеяться над... неумёхами новичками. Только не говори, что ты считаешь, что твой материал будет ниже по уровню... :ca:
Материал в конкурсе статей получился очень задорный, именно то что нужно чтобы зацепить народ, ни в какую не желающий слезать с регулярок :-) Для затравки - самое оно.
 
  • Спасибо
Реакции: Sz5

backoff

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

надо привязать к чему-то стойкому, а то id и классы бывают меняются

 
  • Спасибо
Реакции: TIIGR и Gulid

doc

Client
Регистрация
30.03.2012
Сообщения
8 684
Благодарностей
4 641
Баллы
113

backoff

Client
Регистрация
20.04.2015
Сообщения
6 052
Благодарностей
6 481
Баллы
113
так работает
Код:
//div[@style='direction: ltr;']
 
  • Спасибо
Реакции: TIIGR и Gulid

backoff

Client
Регистрация
20.04.2015
Сообщения
6 052
Благодарностей
6 481
Баллы
113
А как сделать так, чтобы текст вставлялся мгновенно, чтоб не эмулировался ввод, а то долго.

есть 2 кода, не знаю как ускорить, оба одинаковы по скорости

Код:
string xpath_exp = "(//div[@style='direction: ltr;'])";
string action_ev = "set|value";
string set_action = project.Variables["message"].Value;

return CommonCode.FindElementAndExecuteAction(instance, xpath_exp, action_ev, set_action);
Код:
var tab = instance.ActiveTab;
tab.FindElementByXPath("//div[@style='direction: ltr;']", 0).SetValue(project.Variables["message"].Value, "FULL");
 
  • Спасибо
Реакции: TIIGR и Gulid

doc

Client
Регистрация
30.03.2012
Сообщения
8 684
Благодарностей
4 641
Баллы
113
вместо "Full" впиши "None"
 
  • Спасибо
Реакции: backoff

backoff

Client
Регистрация
20.04.2015
Сообщения
6 052
Благодарностей
6 481
Баллы
113
как сделать клик по этому значению? по leftInTag ?
если html никак не хочет отображаться
 
  • Спасибо
Реакции: TIIGR и Gulid

backoff

Client
Регистрация
20.04.2015
Сообщения
6 052
Благодарностей
6 481
Баллы
113
Как в xpath сделать обращение к месту где много слов через пробел?

пример:

Код:
<textarea class="apps-share-chips-input" role="combobox" aria-autocomplete="list" placeholder="Введите имена или телефоны..." aria-label="Введите имена или телефоны..." style="width: 398px;"></textarea>
как сделать втавку по aria-label ?
 
  • Спасибо
Реакции: TIIGR и Gulid

speaker

Client
Регистрация
13.10.2012
Сообщения
287
Благодарностей
45
Баллы
28
Хотел спросить а можно при помощи xpath, проверять наличие кнопок, при том что разные сайты и соответственно имеют разное расположение.
И можно как то использовать для поиска intertext кнопки ? и как будет выглядеть путь если название кнопок на сайтах например кнопка1, кнопка2, кнопка3.?
 

Дмитрий621985

Пользователь
Регистрация
03.06.2018
Сообщения
166
Благодарностей
6
Баллы
18
XPath - очень мощный инструмент для поиска целевых элементов на странице. Если на простых сайтах хватает функционала ProjectMaker по автопоиску элементов при "записи действий", то на сложных сайтах - а практически все соцсети относятся к таковым - стабильно работает лишь код с качественно составленными путями XPath.

Создаю эту тему как некий аналог ветки "Бесплатные снипеты на заказ", в которой каждый участник может рассчитывать на бескорыстную помощь в создании C#-кода для своих проектов. Как автор небольшого курса по XPath, могу предложить участникам ресурса посильную помощь в освоении этого инструмента.

Помимо основного содержимого вопроса, прошу приводить ссылку на страницу, на которой будет присутствовать искомый элемент, а также скрин этого элемента или скрин с указанием его места в дереве элементов в ProjectMaker. Прошу также писать, какие действия нужно выполнить на странице для появления элемента, если сразу после перехода по ссылке элемент на ней отсутствует. Если для ответа на вопрос будет необходима регистрация - просьба предоставлять демо-аккаунт.

UPD: по предложению @sanchessam сделал табличку для путей.
Здрасти данная услуга до сих пор предоставляется?
 

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