Geb概略
Gebの強み
Gebは、前述の通りGroovyの言語機能を利用した簡潔な記述が強みです。GebのWebサイトにあるサンプルコードを見てみましょう。基本的な文法はJavaとほぼ同様です。
import geb.Browser Browser.drive { go "http://myapp.com/login" // ① assert $("h1").text() == "Please Login" // ② $("form.login").with { // ③ username = "admin" password = "password" login().click() } assert $("h1").text() == "Admin Section" // ④ }
このサンプルコードは、次の処理を実装しています。
- http://myapp.com/login に遷移する。
- 遷移先のページのヘッダー(h1)のテキストが「Please Login」になっているかをチェックする。
- 画面上のログインフォームに、ユーザー名とパスワードを入力して、クリックする。
- 遷移先のページが「Admin Section」になっていることをチェックする。
コードの簡潔さに驚く方もいらっしゃるかもしれません。このような簡潔な記述がGebのウリです。
それぞれの要素をもう少し詳しく見ていきましょう。
jQueryのようにエレメントを取得できるNavigation API
サンプル中の$("form.login")
のとおり、jQueryのようにエレメントを取得できるAPIが用意されています。
エレメントの指定の仕方も柔軟で、下記のように取得できます。
// CSS3のセレクタ $("div.some-class p:first[title='something']") // 要素、アトリビュート、インデックスを指定 $("h1", 2, class: "heading")
また、取得したエレメントは、Javaに比べ簡単に加工することができます。
例えば下記の例では、複数のdiv要素の中で、bというクラス名が付いているエレメントをフィルターしています。
$("div").find(".b")
柔軟なwait処理
今はAjaxを利用した非同期通信が一般的になっていますが、その中で非同期に表示されるエレメントなどをSeleniumでwaitすることは骨が折れます。
Gebでは下記のように簡潔にwaitを書くことができます。
waitForに続く{}
内に、waitの条件を記述します。なおGroovyでは、{}
で囲まれた部分はクロージャーと呼び、処理のまとまりを記述することができます。
waitFor { $("p.status").text() == "非同期処理で表示される" }
waitの処理は変数に代入でき、同じwaitの処理を他でも使い回すことができます。下記の例では、waitしたエレメントを定義して、そこから次にテキストを取得して検証しています。
def dynamicParagraph = waitFor { $("p.dynamically-added") } dynamicParagraph.text() == "Added dynamically!"
テスティングフレームワークとの親和性
Gebは「ブラウザの自動化のフレームワーク」なので、テストで利用する際にはテスティングフレームワークとの統合が必要です。JUnitやTestNGだけでなく、CucumberやSpockと組み合わせて利用することができます。中でもSpockとの親和性は非常に高いので、Gebを利用する際にはぜひSpockの利用を合わせて検討するべきです。Spockを利用したコード例は下記になります。
import geb.Page import geb.spock.GebSpec class LoginSpec extends GebSpec { def "login to admin section"() { given: "ログインページに遷移していて" to LoginPage when: "ログインフォームに、ユーザー名とパスワードを入力し" loginForm.with { username = "admin" password = "password" } and: "ログインボタンをクリックすると" loginButton.click() then: "管理者ページに遷移する" at AdminPage } }
より表現力の増した読みやすいコードになっていると思います。このようなメリットがあることから、本記事の後半のサンプルコードもSpockで記述していきます。
マルチブラウザでの利用
Gebはマルチブラウザでの利用を想定しており、Chrome、Firefox、Edgeをはじめとした様々なブラウザをサポートしています。また、リモートマシンでのテスト実行を行うリモートドライバーや、HTMLUnit with WebDriverといったヘッドレスブラウザもサポートしています。