Shoeisha Technology Media

CodeZine(コードジン)

記事種別から探す

Javaで簡単にUIテストを書けるSelenideを使おう~Selenideの概要とテストの保守性を上げるPage Objectパターンの紹介

  • LINEで送る
  • このエントリーをはてなブックマークに追加
2017/08/24 14:00

 WebDriverのJavaラッパーであるSelenideは、WebDriverを素で使うよりも容易にかつ記述量を抑えてテストを記述することができます。本記事では、前半でSelenideの概要と特徴について解説し、後半では、日本Seleniumユーザーコミュニティが提供するテスト用サイトを題材に、Selenideを使ったWebアプリケーションテストの書き方について解説します。

目次
illustration by iwasawa
illustration by iwasawa

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()

 ここでのbyIdSelectors#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を使用したサンプルコードをご参照ください。


  • LINEで送る
  • このエントリーをはてなブックマークに追加

著者プロフィール

  • 島根 義和(シマネ ヨシカズ)

     肌年齢17歳、外見年齢37歳のごくごく普通のプログラマ。  25歳の頃、デスマーチを経験したことでソフトウェア工学に目覚め、開発プロセス、品質管理等を独学で勉強し続ける。がなかなか実践できない。  好きな技術書はスティーブ・マコネルの「ラピッドデベロップメント」。  2012年よりJaSST...

バックナンバー

連載:「日本Seleniumユーザーコミュニティ」のエキスパートが教えるSelenium最新事情
All contents copyright © 2005-2017 Shoeisha Co., Ltd. All rights reserved. ver.1.5