当前位置:   article > 正文

Java+Selenium+Chrome实现后台加载Echarts并返回base64_java chromedriver 后台渲染

java chromedriver 后台渲染

目录

一、资源准备

1、引入selenium-java

2、下载ChromeDriver

二、编写代码

1、准备一个html模板文件,用于加载Echarts并返回Echarts图片

2、准备加载工具类

三、测试

四、总结

五、问题


一、资源准备

1、引入selenium-java

  1. <dependency>
  2. <groupId>org.seleniumhq.selenium</groupId>
  3. <artifactId>selenium-java</artifactId>
  4. <version>3.141.59</version>
  5. </dependency>

2、下载ChromeDriver

ChromeDriver下载版本需与本机Chrome浏览器版本对应,有对应的Windows、Mac、Linux版本   

ChromeDriver下载地址1        ChromeDriver下载地址2

tips:Chrome 70版本以后ChromeDriver对应的版本和Chrome版本对应,下载对应版本即可,70之前可参考 29~66版本对应关系表

二、编写代码

1、准备一个html模板文件,用于加载Echarts并返回Echarts图片

  1. <html>
  2. <meta charset="UTF-8">
  3. <meta http-equiv="content-type" content="text/html; charset=utf-8">
  4. <head>
  5. <script src="jquery-1.8.2.min.js"></script>
  6. <script src="echarts.js"></script>
  7. </head>
  8. <body>
  9. <!--准备一个DOM-->
  10. <div id="echartsDemo" style="height:500px;width:500px"></div>
  11. </body>
  12. <script>
  13. var echartsDemo= null;
  14. $(function () {
  15. // 基于准备好的dom,初始化echarts实例
  16. echartsDemo= echarts.init(document.getElementById('echartsDemo'));
  17. });
  18. function loadEcharts(data) {
  19. var option = {
  20. xAxis: {
  21. type: 'category',
  22. data: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']
  23. },
  24. yAxis: {
  25. type: 'value'
  26. },
  27. series: [{
  28. data: [820, 932, 901, 934, 1290, 1330, 1320],
  29. type: 'line'
  30. }]
  31. };
  32. option && echartsDemo.setOption(option);
  33. // 传入参数时使用data
  34. // echartsDemo.setOption(data);
  35. }
  36. function returnEchartImg() {
  37. var url = echartsDemo.getDataURL();
  38. //获取到Echarts图片之后将实例清空
  39. echartsDemo.clear();
  40. return url;
  41. }
  42. </script>
  43. </html>

2、准备加载工具类

Tips:

1、此处  getEchartsPic() 加锁是因为在使用同一个WebDriver时,使用多线程执行时可能会导致线程不安全问题。

