2016-08-02 9 views
0

自動的に2つのテキストフィールドを入力し、自動的にWebサイトにログインするためのボタンクリックをシミュレートします。 は私がのJavaFXのWebViewとその機能.executeScriptを使用しています()WebEngine.executeScript()を使用してJavaFXでJavascriptを実行

これは私がこれまで持っているものである:(この質問にセルゲイ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はで無限ループで実行されます。私はさらに、なぜリスナーがあるのか​​知らない。 Sergey Grinevのスクリプトに私のスクリプトをコピーしたのは、それが私のために働いて以来のことです。 それ以外の場合は、executeScriptを呼び出すだけで、java.lang.reflect.InvocationTargetException以上のものが送出されます。

恒久ループなしでスクリプトを実行するにはどうすればよいですか?リスナーなしでスクリプトが実行されないのはなぜですか?私はあなたの質問を理解していれば、問題の第二部への答えは、「なぜそれがリスナーなしで動作しない」読書や種類について

答えて

0

ため

おかげで、リスナーはページことを通知していることですロードされました。次に、ロードが成功したときに指定したコードを実行します(newState == State.SUCCEEDED)。 WebEngineがというページをロードしたと報告するとすぐにコードを実行するために、リスナーがの順番で並んでいます。リスナーがなければ、ロードされたページの後にボタンをクリックするなど、他のイベントに基づいてコードを実行するタイミングを選択する必要があります。

関連する問題