JavaFXWebEngine按顺序执行Javascript以在网站上执行操作

JavaFXWebEngine按顺序执行Javascript以在网站上执行操作,java,javafx-8,Java,Javafx 8,我想使用这样一种方式,我可以执行Javascript代码,以填写一个表单,然后单击我打开的网站上的提交按钮。我使用ChromeDriver,但我不喜欢它的某些方面,WebView更适合我的需要,但据我研究,确保页面加载的唯一方法是向WebEngine添加一个状态侦听器,当它成功时,对网页进行操作。但是,当我执行Javascript并提交表单时,会打开一个新的网页,这样它第二次成功(第一次打开包含表单的网页),并在listener中执行相同的表单填充代码。我想在提交表单后执行其他Javascrip

我想使用这样一种方式,我可以执行Javascript代码,以填写一个表单,然后单击我打开的网站上的提交按钮。我使用ChromeDriver,但我不喜欢它的某些方面,WebView更适合我的需要,但据我研究,确保页面加载的唯一方法是向WebEngine添加一个状态侦听器,当它成功时,对网页进行操作。但是,当我执行Javascript并提交表单时,会打开一个新的网页,这样它第二次成功(第一次打开包含表单的网页),并在listener中执行相同的表单填充代码。我想在提交表单后执行其他Javascript代码,但我找不到一个好方法。在ChromeDriver中,我可以简单地等待一定的时间,但在WebView中,因为它在UI线程中执行,所以我不能这样做。谢谢。

我不知道你是不是这个意思
successed
只是关于引擎状态的信息,为了更准确,您应该检查其他参数,例如:如果您想在一个侦听器中处理不同的页面,您可以使用基于位置(当前加载的url)的验证

WebEngine engine = webView.getEngine();

engine.getLoadWorker().stateProperty().addListener((observable, oldValue, newValue) -> {
    if (newValue != State.SUCCEEDED) {
        return;
    }

    String location = engine.getLocation();

    if (location.contains("page1")) {
        // Do something
        return;
    }

    if (location.contains("page2")) {
        // Do something
        return;
    }

    System.out.println("Unhandled location: " + location);
});

一般来说,我要使用的网站都是web应用程序,所以它们的URL不会在页面之间改变。基于位置的解决方案就是一个例子。如果页面属性没有更改,您可以通过调用javascript并对返回值进行操作来尝试从加载的页面获取一些信息。有时在WebEngine中使用javascript很困难,因此我还建议您在执行脚本之前通过WebConsoleListener.setDefaultListener添加web控制台侦听器以获取有用的信息。