2016-08-02 17 views
0

Ich möchte zwei Textfelder automatisch ausfüllen und einen Buttonklick simulieren, um mich automatisch auf einer Website einzuloggen. Ich bin mit der JavaFX WebView und seine Funktion .executeScript()Javascript in JavaFX mit WebEngine.executeScript() ausführen

Das ist, was ich bisher habe: (auf Antwort Sergey Grinevs auf diese Frage verweis: 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');"); 

        } 
       } 
      }); 

Bisher Dies funktioniert aber das Javascript wird in einer Endlosschleife ausgeführt werden. Ich weiß außerdem nicht, warum es einen Zuhörer gibt. Ich muss sagen, dass ich mein Skript in das Skript von Sergey Grinev kopiert habe, da das für mich funktioniert hat. Andernfalls wird durch einfaches Aufrufen von executeScript java.lang.reflect.InvocationTargetException und viele mehr geworfen.

Wie kann ich mein Skript ohne eine permanente Schleife ausführen und warum funktioniert es nicht ohne den Zuhörer?

Danke fürs Lesen und freundlichen Grüßen

Antwort

0

Wenn ich Ihre Frage, die Antwort auf den zweiten Teil der Frage zu verstehen, „warum es ohne den Hörer nicht funktionieren“, ist, dass der Zuhörer, dass die Seite benachrichtigt hat geladen. Dann führt es den Code aus, den Sie angeben, wenn der Ladevorgang erfolgreich ist (newState == State.SUCCEEDED). So gibt es einen Listener in der Reihenfolge , um Ihren Code auszuführen, sobald die WebEngine meldet, dass sie die Seite geladen hat. Ohne den Listener müssten Sie wählen, wann der Code aufgrund eines anderen Ereignisses ausgeführt werden soll, z. B. nach dem Laden der Seite durch einen Klick auf die Schaltfläche.