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
xcode
xcode7
xcode-ui-testing
Vinpai
quelle
quelle
app.tables.cells.allElementsBoundByAccessibilityElement.count
bevor Sie auf Ihre Schaltfläche tippen? Nur neugierig - das hat mir manchmal geholfen, den Bildschirm zu "aktualisieren".Antworten:
Ich denke, hier kehrt die Schaltfläche "Abbrechen"
false
für diehittable
Eigenschaft 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() } } }
quelle
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 konnteself.app.navigationBars["Nav Title"].staticTexts["Custom Back Btn Title"].forceTapElement()
let coordinate: XCUICoordinate = self.coordinateWithNormalizedOffset(CGVectorMake(0.5, 0.5))
Für mich war die Hauptursache, dass die Objekte, auf die ich tippen wollte
In beiden Fällen war die
isAccessibilityElement
Immobiliefalse
danach. Zurücksetzen, um das Problem zutrue
beheben.quelle
Ich fand, dass dieses Problem auf das
XCElement
vorhandene 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)
quelle
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
quelle
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.
quelle
In meinem Fall hatte es ein programmgesteuert hinzugefügtes UI-Element, das die Schaltfläche abdeckte.
quelle
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.
quelle
Im Geiste der Dinge, die Ihr Element abdecken können, habe ich den RN-Debugger teilweise über mein Symbol gelegt:
quelle