2010-09-06 10 views
14

Próbuję przetestować obecność UIAlertView z UIAutomation, ale mój handler nigdy nie zostanie wywołana.Obsługa Alert z UIAutomation

Na początku mojego javascript napisać:

UIATarget.onAlert = function onAlert(alert) { 
    UIALogger.logMessage("alertShown"); 
    return false; 
} 

jak rozumiem, jak tylko mogę określić moje funkcję onAlert, powinien on uzyskać wywołana, gdy pojawi się alertView podczas moich testów. Więc ja uruchomić test, który pokazuje alertView, tutaj jest kod, który pokazuje alert:

UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:message message:nil delegate:self cancelButtonTitle:nil otherButtonTitles:@"OK", nil]; 
alertView.accessibilityLabel = @"alerte d'avertissement"; 
[alertView show]; 

uruchomić mój test w instrumentach, alert pojawia się, ale mój obsługi nigdy nie jest wywoływana. Czy ktoś był w stanie używać programów obsługi zdarzeń z UIAutomation?

Dzięki, Vincent.

Odpowiedz

19

Dokumentacja wydaje się być błędna. Okazuje się, że alerty są obsługiwane w tym samym wątku, który skrypt próbuje uruchomić. Więc jeśli chcesz nieczysto obsługi nazywać, trzeba spać, np

UIATarget.onAlert = { ... } 
window.buttons().triggerAlertButton.tap(); 
UIATarget.localTarget().delay(4); 

Ponadto, wydaje się, że nazwa i wartość alercie są zawsze ustawione na null. Byłem jednak w stanie uzyskać dostęp do pierwszego statycznego tekstu, który zawierał tytuł alarmu.

+0

W wielu przypadkach, gdy element ma żadnej nazwy, ale ma określony tekst statyczny wewnątrz, tekst ten może być używane jak własność nazwy ... dla mnie, które działało na przyciski, widoki, tabele ... – yoosiba

+2

cześć, mam również ten sam problem. możesz mi powiedzieć, jak uzyskać statyczny tekst z alertu? z góry dzięki – cancerian

+1

@cancerian wewnątrz funkcji zwrotnej 'onAlert', spróbuj' alert.logElementTree() '. Stamtąd widzę, że 'alert.name()' to jego 'tytuł' i' alert.elements() [2] .name() 'to jego' message'. – ma11hew28

0

Miałem także problem "nigdy nie nazywał się alertem". Po prostu ponowne uruchomienie instrumentów Apple rozwiązało to dla mnie :-).

4

Poniższy kod działa dla mnie. Funkcja obsługuje alarm, a na dziennikach drukowane jest "alert Wyświetlany".

var target = UIATarget.localTarget(); 
var application = target.frontMostApp(); 
var window = application.mainWindow(); 

UIATarget.onAlert = function onAlert(alert){ 
    UIALogger.logMessage("alert Shown");  
} 

target.frontMostApp().mainWindow().tableViews()[0] 
    .cells()["Fhgui"].buttons()["Images"].tap(); 
// Alert detected. Expressions for handling alerts 
// should be moved into the UIATarget.onAlert function definition. 
target.frontMostApp().alert().defaultButton().tap(); 
6

Upewnij się, że skrypt automatyzacji interfejsu użytkownika wciąż działa po wyświetleniu UIAlertView.

Na przykład dodanie następującego wiersza na końcu skryptu spowoduje, że będzie on działał, dopóki alert nie stanie się dostępny lub nie upłynie okres prolongaty dla rozstrzygnięcia obiektu.

// Wait for UIAlert to appear so that UIATarget.onAlert gets called. 
target.frontMostApp().alert(); 

Pomyślałem dokładnie to przez czytanie & zrozumienia Instruments User Guide: Automating UI Testing, który gorąco polecam to zrobić jako wprowadzenie do UI Automation.

mogą być również pomocne w celu dokonania przeglądu UIATarget Class Reference konkretnie metody popTimeout, pushTimeout, setTimeout, timeout i delay.

+0

Naprawiłem mój problem. Wywołanie '.alert()' spowoduje odczekanie do 5 sekund (domyślnie konfigurowane za pomocą 'target.setTimeout'). –

0

np. - onAlert nie jest wywoływana

var target = UIATarget.localTarget(); 
target.buttons()["ShowAlert"].tap() 
UIAtarget.onAlert = function onAlert(alert) 
{...} 

-

np - onAlert nazywa

var target = UIATarget.localTarget(); 
UIAtarget.onAlert = function onAlert(alert) 
{......} 
target.buttons()["ShowAlert"].tap() 

lub

#import "onAlert.js" 
var target = UIATarget.localTarget(); 
target.buttons()["ShowAlert"].tap() 

go wypróbować.

3

@vdaubry rozwiązanie jest proste.

Według dokumentacji firmy Apple, jeśli chcesz obsługiwać alerty ręcznie to należy powrócić true zamiast false w onAlert(alert)

UIATarget.onAlert = function onAlert(alert) { 
    UIALogger.logMessage("alertShown"); 
    return true; 
} 

@Drew Crawford opóźnienia nie będzie działać, ponieważ domyślnie może kliknięciu przycisku przez UI Automatyzacja. Dokumentacja nie jest zła, ale nie jest jasno wyjaśniona.

0

następujący fragment działa na mnie na XCode 6.3.1 & Instruments (6.3.1 (6D1002)):

var target = UIATarget.localTarget(); 

    // Following line shows an internal alert with 'Cancel' & 'Continue' buttons 
    target.frontMostApp().mainWindow().buttons()["ShowAlert"].tap(); 

    // Handle an internal alert 
    UIATarget.onAlert = function onAlert(alert) { 
      return true; 
    } 

    // Perform Tap on alert. 
    target.frontMostApp().alert().buttons()["Continue"].tap();