【问题标题】:Get Dynamically Loaded HTML After Scrolling To Bottom滚动到底部后获取动态加载的 HTML
【发布时间】:2016-04-18 19:34:09
【问题描述】:

我有以下代码:

import java.io.IOException;

import com.machinepublishers.jbrowserdriver.JBrowserDriver;
import com.machinepublishers.jbrowserdriver.Settings;
import com.machinepublishers.jbrowserdriver.Timezone; 

public class ReadMovies {

    public static void main(final String[] args) throws IOException {
        final JBrowserDriver driver = new JBrowserDriver(Settings.builder().timezone(Timezone.AMERICA_NEWYORK).build());
        driver.get("http://www.cinesift.com/#/");

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

        System.out.println(driver.getPageSource());

        driver.quit();
    }
}

但是,executeScript() 似乎没有任何效果 - 程序仍然会在页面首次加载时打印原始源(因此没有加载其他元素)。有谁知道怎么回事?

【问题讨论】:

    标签: javascript java html selenium selenium-webdriver


    【解决方案1】:

    向下滚动页面时会加载其他电影。如果要加载所有或一定数量的电影,则必须不断向下滚动并等待。

    天真的实现:

    int DESIRED_COUNT = 100;
    int currentCount = driver.findElements(By.cssSelector("#films .film")).size();
    
    while (currentCount < DESIRED_COUNT) {
        driver.executeScript("window.scrollTo(0, document.body.scrollHeight)");
        Thread.sleep(1000);
        currentCount = driver.findElements(By.cssSelector("#films .film")).size();
    }
    
    // now get the page source
    System.out.println(driver.getPageSource());
    

    Thread.sleep() 等待可能应该通过WebDriverWait 替换为显式等待。

    【讨论】:

    • Thread.sleep() 是我缺少的部分。没有意识到我实际上需要给服务器时间来响应:)。谢谢!
    • @JohnRoberts Thread.sleep() 通常应避免使用,而应使用WebDriverWait()。不过,对于这项任务,我认为这还不错——我们在 while 循环条件中进行了预期的条件检查。
    猜你喜欢
    • 1970-01-01
    • 2019-05-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-18
    相关资源
    最近更新 更多