web-dev-qa-db-fra.com

Test de l'interface utilisateur Xcode - Échec de test de l'interface utilisateur - Échec de l'affichage en visible (par l'action de l'AXE) lorsque vous tapez sur le bouton "Annuler" du champ de recherche

J'essaie de fermer le champ de recherche en appuyant sur le bouton "Annuler" dans la barre de recherche.

Le scénario de test ne parvient pas à trouver le bouton d'annulation. Cela fonctionnait bien dans Xcode 7.0.1

J'ai ajouté le prédicat pour attendre que le bouton apparaisse. Le scénario de test échoue lorsque nous tapons sur le bouton "annuler"

let button = app.buttons[“Cancel”]
let existsPredicate = NSPredicate(format: "exists == 1")

expectationForPredicate(existsPredicate, evaluatedWithObject: button, handler: nil)
waitForExpectationsWithTimeout(5, handler: nil)

button.tap() // Failing here

journaux :

    t =     7.21s     Tap SearchField
t =     7.21s         Wait for app to idle
t =     7.29s         Find the SearchField
t =     7.29s             Snapshot accessibility hierarchy for com.test.mail
t =     7.49s             Find: Descendants matching type SearchField
t =     7.49s             Find: Element at index 0
t =     7.49s             Wait for app to idle
t =     7.55s         Synthesize event
t =     7.84s         Wait for app to idle
t =     8.97s     Type '[email protected]' into
t =     8.97s         Wait for app to idle
t =     9.03s         Find the "Search" SearchField
t =     9.03s             Snapshot accessibility hierarchy for com.test.mail
t =     9.35s             Find: Descendants matching type SearchField
t =     9.35s             Find: Element at index 0
t =     9.36s             Wait for app to idle
t =     9.42s         Synthesize event
t =    10.37s         Wait for app to idle
t =    10.44s     Check predicate `exists == 1` against object `"Cancel" Button`
t =    10.44s         Snapshot accessibility hierarchy for com.test.mail
t =    10.58s         Find: Descendants matching type Button
t =    10.58s         Find: Elements matching predicate '"Cancel" IN identifiers'
t =    10.58s     Tap "Cancel" Button
t =    10.58s         Wait for app to idle
t =    10.64s         Find the "Cancel" Button
t =    10.64s             Snapshot accessibility hierarchy for com.test.mail
t =    10.78s             Find: Descendants matching type Button
t =    10.78s             Find: Elements matching predicate '"Cancel" IN identifiers'
t =    10.79s             Wait for app to idle
t =    11.08s         Synthesize event
t =    11.13s             Scroll element to visible
t =    11.14s             Assertion Failure: UI Testing Failure - Failed to scroll to visible (by AX action) Button 0x7f7fcaebde40: traits: 8589934593, {{353.0, 26.0}, {53.0, 30.0}}, label: 'Cancel', error: Error -25204 performing AXAction 2003
62
Vinpai

Je suppose que le bouton "Annuler" ici renvoie false pour la propriété hittable, ce qui l’empêche de toucher.

Si vous voyez tap() dans la documentation, il est indiqué

/*!
 * Sends a tap event to a hittable point computed for the element.
 */
- (void)tap;

Il semble que les choses soient cassées avec XCode 7.1. Pour me garder (et vous aussi;)) débloqué de ces problèmes, j’ai écrit une extension sur XCUIElement qui permet d’appuyer sur un élément même s’il n’est pas cliquable. Suivre peut vous aider.

/*Sends a tap event to a hittable/unhittable element.*/
extension XCUIElement {
    func forceTapElement() {
        if self.hittable {
            self.tap()
        }
        else {
            let coordinate: XCUICoordinate = self.coordinateWithNormalizedOffset(CGVectorMake(0.0, 0.0))
            coordinate.tap()
        }
    }
}

Maintenant, vous pouvez appeler comme

button.forceTapElement()

Mise à jour - Pour Swift 3, utilisez ce qui suit:

extension XCUIElement {
    func forceTapElement() {
        if self.isHittable {
            self.tap()
        }
        else {
            let coordinate: XCUICoordinate = self.coordinate(withNormalizedOffset: CGVector(dx:0.0, dy:0.0))
            coordinate.tap()
        }
    }
}
106
Sandy

Pour moi, la cause principale était que les objets que je voulais exploiter 

  • ont été mis à caché (et retour)
  • ont été enlevés et ré-attachés 

Dans les deux cas, la propriété isAccessibilityElement était false par la suite. Le remettre à true l'a corrigé.

8
dogsgod

S'il vous plaît vérifier le trait de l'élément, je faisais face au même problème avec TableViewSectionHeader, j'essayais d'exploiter mais il a échoué à chaque point

 enter image description here

1
Nagaraj

Dans mon cas, il s'agissait d'un élément d'interface utilisateur ajouté par programmation couvrant le bouton. 

0
PruitIgoe

Si vous utilisez le simulateur AppCenter pour exécuter les tests, vous devez vous assurer de les exécuter sur la même version de périphérique que votre simulateur local. J'ai perdu 3 jours de travail à cause de cela.

0
fdelam

J'ai trouvé que ce problème était dû à la XCElement existante, mais était cachée derrière le clavier du logiciel. L'erreur est émise par le framework car il ne peut pas faire défiler une vue existante dans la vue pour pouvoir être exploitable. Dans mon cas, le bouton en question était derrière le clavier du logiciel parfois .

J'ai trouvé que le clavier du logiciel iOS Simulator pouvait être désactivé dans certains cas (par exemple: sur votre ordinateur) et activé dans d'autres (par exemple: sur votre CI). Dans mon cas, j'avais désactivé le clavier du logiciel sur une machine et par défaut, il était activé sur d'autres.

Fermez le clavier avant d’essayer d’appuyer sur les boutons éventuellement situés derrière lui.

J'ai trouvé taper quelque part qui excluait explicitement le clavier avant d'appuyer sur le bouton résolvait mon problème dans tous les environnements.

J'ai ajouté quelques actions supplémentaires pour que le répondeur actuel renvoie resignFirstResponder. Les vues derrière mes vues textuelles forceront le premier répondant à démissionner. Je tape donc quelque part juste en dessous de la dernière zone de texte.

 /// The keyboard may be up, dismiss it by tapping just below the password field
let pointBelowPassword = passwordSecureTextField.coordinate(withNormalizedOffset: CGVector(dx: 0.5, dy: 1))
pointBelowPassword.press(forDuration: 0.1)

Cette question se classe bien pour les requêtes Google concernant le terme "Échec du défilement du bouton visible (par action AX))" . Étant donné l’âge de la question, j’étais enclin à penser que le cadre XCUITest n’était plus un problème, comme le suggère la réponse acceptée. Quelques essais et erreurs me conduisent à la solution ci-dessus.

0
Jessedc

La solution de rechange de Sandy a semblé être utile pendant un moment, mais ensuite plus - je l'ai ensuite modifiée comme suit:

func waitAndForceTap(timeout: UInt32 = 5000) {
    XCTAssert(waitForElement(timeout: timeout))
    coordinate(withNormalizedOffset: CGVector(dx:0.5, dy:0.5)).tap()
}

Le point principal étant que, comme le problème est que la vérification isHittable lève une exception, je ne fais pas cette vérification du tout et je vais directement aux coordonnées après la découverte de l'élément.

0
Aistė Stikliūtė