web-dev-qa-db-ja.com

XCTestを使用してstaticTextsに文字列が含まれていることをテストする方法

Xcode UIテストでは、staticTextsに文字列が含まれていることをどのようにテストしますか?

デバッガーで次のように実行して、staticTextsのすべてのコンテンツを出力できます:po app.staticTexts。しかし、そのすべてのコンテンツ内のどこかに文字列が存在するかどうかをテストするにはどうすればよいですか?

app.staticTexts["the content of the staticText"].exists?のような処理を行う各staticTextの存在を確認できます。しかし、私はそのstaticTextの正確なコンテンツを使用する必要があります。コンテンツの一部である可能性がある文字列のみを使用するにはどうすればよいですか?

17

まず、アクセスする静的テキストオブジェクトのアクセシビリティ識別子を設定する必要があります。これにより、表示されている文字列を検索せずに検索できます。

_// Your app code
label.accessibilityIdentifier = "myLabel"
_

次に、表示された文字列の内容を取得するためにXCUIElementで_.label_を呼び出してテストを記述し、表示された文字列が目的の文字列であるかどうかをアサートできます。

_// Find the label
let myLabel = app.staticTexts["myLabel"]
// Check the string displayed on the label is correct
XCTAssertEqual("Expected string", myLabel.label)
_

特定の文字列が含まれていることを確認するには、range(of:)を使用します。指定した文字列が見つからない場合、nilが返されます。

_XCTAssertNotNil(myLabel.label.range(of:"expected part"))
_
7
Oletha

NSPredicateを使用して要素をフィルタリングできます。

  let searchText = "the content of the staticText"
  let predicate = NSPredicate(format: "label CONTAINS[c] %@", searchText)
  let elementQuery = app.staticTexts.containing(predicate)
  if elementQuery.count > 0 {
    // the element exists
  }

CONTAINS[c]検索で大文字と小文字を区別しないことを指定します。

りんごを見てください 述語プログラミングガイド

21
dnlkng

XCTestのビルド中にこの問題が発生しました。確認する必要があるテキストブロック内に動的文字列がありました。私は問題を解決するためにこの2つの関数を作成しました:

func waitElement(element: Any, timeout: TimeInterval = 100.0) {
    let exists = NSPredicate(format: "exists == 1")

    expectation(for: exists, evaluatedWith: element, handler: nil)
    waitForExpectations(timeout: timeout, handler: nil)
}

func waitMessage(message: String) {
    let predicate = NSPredicate(format: "label CONTAINS[c] %@", message)
    let result = app.staticTexts.containing(predicate)
    let element = XCUIApplication().staticTexts[result.element.label]
    waitElement(element: element)
}

私はこの投稿が古いことを知っていますが、これが誰かに役立つことを願っています.

7
J. Lopes