わかりやすく強力なAssertion
WebDriverはブラウザをプログラムで動かす仕組みを提供していますが、テストフレームワークではありません。なので、Assertionは各言語、各xUnitなどのUnitTestフレームワークに依存します。Javaで書く場合はメジャーなところでJUnitかTestNGですが、どちらにしてもWebDriverを考慮しているわけではありません。
Selenideはテストフレームワークであり、便利なAssertionも提供されています。最初のサンプルコードであった
$(".loading_progress").should(disappear);
に現れるshould(Condition)
がまさしくそうです。これは、セレクタで取得した要素が引数Condition
で指定した状態であることを検査するメソッドです。要素から状態をとってそれを比較することなく、シンプルかつ可読性高く記述できます。
このshould(Condtion)
に代表されるAssertionは全て単一要素を表すSelenideElement
、複数の要素を表すElementsCollection
で定義されています。
これらは$
などのSelenide固有のセレクタの戻り値なので、自然に記述することができます。
IDEとの親和性
公式サイトのドキュメントページに説明がありますが、API設計がIDEによるコード補完を前提に設計されています。SelenideのAPI戻り値はほぼ全てSelenideのObjectで、それらには適切な名称でメソッドが定義されているため、IDEを使ってコードを書く際Selenideの戻り値に「.
」を打つことで、ドキュメントをほとんど見ずに書くことができます。
柔軟な「待ち」とAjax対応
ブラウザベースの自動テストを記述しているとどうしても避けられないのが、テストで行いたい操作内容そのものと直接関係のない「待ち」処理です。Ajaxなどの非同期処理やその他JavaScriptを用いたイベント処理で、処理が完了した後に何か操作をしたくても、テストコード上では明示的に待ち処理が必要になります。また、待ち処理は時間指定をしてもその時の実行環境(テストを実行しているPCの性能やネットワーク環境)に依存するため、なかなかテストが安定せず、成功したり失敗したりということがあります。
Selenideではこれらの問題を緩和するために全ての処理に待ち処理が入るようになっています。デフォルトの待ち時間は4秒と設定されていて、0.1秒毎にポーリングされます。この時間は変更可能です。
また全体での待ち処理とは別に、時間だけでなく状態による待ち処理も指定することができます。
$("#submit").waitUntil(enable, 1000).click()
上記のように記述できる以下のメソッドが提供されます。
- waitUntil
- waitWhile
いずれも、第一引数はConditon、第二引数は待ち時間です。waitUntilでは待ち時間を超えて指定した状態にならない場合、waitWhileでは待ち時間を超えて指定した状態から変化した場合に、それぞれ例外が発生する仕組みです。このメソッドの戻り値もSelenideElement
なので、引き続き要素に対する操作を記述できます。
メソッド名と合わせて可読性の良さがお分かりいただけるのではないでしょうか。
テスト向けの便利な機能
ブラウザを用いたテストを実装するうえで便利な機能を提供しています。その一例として、自動テスト中に失敗した場合に自動的にブラウザ画面をPNG形式でキャプチャし、またその際のHTMLも保存する仕組みが備わっています。
これはSelenideがデフォルトで行うもので、利用者は特別な設定やAPI呼び出しなどは一切必要としません。もちろん、自分でキャプチャを取りたい場合は任意でAPI呼び出しを行うことでも可能です。
継承不要
同じJava向けWebDriverラッパーであるFluentLeniumとの比較で、個人的に一番大きく異なる点だと思うのは、この継承不要であるということです。
Selenideは一切継承を必要とせず、必要な時にSelenideが提供しているstatic methodを呼び出すことでその機能を利用できます。そのため、自分たちのテスト実装(基盤やフレームワークを含む)について継承関係を自由に作ることができます。
自動テスト基盤で継承はさほど使うものではないかもしれませんが、私はPageObjectの親クラスを作成させるなどしているので、この点は大きなメリットを感じています。
もっとも、この制限はJava 8から導入されたinterfaceのdefault methodで大部分緩和されています。
中締め
ざっとSelenideの特徴的な部分について説明してきましたが、いかがだったでしょうか。E2Eの自動テストはやりたいけれど準備が大変そう、覚えるAPIが多そうと感じていた人が多いかもしれませんが、Selenideを使うことでかなりの部分を緩和できるのではないでしょうか。
私は仕事でSelenideを使ってE2Eテストの基盤(PageObjectおよび共通部分)を作りましたが、それまで聞きかじりでWebDriverを知っていた状態から一週間で、大体困ることなくSelenideでテストを書けるようになりました。
ぜひみなさんもSelenideを使って、楽しくブラウザベースのE2Eテストを書いていきましょう。