2016-02-24 46 views
6

Mentre trovare la relativa XPath via Firebug: crea comeQual è la differenza tra .// e // * in XPath?

  1. .//*[@id='Passwd'] --------- quello che se noi non usare punto al inizio che cosa significa?

  2. Basta aggiungere //* in Xpath - evidenzia --- vari elementi di pagina ---------- cosa significa?

Di seguito sono riportati i campi XPath per i campi della password di Gmail. Qual è il significato di *?

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

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

+0

Questo è stato un inizio facile per me: http://www.zvon.org/xxl/XPathTutorial/General/examples.html – SiKing

risposta

10

Queste espressioni tutti selezionare diverse nodesets:

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

Il' '. all'inizio significa che l'attuale elaborazione inizia dal nodo corrente. Il '*' seleziona tutti i nodi degli elementi che discendono da questo nodo corrente con il valore di attributo @id uguale a 'Passwd'.

Cosa succede se non si utilizza il punto all'inizio cosa significa?

Poi devi selezionare tutti i nodi elemento con esiste l'attributo-valore @id uguale a 'passwd' in tutta la documento .

Basta aggiungere // * nel XPath - evidenzia --- vari elementi della pagina

Ciò selezionare tutti i nodi elemento in tutta documento .

Sotto menzionato: XPatht's per Gmail Il campo Password è vero qual è il significato di *?

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

Ciò selezionare tutti i nodi elemento discendente dal nodo corrente che @id -attribute valore è uguale a 'Passwd'.

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

Ciò selezionare tutti i nodi di bambino elemento chiamato input che @type -attribute-valori sono uguali a 'password'. Il prefisso asse child:: può essere omesso, perché è il comportamento predefinito.

Viene spiegata la sintassi della scelta dell'espressione appropriata here at w3school.com.

E gli assi (punto corrente in elaborazione) sono spiegati here at another w3school.com page.

+1

In caso di dubbio, si prega di dare un'occhiata alla buona risposta @ di kjhughes sotto. –

+0

@Mathias Müller: ho corretto i difetti della mia risposta. – zx485

+1

Molto meglio ora, grazie per il montaggio. Si noti che le informazioni di w3schools.com sono spesso imprecise, ad esempio la confusione tra "nodi" e "nodi di elementi" potrebbe derivare da questa pagina Web errata. –

2

Il punto in XPath è chiamato un "espressione elemento di contesto" . Se inserisci un punto all'inizio dell'espressione, lo renderebbe specifico per il contesto. In altre parole, cercherebbe l'elemento con id="Passwd" nel contesto del nodo su cui si sta chiamando il metodo "trova elemento per XPath".

Il * nel .//*[@id='Passwd'] aiuta a corrispondere qualsiasi elemento con id='Passwd'.

1
  1. Per la prima domanda: E 'tutta una questione di contesto. Puoi vedere Syntax per sapere che cosa significa ".", ".." ecc. Inoltre, scommetto che non troverai alcuna spiegazione migliore di This Link.
  2. Risposta semplificata per la seconda domanda: In genere si trovano i nodi usando i tag html come td, a, li, div ecc. Ma '*' significa trovare qualsiasi tag che corrisponda alla proprietà specificata. Viene usato principalmente quando sei sicuro di una determinata proprietà ma non di quel tag in cui l'elemento potrebbe venire, supponiamo che io voglia un elenco di tutti gli elementi con ID 'xyz' sia in qualsiasi tag.

Speranza che aiuta :)

16

Ci sono diversi distinti, concetti chiave XPath in gioco qui ...

assoluti vs XPaths relativi (/ vs .)

  • / introduce un percorso di posizione assoluto, a partire dalla radice del documento ument.
  • . introduce un percorso di posizione relativo, a partire dal nodo di contesto.

elemento denominato vs qualsiasi elemento (ename vs *)

  • /ename seleziona un elemento ename radice
    • ./ename seleziona tutti ename elementi figlio del nodo corrente.
  • /* seleziona l'elemento radice, indipendentemente dal nome.
    • ./* o * seleziona tutti gli elementi figlio del nodo di contesto, indipendentemente dal nome.

asse descendant-or-self (//*)

  • //ename seleziona tutti ename elementi in un documento.
    • .//ename seleziona tutti gli elementi ename al nodo di contesto o al di sotto.
  • //* seleziona tutti gli elementi in un documento, indipendentemente dal nome.
    • .//* seleziona tutti gli elementi, indipendentemente dal nome, al o al di sotto del nodo di contesto.

Con questi concetti in mente, qui sono le risposte alle vostre domande specifiche ...

  • .//*[@id='Passwd'] significa selezionare tutti gli elementi in corrispondenza o al di sotto della corrente nodo di contesto con valore di attributo id uguale a 'Passwd'.
  • //child::input[@type='password'] può essere semplificata //input[@type='password'] e mezzi per selezionare tutti gli elementi input nel documento che hanno un valore di attributo type pari a 'password'.
+4

Questa risposta dovrebbe essere accettata perché è la più accurata e completa, secondo me. –