Удаленка для jenkins+selenide+selenoid+allure+docker спецов на 2-3 часа в день. 100% remote! Присоединиться к проекту

Можно ли как-то комбинировать два xpath в одном?

xpath
locators
webdriver
Теги: #<Tag:0x00007fedc46d79a0> #<Tag:0x00007fedc46d7748> #<Tag:0x00007fedc46d7568>

(Oleksandr Molodetskyi) #1

Проблема (Вопрос) заключается

Мне нужно собрать цены со страницы на нескольких табах и проверить, что они отсортированы по возрастанию. При этом для одного из табов после обычного списка цен идет сразу же цены для альтернативных дат, которые отсортированы отдельно. В тегах связанных с ценами, я отличий с обычными ценами не нашел, но они начинаются после разделителя Alternative Dates.

Я попытался сделать

Я собираю все цены с помощью xpath по ценам - это отлично работает, но включает также и цены для альтернативных дат. что ломает мою проверку сортировки.
XPath для цен: //span[@data-test='price']//span[@data-test='JourneyDetailsPriceMain']
XPath для всех элементов, включая цены под разделителем Alternative Dates: //div[@class='Results__alternativeResultsDivider___CLC0m']//following::*
Я решил, что можно комбинировать xpath чтобы показывать все цены, которые не находятся под альтернативными данными

//span[@data-test='price']//span[@data-test='JourneyDetailsPriceMain'] and not(//div[@class='Results__alternativeResultsDivider___CLC0m']//following::*) ```

У меня не получилось ... комбинировать два  xpath, гугл и стейковерфлоу не нашел можно ли так делать. Возможно так делать нельзя.
Хотел узнать у сообщества можно ли комбинировать два xpath в одном и если да - то что  делаю не так?

(Oleksandr Molodetskyi) #2

как вариант решения задачи: можно собирать два массива цен - все цены и цены которые находятся под Альтернативными датами (xpath //div[@class=‘Results__alternativeResultsDivider___CLC0m’]//following::span[@data-test=‘price’]//span[@data-test=‘JourneyDetailsPriceMain’] ), потом вычислять размер массива цен с альтернативными датами = n и удалять из массива всех цен последние n элементов. Таким образом получать на выходе только цены для выбранной даты без альтернативных дат. Но если есть возможность сразу собирать только цены, не включающие альтернативные даты - я бы предпочел так


(Nik Sidorenko) #3

Неплохо бы HTML код страницы в студию. Сложно предложить решение опираясь только на существующий xpath


(Fuji F) #4

Обе цены в одном теге? Нельзя вытянуть по индексу у родителя?


(Oleksandr Molodetskyi) #5

меня интересует принципиально ли возможно так сделать, чем конкретное решение в этом случае. Можно даже перейти от HTML к XML.

<prices>
 <price> 1.00</price>
<price> 2.00</price>
 <price> 3.00</price>
<alternative dates>another date</alternative dates>
<price> 1.50</price>
<price> 2.50</price>
</prices>

чтобы вытащить все цены -xpath //price
чтобы вытащить только цены для альтернативных дат xpath: //alternative_dates//following::price
чтобы вытащить только цены, которые до альтернативных дат - комбинация //price and not(//alternative_dates//following::price) - не работает
можно вытащить с помощью //alternative_dates//preceding::price - получится ли так на моей странице с ценами, которая несколько сложнее этого xml и где альтернативные даты могут присутствовать, а могут и не присутствовать - тогда запрос на preceding ничего не найдет - будем посмотреть, но принципиальный вопрос - можно ли комбинировать два разных xpath и логические операнды в одном запросе, мне все же интересен.


(Oleksandr Molodetskyi) #6

пока единственное отличие которое я на шел - наличие надписи об альтернативных датах и этот class вроде применяется только для надписи, но не для цен под ним - то есть они именно following а не child


#7

У меня вот такое решение вашей проблемы получилось

//prices/price[not(preceding::alternative-dates)]


(Юрий Аксютин) #8

Может я не до конца понял вопрос, но почему бы не использовать “|”:

http://www.dotnetheaven.com/article/how-to-select-several-path-of-xpath-in-xml


(Юрий Аксютин) #9

Немного не по теме, но возможно будет интересно ознакомится с такой таблицей:


(Kyrylo Havrylenko) #10

Комбинирование xpath на Selenide:

$(By.xpath("//*").$(By.xpath(“div[@id=‘i_live_in_the_root_of_dom’]”);

Но вам, кажется, для начала нужно показать html того, что пытаетесь селектнуть.


(Oleksandr Molodetskyi) #11

Спасибо за ответы. В итоге. я все же остановился на варианте, что я собираю все цены, потом собираю цены только для альтернативных дат и потом отнимаю их от конца массивов всех цен. Такой подход кажется мне более удачным, так как альтернативные цены могут быть, а могут и не быть - тогда запрос, который включает хpath к ним будет выдавать эксепшн. Значит надо сначала проверять наличие альтернативных дат, а потом уже или запрашивать или не запрашивать цены для этих дат. А обычные цены есть всегда.


#12

Мой xpath так же выдаст обычные цены если нет альтернативных. Не будет ексепшена.