2013-05-10 9 views
5

Ich verwende die KIF Framework für die funktionale UI-Tests. Angenommen, ich befinde mich auf einem aktuellen iPad-Bildschirm, auf dem vielen Ansichten (Beschriftungen, Schaltflächen, Textfelder usw.) eindeutige Zugriffsetiketten zugewiesen sind. Wenn ich die accessibilityLabel Zeichenfolge handlich habe, kann ich einen Verweis auf die damit verbundenen UIView vom aktuellen Bildschirm mit ihm bekommen?Get UIVIew von accessibilityLabel für KIF-Automatisierung

Zum Beispiel gibt [[UIView alloc] viewWithTag:5]UIVIew von bereitgestellten tag zurück. Ich suche nach etwas wie [[UIView alloc] viewWithAccessiblityLabel:@"my label"].

S.S: Ich weiß, dass die Brute-Force-Methode wäre, alle Ansichten in self_nviews rekursiv zu durchlaufen und Barrierefreiheit zu vergleichen, um herauszufinden, nach was ich suche. Ich suche nach einem besseren Ansatz.

+0

Sie können "UIView" in Ihren 'Custom' Klassen" unterordnen ". –

+0

Die einzige Möglichkeit zu tun, was Sie wollen, besteht darin, die Subviews zu durchlaufen und zu überprüfen. Diese Art von Verhalten bedeutet wahrscheinlich, dass Sie schlechtes Design in Ihrer Klasse haben. Alles, auf was Sie später noch zurückgreifen müssen, könnte in einer Eigenschaft oder, wenn es dynamisch erstellt wird, in einem NSDictionary gespeichert werden, das als Eigenschaft gespeichert ist. –

Antwort

9

Ich benutze KIF für UI-Automatisierung! Hier sind die Schritte, um die Ansicht von gegebener AccessibilityLabel zu bekommen. Die Methode viewContainingAccessibilityElement:element ist eine Erweiterungsmethode für die UIAccessibilityElement-Klasse.

UIAccessibilityElement *element = [[[UIApplication sharedApplication] keyWindow] accessibilityElementWithLabel:label]; 
UIView *view = (UIView*)[UIAccessibilityElement viewContainingAccessibilityElement:element]; 
+2

Ich habe soeben 'keyWindow' hinzugefügt' [[[UIApplication sharedApplication] keyWindow] accessibilityElementWithLabel: label]; 'und das funktionierte für mich. Vielen Dank! – KKendall

+0

Diese Funktionalität ist in KIF integriert, aber nicht sehr gut erkennbar. Siehe Kommentar von @ duncan-babbage für eine einfachere Lösung. –

2

Es klingt für mich (aus Ihrem Kommentar: "Ich brauche diese Funktionalität in der Automatisierung von UI-Tests"), wie Sie für die accessibilityIdentifier suchen. Aus der Dokumentation:

Das Protokoll UIAccessibilityIdentification wird verwendet, um eine eindeutige ID mit Elementen in Ihrer Benutzerschnittstelle zu verknüpfen. Sie können die IDs verwenden, die Sie in UI-Automatisierungsskripten definieren, da der Wert accessibilityIdentifier dem Rückgabewert der name-Methode von entspricht.

+0

Danke David. Das ist nützlich, aber das KIF-Automatisierungsframework, das ich verwende, basiert auf dem Accessibility-Label, also muss ich es verwenden. – applefreak

+0

Beachten Sie, dass KIF nachträglich die Möglichkeit hinzugefügt hat, Elemente auch mit accessibilityIdentifier zu targetieren. –

10

Es ist eigentlich eine unglaublich einfache Art und Weise zu erreichen, was Sie beschreiben, wenn KIF für UI-Automatisierung verwenden, obwohl KIF es nicht offensichtlich, dass dies möglich ist. waitForViewWithAccessibilityLabel gibt einen Verweis auf die Ansicht, wenn es gefunden wird:

Swift

let view = tester().waitForView(WithAccessibilityLabel: "My label") 

Objective-C

UIView *view = [tester waitForViewWithAccessibilityLabel:@"My label"]; 

Hugely nützlich, einmal entdeckt.

+0

Das hat super funktioniert! –

+0

, aber es schlägt fehl, wenn die Ansicht nicht existiert. Gibt es eine Möglichkeit, danach zu fragen und NICHT zu versagen, wenn sie nicht gefunden wird? – zaxy78

+0

Mir ist keine Möglichkeit bekannt, nach der Ansicht zu fragen, aber sie wird nicht fehlschlagen, wenn sie nicht gefunden wird. Wie Sie offensichtlich festgestellt haben, wird "waitForViewWithAccessibiltyLabel" eine Zeitüberschreitung verursachen, wenn die Ansicht nicht vorhanden ist. Dies ist ein Nachteil dieses Ansatzes. –

Verwandte Themen