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