Как в xpath найти текст вне зависимости от регистра и пробелов?

Nekro

Client
Регистрация
01.08.2020
Сообщения
232
Благодарностей
24
Баллы
18
Здравствуйте.

Есть динамический текст:

CatDog?CAT
Cat dogcat
catdog cat


Подскажите пожалуйста, как найти элемент с этим текстом при любом из вариантов? (с разным регистром, пробелами и спец символами между текстом)

Я использую:
Код:
//*[text()="Cat dogcat"]
Но это работает только если я точно укажу текст как он есть.
 
Последнее редактирование:

Gunjubasik

Client
Регистрация
30.05.2019
Сообщения
3 526
Благодарностей
1 323
Баллы
113
Код:
//*[contains( translate(., 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz'), "Cat dogcat") ]
Попробуйте так
Код:
//*[contains(text(),"Cat dogcat")]
 
Последнее редактирование:

Phoenix78

Client
Read only
Регистрация
06.11.2018
Сообщения
11 790
Благодарностей
5 720
Баллы
113
Подскажите пожалуйста, как найти элемент с этим текстом при любом из вариантов? (с разным регистром, пробелами и спец символами между текстом)
слишком сложное условие. надо разбивать на кучу мелких.
 

Gunjubasik

Client
Регистрация
30.05.2019
Сообщения
3 526
Благодарностей
1 323
Баллы
113
Работает как на русский текст, так и на английский. Будет находить вхождения без учета регистра.
Код:
//*[contains( translate(., 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz'), "Cat") ]
Здравствуйте.

Есть динамический текст:

CatDog?CAT
Cat dogcat
catdog cat


Подскажите пожалуйста, как найти элемент с этим текстом при любом из вариантов? (с разным регистром, пробелами и спец символами между текстом)

Я использую:
Код:
//*[text()="Cat dogcat"]
Но это работает только если я точно укажу текст как он есть.
 
Последнее редактирование:
  • Спасибо
Реакции: Morti

Nekro

Client
Регистрация
01.08.2020
Сообщения
232
Благодарностей
24
Баллы
18
Работает как на русский текст, так и на английский. Будет находить вхождения без учета регистра.
Код:
//*[contains( translate(., 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz'), "Cat") ]
Попробовал. Как то странно работает. В одном варианте захват всей страницы. В другом вообще ничего. Тестировал прямо на эту страницу.
62909
62910
 

Gunjubasik

Client
Регистрация
30.05.2019
Сообщения
3 526
Благодарностей
1 323
Баллы
113
Попробовал. Как то странно работает. В одном варианте захват всей страницы.
Что странного? Вы в поиск этой темы лупанули целую строку кода, которая уже написана на странице, чего вы еще ожидали?
 
  • Спасибо
Реакции: Nekro

Nekro

Client
Регистрация
01.08.2020
Сообщения
232
Благодарностей
24
Баллы
18
Что странного? Вы в поиск этой темы лупанули целую строку кода, которая уже написана на странице, чего вы еще ожидали?
Я не понял как работает этот код. Но с дополнительными параметрами у меня получилось выбрать нужный элемент. Однако я так и не понял до конца. Почему у меня в первом случае находит элемент, а во втором нет?
Работает:
//div[contains( translate(., 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz'), "cat dog") ][@role="heading"]
Не работает:
//div[contains( translate(., 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz'), "Cat dog") ][@role="heading"]
Ищу <div role="heading">Cat dog</div>.

Происходит замена символов первой строки на вторую у cat dog и проверяется нахождение каждого возможного варианта?

Документацию прочитал, но всё равно не понял:
Функция translate производит замену символов первого своего строкового аргумента, которые присутствуют во втором аргументе на соответствующие символы третьего аргумента.
 
Последнее редактирование:

Gunjubasik

