java实现网页截图
使用工具
java+selenium+phantomjs /chromedriver /firefox
1.分别是 phantomjs插件 google截图插件 和 firefox火狐浏览器截图插件
2. selenium工具 是对页面进行点击操作后在截图 需要用到的工具。
插件的使用方法几乎一致
上代码:1.使用phantomjs截图
1 public static String getPicByPhantomjs(Map<String ,String> map,String pic,File sf){ 2 logger.warn("使用phantomjs截图链接:"+map.get("url")); 3 //定义图片存储路径 4 DesiredCapabilities dcaps = null; 5 PhantomJSDriver driver = null; 6 String picName = null; 7 try { 8 //设置必要参数 9 dcaps = new DesiredCapabilities(); 10 //ssl证书支持 11 dcaps.setCapability("acceptSslCerts", true); 12 //截屏支持 13 dcaps.setCapability("takesScreenshot", true); 14 //css搜索支持 15 dcaps.setCapability("cssSelectorsEnabled", true); 16 //js支持 17 dcaps.setJavascriptEnabled(true); 18 //驱动支持(第二参数表明的是你的phantomjs引擎所在的路径) 19 dcaps.setCapability(PhantomJSDriverService.PHANTOMJS_EXECUTABLE_PATH_PROPERTY, 20 "D:/phantomjs/phantomjs-2.1.1-windows/bin/phantomjs.exe"); 21 // "F:/test/phantomjs-2.1.1-windows/bin/phantomjs.exe"); 22 //创建无界面浏览器对象 23 driver = new PhantomJSDriver(dcaps); 24 long start = System.currentTimeMillis(); 25 // driver.get(url); 26 driver.get(map.get("url")); 27 //设置隐性等待(作用于全局) 28 driver.manage().timeouts().implicitlyWait(2, TimeUnit.SECONDS); 29 Thread.sleep(5* 1000); 30 if(!"".equals(map.get("str")) && map.get("str")!=null){ 31 if(ElementExist(driver,By.className(map.get("str")))){ 32 WebElement inputBox = driver.findElement(By.className(map.get("str"))); 33 Actions action = new Actions(driver); 34 action.click(inputBox).build().perform(); 35 //元素点击 后等待加载 36 Thread.sleep(2 * 1000); 37 } 38 } 39 40 JavascriptExecutor js = driver; 41 //页面下滑10次,每次下滑加载2s 42 for (int i = 0; i < 10; i++) { 43 js.executeScript("window.scrollBy(0,1000)"); 44 //睡眠2s等js加载完成 45 Thread.sleep(2 * 1000); 46 } 47 //指定了OutputType.FILE做为参数传递给getScreenshotAs()方法,其含义是将截取的屏幕以文件形式返回。 48 File srcFile = ((TakesScreenshot)driver).getScreenshotAs(OutputType.FILE); 49 Thread.sleep(2000); 50 //利用FileUtils工具类的copyFile()方法保存getScreenshotAs()返回的文件对象 51 FileUtils.copyFile(srcFile, new File(sf.getPath()+File.separator+pic)); 52 Thread.sleep(2000); 53 Thumbnails.of(sf.getPath()+File.separator+pic).scale(1.0f).toFile(sf.getPath()+File.separator+pic); 54 driver.close(); 55 driver.quit(); 56 picName = pic; 57 System.out.println("本次截图耗时:" + (System.currentTimeMillis() - start) + " 毫秒"); 58 // System.out.println("转换后的链接:"+map.get("url")); 59 } catch (Exception e) { 60 driver.close(); 61 driver.quit(); 62 picName = ""; 63 logger.warn("使用phantomjs截图时:"+e.toString()); 64 } 65 return picName; 66 }
2.使用 chromedriver截图
1 public static String getPicByChrom(Map<String ,String> map,String pic,File sf){ 2 3 logger.warn("使用chromedriver截图链接:"+map.get("url")); 4 //定义图片存储路径 5 WebDriver driver = null ; 6 String picName = null; 7 try { 8 long start = System.currentTimeMillis(); 9 String chromeDriverDir = "D:/chromedriver/chromedriver_win32/chromedriver.exe"; 10 System.setProperty("webdriver.chrome.driver", chromeDriverDir); 11 driver = new ChromeDriver(); 12 driver.manage().window().maximize(); 13 driver.get(map.get("url")); 14 //设置隐性等待(作用于全局) 15 driver.manage().timeouts().implicitlyWait(2, TimeUnit.SECONDS); 16 Thread.sleep(5* 1000); 17 if(!"".equals(map.get("str")) && map.get("str")!=null){ 18 if(ElementExist(driver,By.className(map.get("str")))){ 19 WebElement inputBox = driver.findElement(By.className(map.get("str"))); 20 Actions action = new Actions(driver); 21 action.click(inputBox).build().perform(); 22 //元素点击 后等待加载 23 Thread.sleep(2 * 1000); 24 } 25 } 26 27 // JavascriptExecutor js = (JavascriptExecutor) driver; 28 //页面下滑10次,每次下滑加载2s 29 // for (int i = 0; i < 1; i++) { 30 // js.executeScript("window.scrollBy(0,1000)"); 31 // //睡眠2s等js加载完成 32 // Thread.sleep(2 * 1000); 33 // } 34 //指定了OutputType.FILE做为参数传递给getScreenshotAs()方法,其含义是将截取的屏幕以文件形式返回。 35 File srcFile = ((TakesScreenshot)driver).getScreenshotAs(OutputType.FILE); 36 Thread.sleep(2000); 37 //利用FileUtils工具类的copyFile()方法保存getScreenshotAs()返回的文件对象 38 FileUtils.copyFile(srcFile, new File(sf.getPath()+File.separator+pic)); 39 Thread.sleep(2000); 40 Thumbnails.of(sf.getPath()+File.separator+pic).scale(1.0f).toFile(sf.getPath()+File.separator+pic); 41 driver.close(); 42 driver.quit(); 43 picName = pic; 44 System.out.println("本次截图耗时:" + (System.currentTimeMillis() - start) + " 毫秒"); 45 // System.out.println("转换后的链接:"+map.get("url")); 46 } catch (Exception e) { 47 driver.close(); 48 driver.quit(); 49 picName = ""; 50 logger.warn("使用chromedriver截图时:"+e.toString()); 51 } 52 return picName; 53 }
注 :
1.phantomjs截图会创建无界面浏览器进行截图,可截取网页长图 (推荐使用)
2.chromedriver 截图工具只能截取当前浏览器可见区域长度(调用浏览器打开url地址,插件版本需要与chrom浏览器版本一致)
3.Thumbnails 为图片压缩工具
提莫队长