JavaFX、SeleniumのAdvent Calendar11日目です。
JavaFX Advent Calendar 2013 - Adventar
Selenium Advent Calendar 2013 - Adventar
両方に対応できるネタとして、JavaFXでSeleniumっぽいものを作ってみました。というか、以前ためしに作ってみたものを、現状のライブラリで動くように作りなおした感じ。
ソースはこっちに。
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
とりあえず、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とかにキャプチャ画像作ろうとするんで、気をつけてください。