JavaFXのWebViewでSeleniumみたいなWebテストやってみたら面白かったんだけど

JavaFX2.0のWebViewで、Javaからブラウザが操作できるようになって、これをSeleniumが組み込んだらおもしろいことになるだろうなと思ってたのですが、よくよく考えると、SeleniumナシでWebサイトのUIテストが簡単に書けることに気づきました。


ということで、まずはテスト対象のサイトをつくってみます。
最初の画面(first.html)。テキストフィールドがあって、OKボタンを押すと「ほんと?」という確認ダイアログがでて、「OK」を押すと次の画面に行きます。

<!DOCTYPE html>
<html>
    <head>
        <title>テスト画面</title>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    </head>
    <body>
        <h1>テスト画面</h1>
        <form id="myform" action="next.jsp" method="post"
              onsubmit="return confirm('ほんと?')">
            <input type="text" name="param" id="param">
            <input type="submit" value="OK">
        </form>
    </body>
</html>


で、その遷移先の画面(next.jsp)。入力された文字を表示します。

<%@page contentType="text/html" pageEncoding="UTF-8"%>
<% request.setCharacterEncoding("utf-8"); %>
<!DOCTYPE html>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>結果よ</title>
    </head>
    <body>
        <h1>結果よ</h1>
        <div id="result">${param['param']}でした</div>
    </body>
</html>


さて、これをテストするプログラムを書いてみます。ソースは最後に貼っておきます。
実行すると、first.htmlが表示されて、自動的にテキストフィールドに文字が入力されます。


で、画面が遷移します。


このとき、遷移先URL、タイトル、メッセージ文字列を確認します。

フォーム取得:成功
遷移:成功
タイトル:成功
結果:成功


Seleniumっぽいことができました!


Seleniumってブラウザ表示させるので、起動が重かったり結構時間がかかるのですけど、かなり軽くWebテストができます。
あと、プログラム工夫すれば、通らなかったテストケースを画面キャプチャして確認できるようにしたり、便利な感じにできます。
画面を2つ表示して別々のユーザーでログインさせて、互いの操作が反映するか確認するっていうテストはSeleniumではできなかったのですが、それもできそう。
しかもこれ、WebViewで画面に表示する必要はなくて、WebEngineだけ準備すればいいです。Seleniumのテストは画面が表示されて、結構うっとおしかったので、定期自動テストでもだいじょうぶ。


ただ、本来は確認ダイアログが出るはずなのだけど、それは出ませんでした。
WebEngineにsetConfirmHandlerとかそれっぽいメソッドがあるのですけど、呼び出されてくれません。
あと、なぜか何回かに1度JavaScriptのパースエラーが出たり、処理終了後に例外メッセージが出てたり、いまの段階では動作が安定しているとはいえません。まあ、ベータなので本番リリースまでに直ってくれればいいのですけど。


というわけでソースです。
いつもどおり、コンパイルや実行にはJavaFX2.0ベータのjfxrt.jarをクラスパスに含めます。64bit Windowsでも32bit JDKで動かす必要があります。

続きを読む