XPath: разница между точкой и текстом ()

Мой вопрос касается особенностей использования dot и text() в XPath . Например, следующие строки find_element возвращают один и тот же элемент:

 driver.get('http://stackoverflow.com/') driver.find_element_by_xpath('//a[text()="Ask Question"]') driver.find_element_by_xpath('//a[.="Ask Question"]') 

Так в чем же разница? Каковы преимущества и недостатки использования . и text() ?

Есть разница между ними . и text() , но эта разница не может возникнуть из-за вашего входного документа.

Если ваш входной документ выглядел (самый простой документ, который можно представить, учитывая ваши выражения XPath)

Пример 1

  Ask Question  

Тогда //a[text()="Ask Question"] и //a[.="Ask Question"] действительно возвращает точно такой же результат. Но рассмотрите другой входной документ, который выглядит как

Пример 2.

  Ask Question   

где элемент a также имеет дочерний элемент other который следует сразу после «Ask Question». Учитывая этот второй входной документ, //a[text()="Ask Question"] возвращает элемент a , а //a[.="Ask Question"] ничего не возвращает!


Это связано с тем, что смысл двух предикатов (все между [ и ] ) различен. [text()="Ask Question"] самом деле означает: return true, если какой-либо из текстовых узлов элемента содержит именно текст «Ask Question». С другой стороны, [.="Ask Question"] означает: return true, если строковое значение элемента идентично «Ask Question».

В модели XPath текст внутри элементов XML может быть разбит на несколько текстовых узлов, если другие элементы мешают тексту, как в примере 2 выше. Там other элемент находится между «Ask Question» и символом новой строки, который также считается текстовым контентом.

Чтобы сделать еще более ясный пример, рассмотрите в качестве входного документа:

Пример 3.

 Ask Questionmore text 

Здесь элемент фактически содержит два текстовых узла: «Задавать вопрос» и «больше текста», так как оба являются прямыми дочерними элементами a . Вы можете проверить это, запустив //a/text() в этом документе, который будет возвращен (отдельные результаты разделены ---- ):

 Ask Question ----------------------- more text 

Итак, в таком сценарии text() возвращает набор отдельных узлов, а . в предикате оценивается конкатенация строк всех текстовых узлов. Опять же, вы можете проверить это утверждение с помощью выражения пути //a[.='Ask Questionmore text'] которое успешно вернет элемент a .


Наконец, имейте в виду, что некоторые функции XPath могут принимать только одну строку в качестве входных данных. Как указывал Ларш в комментариях, если для такой функции XPath (например, contains() ) задана последовательность узлов, она обрабатывает только первый узел и молча игнорирует остальные.

Существует большая разница между dot (".") И text() : –

  • dot (".") В XPath называется «выражение контекстного элемента», потому что она относится к элементу контекста. Это может быть совпадение с узлом (например, element , attribute или text node ) или атомным значением (например, string , number или boolean ). Хотя text() означает совпадение только с element text который находится в string форме.

  • dot (".") Нотация – это текущий узел в DOM. Это будет объект типа Node, в то время как с помощью функции XPath text (), чтобы получить текст для элемента, он получает текст только до первого внутреннего элемента . Если текст, который вы ищете, находится после внутреннего элемента, вы должны использовать текущий узел для поиска строки, а не функции text () XPath .

Например: –

   link  

Здесь, если вы хотите найти элемент привязки с помощью текстовой ссылки , вам нужно использовать dot (".") . Потому что, если вы используете //a[contains(.,'link')] он находит элемент привязки, но если вы используете //a[contains(text(),'link')] функция text() не кажется найти его.

Надеюсь, это вам поможет .. 🙂

  • XPath содержит (текст (), «некоторая строка») не работает при использовании с узлом с более чем одним текстовым подзоном
  • Специальный символ в запросе XPATH
  • Как выбрать только видимые элементы с помощью XPath?
  • Java: как найти элемент через строку xpath на org.w3c.dom.document
  • XPath: выберите текстовый узел
  • Тест XPath, если значение узла - число
  • Использование Xpath с пространством имен по умолчанию в C #
  • XPath - Разница между узлом () и текстом ()
  • Как выполнить XPath one-liners из оболочки?
  • Использование XPATH для поиска текста, содержащего & nbsp;
  • Как получить пространства имен в файлах XML с помощью Xpath
  • Давайте будем гением компьютера.