1

2 つのテキストフィールドを自動的に入力し、ボタンクリックをシミュレートして、Web サイトに自動的にログインしたいと考えています。JavaFX WebView とその関数 .executeScript() を使用しています

これは私がこれまでに得たものです:(この質問に対する Sergey Grinevs の回答を参照: JavaFX プログラムから WebView の Javascript 関数を実行する)

        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 は無限ループで実行されます。さらに、リスナーが存在する理由もわかりません。それがうまくいったので、私は自分のスクリプトをセルゲイ・グリネフのスクリプトにコピーしたと言う必要があります。それ以外の場合は、単に executeScript を呼び出すだけでスローされjava.lang.reflect.InvocationTargetExceptionます。

永久ループなしでスクリプトを実行するにはどうすればよいですか? また、リスナーがないと機能しないのはなぜですか?

読んでくれてありがとう

4

1 に答える 1

1

あなたの質問を理解できれば、質問の 2 番目の部分である「リスナーがないと機能しないのはなぜですか」に対する答えは、ページが読み込まれたことをリスナーが通知するということです。次に、ロードが成功したときに、指定したコードを実行します ( newState == State.SUCCEEDED)。そのため、WebEngine がページをロードしたことを報告するとすぐにコードを実行するためのリスナーがあります。リスナーがなければ、ページが読み込まれた後のボタンのクリックなど、他のイベントに基づいてコードを実行するタイミングを選択する必要があります。

于 2016-08-09T15:47:36.977 に答える