2

我在 Swing 应用程序上运行 javafx 2.2.5 的 webengine 有问题,所以想用 webengine 登录 ebay,我可以这样做,问题是执行点击时有时会引发 javascript 错误。这是一小部分时间,通常它工作正常。所以让我们说这段代码:

 final StackPane root = new StackPane();
 WebView browser = new WebView();
 WebEngine webEngine = browser.getEngine();
 final String url ="https://signin.ebay.co.uk/ws/eBayISAPI.dll?SignIn";
 //load the url
 webEngine.load(url);
 final Scene scene = new Scene(root, 500, 400);
 root.getChildren().add(browser);
 //addlistener for state
  webEngine.getLoadWorker().stateProperty().addListener(new ChangeListener() {
        @Override
        public void changed(ObservableValue ov, Object t, Object t1) {              
            Worker.State state = (Worker.State)t1;

            if(state==Worker.State.SUCCEEDED){
                         Document doc = webEngine.getDocument();
                         Element u = (Element) doc.getElementById("userid");
                         u.setAttribute("value", username);
                         Element p = (Element)doc.getElementById("pass");
                         p.setAttribute("value", pass);
            //now execute the click, as the load succeeded the button should be clickable
            webEngine.executeScript("document.getElementById('but_sgnBt').click()");
            }   
}
}); 

好吧,大多数时候它都可以工作,但有时由于未知原因它不起作用,我也尝试了很多变体,看看我是否可以重新加载页面并重试,但每次第一次出错时,其他调用像 reload() 和 load() 一样,继续同样的问题。我尝试这样做:

final StackPane root = new StackPane();
WebView browser = new WebView();
WebEngine webEngine = browser.getEngine();
String url ="https://signin.ebay.co.uk/ws/eBayISAPI.dll?SignIn";
//load the url
webEngine.load(url);
 final Scene scene = new Scene(root, 500, 400);
root.getChildren().add(browser);
//addlistener for state
 webEngine.getLoadWorker().stateProperty().addListener(new ChangeListener() {
        @Override
        public void changed(ObservableValue ov, Object t, Object t1) {              
            Worker.State state = (Worker.State)t1;

            if(state==Worker.State.SUCCEEDED){

                         Document doc = webEngine.getDocument();
                         Element u = (Element) doc.getElementById("userid");
                         u.setAttribute("value", username);
                         Element p = (Element)doc.getElementById("pass");
                         p.setAttribute("value", pass);
            //now execute the click, as the load succeeded the button should be clickable
            try{
            webEngine.executeScript("document.getElementById('but_sgnBt').click()");
           }catch(Exception ex){
            webEngine.getLoadWorker().cancel();
            //with both is the same outcome
            //  webEngine.reload();
                webEngine.load(url);
           }
            }   
}
}); 

有了这个,如果第一次执行javascript失败,代码将继续循环,它加载,成功并抛出一个错误,我试图让线程休眠,看看问题是否是页面没有完全加载,但这并没有t 似乎是问题所在,据我所知,当状态成功时,页面已正确加载。我已经花了很多时间来解决这个问题,现在我对如何解决这个问题甚至问题是什么都没有更多的想法,最糟糕的是,我必须尝试运行代码几次,直到出现错误,这使得调试更加困难。

有问题的错误是::

netscape.javascript.JSException:TypeError:'null' 不是 com.sun.webpane.platform.WebPage.twkExecuteScript(本机方法)中的对象

所以我的问题是,有人知道为什么会这样吗?或者解决这个问题的方法?

非常感谢

4

0 回答 0