无头浏览器使用
业务场景,
有一个报告的预览页面,这个页面中含有echarts图表,点击下载报告之后,调用echarts的getDataURL()方法将图片数据传到后台,在后台生成word或者pdf。现在需要定期生成报告,然后将报告通过邮件发送给指定邮箱。
思路:模拟去访问页面的url,等页面渲染结束之后,模拟点击下载按钮,等待文件在后台生成完毕,最后发送邮件。
1.纯java的编写的浏览器jBrowserDriver和htmlunit,访问页面时结果都不理想,echarts图不能完成很好的渲染,最终只能放弃。
2.使用无头浏览器
2.1首先想到的是之前用过的phantomjs,因为之前做截图的时候使用过。
刚开始使用的phantomjs-2.1.1这个版本,但是无论在windows下还是在linux下,都出现同样的问题,传到后台的图片数据有问题,但是截图显示出来页面渲染的没有问题,下面是两种情况下后台接收到的数据,可以发现错误的数据中多了很多A,拷数据到img标签中发现,图片出现大片的空白
(正常数据)
(错误数据)
(图片数据,上半部分为传到后台的正常数据的显示,下半部分为错误数据的显示)
改过很多次代码,这种问题的原因还是没有找到。
最后选择用高版本的phantomjs试试,找到了phantomjs-2.5.0-beta-windows这个版本,同样的代码,这个版本的phantomjs传到后台的数据就是正确的,windows下测试通过,准备移到linux下运行时发现,phantomjs的作者早就不更新了,目前已知最稳定的版本是2.1.1。2.5.0-beta在linux下只有phantomjs-2.5.0-beta-linux-ubuntu-trusty-x86_64.tar.gz和phantomjs-2.5.0-beta-linux-ubuntu-xenial-x86_64.tar.gz这两个版本,在centos下都无法使用。所以这种方法也只能放弃了。
2.1使用selenium去调用chrome或firfox去实现
selenium去调用这两个浏览器时都需要对应的驱动
chrome需要ChromeDriver,firefox需要geckodriver,而且浏览器和驱动需要版本对应。
驱动可以去https://npm.taobao.org/mirrors/chromedriver/和https://npm.taobao.org/mirrors/geckodriver/下载
这两种在windows下都测试成功了,然后转移到linux下运行,需要下载chrome和firefox,但是服务器是内网,装chrome时又出现很多依赖包无法下载,chrome安装失败。但是centos7以上自带firefox的,使用firefox -version检查一下,确实已经有了,然后测试代码,通过。下面是简单的代码demo。
System.setProperty("webdriver.gecko.driver", "F:\\firefox\\geckodriver.exe");
FirefoxOptions firefoxOptions = new FirefoxOptions();
//指定浏览器全屏
firefoxOptions.addArguments("--start-fullscreen");
firefoxOptions.addArguments("--headless");
//创建firefox
WebDriver driver = new FirefoxDriver(firefoxOptions);
driver.get(url2);
//等待页面完成渲染
Thread.sleep(5*1000);
//模拟点击登陆
driver.findElement(By.xpath("//*[@id=\"create-report\"]")).click();
//退出浏览器
driver.quit();
3.送带附件的邮件。
这里出现的问题是,windox下使用网易的163的邮件服务器,发送带附件的邮件,发送成功,放在内网服务器上,虽然也能发送成功,但是接收方无法打开邮件。
查看本机测试发送的邮件发现,代码中邮件设置了正文,但是收到的邮件中并没有,可能是这个问题导致的。首先考虑为什么设置了正文但是邮件中不显示呢?
代码中这部分在设置附件part的同时设置了正文内容,所以在接收方的邮件中没有显示正文
添加第二个part用来显示正文,这样在邮件中就可以显示正文了。移到内网服务器测试通过。