记录器应该能够捕获id 'f_name‘我想知道我能不能用JavaFX!?JavaFX允许我加载一个页面,我可以通过注册适当的事件侦听器来检测在页面上">
我需要记录在网页上执行的事件。
例如:填写登记表。
记录器应该捕获关键字条目和在页面上执行的单击,并在请求时播放。同时,记录器还应该捕获生成事件的实际元素。例如,当我输入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);
}
}
当我点击“名字”输入字段时,
听众中的系统打印出这样的东西,
WebView@90e64cf[styleClass=web-view]
javafx.scene.Scene@52fca713
我几乎无法理解。
JavaFX --他的方法正确吗--这是个案例吗?如果是,如何使用JavaFX获取所需的信息?
##################UPDATE##################
我已经更新了代码以使用executeScript()方法。现在,它在警报框中显示目标元素id,但我需要将它与我的java应用程序进行通信。我在代码中的逻辑不起作用。有什么想法吗!?
发布于 2018-03-22 06:29:05
要从网站获取有关事件的信息,您可以从Javascript调用方法到WebEngine。
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);
}
}
}
https://stackoverflow.com/questions/49423543
复制