Сравнение значений с пробелами в локаторе

В xPath можно использовать операторы < > = и т.д. для поиска элементов по значению. Если на странице просто значение типа 78, то всё ок. А что делать, если значение с пробелом &thinsp ; ?
страница: http://rozetka.com.ua/vino/c4594285/filter/colour-70004=362655/
локатор: //div[@class=‘g-price-uah’][text()<70]
результат: имеем 3 бутылки красного вина стоимостью дешевле 70 грн

переходим к телефонам
страница: http://rozetka.com.ua/mobile-phones/c80003/filter/preset=smartfon/
локатор: //div[@class=‘g-price-uah’][text()<4000] - естественно работать не будет

Задача
Требуется убрать из строки некоторые символы (например, пробельные).
Решение
XSLT 1.0
Воспользуйтесь функцией translate() с пустой строкой замены. Напри­мер, следующий код удаляет из строки все пробельные символы:
translate($input, " ", “”)

http://internetka.in.ua/xpath-start-part3/

1 лайк

Может че то не понял, но попробуйте в Xpath использовать - substring() - возвращает строку вырезанную из строки начиная с указанного номера, второй параметр number (необязательный) — количество символов (string substring(‘string’, number, number)).

Пример -
1. //*[contains(text(), substring('Блок1вавав', 1, 5))] 2. //*[contains(@id, substring('aq-block-880-2', 8, 6))]

Пояснение к 2-м примерам

1.substring(‘Блок1вавав’, 1, 5) функция возьмет 5 символов, начиная с первого. Результат выполнения функции “Блок1”.
2. Выбираем все элементы в которых содержится атрибут @id с текстом ‘aq-block-880-2’. Далее текст ‘aq-block-880-2’ обрезаем 6 символов, начиная с 8 символа .

Другие строковые функции с примерами тут - XPath'ник / CSS'ник - Google Sheets

Как-раз и не понял, нужно из строки убрать пробелы разделители. Т.к. сумма 4000 отображена в виде “4 000”, так что substring не подходит в априори.

string normalize-space(string)- убирает лишние и повторные пробелы, а также управляющие символы, заменяя их пробелами - пробовали?

1 лайк

//div[@class=‘g-price-uah’][translate(text(), " “,”")=3999]
такой вариант работает, но находит не то, что надо, а то, что надо не находит.

Прочтите еще раз, что делает эта функция normalize-space.

А по подробнее, а то пальцем в небо.

http://rozetka.com.ua/mobile-phones/c80003/filter/preset=smartfon/ Он находит элементы, которые записаны как “3 999”, но не находит “3&thinsp ;999”

Сходу придумал 3-4 варианта. Если без регулярок то например вот так:

//div[@class='g-price-uah'][translate(text(), translate(text(), '0123456789', ''), '')<3200]

C регулярками будет более элегантно.

3 лайка

Давай с регулярками тоже )

Ошибся, оказывается webdriver не поддерживает xpath 2.0, поэтому replace() не будет работать. Functions - XPath | MDN . Ограничиваю до пары вариантов :slight_smile: Вообще на самом деле можно поигрываться с сабстрингом + позишн, высчитывая нужный позишн в случае если есть html entity символ. В любом случае выше - самый короткий вариант для этого. Попозже попробую сделать костыль из sub&position