如何在Java Application中加载实时DOM?

时间:2015-09-24 12:19:38

标签: java dom selenium-webdriver xulrunner

我不确定如何提出这个问题,但这是我想要做的。我正在寻找能够在java应用程序中加载网站,并能够单击按钮,文本,框等,并获取底层DOM代码。

例如:
- 它加载google.com的网页以及它下面的LIVE DOM,不同的框架。它不能是HTML,因为谷歌是javascript。

- 我想点击谷歌搜索框或页面上的任何内容,应用程序将打印任何属性,例如name =“q”或q。

我已经研究过XULrunner,但它已被弃用于java。

2 个答案:

答案 0 :(得分:0)

您可以使用JavascriptExecutor。它由所有WebDrivers实现。有关详细信息,请参阅JavaDoc。使用document来引用DOM。

答案 1 :(得分:0)

您可以使用JavaFX WebView。 您可以从Javascript回调Java代码。因此,您可以编写少量Javascript来检测用户何时单击元素,并调用一些显示属性值的Java代码。请参阅"从Javascript"回调Java在WebEngine API docs

示例代码:

public class HTMLMouseOverTest extends Application {

    @Override
    public void start(Stage primaryStage) {
        final BorderPane root = new BorderPane();
        final WebView webView = new WebView();
        final WebEngine engine = webView.getEngine();
        final BooleanProperty mouseOver = new SimpleBooleanProperty();
        engine.getLoadWorker().stateProperty().addListener(new ChangeListener<State>() {

            @Override
            public void changed(ObservableValue<? extends State> observable,
                    State oldValue, State newValue) {
                if (newValue == State.SUCCEEDED) {
                    // Here's how to add the Javascript if you don't have
                    // direct access to the HTML:
//                    final Document doc = engine.getDocument();
//                    Element div = doc.getElementById("important-div");
//                    div.setAttribute("onmouseover", "mouseOverProperty.set(true)");
//                    div.setAttribute("onmouseout", "mouseOverProperty.set(false)");
                    final JSObject window = (JSObject) engine.executeScript("window");
                    window.setMember("mouseOverProperty", mouseOver);                    
                }
            }
        });
        engine.loadContent("<html><body style='font-family:sans-serif';><h2>Hello World</h2>"+
            "<div id='important-div' onmouseover='mouseOverProperty.set(true)'"+
                "onmouseout='mouseOverProperty.set(false)' style='background: #ffd; padding:40px;'>"+ 
            "Move mouse here</div>"+
            "<h3>Thanks and good night</h3></body></html>");

        root.setCenter(webView);
        final Label label = new Label();
        label.textProperty().bind(Bindings.when(mouseOver).then("Mouse in position").otherwise("Mouse out of area"));
        root.setBottom(label);
        final Scene scene = new Scene(root, 400, 250);
        primaryStage.setScene(scene);
        primaryStage.show();
    }

    public static void main(String[] args) {
        launch(args);
    }