Uso di XPATH per cercare testo contenente & amp; nbsp;
Domanda
Uso Browser XPather per controllare le mie espressioni XPATH su una pagina HTML.
Il mio obiettivo finale è usare queste espressioni in Selenio per il test delle mie interfacce utente.
Ho ottenuto un file HTML con un contenuto simile a questo:
<tr> <td>abc</td> <td> </td> </tr>
Voglio selezionare un nodo con un testo contenente la stringa " & amp; nbsp;
" ;.
Con una stringa normale come " abc " non c'è problema. Uso un XPATH simile a // td [text () = " abc "]
.
Quando provo con un XPATH come // td [text () = " & amp; nbsp; "]
non restituisce nulla. Esiste una regola speciale per i testi con " & amp;
" ?
Soluzione
Sembra che OpenQA , ragazzi dietro Selenium, hanno già affrontato questo problema. Hanno definito alcune variabili per abbinare esplicitamente gli spazi bianchi. Nel mio caso, devo usare un XPATH simile a // td [text () = " $ {nbsp} "]
.
Ho riprodotto qui il testo di OpenQA relativo a questo problema (trovato qui ):
L'HTML si normalizza automaticamente spazio bianco all'interno degli elementi, ignorando spazi iniziali / finali e conversione spazi extra, tabulazioni e newline in a spazio singolo. Quando il selenio legge il testo fuori dalla pagina, tenta di farlo duplica questo comportamento, così puoi ignora tutte le schede e le nuove righe in il tuo HTML e fai affermazioni basate su come appare il testo nel browser quando reso. Lo facciamo sostituendo tutto spazi bianchi non visibili (incluso il spazio non-break "
& amp; nbsp;
") con a spazio singolo. Tutte le newline visibili (< br >
,< p >
e< pre >
formattati nuove righe) dovrebbero essere preservate.Usiamo la stessa logica di normalizzazione su il testo del test case selenese HTML tabelle. Questo ha un numero di vantaggi. Innanzitutto, non è necessario guarda l'origine HTML della pagina per capire cosa dovrebbero fare le tue affermazioni essere; & Quot;
& amp; nbsp;
" i simboli sono invisibili all'utente finale, quindi non dovresti doversi preoccupare di loro quando si scrive Test selenesi. (Non è necessario mettere & Quot;& amp; nbsp;
" marcatori nel tuo test case assertText su un campo che contiene "& amp; nbsp;
" ;.) Puoi anche aggiungere un extra newline e spazi nel tuo Selenese tag< td >
; dal momento che usiamo lo stesso logica di normalizzazione sul test case come facciamo sul testo, possiamo garantire tali affermazioni e il testo estratto corrisponderà esattamente.Questo crea un po 'di problema quelle rare occasioni in cui davvero desidera / deve inserire spazi bianchi extra nel tuo caso di test. Per esempio tu potrebbe essere necessario digitare del testo in un campo come questo: "
foo
" ;. Ma se semplicemente scrivi< td > foo < / td >
nel tuo Caso di prova Selenese, sostituiremo il tuo spazi extra con un solo spazio.Questo problema ha una soluzione semplice. Abbiamo definito una variabile in selenese,
$ {space}
, il cui valore è un singolo spazio. Puoi usare$ {space}
su inserisci uno spazio che non sarà tagliato automaticamente, in questo modo:< td > foo $ {spazio} $ {spazio} $ {spazio} < / td >
. Abbiamo anche incluso una variabile$ {nbsp}
, che puoi usare per inserire uno spazio senza interruzioni.Nota che XPaths non si normalizza spazi vuoti come facciamo noi. Se hai bisogno per scrivere un XPath come
// div [text () = " hello world "]
ma il HTML del link è davvero "ciao & amp; nbsp; mondo
" ;, dovrai farlo inserisci un vero "& amp; nbsp;
" nel tuo Selenese test case per farlo corrispondere, come questo:// div [text () = " Ciao $ {} nbsp mondo "].
Altri suggerimenti
Ho scoperto che posso fare la corrispondenza quando inserisco uno spazio non-break codificato (U + 00A0) digitando Alt + 0160 su Windows tra le due virgolette ...
//table[@id='TableID']//td[text()=' ']
ha lavorato per me con il carattere speciale.
Da quanto ho capito, lo standard XPath 1.0 non gestisce i caratteri Unicode in escape. Sembra che ci siano funzioni per questo in XPath 2.0 ma sembra che Firefox non lo supporti (o ho frainteso qualcosa). Quindi hai a che fare con la tabella codici locale. Brutto, lo so.
In realtà, sembra che lo standard si basi sul linguaggio di programmazione usando XPath per fornire la corretta sequenza di escape Unicode ... Quindi, in qualche modo, ho fatto la cosa giusta.
Prova a usare l'entità decimale & amp; # 160;
invece dell'entità nominata. Se il problema persiste, dovresti essere in grado di utilizzare semplicemente l'unicode carattere per uno spazio non-break invece dell'entità & amp; nbsp;
.
(Nota: non l'ho provato in XPather, ma l'ho provato in Oxygen.)
Tieni presente che un processore XML conforme agli standard avrà sostituito qualsiasi riferimento di entità diverso dai cinque standard XML ( & amp; amp;
, & amp; gt;
, & amp; lt;
, & amp; apos;
, & amp; quot;
) con il carattere corrispondente nella codifica target entro il momento in cui le espressioni XPath sono valutata. Dato questo comportamento, i suggerimenti di PhiLho e jsulak sono la strada da percorrere se si desidera lavorare con strumenti XML. Quando inserisci & amp; # 160;
nell'espressione XPath, dovrebbe essere convertito nella sequenza di byte corrispondente prima dell'applicazione dell'espressione XPath.
Non riesco a trovare una corrispondenza usando Xpather, ma quanto segue ha funzionato per me con semplici file XML e XSL nel Blocco note XML di Microsoft:
<xsl:value-of select="count(//td[text()=' '])" />
Il valore restituito è 1, che è il valore corretto nel mio caso di test.
Tuttavia, ho dovuto dichiarare nbsp come entità all'interno del mio XML e XSL usando quanto segue:
<!DOCTYPE xsl:stylesheet [ <!ENTITY nbsp " "> ]>
Non sono sicuro che ciò ti aiuti, ma sono stato in grado di effettivamente trovare nbsp usando un'espressione XPath.
Modifica: il mio esempio di codice contiene effettivamente i caratteri '& amp; nbsp;' ma l'evidenziazione della sintassi JavaScript lo converte nel carattere spazio. Non essere fuorviante!
Cerca & amp; nbsp;
o solo nbsp
- ci hai provato?