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?

29
demandé sur dokaspar 2012-10-24 14:09:18

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.

22
répondu specialscope 2017-05-23 12:34:27

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 /

46
répondu user3152984 2017-09-07 09:47:08

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é
6
répondu Tim Büthe 2014-02-10 17:01:00

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);
0
répondu prav 2013-06-27 13:39:28

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.

Le

sé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!

0
répondu nickballeste 2017-04-14 01:03:16

Essayez cette

        WebElement hiddenElement  = GET YOUR ELEMENT HERE;
        String hiddenContent= hiddenElement.getAttribute("textContent");
0
répondu Abhigyan 2017-07-17 17:27:06

je recommande d'utiliser:

JavascriptExecutor js = (JavascriptExecutor)hiddenDiv;
String n=(String) js.executeScript("return document.getElementById('hidden_div').value;");
System.out.println(n);
0
répondu BOB 2018-09-05 19:58:10
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.

-1
répondu anirules twenty 2018-02-27 13:09:03