2016-04-22 8 views
22

Wenn UI Tests in Xcode (7.2 und 7.3), meine Tests scheitern manchmal mit einem eher allgemeinen Fehlern:Assertionsfehler: UI Testing Ausfall - Ausfall Abrufen Attribute für das Element

Assertion Failure: UI Testing Failure - Failure fetching attributes for element

Ich neige dazu, Erhalten Sie diesen Fehler beim Aufruf .hittable oder .tap() auf ein Element, aber ich kann nicht sagen, warum. Ich habe überprüft, dass die Elemente, mit denen ich es zu tun habe, alle Einstellungen für die Barrierefreiheit korrekt eingerichtet haben und dass alle Containeransichten, in denen sie sich befinden, keine Zugriffsmöglichkeiten haben. Leider scheint dies das Problem nicht zu lösen.

Das Konsolenprotokoll zeigt:

UI Testing Failure - Failure fetching attributes for element <XCAccessibilityElement: 0x7e68ae50> pid: 89032, context: 4D9272C7-3024-4062-B0FA-E16EF426F17A, payload: { 
    pid = 89032; 
    "uid.elementID" = 1432; 
    "uid.elementOrHash" = 2125772976; 
}: Error Domain=XCTestManagerErrorDomain Code=13 "Error copying attributes -25202" UserInfo={NSLocalizedDescription=Error copying attributes -25202} 

Ich habe um versucht, die Suche und schaffte es bereits angemeldet worden zu finden, aber es erscheint 7.3 keine aktuelle Lösung (radar link) auch für Xcode zu sein.

Es scheint, dass manchmal, wenn ich den Simulator/das Gerät neu starten, dieser Fehler nicht passiert, aber das ist keine nette Lösung.

+0

Ich hatte diese auch. Stellen Sie sicher, dass Sie die Erwartungen richtig festlegen, damit Ihre Ansichtshierarchie den Status erreicht, den Sie testen möchten. Dies ist äußerst wichtig beim Testen von asynchronen Ereignissen (d. H. Tippen auf eine Schaltfläche, die nach einem Netzwerkanruf eine Rückmeldung gibt). –

+0

Dies ist Apples Bug, den Sie auch in Apples [link] (https://forums.developer.apple.com/thread/6437) anzeigen können. Hier schlagen einige Leute vor, dass eine Lösung für Sie arbeiten könnte. Wenn eine Lösung für Sie nicht funktioniert, melden Sie Apple einen Fehler. Wir können in einer solchen Situation keine Lösung finden oder finden. – iMHitesh

+1

Ab Xcode 9 können Sie 'waitForExistence (timeout: TimeInterval)' verwenden, um auf die Existenz dieses Elements zu warten. – onmyway133

Antwort

2

Es scheint, als wäre der Automatisierungscode zeitweise zu schnell, und obwohl der Schnappschuss der Zugriffshierarchie Ihr Element enthält, wird Ihre Abfrage zu schnell zur nächsten Anweisung weitergeleitet, und das Framework erhält keine Chance Handeln Sie mit der tap() -Methode, die Sie senden. Ich konnte diesen Fehler minimieren, indem ich Joe Masilottis helper functions verwende, um darauf zu warten, dass Elemente zuerst hitbar sind, und dann einen sleep() hinzufüge, bevor ich auf das fragliche Element tippe. Hoffe, das hilft.

+3

Ja, das ist es, was ich zuerst dachte. Allerdings bekomme ich dieses Problem immer noch, wenn ich Joes nützliche Methoden benutze, kombiniert mit einer scheußlichen, aber liberalen Verwendung von 'sleep()'. Ich denke, dass der Accessibility-Snapshot auf seine Objekte verweist. Ich habe viele Stunden damit verbracht, dies zu betrachten und es scheint, dass es manchmal den Überblick verliert und versehentlich auf das falsche zugrunde liegende UI-Element verweist. Ich habe dies überprüft, indem ich die Speicheradressen von Elementen protokolliert habe und diese im Snapshot angeschaut habe und es gelegentlich falsch interpretiert, was bedeutet, dass 'tap()' für das falsche Element aufgerufen wird, daher der Fehler. – Gordonium

+0

@Gordinium, wenn Sie um diesen Fehler zu archivieren, teilen Sie bitte :) – Citronex

4

