XCTestを使ってiOSアプリのUITestを実行する際に、編集方法によっては判定すべき値を正しくとれないときがあったので、残しておきます。
AccessibilityLabelを設定されているUILabelなどの値を判定する
これがうまくいきませんでした。
例えば、こんなコードを書きます。
// in Application
// コードまたは、StoryboardでAccessibilityLabelを設定
label.accessibilityLabel = "ResultLabel"
// in UI Test
let resultLabel = app.staticTexts["ResultLabel"]
XCTAssertEqual(resultLabel.label, "6")
実行してみると。。。
XCTAssertEqual failed: ("Optional("ResultLabel")") is not equal to ("Optional("6")")
画面上、該当のラベルには"6"と表示されています。なにかおかしいですね。
いろいろ試した結果、AccessibilityLabelが設定されている場合に、XCUIElement.label
はAccessibilityLabelの値を返すことがわかりました。(観測)
値を扱いたいときは、AccessibilityLabelではなく、AccessibilityIdentifierを指定しましょう。
表示している値を検証しない場合は、AccessibilityLabelでも問題ありません。
要素の特定はうまくいきます。
StoryboardでAccessibilityLabelを消したんだけど、うまくいかない
罠ですね。
AccessibilityLabelでは、値を取得できないことがわかったのでStoryboardでAccessibilityLabelを空にしました。かわりに、AccessibilityIdentifierに"ResultLabel"を指定しました。
コードを少し直して実行してみます。
// in UI Test
let resultLabel = app.staticTexts["ResultLabel"]
XCTAssertEqual(resultLabel.label, "6")
XCTAssertEqual failed: ("Optional("")") is not equal to ("Optional("6")")
画面上、該当のラベルには"6"と表示されています。またもや、なにかおかしいですね。
値を正常に取得できていません。
Main.storyboardを開いてみましょう。
該当のラベルのAccessibilityタグを見ると。
ラベルの設定がありますよ! (label="")
<accessibility key="accessibilityConfiguration" identifier="SliderIdentifier" label=""/>
一度でも編集すると、タグが作られ、それによってAccessibilityLabelがNilにならなくなるようです。
labelプロパティを直接けずって、再実行するとうまくいきました。
<accessibility key="accessibilityConfiguration" identifier="SliderIdentifier"/>
なぜAccessibilityLabelを使っていたのか (追記)
今回の問題を見つけるに至った最初のプロジェクトは、XCode 6.4で作成したプロジェクトでした。
このプロジェクトでは、UI TestをKIFを使って書いており、その際、多くの要素の特定にAccessibilityLabelを使っていました。
今回、XCode7でプロジェクトを作り直しましたが、Storyboardファイルはそのまま持ってきたため、AccessibilityLabelが設定済みで、罠にはまることになりました。
KIFを使っていたプロジェクトを移行する際には、ご注意ください。