2012-04-27 13 views
8

Sto scrivendo un test JUnit per una pagina Web, utilizzando Selenium e sto cercando di verificare che il testo previsto esista all'interno di una pagina. Il codice della pagina web sto testando si presenta così:Selenio: Estrai testo di un div con cssSelector in Java

<div id="recipient_div_3" class="label_spacer"> 
    <label class="nodisplay" for="Recipient_nickname"> recipient field: reqd info </label> 
    <span id="Recipient_nickname_div_2" class="required-field"> *</span> 
    Recipient: 
</div> 

voglio mettere a confronto ciò che è previsto con ciò che è sulla pagina, quindi voglio usare Assert.assertTrue(). So che per ottenere tutto dal div, posso fare

String element = driver.findElement(By.cssSelector("div[id='recipient_div_3']")).getText().replaceAll("\n", " "); 

ma questo ritornerò "reqd info * Destinatario:"

C'è un modo per ottenere solo il testo dal div ("Destinatario ") usando cssSelector, senza gli altri tag?

risposta

4

Non si può fare questo con un selettore CSS, perché selettori CSS non hanno un approccio abbastanza grana fine per esprimere "il nodo di testo contenuto nel DIV, ma non il suo altri contenuti ". È possibile farlo con un localizzatore XPath, però:

driver.findElement(By.xpath("//div[@id='recipient_div_3']/text()")).getText() 

Quella espressione XPath identificherà solo il nodo di testo unico che è figlio diretto del DIV, piuttosto che tutto il testo in esso contenute e il suo bambino i nodi.

+2

Il localizzatore XPath fornito è logico e lavora a console di Chrome, ma non funzionerà in selenio. Il selenio genera il seguente errore ... 'Il selettore indicato // div [@ class = 'StdLevel1']/text() non è valido o non risulta in un WebElement. Si è verificato il seguente errore: InvalidSelectorError: il risultato dell'espressione xpath "// div [@ class = 'StdLevel1']/text()" è: [oggetto testo]. Dovrebbe essere un elemento. – BSchlinker

+0

Quindi c'è una soluzione o vorresti semplicemente prendere il div e analizzare la stringa getText()? –

+0

Per quanto mi consta, il selenio è fatto per consentire text(), nodo, ecc. – SIslam

4

Non sono sicuro che sia possibile con un css locator, ma è possibile ottenere il testo da div, quindi ottenere il testo dai nodi figlio di div e sottrarli. Qualcosa del genere (codice non è stato verificato):

String temp = ""; 
List<WebElement> tempElements = driver.findElements(By.cssSelector("div[id='recipient_div_3'] *")); 
for (WebElement tempElement : tempElements) { 
    temp =+ " " + tempElement.getText(); 
} 
String element = driver.findElement(By.cssSelector("div[id='recipient_div_3']")).getText().replaceAll("\n", " ").replace(temp, ""); 

Questo è per caso quando si tenta di evitare l'uso di XPath. XPath permette di farlo:

//div[@id='recipient_div_3']/text() 
0

Si potrebbe anche ottenere il contenuto di testo di un elemento e rimuovere i tag con espressioni regolari. Si noti anche: è necessario utilizzare il quntifier riluttante https://docs.oracle.com/javase/tutorial/essential/regex/quant.html

String getTextContentWithoutTags(WebElement element) { 
    return element.getText().replaceAll("<[^>]*?/>", "").trim(); 
} 
Problemi correlati