2012-05-30 18 views
6

Uso il selenio per ottenere del testo sulla mia pagina Web utilizzando xpath.Lettura del testo utilizzando il selenio web (xpath)

La struttura dei tag pagina è la seguente -

<span id="data" class="firefinder-match"> 
    Seat Height, Laden 
    <sup> 
    <a class="speckeyfootnote" rel="p7" href="#">7</a> 
    </sup> 
</span> 

Se uso il seguente codice -

driver.findElement(By.xpath("//span[@id='data']")).getText(); 

ottengo il risultato = Seat Height, Laden 7

ma voglio evitare di leggere il testo all'interno dei tag <sup> e ottieni il risultato Seat Height, Laden

Per favore fatemi sapere quale espressione xpath posso usare per ottenere il risultato desiderato.

+3

Um. In semplice XPath (che sarebbe in grado di restituire Stringhe e non solo WebElement), si potrebbe fare '// span [@ id = 'data']/text() [1]'. Una possibile soluzione che posso pensare usa JS, la seconda ottiene l'intero testo e poi cancella tutto da elementi figlio. Entrambe le soluzioni sono piuttosto brutte e mi piacerebbe vederne una più bella. Ad ogni modo, se non c'è risposta in un tempo ragionevole breve, lo posterò. –

+1

Qualsiasi ragione per cui xpath è la tua unica opzione? Webdriver impiega più tempo per individuare un elemento con xpath – Amey

+0

beh, io uso xpath solo perché mi sento a mio agio con esso. Se c'è un altro modo per risolvere il mio problema, te ne sarò grato. –

risposta

7

Non conosco alcun modo per farlo in Selenium, quindi c'è la mia soluzione JS. L'idea è di ottenere tutti i figli dell'elemento (compresi i nodi di testo) e quindi selezionare solo i nodi di testo. Potrebbe essere necessario aggiungere alcune chiamate .trim() (o equivalente JS) per sbarazzarsi degli spazi non necessari.

L'intero codice:

WebElement elem = driver.findElement(By.id("data")); 
String text; 
if (driver instanceof JavascriptExecutor) { 
    text = ((JavascriptExecutor)driver).executeScript(
      "var nodes = arguments[0].childNodes;" + 
      "var text = '';" + 
      "for (var i = 0; i < nodes.length; i++) {" + 
      " if (nodes[i].nodeType == Node.TEXT_NODE) {" + 
      "  text += nodes[i].textContent;" + 
      " }" + 
      "}" + 
      "return text;" 
      , elem); 
} 

E proprio il JS per una migliore leggibilità.

var nodes = arguments[0].childNodes; 
var text = ''; 
for (var i = 0; i < nodes.length; i++) { 
    if (nodes[i].nodeType == Node.TEXT_NODE) { 
     text += nodes[i].textContent; 
    } 
} 
return text; 
+0

Hey bella soluzione per ottenere il risultato attraverso il JS. Ma voglio chiedere se c'è qualcosa come un! operatore in xpath con il quale possiamo trascurare determinati tag. –

+1

Sì, c'è. Tuttavia, non funzionerà in questo caso particolare poiché stai ancora selezionando l'elemento esterno e che contiene tutti gli elementi figli per impostazione predefinita. Il nodo di testo è anche un elemento figlio di esso e un normale parser potrebbe ottenerlo. WebDriver non è un parser comune e non ha questa funzionalità. Ancora. Se vuoi conoscere qualche XPath particolare, non esitare a chiedere. –

Problemi correlati