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

Selenium Java:动态加载页面滚动至底部的实现方案

解决Java Selenium滚动加载页面无法持续加载的问题

我之前帮别人处理过一模一样的滚动加载页面问题,单次滚动确实没法触发后续的内容加载——这类页面的逻辑是你滚动到底部后,它会异步加载新内容,加载完成后页面高度才会增加,所以得循环执行滚动+等待的操作,直到没有新内容为止。

下面是亲测有效的Java代码方案,核心思路是循环滚动到底部,等待页面高度变化,直到高度不再增加就停止:

import org.openqa.selenium.JavascriptExecutor;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.support.ui.WebDriverWait;
import org.openqa.selenium.TimeoutException;
import java.time.Duration;

public class ScrollLoadAllContent {
    public static void scrollToLoadAll(WebDriver driver) {
        JavascriptExecutor js = (JavascriptExecutor) driver;
        // 获取初始页面高度(兼容不同页面的scrollHeight计算逻辑)
        long lastHeight = (long) js.executeScript("return Math.max(document.body.scrollHeight, document.documentElement.scrollHeight)");

        while (true) {
            // 滚动到当前页面的最底部
            js.executeScript("window.scrollTo(0, Math.max(document.body.scrollHeight, document.documentElement.scrollHeight));");

            // 显式等待新内容加载:等待页面高度增加,超时时间可根据页面加载速度调整
            WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(3));
            try {
                wait.until(driver -> {
                    long currentHeight = (long) ((JavascriptExecutor) driver).executeScript("return Math.max(document.body.scrollHeight, document.documentElement.scrollHeight)");
                    return currentHeight > lastHeight;
                });
            } catch (TimeoutException e) {
                // 超时说明没有新内容加载了,终止循环
                System.out.println("所有内容已加载完成,停止滚动");
                break;
            }

            // 更新最新的页面高度,进入下一轮滚动判断
            lastHeight = (long) js.executeScript("return Math.max(document.body.scrollHeight, document.documentElement.scrollHeight)");
        }
    }
}

关键细节说明:

  • 兼容不同页面的高度计算:有些页面的滚动高度存储在document.body,有些在document.documentElement,用Math.max可以覆盖大多数场景;
  • 显式等待替代硬休眠:Thread.sleep很容易因为页面加载快慢导致判断错误,用显式等待页面高度变化的逻辑更可靠;
  • 超时终止循环:当滚动后页面高度不再增加(超时触发),说明所有内容都加载完成,直接退出循环即可。

可选优化方向:

如果你的页面有明确的加载提示元素(比如"加载中"的Spinner),可以把等待条件改成等待加载元素消失,这样判断会更精准:

// 假设加载Spinner的定位器是By.id("loading-spinner")
wait.until(ExpectedConditions.invisibilityOfElementLocated(By.id("loading-spinner")));

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 08:52:41