WebDriverのコマンドをラップして、よりシンプルに書けるようにしたライブラリもいくつか登場してきました。RubyのCapybara、GroovyのGebなどは聞いたことのある方も多いでしょう。Javaで同じようなことを実現したい場合には、FluentLeniumというライブラリがよく知られています。今日はこのFluentLeniumについてご紹介します。WebDriverコマンドをシンプルに書けるライブラリです1。Lemee氏が中心となって開発を進めています。Gebと似たAPIもあるので、影響は受けていると思われます。WebDriverと比べても学習コストはあまり高くないと思います。FrameworkがFluentLeniumを採用しています2。日本でも既に何人かの方にブログなどで紹介されており、こちらの情報も参考になります。3FluentLeniumの特徴の中でも、まず取り上げたいのは次の3つです。シンプルなテストスクリプトjQueryライクなセレクタページオブジェクトパターンのサポートまずはこの3つを見ていきましょう。シンプルなテストスクリプト図1は、FluentLeniumを使ったブラウザ操作スクリプトのサンプルです。}}FluentTestクラスを継承すれば、ブラウザの起動/終了の処理は自動的に行われます。各ブラウザ操作のメソッドも、非常にシンプルなものです。goTo(<URL>)指定されたURLにページ遷移します。click(<対象要素>)HTML要素をクリックします。対象要素は「CSSセレクタ」で指定しますが、これについては後ほど説明します。fill(<対象要素>).with(<テキスト>)HTML要素にテキストを入力します。fillSelect(<対象>).withValue(<value属性の値>)select要素(プルダウン)の指定された値の項目を選択します。takeScreenShot(<ファイルパス>)ブラウザの画面キャプチャを取得します。executeScript(<JavaScriptコード>)指定されたJavaScriptコードを実行します。await().atMost(<ミリ秒>).until(<対象要素>).areDisplayed()要素が表示されるまで、最大で指定されたミリ秒の間待機します。待ち処理には、この他にも様々な条件で待機するメソッドがあります。WebDriverのメソッドをそのまま使うのと比べ、随分シンプルに書けるようになっています。jQueryライクなセレクタFluentLeniumの操作対象HTML要素の指定は、jQueryに似たスタイルで記述します(jQuery相当の機能で実装されているのは現状ごく一部ですが、テストで使うにはだいたい事足りるのではないか思います)。指定に使うのは、CSSセレクタと呼ばれる記法です4。これは普段JavaScriptを書いている方にはおなじみの記法でしょう。span");findメソッドを使った書き方もできます。idが「user」の要素をクリックfind("#user").click();さらに、findの代わりに「$」というメソッドを使うことで、jQueryライクな書き方になります。idが「user」の要素をクリック$("#user").click();with系のメソッドで追加の絞り込み条件を指定できます5。name属性やテキストで要素を特定する場合は、これらのメソッドを使うのが良いでしょう。withText("次へ"));部分一致なども可能です。withText().contains("確認"));findメソッドで探索した要素の子孫要素に対し、さらに探索を行うこともできます。ページオブジェクトパターンのサポート「ページオブジェクトパターン」とは、UI変更時のスクリプト修正の手間を軽減するために、「Webページへの操作を、ページごとのクラスを作って1カ所にまとめる」技法です6。FluentLeniumには、ページクラスの作成をサポートする継承元クラス「FluentPage」が用意されています。図2は、「問い合わせページ」への操作をまとめた「ContactPage」クラスの例です。FluentPageクラスを継承する。このページのURLを返す。共通設定で指定したベースURLからの相対パスも可。ページ遷移が成功したかをチェックする。}}setName、setMail、sendなどのメソッドが問い合わせページへの操作にあたるメソッドです。継承元に定義されているgetUrlとisAtメソッドをオーバーライドして実装します。7テストケース中では、図3のようにContactPageクラスを介してブラウザ操作を行います。contact.send();}「問い合わせページ」の情報を1クラスにまとめることで、UI変更がおきた場合でも1クラスだけを変更すればよくなります。>注釈・出典JavaのSeleniumコマンドのラッパーとしては、他にSelenideというライブラリもありますが、日本ではFluentLeniumの名前をよく聞きます。GitHubのContributor数やStar数からもFluentLeniumの方がメジャーな印象を受けました。[↩]「FluentLeniumの紹介について」「FluentLenium」「テスト自動化の様々な道具を使ってみた四方山話」「なぜ画面自動テストはうまく行かないのか」など、参考にさせていただきました。[↩]「意外と知らない!?CSSセレクタ20個のおさらい」に、CSSセレクタの記法について分かりやすくまとめられています。org.fluentlenium.core.filter.FilterConstructor.*」を、with系のメソッドを使う時はあらかじめ行っておきます。Objects」や「4時間で学ぶ、効率的な自動テストスクリプトのメンテナンス」が参考になります。[↩]FluentLeniumのREADMEページではisAtメソッドをassertThatメソッドを使って実装していますが、Seleniumのページオブジェクトパターンの原則の1つに「Assertionをページクラスに含めるべきではない」という原則があるので、ここではassertThatは使わず例外をthrowしています。Selenium公式wikiページのサンプルコードもそうなっています。コメントをキャンセルメールアドレスが公開されることはありません。プライバシー・ポリシ。