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

  • Автор темы Автор темы sibbora
  • Дата начала Дата начала

sibbora

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

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

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

UPD: по предложению @sanchessam сделал табличку для путей.
 
Последнее редактирование:
Кратко о том что такое 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')]
 
Думаю многим интересно сеть ВК.
Давайте сделаем коллекцию актуальных путей Xpath для всего что только можно там. Начнем например с лайков постов в группах.

p.s Вообще предлагаю сделать полные подборки всех часто используемых путей для всех основных соц сетей. Возможно даже лучше сделать таблицу Гугл докс и там все собрать.
 
  • Спасибо
Реакции: BotMastak
Привет!
Помоги найти путь к выпадающему меню 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')], так обычно страхуюсь от появления на странице дублирующихся блоков.
 
Последнее редактирование:
Пример более сложного пути XPath: //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[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
Думаю многим интересно сеть ВК.
Начнем например с лайков постов в группах.
ВКонтактик - самая дружелюбная сеть с точки зрения формирования под неё 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();
 
p.s Вообще предлагаю сделать полные подборки всех часто используемых путей для всех основных соц сетей. Возможно даже лучше сделать таблицу Гугл докс и там все собрать.
В одно лицо это сизифов труд. Табличку создал (тыц), буду сбрасывать в неё те пути про которые спрашивают. Если кто хочет поучаствовать в формировании справочника - пишите, предоставлю доступ на редактирование.
 
  • Спасибо
Реакции: sdsfwehbn и BotMastak
Привет. Не могу не воспользоваться бесплатной услугой :)
Делаю парсер одного портала. Как составить путь к семейству элементов верхнего меню исключая пункты "Барахолка" и "Форум"
Сайт: onliner.by
Заранее спасибо
 
Привет. Не могу не воспользоваться бесплатной услугой :-)
Делаю парсер одного портала. Как составить путь к семейству элементов верхнего меню исключая пункты "Барахолка" и "Форум"
Сайт: 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'))]

Но вообще смысла особого выделять эти пункты нет. Для парсинга проще сразу переходить по урлам разделов.
 
кто-то успел застолбить тему раньше
Блин, нельзя смеяться над... неумёхами новичками. Только не говори, что ты считаешь, что твой материал будет ниже по уровню... :ca:
 
Блин, нельзя смеяться над... неумёхами новичками. Только не говори, что ты считаешь, что твой материал будет ниже по уровню... :ca:

Материал в конкурсе статей получился очень задорный, именно то что нужно чтобы зацепить народ, ни в какую не желающий слезать с регулярок :) Для затравки - самое оно.
 
  • Спасибо
Реакции: Sz5
помогите с путем плиз

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

nAy8GByFY06qM2.jpg
 
  • Спасибо
Реакции: TIIGR и Gulid
А как сделать так, чтобы текст вставлялся мгновенно, чтоб не эмулировался ввод, а то долго.

есть 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
Как в xpath сделать обращение к месту где много слов через пробел?

пример:

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

как сделать втавку по aria-label ?
 
  • Спасибо
Реакции: TIIGR и Gulid
Хотел спросить а можно при помощи xpath, проверять наличие кнопок, при том что разные сайты и соответственно имеют разное расположение.
И можно как то использовать для поиска intertext кнопки ? и как будет выглядеть путь если название кнопок на сайтах например кнопка1, кнопка2, кнопка3.?
 
XPath - очень мощный инструмент для поиска целевых элементов на странице. Если на простых сайтах хватает функционала ProjectMaker по автопоиску элементов при "записи действий", то на сложных сайтах - а практически все соцсети относятся к таковым - стабильно работает лишь код с качественно составленными путями XPath.

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

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

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

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