如何使用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
相关产品推荐
相关产品推荐

