Xcode UI-Test - Fehler beim Testen der Benutzeroberfläche - Fehler beim Scrollen zum Sichtbaren (durch AX-Aktion), wenn Sie auf das Suchfeld "Abbrechen" tippen

85

Ich versuche, das Suchfeld durch Tippen auf die Schaltfläche "Abbrechen" in der Suchleiste zu schließen.

Der Testfall findet die Abbrechen-Schaltfläche nicht. In Xcode 7.0.1 hat es einwandfrei funktioniert

Ich habe ein Prädikat hinzugefügt, um darauf zu warten, dass die Schaltfläche angezeigt wird. Der Testfall schlägt fehl, wenn wir auf die Schaltfläche "Abbrechen" tippen

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

Protokolle :

    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
Vinpai
quelle
@ Joe Masilotti eine Idee?
Vinpai
Nur eine Überprüfung der geistigen Gesundheit, aber befindet sich die Schaltfläche Abbrechen auf dem Bildschirm oder muss ein Bildlauf durchgeführt werden? Ich weiß, dass es immer noch Probleme gibt, bei denen das Scrollen zu Elementen nicht immer funktioniert.
Joe Masilotti
Die Schaltfläche zum Abbrechen von @JoeMasilotti wird auf dem Bildschirm angezeigt. Die Schaltfläche Abbrechen ist die Systemstandardschaltfläche, die Teil der UISearchbar ist. Es funktionierte gut in Xcode 7.0.1, als ich [self.buttons [@ "Cancel"] tippte];
Vinpai
1
@Vinpai Was passiert, wenn Sie ein hinzufügen, app.tables.cells.allElementsBoundByAccessibilityElement.countbevor Sie auf Ihre Schaltfläche tippen? Nur neugierig - das hat mir manchmal geholfen, den Bildschirm zu "aktualisieren".
Kuchen88
@Konnor, ich habe es mit der von Ihnen vorgeschlagenen API versucht, aber es schlägt fehl, wenn ich auf die Schaltfläche Abbrechen tippe. Wenn ich application.buttons im Debugger
abfrage

Antworten:

140

Ich denke, hier kehrt die Schaltfläche "Abbrechen" falsefür die hittableEigenschaft zurück, wodurch verhindert wird, dass sie getippt wird.

Wenn Sie tap()in der Dokumentation sehen, heißt es

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

Es scheint, dass mit XCode 7.1 die Dinge kaputt sind. Um mich (und dich auch;)) von diesen Problemen freizuhalten, habe ich eine Erweiterung geschrieben XCUIElement, die das Tippen auf Elemente ermöglicht, auch wenn es nicht schlagbar ist. Folgendes kann Ihnen helfen.

