Geb + Selenium Web Driver + PhantomJS + Spock でテストしてみたい。その2

Geb?

今朝ゴロゴロ調べてたら偶然Gebというものに出会い、面白そうだなーと。

んでドキュメントをさらーっと必要そうなとこだけ読んだんだけど。
やっぱり良さそう。使ってみよっと。
何が良さそうってSelenium WebDriverでテスト書くときに処理を読みやすく書けそうなん。

こんな感じ

例えば、ここからの引用だけど、
The Book Of Geb - Pages - version 0.10.0

こんな風に書けます:

Browser.drive {
    to GoogleHomePage
    search "Chuck Norris"
    at GoogleResultsPage
    resultLink(0).text().contains("Chuck")
}

1. Googleのホームページを開いて
2. "Chuck Norris"を検索すると
3. Googleの検索結果ページに遷移して
4. 結果リンクの1番目のテキストには"Chuck"が含まれている

ってテストですね。読みやすいですね。
Spockでもう少し読みやすくなるかな。

class GoogleChuckNorrisSpec extends GebSpec {
 
    def "Chuck Norrisを検索したら最初の結果にChuckが含まれとる"() {
        setup:
        to GoogleHomePage

        when:
        search "Chuck Norris"

        then:
        at GoogleResultsPage

        and:
        resultLink(0).text().contains("Chuck")
    }
}

ってこの程度の例じゃ読みやすくなったかどうかわからんか。

Page

GoogleHomePageとGoogleResultsPageはPageオブジェクトとして
こんな感じで定義されてます:

import geb.*
 
class GoogleHomePage extends Page {
    static url = "http://google.com/?complete=0"
    static at = { title == "Google" }
    static content = {
        searchField { $("input[name=q]") }
        searchButton(to: GoogleResultsPage) { $("input[value='Google Search']") }
    }
 
    void search(String searchTerm) {
        searchField.value searchTerm
        searchButton.click()
    }
}
 
class GoogleResultsPage extends Page {
    static at = { waitFor { title.endsWith("Google Search") } }
    static content = {
        results(wait: true) { $("li.g") }
        result { index -> results[index] }
        resultLink { index -> result(index).find("a.l") }
    }
}
 

toで開くときにurlを使って、そのページにいるかな?ってののチェックにatを使って
ページ内の要素にアクセスするときにcontentを使ってるっぽい。面白いなー。