【问题标题】:Website loaded into JavaFX Webengine网站加载到 JavaFX Webengine
【发布时间】:2016-10-19 13:58:49
【问题描述】:

我希望我的应用程序自动登录网站kolotibablo,但该网站不存在标签表单。我应该如何提交?谢谢。

    @Override
    public void initialize(URL url, ResourceBundle rb) {
        //
        WebEngine engine = browser.getEngine();
        engine.load("https://www.kolotibablo.com/panel/login#login");
        engine.setJavaScriptEnabled(true);

        engine.documentProperty().addListener(new ChangeListener<Document>() {
            @Override
            public void changed(ObservableValue<? extends Document> observable, Document oldValue, Document newValue) {
                engine.getDocument().getElementById("login").setAttribute("value", "User Name");
                engine.getDocument().getElementById("password").setAttribute("value", "Password");
            //Login
            }
        });

    }

【问题讨论】:

    标签: javafx login webview


    【解决方案1】:

    我通过使用下面的代码成功地做到了这一点。我没有使用您的 engine.documentPorperty() 监听器,所以我完全删除了该代码。

    this answer 的帮助下,我可以通过一些编辑来完成。

    engine.getLoadWorker().stateProperty().addListener((ov, oldState, newState) -> {
        if ( newState == Worker.State.SUCCEEDED ) {
            Element login = engine.getDocument().getElementById("login");
            if ( login != null ) {
                login.setAttribute( "Value", "User_Name" );
                System.out.println(login.getAttribute("Value"));
            }
            Element password = engine.getDocument().getElementById( "password" );
            if ( password != null ) {
                password.setAttribute( "Value", "Password" );
                System.out.println(password.getAttribute("Value"));
            }
            HTMLElementImpl loginButton = (HTMLElementImpl) engine.getDocument().getElementById( "login_button" );
    
            if ( loginButton != null ) {
                loginButton.addEventListener("click", event -> {
                    System.out.println("here " + event.getType());
                }, false);
                loginButton.click();
            }
        }
    });
    

    所以这会等到worker状态成功,然后抓取login元素,设置属性,抓取password元素,设置属性,抓取loginButton作为HTMLElementImpl,即允许我们模拟点击它。

    我保留在打印语句中,以便您可以看到正在发生的事情。

    希望这会有所帮助。

    编辑 1

    所以我重新审视了这个问题,我也想出了这个解决方案

    String username = "User_Name";
    String password = "Password";
    String enterUserName = "document.getElementById('login').value='" + username + "';";
    String enterPw = "document.getElementById('password').value='" + password + "';";;
    engine.getLoadWorker().stateProperty().addListener((ov, oldState, newState) -> {
        if ( newState == Worker.State.SUCCEEDED ) {
            engine.executeScript(enterUserName);
            engine.executeScript(enterPw);
        }
    });
    

    我唯一想不通的是如何点击login 按钮。我尝试的一切都失败了。所以,我很抱歉。但是,这里还有另一种方法。

    【讨论】:

    • 下载完成后网站只有密码才能设置属性 login.setAttribute("Value", "User_Name");
    • 它没有安装
    • login 必须使用不同的 attribute 然后。我要到明天才能看
    • @KiênĐịnh 已编辑。由于某种原因,登录按钮不会单击或提交,但现在将按预期输入用户名。
    【解决方案2】:

    请使用

    HTMLFormElement loginForm = ( HTMLFormElement ) webEngine.getDocument().getElementById("Login"); loginForm.submit(); 要登录,您必须提交表单,在上面的代码中“登录”是表单ID

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-06-12
      • 1970-01-01
      • 1970-01-01
      • 2012-11-23
      • 1970-01-01
      • 2015-11-23
      • 1970-01-01
      • 2017-09-19
      相关资源
      最近更新 更多