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
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()
}
}
}
Pour moi, la cause principale était que les objets que je voulais exploiter
Dans les deux cas, la propriété isAccessibilityElement
était false
par la suite. Le remettre à true
l'a corrigé.
Dans mon cas, il s'agissait d'un élément d'interface utilisateur ajouté par programmation couvrant le bouton.
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.
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.
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.
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.