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

问题描述 投票:33回答:8

我试图从隐藏的1000中读取示例String <div>,如下所示:

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

我知道WebElement.getText()不能用于Selenium 2(WebDriver)中的隐藏元素,因此我搜索了解决方案(like this one),显然下面的代码应该可以工作:

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结束。我究竟做错了什么?

java selenium-webdriver hidden-field
8个回答
23
投票

编辑:哦,这工作。

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

在Firefox中。

这也是如此。

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

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

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

这有效。


60
投票

也可能有用:

在某些情况下,人们可能会发现隐藏文本很有用,可以通过调用textContent从元素的innerTextinnerHTMLelement.attribute('attributeName')属性中检索它。

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

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


6
投票

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

public static String getText(WebDriver driver, WebElement element){
    return (String) ((JavascriptExecutor) driver).executeScript(
        "return jQuery(arguments[0]).text();", element);
}
  • 我使用jQuery's text()只提取文本节点。 innerHTML也会为您提供HTML标记。
  • noConflict的情况下,我使用jQuery代替$
  • 不要操纵元素或它的可见性

1
投票

试试这个

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

0
投票

我遇到了读取不可见元素的相同问题,但我想要一个WebElement对象来进行进一步的解析(而不仅仅是它的文本)。

这段代码满足了我的要求。

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

0
投票

我对Selenium(以及整个编程)相对较新,但我只是在分享一个对我有用的解决方案。

Selenium 2并非设计用于直接处理具有隐藏可见性的元素。例如,您将无法找到它的ID或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><table>“容器”下的列表中的元素一样。

它适用于Chrome和Firefox,但不适用于任何无头浏览器,不确定原因。如果你们遇到类似的东西,并有一个更优雅的解决方案(可能没那么难找到它),请分享!


0
投票

我建议使用:

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

-1
投票
type='hidden'

当我们遇到任何这样的情况时,我们首先要做的是尝试任何不对该页面进行任何更改的操作,如拖动等,然后进行帧切换。

尝试使用getText(),如果不起作用,请尝试以上作为第二种选择。

© www.soinside.com 2019 - 2024. All rights reserved.