Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationEventAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
59
Help us understand the problem. What are the problem?

More than 5 years have passed since last update.

posted at

updated at

Gebチートシート

stac2014のTAをしたときに整理したものです。

基本は、公式サイトで調べましょう。

要素取得

指定 コード
id $("#foo")
name $(name:"foo")
class $(".foo")

Formの中の要素の選択

formの中の要素は、formをcontentに用意すれば、name属性を使って簡単にアクセスできる。

content部分

static content = {
    testCaseForm { $("form[role=form]") }
}

formの要素をname属性を使ってアクセスしている例

public void addTestCase(String name, String scenario, String tag) {
    testCaseForm.name = name
    testCaseForm.scenario = scenario
    if(tag != null){
        testCaseForm.tags = tag
    }
    testCaseForm.create().click()
}

操作

取得した要素が変数elementに格納されている前提で記載します。

操作 コード
クリック element.click()
テキスト入力 element = "テキスト"
ラジオボタン選択 element = "valueの値"
チェックボックスをチェック element = true
プルダウン element << "valueの値"
セレクト element = "foo"
マルチセレクト element = ["foo", "bar"]

formの場合

$('form').name属性名でとるのもよくやるテクニック。
例えばこんな感じ。

<form>
  <input id="on_radio" type="radio" value="on" name="on_off_radio">あり
  <input id="off_radio" type="radio" value="off" name="on_off_radio">なし
</form>
$('form').on_off_radio = 'on'

要素の情報取得

取得した要素が変数elementに格納されている前提で記載します。

情報 コード
テキスト element.text()
inputのテキスト element.text()
表示/非表示 element.isDisplayed()
実行可/不可 element.isEnabled()
選択済/未選択 element.isSelected()
存在する/しない element.size() > 0

window処理

to()を実行すると、PageObjectのat()チェックもしてくれる。

※Page Objectについては後述

操作 コード
指定URLへ移動 go "URL"
指定Pageへ移動 to PageObject
指定Pageへ移動(リダイレクトされるとき) via PageObject
現在のwindowを閉じる close()
WebDriverを終了 quit()
ブラウザバック driver.navigate().back()
ブラウザフォワード driver.navigate().forward()
ポップアップ(OK) withConfirm(true) { 処理 }
ポップアップ(キャンセル) withConfirm(false) { 処理 }

Waitとスクリーンショット取得

waitFor{}の中はどんな判定でもよいため、いくらでも応用がきく(isEnabled()とか)。

操作 コード
要素が表示されるまで待機 waitFor{ element.isDisplayed() }
PageObjectのcontentでwait指定 helpButton(to: HelpPage, toWait: true) { $("button#help") }
スクリーンショット取得 report "ファイル名"

設定ファイル(GebConfig.groovy)

import geb.report.ScreenshotReporter

reportsDir = "build/geb-reports" // スクリーンショットの出力ディレクトリ
baseUrl = "http://fathomless-stream-3131.herokuapp.com" // 起点となるURL
// 待機時間の指定(キーワード指定)
waiting {
    presets {
        slow {
            timeout = 15
            retryInterval = 1
        }
        quick {
            timeout = 1
        }
    }
}
// 待機時間の指定
waiting {
    timeout = 60
    retryInterval = 0.5
}
atCheckWaiting = true // at()チェックの待機設定
baseNavigatorWaiting = true // base navigatorのための待機設定
// スクリーンショットのファイル名文字化け対策
reporter = new ScreenshotReporter() {
    @Override
    protected escapeFileName(String name) {
        name.replaceAll('[\\\\/:\\*?\\"&lt;>\\|]', '_')
    }
}

Page Object

class AdminPage extends Page {
    static at = {
        assert $("h1").text() == "Admin Page"
    }
}

PageObjectのContent

class ExamplePage extends Page {
    static content = {
        heading { $("h1").text() }
        loginButton(to: AdminPage) { $("input", type: "submit", name: "login") }
    }
}

module

module

class ExampleModule extends Module {
    static content = {
        button { $("input", type: "submit") }
    }
}

PageObjectでmoduleを使う

class ExamplePage extends Page {
    static content = {
        theModule { module ExampleModule }
    }
}

Module List

基本的には以下のとおり。

簡単に解説。

module

cell(N)の部分はedit {cell(2).$("a", 0)}のような書き方もできる。

class CartRow extends Module {
    static content = {
        cell { $("td", it) }
        productName { cell(0).text() }
        quantity { cell(1).text().toInteger() }
        price { cell(2).text().toDouble() }
    }
}

Page Object

tail()部分はヘッダーを飛ばすため。

今回のアプリはヘッダーがthになっているので不要。

class CheckoutPage extends Page {
    static content = {
        cartItems { moduleList CartRow, $("table tr").tail() } // tailing to skip the header row
    }
}

検索

直接、ModuleListとは関係ないが、Groovyのfindメソッドを使って検索するとよい。
以下は、OverLoadを何度もしなくてよいように、引数をMapにしたパターン。
入力がないときは、検索条件なしと判定するようにしている。

public List<TestCaseRow> searchTestCases(Map param) {
        String name = param?.name ?: ""
        String scenario = param?.scenario ?: ""
        List<String> tags = param?.tags ?: []

        List<TestCaseRow> result = testCaseItems.findAll {
            (name == "" || it.name == name) && (scenario == "" || it.scenario == scenario) && (tags == [] || it.tags.split("\n").toList().containsAll(tags))
        }
        if(result){
            return result
        } else if(find(".nextLink")){
            next.click()
            sleep(3000)
            searchTestCases(name:name, scenario:scenario, tags:tags)
        } else{
            return []
        }
    }```
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
59
Help us understand the problem. What are the problem?