解决方法
这是一个用于WebView的自动表单填充示例JavaFX应用程序.
将值(登录凭据)输入到屏幕黄色部分的JavaFX字段中,然后在登录页面出现时自动在WebView(屏幕的白色部分)中发布(使用w3c dom api).
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); } }
上述应用程序改编自Submitting HTML Forms with JavaFX Webview以前的Oracle论坛问题.
如果您没有Oracle技术网络帐户来测试上述程序,可以在此处注册一个:https://myprofile.oracle.com/EndUser/faces/profile/createUser.jspx.
使用JQuery发布到WebView
另一种实现,我实际上更喜欢使用JavaScript jQuery来内省DOM并执行帖子而不是使用Java DOM apis.有一个使用jQuery on any arbitrary webpage hosted in a WebView的示例.因此,您可以将来自此自动WebView表单帖子和jQuery托管的WebView示例的想法组合在一起,以创建使用JQuery执行帖子的版本.