我正在尝试使用JavaFX WebView控件加载网页。具体页面为:https://bitfinex.com/login。然后,一旦将load worker的状态设置为SUCCEEDED,我就使用w3c Document API在加载的网页上执行Javascript。具体来说,我想自动填写电子邮件登录输入,然后关注密码输入。由于某种原因,对于这个特定的页面,没有任何反应(页面只是加载,两个文本输入保持空白)。我已经在其他几个登录页面上使用了这个确切的过程,并且它运行得很完美(例如:https://www.coinbase.com/signin)。这让我很困惑。我的想法不仅仅是Bitfinex网站以某种方式“阻止”互动?另外,为什么load worker状态设置为SUCCEEDED两次(你会看到我使用if语句通过检查这两个元素是否仍为null来防止这种情况,这对我的理解不是必需的,并且对于其他页面,但我不知道这是否与手头的问题有关?这是一些非常模糊,奇怪的错误,很难复制/深入研究吗?无论如何......我希望这将被清除。
代码:
package test;
import javafx.application.Application;
import javafx.concurrent.Worker;
import javafx.scene.Scene;
import javafx.scene.web.WebEngine;
import javafx.scene.web.WebView;
import javafx.stage.Stage;
import org.w3c.dom.Document;
import org.w3c.dom.html.HTMLInputElement;
public class MainApp extends Application
{
public static void main(String[] args) throws Exception
{
launch(args);
}
public void start(Stage stage) throws Exception
{
WebView webView = new WebView();
WebEngine webEngine = webView.getEngine();
webEngine.load("https://www.bitfinex.com/login");
webView.setPrefSize(610, 610);
webEngine.getLoadWorker().stateProperty().addListener((observableValue, oldState, newState) ->
{
if (newState == Worker.State.SUCCEEDED)
{
Document document = webEngine.getDocument();
if (document.getElementById("login") == null || document.getElementById("auth-password") == null)
{
return;
}
((HTMLInputElement) document.getElementById("login")).setValue("john_appleseed@gmail.com");
((HTMLInputElement) document.getElementById("auth-password")).focus();
}
});
stage.setScene(new Scene(webView));
stage.show();
}
}