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

Selenium(Java):滚动页面直至加载指定数量元素的实现方案

实现Selenium持续滚动加载直到指定数量元素的方案

针对你遇到的场景——初始加载21个元素,点击「查看更多」后转为滚动加载新元素,要持续加载到100个元素,以下是可靠的实现方案:

核心思路

  1. 先等待并点击「查看更多」按钮,触发后续的滚动加载逻辑
  2. 循环执行「滚动到底部 + 等待新元素加载」的操作,直到元素数量达到目标值(100个)
  3. 避免使用Thread.sleep(),改用显式等待保证加载完成,提升稳定性

优化后的代码实现

// 初始化显式等待,超时时间设为10秒(可根据实际加载速度调整)
WebDriverWait wait = new WebDriverWait(driver, 10);
int targetElementCount = 100;
int currentElementCount = 0;
List<WebElement> elements;

// 第一步:点击「查看更多」按钮(等待按钮可点击后再操作)
wait.until(ExpectedConditions.elementToBeClickable(
    By.cssSelector(".btn.btn-primary.btn-alternate.search-more")
)).click();

// 第二步:循环滚动加载,直到元素数量达标
do {
    // 获取当前元素数量作为基准
    elements = driver.findElements(By.className("project-tile"));
    currentElementCount = elements.size();
    
    // 滚动到页面底部,触发新元素加载
    ((JavascriptExecutor) driver)
        .executeScript("window.scrollTo(0, document.body.scrollHeight)");
    
    // 等待新元素加载完成(直到元素数量增加,或超时)
    try {
        wait.until(driver -> {
            List<WebElement> updatedElements = driver.findElements(By.className("project-tile"));
            return updatedElements.size() > currentElementCount;
        });
    } catch (TimeoutException e) {
        // 若超时说明已无更多元素可加载,终止循环
        System.out.println("已加载全部元素,无法达到目标数量");
        break;
    }
} while (currentElementCount < targetElementCount);

// 最终获取元素列表及数量
elements = driver.findElements(By.className("project-tile"));
int finalCount = elements.size();
System.out.println("最终加载元素数量:" + finalCount);

关键说明

  • 替换Thread.sleep():显式等待会根据实际加载状态等待,比固定休眠更灵活,避免因网络延迟导致的加载不完整
  • 循环终止条件:既判断元素数量是否达标,也处理了「网站已无更多元素」的边界情况,防止无限循环
  • 滚动方式可选:如果滚动到底部不生效,可改为滚动到当前最后一个元素的位置,触发加载:
    ((JavascriptExecutor) driver)
        .executeScript("arguments[0].scrollIntoView(true);", elements.get(elements.size() - 1));
    

你提供的原始代码问题

你的代码仅执行了一次点击和一次滚动,无法持续触发加载,因此只能获取到少量元素:

driver.findElement(By.cssSelector("[class='btn btn-primary btn-alternate search-more']")).click();

Thread.sleep(2000);

((JavascriptExecutor) driver)
     .executeScript("window.scrollTo(0, document.body.scrollHeight)");

List<WebElement> elements = driver.findElements(By.className("project-tile"));
int elementsCount = elements.size();     

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 05:30:44