WebDriver环境搭建使用
1. WebDriver简介
利用浏览器原生的API,封装成一套更加面向对象的Selenium WebDriver API。直接操作浏览器页面里的元素,甚至操作浏览器本身(截屏,窗口大小,启动,关闭,安装插件,配置证书之类的)
2. 环境搭建
使用webdriver需要三个前提:浏览器(服务端安装的真实的浏览器), webdriver驱动(可执行程序), webdriver api(程序调用包)。本文使用的是 google chrome浏览器, chromdriver, 和 selenium,这三者是有版本限制的,若不匹配则可能不能正常运行的情况。匹配的版本之一:
- Google chrome 69 chrome 会定时更新,所以要禁止chrome更新版本
- chromdriver 2.42 下载地址 http://chromedriver.storage.googleapis.com/index.html
- selenium 2.44.0 maven配置如下
<dependency>
<groupId>org.seleniumhq.selenium</groupId>
<artifactId>selenium-java</artifactId>
<version>2.44.0</version>
</dependency>
将chromdriver.exe放到chrome.exe所在的文件夹下。如下图所示
3. 使用
- 启动浏览器
// 设置驱动位置
System.setProperty("webdriver.chrome.driver", "C:/Program Files (x86)/Google/Chrome/Application/chromedriver.exe");
WebDriver driver = new ChromeDriver();
// 请求url
driver.get(url);
// 获得元素
WebElement element = driver.finElement(By.xpath("//div"));
使用XPath查找元素是笔者推荐的一种方式,XPath语法简单,功能强大。
- 截图
WebDriver是可以截取页面上任意一个元素的图片的,代码如下:
public byte[] getImageFromDriver(WebDriver driver, String imageType) {
try {
// 获得要截图的元素
WebElement captchaImageElement = driver.finElement(By.className("Img"));
// 屏幕截图对象
TakesScreenshot takesScreenshot = (TakesScreenshot) driver;
// 获取截图byte
byte[] screen = takesScreenshot.getScreenshotAs(OutputType.BYTES);
BufferedImage img = ImageIO.read(new ByteArrayInputStream(screen));
// 获得元素的高度和宽度
int width = imageElement.getSize().getWidth();
int height = imageElement.getSize().getHeight();
// 获得元素坐标
Point point = imageElement.getLocation();
BufferedImage dest = img.getSubimage(point.getX(), point.getY(), width, height);
// 存为png格式
ByteArrayOutputStream byteout = new ByteArrayOutputStream();
ImageIO.write(dest, imageType, byteout);
return byteout.toByteArray();
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
4. 注意事项
driver.close() 只是关闭浏览器窗口,其进程还存在(遇到的坑)
driver.quit() 关闭浏览器,并关闭进程
5. 总结
据说有了webdriver,让爬虫穿上了盔甲。笔者同意呀!!