Selenideとは
Selenideとは、エストニアにあるCodeborne社のAndrei Solntsev氏を中心に開発が行われているWebDriverのJavaラッパーの一つで、同じJavaで実装されたFluentLeniumやGroovyでのGebに相当するものです。WebDriverはプログラムからブラウザを操作するAPIを提供していますが、基本的に低レベルAPIで自動テストを記述するには大量のコードが必要となります。SelenideはWebDriverを基盤としながら高水準APIを提供することで、WebDriverを素で使うよりも容易にかつ記述量を抑えてテストを記述することができます。
Selenideの特徴
以下ではSelenideの特徴を述べていきます。これらの中には上記で挙げたFluentLeniumやGebでも提供されているものもあります(すべてがSelenide固有ということではありません)。
要素取得・チェックなどの高水準APIの提供
FluentLeniumやGebなどの他の類似プロダクトにもありますが、HTML上の要素取得や状態判定、Assertionの高水準APIが提供されます。Selenideのサンプルにあるように以下のように書きます。
import static com.codeborne.selenide.Selenide.*; import static com.codeborne.selenide.Condition.*; @Test public void userCanLoginByUsername() { open("/login"); $(By.name("user.name")).setValue("johny"); $("#submit").click(); $(".loading_progress").should(disappear); // Waits until element disappears $("#username").shouldHave(text("Hello, Johny!")); // Waits until element gets text }
普段Javaでコードを書いていると色々驚くことがあります。このサンプルコードを見ただけでも以下のようなことに気がつくと思います。
- 初期処理を行っていないのに動く。
-
「
$
」でセレクタが始まる。 - セレクタがjQuery風につかえる。
-
クリックが
click()
メソッドで済む。 -
should()
やshouldHave()
でAssertionが行える。 -
text("hoge")
でテキストの状態を判定できる。
static import を利用したDSLの提供
前述の高水準APIと重複する部分がありますが、Java 5から導入されたstatic importを利用したDSL風の記述が行えるようになっています。
先のサンプルコードでも出ていた「$
」というメソッドはcom.codeborne.selenide.Selenide
というクラスのstatic methodですが、テストコードでstatic importを行うことであたかもjQueryを使っているかのように自然にセレクタを記述できます。
他にもcom.codeborne.selenide.Condition
という状態を表現するクラスがあり、static field として以下のようなものが定義されています。
- appear
- disappear
- enable
- disabled
- empty
- checked
サンプルコード中の以下で使われているdisappear
がまさにこのCondition.disappear
であり、static importを使うことで自然言語(この場合は英語ですね)のような感じで記述することができます。
$(".loading_progress").should(disappear);
他にも$
メソッドと組み合わせて使う、検索条件であるcom.codeborne.selenide.Selectors
を使うことで以下のように記述できます。
$(byId("employeeTree")).click()
ここでのbyId
はSelectors#byId
をstatic import した結果です。
Page Objectパターンを標準でサポート
Selenideは標準でPage Objectパターンをサポートしています。
page(PageClass.class)
やopen("http://example.com/hoge.html", HogePage.class)
で指定したPageObjectを生成します。この際、対象Page Objectのfieldに@FindBy
で検索条件を指定しておくことで、その検索結果が設定されます。
詳細はPageObjectを使用したサンプルコードをご参照ください。