Sie können alternativ XCUICoordinate.tap() als Alternative verwenden. Ersetzen Sie beispielsweise button.tap() durch button.coordinateWithNormalizedOffset(CGVector(dx: 0.5, dy: 0.5)).tap().

Ich lief in das gleiche Problem, und die Abhilfe funktioniert für mich.

+0

Nice one. Werde das auch versuchen. Im Moment habe ich Sleep (numberOfSeconds) vor dem Tippen() verwendet. –

3

Ich habe dieses Problem. Es ist nach einem Fix aufgetreten, also habe ich herausgefunden, was das in meinem Fall verursachen könnte.

In meiner App habe ich 'Hauptbildschirm'. Der Inhalt wird vom Server zurückgegeben und auf dem Gerät zwischengespeichert. Dieser Bildschirm führt den Benutzer zu verschiedenen "detaillierten" Bildschirmen. Jedes Mal, wenn der Benutzer vom Detailbildschirm zurückkehrt, wird viewDidAppeare Methode auf dem Hauptbildschirm aufgerufen. In dieser Methode fragt der Hauptbildschirm nach Inhalt. Um den Inhalt bereitzustellen, muss 'Data Manager' entweder von der DB holen oder von Server 2 verschiedene Entitäten in der richtigen Reihenfolge anfordern, so dass er dispatch_group verwendet. Hauptbildschirm empfängt Benachrichtigung über neuen Inhalt von dispatch_group_notify Aufruf, deshalb ist es asynchron. Zu der Zeit, wenn dispatch_group_notify ausgeführt wird, ist viewDidAppeare fertig und, wie ich verstehe, App geht für eine kleine Zeit in den Leerlauf. UI Test Engine hat möglicherweise bereits eine Accessibility-Elemente-Struktur erstellt.

Wenn diese Situation stattfindet und Testcode ruft tap auf ein Element auf dem Hauptbildschirm direkt nach Ansicht erschien, alte Zugänglichkeit Elemente existieren versterben (weil Ansichtshierarchie zu dieser Zeit geändert hat), aber tap Verfahren zum Element aufgerufen wurde mit insbesondere elementID usw., die zu dieser Zeit nicht existiert. Als Ergebnis haben Sie einen Absturz.

+0

'tl; dr' Nicht zu schnell UI-Elemente mit dem gleichen AccessibilityIdentifier austauschen. Wenn Sie eine Schaltfläche erstellt haben, verwenden Sie sie nicht, ersetzen Sie sie nicht. Dies scheint mit Xcode 9 viel strenger zu sein. – arsenius

1

Ich begegnete dies auch. In meinem Fall gibt der Server mehrere Suchabfrageergebnisse in schneller Abfolge zurück.Das Zielelement wird schnell angezeigt, ist jedoch bis zur letzten Abfrage nicht durchgängig hitbar. Ich habe dies gelöst, indem ich zunächst auf die Existenz des Elements in der ersten Abfrage über XCTWaiter gewartet habe. Legen Sie anschließend einen Ruhezustand fest, um die Zeit aller Abfrageergebnisse einzubeziehen, und warten Sie dann, bis das Element hitbar ist. Verwenden Sie hitTable NICHT für das erste Abfrageergebnis, da dies fehlschlagen wird, da hitTable auch prüft, ob Elemente angetippt werden können, aber die Benutzeroberfläche sich zu schnell ändert, damit das Element angetippt werden kann.

Es wäre besser, wenn Sie nur die letzte Abfrage zu Testzwecken oder über die Codebasis auslösen könnten. Ich habe auch überlegt, UIPasteboard zu verwenden, um mehrfache Typeahead-Abfragen zu vermeiden, aber, soweit ich das beurteilen kann, ist dies für XCTest nicht verfügbar.

0

Ich versuchte waitForHittable() von http://masilotti.com/xctest-helpers/, aber in meinem Fall musste ich Schlaf (Sekunden) vor dem Tippen verwenden.

Plus, glaube nicht, dass Joe Masilottis Methoden nutzlos sind. Sie sind großartig und ich habe diese in Erweiterung XCTest und Erweiterung XCUIElement hinzugefügt. Es ist nur so, dass waitForHittable() nicht nur beim ersten Tippen funktionierte, nachdem der Hauptbildschirm meiner App geladen wurde.