java - library - selenium official documentation
¿Cómo leer texto del elemento oculto con Selenium WebDriver? (7)
Intento leer el ejemplo de String 1000
de un <div>
oculto como este:
<div id="hidden_div" style="visibility:hidden">1000</div>
Soy consciente de que WebElement.getText()
no funciona en elementos ocultos en Selenium 2 (WebDriver), por lo que busqué soluciones ( como esta ) y aparentemente el siguiente código debería funcionar:
WebElement hiddenDiv = seleniumDriver.findElement(By.id("hidden_div"));
String n = hiddenDiv.getText(); // does not work (returns "" as expected)
String script = "return arguments[0].innerText";
n = (String) ((JavascriptExecutor) driver).executeScript(script, hiddenDiv);
Pero no funciona para mí, la variable n
siempre termina como null
. ¿Qué estoy haciendo mal?
EDITAR: Oh, esto funciona.
String script = "return document.getElementById(''hidden_div'').innerHTML";
En Firefox.
Y también lo hace esto.
String script = "return arguments[0].innerHTML";
Lo intenté también pero parece que no funciona con Javascript puro. Inicie el navegador con Jquery como se menciona aquí. ¿Cómo usar JQuery en Selenium? y use el siguiente código para script.
String script = "return $(''#hidden_div'').text();";
Esto funciona.
Me encontré con el mismo problema de leer elementos invisibles, pero quería volver un objeto WebElement para hacer más análisis (no solo su texto).
Este pedacito de código satisfizo mi requisito.
(WebElement) ((JavascriptExecutor) driver).executeScript(
"arguments[0].style[/"display/"] = /"block/";"+
"arguments[0].style[/"visibility/"] = /"visible/";"+
"return arguments[0];",
element);
Prueba esto
WebElement hiddenElement = GET YOUR ELEMENT HERE;
String hiddenContent= hiddenElement.getAttribute("textContent");
Puede ser útil también:
En algunos casos, puede ser útil obtener el texto oculto, que se puede recuperar del textContent
, innerText
o innerHTML
, llamando a element.attribute(''attributeName'')
.
element.getAttribute("textContent")
funcionó para mí.
Ver más detalles allí -> http://yizeng.me/2014/04/08/get-text-from-hidden-elements-using-selenium-webdriver/
Sobre la base del trabajo de las respuestas ya dadas, creé este método de utilidad (Java). Quizás esto sea útil para otra persona.
public static String getText(WebDriver driver, WebElement element){
return (String) ((JavascriptExecutor) driver).executeScript(
"return jQuery(arguments[0]).text();", element);
}
- Utilizo el texto de jQuery () para extraer nodos de texto solamente. innerHTML también te da etiquetas HTML.
- Uso jQuery en lugar de $ en caso de noConflict
- no manipules el elemento o su visibilidad
Soy relativamente nuevo en Selenium (y en la programación en general), pero solo estoy compartiendo una solución que funcionó para mí.
Selenium 2 no fue diseñado para manejar elementos con visibilidad oculta directamente. No podrá encontrar su identificación o selector de CSS, por ejemplo.
Tuve una situación con un bot donde tenía una tabla HTML con muchos itens, y cuando hacía clic en ellos, se abría un menú desplegable con visibilidad oculta. Fue incluso en otro marco.
Es una situación específica, pero no pude encontrar ninguna solución, así que elegí esta (mala), pero eso funciona de manera muy consistente, a pesar del código feo.
Primero debes switchToDesiredFrame();
- ingrese su lógica de driver.switchTo.frame()
aquí.
Que:
WebElement table = driver.findElements(By.tagName("table")).get(index_1);
List<WebElement> dataCells= table .findElements(By.tagName("td"));
WebElement spceificDataCellIWanted = dataCells.get(index_2);
System.out.println(spceificDataCellIWanted.getText());
Las dataCell son literalmente las etiquetas <td>
, y se convierten en WebElements
en una lista al igual que <td>
''s son los elementos en una lista debajo de la <table>
"contenedor".
Funcionó en Chrome y Firefox para mí, pero no en ningún navegador sin cabeza, no estoy seguro exactamente por qué. Si se encuentran con algo así y tienen una solución más elegante (probablemente no tan difícil de encontrar), ¡por favor compártanla!
type=''hidden''
Cuando nos encontramos con un caso así, lo primero que debemos hacer es probar cualquier acción que no haga ningún cambio en esa página, como arrastrar, etc., luego hacer un cambio de marco.
Prueba getText()
, si eso no funciona, prueba lo de arriba como la segunda alternativa.