使用工具
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 為圖片壓縮工具