t.me/atinfo_chat Telegram группа по автоматизации тестирования

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

Теги: #<Tag:0x00007f748ca5da90> #<Tag:0x00007f748ca5d978> #<Tag:0x00007f748ca5d860>

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

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

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

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

1 Симпатия

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

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

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

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

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

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

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

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

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

Тогда 2 contains

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

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

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

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

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

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

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

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

прикрепил

Решения вижу здесь 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')]

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

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