【问题标题】:Fill fields WebView in Java automatically自动填充Java中的WebView字段
【发布时间】:2013-10-03 00:28:10
【问题描述】:

所以这是我的问题。我正在使用 JavaFX 中的 WebView 类。我想做的事情是我希望在 webview 中加载的字段自动填充存储在数组中的信息。可能吗? 提前致谢

【问题讨论】:

  • 我会说这可能不是不可能的。查看 WebEngine 文档。您需要更新文档元素...
  • 能否举个简单的例子,谢谢
  • 我实际上并不熟悉 FX,但如果您阅读过 WebEngine,您会看到一个示例,他们访问 DOC 以添加事件触发器,这可能会给出一个弄清楚如何设置字段文本的入口点...
  • 感谢 MadProgrammer,再问一个问题。也许可以运行 javascript 来填充字段?这似乎是一种更简单的方法。
  • 不能说,WebEngine 似乎确实提供了对 javascript 引擎的某种访问权限,但您必须阅读它...

标签: java swing webview javafx field


【解决方案1】:

这是一个用于 WebView 的自动表单填写示例 JavaFX 应用程序。

值(登录凭据)被输入到屏幕黄色部分的 JavaFX 字段中,然后在登录页面出现时(使用 w3c dom api)自动发布到 WebView(屏幕的白色部分)中。

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 api。有一个使用jQuery on any arbitrary webpage hosted in a WebView 的示例。所以你可以结合这个自动化的 WebView 表单帖子和 jQuery 托管的 WebView 示例的想法来创建一个使用 JQuery 来执行帖子的版本。

【讨论】:

    【解决方案2】:

    我使用 JavaFX webView Javascript 引擎解决了这个问题。 如果有人感兴趣,这里的代码 sn-p。

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

    【讨论】:

      猜你喜欢
      • 2011-12-19
      • 1970-01-01
      • 2020-11-11
      • 1970-01-01
      • 2016-03-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多