gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 10:18:14 29 4
gpt4 key购买 nike

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

例如。填写登记表。

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

<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

listener 中的 sys out 打印了这样的东西,

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

我很难理解。

在这种情况下,JavaFX 是正确的方法吗?如果是,我如何使用 JavaFX 获取所需的信息?

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

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

最佳答案

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

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

}

}

关于JavaFX 监视/记录在网页上执行的事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49423543/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com