java+selenium+chrome headless实现后端截图功能

1.需求背景

客户希望将项目中统计报表的界面的数据每月发送给他。不考虑用jasper报表软件之类太重的,直接截图,将图片放入邮件中更合适。需要跳过登录验证,截取指定元素图片。

2.技术选择

之前调研过用Phantomjs来实现截图,发现截出来的图片总是显示不正常,所以就选择用chrome headles

3.linux安装chrome headless

1./etc/yum.repos.d/google-chrome.repo

[google-chrome]
name=google-chrome
baseurl=http://dl.google.com/linux/chrome/rpm/stable/$basearch
enabled=1
gpgcheck=1
gpgkey=https://dl-ssl.google.com/linux/linux_signing_key.pub

2.yum install google-chrome-stable

或者可以直接通过使用脚本安装
curl https://intoli.com/install-google-chrome.sh | bash

只适用于centos7.0以上,装不上就换系统把

4.下载chromedriver

找到对应浏览器版本的驱动
http://npm.taobao.org/mirrors/chromedriver/

5.编写java端代码

添加依赖

  
  
      org.seleniumhq.selenium
      selenium-java
      3.4.0
  
package com.zdw.selenium_demo.runner;

import lombok.extern.slf4j.Slf4j;
import org.apache.commons.io.FileUtils;
import org.openqa.selenium.*;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.chrome.ChromeOptions;

import org.springframework.boot.CommandLineRunner;
import org.springframework.stereotype.Component;

import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.File;


/**
 * Created by zhoudw
 * 2020-03-18 16:39.
 */
@Component
@Slf4j
public class StartRunner implements CommandLineRunner {

    @Override
    public void run(String... args) throws Exception{
        //驱动地址
        System.setProperty("webdriver.chrome.driver","/chromedriver");

        WebDriver webDriver = null;
        String url = "登录页面";
        ChromeOptions options=new ChromeOptions();
        //设置 chrome 的无头模式
        options.addArguments("--headless");
        options.addArguments("--disable-gpu");
        options.addArguments("--no-sandbox");
        options.addArguments("--disable-dev-shm-usage");
        options.addArguments("--start-maximized");
        //因为报表页面必须滚动才能全部展示,这里直接给个很大的高度
        options.addArguments("--window-size=1280,4300");
        //启动一个 chrome 实例
        webDriver = new ChromeDriver(options);

        //页面最大化
//        webDriver.manage().window().maximize();
//        Thread.sleep(2000);
        //全局等等
//        webDriver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);



        //访问网址
        webDriver.get(url);
        Thread.sleep(2000);

//        WebDriverWait webDriverWait=new WebDriverWait(webDriver,5);

        //执行javascript 可以直接设置localstroage,cookie等方式。不过拼字符串实在太麻烦
//        String token = "localStorage.setItem('cloud.token','{\"val\":\"5d31f455-8ed5-4ebe-80d1-760665df452c\",\"expires\":1584531900299}')";
//        ((JavascriptExecutor)webDriver).executeScript(token);

        //账号密码,按钮  ,直接模拟登录操作就简单了
        webDriver.findElement(By.id("userAccount")).sendKeys("admin");
        webDriver.findElement(By.id("userPwd")).sendKeys("admin");
        webDriver.findElement(By.id("login")).click();



        Thread.sleep(2000);
        //报表页面
        webDriver.get(截图的页面");
        Thread.sleep(8000);


        //定位section元素
        WebElement element =  webDriver.findElement(By.tagName("section"));
        Point p = element.getLocation();
        int width = element.getSize().getWidth();
        int height = element.getSize().getHeight();
        Rectangle rec = new Rectangle(p.getX(),p.getY(),height,width);

        //截取全屏
        File scrFile  = ((TakesScreenshot)webDriver).getScreenshotAs(OutputType.FILE);
        //在全屏图片下裁剪
        BufferedImage img = ImageIO.read(scrFile);
        BufferedImage dest = img.getSubimage(p.getX(), p.getY(),rec.getWidth(),rec.getHeight());
        ImageIO.write(dest, "png", scrFile);
        //拷贝文件
        FileUtils.copyFile(scrFile , new File("a.png"));
        log.info("截图完成");
        //退出
        webDriver.quit();
    }




}

你可能感兴趣的:(chrome,headless,后端截图,selenium)