从Java中检索在Web页面上动态呈现的SVG

时间:2016-11-01 22:48:14

标签: java html svg

有没有办法让我从Java中用javascript呈现的html页面渲染和解析SVG元素, 例如:http://bl.ocks.org/mbostock/raw/4063269/,在这种情况下使用d3.js。

2 个答案:

答案 0 :(得分:2)

如果我理解你的问题是正确的,你的问题是你使用的工具(HtmlUnit)无法处理复杂的JS(d3.js)。

在这种情况下,没有比使用实际浏览器更好的了。您可以使用Selenium使用远程控制的浏览器实例打开页面,并从那里获取JS渲染的html。

This tutorial包含了您所需要的一切。除了获取html 部分,您可以在this SO答案中找到它。

之后,您可以将html提供给您想要的任何解析器。

修改

想到另一种方法,你可以试试WebKit Html2Pdf。它的目的是创建PDF文件,但它使用了WebKit,你可以注入自定义脚本(如document.onload回调),它将在页面加载后将SVG内容发布给你服务。

但是我不会走那条路,它有很多限制(基本上只适用于直接网址)而且总体上很混乱。

答案 1 :(得分:1)

如果您尝试做的是将SVG内容作为String获取,Selenium是您的最佳选择,就像@chimmi所说。但是,使用PhantomJS而不是打开真正的浏览器窗口,你可能会离开。

理论上,它应该像这样工作:

System.setProperty("phantomjs.binary.path", "/path/to/phantomjs");
WebDriver driver = new PhantomJSDriver();
// Open your page with SVG
driver.get("http://localhost:8080/svgpage");

// Find the SVG
WebElement svg = driver.findElement(By.tageName("svg"));
// Get its XML content
String xml = svg.getAttribute("outerHTML");

如果您想在非网络应用中在屏幕上实际渲染SVG,可以使用Batik

或者,如果您只想对SVG内容进行断言以进行测试,请记住您可以使用普通的CSS或XPath选择器选择子元素:

//Select all <path> elements within the SVG
Lis<WebElement> pathElementsInSVG = svg.findElements(By.tagName("path"));
//Assert there is 4 <path>s 
assert pathElementsInSVG.size() == 4