2010-09-06 9 views
14

Estoy intentando probar la presencia de un UIAlertView con UIAutomation, pero nunca se llama a mi controlador.Manipulación de alertas con UIAutomation

Al comienzo de mi javascript que escribo:

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

como yo lo entiendo, tan pronto como especificar la función onAlert, debe ser llamado cuando un alertView aparece durante mis pruebas. Así que corro una prueba que muestra un alertView, aquí está el código que muestra la alerta:

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

corro mi prueba de instrumentos, la alerta se muestra arriba, pero mi manejador nunca es llamado. ¿Alguien ha podido usar controladores de eventos con UIAutomation?

Gracias, Vincent.

Respuesta

19

La documentación parece estar equivocada. Resulta que las alertas se manejan en el mismo hilo que su script intenta ejecutar. Así que si desea que el controlador de alerta que se llama, tiene que dormir, por ejemplo,

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

Además, parece que el nombre y el valor de la alerta se establece siempre en null. Sin embargo, pude acceder al primer texto estático que contenía el título de la alerta.

+0

En muchos casos cuando el elemento no tiene nombre especificado, pero tiene texto estático en el interior, este texto puede ser usado como propiedad de nombre ... para mí que funcionó para botones, vistas, tablas ... – yoosiba

+2

hola, también estoy teniendo el mismo problema. ¿Puedes decirme cómo obtienes el txt estático de alertview? gracias de antemano – cancerian

+1

@cancerian dentro de la función de devolución de llamada 'onAlert', intente' alert.logElementTree() '. Desde allí, veo que 'alert.name()' es su 'title' y' alert.elements() [2] .name() 'es su' mensaje'. – ma11hew28

0

Estaba teniendo el problema de "nunca llamé al manejador de alertas" también. Simplemente reiniciando Apple's Instruments lo resolvió para mí :-).

4

El siguiente código funciona para mí. La función maneja la alerta y se muestra "alerta Mostrada" en los registros.

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

Asegúrese de que el guión de UI Automation sigue en funcionamiento cuando en la pantalla UIAlertView.

Por ejemplo, agregar la siguiente línea al final de su script lo mantendrá activo hasta que se active una alerta o hasta que expire el período de gracia para la resolución del objeto.

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

Me di cuenta de esto mediante la lectura de fondo & entender Instruments User Guide: Automating UI Testing, que recomiendo encarecidamente hacer como una introducción a la interfaz de usuario de automatización.

También puede ser útil revisar el UIATarget Class Reference, específicamente los métodos popTimeout, pushTimeout, setTimeout, timeout, y delay.

+0

Esto solucionó mi problema. Llamar a '.alert()' esperará hasta 5 segundos (de forma predeterminada, configurable con 'target.setTimeout') para que se muestre. –

0

p. Ej. - onAlert no se llama

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

-

por ejemplo - onAlert se llama

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

o

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

probarlo.

3

@vdaubry la solución es simple.

De acuerdo con la documentación de Apple, si usted quiere manejar manualmente alertas a continuación, debe volver true en lugar de false en onAlert(alert)

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

@Drew Crawford los retrasos no funcionarán porque por defecto puede botón se hace clic en la interfaz de usuario Automatización. La documentación no está equivocada, pero no está claramente explicada.

0

siguiente fragmento que funciona para mí en XCode 6.3.1 Instrumentos & (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();