Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/362.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使用Selenium WebDriver从隐藏元素读取文本?_Java_Selenium Webdriver_Hidden Field - Fatal编程技术网

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

Java 如何使用Selenium WebDriver从隐藏元素读取文本?,java,selenium-webdriver,hidden-field,Java,Selenium Webdriver,Hidden Field,我试图从隐藏的中读取示例字符串1000,如下所示: <div id="hidden_div" style="visibility:hidden">1000</div> 但是它对我不起作用,变量n总是以null结束。我做错了什么?编辑:哦,这很有效 String script = "return document.getElementById('hidden_div').innerHTML"; 在firefox中 这也一样 String script = "return

我试图从隐藏的
中读取示例字符串
1000
,如下所示:

<div id="hidden_div" style="visibility:hidden">1000</div>
但是它对我不起作用,变量
n
总是以
null
结束。我做错了什么?

编辑:哦,这很有效

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

这也一样

String script = "return arguments[0].innerHTML";
我也尝试过,但它似乎不能与纯Javascript一起工作。以启动浏览器 这里提到的Jquery。并对脚本使用以下代码

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

这是可行的。

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

String script = "return document.getElementById('hidden_div').innerHTML";
这段代码满足了我的要求

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

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

public static String getText(WebDriver driver, WebElement element){
    return (String) ((JavascriptExecutor) driver).executeScript(
        "return jQuery(arguments[0]).text();", element);
}
  • 我仅用于提取文本节点。innerHTML也会为您提供HTML标记
  • 我使用jQuery而不是$
  • 不要操纵图元或其可见性

    • 也可能有用:

      在某些情况下,可以通过调用
      element.attributeName('attributeName')
      从元素的
      textContent
      innerText
      innerHTML
      属性中检索隐藏的文本

      element.getAttribute(“textContent”)
      对我有用

      查看更多详细信息->

      我对Selenium(以及整个编程)比较陌生,但我只是分享一个适合我的解决方案

      Selenium 2不是为直接处理具有隐藏可见性的元素而设计的。例如,您将无法找到它的ID或CSS选择器

      我有一个机器人的情况,我有一个HTML表格和许多iTen,当点击其中的一个时,一个隐藏可见性的下拉列表打开了。甚至在另一个画面中

      这是一个特定的情况,但我找不到任何解决方案,所以我选择了这个(糟糕的)方案,但它的效果非常一致,尽管代码很难看

      首先,您应该
      switchToDesiredFrame()-在此处输入您的
      驱动程序.switchTo.frame()
      逻辑

      比:

      WebElement table=driver.findElements(按.tagName(“table”)).get(索引_1);
      列表数据单元=table.findElements(按.tagName(“td”);
      WebElement spceificDataCellIWanted=dataCells.get(索引2);
      System.out.println(spceificDataCellIWanted.getText());
      
      数据单元实际上是
      标记,它们成为列表中的
      WebElements
      ,就像
      容器下列表中的元素一样

      它在Chrome和Firefox上对我有效,但在任何无头浏览器上都不起作用,不知道确切原因。如果你们遇到这样的事情,并且有一个更优雅的解决方案(可能不难找到),请分享

      试试这个

              WebElement hiddenElement  = GET YOUR ELEMENT HERE;
              String hiddenContent= hiddenElement.getAttribute("textContent");
      
      当我们遇到任何这样的情况时,我们应该做的第一件事是尝试任何不会对页面进行任何更改的操作,如拖动等,然后进行帧切换

      尝试一个
      getText()
      ,如果这不起作用,请尝试上面的第二种方法

      我建议使用:

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

      根据Selenium WebDriver常见问题解答:“为什么不可能与隐藏元素交互?答:由于用户无法读取隐藏元素中的文本,WebDriver也不允许访问它。但是,可以使用Javascript执行功能直接从元素调用getText…”我最终也使用了jQuery,因为我的应用程序是基于jQuery构建的。不确定我是否同意FAQ中表达的这一决定背后的理由,但至少有一种方法可以获取隐藏文本。在旧的Selenium版本(至少2.25)中,可以获取隐藏元素的文本。在较新版本(至少2.39)中,
      getText()
      如果元素不可见,则返回空字符串。这两种情况下都不同于与隐藏元素交互时的行为。如果你尝试执行
      click()
      sendKeys(…)
      你会得到一个ElementNotVisibleException。为了完整起见:WebDriver常见问题解答可以在下面阅读。我如何在
      python
      selenium?@TimBü谢谢,这解释了一个旧测试失败的原因:)哇,这就是答案!我正准备在上面接受的答案中使用javascript,但尝试了这个,效果非常好。更干净的.element.getAttribute(“textContent”).trim()正好满足了我的需要。回答得好!我使用innerText比使用textContent更幸运,因为innerText将多个换行符和空格合并到一个空格中,而textContent没有。非常感谢:)这似乎与用户3152984的答案没有任何不同
      type='hidden'
      
      JavascriptExecutor js = (JavascriptExecutor)hiddenDiv;
      String n=(String) js.executeScript("return document.getElementById('hidden_div').value;");
      System.out.println(n);