javafx 2.2.5 が swing app で実行されている 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の実行に失敗した場合、コードはループし、ロードされ、成功し、とにかくエラーがスローされます.ページが完全にロードされていないことが問題であるかどうかを確認するためにスレッドをスリープさせようとしましたが、そうではありません'状態が成功したときにページが正しくロードされていることがわかる限り、これは問題のようです。私はこれにかなりの時間を費やしてきましたが、今のところ、これを修正する方法や問題が何であるかについてのアイデアがありません。さらに悪いことに、エラーが発生するまでコードを数回実行してみる必要があります。これにより、デバッグがはるかに困難になります。
問題のエラーは::
netscape.javascript.JSException: TypeError: 'null' は com.sun.webpane.platform.WebPage.twkExecuteScript(Native Method) のオブジェクトではありません
私の質問ですが、なぜこれが起こっているのかについて手がかりを持っている人はいますか? または、この問題の回避策はありますか?
どうもありがとう