J'essaie de lire l'exemple String 1000
à partir d'un <div>
caché comme ceci:
<div id="hidden_div" style="visibility:hidden">1000</div>
Je suis conscient que WebElement.getText()
ne fonctionne pas sur les éléments cachés de Selenium 2 (WebDriver). J'ai donc cherché des solutions ( comme celle-ci ) et apparemment, le code suivant devrait fonctionner:
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);
Mais cela ne fonctionne pas pour moi, la variable n
finit toujours par null
. Qu'est-ce que je fais mal?
EDIT: Oh ça marche.
String script = "return document.getElementById('hidden_div').innerHTML";
Dans Firefox.
Et cela aussi.
String script = "return arguments[0].innerHTML";
J'ai aussi essayé mais cela ne semble pas fonctionner avec du Javascript pur. Démarrez le navigateur avec Jquery comme indiqué ici. Comment utiliser JQuery dans Selenium? et utilise le code suivant pour le script.
String script = "return $('#hidden_div').text();";
Cela marche.
Peut-être utile aussi:
Dans certains cas, il peut être utile d'obtenir le texte masqué, qui peut être extrait de l'attribut textContent
, innerText
ou innerHTML
de l'élément, en appelant element.attribute('attributeName')
.
element.getAttribute("textContent")
a travaillé pour moi.
Voir plus de détails ici -> http://yizeng.me/2014/04/08/get-text-from-hidden-elements-using-Selenium-webdriver/
En me basant sur le travail des réponses déjà données, j'ai créé cette méthode utilitaire (Java). Peut-être que cela est utile pour quelqu'un d'autre.
public static String getText(WebDriver driver, WebElement element){
return (String) ((JavascriptExecutor) driver).executeScript(
"return jQuery(arguments[0]).text();", element);
}
Essaye ça
WebElement hiddenElement = GET YOUR ELEMENT HERE;
String hiddenContent= hiddenElement.getAttribute("textContent");
Je recommande d'utiliser:
JavascriptExecutor js = (JavascriptExecutor)hiddenDiv;
String n=(String) js.executeScript("return document.getElementById('hidden_div').value;");
System.out.println(n);
Je suis relativement nouveau dans Selenium (et dans l'ensemble de la programmation), mais je ne fais que partager une solution qui a fonctionné pour moi.
Selenium 2 n'a pas été conçu pour manipuler directement des éléments à visibilité cachée. Vous ne pourrez pas trouver son identifiant ou son sélecteur CSS, par exemple.
J'ai eu une situation avec un bot où j'avais un tableau HTML avec beaucoup d'itens, et en cliquant quand, un menu déroulant avec visibilité cachée ouvert. C'était même dans un autre cadre.
C'est une situation spécifique, mais je ne pouvais pas trouver de solution, alors j'ai choisi cette (mauvaise) solution, mais cela fonctionne vraiment de manière cohérente, malgré le code moche.
switchToDesiredFrame();
- entrez d'abord votre logique driver.switchTo.frame()
ici.
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());
Les dataCells sont littéralement les balises <td>
et deviennent WebElements
dans une liste, tout comme <td>
sont les éléments d'une liste sous le <table>
"conteneur".
Cela a fonctionné sur Chrome et Firefox pour moi, mais pas sur n'importe quel navigateur sans navigateur, je ne sais pas exactement pourquoi. Si vous rencontrez quelque chose comme ça et que vous avez une solution plus élégante (probablement pas si difficile à trouver), partagez-la!
Je suis tombé sur le même problème de lecture des éléments invisibles, mais je voulais récupérer un objet WebElement pour analyser davantage (pas seulement le texte).
Ce morceau de code a rempli mon exigence.
(WebElement) ((JavascriptExecutor) driver).executeScript(
"arguments[0].style[\"display\"] = \"block\";"+
"arguments[0].style[\"visibility\"] = \"visible\";"+
"return arguments[0];",
element);