需求
- Spring Boot项目,需要在每天下午4点定时截取软件系统中的一个图表页面,发送到领导邮箱
关注点
- 下午4点定时发送
- 自动截图
- 浏览器不会一直打开,需要模拟浏览器打开截图页面
- 发送邮箱
技术栈
- Spring 定时任务
- Spring Scheduled
- Chrome Driver下载
- https://chromedriver.chromium.org/downloads
- 运行环境安装Chrome
- 注意:安装Chrome一定要与系统使用的Chrome Driver版本一致
- 自动截图
- 使用git开源项目ashot : https://github.com/pazone/ashot
- 模拟浏览器打开系统页面
- 打开页面url权限控制:token验证
- 自己想办法,每个系统使用方法不一致
- 模拟浏览器:Selenium
- 打开页面url权限控制:token验证
- 发送邮箱
- 邮箱工具类
实现
- 引入依赖插件
- ashot
<dependency> <groupId>ru.yandex.qatools.ashot</groupId> <artifactId>ashot</artifactId> <version>1.5.4</version> </dependency>
-
- Selenium
<dependency> <groupId>org.seleniumhq.selenium</groupId> <artifactId>selenium-java</artifactId> <version>4.1.2</version> </dependency>
- 实现代码
/** * 每天下午4点发送日报截图到邮箱 * * @throws InterruptedException */ @Scheduled(cron = "0 0 16 * * ?") public void sendChartScreen() throws InterruptedException { logger.info("sendChartScreen is start :{}", new Date()); String chromeDriver = "Chrome Driver驱动文件存放位置"; String chromePageUrl = "系统打开页面url"; String url= = "邮箱地址"; logger.info("chromeDriver={}", chromeDriver); System.setProperty("webdriver.chrome.driver", chromeDriver); ChromeOptions chromeOptions = new ChromeOptions(); chromeOptions.addArguments("--headless");//设置为 headless 模式 (必须) chromeOptions.addArguments("--disable-gpu");//谷歌文档提到需要加上这个属性来规避bug chromeOptions.addArguments("--no-sandbox");//参数是让Chrome在root权限下跑 chromeOptions.addArguments("--disable-dev-shm-usage"); chromeOptions.addArguments("lang=zh_CN.UTF-8");//中文 chromeOptions.addArguments("window-size=1920x1080"); //指定浏览器分辨率 final WebDriver driver = new ChromeDriver(chromeOptions); driver.manage().window().maximize(); driver.manage().timeouts().pageLoadTimeout(10, TimeUnit.SECONDS); driver.manage().timeouts().setScriptTimeout(10, TimeUnit.SECONDS); driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS); driver.get(chromePageUrl); //设置等待时间:系统页面响应数据需要时间,此处必须设置否则页面无响应数据 Thread.sleep(5000); //截图 BufferedImage bi = new AShot() .shootingStrategy(ShootingStrategies.viewportPasting(100)) .takeScreenshot(driver).getImage(); try { //创建临时图片文件 File file = File.createTempFile("dayweek", ".png"); ImageIO.write(bi, "png", file); //发送到邮箱(自己实现,下面代码是我的工具类) EmailMessageImpl.sendImage(file, url); } catch (Exception e) { logger.error("定时发送矿场日报图表失败", e); }
//一次截图后要退出,否则后续使用会报错 driver.quit(); logger.info("sendChartScreen is end :{}", new Date()); }