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

如何使用Selenium Java将指定XPath拆分为两部分?

问题:拆分XPath后Selenium抛出NoSuchElementException

原实际XPath为:(//div[@style='display: table-row;']//following-sibling::div)[38],尝试拆分为//div[@style='display: table-row;']和./following-sibling::div[38]两段,执行以下Selenium Java代码时,获取WebElement f出现NoSuchElementException:

WebElement e = driver.findElement(By.xpath("//div[@style='display: table-row;']")); 
WebElement f = e.findElement(By.xpath("./following-sibling::div[38]")); 
System.out.println(f.getText());

原因分析

原XPath的括号作用是:先收集所有匹配//div[@style='display: table-row;']的元素下的following-sibling::div,将这些元素合并为一个全局集合后取第38个。而你拆分后的逻辑是:先找到第一个匹配//div[@style='display: table-row;']的元素,再找它的第38个同级兄弟元素,两者逻辑完全不一致。大概率是这个单个元素根本没有38个同级兄弟,所以抛出异常。

解决方案

方案1:直接使用完整XPath

最稳妥的方式是直接用原XPath,避免逻辑偏差:

WebElement f = driver.findElement(By.xpath("(//div[@style='display: table-row;']//following-sibling::div)[38]"));
System.out.println(f.getText());

方案2:拆分后按原逻辑处理(获取全局集合)

如果必须拆分,先获取所有符合原XPath逻辑的元素集合,再取目标元素(注意List索引从0开始,第38个对应索引37):

// 获取所有符合原XPath条件的元素
List<WebElement> allTargetElements = driver.findElements(By.xpath("//div[@style='display: table-row;']//following-sibling::div"));
if (allTargetElements.size() >= 38) {
    WebElement f = allTargetElements.get(37);
    System.out.println(f.getText());
} else {
    System.out.println("不存在第38个目标元素");
}

方案3:确认单个元素的兄弟数量(若原逻辑就是针对单个元素)

如果你的真实需求就是针对第一个//div[@style='display: table-row;']元素找它的第38个兄弟,先检查该元素的兄弟数量:

WebElement e = driver.findElement(By.xpath("//div[@style='display: table-row;']"));
List<WebElement> siblings = e.findElements(By.xpath("./following-sibling::div"));
// 打印兄弟总数,确认是否有38个
System.out.println("兄弟元素总数:" + siblings.size());
if (siblings.size() >= 38) {
    WebElement f = siblings.get(37);
    System.out.println(f.getText());
} else {
    System.out.println("该元素的兄弟元素不足38个");
}

内容的提问来源于stack exchange,提问作者Madden Crush

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 18:45:27