1

我想自动填充两个文本字段并模拟按钮单击以自动登录网站。我正在使用 JavaFX WebView 及其函数 .executeScript()

这就是我到目前为止所得到的:(参考 Sergey Grinevs 对这个问题的回答:Execute a Javascript function for a WebView from a JavaFX program

        webEngine.load("websiteexample.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,pass){"
                                + " var usernameField = document.getElementById(\"username\");"
                                + " var passwordField = document.getElementById(\"password\");"
                                + " usernameField.value = user;"
                                + " passwordField.value = pass;"
                                + " var sButton = document.getElementById(\"submit\");"
                                + " sButton.click();"
                                + "}"
                                + "login('abc','123');");

                    }
                }
            });

到目前为止,这可行,但 Javascript 将在无限循环中执行。我也不知道为什么会有一个 Listener。需要说的是,我已经将我的脚本复制到了 Sergey Grinev 的脚本中,因为这对我有用。否则,通过简单地调用 executeScript,它会抛出java.lang.reflect.InvocationTargetException等等。

如何在没有永久循环的情况下执行我的脚本,为什么没有侦听器它就无法工作?

感谢您的阅读和亲切的问候

4

1 回答 1

1

如果我理解您的问题,那么问题的第二部分“为什么没有侦听器就无法工作”的答案是侦听器通知您页面已加载。然后,它会在加载成功时执行您指定的代码 ( newState == State.SUCCEEDED)。因此,有一个侦听器可以在 WebEngine 报告它已加载页面时立即运行您的代码。如果没有侦听器,您将不得不根据其他事件选择何时运行代码,例如页面加载后的按钮单击。

于 2016-08-09T15:47:36.977 回答