【问题标题】:Selenium read text of hidden web element using XpathSelenium 使用 Xpath 读取隐藏 Web 元素的文本
【发布时间】:2017-03-30 17:01:09
【问题描述】:

我在我们的一个自动化脚本中遇到了一个问题,其中我需要读取可访问性被隐藏的元素的文本,因为 selenium 无法读取隐藏元素的文本。我也在这里查看了其他帖子,他们建议使用元素的 ID 执行 javascript 并读取 innerHTML。在我们的例子中,挑战是我不能使用 web 元素的 ID 作为其动态,并且每次在 web 浏览器中加载页面时都会更改,所以我必须依赖 Xpath,请在下面找到元素的代码 -

<div id="milestone_gwt-uid-2132" class="accessibilityhidden">Current Step: Referral Details</div>

现在 id 即“milestone_gwt-uid-2132”不是静态的,并且在页面加载时会发生变化,我想阅读文本 - “当前步骤:推荐详细信息”。有没有使用 Selenium Java 的有效方法?

谢谢

【问题讨论】:

  • 你能分享更多你的 HTML 吗?也许是几个父节点?
  • 在您的 id 中,“里程碑”一词是否始终保持不变...我的意思是在您的 id 中只有数字 2132 一直更改或整个 id 都更改了?
  • 是的,所以基本上前缀“milestone_gwt-uid-”对于许多元素来说很常见,它的最后一个数字(2132)会发生变化
  • 在这种情况下,您能否与一些家长分享更多您的 html ...此 div

标签: javascript java selenium xpath selenium-webdriver


【解决方案1】:

getText 方法返回可见文本。使用executeScript获取隐藏文字:

WebElement elem = driver.findElement(By.xpath("//div[contains(text(), 'Current Step:')]"));
String hiddenText = (String)((JavascriptExecutor)driver).executeScript(
    "return arguments[0].textContent;", elem);

请注意,在测试中评估某些隐藏文本可能不是一个好主意,因为它不能反映用户可以看到的内容。

【讨论】:

  • 已经尝试过了,但这实际上在 web 元素中返回 null,因为驱动程序没有找到该元素
  • 可能是在调用命令时元素尚未创建。与服务员一起尝试并确保您的元素不在框架中。
【解决方案2】:

您可以通过以下方式在您的XPath 中使用动态id

//div[contains(@id, "milestone_gwt-uid-")]

您可以通过以下代码获取innerHTML

WebElement element = driver.findElement(By.xpath('//div[contains(@id, "milestone_gwt-uid-")]'));
String contents = (String)((JavascriptExecutor)driver).executeScript("return arguments[0].innerHTML;", element);

【讨论】:

  • 这反过来会返回很多元素,因为在我们执行这些测试的应用程序中,DOM 中的许多元素都有“milestone_gwt-uid-”前缀
  • 那些元素也有class="accessibilityhidden"属性吗?
  • 并非总是有些元素没有隐藏,但有些元素是
  • 如果您的元素很少,仅在其文本节点上有所不同,则只能通过父元素或兄弟元素匹配它们。用更多HTML 更新(编辑)您的问题
【解决方案3】:

谢谢!与 MS Word Online 一起使用!! 调用方法:

String textFromEditor = getValue(driver.findElement(By.id(editorFieldId)));

方法体:

protected String getValue(WebElement element) {
        try
        {
            String value = (String)((JavascriptExecutor) driver).executeScript("return arguments[0].textContent;", element);
            return value;
        }
        catch (Exception e)
        {
            return "can't get text";
        }
}

【讨论】:

    【解决方案4】:

    您可以通过连接两个 Text 来声明该元素,因为 DOM 将始终包含一个唯一元素。

    【讨论】:

    • 请通过代码示例和参考文档改进您的答案
    猜你喜欢
    • 2012-10-14
    • 1970-01-01
    • 1970-01-01
    • 2021-06-15
    • 2017-04-16
    • 2012-06-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多