java - findElements(By.xpath (".//g") 在 <svg> 标签内不工作

标签 java selenium xpath selenium-webdriver webdriver

编辑:一位评论者正确地指出,事实上,我正在使用的 HTML 代码都在一个标签内,这似乎决定性地影响了这个特殊情况。

我正在尝试检索一个元素中任何级别的所有元素。实际上,我也需要做一些额外的检查,所以我需要使用 By.xpath,而不是 By.tagName。但是 By.xpath 不知何故不起作用,即使没有检查。 (当然其他检查也失败了——我只是提供最小的例子)。

我的代码:

log.info(eventGroup.getAttribute("outerHTML"))
alerts = eventGroup.findElements(By.xpath(".//g"));
log.info(alerts.size());

第一行用于调试,以确保我得到正确的元素。这是它的输出:

 <g class="event-group">
    <line x1="-105" x2="927.4000244140625" y1="0" y2="0" class="events-bar"/>
    <line x1="-105" x2="927.4000244140625" y1="45" y2="45" class="events-bar"/>
    <line id="markLine" x1="0" x2="0" y1="0" y2="0" y1save="22.5" y2save="537"/>
    <text x="-30" y="26.5" text-anchor="end">Alerts</text><g clip-path="url(#event-clip)">
        <g class="one-event">
            <use xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="#9warning" class="event warning" x="240.04638877275397" y="17.5" width="10" height="10" data-id="58fe7efa97d469000d047594_2017-04-24T22:40:37.679Z"/>
            <rect class="event-overlay" x="235.04638877275397" y="12.5" width="20" height="20"/>
        </g><g class="one-event">
            <use xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="#9warning" class="event warning" x="-4.624127036138464" y="17.5" width="10" height="10" data-id="58fe238d97d469000d0450b3_2017-04-24T16:10:37.710Z"/>
            <rect class="event-overlay" x="-9.624127036138464" y="12.5" width="20" height="20"/>
        </g>
    </g>
</g>

所以有很多元素要找。然而,生成的警报大小为 0。

如何修复我的 xpath 以便它在任何级别找到此元素下的所有 g 元素? "//g"将无法工作,因为它会在整个文档中找到所有 g 元素(我以前也遇到过这种情况)。

当然我可以不用 xpath,只需按标签名称搜索,然后循环遍历结果以过滤它们。但是 xpath 可能比大循环工作得更快? (我没有在这个测试用例中使用 MSIE)。

最佳答案

.//g 表达式找不到所需的g 元素的原因是因为 namespaces .您的 svg 元素的默认 namespace 定义为:

xmlns="http://www.w3.org/2000/svg"

这意味着 g 子元素实际上有 svg:g 名称。

您可以考虑命名空间:

.//svg:g

或者,忽略带有 local-name() 的命名空间:

.//*[local-name() = 'g']

关于java - findElements(By.xpath (".//g") 在 <svg> 标签内不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43616076/

相关文章:

java - Java的DatagramChannel.write()的含义

java - 构造“try/catch”不会捕获异常“NoSuchElementException”

java - Selenium 如果元素不存在,如何使测试不失败(java)

Php 和 Xpath - 如何从节点内部获取文本

java - 使用 Oauth2 客户端凭据授予的 Java 应用程序的 Active Directory 身份验证产生 "unauthorized_client"错误

java - 使用 apache kafka 生成数据并使用 Spark Streaming 接收数据

java - 使用 Java 将测试结果传递给 Selenium 中的 ITestResult

带有 Yahoo API 的 XPath

XPath 将元素中的所有文本作为一个值获取,删除换行符

java - 使用反射时是否应该将字段及其名称存储在 Map 中?