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

Selenium点击Load More按钮触发stale element及超时异常问题

Selenium加载更多按钮异常优化方案

根因分析

  • StaleElementReferenceException报错:你在循环外部提前获取了loadmoreElem元素对象并保存引用,每次点击加载更多后页面DOM会更新,之前存储的元素引用直接失效,后续循环再调用该对象的click方法就会抛出过期元素异常。
  • TimeoutException报错:你的等待逻辑设置为等待Load More按钮不可见,但实际业务场景是按钮最终变为禁用状态,不会从DOM中移除,因此等待10秒后满足不了条件就触发超时。
  • 额外逻辑漏洞:代码中多处使用了两个不同的XPath匹配Load More按钮,容易出现元素匹配不一致的问题。

优化方案

核心修改点

  • 去掉循环外提前获取元素实例的逻辑,每次循环都重新查找Load More按钮,从根源避免元素过期问题
  • 把等待按钮不可见的逻辑改成等待新数据加载完成(通过判断表格行数是否增加实现),同时将循环终止条件调整为判断按钮是否处于禁用状态
  • 删除硬编码等待DriverUtil.waitTime(6000),统一用显式等待代替,提升执行稳定性和效率
  • 全流程统一使用同一个Load More按钮的XPath表达式,避免元素匹配错误

优化后代码

String loadmoreXpath = AppXPathsConstants.buttonXpath_replace.replace("XXXX","Load More");
// 先判断是否存在Load More按钮
if(driver.findElements(By.xpath(loadmoreXpath)).size() > 0) {
    WebDriverWait wait = new WebDriverWait(driver, 60);
    do {
        // 滚动到页面底部
        PageUtil.scrolltoBottom(driver);
        // 每次循环重新查找按钮,避免stale异常
        WebElement loadmoreBtn = wait.until(ExpectedConditions.elementToBeClickable(By.xpath(loadmoreXpath)));
        // 点击前记录当前表格行数
        int beforeClickRowCount = driver.findElements(By.xpath("//tbody[@role='rowgroup']/tr")).size();
        loadmoreBtn.click();
        // 等待表格行数增加,确认新数据加载完成,代替硬编码等待
        wait.until(driver -> {
            int currentRowCount = driver.findElements(By.xpath("//tbody[@role='rowgroup']/tr")).size();
            return currentRowCount > beforeClickRowCount;
        });
    // 终止条件:按钮不存在 或者 按钮已经处于禁用状态
    } while (driver.findElements(By.xpath(loadmoreXpath)).size() > 0 
            && !driver.findElement(By.xpath(loadmoreXpath)).getAttribute("disabled").contains("true"));
}

适配说明

如果你的前端框架给禁用按钮添加的不是原生disabled属性,而是比如mat-button-disabled这类样式类,只需要修改终止条件里的禁用判断逻辑,匹配对应属性即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 23:27:03