Действие в конкретном блоке среди многих

tiptopvkr

Client
Регистрация
26.09.2019
Сообщения
189
Благодарностей
14
Баллы
18
Привет всем. Помогите решить задачку.

Суть: Есть несколько блоков с отзывами. У них есть количество звезд. Разное от 1 до 5.

Задача: Поставить лайк отзыву с 4-5 звездами.

Вопрос: Как мне заставить программу понять что лайк можно поставить именно в том блоке где присутствует нужное количество звезд.

Дополнительная сложность: Все виджеты звезд с идентичными классами. Отличаются только стилем style: width 50px. У разного количества звезд разная ширина в стилях. Например у 5 звезд всегда 84 пиксея, у 4 - 67пикс, у 3- 50пикс и т.п.


49727


P.S. Я очень мало знаю С# потому предложения написать код ничего не дадут) Нужен пример или подсказка где копать. заранее всем благодарен за помощь)
 

tiptopvkr

Client
Регистрация
26.09.2019
Сообщения
189
Благодарностей
14
Баллы
18
Извините был напуган) Яндекс отзывы. https://yandex.ru/search/?text=тц москва&lr=213 Вот например какой то торговый центр в Москве. В примере есть 4 и 5 звезд
 

Valandersi

Client
Регистрация
19.01.2015
Сообщения
1 923
Благодарностей
1 123
Баллы
113
  • Спасибо
Реакции: doc

tiptopvkr

Client
Регистрация
26.09.2019
Сообщения
189
Благодарностей
14
Баллы
18
Видна. А еще этот класс идентичен для полных и пустых звезд. И это на странице с картой. А я показывал пример страницы без карты. там этого нет и все звезды в одном теге span и div. И на скрине все что там есть если нажать "исследовать элемент."
49734


Кроме того вопрос стоит в том как мне лайкнуть отзыв где определенное количество звезд.
 

Valandersi

Client
Регистрация
19.01.2015
Сообщения
1 923
Благодарностей
1 123
Баллы
113
Вопрос: Как мне заставить программу понять что лайк можно поставить именно в том блоке где присутствует нужное количество звезд.

Проверяйте ширину элемента если 84 ставим, если нет не ставим...
 

tiptopvkr

Client
Регистрация
26.09.2019
Сообщения
189
Благодарностей
14
Баллы
18
Это хорошо но как мне указать что класс с лайком стоит в блоке который прошел эту проверку? У лайков у всех один класс review-item__reaction_type_like а в разных блоках у них разные порядковые номера причем начиная с 15

49735
 

Phoenix78

Client
Read only
Регистрация
06.11.2018
Сообщения
11 790
Благодарностей
5 720
Баллы
113
ну как я это вижу. вот по этому xpath : //*/div[contains(@class,"modal-popup__content")]//div[contains(@class,"pane_active_yes")]//div[contains(@class,'reviews__list')]//span/div[@class='rating__star']
находим все элементы на странице и получаем этот элемент style и выпарсить его значение. либо через свойства элемента получить ширину.
пробегаемся в цикле по всем элементам и проверяем условия нахождения. если совпало ставим лайк. нет идем дальше
49736
 
  • Спасибо
Реакции: tiptopvkr

tiptopvkr

Client
Регистрация
26.09.2019
Сообщения
189
Благодарностей
14
Баллы
18
Это я понял и получилось. Но дальше то что? Я получил просто список значений
49742


Но как мне задать задачу чтобы был клик именно на лайк именно в блоке где есть необходимая ширина? Я не пойму как это все связать воедино. По отдельности понятно как найти нужные звезды, как найти кнопку лайка но как найти ту кнопку лайка где есть нужные звезды не понятно.

Вот составляющие для примера:
Есть блок:
49743

Он же review-item__wrapper
В нем есть звезды с шириной необходимой.
Ниже есть кнопка лайка review-item__reaction_type_like со своим порядковым номером 15

Ниже есть аналогичный блок но в кнопке лайка review-item__reaction_type_like уже порядковый номер 16

