Удаленка для jenkins+selenide+selenoid+allure+docker спецов на 2-3 часа в день. 100% remote! Присоединиться к проекту

Вопрос на знание XPATH - почему не находит элемент?

xpath
locators
webdriver
Теги: #<Tag:0x00007fedb7e26cb8> #<Tag:0x00007fedb7e26b78> #<Tag:0x00007fedb7e26a38>

(Nikitoz777) #1

Всем привет.

Вот такой локатор:

.//*[contains(text(),‘Вы успешно’)]

<div class="step-success ng-binding">
            <div class="svg-icon svg-icon-3x svg-icon-success" name="icon-success" size="3">
                        <svg class="icon-svg"><use xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="/images/icons-svg-931e29ae.svg#icon-success"></use></svg>
                        <!-- ngIf: additionalIcon -->
                    </div>
            Вы успешно создали инвайт(-ы)
</div>

(vmaximv) #2

https://www.w3.org/TR/1999/REC-xpath-19991116/#node-tests

https://www.w3.org/TR/1999/REC-xpath-19991116/#section-Function-Calls

https://www.w3.org/TR/1999/REC-xpath-19991116/#section-String-Functions


(Nikitoz777) #3

и?) это не отвечает на вопрос, синтаксис у локатора правильный


(vmaximv) #4

В полной мере отвечает. Читайте - вдумывайтесь.


#5

//div[contains(text()[normalize-space()],‘Вы успешно’)]


(Nikitoz777) #6

спасибо получилось!


(vmaximv) #7

Не очень изящно.


(Nikitoz777) #8

других вариантов нет если нужно искать по тексту


(Pavel Ozerov) #9

Полагаю, что в Селениде я бы сделал что-то вроде:

$(By.xpath("//*[text()=“Вы успешно создали инвайт(-ы)”]"));


(ex3me0) #10

Думаю все же есть, но надо проверять на конкретно вашем объекте

Иногда объект может содержать несколько текстовых нод. На примере их две: одна просто перенос строки, вторая - как раз содержит необходимый текст. Селектор в этом же примере - дергает текст из второй ноды, и является правильным (ну в какой-то мере “правильным”, как компромис между хорошим и красивым)

Ну и да: @vmaximv ответил на вопрос в первом же посте, конкретно описанная мною проблема - это 3я цитата, и скорее всего применима именно в вашем случае.
Я разжевал, что называется, на пальцах, в иной раз - так же отправил бы читать мат.часть; головой надо думать, а не бежать с каждой встречной банальностью на форумы за помощью


(Fiodar Motin) #11

//*[text()=‘Вы успешно’]


(Black Box Blues) #12

Не сработает. Нужен дополнительно contains() как минимум.


(Fiodar Motin) #13

Извиняюсь, вы правы нужен contains.


(Денис Мищенко) #14

В selenide (c 4.10 понимает “неразрывные” пробелы) можно так:

$(withText("Вы успешно"))

(vmaximv) #15

(Dez Dezsson) #16

//*[contains(.,‘Вы успешно’)]


(vmaximv) #17

Если вы объясните как работает ваш локатор - то скорее всего вы сами поймёте, что так делать очень плохо.