web-dev-qa-db-fra.com

Quelle est la différence entre .// et // * dans XPath?

Tout en trouvant le XPath relatif via Firebug: cela crée comme 

  1. .//*[@id='Passwd']--------- Et si nous n'utilisions pas le point au début, cela signifie-t-il?

  2. Il suffit d’ajouter //* dans le Xpath --it en surbrillance --- divers éléments de page ---------- que signifie-t-il? 

Vous trouverez ci-dessous les champs XPaths pour le mot de passe Gmail. Quelle est la signification de *?

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

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

15
TEST-M

Ces expressions sélectionnent toutes des ensembles de nœuds différents:

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

Le '.' au début signifie que le traitement en cours commence au nœud actuel. Le '*' sélectionne tous les nœuds d'élément descendant de ce nœud actuel avec la valeur d'attribut @id égale à 'Passwd'. 

Que faire si nous n'utilisons pas point au début ce que cela signifie?

Ensuite, vous sélectionneriez tous les nœuds d'élément avec une valeur @id- attribut égale à 'Passwd' dans le document whole.

Ajoutez simplement // * dans le XPath - il met en évidence --- divers éléments de page 

Cela sélectionnerait tous les nœuds d'élément du document whole.

Ci-dessous mentionné: le champ XPatht pour Mot de passe Gmail est vrai. Quelle est la signification de *?

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

Cela sélectionnerait tous les nœuds d'élément descendant du nœud actuel pour lesquels @id- attribut-valeur est égal à 'Passwd'.

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

Cela sélectionnerait tous les nœuds d'élément enfant nommés input dont @type- valeurs d'attribut sont égaux à 'mot de passe'. Le préfixe d'axe child:: peut être omis, car il s'agit du comportement par défaut.

La syntaxe de choix de l'expression appropriée est expliquée ici sur w3school.com .

Et les axes (point en cours de traitement) sont expliqués ici sur une autre page w3school.com .

18
zx485

Il y a plusieurs concepts clés XPath distincts en jeu ici ...

XPaths absolus vs relatifs (/ vs .)

  • / introduit un chemin d'emplacement absolu, commençant à la racine du document.
  • . introduit un chemin d'emplacement relatif, en partant du nœud de contexte.

Élément nommé vs n'importe quel élément (ename vs *)

  • /ename sélectionne un élément racine ename
    • ./ename sélectionne tous les éléments enfants ename du nœud actuel.
  • /* sélectionne l'élément racine, quel que soit son nom .
    • ./* ou * sélectionne tous les éléments enfants du nœud de contexte, quel que soit leur nom.

axe descendant ou autonome (//*)

  • //ename sélectionne tous les éléments ename d'un document .
    • .//ename sélectionne tous les éléments ename sur ou sous le nœud de contexte.
  • //* sélectionne tous les éléments d'un document, quel que soit leur nom .
    • .//* sélectionne tous les éléments, quel que soit leur nom, sur ou sous le nœud de contexte.

Avec ces concepts à l'esprit, voici des réponses à vos questions spécifiques ...

  • .//*[@id='Passwd'] signifie sélectionner tous les éléments sur ou sous le nœud de contexte actuel qui ont une valeur d'attribut id égale à 'Passwd'.
  • //child::input[@type='password'] peut être simplifié en //input[@type='password'] et signifie sélectionner tous les éléments input du document ayant un attribut type égal à 'password'.
29
kjhughes

Le point dans XPath est appelé "expression d'élément de contexte" . Si vous mettez un point au début de l'expression, cela le rendrait spécifique au contexte. En d'autres termes, il chercherait l'élément avec id="Passwd" dans le contexte du nœud sur lequel vous appelez la méthode "find element by XPath".

Le * dans le .//*[@id='Passwd'] permet de faire correspondre les éléments à tous les éléments avec id='Passwd'.

2
alecxe
  1. Pour la première question: Tout est une question de contexte. Vous pouvez voir Syntaxe pour savoir ce que ".", ".." etc. De plus, je parie que vous ne trouverez pas d'explication meilleure que Ce lien .
  2. Réponse simplifiée pour la deuxième question: Vous trouverez généralement des nœuds utilisant les balises html telles que td, a, li, div, etc. Mais '*' signifie trouver toute balise correspondant à votre propriété donnée. Il est principalement utilisé lorsque vous êtes sûr d'une propriété donnée, mais pas de la balise dans laquelle l'élément peut venir, comme si vous vouliez une liste de tous les éléments portant l'ID 'xyz', que ce soit dans une balise.

J'espère que ça aide :)

1
Prateek