使用javafx从webview获取内容

ade*_*ngh 21 java javafx webview javafx-2

我正在使用JAVA FX控件处理swing应用程序.在我的应用程序中,我必须打印出webview中显示的html页面.我正在尝试的是在HtmlDocuement的帮助下在一个字符串中加载webview的html内容.

要从Web视图加载html文件的内容,我使用以下代码,但它无法正常工作:

try
{
    String str=webview1.getEngine().getDocment().Body().outerHtml();
}
catch(Exception ex)
{
}
Run Code Online (Sandbox Code Playgroud)

iTa*_*ake 41

String html = (String) webEngine.executeScript("document.documentElement.outerHTML");
Run Code Online (Sandbox Code Playgroud)

  • 如果不是在工人中,这一个班轮不会工作.将返回空的html.它也不适用于像google.com这样的网站.不会返回实时DOM,只返回底层的html/javascript. (3认同)

Ser*_*nev 21

WebEngine.getDocument返回org.w3c.dom.Document,而不是您期望通过代码判断的JavaScript文档.

不幸的是,打印输出org.w3c.dom.Document需要相当多的编码.您可以尝试从最简单的方法将org.w3c.dom.Document打印到stdout的解决方案,请参阅下面的代码.

请注意,您需要等到文档加载后才能使用Document.这就是为什么LoadWorker在这里使用:

public void start(Stage primaryStage) {
    WebView webview = new WebView();
    final WebEngine webengine = webview.getEngine();
    webengine.getLoadWorker().stateProperty().addListener(
            new ChangeListener<State>() {
                public void changed(ObservableValue ov, State oldState, State newState) {
                    if (newState == Worker.State.SUCCEEDED) {
                        Document doc = webengine.getDocument();
                        try {
                            Transformer transformer = TransformerFactory.newInstance().newTransformer();
                            transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "no");
                            transformer.setOutputProperty(OutputKeys.METHOD, "xml");
                            transformer.setOutputProperty(OutputKeys.INDENT, "yes");
                            transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
                            transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "4");

                            transformer.transform(new DOMSource(doc),
                                    new StreamResult(new OutputStreamWriter(System.out, "UTF-8")));
                        } catch (Exception ex) {
                            ex.printStackTrace();
                        }
                    }
                }
            });
    webengine.load("http://stackoverflow.com");
    primaryStage.setScene(new Scene(webview, 800, 800));
    primaryStage.show();
}
Run Code Online (Sandbox Code Playgroud)