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

获取列表最后一个WebElement遇数组越界错误求解决

问题分析与解决方案

首先,你遇到的ArrayIndexOutOfBoundsException: -1错误,本质原因是你定位到的all1列表是空的——当列表长度为0时,all1.size() - 1的结果就是-1,自然触发数组越界错误。

为什么列表会为空?我们结合你提供的代码和HTML来拆解:

  1. 你的XPath路径//main[@class='main row']/article/div/div[2]/div[1]/div/div[1]/ol[1]//a存在两个关键问题:
    • 你的HTML代码里根本没有<main class="main row">这个标签,根元素是<article>,所以这个XPath从起始节点就找不到匹配项;
    • 就算路径修正,目标<ol class="competition-standings">下的所有<li>都是空标签(比如<li class="list-item row"></li>),里面并没有<a>元素,所以也不可能定位到任何WebElement。

正确的解决方法

根据你的需求(获取列表最后一个元素),分两种场景处理:

场景1:直接定位最后一个列表项(推荐)

不用先获取所有元素再取最后,直接用XPath的last()函数定位,更高效且能避免空列表问题:

// 直接定位ol下的最后一个li元素
WebElement lastElement = driver.findElement(By.xpath("//article//ol[@class='competition-standings']/li[last()]"));

如果页面元素是动态加载的,记得加上等待逻辑确保元素已渲染:

WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(10));
WebElement lastElement = wait.until(
    ExpectedConditions.presenceOfElementLocated(By.xpath("//article//ol[@class='competition-standings']/li[last()]"))
);

场景2:先获取所有列表项再取最后(需加非空判断)

如果必须先获取全部元素,一定要先判断列表是否为空,避免越界:

List<WebElement> allItems = driver.findElements(By.xpath("//article//ol[@class='competition-standings']/li"));
if (!allItems.isEmpty()) {
    WebElement lastElement = allItems.get(allItems.size() - 1);
    // 这里写你对lastElement的操作逻辑
} else {
    // 处理没有找到任何列表项的情况
    System.out.println("未找到竞赛排名列表项");
}

额外提醒

如果页面中的列表是通过JavaScript动态加载的(比如滚动后才渲染),你需要先等待列表完全加载完成,再执行定位操作,否则依然会出现列表为空的情况。可以结合ExpectedConditions.visibilityOfAllElementsLocatedBy来等待所有li元素可见:

WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(10));
List<WebElement> allItems = wait.until(
    ExpectedConditions.visibilityOfAllElementsLocatedBy(By.xpath("//article//ol[@class='competition-standings']/li"))
);
if (!allItems.isEmpty()) {
    WebElement lastElement = allItems.get(allItems.size() - 1);
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 06:41:03