2011-10-14 3 views
11

Desidero localizzare un elemento su una pagina Web utilizzando il testo.
So che c'è un nome di metodo contiene a farlo, ad esempio:Selenio: come localizzare un nodo usando la corrispondenza esatta del testo

tr[contains(.,'hello')]/td 

Ma il problema è se ho due elementi citarne ciao e hello1 quindi questa funzione non funziona correttamente.

C'è qualche altro metodo come contiene per la corrispondenza stringa esatta per la localizzazione degli elementi?

+0

Cosa intendi con "non funziona correttamente"? Qual è il comportamento inaspettato? –

+0

se abbiamo due elementi con testo ciao e ciao1 e quando usiamo contiene (., 'Ciao'), allora questo metodo cercherà sempre ciao. Problema se questi elementi sono in una tabella e ciao1 è il primo elemento e ciao è il secondo e quando usiamo contiene ciao sarà sempre puntato su ciao1 in quanto è il primo elemento e contiene ciao ma vogliamo cercare ciao ecco perché ho bisogno di esatto match method –

risposta

1

Bene, il tuo problema è che stai cercando testo nel tr (che non è corretto comunque) e questo causa un problema alla funzione contains che non può accettare un elenco di testo. Prova invece a utilizzare questo percorso di posizione. Dovrebbe recuperare quello che vuoi.

//tr/td[contains(./text(),"hello")] 

Questo percorso di posizione recupera un set di nodi su cui è necessario iterare per ottenere il testo. Si può cercare di aggiungere il

/text() 

ma questo farà sì che (almeno sul mio test) un risultato che è una stringa che è una concatenazione di tutte le stringhe corrispondenti.

+0

Non c'è niente di sbagliato nell'uso di 'contains (., qualunque sia) su un elemento TR, anche se probabilmente non è quello che l'Abhinav vuole davvero. '.' è l'abbreviazione di' self :: node() ', non per' descendant-or-self :: text() ', quindi risulta TR e tutti i suoi discendenti vengono convertiti in stringhe, concatenati e confrontati , piuttosto che cercare un singolo nodo di testo che corrisponda. –

+0

@RossPatterson Il fatto è che se stai facendo un buon codice, non c'è testo sotto un tr ma solo uno (o più) td. Con questo in mente ho detto "che non è corretto comunque". –

16
tr[.//text()='hello']/td 

questo selezionerà tutti gli elementi td figlio di tutti gli elementi tr avere un bambino con esattamente 'ciao' in esso. Un tale XPath mi sembra ancora strano.

Credo che questo ha più senso:

tr/td[./text()='hello'] 

perché seleziona solo il TD che contiene il testo.

aiuta?

3

Tutto dipende da ciò che il vostro HTML contiene in realtà, ma la vostra tr[contains(.,'hello')]/td selettore XPath significa "la prima cella della prima riga che contiene la stringa 'ciao' ovunque all'interno di esso" (o, più precisamente, "il il primo elemento TD nell'elemento TR che contiene la stringa 'ciao' ovunque all'interno di esso ", dal momento che il selenio non ha idea di cosa siano realmente gli elementi coinvolti. Ecco perché sta ottenendo il risultato sbagliato quando ci sono file contenenti "ciao" e "ciao1" - entrambi contengono "ciao".

Il selettore tr[. ='hello']/td sarebbe più preciso, ma è un po 'insolito (perché gli elementi HTML TR non dovrebbero contenere testo - il testo dovrebbe essere in elementi TH o TD all'interno del TR) e probabilmente ha vinto funziona (perché il testo in qualsiasi altra cella potrebbe interrompere il confronto). Probabilmente si desideratr[td[.='hello']]/td, che significa "il primo elemento TD contenuto nell'elemento TR che contiene un elemento TD con la stringa 'ciao' come testo completo".

+0

Ho appena imparato il trucco. = 'Testo' grazie a questo post. Grazie @Ross Patterson! In questo caso è possibile eseguire una corrispondenza esatta QUALSIASI td sulla pagina con //td[.='hello '] per trovare QUALSIASI cella TD contenente ESATTAMENTE' ciao '. Il tr è probabilmente non necessario a meno che non si voglia assicurare che il td sia all'interno di un tr. –

Problemi correlati