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     }
使用 phantomjs截图

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     }
chromedriver截图使用

注 :

1.phantomjs截图会创建无界面浏览器进行截图,可截取网页长图 (推荐使用)
2.chromedriver 截图工具只能截取当前浏览器可见区域长度(调用浏览器打开url地址,插件版本需要与chrom浏览器版本一致)

3.Thumbnails 为图片压缩工具

posted @ 2019-03-20 17:21  atimo  阅读(4351)  评论(1编辑  收藏  举报