如何在加载到JavaFX Webengine中的网站上点击按钮

4

我对JavaFX还比较陌生。我已经成功地将网站加载到了我的JavaFX应用程序中。我想从我的Java应用程序中登录到该网站。

目前为止,我能够将我的登录值插入到适当的输入框中,但是我无法弄清楚如何单击提交按钮。有人可以帮帮我吗?

这是我目前的代码:

enter image description here

这是我的控制器类。

    public class Controller implements Initializable{


    @FXML
    protected TextField usernameLogin;
    @FXML
    protected TextField passwordLogin;
    @FXML
    protected Button loginButton;
    @FXML
    protected WebView webviewBrowser;
    @Override
    public void initialize(URL location, ResourceBundle resources) {

        final WebEngine engine = webviewBrowser.getEngine();
        engine.load("http://gmail.com");
        engine.setJavaScriptEnabled(true);

        loginButton.setOnAction(new EventHandler<ActionEvent>() {
            @Override
            public void handle(ActionEvent event) {


                String username = usernameLogin.getText().toString();
                String password = passwordLogin.getText().toString();

                engine.getDocument().getElementById("Email").setAttribute("Value", username);
                engine.getDocument().getElementById("Passwd").setAttribute("Value", password);

                //engine.getDocument().getElementById("submit"). ??submit code??

            }
        });


    }
}

有人可以帮我吗?我应该怎么提交?谢谢。

1个回答

3
我发现了一个使用JavaFX的WebView组件处理html表单的示例链接:https://community.oracle.com/thread/2510161?start=0&tstart=0
下面的示例将获取对表单的引用并提交它。
由于jfxwebkit.dll的错误,我无法使gmail在WebView组件中完全加载。
import java.util.concurrent.atomic.AtomicBoolean;

import javafx.application.Application;
import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.concurrent.Worker;
import javafx.scene.Scene;
import javafx.scene.layout.BorderPane;
import javafx.scene.web.WebEngine;
import javafx.scene.web.WebView;
import javafx.stage.Stage;
import org.w3c.dom.Element;
import org.w3c.dom.html.HTMLFormElement;

public class Main extends Application {
    @Override
    public void start( Stage stage ) throws Exception {
        stage.setTitle( "JavaFX WebView Example" );
        BorderPane borderPane = new BorderPane();
        WebView webviewBrowser = new WebView();
        borderPane.setCenter( webviewBrowser );
        final WebEngine engine = webviewBrowser.getEngine();
        engine.load( "http://gmail.com" );
        engine.setJavaScriptEnabled( true );
        final String username = "324jlk23j4l2klj34l2kj34l2jk34l2kj3lkjlajksdflkj@gmail.com";
        final String password = "password";
        final AtomicBoolean submitted = new AtomicBoolean();
        engine.getLoadWorker().stateProperty().addListener(
                new ChangeListener<Worker.State>() {
                    @Override
                    public void changed( ObservableValue<? extends Worker.State> ov,
                                         Worker.State oldState, Worker.State newState ) {
                        if ( newState == Worker.State.SUCCEEDED ) {
                            Element emailField = engine.getDocument().getElementById( "Email" );
                            if ( emailField != null ) {
                                emailField.setAttribute( "Value", username );
                            }
                            Element passwordField = engine.getDocument().getElementById( "Passwd" );
                            if ( emailField != null ) {
                                passwordField.setAttribute( "Value", password );
                            }
                            HTMLFormElement gaia_loginform = ( HTMLFormElement ) engine.getDocument().getElementById( "gaia_loginform" );
                            if ( gaia_loginform != null ) {
                                if ( !submitted.get() ) {
                                    submitted.set( true );
                                    gaia_loginform.submit();
                                }
                            }
                        }
                    }
                }
        );
        stage.setScene( new Scene( borderPane, 800, 600 ) );
        stage.show();
    }
}

1
感谢您的努力,Tunabot。 - Ronny K
你是否曾经遇到过网页“刷新”或多次加载的情况?我也几乎一样,提交后一秒钟,代码就开始重新启动,进入计划、运行、成功等状态。 - vault
好的,我发现设置一个元素或提交表单会生成“change”事件。 - vault

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接