web-dev-qa-db-fra.com

Comment vérifier la présence de texte statique affiché à partir du réseau dans les tests d'interface utilisateur dans Xcode?

J'utilise les API de test d'interface utilisateur introduites dans Xcode 7 XCTest. Sur mon écran, un texte est chargé à partir du réseau.

Le test échoue si je le vérifie simplement avec la propriété exists.

XCTAssert(app.staticTexts["Text from the network"].exists) // fails

Cela fonctionne bien si j'envoie d'abord le tap ou tout autre événement au texte comme ceci:

app.staticTexts["Text from the network"].tap()
XCTAssert(app.staticTexts["Text from the network"].exists) // works

Il semble que si j'appelle simplement exists, il l'évalue immédiatement et échoue car le texte n'a pas encore été téléchargé du réseau. Mais je pense que lorsque j'appelle la méthode tap(), il attend que le texte apparaisse.

Existe-t-il un meilleur moyen de vérifier la présence d'un texte envoyé depuis le réseau?

Quelque chose comme (ce code ne fonctionnera pas):

XCTAssert(app.staticTexts["Text from the network"].eventuallyExists)
18
Evgenii

Xcode 7 Beta 4 a ajouté la prise en charge native des événements asynchrones. Voici un exemple rapide sur la façon d’attendre l’apparition d’une UILabel.

XCUIElement *label = self.app.staticTexts[@"Hello, world!"];
NSPredicate *exists = [NSPredicate predicateWithFormat:@"exists == 1"];

[self expectationForPredicate:exists evaluatedWithObject:label handler:nil];
[self waitForExpectationsWithTimeout:5 handler:nil];

Commencez par créer une requête pour attendre une étiquette avec le texte "Hello, world!" apparaître. Le prédicat correspond quand l'élément existe (element.exists == YES). Ensuite, transmettez le prédicat et évaluez-le par rapport à l'étiquette.

Si cinq secondes se sont écoulées avant que les attentes ne soient satisfaites, le test échouera. Vous pouvez également attacher un bloc de gestionnaire appelé qui est appelé lorsque les attentes échouent ou expirent.

Si vous recherchez plus d'informations sur les tests d'interface utilisateur en général, consultez Tests d'interface utilisateur dans Xcode 7 .

29
Joe Masilotti

XCode9 a une méthode waitForExistence (timeout: TimeInterval) of XCUIElement

extension XCUIElement {
    // A method for tap element
    @discardableResult
    func waitAndTap() -> Bool {
        let _ = self.waitForExistence(timeout: 10)
        let b = self.exists && self.isHittable
        if (b) {
            self.tap()
        }
        return b
    }
}

// Ex:
if (btnConfig.waitAndTap() == true) {
    // Continue UI automation
} else {
    // `btnConfig` is not exist or not hittable.
}

Mais je rencontre un autre problème, le element est exister, mais pas hittable. J'étends donc une méthode pour attendre qu'un élément soit cliquable.

extension XCTestCase {
    /// Wait for XCUIElement is hittable.
    func waitHittable(element: XCUIElement, timeout: TimeInterval = 30) {
        let predicate = NSPredicate(format: "isHittable == 1")
        expectation(for: predicate, evaluatedWith: element, handler: nil)
        waitForExpectations(timeout: timeout, handler: nil)
    }
}

// Ex:
// waitHittable(element: btnConfig)
1
AechoLiu

Swift 3:

let predicate = NSPredicate(format: "exists == 1")
let query = app!.staticTexts["identifier"]
expectation(for: predicate, evaluatedWith: query, handler: nil)
waitForExpectations(timeout: 5, handler: nil)

Il vérifiera continuellement pendant 5 secondes si ce texte est affiché ou non.

Dès qu'il trouvera le texte en moins de 5 secondes, il exécutera du code supplémentaire.

0
Aditya Malviya

Si je comprends bien que le texte cible est déjà affiché lorsque vous vérifiez qu'il existe, vous pouvez utiliser la propriété hittable.

0
Yulia