2016-11-01 5 views
3

Gibt es eine Möglichkeit für mich, das SVG-Element von einer HTML-Seite gerendert und von JavaScript in Java gerendert, zum Beispiel: http://bl.ocks.org/mbostock/raw/4063269/, die im Fall verwendet d3 ist .js.Abrufen einer SVG dynamisch auf einer Webseite von Java gerendert

+0

einfach hinzufügen, ich habe versucht, HtmlUnit, jsoup und sogar in SWT untersucht, aber ohne Erfolg. Deshalb ist die Frage ziemlich weit gefasst, da ich die Lösung nicht auf ein Werkzeug beschränken möchte. –

+0

Mögliches Duplikat von http://stackoverflow.com/questions/26027313/how-to-load-and-parse-svg-documents? –

+0

@definecindyconst Dies ist nicht das Duplikat von [http://stackoverflow.com/questions/26027313/how-to-load-and-parse-svg-documents], das Parsen von SVG ist einfach. –

Antwort

1

Wenn Sie versuchen, den SVG-Inhalt als String zu bekommen, ist Selenium Ihre beste Wahl, wie @chimmi sagte. Sie könnten jedoch ohne ein echtes Browserfenster davonkommen, indem Sie stattdessen PhantomJS verwenden.

In der Theorie sollte es so funktionieren:

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"); 

Von hier aus Sie Batik verwenden können, wenn Sie tatsächlich die SVG auf dem Bildschirm in der Nicht-Web-App wollen machen.

Oder, wenn alles, was Sie war zu machen Aussagen über den SVG Inhalte zu Testzwecken wollte, erinnern Sie sich Unterelemente mit normalen CSS oder XPath-Selektoren wählen:

//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 
2

Wenn ich Sie richtig verstanden habe, besteht Ihr Problem darin, dass von Ihnen verwendete Werkzeuge (HtmlUnit) nicht mit komplexen JS (d3.js) umgehen können.

In diesem Fall gibt es nichts besseres als einen tatsächlichen Browser zu verwenden. Sie können Selenium verwenden, um Ihre Seite mit einer ferngesteuerten Browser-Instanz zu öffnen und JS HTML von dort zu erhalten.

This tutorial enthält so ziemlich alles, was Sie brauchen. Außer der bekommen html Teil, können Sie es in this SO Antwort finden.

Danach können Sie die HTML zu jedem gewünschten Parser füttern.

EDIT

dachte nur an eine andere Art und Weise, können Sie WebKit Html2Pdf versuchen. Sein Zweck ist das Erstellen von PDF-Dateien, aber es verwendet WebKit unter der Haube und Sie können benutzerdefinierte Skript (wie document.onload Rückruf) injizieren, die SVG-Inhalte zu Ihrem Dienst nach dem Laden der Seite posten wird.

Aber ich würde diese Straße nicht gehen, es hat viele Einschränkungen (im Grunde funktioniert nur für direkte URLs) und insgesamt ist ziemlich durcheinander.

+0

Sie haben die Frage richtig verstanden, htmlunit selbst hat keine JavaScript-Engine. Allerdings hätte ich gerne einen "reinen" Java-Weg, frage mich, ob Rhino oder Nashborn damit umgehen können. –

+0

In diesem Fall sollten Sie Ihren tatsächlichen Fall präsentieren, denn es gibt eine ganze Reihe von Möglichkeiten, und meines Wissens ist keiner von ihnen ideal, also kann Ihnen niemand mit Sicherheit sagen, dass sie für Sie arbeiten werden. – chimmi

Verwandte Themen