【问题标题】:How to read text from hidden element with Selenium WebDriver?如何使用 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 结尾。我做错了什么?

【问题讨论】:

    标签: java selenium-webdriver hidden-field


    【解决方案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");
          

          【讨论】:

          【解决方案7】:
          type='hidden'
          

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

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

          【讨论】:

            【解决方案8】:

            我建议使用:

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

            【讨论】:

              猜你喜欢
              • 2021-06-15
              • 2017-04-16
              • 2017-03-30
              • 1970-01-01
              • 1970-01-01
              • 2013-07-01
              • 2012-08-15
              • 2012-09-03
              相关资源
              最近更新 更多