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

Selenium翻页循环判断下页XPath是否显示 元素不存在报错如何解决?

问题原因

Selenium 中的 isDisplayed() 方法仅适用于已成功定位到DOM中的元素,若元素本身不存在于DOM树中,调用该方法会直接抛出NoSuchElementException异常,而非返回false,因此原代码的循环判断条件本身就会在最后一页直接报错,无法正常终止循环。
如果你的try catch仅包裹了循环内部的点击逻辑,没有覆盖循环判断条件的元素查找逻辑,判断条件抛出的异常不会被捕获,自然会直接报错终止程序。

修正方案

改用findElements()方法查找下一页按钮,该方法找不到元素时会返回空列表,不会抛出异常,先通过列表长度判断元素是否存在,存在时再判断是否可见,再执行翻页逻辑。

修正后代码如下:

List<WebElement> rows = new ArrayList<>();
// 先添加第一页的数据
rows.addAll(driver.findElements(By.xpath("//*[@class='sortable-row']")));

while (true) {
    // 查找下一页按钮,findElements找不到元素时返回空列表不会抛异常
    List<WebElement> nextPageBtns = driver.findElements(By.xpath("替换为你的下一页按钮XPath"));
    // 元素不存在,或者元素存在但不可见,都终止循环
    if (nextPageBtns.isEmpty() || !nextPageBtns.get(0).isDisplayed()) {
        break;
    }
    // 下一页按钮存在且可点击,执行翻页
    nextPageBtns.get(0).click();
    Thread.sleep(3000);
    rows.addAll(driver.findElements(By.xpath("//*[@class='sortable-row']")));
}

可选优化

可以将固定等待Thread.sleep(3000)替换为Selenium的显式等待,等待页面列表更新后再继续执行,避免网络波动导致的元素未加载完成报错:

// 点击下一页后等待旧列表元素失效,确认新列表加载完成
new WebDriverWait(driver, Duration.ofSeconds(5))
    .until(ExpectedConditions.stalenessOf(rows.get(rows.size() - 1)));

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 15:48:00