2013-05-10 19 views
5

Używam KIF Framework do testowania funkcjonalnych interfejsów użytkownika. Załóżmy, że jestem na bieżącym ekranie iPada, na którym wiele widoków (etykiet, przycisków, pól tekstowych itp.) Ma przydzielone unikalne etykiety dostępności. Jeśli mam pod ręką ciąg accessibilityLabel, czy mogę uzyskać odniesienie do powiązanego UIView z bieżącego ekranu, używając go?Uzyskaj UIVIew z accessibilityLabel dla automatyzacji KIF

Na przykład [[UIView alloc] viewWithTag:5] zwraca UIVIew z podanego tag. Szukam czegoś takiego jak [[UIView alloc] viewWithAccessiblityLabel:@"my label"].

P.S: Wiem, że metoda brute-force polegałaby na rekursywnym przeglądaniu wszystkich widoków w self.subviews i porównywaniu etykiety dostępności, aby znaleźć to, czego szukam. Szukam lepszego podejścia.

+0

można "podklasy" 'UIView' w ur' Niestandardowe 'klasy .. –

+0

Jedynym sposobem na zrobienie tego, co chcesz, jest iterowanie przez subviews i sprawdzanie. Ten typ zachowania prawdopodobnie oznacza, że ​​masz słabe wzornictwo w swojej klasie. Wszystko, co będzie potrzebne do późniejszego odniesienia, może być przechowywane w nieruchomości lub jeśli jest tworzone dynamicznie w NSDictionary, który jest przechowywany jako właściwość. –

Odpowiedz

9

Używam automatyzacji interfejsu użytkownika za pomocą KIF! Oto kroki, aby uzyskać widok z podanej accessibilityLabel. Metoda viewContainingAccessibilityElement:element jest metodą rozszerzenia do klasy UIAccessibilityElement.

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

Właśnie dodałem 'keyWindow' podobny do tego' [[[UIApplication sharedApplication] keyWindow] accessibilityElementWithLabel: label]; 'i to działało dla mnie. Dzięki! – KKendall

+0

Ta funkcja jest wbudowana w KIF, ale nie jest wykrywalna. Zobacz komentarz @ duncan-babbage dla łatwiejszego rozwiązania. –

2

To brzmi dla mnie (z Twojego komentarza: "Potrzebuję tej funkcji w automatyzacji testów interfejsu użytkownika"), tak jakbyś szukał accessibilityIdentifier. Z dokumentacji:

Protokół UIAccessibilityIdentification służy do powiązania unikalnego identyfikatora z elementami w interfejsie użytkownika. Możesz użyć identyfikatorów zdefiniowanych w skryptach automatyzacji interfejsu użytkownika, ponieważ wartość accessibilityIdentifier odpowiada wartości zwracanej metody name z UIAElement.

+0

Dzięki David. Jest to użyteczne, ale framework automatyzacji KIF, którego używam, jest oparty na etykiecie ułatwień dostępu, więc muszę z niego korzystać. – applefreak

+0

Zauważ, że KIF dodało następnie możliwość kierowania elementów także przez accessibilityIdentifier. –

10

Jest rzeczywiście bardzo prosty sposób, aby osiągnąć to, co można opisać przy użyciu KIF do automatyzacji UI, choć KIF nie czyni to oczywiste, że jest to możliwe. waitForViewWithAccessibilityLabel zwraca odniesienie do widoku gdy stwierdzono:

Swift

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

Cel C

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

Niezwykle użyteczne, gdy wykryte.

+0

To działało świetnie! –

+0

, ale nie powiedzie się, jeśli widok nie istnieje. czy jest jakiś sposób, aby o to zapytać, a NIE NIE zawieść, jeśli nie zostanie znaleziony? – zaxy78

+0

Nie jestem świadomy sposobu, aby poprosić o widok, ale niech nie zawiedzie, jeśli nie zostanie znaleziony, a jak widać, "waitForViewWithAccessibiltyLabel" będzie limit czasu, powodując niepowodzenie testu, jeśli widok nie jest obecny. Jest to wadą tego podejścia. –