通过 HtmlUnit 使用 ECharts 访问 HTML

Access HTML with ECharts by HtmlUnit

我访问了一个 HTML,其中包含 HtmlUnit 的 ECharts 代码。 div picstr 内容是图表的 base64 字符串。 问题是:此 div 的内容在 Java 输出中与 HTML 输出不同。 请帮忙。

这是我的 HTML 代码:

<body>
    <div id="main" style="width: 600px;height:400px;"></div>
    <div id="picstr"></div>
    <script type="text/javascript">
        var searchStr = location.search;
        searchStr = searchStr.substr(1);
        var searchs = searchStr.split("&");
        var data1 = searchs[0].split("=");
        var data2 = searchs[1].split("=");

        var myChart = echarts.init(document.getElementById('main'));
        var option = {
            title: {
                text: 'ECharts'
            },
            tooltip: {},
            legend: {
                data:['销量', '产量']
            },
            xAxis: {
                data: ["衬衫","羊毛衫","雪纺衫","裤子","高跟鞋","袜子"]
            },
            yAxis: {},
            series: [{
                name: '销量',
                type: 'bar',
                data: data1[1].split(","),
                barGap: 0,
                itemStyle: {
                    normal: {
                        color: function() {
                            return '#ff960d';
                        },
                        label: {
                            show: true,
                            position: 'top'
                        }
                    }
                }
            } , {
                name: '产量',
                type: 'bar',
                data: data2[1].split(","),
                barGap: 0,
                itemStyle: {
                    normal: {
                        color: function() {
                            return '#18c109';
                        },
                        label: {
                            show: true,
                            position: 'top'
                        }
                    }
                }
            }]
        };
        myChart.setOption(option);
        document.getElementById("picstr").innerHTML = myChart.getDataURL({});
    </script>
</body>

这是我的 Java 代码:

final WebClient webClient = new WebClient();

webClient.waitForBackgroundJavaScript(2000);
webClient.getOptions().setJavaScriptEnabled(true);
WebRequest request = new WebRequest(new URL("http://localhost:8888/lab/test.html?d1=5,20,36,10,10,20&d2=15,30,40,15,18,30"), HttpMethod.GET);
final HtmlPage page = webClient.getPage(request);
webClient.waitForBackgroundJavaScript(10000);

System.out.println(page.asXml());
webClient.close();

HtmlUnit 版本为 2.31。

Java 代码输出如下:

data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAlgAAAGQCAYAAAByNR6YAAADuUlEQVR42u3BMQEAAADCoPVPbQwfoAAAAAAAAAAAAAAA........AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOBnqGIAAZdYcO8AAAAASUVORK5CYII=

但是 HTML 显示:

data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAlgAAAGQCAYAAAByNR6YAAAgAElEQVR4Xu3dDZQkZX3v8f9TvTPsrjugARE9UY5ywxGMyHb1QPaS........AAAIIIIBALgL/H4qktlN102BEAAAAAElFTkSuQmCC

可能您的期望有点高:

  • 据我所知,ECharts 使用的是 html canvas 对象。 canvas 能够使用不同的后端(上下文),至少有一些内置(2d)和基于 WebGL。通常框架会检查 WebGL 的可用性,如果 WebGL 不可用则回退到 2d。
  • HtmlUnit 不支持 WebGL
  • 从 2.31 版开始,许多绘图函数只是没有功能的存根(例如整个路径的东西)。欢迎补丁。
  • 将 getDataURL() 视为某种快照工具。此调用生成 canvas 中显示的当前内容的基于像素的快照(包括灰度或渐变的转换和...)。如果您比较不同浏览器的输出,我认为这个像素图像可能已经不同了。
  • 据我所知,浏览器在生成图像时使用不同的颜色模型和颜色深度;浏览器结果可能已经不同的另一个原因。
  • 最后,HtmlUnit 不支持 canvas(后端)目前提供的所有奇特功能。这个想法是创建某种接近真实浏览器的视觉效果。 (如果你在这里遗漏了什么,请打开一个问题(包括一个简单的示例),我会尝试添加丢失的实现)

总而言之,我认为比较 getDataURL() 结果并不是测试图表的好(稳定)标准。