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
相关产品推荐
相关产品推荐

