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端代码
添加依赖
<!-- selenium-java -->
<dependency>
<groupId>org.seleniumhq.selenium</groupId>
<artifactId>selenium-java</artifactId>
<version>3.4.0</version>
</dependency>
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();
}
}
版权声明:本文为qq_31587795原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。