web-dev-qa-db-fra.com

Comment lire du texte d'un élément caché avec Selenium WebDriver?

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?

32
dokaspar

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.

22
specialscope

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/

55
user3152984

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);
}
  • J'utilise le texte de jQuery () pour extraire uniquement les nœuds de texte. innerHTML vous donnerait également des balises HTML.
  • J'utilise jQuery au lieu de $ en cas de noConflict
  • ne pas manipuler l'élément ou sa visibilité
6
Tim Büthe

Essaye ça 

        WebElement hiddenElement  = GET YOUR ELEMENT HERE;
        String hiddenContent= hiddenElement.getAttribute("textContent");
0
Abhigyan

Je recommande d'utiliser:

JavascriptExecutor js = (JavascriptExecutor)hiddenDiv;
String n=(String) js.executeScript("return document.getElementById('hidden_div').value;");
System.out.println(n);
0
BOB

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!

0
nickballeste

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);
0
prav