2013-02-13 11 views
6

Po prostu chcę przetestować mój interfejs użytkownika iOS za pomocą funkcji UI Automation, ale utknąłem, gdy trzeba wprowadzić tekst do UITextFields. Dokumentacja mówi, że metoda "setValue (...)" powinna wystarczyć, ale tak nie jest.Automatyzacja "Instrument" iOS Instruments nie działa

zawsze uzyskać ten błąd:

Script threw an uncaught JavaScript error: Unexpected error in -[UIATextField_0x9952690 setValue:], /SourceCache/UIAutomation_Sim/UIAutomation-271/Framework/UIAElement.m line 1142, kAXErrorSuccess on line 15 of login.js, #0 setValue() 

Kod wygląda następująco:

var textfields = UIATarget.localTarget().frontMostApp().mainWindow().textFields(); 
username = textfields["username"]; 
username.setValue("test"); 

pola nazwa użytkownika nie jest null lub undefined.

Drugie rozwiązanie było ten projekt JS: https://github.com/alexvollmer/tuneup_js#readme Ma „typeString” metodę pól tekstowych, ale to jest trochę buggy i nie, jeśli chodzi o wprowadzanie cyfr i liter.

Pracuję z iOS6.1, Instruments Wersja 4.6 (46000), Wersja Xcode 4.6 (4H127).

Każda pomoc jest doceniana!

+0

Hmm. Jestem w stanie ustawić wartość pól tekstowych w mojej aplikacji z automatycznym interfejsem użytkownika. Twój kod automatyzacji wygląda poprawnie. Podejrzewam, że coś jest nie tak w świecie Celu C. Czy używasz niestandardowej podklasy 'UITextField'? Czy możesz zbudować fałszywą aplikację z jednym polem tekstowym i spróbować ustawić wartość tego pola na swoim komputerze? To może pomóc w odnalezieniu problemu. –

+1

W innych projektach działa funkcja "setValue()". Myślę, że przyczyną problemu jest niedokończona animacja. gdy użytkownik dotknie pola tekstowego, podstawowy widok zostanie przewinięty do góry, aby był widoczny po wyświetleniu klawiatury. "target.delay (1)" robi to, czego szukałem, a teraz działa funkcja "setValue()". – ralphbert

Odpowiedz

10

Sprawdź, czy poniżej Ci odpowiada,

target.delay (1); UIATarget.localTarget(). FrontMostApp(). MainWindow(). TextFields() ["username"] dotknij(); target.delay (1); UIATarget.localTarget(). FrontMostApp(). MainWindow(). TextFields() ["username"]. SetValue ("test");

sprawdzić prawidłowe hierarchii jeśli to nie działa dla Ciebie ..

+0

Wygląda na to, że "target.delay (1)" poradził sobie. Twój kod działa dobrze dla mnie, dziękuję! – ralphbert

0

Przyjechałem tu stara się zrozumieć, jak działa UI Automation skryptowy, co dokumentacja i przykładowy kod tam jest naprawdę brakuje (lub pisemne z bardzo konkretny punkt widzenia, który nie wyjaśnia wszystkich przypadków).

Oto dwie rzeczy na ten temat dowiedziałem:

  1. Przede wszystkim ty musi umożliwić Accessibility na elemencie. Zablokowałem to w moich próbach i rzeczy zachowywały się bardzo dziwnie, dopóki nie włączyłem go ponownie (otrzymując podobny "nieoczekiwany błąd" jak ty). Dlatego upewnij się, że masz włączoną funkcję ułatwień dostępu. Ale pamiętaj, że niektóre rzeczy nadal działają z wyłączoną. Na przykład wciąż możesz wyszukać element po jego nazwie (accessibilityIdentifier), ale nie będziesz mógł go dotknąć ani zadzwonić pod numer setValue().

enter image description here

  1. Trzeba kopać przez hierarchii aplikacji. Zakładam, że podanie elementu o wartości accessibilityIdentifier pozwoli mi po prostu wyszukać element z takim identyfikatorem, jak kod HTML getElementById. Ale to wcale nie jest takie, jak w . Musisz przekopać się przez poziom hierarchii według poziomu, nawet przy użyciu accessibilityIdentifier. Na szczęście możesz użyć UIAElement.logElementTree(), aby uzyskać wskazówki dotyczące prawidłowej hierarchii.

Do tej pory nie jestem pod wrażeniem tych ram, ale powoli robię postępy.