You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Selenium Java:定位含可变文本元素及验证计数问题

问题:元素定位失败导致事件计数验证失败

问题详情

  • 需求:定位页面中Requeues、App Exits、Greets Started对应的计数值,并验证各事件计数是否正确
  • 页面HTML元素:
<div _ngcontent-ome-c213="" class="counts"> 0 Requeues<br _ngcontent-ome-c213=""> 0 App Exits<br _ngcontent-ome-c213=""> 2 Greets Started </div>
  • 尝试的Java代码:
public void verifySessionMetricsWasGenerated(String metrics, int count) {
        assertThat(findElements(By.xpath("//div[contains(@class, 'counts') and contains(text(), '" + metrics + "')]")))
                .as("Did not find expected number of metrics '" + metrics + "' " + SpecContext.examSession())
                .hasSize(count);
}
  • 执行报错:
Expected size: 1 but was: 0 in:
[]
Stack Trace:
java.lang.AssertionError: [Did not find expected number of metrics 'Greets Started' 

原因分析

原XPath中的contains(text(), 'xxx')仅会匹配div节点的第一个文本节点(即 0 Requeues),而App Exits、Greets Started是<br>标签后的独立文本节点,无法被原XPath匹配到,因此导致定位失败。

解决方案

方案1:修改XPath匹配节点全部文本内容

将XPath中的text()替换为.,.代表节点的所有文本内容(包含子节点文本),这样就能匹配到包含指定指标的div元素。

修改后的代码:

public void verifySessionMetricsWasGenerated(String metrics, int count) {
        assertThat(findElements(By.xpath("//div[contains(@class, 'counts') and contains(., '" + metrics + "')]")))
                .as("Did not find expected number of metrics '" + metrics + "' " + SpecContext.examSession())
                .hasSize(count);
}

方案2:精准定位单个指标并提取计数值

如果需要单独验证每个指标的计数值,可以直接定位到对应文本节点并提取数字:

// 示例:验证Greets Started的计数值为2
String greetsText = driver.findElement(By.xpath("//div[@class='counts']/text()[contains(., 'Greets Started')]")).getText().trim();
int greetsCount = Integer.parseInt(greetsText.split(" ")[0]);
assertThat(greetsCount).isEqualTo(2);

该方式可针对每个指标单独校验计数,更贴合需求场景。

内容的提问来源于stack exchange,提问作者NS S

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 14:29:56