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

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

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

(Геннадий Мищевский) #1

В 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] - естественно работать не будет


(Ray Romanov) #2

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

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


(Женя Воронкин) #3

Может че то не понял, но попробуйте в 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 символа .

Другие строковые функции с примерами тут - https://docs.google.com/spreadsheets/d/1nUXOnPCPI3_Pi9Xxv13SH6g5ZNsXymqpJ9ktBtzD7ig/edit#gid=0


(Ray Romanov) #4

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


(Женя Воронкин) #5

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


(Геннадий Мищевский) #6

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


(Ray Romanov) #7

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


(Ray Romanov) #8

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


(Геннадий Мищевский) #9

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


(Stan) #10

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

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

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


(Геннадий Мищевский) #11

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


(Stan) #12

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