我在使用javafx 2.2.5在swing应用程序上运行的webengine有问题,所以想要使用webengine登录ebay,我可以这样做,问题是有时它会在执行click时抛出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执行失败,它加载,成功并抛出错误无论如何,我试图睡眠线程,看看是否问题是页面没有完全加载,但这似乎不是问题,我可以看到状态成功后页面加载正确。 我花了很多时间用这个,现在我没有更多的想法如何解决这个问题,甚至问题是什么,最糟糕的是我必须尝试运行代码,直到我收到错误,这使得调试变得更加困难。
有问题的错误是::
netscape.javascript.JSException:TypeError:'null'不是com.sun.webpane.platform.WebPage.twkExecuteScript(Native Method)中的对象
所以我的问题是,有没有人知道为什么会这样? 或者解决这个问题?
非常感谢