2、WebDriver可设置成单例模式,根据需求场景设置即可,也可设置成对象资源池。

  1. /**
  2. * chromeDriver.exe驱动位置
  3. */
  4. private static String CHROME_DRIVER_URL;
  5. /**
  6. * 模板位置
  7. */
  8. private static String TEMPLATE_URL;
  9. //从配置中获取参数值
  10. //tips:类上记得加@Component注解
  11. @Value("${selenium.chromedriver.url}")
  12. public void setChromeDriverUrl(String chromeDriverUrl) {
  13. CHROME_DRIVER_URL = chromeDriverUrl;
  14. }
  15. @Value("${selenium.template.url}")
  16. public void setTemplateUrl(String templateUrl) {
  17. TEMPLATE_URL = templateUrl;
  18. }
  19. /**
  20. * 初始化ChromeDriver对象
  21. */
  22. public static void initWebDriver(){
  23. driver = getWebDriver();
  24. }
  25. /**
  26. * 获取图片byte
  27. */
  28. //加锁
  29. public synchronized static String getEchartsPic(String option) {
  30. try {
  31. //driver = getWebDriver();
  32. if (driver == null || driver.toString().contains("(null)")){
  33. throw new NullPointerException("WebDriver已关闭,请初始化WebDriver");
  34. }
  35. if (logger.isDebugEnabled()) {
  36. logger.debug("当前系统环境为:" + System.getProperties().getProperty("os.name"));
  37. }
  38. //Resource resource = new ClassPathResource("html/fxm.html");
  39. //driver.get(resource.getFile().getPath());
  40. //访问html,拿到html资源
  41. driver.get(TEMPLATE_URL);
  42. if (logger.isDebugEnabled()) {
  43. logger.debug("当前driver获取到的html资源url:" + driver.getCurrentUrl());
  44. }
  45. //执行html,开始渲染Echarts
  46. JavascriptExecutor js = (JavascriptExecutor) driver;
  47. js.executeScript("loadEcharts(" + option + ")");
  48. //延迟1秒等待echarts图绘制完成
  49. //此处可不等待,将Echarts参数中加入animation:false停止动画即可
  50. //Thread.sleep(50);
  51. String imgBase64 = js.executeScript("return returnEchartImg()").toString().replace("data:image/png;base64,", "");
  52. if (logger.isDebugEnabled()) {
  53. logger.debug("当前获取到的图片base64:" + imgBase64);
  54. }
  55. return imgBase64;
  56. } catch (Exception e) {
  57. e.printStackTrace();
  58. }finally {
  59. //此处因场景需要多次执行,将driver实例提供到外层关闭和初始化
  60. //driver.close();
  61. //driver.quit();
  62. }
  63. return null;
  64. }
  65. /**
  66. * 初始化WebDriver
  67. *
  68. * @return
  69. */
  70. public static WebDriver getWebDriver() {
  71. // 设置ChromeDriver的路径加载驱动
  72. System.setProperty("webdriver.chrome.driver", CHROME_DRIVER_URL);
  73. //设置 chrome 的无头模式
  74. ChromeOptions chromeOptions = new ChromeOptions();
  75. //无头模式
  76. chromeOptions.setHeadless(true);
  77. //地址出现data:,
  78. //chromeOptions.addArguments("--user-data-dir=C:/Users/Administrator/AppData/Local/Google/Chrome/User Data/Default");
  79. //Chrome正在受到显示自动软件的控制 不提示语
  80. chromeOptions.addArguments("disable-infobars");
  81. //禁用gpu加速,没有gpu运行时会报错,但是并不会影响chrome正常运行
  82. chromeOptions.addArguments("--disable-gpu");
  83. //linux版本需要禁用沙盒,linux 下让Chrome在root权限下跑
  84. chromeOptions.addArguments("--no-sandbox");
  85. //启动一个 chrome 实例
  86. return new ChromeDriver(chromeOptions);
  87. }

三、测试

  1. EchartsToPicUtil.initWebDriver();
  2. String base64 = EchartsToPicUtil.getEcharsPic(" {\n" +
  3. " tooltip: {\n" +
  4. " trigger: 'axis',\n" +
  5. " axisPointer: {\n" +
  6. " type: 'shadow'\n" +
  7. " }\n" +
  8. " },\n" +
  9. " grid: {\n" +
  10. " left: '3%',\n" +
  11. " right: '4%',\n" +
  12. " bottom: '3%',\n" +
  13. " containLabel: true\n" +
  14. " },\n" +
  15. " xAxis: [\n" +
  16. " {\n" +
  17. " type: 'category',\n" +
  18. " data: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'],\n" +
  19. " axisTick: {\n" +
  20. " alignWithLabel: true\n" +
  21. " }\n" +
  22. " }\n" +
  23. " ],\n" +
  24. " yAxis: [\n" +
  25. " {\n" +
  26. " type: 'value'\n" +
  27. " }\n" +
  28. " ],\n" +
  29. " series: [\n" +
  30. " {\n" +
  31. " name: 'Direct',\n" +
  32. " type: 'bar',\n" +
  33. " barWidth: '60%',\n" +
  34. " data: [10, 52, 200, 334, 390, 330, 220]\n" +
  35. " }\n" +
  36. " ]\n" +
  37. "}");
  38. System.out.println(base64);
  39. WebDriver driver = EchartsToPicUtil.getWebDriverInstance();
  40. driver.close();
  41. driver.quit();

执行成功

四、总结

1、使用场景:在java后台加载Echarts并拿到渲染后的Echarts图后用于生成Word。拿到Base64即可。

2、衍生:该场景只是Selenium+Chrome的使用之一,具体使用自行查阅。

五、问题

1、echarts.getDataUrl()方法默认返回png格式图片,在替换时需修改对应格式,否则会导致颜色加载问题。

2、linux环境启动需禁用沙盒

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Monodyee/article/detail/645441
推荐阅读
相关标签
  

闽ICP备14008679号