JavaFXでSeleniumっぽいものを作る

JavaFXSeleniumのAdvent Calendar11日目です。
JavaFX Advent Calendar 2013 - Adventar
Selenium Advent Calendar 2013 - Adventar


両方に対応できるネタとして、JavaFXSeleniumっぽいものを作ってみました。というか、以前ためしに作ってみたものを、現状のライブラリで動くように作りなおした感じ。
ソースはこっちに。
https://github.com/kishida/advent2013fxselenium


TesteeWebAppのほうはJava EE 7で作成したWebアプリケーションで、GlassFishとかで動きます。
Faces Flowsで画面フローを作っています。画面の流れを各画面から分離して、整理して記述できるのですごくいいですね。詳しいところはkikutaroさんのところを見てください。
今回は、ログインするかゲストで購入画面に入って、商品を選択、ゲストの場合は口座を入力して確認画面、完了、みたいな流れ。


WetTesterのほうが、Seleniumっぽいやつですね。
ソースは1ファイルです。
https://github.com/kishida/advent2013fxselenium/blob/master/WebTester/src/main/java/kis/webtester/MainView.java


ビルドするには、Java7のJAVA_HOME/jre/lib/jfxrt.jarを次のdependencyで登録しておく必要があります。

    
      javafx
      javafx
      2.0
    

でもコンパイル・実行は、Java SE 8です。


とりあえず、URLの読み込みとテキスト検出、入力設定、ボタンクリック、を実装しています。画面キャプチャも。
で、これを次のような感じで自動的に遷移させることができる、と。

    load("http://localhost:8080/TesteeWebApp/");
    if(true)return;
    Thread.sleep(300);
    HTMLElement elm = findByText("開始画面");
    System.out.println(elm);
    capture(path + "01index.png");
    clickById("fm:btnStart");
    Thread.sleep(300);
    capture(path + "02start.png");
    clickById("fm:btnLogin");
    Thread.sleep(300);
    setValueById("fm:txtUsername", "kishida");
    setValueById("fm:txtPassword", "naoki");
    capture(path + "03logininput.png");
    clickById("fm:btnLogin");


ボタンクリックはちょっと苦労していて、buttonエレメントの場合にはイベントハンドラを生成したりしています。今回はsubmitボタンだけなので使われてないけど。

Element elem = engine.getDocument().getElementById(id);
if(elem != null){
    if(elem instanceof HTMLInputElement){
        ((HTMLInputElement)elem).click();
    }else if(elem instanceof HTMLButtonElement){
        Object o = engine.executeScript(
                "var evt = document.createEvent('MouseEvents');"
                + "evt.initEvent('click', false, true);evt");
        ((JSObject)elem).call("dispatchEvent", o);
    }
}


実行すると、こんな感じでちょこまかと動きます。

って動きはわかりませんね。
ほんとは動画とかを撮ればいいんだろうけど、Faces Flowsで画面作ってたら力尽きたのでパス・・・
起動が速いので、ちょこまかとテストするには結構いいです。あと、ブラウザのインストール状況とか考えず、Javaが動けばいいので、テストに組み込みやすいです。
やろうと思えば複数画面にも対応できるはず。


あと、そのまま実行すると/Users/naoki/Desktopとかにキャプチャ画像作ろうとするんで、気をつけてください。