きしだのはてな このページをアンテナに追加 RSSフィード

2013-12-11(水) JavaFXでSeleniumっぽいものを作る

[]JavaFXSeleniumっぽいものを作る 21:16 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さんのところを見てください。

今回は、ログインするかゲストで購入画面に入って、商品を選択、ゲストの場合は口座を入力して確認画面、完了、みたいな流れ。

f:id:nowokay:20131211211421p:image


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で登録しておく必要があります。

    <dependency>
      <groupId>javafx</groupId>
      <artifactId>javafx</artifactId>
      <version>2.0</version>
    </dependency>

でもコンパイル・実行は、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);
    }
}

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

f:id:nowokay:20131211211422p:image

って動きはわかりませんね。

ほんとは動画とかを撮ればいいんだろうけど、Faces Flowsで画面作ってたら力尽きたのでパス・・・

起動が速いので、ちょこまかとテストするには結構いいです。あと、ブラウザのインストール状況とか考えず、Javaが動けばいいので、テストに組み込みやすいです。

やろうと思えば複数画面にも対応できるはず。


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

トラックバック - http://d.hatena.ne.jp/nowokay/20131211