И я никак не могу понять как просмотреть каждый review-item__wrapper и если в нем есть нужная ширина звезд то ищем review-item__reaction_type_like и получаем его порядковый номер чтобы затем по нему кликнуть. Ну и если звезды не совпали то берем следующий review-item__wrapper и повторяем процедуру.

Как кликнуть по review-item__reaction_type_like с нужным порядковым номером я уже знаю)
 

Valandersi

Client
Регистрация
19.01.2015
Сообщения
1 923
Благодарностей
1 123
Баллы
113
Это я понял и получилось. Но дальше то что? Я получил просто список значений
Посмотреть вложение 49742

Но как мне задать задачу чтобы был клик именно на лайк именно в блоке где есть необходимая ширина? Я не пойму как это все связать воедино. По отдельности понятно как найти нужные звезды, как найти кнопку лайка но как найти ту кнопку лайка где есть нужные звезды не понятно.

Вот составляющие для примера:
Есть блок:
Посмотреть вложение 49743
Он же review-item__wrapper
В нем есть звезды с шириной необходимой.
Ниже есть кнопка лайка review-item__reaction_type_like со своим порядковым номером 15

Ниже есть аналогичный блок но в кнопке лайка review-item__reaction_type_like уже порядковый номер 16

И я никак не могу понять как просмотреть каждый review-item__wrapper и если в нем есть нужная ширина звезд то ищем review-item__reaction_type_like и получаем его порядковый номер чтобы затем по нему кликнуть. Ну и если звезды не совпали то берем следующий review-item__wrapper и повторяем процедуру.

Как кликнуть по review-item__reaction_type_like с нужным порядковым номером я уже знаю)
//*/div[contains(@class,"modal-popup__content")]//div[contains(@class,"pane_active_yes")]//div[contains(@class,'reviews__list')]//span/div[@class='rating__star' and @style="width:84px"]
 
  • Спасибо
Реакции: tiptopvkr

tiptopvkr

Client
Регистрация
26.09.2019
Сообщения
189
Благодарностей
14
Баллы
18
Когда вставляю в конструктор действий для клика то кликает на все подряд и на лайки где ширина 84 и 67.

49754

А когда выношу в кубик то не работает. Пишет ошибку что не найден элемент.

Вот картинка кубика
49753


Относительно цикла понятно что он нужен но я никак не могу понять как реализовать.
 

Phoenix78

Client
Read only
Регистрация
06.11.2018
Сообщения
11 790
Благодарностей
5 720
Баллы
113
заводишь переменную для цикла, в цикле ее увеличиваешь. ее вставляешь сюда
49757


получаешь элемент. проверяешь его, лайкаешь если надо, пошел на следующий
 

tiptopvkr

Client
Регистрация
26.09.2019
Сообщения
189
Благодарностей
14
Баллы
18
Вся фишка в том что у меня эта конструкция почему то не срабатывает. Как переменную вставить я вкурсе. Уже научился. Но вот запустить не выходит у меня чтобы сработало хотя бы с прямым числом. И сработало верно. В ПМ в конструкторе срабатывает но кликает на все подряд игнорируя ширину. А когда жму перенести в проект то сам кубик отказывается работать и выдает ошибку.
 

Phoenix78

Client
Read only
Регистрация
06.11.2018
Сообщения
11 790
Благодарностей
5 720
Баллы
113

tiptopvkr

Client
Регистрация
26.09.2019
Сообщения
189
Благодарностей
14
Баллы
18
Так вот почему не срабатывает) А с# как я ранее упоминал я крайне не силен) Как подключить клик там можно? Подскажете мануал?
 

Phoenix78

Client
Read only
Регистрация
06.11.2018
Сообщения
11 790
Благодарностей
5 720
Баллы
113
Так вот почему не срабатывает) А с# как я ранее упоминал я крайне не силен) Как подключить клик там можно? Подскажете мануал?
так если xpath нужен, почему бы 7ку не поставить ?
 

karkun15

