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>&nbsp;</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; " ?

È stato utile?

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()='&nbsp;'])" />

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 "&#160;"> ]>

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?

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top