/*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()
        }
    }
}

Jetzt können Sie als anrufen

button.forceTapElement()

Update - Für Swift 3 verwenden Sie Folgendes:

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()
        }
    }
}
Sandig
quelle
Danke für die Fehlerbehebung. Ich hatte ein ähnliches Problem mit cell.tap()und dies hat es behoben. In Xcode7.1 scheint sich etwas geändert zu haben, was dazu führte, dass ein Element nicht mehr getroffen werden konnte
francisOpt
Ich habe eine benutzerdefinierte Navigationsleiste backButtonItem, die in Xcode7.1 nicht "schlagbar" ist, und diese Lösung funktioniert für michself.app.navigationBars["Nav Title"].staticTexts["Custom Back Btn Title"].forceTapElement()
Alex
Danke - Ich habe für mein Problem gearbeitet.
Tache
7
In meinem Fall hat es funktioniert, wenn sich der Hahn in der Mitte der Ansicht befindet. Ändern Sie den Offset auf (0,5, 0,5). let coordinate: XCUICoordinate = self.coordinateWithNormalizedOffset(CGVectorMake(0.5, 0.5))
Graham Perks
1
Gute Arbeit. Ich fing fast an, mein Macbook zu töten, bevor ich das sah.
ChaosSpeeder
11

Für mich war die Hauptursache, dass die Objekte, auf die ich tippen wollte

  • wurden auf versteckt (und zurück) gesetzt
  • wurden entfernt und wieder angebracht

In beiden Fällen war die isAccessibilityElementImmobilie falsedanach. Zurücksetzen, um das Problem zu truebeheben.

Hundegott
quelle
3
Das war genau mein Problem. Seltsamerweise begann es unter iOS 11 (es funktionierte gut unter iOS 10).
Ricardo Sanchez-Saez
4

Diese Frage eignet sich gut für Google-Abfragen zum Begriff "Bildlauf zum sichtbaren Button (durch AX-Aktion) fehlgeschlagen" . Angesichts des Alters der Frage war ich geneigt zu glauben, dass dies kein Problem mehr mit dem XCUITest-Framework ist, wie die akzeptierte Antwort nahelegt.

Ich fand, dass dieses Problem auf das XCElementvorhandene zurückzuführen war, aber hinter der Software-Tastatur versteckt war. Der Fehler wird vom Framework ausgegeben, da es nicht in der Lage ist, eine vorhandene Ansicht in eine Ansicht zu scrollen, um sie abzutippen. In meinem Fall befand sich die betreffende Schaltfläche manchmal hinter der Softwaretastatur .

Ich habe festgestellt, dass die Softwaretastatur des iOS-Simulators in einigen Fällen (z. B. auf Ihrem Computer) und in anderen Fällen (z. B. auf Ihrem CI) möglicherweise ausgeschaltet ist. In meinem Fall hatte ich die Softwaretastatur auf einem Computer ausgeschaltet, und auf anderen war sie standardmäßig eingeschaltet.

Lösung: Schließen Sie die Tastatur, bevor Sie versuchen, auf die möglicherweise dahinter liegenden Tasten zu tippen.

Ich fand, dass das Tippen an einer Stelle, an der die Tastatur explizit geschlossen wurde, bevor ich auf die Schaltfläche tippte, mein Problem in allen Umgebungen löste.

Ich habe einige Aktionen hinzugefügt, um den aktuellen Responder zu resignFirstResponder zu bringen. Die Ansichten hinter meinen Textansichten zwingen den Ersthelfer zum Rücktritt, daher tippe ich irgendwo direkt unter dem letzten Textbereich.

 /// 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)
Jessedc
quelle
2

Bitte überprüfen Sie die Eigenschaft des Elements. Ich hatte das gleiche Problem mit TableViewSectionHeader. Ich habe versucht zu tippen, aber es ist an jedem Punkt fehlgeschlagen

Geben Sie hier die Bildbeschreibung ein

Nagaraj
quelle
1

Die Problemumgehung von Sandy schien für eine Weile hilfreich zu sein, aber dann nicht mehr - ich habe es dann so geändert:

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

Der Hauptpunkt ist, dass das Problem darin besteht, dass isHittable check eine Ausnahme auslöst. Ich mache diese Prüfung überhaupt nicht und gehe direkt nach Koordinaten, nachdem das Element gefunden wurde.

Aistė Stikliūtė
quelle
0

In meinem Fall hatte es ein programmgesteuert hinzugefügtes UI-Element, das die Schaltfläche abdeckte.

PruitIgoe
quelle
0

Wenn Sie den AppCenter-Simulator zum Ausführen der Tests verwenden, sollten Sie sicherstellen, dass Sie die Tests auf derselben Geräteversion wie Ihr lokaler Simulator ausführen. Ich habe dadurch 3 Arbeitstage verloren.

fdelam
quelle
0

Im Geiste der Dinge, die Ihr Element abdecken können, habe ich den RN-Debugger teilweise über mein Symbol gelegt:

Geben Sie hier die Bildbeschreibung ein

Jeroen Vannevel
quelle