代码之家  ›  专栏  ›  技术社区  ›  Renjith

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

  •  2
  • Renjith  · 技术社区  · 6 年前

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

    例如填写登记表。

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

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

    记录器应能够捕获id“f\u 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);
    }
    
    
    
    }
    

    当我点击“firstname”输入字段时, enter image description here

    监听器中的sys out打印了如下内容,

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

    我几乎无法解释。

    JavaFX是正确的方法吗?是这样吗? 如果是,如何使用JavaFX获取所需信息?

    ##################更新##################

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

    1 回复  |  直到 6 年前
        1
  •  1
  •   Maciej Pulikowski    6 年前

    要从网站获取有关事件的信息,可以调用 Javascript 到您的 Web引擎 :

    WebView webView = new WebView();
    WebEngine engine = webView.getEngine();
    
    Engine.executeScript("document.cookie");
    

    之间进行双向通信 Javascript Java语言 。您必须为窗口设置成员并创建方法来调用它 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);
            }
    
        }
    
    }