在使用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();
}
}
}