Client
Регистрация
31.01.2020
Сообщения
137
Благодарностей
4
Баллы
18
по xpath нельзя работать через конструктор. только в 7-й версии. в 5-й можно через c#
Здравствуйте. Я верно понял, чтобы блоки документа (в браузере) искать через Xpath нужно поставить последнюю версию софта? Спасибо
 

Phoenix78

Client
Read only
Регистрация
06.11.2018
Сообщения
11 790
Благодарностей
5 720
Баллы
113
Здравствуйте. Я верно понял, чтобы блоки документа (в браузере) искать через Xpath нужно поставить последнюю версию софта? Спасибо
либо 7ку ставить, либо использовать снипет на c# для работы с элементом
 

Astraport

Client
Регистрация
01.05.2015
Сообщения
4 983
Благодарностей
4 433
Баллы
113
Задача решается проще и без xPath.
Сначала собираем в список счётчик цикла всех div звезд в которых есть нужная нам ширина.
Потом из этого списка берем поочередно собранные индексы и кликаем по лайку с этим индексом.
 
  • Спасибо
Реакции: Phoenix78

karkun15

Client
Регистрация
31.01.2020
Сообщения
137
Благодарностей
4
Баллы
18
Astraport, мне нужно найти все li, у которых предок div class="navigation", в свою очередь у которого также есть тег h2 .. пример условный, так что я думаю Xpath все таки нужен.
 

Phoenix78

Client
Read only
Регистрация
06.11.2018
Сообщения
11 790
Благодарностей
5 720
Баллы
113
Задача решается проще и без xPath.
Сначала собираем в список счётчик цикла всех div звезд в которых есть нужная нам ширина.
Потом из этого списка берем поочередно собранные индексы и кликаем по лайку с этим индексом.
у каждого свой путь :-)
например мне проще с xpath работать. вот в примере со звездами там без поиска по 3-м, 4-м узлам такую хрень выдает. какие то невидимые звезды находит, плюс там на заднем плане есть неактуальные звезды.
без xpath там нормальный список звезд не собрать.
а с xpath сразу весь список нормальный можно сформировать, взять элемент, проверить его и тут же не отходя от кассы получить предка ось и получить элемент лайка в этой же записи.
 
Последнее редактирование:

Astraport

Client
Регистрация
01.05.2015
Сообщения
4 983
Благодарностей
4 433
Баллы
113
пример условный, так что я думаю Xpath все таки нужен.
без xpath там нормальный список звезд не собрать.
Нет такого сайта, который можно распарсить xPath и невозможно стандартными методами HTML + регулярки.
Многие и не знают о таких методах и свойствах как GetByNumber, GetChildren, PreviousSibling, ParentElenent и т. д.
 
  • Спасибо
Реакции: karkun15

Phoenix78

Client
Read only
Регистрация
06.11.2018
Сообщения
11 790
Благодарностей
5 720
Баллы
113
Нет такого сайта, который можно распарсить xPath и невозможно стандартными методами HTML + регулярки.
Многие и не знают о таких методах и свойствах как GetByNumber, GetChildren, PreviousSibling, ParentElenent и т. д.
я думал сравниваем типа простой способ из конструктора и xpath для новичков . вон человек не сразу сообразил что все это в цикле надо перебирать, какие ему регулярки ?
что бы с xpath работать c# знать не надо. вставил в готовый снипет и вуаля. только зная xpath можно визуально построить нужное в браузере.
тем более знать xpath полезно, можно много где применять.
а всякие там регулярки , GetByNumber, GetChildren, PreviousSibling, ParentElenent и т. д. это все не наглядно и не быстро. лично мое мнение.
 
  • Спасибо
Реакции: karkun15

Astraport

Client
Регистрация
01.05.2015
Сообщения
4 983
Благодарностей
4 433
Баллы
113
а всякие там регулярки , GetByNumber, GetChildren, PreviousSibling, ParentElenent и т. д. это все не наглядно и не быстро. лично мое мнение.
ИМХО наоборот, я практически перестал использовать xPath, хотя года 2-3 назад юзал часто.
 

