javascript - 通过 JavaFX 中的 WebEngine 使用 JS 脚本将值插入密码字段

标签 javascript java javafx webengine

我的目标是通过 JavaFX 中的 WebEngine 自动登录 Google Calendar 并在 WebView 中显示它。但我似乎无法将字符串值插入密码字段,即使它与用户名字段完美配合。

我尝试使用 Element e = webEngine.getDocument().getElementById(password) 在 Java 中创建脚本,并使用 e.setAttribute("value","mypassword") 插入值,但这也不起作用。它不提供堆栈跟踪,这意味着该元素存在,但我无法以某种方式插入该值。

    System.setProperty("sun.net.http.allowRestrictedHeaders", "true");
    WebEngine webEngine = webView.getEngine();
    webEngine.load("https://calendar.google.com");
    webEngine.getLoadWorker().stateProperty().addListener(
         new ChangeListener<State>() {
               @Override
               public void changed(ObservableValue ov, State oldState, State newState) {
               if (newState == State.SUCCEEDED) {
                      webEngine.executeScript(
                            "function login(user){"
                          + " var usernameField = document.getElementById(\"identifierId\");"
                          + " usernameField.value = user;"
                          + " var sButton = document.getElementById(\"identifierNext\");"
                          + " sButton.click();"
                          + "}"
                          + "login('myusername');"
                       );
                }
        }
    });
    Thread t = new Thread(() -> {
            try {
                Thread.sleep(5000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            Platform.runLater( () -> {
                webEngine.executeScript(
                    "function login(pass){"
                            + " var passwordField = document.getElementById(\"password\");"
                            + " passwordField.value = pass;"
                            + " var sButton = document.getElementById(\"passwordNext\");"
                            + " sButton.click();"
                            + "}"
                            + "login('mypassword');"
             );
         });
    });
    t.start();

结果应该是,监听器等待页面加载,然后填写用户名并单击下一步。然后线程开始,但等待 5 秒以确保单击了“下一步”,然后它应该填写密码凭据,但没有。

最佳答案

使用 "document.querySelector(\"#password > div.aCsJod.oJeWuf > div > div.Xb9hP > input\");" 而不是 document.getElementById(\"password\"); 查找密码字段。

关于javascript - 通过 JavaFX 中的 WebEngine 使用 JS 脚本将值插入密码字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57164044/

相关文章:

Java 小程序使用 Sigar API 读取系统参数抛出 "AccessControlException: access denied"

java - 从输入流在 JavaFx 中播放 mp3 文件

java - OnWindowFocusChanged 与 OnCreate 用于分配对象属性

java - "final int i"如何在 Java for 循环中工作?

JavaFX 应用程序无法在 IntelliJ Idea 下运行

JavaFX 启动内部应用程序类

javascript - 关闭 iframe 周围的灯

javascript - click.function 和 Bootstrap 的轮播按钮之间的冲突

javascript - 使用来自 json 响应的动态布局 : angularJS

javascript - 当元素垂直居中时滚动添加内联 CSS