El método getText () del controlador selenium chrome a veces devuelve una cadena vacía


Tengo un caso curioso donde el método selenium chrome driver getText() (java) devuelve una cadena vacía para algunos elementos, aunque devuelve una cadena no vacía para otros elementos con el mismo xpath. Aquí hay un poco de la página.

<div __gwt_cell="cell-gwt-uid-223" style="outline-style:none;">
<div>Text_1</div>
<div>Text_2</div>
<div>Text_3</div>
<div>Text_4</div>
<div>Text_5</div>
<div>Text_6</div>
</div>

Para cada una de las etiquetas internas, puedo obtener valores de retorno válidos para getTagName(), getLocation(), isEnabled(), y isDisplayed(). Sin embargo, getText() devuelve una cadena vacía para algunos de los divs.

Además, me doy cuenta de que si uso el controlador de mac Chrome, es consistentemente el 'Text_5' para el cual getText() devuelve una cadena vacía. Si uso el controlador de windows Chrome, lo es, es consistentemente el 'Text_2' para el cual getText() devuelve una cadena vacía. Si utilizo el controlador de Firefox, getText() devuelve el texto esperado de todos los divs.

¿Alguien más ha tenido esta dificultad?

En mi código, uso algo como esto {{[14]]}

ArrayList<WebElement> list = (ArrayList<WebElement>) driver.findElements(By.xpath(“my xPath here”));
for (WebElement e: list) System.out.println(e.getText());

Como se sugiere a continuación, aquí está el xPath real que estoy usando. El fragmento de página anterior trata de los dos últimos divs.

//*[@class='gwt-DialogBox']//tr[contains(@class,'data-grid-table-row')]//td[contains(@class,'lms-assignment-selection-wizard-cell')]/div/div
Author: Bᴜᴅɪ, 2014-01-02

6 answers

Actualización: El atributo textContent es una mejor opción y es compatible con la mayoría de los navegadores. Las diferencias se explican en detalle en este blog: innerText vs textContent

Como alternativa, el atributo innerText devolverá el contenido de texto de un elemento que existe en el DOM.

element.getAttribute("innerText")

El método isDisplayed() a veces puede tropezar cuando el elemento no está realmente oculto sino fuera de la ventana; getText() devuelve una cadena vacía para tal elemento.

También puede traer el elemento a la vista desplazándose hacia ella usando javascript, de la siguiente manera:

((JavaScriptExecutor)driver).executeScript("arguments[0].scrollIntoView(true);", element);

Y luego getText() debe devolver el valor correcto.

Los detalles sobre el método isDisplayed() se pueden encontrar en esta pregunta SO:

Cómo funciona el método isDisplayed() de Selenium WebDriver

 63
Author: Faiz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 12:03:08

WebElement.getAttribute ("valor") debería ayudarte !!

 4
Author: sathish p,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-05-04 15:56:15

Esto no es una solución, así que no se si pertenece a una respuesta, pero es demasiado largo para un comentario e incluye enlaces, así que estoy poniendo una respuesta.

También he tenido este problema. Después de hacer un poco de investigación, parece que el problema surge cuando se trata de obtener el texto de un elemento que no es visible en la pantalla.(Como @ Faiz comenta arriba.) Esto puede suceder si el elemento no se desplaza hacia, o si se desplaza hacia abajo y el elemento está cerca de la parte superior del documento y ya no visible después del desplazamiento. Veo que tienes una llamada a findElements () que obtiene una lista de elementos. Al menos algunos no son visibles; puede comprobar esto probando boolean b = webElement.isDisplayed(); en cada elemento de la lista y comprobando el resultado. (Ver aquí para una discusión muy larga de este tema que tiene un año y todavía no hay resolución.)

Aparentemente, esta es una decisión de diseño deliberada (ver aquí); se supone que gettext en elementos invisibles debe regresar vacío. Por qué son tan firmes sobre esto, no lo sé. Se han sugerido varias soluciones, incluyendo hacer clic en el elemento antes de obtener su texto o desplazarse hacia él. (Véase el enlace anterior, por ejemplo, código para este último.) No puedo responder por estos porque no los he probado, pero solo están tratando de llevar el elemento a la visibilidad para que el texto esté disponible. No estoy seguro de lo práctico que es para su aplicación; no fue para la mía. Por alguna razón, FirefoxDriver no tiene este problema, así que eso es lo que uso.

Lamento no poder darle una mejor respuesta - tal vez si envía un informe de error en la página de problemas verán que muchas personas encuentran que es un error en lugar de una característica y cambiarán la funcionalidad.

¡Buena suerte! bsg

EDITAR

Vea esta pregunta para una posible solución. No podrá usarlo exactamente como se indica si isDisplayed devuelve true, pero si sabe qué elemento está causando el problema, o si el texto es normalmente no está en blanco y puede establecer una condición 'si la cadena está vacía' para atraparla cuando suceda, aún puede intentarlo. No funciona para todos, desafortunadamente.

NUEVA ACTUALIZACIÓN Acabo de probar la respuesta dada a continuación y funcionó para mí. Así que gracias, Faiz!

 3
Author: bsg,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 12:10:26

Si no te importa isDisplayed o la posición de desplazamiento, también puedes escribir

String text = ((JavaScriptExecutor)driver).executeScript("return $(arguments[0]).text();", element);

O sin jquery

String text = ((JavaScriptExecutor)driver).executeScript("return arguments[0].innerText;", element);
 1
Author: Kambiz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-09-17 14:15:31
for (int count=0;count<=sizeofdd;count++)
{       
   String GetInnerHTML=getddvalue.get(count).getAttribute("innerHTML");
}

Donde, 1. getddvalue es el WebElement 2. sizeofdd es el tamaño de getddvalue

 1
Author: Nand,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-03-02 11:34:36

Relacionado con getText() También tengo un problema y lo resolví:

WebElement errMsg;
errMsg = driver.findElement(By.xpath("//div[@id='mbr-login-error']"));
WebElement parent = driver.findElement(By.xpath("//form[@id='mbr-login-form']"));
List<WebElement> children = parent.findElements(By.tagName("div")); 
System.out.println("Size is: "+children.size());
//((JavascriptExecutor)driver).executeScript("arguments[0].scrollIntoView(true);", children);
for(int i = 0;i<children.size();i++)
{
    System.out.println(i + " " + children.get(i).getText());
}
int indexErr = children.indexOf(errMsg);
System.out.println("index " + indexErr);
Assert.assertEquals(expected, children.get(indexErr).getText());

Ninguna de las soluciones anteriores funcionó para mí.

 0
Author: Abdullah Khan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-08 16:09:46