Как точка (.) В xpath принимает несколько форм при идентификации элемента и сопоставлении текста - PullRequest
0 голосов
/ 26 сентября 2019

У меня есть следующая структура dom:

<h3 class="popover-title">
 <div class="popup-title">
   <div class="title-txt">Associated Elements&nbsp;&nbsp(5)</div>
 </div>
</h3>

Я пытаюсь написать xpath, который идентифицирует заголовок «Связанные элементы» под тегом h3.

Когда мой xpath равен

//div[contains(@class, popover)]//h3[contains(.,'Associated Elements')]

элемент идентифицирован.

Однако, когда мой xpath равен

//div[contains(@class, popover)]//h3[contains(text(),'Associated Elements')]

, элемент не идентифицирован.Насколько я понимаю, точка (.) Является заменой text (), но почему она не идентифицирует элемент, когда я использую функцию text ().

Однако для другой структуры dom:

<h3 class="popover-title">
   <a class="btn-popover" href="#">x</a>
   "Associated Elements"
</h3>

xpath:

//div[contains(@class, popover)]//h3[contains(text(),'Associated Elements')]

&

//div[contains(@class, popover)]//h3[contains(.,'Associated Elements')]

работает нормально.

Может кто-нибудь объяснить, пожалуйста, поведение точки (.) Воба эти сценария?

Есть ли лучший способ написать xpath, который подходит для обоих примеров?Пожалуйста, предложите.

Ответы [ 2 ]

1 голос
/ 26 сентября 2019

Поскольку помечен, поэтому этот ответ будет основан на и связанных XML Path Language (XPath) версиях 1.0 спецификаций.


содержит (строка, строка)

Функция boolean contains(string, string) возвращает истину, если строка первого аргумента содержит вторую строку аргумента, и в противном случае возвращает ложь.Например:

//h3[contains(.,'Associated Elements')]

Текстовые узлы

Символьные данные сгруппированы в текстовые узлы .Как можно больше символьных данных сгруппировано в каждый текстовый узел. строковое значение текстового узла является символьными данными.Текстовый узел всегда имеет хотя бы один символ данных.В приведенном ниже примере text() выбирает все дочерние текстовые узлы узла контекста:

//h3[text()='Associated Elements']

В вашем сценарии использования внутри HTML-текста текст Associated Elements (5) have &nbsp;, который альтернативно называют фиксированным пространством или жестким пространством , NBSP (неразрывный пробел) , используемым в программировании для созданияпробел в строке, который нельзя разбить переносом слов.В HTML &nbsp; позволяет создавать несколько пробелов, видимых на веб-странице, а не только в исходном коде.


Анализ ваших испытаний кода

Ваша первая пробная версия кода с:

//h3[contains(.,'Associated Elements')]

находит элемент, который успешно идентифицируется с неполным текстом Связанные элементы

Вторая пробная версия кода с:

//h3[contains(text(),'Associated Elements')]

терпит неудачу , поскольку элемент содержит еще несколько символов, например &nbsp; в дополнение к тексту Associated Elements .

0 голосов
/ 26 сентября 2019

text() в contains(text(),'Associated Elements') является селектором, который соответствует всем текстовым узлам, которые являются дочерними элементами контекстного узла, - он возвращает набор узлов.Этот набор узлов преобразуется в строку и передается в функцию contains().

text() не функция, а тест узла.Он используется для выбора всех дочерних узлов текстового узла контекста.Таким образом, если узел контекста является элементом с именем x, тогда text () выбирает все дочерние элементы текстового узла для x.

Когда вы используете contains(., 'Associated Elements'), в функцию передается только отдельный текстовый узел, и этовозможность уникального соответствия тексту.

Примечание: скопировано и отредактировано из этого и этого сообщения .

...