Тестирование узлов text() и строковых значений в XPath
У меня есть узел следующим образом:
<span class="portal-text-medium">Office Hours</span>
Для XPath я использую
//span[text()='Office Hours']
который должен работать, но это никогда не работает. я могу использовать *contains(text(),'Office Hours')]*
но это не найдет точного соответствия, и я должен убедиться, что нет "*". Это не единственный раз, когда это не сработало для меня. Я видел, как это работает раньше, поэтому я не знаю, что не так. Любая идея?
Да, я могу использовать starts-with
но это не совсем то же самое.
2 ответа
XPath text() =
отличается от XPath . =
(Соответствующие текстовые узлы отличаются от соответствующих строковых значений)
Следующие XPath не совпадают...
//span[text() = 'Office Hours']
Говорит:
Выберите
span
элементы, которые имеют непосредственный дочерний текстовый узел,равный 'Часы работы'.//span[. = 'Office Hours']
Говорит:
Выберите
span
элементы, строковое значениекоторых равно 'Часы работы офиса'.
Вкратце, для узлов элементов:
Строковое значение узла элемента - это объединение строкового значения s всех потомков текстового узла узла элемента в порядке документа.
Примеры
Следующие span
элементы будут соответствовать только #1:
<span class="portal-text-medium">Office Hours<br/>8:00-10:00</span>
<span class="portal-text-medium">My<br/>Office Hours</span>
Следующие span
элементы будут соответствовать только # 2:
<span class="portal-text-medium"><b>Office</b> Hours</span>
<span class="portal-text-medium"><b><i>Office Hours</i></b></span>
Следующие span
элемент будет соответствовать как #1, так и # 2:
<span class="portal-text-medium">Office Hours</span>
Используйте contains с операцией AND, которая поможет вам найти точный элемент
//span[contains(@class, 'portal-text-medium') and text()='Office Hours']