当前位置: 首页 > 知识库问答 >
问题:

findElements(By.xpath(“.//g”)在标记中不起作用

谈琛
2023-03-14

编辑:一位评论者正确地指出,事实上,我正在处理的HTML代码都在一个标记中,这似乎对这个特定案例产生了决定性的影响。

我试图在任何级别检索元素中的所有元素。事实上,我也需要做一些额外的检查,所以我需要使用。xpath,而不是通过。标记名。但是,顺便说一句。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)。

共有2个答案

敖子安
2023-03-14

你需要按照你提到的方法来做

// 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"))

 }
司徒焕
2023-03-14

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

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

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

您可以考虑以下两种情况之一:

.//svg:g

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

.//*[local-name() = 'g']
 类似资料:
  • 我有一个网页,从中我必须从web元素中提取一组名称。我的想法是首先使用“findElements(By.xpath…”提取所有这些元素,类似这样: 所有这些元素都有如下xPath模式: 正如您所看到的,唯一的变化是倒数第二个div正在发生变化。我的问题是,我如何编写这行代码来填充webelement列表,具体是什么。xPath()? 非常感谢!

  • 我试图使用@FindBy初始化所有页面元素。我知道@FindBy可以用来初始化单个webelement,但它可以用来初始化webelement列表吗?我正在尝试合并司机。findElements(By.xpath()(它将返回webelements的列表)以@FindBy的形式出现。我该怎么做?

  • 它给了我编译错误 cvc-complex-type.2.4.c:匹配通配符是严格的,但找不到元素“身份验证管理器”的声明 和在这一行找到的多个注释: null 请澄清我错在哪里

  • 问题内容: 我已经看过xpath教程并检查了许多其他帖子,因此我不确定自己缺少什么。我只是想通过xpath查找以下元素: 我已经尝试了很多事情,例如: 错误是。 我在MacBook上使用Firefox 任何建议将不胜感激。 问题答案: (*)-任何标记名

  • 问题内容: 我有一个从搜索返回的对象的索引。该模板具有ng-repeat,其中项目的URL是根据模型中的数据构造的,但在最终标记中,“ a”标记无效。ng- href和href正确,单击链接但页面未加载时,URL栏会更改。点击后刷新浏览器确实会获得页面。因此,Angular中的某些内容正在更改URL栏,但不会触发加载??? 无法在jsfiddle中进行复制,因为问题似乎出在$ resource.q