如何使用 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')
从元素的textContent
、innerText
或innerHTML
属性中获取隐藏文本很有用。
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 实际上是<td>
标签,它们在列表中变成WebElements
,就像<td>
是<table>
“容器”下列表中的元素一样。
它适用于我的 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# 从下拉列表中选择一个选项?