Есть отличная удаленная работа для php+codeception+jenkins+allure+docker спецов. 100% remote! Присоединиться к проекту

знатокам XPATH: не находит элемент по тексту

xpath
Теги: #<Tag:0x00007f7b699ecaa0>

(Nikitoz777) #1

Проблема (Вопрос) заключается в том что не находит элемент
image
Код

.//*[contains(text()[normalize-space(.)],'Сумма перевода меньше $ 0.50')]

игра с пробелами не дала результата. если указывать без $ 0.50 то все ок


(Nik Sidorenko) #2

Так у Вас же перевод строки. Надо не пробелами играться, а переводами строк


(Nikitoz777) #3

Как тогда это отобразить в xpath


(Nik Sidorenko) #4

Попробуйте добавить “\n” прямо в текст после “Сумма перевода меньше”


(Maxim Andryushchenkov) #5

Вообще, играть с текстом в xpath - так себе практика, не стабильная. Мой совет - найдите этот элемент не по тексту и заберите текст, а потом заведите себе функу типа:

def get_lower_alnum_text(string: str) -> str:
    return ''.join([s.lower() for s in string if s.isalnum()])

И сравнивайте строки уже в тесте.


(Nikitoz777) #6

искать тест по хпасу - единственный вариант когда куча кнопок или филдов . работает стабильно. ищем же по тексту.


(Lev Yarushin) #7

Скопируйте текст из элемента, в xpath убрав граничные пробелы.


(Nikitoz777) #8

Пробовал, не помогл


(Alexandr D.) #9

Что мешает найти все элементы с куском текста «Сумма перевода меньше», а затем из них найти нужный?


(Lev Yarushin) #10

Тогда 2 contains

.//*[contains(text(),'Сумма перевода меньше') and contains(text(),'$ 0.50']

(Nikitoz777) #11

Хорошее решение, попробую


(Vatslau) #12

вам проверить значение или выбрать элемент?

если проверить значение я бы взял у этого элемента getText()
и потом простая проверка assertJ
так есть иквалс игнорируя пробелы, переносы строк и тд


#13

Если еще надо давай сюда свой кусок DOMа в текстовом формате, попробую напиать тебе xpath по тексту


(Kosmos) #14

Согласен.
Плюс, не генерируется ли часом $ 0.5 динамически? Если так, то xpath отрабатывает раньше сгенерированного элемента.


(Nikitoz777) #15

здесь эта страница https://cloud.mail.ru/public/9VL4/At3xjNcBm


(Nikitoz777) #17

нет, не генерируется


(Nikitoz777) #18

прикрепил


(Kosmos) #19

Решения вижу здесь 4:

  1. Использовать более точное количество пробелов в искомой строке
  2. Использовать другой XPath, который позволит получить доступ именно к данному узлу? например,
    .//small[contains(text(), '$ 0.50')]
  3. Воспользоваться регулярными выражениями XPath, например matches или replace (подробнее можно почитать по ссылке https://www.w3.org/TR/xquery-operators/#regex-syntax). К сожалению, они не работают в браузерах, т.к. в них до сих пор встроена поддержка только XPath версии 1.0 (Google Chrome использует libxml2, подробнее https://cs.chromium.org/chromium/src/third_party/libxml/README.chromium )
  4. Воспользоваться XPath:
    .//*[contains(normalize-space(text()), 'Сумма перевода меньше $ 0.50')]

(Сергей Кузьмин) #20

по моему если code base java (java.util.stream.Collectors) c# (System.Linq) ruby (core) ( про Пyтон наверняка не знаю ) то можно производить на клиенте фильтрацию и по моему это довольно популярно


(Valya Degay) #21

А если так?
.//*[text()[contains(normalize-space(.),‘Сумма перевода меньше $ 0.50’)]]