Selenium:在动态加载网页中滚动到页面末尾

Posted

技术标签:

【中文标题】Selenium:在动态加载网页中滚动到页面末尾【英文标题】:Selenium: Scroll to end of page in dynamically loading webpage 【发布时间】:2018-07-28 18:59:35 【问题描述】:

我的网页在向下滚动页面时会不断加载新项目,直到所有项目都加载完毕。

我正在使用 Java 中的 Selenium,需要向下滚动到页面底部才能加载所有内容。

我尝试了几种不同的选项,比如滚动到页面底部的某个元素:

WebElement copyrightAtEndOfPage = webDriver.findElement(By.xpath("//a[@href='/utils/copyright.html']"));
((javascriptExecutor) webDriver).executeScript("arguments[0].scrollIntoView();", copyrightAtEndOfPage);

这只是向下滚动一次,然后网页继续加载。

我也尝试了this 方法,它也只向下滚动一次,因为它只考虑浏览器高度。

非常感谢任何帮助。

【问题讨论】:

我们也可以用JS做类似的事情吗? 【参考方案1】:

我将为此提供 Python 代码。我认为翻译成 Java 很容易:

def scroll_down(self):
    """A method for scrolling the page."""

    # Get scroll height.
    last_height = self.driver.execute_script("return document.body.scrollHeight")

    while True:

        # Scroll down to the bottom.
        self.driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")

        # Wait to load the page.
        time.sleep(2)

        # Calculate new scroll height and compare with last scroll height.
        new_height = self.driver.execute_script("return document.body.scrollHeight")

        if new_height == last_height:

            break

        last_height = new_height

希望对你有帮助!

【讨论】:

效果很好,非常感谢!我还将用我翻译成 Java 的代码发布答案。 做到了。再次感谢! 嘿..感谢您的回答..这也应该帮助我!只是一个查询,当我使用这段代码时,我的浏览器会滚动到最后,但新元素仍然没有被捕获。我对此有点陌生。我正在使用 driver.get(url) 后跟上面的代码..你能帮忙吗? @ShrutiJoshi,当您调用此函数时,此代码只会向下滚动到可见页面(屏幕上)的底部。【参考方案2】:

感谢 Ratmir Asanov(请参阅上面批准的答案),我将 Python 代码翻译成 Java,以便其他人更容易实现。

try 
    long lastHeight = (long) ((JavascriptExecutor) webDriver).executeScript("return document.body.scrollHeight");

    while (true) 
        ((JavascriptExecutor) webDriver).executeScript("window.scrollTo(0, document.body.scrollHeight);");
        Thread.sleep(2000);

        long newHeight = (long) ((JavascriptExecutor) webDriver).executeScript("return document.body.scrollHeight");
        if (newHeight == lastHeight) 
            break;
        
        lastHeight = newHeight;
    
 catch (InterruptedException e) 
    e.printStackTrace();

【讨论】:

【参考方案3】:

稍微更新了 Johannes 代码以使其正常运行。

JavascriptExecutor js = (JavascriptExecutor) driver;
try 
    long lastHeight=((Number)js.executeScript("return document.body.scrollHeight")).longValue();
    while (true) 
        ((JavascriptExecutor) driver).executeScript("window.scrollTo(0, document.body.scrollHeight);");
        Thread.sleep(2000);

        long newHeight = ((Number)js.executeScript("return document.body.scrollHeight")).longValue();
        if (newHeight == lastHeight) 
            break;
        
        lastHeight = newHeight;
    
 catch (InterruptedException e) 
    e.printStackTrace();

【讨论】:

类型转换是问题,它抛出编译错误。 错误是什么?因为我从未遇到过该代码的任何问题,并且我在我的项目中以 1:1 的比例使用它。【参考方案4】:

Prabhat 进一步更新上述解决方案,因为它仍然给我编译错误。

    try 
        Object lastHeight = ((JavascriptExecutor) driver).executeScript("return document.body.scrollHeight");

        while (true) 
            ((JavascriptExecutor) driver).executeScript("window.scrollTo(0, document.body.scrollHeight);");
            Thread.sleep(2000);

            Object newHeight = ((JavascriptExecutor) driver).executeScript("return document.body.scrollHeight");
            if (newHeight.equals(lastHeight)) 
                break;
            
            lastHeight = newHeight;
        
     catch (InterruptedException e) 
        e.printStackTrace();
    

【讨论】:

【参考方案5】:

我找到了另一个动态加载页面的解决方案。

计算每次滚动前后显示的元素,并比较它们以确定您是否已滚动到底部。

var reachedEnd = false;
oldCount = driver.FindElements(By.CssSelector(".searchDataContainer.table-row.raw")).Count;

while (!reachedEnd)

    driver.FindElement(By.CssSelector("body")).SendKeys(Keys.End);
    Thread.Sleep(500);
    oldCount = driver.FindElements(By.CssSelector(".searchDataContainer.table-row.raw")).Count;

    if (newCount == oldCount)
    
        reachedEnd = true;
    
    else
    
        newCount = oldCount;
    

【讨论】:

【参考方案6】:

更新了对我有用的代码:

try 
                    long lastHeight = (long) ((JavascriptExecutor) driver).executeScript("return document.body.scrollHeight");
                    int cont=1000;
                    while (true) 
                        ((JavascriptExecutor) driver).executeScript("window.scrollTo(0, "+cont+");");
                        Thread.sleep(2000);

                        long newHeight = (long) ((JavascriptExecutor) driver).executeScript("return document.body.scrollHeight");
                        if (newHeight <= cont) 
                            break;
                        
//                      lastHeight = newHeight;
                        cont+=500;
                    
                 catch (InterruptedException e) 
                    e.printStackTrace();
                

【讨论】:

您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center。

以上是关于Selenium:在动态加载网页中滚动到页面末尾的主要内容,如果未能解决你的问题,请参考以下文章

如何使用硒滚动到页面末尾? [复制]

如何在 Python 中使用 selenium 滚动到页面末尾?

使用 Selenium 在 Python 中滚动到页面顶部

网页滚动条滚动到一定位置后,加载数据,而且数据是由动态效果的怎么做?

动态页面的操作(滚动屏幕到指定元素位置)和DIV滚动条滚动

python爬虫 selenium+phantomjs动态解析网页,加载页面成功,返回空数据