Как читать текст из скрытого элемента с помощью 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()
, если это не сработает, попробуйте приведенное выше в качестве второго варианта.