JavaFX监视/记录在网页上执行的事件

伦吉斯:

我需要记录在网页上执行的事件。

例如。填写注册表。

记录器应捕获在页面上执行的关键字条目和点击,并在请求时播放。同时,记录器还应捕获生成事件的实际元素。说,当我键入

<input type="text" id="f_name"/>

记录器应该能够捕获ID'f_name'

我想知道是否可以使用JavaFX!?。JavaFX允许我加载页面,并且可以通过注册适当的事件侦听器来检测页面上执行的各种操作。但这并没有给我任何有关页面中哪个元素创建了该事件的有用信息。

   package test1;

import javafx.application.Application;
import javafx.concurrent.Worker;
import javafx.scene.Scene;
import javafx.scene.control.ButtonType;
import javafx.scene.control.Dialog;
import javafx.scene.layout.VBox;
import javafx.scene.web.WebEngine;
import javafx.scene.web.WebView;
import javafx.stage.Stage;
import netscape.javascript.JSObject;

public class JSTEst2 extends Application{

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

    @Override
    public void start(Stage primaryStage) throws Exception {
        WebView webView = new WebView();
        WebEngine engine = webView.getEngine();

        engine.getLoadWorker().stateProperty().addListener((obs, oldState, newState) -> {
            if (newState == Worker.State.SUCCEEDED) {
                //if the page is loaded

                JSObject window = (JSObject) engine.executeScript("window");
                window.setMember("app", this);
                //System.out.println(engine.executeScript("document.querySelector('body').innerHTML"));
                //engine.executeScript("document.querySelector('body').addEventListener('click', function(event) { alert(event.target.id); app.getCallBack(event.target.id);}, false);");
                engine.executeScript("document.addEventListener('click', function(event) { alert(event.target.id); app.getCallBack(event.target.id);}, false);");
            }
        });



        /*engine.loadContent(
                "<html><body>"
                + " <ul class=\"ct\">"
                + "<li id=\"first\">first</li>"
                + "<li id=\"second\">second</li>"
                + " <li id=\"third\">third</li>"
                + "</ul>"
                + "<input type=\"button\" value=\"Add <li>\" />"
                + "</body>"
                + "</html>"
        );*/

        engine.load("<my_url>");


        //String javascript = "document.querySelector('body').addEventListener('click', function(event) {  if (event.target.tagName.toLowerCase() === 'li') { console.log(event.target.id);   alert(event.target.id); }});";


        engine.setOnAlert(event -> showAlert(event.getData()));
        engine.setConfirmHandler(message -> showConfirm(message));



        //engine.executeScript(javascript);


        VBox root = new VBox();

        root.getChildren().add(webView);

        root.setStyle("-fx-padding: 10;" +

                "-fx-border-style: solid inside;" +

                "-fx-border-width: 2;" +

                "-fx-border-insets: 5;" +

                "-fx-border-radius: 5;" +

                "-fx-border-color: blue;");

        Scene scene = new Scene(root);

        primaryStage.setScene(scene);

        primaryStage.show();

    }


      private void showAlert(String message) {
            Dialog<Void> alert = new Dialog<>();
            alert.getDialogPane().setContentText(message);
            alert.getDialogPane().getButtonTypes().add(ButtonType.OK);
            alert.showAndWait();
        }

        private boolean showConfirm(String message) {
            Dialog<ButtonType> confirm = new Dialog<>();
            confirm.getDialogPane().setContentText(message);
            confirm.getDialogPane().getButtonTypes().addAll(ButtonType.YES, ButtonType.NO);
            boolean result = confirm.showAndWait().filter(ButtonType.YES::equals).isPresent();

            // for debugging:
            System.out.println(result);

            return result ;
        }

private void getCallBack(String data) {
    System.out.println("---->" + data);
}



}

当我点击“名字”输入字段时, 在此处输入图片说明

侦听器中的sys输出了类似这样的内容,

WebView@90e64cf[styleClass=web-view]
javafx.scene.Scene@52fca713

我很难解释。

JavaFX是这种情况吗?如果是,我如何使用JavaFX获得所需的信息?

################# UPDATE ##################

我已经更新了代码以使用executeScript()方法。现在,它在警报框中显示目标元素ID,但是我需要将其传达回我的Java应用程序。我的代码中的逻辑不起作用。有什么想法吗!!?

Maciej Pulikowski:

要从网站获取有关事件的信息,可以将Javascript中的方法调用WebEngine中

WebView webView = new WebView();
WebEngine engine = webView.getEngine();

Engine.executeScript("document.cookie");

JavascriptJava之间进行双向通信您必须设置window的成员并创建方法以在Javascript中调用它完整的工作脚本:

import javafx.application.Application;
import javafx.concurrent.Worker;
import javafx.scene.Scene;
import javafx.scene.control.ButtonType;
import javafx.scene.control.Dialog;
import javafx.scene.layout.VBox;
import javafx.scene.web.WebEngine;
import javafx.scene.web.WebView;
import javafx.stage.Stage;
import netscape.javascript.JSObject;

public class JSTEst2 extends Application{

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

    @Override
    public void start(Stage primaryStage) throws Exception {
        WebView webView = new WebView();
        WebEngine engine = webView.getEngine();

        engine.getLoadWorker().stateProperty().addListener((obs, oldState, newState) -> {
            if (newState == Worker.State.SUCCEEDED) {
                //if the page is loaded

                JSObject window = (JSObject) engine.executeScript("window");
                window.setMember("app", this);
                engine.executeScript("document.addEventListener('click', function(event) { alert(event.target.id); app.getCallBack(event.target.id);}, false);");
            }
        });

        engine.load("<my_url>");
        engine.setOnAlert(event -> showAlert(event.getData()));
        engine.setConfirmHandler(message -> showConfirm(message));

        VBox root = new VBox();

        root.getChildren().add(webView);

        root.setStyle("-fx-padding: 10;" +

                "-fx-border-style: solid inside;" +

                "-fx-border-width: 2;" +

                "-fx-border-insets: 5;" +

                "-fx-border-radius: 5;" +

                "-fx-border-color: blue;");

        Scene scene = new Scene(root);

        primaryStage.setScene(scene);

        primaryStage.show();

    }


        private void showAlert(String message) {
            Dialog<Void> alert = new Dialog<>();
            alert.getDialogPane().setContentText(message);
            alert.getDialogPane().getButtonTypes().add(ButtonType.OK);
            alert.showAndWait();
        }

        private boolean showConfirm(String message) {
            Dialog<ButtonType> confirm = new Dialog<>();
            confirm.getDialogPane().setContentText(message);
            confirm.getDialogPane().getButtonTypes().addAll(ButtonType.YES, ButtonType.NO);
            boolean result = confirm.showAndWait().filter(ButtonType.YES::equals).isPresent();

            // for debugging:
            System.out.println(result);

            return result ;
        }

        public void getCallBack(String data) {
            System.out.println("---->" + data);
        }

    }

}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章