Тестирование узлов 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 не совпадают...

  1. //span[text() = 'Office Hours']

    Говорит:

    Выберите spanэлементы, которые имеют непосредственный дочерний текстовый узел,равный 'Часы работы'.

  2. //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']
Другие вопросы по тегам