wake-up-neo.com

Wie kann ich mit Selenium WebDriver Text aus einem verborgenen Element lesen?

Ich versuche, den Beispiel-String 1000 aus einem versteckten <div> wie folgt zu lesen:

<div id="hidden_div" style="visibility:hidden">1000</div>

Mir ist bekannt, dass WebElement.getText() nicht mit verborgenen Elementen in Selenium 2 (WebDriver) funktioniert. Daher habe ich nach Lösungen gesucht ( like this ), und anscheinend sollte der folgende Code funktionieren:

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

Aber es funktioniert nicht für mich, die Variable n endet immer als null. Was mache ich falsch?

32
dokaspar

EDIT: Oh, das funktioniert.

String script = "return document.getElementById('hidden_div').innerHTML";

In Firefox.

Und das auch.

String script = "return arguments[0].innerHTML";

Ich habe es auch versucht, aber es scheint nicht mit reinem Javascript zu funktionieren. Starten Sie den Browser mit Jquery wie hier erwähnt. Wie verwende ich JQuery in Selenium? und folgenden Code für das Skript verwenden.

String script = "return $('#hidden_div').text();";

Das funktioniert.

22
specialscope

Könnte auch nützlich sein:

In einigen Fällen kann es hilfreich sein, den verborgenen Text abzurufen, der vom textContent-, innerText- oder innerHTML-Element des Elements abgerufen werden kann, indem element.attribute('attributeName') aufgerufen wird.

element.getAttribute("textContent") arbeitete für mich.

Weitere Details finden Sie dort -> http://yizeng.me/2014/04/08/get-text-from-hidden-elements-using-Selenium-webdriver/

55
user3152984

Aufbauend auf der Arbeit der bereits gegebenen Antworten, habe ich diese Utility-Methode (Java) erstellt. Vielleicht ist das für jemand anderen hilfreich.

public static String getText(WebDriver driver, WebElement element){
    return (String) ((JavascriptExecutor) driver).executeScript(
        "return jQuery(arguments[0]).text();", element);
}
  • Ich benutze jQuery's text () , um nur Textknoten zu extrahieren. innerHTML würde Ihnen auch HTML-Tags geben.
  • Ich benutze jQuery anstelle von $ im Fall von noConflict
  • manipulieren Sie das Element nicht oder es ist Sichtbarkeit
6
Tim Büthe

Versuche dies 

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

Ich empfehle zu verwenden:

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

Ich bin relativ neu bei Selenium (und beim Programmieren als Ganzes), aber ich teile nur eine Lösung, die für mich funktioniert hat.  

Selen 2 wurde nicht für die direkte Handhabung von Elementen mit versteckter Sichtbarkeit entwickelt. Sie können zum Beispiel die ID oder die CSS-Auswahl nicht finden. 

Ich hatte eine Situation mit einem Bot, in dem ich eine HTML-Tabelle mit vielen Itens hatte, und wenn Sie darauf klicken, wurde ein Dropdown mit versteckter Sichtbarkeit geöffnet. Es war sogar in einem anderen Rahmen.

Es ist eine spezielle Situation, aber ich konnte keine Lösung finden, also habe ich diese (schlechte) Lösung gewählt, aber das funktioniert trotz des hässlichen Codes wirklich beständig. 

Zuerst sollten Sie switchToDesiredFrame(); - hier Ihre driver.switchTo.frame()-Logik eingeben. 

Als:

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());

Die dataCells sind wörtlich die <td>-Tags, und sie werden in einer Liste WebElements, genauso wie <td> die Elemente in einer Liste unter dem <table>- "Container" sind. 

Bei Chrome und Firefox hat es für mich funktioniert, aber bei keinem Headless-Browser. Ich weiß nicht genau, warum. Wenn Sie auf so etwas stoßen und eine elegantere Lösung haben (wahrscheinlich nicht so schwer zu finden), teilen Sie es uns bitte!

0
nickballeste

Ich bin auf das gleiche Problem gestoßen, als würden wir unsichtbare Elemente lesen, aber ich wollte ein WebElement-Objekt, um weitere Analysen durchzuführen (nicht nur den Text).

Dieses Stück Code erfüllte meine Anforderung.

(WebElement) ((JavascriptExecutor) driver).executeScript(
    "arguments[0].style[\"display\"] = \"block\";"+
    "arguments[0].style[\"visibility\"] = \"visible\";"+
    "return arguments[0];", 
element);
0
prav