Как читать текст из скрытого элемента с помощью Selenium WebDriver?

Я пытаюсь прочитать пример String 1000 из скрытого <div> следующим образом:

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

Я знаю, что WebElement.getText() не работает с скрытыми элементами в Selenium 2 (WebDriver), поэтому я искал решения (вроде этого), и, видимо, следующий код должен работать:

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

Но это не работает для меня, переменная n всегда заканчивается как null. Что я делаю не так?

Ответ 1

EDIT: О, это работает.

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

В firefox.

И вот так.

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

Я тоже старался, но, похоже, не работает с чистым Javascript. Запустите браузер с JQuery, как упоминалось здесь. Как использовать JQuery в Selenium? и используйте следующий код для скрипта.

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

Это работает.

Ответ 2

Может быть полезно также:

В некоторых случаях может оказаться полезным получить скрытый текст, который можно получить из textContent, innerText или innerHTML элемента, вызвав element.attribute('attributeName').

element.getAttribute("textContent") работал для меня.

Подробнее см. Там → http://yizeng.me/2014/04/08/get-text-from-hidden-elements-using-selenium-webdriver/

Ответ 3

Основываясь на работе уже предоставленных ответов, я создал этот метод утилиты (Java). Возможно, это полезно для кого-то другого.

public static String getText(WebDriver driver, WebElement element){
    return (String) ((JavascriptExecutor) driver).executeScript(
        "return jQuery(arguments[0]).text();", element);
}
  • Я использую jQuery text() для извлечения только текстовых узлов. innerHTML предоставит вам HTML-теги.
  • Я использую jQuery вместо $ в случае noConflict
  • не манипулировать элементом или видимостью

Ответ 4

Я столкнулся с той же проблемой чтения невидимых элементов, но мне хотелось вернуть объект WebElement для дальнейшего анализа (а не только его текста).

Этот бит кода выполнил мое требование.

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

Ответ 5

Я относительно новичок в Selenium (и для программирования в целом), но я просто использую решение, которое сработало для меня.

Selenium 2 не предназначен для непосредственного управления элементами со скрытой видимостью. Например, вы не сможете найти его ID или CSS-селектор.

У меня была ситуация с ботом, где у меня была таблица HTML с большим количеством иконок, и при нажатии, когда из них выпадало раскрывающееся меню со скрытой видимостью. Это было даже в другом кадре.

Это определенная ситуация, но я не мог найти никакого решения, поэтому я выбрал этот (плохой), но это работает действительно последовательно, несмотря на уродливый код.

Сначала вы должны switchToDesiredFrame(); - введите driver.switchTo.frame() здесь.

чем:

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

DataCells являются буквами тегов <td>, и они становятся WebElements в списке, так как <td> являются элементами в списке в контейнере <table>.

Он работал на Chrome и Firefox для меня, но не в любом браузере без браузера, не совсем точно, почему. Если вы, ребята, сталкиваетесь с чем-то подобным и имеете более элегантное решение (возможно, не так сложно его найти), пожалуйста, поделитесь!

Ответ 6

Попробуй это

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

Ответ 7

type='hidden'

Когда мы сталкиваемся с любым таким случаем, прежде всего нам нужно попробовать любое действие, которое не делает никаких изменений на этой странице, например, перетаскивание и т.д., А затем переключение кадров.

Попробуйте getText(), если это не сработает, попробуйте приведенное выше в качестве второго варианта.