Fill in the WebView fields in Java automatically

So here is my problem. I am using the WebView class from JavaFX in swing. The fact is that I want the fields loaded in webview to be automatically filled with information stored in the array. Is it possible? thanks in advance

+6
source share
2 answers

I fixed this using JavaFX webView Javascript. If someone is interested in a code snippet.

String setLastName = "document.getElementsByName('lastName')[0].value='" + lastName + "';"; String setName = "document.getElementsByName('firstName')[0].value='" + name + "'"; String setDateBirth = "document.getElementsByName('birthdate')[0].value='" + datebirth + "';"; String setPhone = "document.getElementsByName('phone')[0].value='" + phone + "';"; String setEmail = "document.getElementsByName('email')[0].value='" + email + "';"; String setPassport = "document.getElementsByName('passport')[0].value='" + passport + "';"; Button button = new Button("Fill the form"); button.setOnAction(new EventHandler<ActionEvent>() { @Override public void handle(ActionEvent actionEvent) { webEngine.executeScript(setLastName); webEngine.executeScript(setName); webEngine.executeScript(setDateBirth); webEngine.executeScript(setPhone); webEngine.executeScript(setEmail); webEngine.executeScript(setPassport); } }); 
+4
source

Here is an example JavaFX application for filling out forms for a web application.

Values ​​(login credentials) are entered into the JavaFX fields in the yellow part of the screen, and then automatically published (using w3c dom api) in the WebView (white part of the screen) when the login page appears.

loginpost

 import javafx.application.Application; import javafx.beans.property.*; import javafx.beans.value.*; import javafx.event.*; import javafx.scene.Scene; import javafx.scene.control.*; import javafx.scene.layout.*; import javafx.scene.web.*; import javafx.stage.Stage; import org.w3c.dom.*; import org.w3c.dom.html.*; public class WebViewFormPost extends Application { public static void main(String[] args) { launch(args); } @Override public void start(Stage stage) { final TextField fxUsername = new TextField(); fxUsername.setPrefColumnCount(20); final TextField fxPassword = new PasswordField(); final BooleanProperty loginAttempted = new SimpleBooleanProperty(false); final WebView webView = new WebView(); webView.setPrefWidth(1000); final WebEngine engine = webView.getEngine(); engine.documentProperty().addListener(new ChangeListener<Document>() { @Override public void changed(ObservableValue<? extends Document> ov, Document oldDoc, Document doc) { if (doc != null && !loginAttempted.get()) { if (doc.getElementsByTagName("form").getLength() > 0) { HTMLFormElement form = (HTMLFormElement) doc.getElementsByTagName("form").item(0); if ("/oam/server/sso/auth_cred_submit".equals(form.getAttribute("action"))) { HTMLInputElement username = null; HTMLInputElement password = null; NodeList nodes = form.getElementsByTagName("input"); for (int i = 0; i < nodes.getLength(); i++) { HTMLInputElement input = (HTMLInputElement) nodes.item(i); switch (input.getName()) { case "ssousername": username = input; break; case "password": password = input; break; } } if (username != null && password != null) { loginAttempted.set(true); username.setValue(fxUsername.getText()); password.setValue(fxPassword.getText()); form.submit(); } } } } } }); engine.getLoadWorker().exceptionProperty().addListener(new ChangeListener<Throwable>() { @Override public void changed(ObservableValue<? extends Throwable> ov, Throwable oldException, Throwable exception) { System.out.println("Load Exception: " + exception); } }); GridPane inputGrid = new GridPane(); inputGrid.setHgap(10); inputGrid.setVgap(10); inputGrid.addRow(0, new Label("Username: "), fxUsername); inputGrid.addRow(0, new Label("Password: "), fxPassword); Button fxLoginButton = new Button("Login to Oracle Forums"); fxLoginButton.setOnAction(new EventHandler<ActionEvent>() { @Override public void handle(ActionEvent t) { if (notEmpty(fxPassword.getText()) && notEmpty(fxPassword.getText())) { loginAttempted.set(false); engine.load("https://forums.oracle.com/community/developer/english/java/javafx/login.jspa"); } } }); fxLoginButton.setDefaultButton(true); ProgressIndicator fxLoadProgress = new ProgressIndicator(0); fxLoadProgress.progressProperty().bind(webView.getEngine().getLoadWorker().progressProperty()); fxLoadProgress.visibleProperty().bind(webView.getEngine().getLoadWorker().runningProperty()); HBox loginPane = new HBox(10); loginPane.getChildren().setAll( fxLoginButton, fxLoadProgress ); final VBox layout = new VBox(10); layout.setStyle("-fx-background-color: cornsilk; -fx-padding: 10;"); layout.getChildren().addAll( new Label("Enter your Oracle Web Account credentials"), inputGrid, loginPane, webView ); VBox.setVgrow(webView, Priority.ALWAYS); stage.setScene(new Scene(layout)); stage.show(); fxUsername.requestFocus(); } private boolean notEmpty(String s) { return s != null && !"".equals(s); } } 

The above application is adapted from the previous Oracle forum question on Submitting HTML forms using the JavaFX Web application .

If you do not have an Oracle network technology account to test the above program, you can register here: https://myprofile.oracle.com/EndUser/faces/profile/createUser.jspx .

Posting to WebView using jQuery

An alternative implementation that I would prefer to use is jQuery JavaScript to examine the DOM and execute the post rather than use the Java DOM apis. There is a pattern for using jQuery on any arbitrary web page hosted in a WebView . That way, you could combine ideas with this automatic post of a WebView form and a sample WebView hosted in jQuery to create a version that uses jQuery to complete this post.

+6
source

Source: https://habr.com/ru/post/954720/


All Articles