UIAutomation y XCTestCase: cómo esperar a que se active un button

Estoy escribiendo un caso de testing de UIAutomation y tengo que esperar a que el usuario se active antes de continuar. No parece haber una buena forma de comprobar si un button cambia al estado habilitado.

¿Cuál es el mejor para esperar a que suceda algo en la interfaz de usuario antes de verificar su estado?

Ni dispatch_after ni NSTimer parecen funcionar. Simplemente bloquean y luego fallan.

En realidad, es bastante fácil si usa NSPnetworkingicates y expectativas. Incluso puede establecer un valor de time de espera. Este ejemplo muestra cómo hacerlo con un time de espera de 5 segundos.

let exists = NSPnetworkingicate(format:"enabled == true") expectationForPnetworkingicate(exists, evaluatedWithObject: app.tables.textFields["MY_FIELD_NAME"], handler: nil) waitForExpectationsWithTimeout(5, handler: nil) 

La mejor manera de esperar y comprobar un elemento no es la function delay() , sino el pushTimeout() uno. Apple recomienda usar la segunda function. Aquí hay un ejemplo de código:

 UIATarget.localTarget().pushTimeout(10) button.tap() UIATarget.localTarget().popTimeout() 

Apple repetidamente intentará tocar el button y esperará hasta 10 segundos. Aquí hay un enlace a la documentation.

La respuesta de Murdock es para el viejo sistema de testing de JavaScript. Eventualmente se me ocurrió esto:

https://gist.github.com/briandw/59bf5a06afe8af67a690

 - (void)waitFor:(NSTimeInterval)seconds withExpectationBlock:(BOOL (^)())block { NSDate *timeoutDate = [[NSDate alloc] initWithTimeIntervalSinceNow:seconds]; while (YES) { if ([timeoutDate timeIntervalSinceNow] < 0 || !block()) { return; } [[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:0.1]]; } } XCUIElement *nextButton = app.navigationBars[@"Title"].buttons[@"Next"]; XCTestExpectation *activationExpectation = [self expectationWithDescription:@"Waiting"]; [self waitFor:20.0 withExpectationBlock:^BOOL() { if (nextButton.exists && nextButton.enabled) { [activationExpectation fulfill]; return YES; } return NO; }]; 

Debería poder implementar un bucle while para verificar la condición que desea (p. Ej., Botón habilitado). Eso detendrá el progreso del caso de testing hasta que se cumpla la condición de time y las testings continuarán. Desarrolle una demora para ralentizar el sondeo y asegúrese de tener un time de espera para que no se atasque indefinidamente.

Pseudocódigo :

 While (/*button is disabled*/) { if (/*timeout condition met*/) { /*handle error*/ break; } UIATarget.delay(<duration in seconds>); }