Client
Регистрация
30.05.2019
Сообщения
3 526
Благодарностей
1 323
Баллы
113
Я не понял как работает этот код. Но с дополнительными параметрами у меня получилось выбрать нужный элемент. Однако я так и не понял до конца. Почему у меня в первом случае находит элемент, а во втором нет?
Работает:
//div[contains( translate(., 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz'), "cat dog") ][@role="heading"]
Не работает:
//div[contains( translate(., 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz'), "Cat dog") ][@role="heading"]
Ищу <div role="heading">Cat dog</div>.

Происходит замена символов первой строки на вторую у cat dog и проверяется нахождение каждого возможного варианта?
Так сделан код, нужно вводить маленькими в данном случае, я тоже заметил это. Если например нужно что бы было 2 вхождения разных - который должны присутствовать, скопируйте [contains... повторно и вставьте будто копию и вместо первого слова введите обязательное наличие второго слова или символа.

Как только найду более гибкий вариант, который вы просите, я его размещу в этой теме, пока нету времени искать и подбирать методом тестов этот код.
 
  • Спасибо
Реакции: Morti и Nekro

Nekro

Client
Регистрация
01.08.2020
Сообщения
232
Благодарностей
24
Баллы
18
Так сделан код, нужно вводить маленькими в данном случае, я тоже заметил это. Если например нужно что бы было 2 вхождения разных - который должны присутствовать, скопируйте [contains... повторно и вставьте будто копию и вместо первого слова введите обязательное наличие второго слова или символа.

Как только найду более гибкий вариант, который вы просите, я его размещу в этой теме, пока нету времени искать и подбирать методом тестов этот код.
Понял. Спасибо. Так можно и все возможные варианты подставить получается таким костыльным способом :-)

Километр кода:
//div[contains( translate(., 'abcdefghijklmnopqrstuvwxyz', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'), "CAT") ][contains( translate(., 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz'), "dog") ][contains( translate(., 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz'), "cat") ][contains( translate(., 'abcdefghijklmnopqrstuvwxyz', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'), "DOG") ][@role="heading"]
Ещё бы с пробелами разобраться...
 

Gunjubasik

Client
Регистрация
30.05.2019
Сообщения
3 526
Благодарностей
1 323
Баллы
113
Понял. Спасибо. Так можно и все возможные варианты подставить получается таким костыльным способом :-)

Километр кода:
//div[contains( translate(., 'abcdefghijklmnopqrstuvwxyz', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'), "CAT") ][contains( translate(., 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz'), "dog") ][contains( translate(., 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz'), "cat") ][contains( translate(., 'abcdefghijklmnopqrstuvwxyz', 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'), "DOG") ][@role="heading"]
Ещё бы с пробелами разобраться...
А что с ними не так?Не делайте пробелов и будет радость
 
  • Спасибо
Реакции: Nekro

backoff

Client
Регистрация
20.04.2015
Сообщения
6 052
Благодарностей
6 482
Баллы
113
а нельзя ли запилить типа такого?

//*[contains(text(), 'regex')]

ну типа
//*[contains(text(), 'cat.*?cat')]

ps \ я протсо с регуляркой в xpath не работал, но интересно
 

Nekro

Client
Регистрация
01.08.2020
Сообщения
232
Благодарностей
24
Баллы
18
А что с ними не так?Не делайте пробелов и будет радость
Ааа всё работает оказывается и с пробелами. Чудо!

а нельзя ли запилить типа такого?

//*[contains(text(), 'regex')]

ну типа
//*[contains(text(), 'cat.*?cat')]

ps \ я протсо с регуляркой в xpath не работал, но интересно
Вот это тоже интересно. Было бы круто использовать таким способом регулярку.
 

orka13

Client
Регистрация
07.05.2015
Сообщения
2 177
Благодарностей
2 184
Баллы
113
Регулярные выражения в xpath поддерживаюстя с версии 2.0. Но пока редко какой софт ее поддерживает, так что остается только мечтать. Используйте комбинации:
Код:
contains
starts-with
ends-with
 

Кто просматривает тему: (Всего: 2, Пользователи: 0, Гости: 2)