В чем разница между.// и //* в XPath?

при поиске относительного XPath через Firebug : он создает как

  1. .//*[@id='Passwd']--------- Что делать, если мы не используем dot в начале, что это означает?

  2. просто добавить //* в Xpath -- он подчеркивает - - - различные элементы страницы---------- что это значит?

Ниже приведены XPaths для полей паролей Gmail. Что такое значение * ?

  • .//*[@id='Passwd']

  • //child::input[@type='password']

4 ответов


все эти выражения выбирают разные наборы узлов:

.// * [@id= 'Passwd']

The '. в начале означает, что текущая обработка начинается с текущего узла. "*"Выбирает все узлы элементов, нисходящие от этого текущего узла с @id - attribute-значение, равное "Passwd".

что делать, если мы не используем точку в начале, что это означает?

затем вы выберете все узлы элементов с @id - attribute-значение, равное "Passwd" в весь документ.

просто добавьте / / * в XPath - он выделяет - - - различные элементы страницы

это позволит выбрать все узлы элементов весь документ.

ниже упомянуто : XPatht для поля пароля Gmail истинны, что такое значение * ?

.//*[@id='Passwd']

это позволит выбрать все узлы элемента спуск от текущего узла, который @id - attribute-value равно 'Passwd'.

/ / child:: input[@type= 'password']

это будет выбрать все дочерние узлы элемента с именем input, который @type-attribute-значения равны "пароль". The child:: префикс оси может быть опущен, поскольку это поведение по умолчанию.

синтаксис выбора соответствующего выражения объясняется здесь w3school.com.

и объясняются оси (текущая точка в обработке)здесь на другом w3school.com страница.


здесь есть несколько различных ключевых концепций XPath...

абсолютный vs относительный XPaths (/ vs .)

  • / вводит абсолютный путь, начиная с корневого документа.
  • . вводит относительный путь, начиная с контекстного узла.

именованный элемент против любого элемента (ename vs *)

  • /ename выбирает ename корневой элемент
    • ./ename выбирает все ename дочерние элементы текущего узла.
  • /* выбирает корневой элемент, независимо от имени.
    • ./* или * выбирает все дочерние элементы контекстного узла, независимо от имени.

ось потомок-или-собственной личности (//*)

  • //ename выбирает все ename элементы в документе.
    • .//ename выбирает все ename элементы В или под узлом контекста.
  • //* выбирает все элементы в документе, независимо от имени.
    • .//* выбирает все элементы, независимо от имени, в узле контекста или под ним.

С этими концепции в виду, вот ответы на ваши конкретные вопросы...

  • .//*[@id='Passwd'] значит, чтобы выбрать все элементы На или под текущий контекстный узел, который имеет id значение атрибута, равное 'Passwd'.
  • //child::input[@type='password'] можно упростить до //input[@type='password'] и означает выбрать все input элементы в документе, который имеет type значение атрибута, равное 'password'.

точка в XPath называется "контекстное выражение". Если вы поставите точку в начале выражения, это сделает его контекстно-специфичным. Другими словами, он будет искать элемент с id="Passwd" в контексте узла, на котором вы вызываете метод" найти элемент по XPath".

на * на .//*[@id='Passwd'] помогает матча любой элемент С id='Passwd'.


  1. первый вопрос - все о контексте. Вы можете видеть синтаксис чтобы знать, что '.', '.. и т. д. Значит. Кроме того, я уверен, что вы не найдете лучшего объяснения, чем Этой Ссылке.
  2. упрощенный ответ на второй вопрос: вы обычно находите узлы, используя HTML-теги, такие как td, a, li, div и т. д. Но ' * ' означает, найти любой тег, который соответствует вашей данной собственности. Это в основном используется, когда вы уверены в данном свойство, но не о том теге, в котором элемент может поставляться, например, предположим, что я хочу, чтобы список всех элементов с идентификатором " xyz " был в любом теге.

надеюсь, что это помогает :)