Как правильно взять xpath на странице/Java/Selenium

Добрый день! Нужна ваша помощь.

У меня есть поисковая выдача со скрытыми номерами телефонов, нужно проверять скрытые ли они, если да то открывать

Для начала нужно взять сам элемент, я это реализовала так:
String text = driver.findElement(By.xpath("//span[contains(@class, “js-showPhoneBlock”)]/span/span/span/text()")).getText();
System.out.println(text);

Но селениум матерится:
org.openqa.selenium.InvalidSelectorException: invalid selector: The result of the xpath expression “//span[contains(@class, “js-showPhoneBlock”)]/span/span/span/text()” is: [object Text]. It should be an element.

Я прочила, что selenium не позволяет брать с text() в конце. Также пробовала, без text(), но выводится пустое поле.

1 лайк

String text = driver.findElement(By.xpath("//span[contains(@class, “js-showPhoneBlock”)]//span[@class=‘text’]")).getText();

3 лайка

Да с text() работать не будет
А ты не привязывайся к тексту, попробуй просто искать элемент показать - если он есть, то кликай по нему, вот и всё.
Найти его можно, например, так:
css - .phone_show_link
xpath - .//a[contains(@class, 'phone_show_link')]

И ещё, если цель “тестирования” :slight_smile: , состоит в вытягивании номеров телефона с результатов поиска, то номер телефона можно взять из аттрибута "data-phone-number" там у родительского элемента span с классом js-phone, и на показать уже кликать не нужно будет

2 лайка

Спасибо, суть в том что нужно проверить скрываются ли номера телефонов, ели да, то проверить работу кнопки “показать”

Там не все так просто, есть условыя где на объявлении номера не отображаються - они захайдены, но если брать селект кнопки “показать” то считаюся все

String text = driver.findElement(By.xpath("//span[contains(@class, “js-showPhoneBlock”)]//span[@class=‘text’]")).getAttribute(“innerHTML”);
попробуйте так

Спасибо большое, помогло!

разделяйте тесты back-end и UI, задача UI лишь правильно отобразить то, что пришло с бэка.

Скорее всего back-end хайдит номера, а фронт их лишь отображает, так и проверяйте этот хайдинг на беке.

Спасибо, а можно где-то прочитать как правильно организовать это или нужно со своими программистами советоватся?

Вы на скрин внимательно смотрели?

это не отменяет моего совета по разделению тестов :slight_smile:

Даже если хайдинг делается на стороне фронта. Нужно тестировать функцию хайдинга отдельно, просто подавая на вход номера телефон и проверяя что они за хайдились. А для селениум тестов более логично end-user сценарии писать.

p.s. Ну и по поводу Selenium, это достаточно низко уровневая библиотека и на рынке существуют библиотеки облегчающие работы с ним, так что призываю ТС по гуглить про Selenide, HtmlElements и т.д.

Бекэенд хайдит номер телефона?!..
Похоже на нонсенс…

Привет! =)

Если ты хочешь написать тест, то мне кажется нужно действовать следующим образом!

По факту у тебя есть два случая:

  1. Скрытый номер и линк «показать»
  2. Не скрытый номер и отсутствие линка «показать»

Ровно это и нужно проверить, желательно двумя отдельными тестами =)

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

После этого приступаем к тестам.

Первый тест:
Находим объявление, проверяем что есть линк «показать», проверяем что номер в формате XXXXXXX

Второй тест:
Находим объявление, кликаем на линк «показать», проверяем что линк пропал (я думаю что он пропадает, так ведь? =)), проверяем что номер показывается полностью.

Важно знать номер телефона до того, как начинаем тестировать.
Один из способов - создавать нужное объявление до теста и переходить прямо на него.
Если всё же нет такой возможности, то просто проверяем, что подставляется номер из атрибута data-phone-number =)

UPD:
Ах да, по теме для порядка //span[@class=‘js-phone’]//span[@class=‘text’]

Спасибо

Xpath на мой взгляд не удобен
CSS лучше