XCUIElementの取得が失敗したことをわかりやすくする


今日PageObjectPatternでUITestを書いていたんだけど、
下のような感じで要素の取得の部分はPageObject内に隠蔽して書かれていた。

var loginButton: XCUIElement { return view.buttons["LoginButton"] }

func tapLoginButton() -> LoginPage {
    loginButton.tap()
    return LoginPage(app: app)
}

この書き方だと、要素の取得に失敗したことが原因でUITestが失敗した場合に少しわかりにくい。
要素取れるかどうかのテストをわざわざ書きたく無いので、次のようなvalidateメソッドを作った。

import XCTest

extension XCUIElement {
    func validate(file: StaticString = #file, line: UInt = #line) -> XCUIElement {
        if !self.exists {
            XCTFail(file: file, line: line)
        }
        return self
    }
}

要素取得するたびに存在チェックするようにしておくと、もし取得できなかった場合どこで失敗したかすぐわかるのでチョット便利。

var loginButton: XCUIElement { return view.buttons["LoginButton"].validate() }