Phoenix78

Client
Read only
Регистрация
06.11.2018
Сообщения
11 790
Благодарностей
5 720
Баллы
113
ИМХО наоборот, я практически перестал использовать xPath, хотя года 2-3 назад юзал часто.
у каждого свое ИМХО. возможно года через 3 и я так буду всем говорить, что xpath это отстой. а вот регулярки это сила. Но на текущий день , лично для меня регулярки это темный лес, а вот xpath полностью удовлетворяет моим нуждам. понятен, гибок,очень мощный, в браузере визуально контролируется результат, легко записывается в базу , легко из нескольких разных xpath собрать новую коллекцию и еще много чего есть о чем я слышал но пока не применял :-)
 

Valandersi

Client
Регистрация
19.01.2015
Сообщения
1 923
Благодарностей
1 123
Баллы
113
Я использую и регулирки и xpath. Можно мешать под разные задачи
 

tiptopvkr

Client
Регистрация
26.09.2019
Сообщения
189
Благодарностей
14
Баллы
18
Вернулся к этому вопросу решив остальные задачи попроще и изменил целевую страницу для работы.

Так и не могу разобраться как это реализовать. Совсем не получается.

Текущая задача кликнуть на все что на скрине. Этот блок может быть где угодно на странице. Когда он вначале все проще простого. Когда он в другом месте не могу ничего сделать...

50550


Это в акке яндекса когда заходим в колокольчик то есть задания от яндекса.

У всех звезд идентичный класс RatingEditable-Star и у всех заголовков идентичный класс Link В любом блоке. И в этом и с фильмами и с играми. Во всех блоках.

Зацепиться можно только за заголовок "Возможно, вы здесь были" у которого класс "Text Text_l Text_b" Но у заголовков других блоков класс идентичный. отличается только текст.

Я пробовал собрать Xpath чтобы спарсить хотя бы заголовок карточки и подставив его в переменную кликнуть но у меня ничего не срабатывает.

То же самое со звездами. Как можно вытянуть айди звезды? У всех звезд идентичные классы "RatingEditable-Star" но разные айди.

50553

тут видно что есть айди (или порядковый номер). Но в свойстве элемента его нет.
50554


В результате я совсем не понимаю как это реализовать.
 

sambukanuka

Client
Регистрация
17.09.2019
Сообщения
287
Благодарностей
97
Баллы
28
Вернулся к этому вопросу решив остальные задачи попроще и изменил целевую страницу для работы.

Так и не могу разобраться как это реализовать. Совсем не получается.

Текущая задача кликнуть на все что на скрине. Этот блок может быть где угодно на странице. Когда он вначале все проще простого. Когда он в другом месте не могу ничего сделать...

Посмотреть вложение 50550

Это в акке яндекса когда заходим в колокольчик то есть задания от яндекса.

У всех звезд идентичный класс RatingEditable-Star и у всех заголовков идентичный класс Link В любом блоке. И в этом и с фильмами и с играми. Во всех блоках.

Зацепиться можно только за заголовок "Возможно, вы здесь были" у которого класс "Text Text_l Text_b" Но у заголовков других блоков класс идентичный. отличается только текст.

Я пробовал собрать Xpath чтобы спарсить хотя бы заголовок карточки и подставив его в переменную кликнуть но у меня ничего не срабатывает.

То же самое со звездами. Как можно вытянуть айди звезды? У всех звезд идентичные классы "RatingEditable-Star" но разные айди.

Посмотреть вложение 50553
тут видно что есть айди (или порядковый номер). Но в свойстве элемента его нет.
Посмотреть вложение 50554

В результате я совсем не понимаю как это реализовать.
Решение нашли?
 

tiptopvkr

Client
Регистрация
26.09.2019
Сообщения
189
Благодарностей
14
Баллы
18
Неа. Пошел другим путем) Ставлю звезды в карточках компаний. Там только в одном месте и только 5 звезд) Лече попасть куда нужно. А в данном случае так и не получил совета по реализации.
 

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