web-dev-qa-db-ja.com

Xcode UIテスト[xcode7-beta6]-アクセシビリティラベルを使用する場合の実際のラベル値のアサート

質問は実際には本当に簡単です:

このオブジェクトでアクセシビリティラベルを使用するときに、特定のラベル(UILabelなど)から表示された値をアサートする方法はありますか?

私が見る限り、 WWDC Talk または Blogposts からの例で作成されたすべてのアサーション(XCTAssertEqualsなど)は、 XCTAssertEquals(app.staticTexts["myValue"].exists, true)のようなクエリ、またはテーブルのセル数が正しい場合はXCTAssertEquals(app.tables.cells.count, 5)です。したがって、アクセシビリティラベルを回避する場合、オブジェクトに特定の値が表示されているかどうかを確認できますが、どのオブジェクト/要素は確認できません。アクセシビリティラベルを使用すると、app.staticTexts["myValue"]は結果の配信に失敗しますが、app.staticTexts["myAccessibilityLabel"]がヒットするため、表示された値に対してクエリを実行する機会を奪われます。

「テーブルに新しいセルを追加」機能をテストする場合、リストに実際に新しいセルが追加されていることをテストできますが、新しいセルがリストの上部または下部のどちらに追加されているかわかりません。またはその間のどこか。

私にとって、特定の要素が特定の値を持っているかどうかを確認する簡単な方法は、UIテストに関しては簡単です。

不足しているドキュメントが原因で、私が明白な見落としを見落としている可能性があります。もしそうなら、教えてください。

18
wegenmic

.text値を設定するときは、必ずUILabelの.accessibilityValueプロパティを設定してください。次に、UITestで、次のようにアクセシビリティ値をテストできます。

    let labelElement = app.staticTexts["myLabel"]
    ...
    XCTAssertEqual(labelElement.value as! String, "the expected text")
23
robert

あなたはいくつかの異なることを尋ねていると思いますので、私はそれぞれの質問に個別に答えようとします。

  1. このオブジェクトでアクセシビリティラベルを使用するときに、特定のラベル(UILabelなど)から表示された値をアサートする方法はありますか?

つまり、いいえ。 UIテストは、アクセシビリティAPIにフックすることで機能するため、それに基づいてオブジェクトをクエリすることに制限されます。ただし、コントロールなどの特定の要素の-valueプロパティを確認できます。これは、スイッチがオンかオフかをテストするために使用されます。これらは、アクセシビリティAPIを使用して煮詰めるだけで、別の方法(-accessibilityValue-accessibilityIdentifierの代わりに-accessibilityLabel)であることに注意してください。

  1. ...しかし、新しいセルがリストの上部または下部に追加されているのか、その中間に追加されているのかはわかりません。

フレームのXCUIElementを調べるには、-frameを公開する新しいXCUIElementAttributesプロトコルを使用できます。例えば:

let app = XCUIApplication()
app.launch()

app.buttons["Add New Cell to Table"].tap()

let lastCell = app.cells["Last Cell"]
let newCell = app.cells["New Cell"]

XCTAssert(newCell.exists)
XCTAssert(newCell.frame.minY > lastCell.frame.maxY)
  1. 私にとって、特定の要素が特定の値を持っているかどうかを確認する簡単な方法は、UIテストに関しては簡単です。

すべてをアクセシビリティの観点から考えると、これは問題にはなりません。 UIテストは、ユーザー補助機能APIを介してのみ要素と対話できるため、それらを実装する必要があります。これらの設定を有効にすると、ユーザーがアプリにアクセスしやすくなるという利点もあります。

セルの-accessibilityLabelまたは-accessibilityIdentifierの両方を表示されたテキストに設定してみてください。 UIテストは、どれを使用するかについて細心の注意が必要です。

  1. 不足しているドキュメントが原因で、私が明白な見落としを見落としている可能性があります。もしそうなら、教えてください。

XCTestとUI Testingには公式のドキュメントはありません。したがって、私は行って、フレームワークで公開されているヘッダーファイルから自分のものを抽出しました。ソースからプルされたとしても、それらは非公式であることに注意してください。

XCTest/UI Testing Documentation

11
Joe Masilotti

私にとってうまくいくのは、UILabelのアクセシビリティ識別子を設定して、たとえばMyLabelとすることです。

func myLabelText() -> String {
  let myLabelUIElement: XCUIElement = self.application.staticTexts["MyLabel"]

  return myLabelUIElement.label
}

Xcode 8およびiOS 10でテスト済み

8
Martin Stolz

Appleフォーラムから、ラベルの値を取得することが可能であるように見えます:

私が見つけた唯一の方法は、アクセシビリティラベルを設定せず、代わりに識別子を使用することです。次に、XCUIElement.labelは、ラベルの現在のテキストに一致するように変更されます。

ただし、落とし穴があります。XCで以前にアクセシビリティラベルを設定していて、それを削除した場合、ラベルを ""に設定するエントリはストーリーボードに残ります。この場合、.labelを呼び出すと ""が返されるだけでなく、テキストでラベルを照会することもできません。

できることは、ラベルを削除して再度追加するか、XMLを手動で編集することだけです。

lastobelus- https://forums.developer.Apple.com/thread/10428

3
pjh68