web-dev-qa-db-fra.com

Comment tester que staticTexts contient une chaîne à l'aide de XCTest

Dans les tests de l'interface utilisateur Xcode, comment puis-je tester que staticTexts contient une chaîne?

Dans le débogueur, je peux exécuter quelque chose comme ceci pour imprimer tout le contenu de staticTexts: po app.staticTexts. Mais comment puis-je tester si une chaîne existe n'importe où dans tout ce contenu?

Je peux vérifier l'existence de chaque staticText faisant quelque chose comme app.staticTexts["the content of the staticText"].exists? mais je dois utiliser le contenu exact de ce staticText. Comment puis-je utiliser uniquement une chaîne qui ne peut être qu'une partie de ce contenu?

17
Vincent Phillips

Tout d'abord, vous devez définir un identificateur d'accessibilité pour l'objet texte statique auquel vous souhaitez accéder. Cela vous permettra de le trouver sans rechercher la chaîne qu'il affiche.

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

Ensuite, vous pouvez vérifier si la chaîne affichée est la chaîne souhaitée en écrivant un test en appelant .label Sur le XCUIElement pour obtenir le contenu de la chaîne affichée:

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

Pour vérifier qu'il contient une certaine chaîne, utilisez range(of:), qui renverra nil si la chaîne que vous donnez n'est pas trouvée.

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

Vous pouvez utiliser NSPredicate pour filtrer les éléments.

  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
  }

Avec CONTAINS[c] vous spécifiez que la recherche est insensible à la casse.

Jetez un oeil à Apples Guide de programmation des prédicats

21
dnlkng

J'ai eu ce problème pendant que je construisais mon XCTest, j'avais une chaîne dynamique à l'intérieur de mon bloc de texte que je devrais vérifier. J'avais construit ces deux fonctions pour résoudre mon problème:

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)
}

Je sais que ce message est ancien, mais j'espère que cela peut aider quelqu'un.

7
J. Lopes