web-dev-qa-db-fra.com

Tester si un élément est visible avec XCode 7 UITest

Je souhaite vérifier si un élément est visible ou non en fonction de sa propriété .hidden, mais je ne trouve pas de moyen valable de le faire à l'aide du nouveau matériel de test Xcode 7 UI. 

J'ai essayé avec myelement.exists et myelement.hittable, mais ils ne semblent pas fonctionner comme prévu. Je suppose qu'ils travaillent en conjonction avec la propriété hidden. Un élément caché ne devrait pas exister et n'est pas cliquable ... mais ce n'est pas le comportement actuel (je peux comprendre le comportement exists ... mais un élément caché ne devrait pas être cliché IMO).

Existe-t-il un autre moyen de vérifier la valeur de la propriété "cachée"? 

27
MatterGoal

À partir de Xcode 7.1 Bêta 3, le test d'interface utilisateur ne prend pas en charge la validation de la visibilité d'un élément. Je suggère de déposer un radar pour attirer l'attention nécessaire sur Apple.

Xcode 7.1 a résolu ce problème. hittable vérifie maintenant si l'élément est correct.

27
Joe Masilotti

1) Je teste l'interface utilisateur avec Swift dans Xcode 7.3 et j'utilise à la fois les fichiers .hittable et .exists pour vérifier si une étiquette est masquée ou non, et les deux fonctionnent. Je teste «vrai» et «faux» pour m'assurer que les résultats correspondent bien. 

J'ai une étiquette dont le texte statique est "Track Info" et qui doit être masquée lors du premier chargement de l'application, puis plus tard, j'appuie sur un bouton pour afficher l'étiquette. Voici le résultat une fois que l'étiquette est affichée.

// le test échoue

let trackInfoLabel = app.staticTexts["Track info"]
XCTAssertEqual(trackInfoLabel.exists, true)

XCTAssertEqual(trackInfoLabel.hittable, true)

// test réussi

XCTAssertEqual(trackInfoLabel.exists, false)
XCTAssertEqual(trackInfoLabel.hittable, false)

// test réussi

let trackInfoLabel = app.staticTexts["Track Info"]
XCTAssertEqual(trackInfoLabel.exists, true)

XCTAssertEqual(trackInfoLabel.hittable, true)

// le test échoue

XCTAssertEqual(trackInfoLabel.exists, false)
XCTAssertEqual(trackInfoLabel.hittable, false)

Allumez lorsque j'appuie sur le bouton pour masquer l'étiquette, tous les résultats sont inversés. Cela confirme que les deux propriétés (hittable et exist) fonctionnent pour le paramètre label.hidden. 

2) Un autre moyen de savoir si un élément est masqué est le suivant: élément.frame.size.width == 0 || element.frame.size.height == 0

9
Ohmy

XCUIElement.hittable fonctionne pour moi (dans mon cas de test particulier où je vérifie la visibilité de plusieurs éléments UIButton) - bien sûr, ce n'est pas une bonne façon de le faire, bien que

3
Andrew Z

Le code suivant a fonctionné pour moi ... à la fin du test, vous pouvez copier le code comme suit: 

while ([app.staticTexts matchingIdentifier:@"accesibilityId"].count > 0) {
        sleep(1);
    }
2
alex1704

Je conviens que hittable ne fonctionne pas toujours pour les boutons (Swift 2.0, XCode 7.2)

Je viens de découvrir que si button est visible, vous pouvez le trouver UNIQUEMENT parmi les boutons, tandis que si le bouton est caché, vous pouvez également trouver sa balise dans staticTexts! 

XCTAssertFalse(app.buttons["Log out"].exists && app.staticTexts["Log out"].exists) // This button is visible (hidden = false)
XCTAssert(app.buttons["Log in"].exists && app.staticTexts["Log in"].exists) // This one is hidden

Hacky, mais fonctionne pour les boutons. Apple devrait simplement introduire .hidden ou .visible ainsi que .hittable et .exists 

0
da-na

Ma solution consiste à ajouter accessibilityIdentifier de manière dynamique

func someMethod() {
    label.isHidden = true
    label. accessibilityIdentifier = "isHidden"
}

func someOtherMethod {
    label.isHidden = false
    label. accessibilityIdentifier = "isVisible"
}

et dans UITest, vous pouvez l'utiliser comme

if app.staticTexts["MyLabel"].identifier == "isHidden" {
    dosomething()
}
0
Randja