2012-04-27 8 views
8

Estoy escribiendo una prueba JUnit para una página web, usando Selenium, y estoy tratando de verificar que el texto esperado exista dentro de una página. El código de la página web que estoy probando el siguiente aspecto:Selenio: Extraiga el texto de un div con cssSelector en 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> 

quiero comparar lo que se espera de lo que es en la página, así que quiero utilizar Assert.assertTrue(). Yo sé que para conseguir todo, desde el div, que puede hacer

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

pero esto volveré "reqd información * Beneficiario:"

¿Hay alguna manera de obtener sólo el texto de la div ("Destinatario ") usando cssSelector, sin las otras etiquetas?

Respuesta

4

No se puede hacer esto con un selector CSS, porque selectores CSS no tienen un enfoque suficiente de grano fino para expresar "el nodo de texto que figura en el DIV pero no su otros contenidos ". Usted puede hacer eso con un localizador de XPath, sin embargo:

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

Esa expresión XPath identificará simplemente el nodo de texto único que es un hijo directo de la DIV, en lugar de todo el texto contenido dentro de ella y su hijo nodos.

+2

El localizador XPath proporcionada es lógica y trabaja en la consola de Chrome, pero no va a trabajar en selenio. Selenium lanzará el siguiente error ... 'El selector dado // div [@ class = 'StdLevel1']/text() no es válido o no da como resultado un WebElement. Se produjo el siguiente error: InvalidSelectorError: el resultado de la expresión xpath "// div [@ class = 'StdLevel1']/text()" es: [object Text]. Debería ser un elemento. – BSchlinker

+0

Entonces, ¿hay alguna solución o simplemente tomarías div y analizarías la cadena getText()? –

+0

A mi entender, el selenio Infact hace para permitir la función de texto(), nodo, etc. – SIslam

4

No estoy seguro de si es posible con un localizador de css, pero puede obtener texto de div, luego obtener texto de los nodos secundarios de div y restarlos. Algo por el estilo (código no se comprobó):

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, ""); 

Esto es para el caso cuando se intenta evitar el uso de XPath. XPath permite hacerlo:

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

También puede obtener el contenido de texto de un elemento y eliminar las etiquetas con expresiones regulares. También nota: se debe utilizar el quntifier reacios https://docs.oracle.com/javase/tutorial/essential/regex/quant.html

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