Как читать текст скрытый элемент с WebDriver селен?
Я пытаюсь прочитать строку примера 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
. Что я делаю не так?
8 ответов
EDIT: О, это работает.
String script = "return document.getElementById('hidden_div').innerHTML";
в firefox.
и это тоже.
String script = "return arguments[0].innerHTML";
Я тоже пытался, но, похоже, он не работает с чистым Javascript. Запускаем браузер с Jquery, как упоминалось здесь. как использовать JQuery в селене? и используйте следующий код для скрипта.
String script = "return $('#hidden_div').text();";
это работает.
может быть полезно также:
в некоторых случаях может оказаться полезным получить скрытый текст, который можно получить из элемента textContent
, innerText
или , по телефону element.attribute('attributeName')
.
element.getAttribute("textContent")
работал для меня.
Подробнее см. Там -> http://yizeng.me/2014/04/08/get-text-from-hidden-elements-using-selenium-webdriver/
основываясь на работе уже данных ответов, я создал этот метод утилиты (Java). Может быть, это полезно для кого-то другого.
public static String getText(WebDriver driver, WebElement element){
return (String) ((JavascriptExecutor) driver).executeScript(
"return jQuery(arguments[0]).text();", element);
}
- Я использую текст jQuery () для извлечения только текстовых узлов. innerHTML также даст вам HTML-теги.
- Я использую jQuery вместо $ в случае noConflict
- не манипулируйте элементом, или это видимость
я столкнулся с той же проблемой чтения невидимых элементов, но я хотел вернуть объект WebElement для дальнейшего анализа (а не только его текст).
этот бит кода выполнил мое требование.
(WebElement) ((JavascriptExecutor) driver).executeScript(
"arguments[0].style[\"display\"] = \"block\";"+
"arguments[0].style[\"visibility\"] = \"visible\";"+
"return arguments[0];",
element);
Я относительно новичок в Selenium (и в программировании в целом), но я просто делюсь решением, которое сработало для меня.
Selenium 2 не был конструирован для регулировать элементы с спрятанной видимостью сразу. Например, вы не сможете найти его идентификатор или селектор CSS.
у меня была ситуация с ботом, где у меня была таблица HTML с большим количеством itens, и при нажатии, когда из них, раскрывающийся список со скрытой видимостью. Это было даже в другом рамка.
это конкретная ситуация, но я не мог найти никакого решения, поэтому я выбрал этот (плохой), но это работает очень последовательно, несмотря на уродливый код.
сначала 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>
's являются элементами в списке под <table>
"контейнер".
это сработало Chrome и Firefox для меня, но не на любом безголовом браузере, не знаю точно, почему. Если вы, ребята, сталкиваетесь с чем-то подобным и имеете более элегантное решение (вероятно, не так сложно его найти), пожалуйста, поделитесь!
попробуй такое
WebElement hiddenElement = GET YOUR ELEMENT HERE;
String hiddenContent= hiddenElement.getAttribute("textContent");
Я рекомендую использовать:
JavascriptExecutor js = (JavascriptExecutor)hiddenDiv;
String n=(String) js.executeScript("return document.getElementById('hidden_div').value;");
System.out.println(n);
type='hidden'
когда мы сталкиваемся с любым таким случаем, первое, что мы должны сделать, это попробовать любое действие, которое не вносит никаких изменений на этой странице, например, перетащить и т. д., а затем сделать переключатель кадров.
попробовать getText()
, если это не сработает, попробуйте, как 2-й вариант.