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

Posted

技术标签:

【中文标题】如何使用 Selenium WebDriver 从隐藏元素中读取文本?【英文标题】:How to read text from hidden element with Selenium WebDriver? 【发布时间】:2012-10-14 08:46:33 【问题描述】:

我正在尝试从隐藏的<div> 中读取示例字符串1000,如下所示:

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

【问题讨论】:

【参考方案1】:

编辑:哦,这行得通。

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

在火狐中。

这也是。

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

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

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

这行得通。

【讨论】:

根据 Selenium WebDriver FAQ: ": 为什么不能与隐藏元素交互? A: 由于用户无法阅读隐藏元素中的文本,WebDriver 也不允许访问它. 但是,可以使用 Javascript 执行功能直接从元素调用 getText...”我最终也使用了 jQuery,因为我的应用程序是基于 jQuery 构建的。不确定我是否同意常见问题解答中表达的此决定背后的推理,但至少有一种方法可以获取隐藏文本。 在较旧的 Selenium 版本(至少 2.25)中,可以获取隐藏元素的文本。在较新的版本(至少 2.39)中,如果元素不可见,getText() 返回一个空字符串。这在两种情况下都不同于与隐藏元素交互时的行为。如果你尝试执行click()sendKeys(...) 你会得到一个ElementNotVisibleException。 为了完整起见:WebDriver FAQ 可以在code.google.com/p/selenium/wiki/FrequentlyAskedQuestions 下阅读。 如何在python selenium 上执行此操作? @TimBüthe 谢谢,这解释了为什么旧测试失败:)【参考方案2】:

我在读取不可见元素时遇到了同样的问题,但我希望返回一个 WebElement 对象来做进一步的解析(不仅仅是它的文本)。

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

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

【讨论】:

【参考方案3】:

在已经给出的答案的基础上,我创建了这个实用方法 (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 而不是 $ 不要操纵元素或其可见性

【讨论】:

【参考方案4】:

也可能有用:

在某些情况下,可以通过调用element.attribute('attributeName') 从元素的textContentinnerTextinnerHTML 属性中获取隐藏文本很有用。

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

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

【讨论】:

糟糕,这就是答案!我正要在上面接受的答案中执行 javascript,但尝试了这个,并且效果很好。干净多了。 element.getAttribute("textContent").trim() 正是我所需要的。 好答案!与 textContent 相比,innerText 的运气更好,因为 innerText 将多个换行符和空格组合到一个空格中,而 textContent 没有。 太棒了,先生。非常感谢:)【参考方案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 实际上是&lt;td&gt; 标签,它们在列表中变成WebElements,就像&lt;td&gt;&lt;table&gt;“容器”下列表中的元素一样。

它适用于我的 Chrome 和 Firefox,但不适用于任何无头浏览器,不知道具体原因。如果你们遇到类似的事情并且有更优雅的解决方案(可能不那么难找到),请分享!

【讨论】:

【参考方案6】:

试试这个

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

【讨论】:

这似乎和user3152984 ***.com/a/32475546/566763的回答没有什么不同【参考方案7】:
type='hidden'

当我们遇到任何此类情况时,我们应该做的第一件事是尝试任何对该页面没有任何更改的操作,例如拖动等,然后进行框架切换。

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

【讨论】:

【参考方案8】:

我建议使用:

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

【讨论】:

以上是关于如何使用 Selenium WebDriver 从隐藏元素中读取文本?的主要内容,如果未能解决你的问题,请参考以下文章

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

如何使用 Selenium WebDriver 和 java 从下拉列表中选择一个项目?

如何使用 Selenium WebDriver C# 从下拉列表中选择一个选项?

如何使用 Selenium WebDriver C# 从下拉列表中选择一个选项?

如何使用 Selenium Webdriver 和 Python 从这个非选择下拉菜单中选择这个元素

我们如何使用Selenium Webdriver C#从URL获取特定值?