有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java 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);
}



}

当我点击“名字”输入框时, enter image description here

监听器中的sys out打印了这样的内容

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

我几乎无法解释

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

(强)刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮刮支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支

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


共 (1) 个答案

  1. # 1 楼答案

    要从网站获取有关事件的信息,您可以调用JavascriptWebEngine的方法:

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

    JavascriptJava之间进行双向通信。您必须为窗口设置成员并创建方法,以便在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);
            }
    
        }
    
    }