Mik*_*dik 3 java selenium xpath webdriver selenium-webdriver
编辑:评论者正确地指出,事实上,我正在使用的 HTML 代码都在一个标签内,这似乎对这个特殊情况产生了决定性的影响。
我试图在任何级别检索元素中的所有元素。实际上,我也需要做一些额外的检查,所以我需要使用 By.xpath,而不是 By.tagName。但是 By.xpath 不知何故不起作用,即使没有检查。(当然,其他检查也失败了 - 我只是提供了最小的例子)。
我的代码:
log.info(eventGroup.getAttribute("outerHTML"))
alerts = eventGroup.findElements(By.xpath(".//g"));
log.info(alerts.size());
Run Code Online (Sandbox Code Playgroud)
第一行用于调试,以确保我得到正确的元素。这是它的输出:
<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>
Run Code Online (Sandbox Code Playgroud)
所以有很多元素可以找到。然而,警报的结果大小为 0。
如何修复我的 xpath 以便它在任何级别找到此元素下的所有 g 元素?"//g" 不会工作,因为它会在整个文档中找到所有 g 元素(我之前也遇到过这个问题)。
当然,我可以不用 xpath,只需按标签名称搜索,然后遍历结果以过滤它们。但是 xpath 可能比大循环工作得更快?(我没有在这个测试用例中使用 MSIE)。
为什么原因.//g表达式不找到所需的g元素是因为的命名空间。您的svg元素的默认命名空间定义为:
xmlns="http://www.w3.org/2000/svg"
Run Code Online (Sandbox Code Playgroud)
这意味着g子元素实际上有svg:g名称。
您可以考虑命名空间:
.//svg:g
Run Code Online (Sandbox Code Playgroud)
或者,忽略命名空间local-name():
.//*[local-name() = 'g']
Run Code Online (Sandbox Code Playgroud)