如何使用Selenium WebDriver从隐藏元素中读取文本?

dok*_*par 35 java hidden-field selenium-webdriver

我试图1000从这样的隐藏中读取示例String <div>:

<div id="hidden_div" style="visibility:hidden">1000</div>
Run Code Online (Sandbox Code Playgroud)

我知道这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);
Run Code Online (Sandbox Code Playgroud)

但它对我不起作用,变量n总是最终的结果null.我究竟做错了什么?

小智 67

也可能有用:

在某些情况下,人们可能会发现它很有用,以获得隐藏的文字,这可以从元素的检索textContent,innerText或innerHTML属性,通过调用element.attribute('attributeName').

element.getAttribute("textContent") 为我工作.

在那里查看更多详细信息 - > http://yizeng.me/2014/04/08/get-text-from-hidden-elements-using-selenium-webdriver/

  • 唉,这是答案的人!我正准备在上面接受的答案中执行javascript,但尝试了这个,并且完美地工作.更清洁. (4认同)
  • element.getAttribute("textContent").trim() 正是我所需要的。 (2认同)
  • 好答案!我使用innerText 的运气比使用textContent 好,因为innerText 将多个换行符和空格合并到一个空格中,而textContent 则不然。 (2认同)

spe*_*ope 24

编辑:哦,这工作.

String script = "return document.getElementById('hidden_div').innerHTML";
Run Code Online (Sandbox Code Playgroud)

在Firefox中.

这也是如此.

String script = "return arguments[0].innerHTML";
Run Code Online (Sandbox Code Playgroud)

我试过但它似乎不适用于纯Javascript.使用Jquery启动浏览器,如此处所述.如何在Selenium中使用JQuery?并使用以下代码编写脚本.

String script = "return $('#hidden_div').text();";
Run Code Online (Sandbox Code Playgroud)

这有效.

  • 根据Selenium WebDriver FAQ:":为什么不能与隐藏元素交互?答:由于用户无法读取隐藏元素中的文本,因此WebDriver也不允许访问它.但是,可以使用它Javascript执行能力直接从元素调用getText ..."我最终使用jQuery,因为我的应用程序是基于jQuery构建的.不确定我是否同意FAQ中表达的这个决定背后的推理,但至少有一种方法来获取隐藏文本. (7认同)
  • 在较早的Selenium版本(至少2.25)中,可以获取隐藏元素的文本。在较新的版本(至少2.39)中,如果该元素不可见,则getText()返回一个空字符串。在两种情况下,这都不同于与隐藏元素进行交互时的行为。如果您尝试执行`click()`或`sendKeys(...)`,则会得到ElementNotVisibleException。 (3认同)
  • 只是为了完整性:可以在https://code.google.com/p/selenium/wiki/FrequentlyAskedQuestions下阅读WebDriver常见问题解答. (2认同)

Tim*_*the 6

在已经给出的答案的基础上,我创建了这个实用程序方法(Java).也许这对其他人有帮助.

public static String getText(WebDriver driver, WebElement element){
    return (String) ((JavascriptExecutor) driver).executeScript(
        "return jQuery(arguments[0]).text();", element);
}
Run Code Online (Sandbox Code Playgroud)
  • 我使用jQuery的text()来仅提取文本节点.innerHTML也会为您提供HTML标记.
  • 我在noConflict的情况下使用jQuery而不是$
  • 不要操纵元素或它的可见性