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

如何使用Selenium滚动到大小持续增加的动态列表的最后一个元素

Selenium模态框无限滚动列表加载全量元素解决方案

问题根因

  • 你之前的滚动操作对象是全局页面body,而模态窗口的滚动区域是独立的内部容器,全局滚动不会触发模态框内的列表加载
  • 无限滚动列表需要持续滚动到当前已加载的最后一个元素,等待新元素加载后重复操作,直到连续多次滚动后列表元素数量不再变化,才代表全量加载完成

完整实现代码(Java)

// 1. 定位模态框内部的滚动容器,需替换为你实际的滚动容器选择器
// 可通过F12元素面板找到滚动时scrollTop属性变化的父元素,通常带有overflow: auto/scroll属性
WebElement modalScrollContainer = driver.findElement(By.cssSelector(".modal-scroll-area"));
// 列表元素的选择器,复用你之前的.Abc类选择器
String listItemSelector = ".Abc";
int previousItemCount = 0;
int noNewItemRetry = 0;
// 最多5次无新元素就终止,避免无限循环
int maxRetry = 5;

while (noNewItemRetry < maxRetry) {
    List<WebElement> currentItems = driver.findElements(By.cssSelector(listItemSelector));
    int currentItemCount = currentItems.size();
    
    // 无新元素加载时累加重试次数
    if (currentItemCount == previousItemCount) {
        noNewItemRetry++;
        Thread.sleep(800);
        continue;
    }
    
    // 检测到新元素,重置重试计数
    noNewItemRetry = 0;
    previousItemCount = currentItemCount;
    
    // 滚动到当前列表的最后一个元素
    WebElement lastItem = currentItems.get(currentItemCount - 1);
    ((JavascriptExecutor) driver)
        .executeScript("arguments[0].scrollIntoView({block: 'end', behavior: 'smooth'});", lastItem);
    // 等待新元素加载完成,可根据页面响应速度调整
    Thread.sleep(1000);
}

// 循环结束后即可获取全量列表元素
List<WebElement> allLoadedItems = driver.findElements(By.cssSelector(listItemSelector));

备选滚动方案

如果scrollIntoView不生效,可以直接操作滚动容器的滚动高度,替换上面的滚动逻辑即可:

((JavascriptExecutor) driver)
    .executeScript("arguments[0].scrollTop = arguments[0].scrollHeight;", modalScrollContainer);

内容的提问来源于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.01 07:03:00