SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

「日本Seleniumユーザーコミュニティ」のエキスパートが教えるSelenium最新事情

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

  • X ポスト
  • このエントリーをはてなブックマークに追加

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

  • X ポスト
  • このエントリーをはてなブックマークに追加

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

次のページ
わかりやすく強力なAssertion

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
「日本Seleniumユーザーコミュニティ」のエキスパートが教えるSelenium最新事情連載記事一覧

もっと読む

この記事の著者

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

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

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/10335 2017/08/24 14:00

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング