findElements(By.xpath(&#34; .// g&#34;)在<svg>标签内部无效

时间:2017-04-25 16:21:29

标签: 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元素? &#34; //克&#34;不会工作,因为它在整个文档中找到所有g元素(之前我已被这个元素击中)。

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

2 个答案:

答案 0 :(得分:4)

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

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

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

您可以考虑命名空间:

.//svg:g

或者忽略命名空间local-name()

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

答案 1 :(得分:0)

您需要按照以下方式执行此操作

// Locate parent element of <g> tag
WebElement parentElement = driver.findElement(By.xpath(xpath_to_your_parent_element));

// Locate all <g> tag under your required element and store them in list
List<WebElement> allElement = parentElement.findElements(By.xpath(".//g"));

// Iterate all element using for loop
for(WebElement element:allElement)
{
    // perform yor actions for element here
   System.out.println(e.getAttribute("class"))

 }