Comment lire le texte d'un élément caché avec Selenium WebDriver?
j'essaie de lire la chaîne d'exemple 1000
d'un caché <div>
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 dans le sélénium 2 (WebDriver), donc j'ai cherché des solutions ( comme celui-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 ça ne marche pas pour moi, la variable n
finit toujours par null
. Que suis-je fais de mal?
8 réponses
EDIT: Oh this works.
String script = "return document.getElementById('hidden_div').innerHTML";
dans firefox.
et ça aussi.
String script = "return arguments[0].innerHTML";
j'ai essayé mais ça ne semble pas fonctionner avec Javascript. Démarrer le navigateur avec Jquery comme mentionné ici. comment utiliser JQuery dans le sélénium? et utilisez le code suivant pour script.
String script = "return $('#hidden_div').text();";
ça marche.
pourrait être utile aussi:
dans certains cas, il peut être utile d'obtenir le texte caché, qui peut être récupéré à partir de l'attribut textContent
, innerText
ou innerHTML
de l'élément, en appelant element.attribute('attributeName')
.
element.getAttribute("textContent")
travaillait 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). C'est peut-être 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);
}
- j'utilise texte de jQuery () pour extraire les noeuds de texte seulement. innerHTML vous donnera aussi des balises HTML.
- j'utilise jQuery au lieu de $ dans le cas de noConflict
- ne manipulez pas l'élément ou sa visibilité
j'ai rencontré le même problème de lecture d'éléments invisibles mais je voulais revenir sur un objet WebElement pour faire plus de parsing (pas seulement son 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);
je suis relativement nouveau au sélénium (et à la programmation dans son ensemble), mais je partage juste une solution qui a fonctionné pour moi.
Lesélénium 2 n'a pas été conçu pour manipuler directement des éléments avec une visibilité cachée. Vous ne pourrez pas trouver son ID ou son sélecteur CSS, par exemple.
j'ai eu une situation avec un bot où j'ai eu une table HTML avec beaucoup d'itens, et en cliquant quand d'eux, une descente avec visibilité cachée ouvrir. Il était même dans un autre cadre.
c'est une situation spécifique, mais je n'ai pas pu trouver de solution, donc j'ai choisi celle-ci (mauvaise), mais cela fonctionne vraiment de manière cohérente, malgré le code laid.
d'Abord, vous devez switchToDesiredFrame();
- entrez votre driver.switchTo.frame()
logique 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 tags <td>
, et ils deviennent WebElements
dans une liste tout comme <td>
's sont les éléments d'une liste figurant sous la rubrique <table>
"conteneur".
il a travaillé sur Chrome et Firefox pour moi, mais pas sur un navigateur sans tête, pas sûr exactement pourquoi. Si vous rencontrez quelque chose comme ça et avez une solution plus élégante (probablement pas si difficile à trouver), s'il vous plaît partager!
Essayez cette
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);
type='hidden'
quand nous rencontrons un tel cas, la première chose que nous devrions faire est d'essayer toute action qui ne fait pas de changement sur cette page, comme glisser etc, puis faire un commutateur de cadre.
essayez un getText()
, si cela ne fonctionne pas, essayez la deuxième alternative.