6.8 动态加载Javascript数据操作滚动条

在使用Jsoup和HttpClient直接请求URL时,有时候会发现响应得到的HTML中包含的信息不全,未展示的信息必须通过执行页面中的JavaScript代码才能展示。相比较于Jsoup和HttpClient,Selenium可以利用JavascriptExecutor接口执行任意JavaScript 代码。下面以程序6-21来讲解Selenium动态加载JavaScript数据。
程序6-21演示效果:打开百度首页,利用js代码执行输入“医药库”进行搜索。等待页面元素加载完成后,执行js脚本将滚动条拉到最低,然后停留2秒后,将滚动条拉到最上方。

public class App {
    public static void main(String[] args) throws InterruptedException {
        WebDriver driver  = WebDriverUtils.getWebDriver();
        driver.get("http://www.baidu.com");
        JavascriptExecutor driver_js = (JavascriptExecutor) driver;
        //利用js代码键入搜索关键字
        driver_js.executeScript("document.getElementById(\"kw\").value=\"医药库\"");
        driver.findElement(By.id("su")).click();
        //等待元素页面加载
        waitForElementToLoad(driver, 10, By.xpath(".//*[@id='1']/h3/a[1]"));
        //将页面滚动条拖到底部
        driver_js.executeScript("window.scrollTo(0,document.body.scrollHeight)");
        Thread.sleep(2000);
        //将页面滚动条拖到顶部
        driver_js.executeScript("window.scrollTo(0,0)");
        driver.quit();
    }

    /**
     * 在给定的时间内去查找元素,如果没找到则超时,抛出异常
     * @param driver
     * @param timeOut
     * @param by
     */
    public static void waitForElementToLoad(WebDriver driver, int timeOut, final By by) {
        try {
            (new WebDriverWait(driver, timeOut)).until(new ExpectedCondition<Boolean>() {
                public Boolean apply(WebDriver driver) {
                    WebElement element = driver.findElement(by);
                    return element.isDisplayed();
                }
            });
        } catch (TimeoutException e) {
            e.printStackTrace();
        }
    }
}
发布了46 篇原创文章 · 获赞 0 · 访问量 772

猜你喜欢

转载自blog.csdn.net/Jgx1214/article/details/105337524
6.8