usuario sistema siguientes representa que principales operativo los interfaz funciona dispositivos caracteristicas aplicacion ios swift xctest xcode7 xcode-ui-testing

sistema - que es el ios



¿Cómo verificar la presencia de texto estático mostrado desde la red en las pruebas de interfaz de usuario en Xcode? (4)

Si tengo razón al entender que el texto de destino ya se mostró cuando está verificando que existe, puede intentar usar la propiedad de hittable .

Estoy usando las API de prueba de interfaz de usuario introducidas en Xcode 7 XCTest. En mi pantalla tengo un texto que se carga desde la red.

La prueba falla si simplemente lo compruebo con propiedad exists .

XCTAssert(app.staticTexts["Text from the network"].exists) // fails

Sin embargo, funciona si primero envío el grifo o cualquier otro evento al texto como este:

app.staticTexts["Text from the network"].tap() XCTAssert(app.staticTexts["Text from the network"].exists) // works

Parece que si solo llamo exists lo evalúa inmediatamente y falla porque el texto aún no se ha descargado de la red. Pero creo que cuando llamo al método tap() espera que aparezca el texto.

¿Hay una mejor manera de verificar la presencia de un texto que se entrega desde la red?

Algo como (este código no funcionará):

XCTAssert(app.staticTexts["Text from the network"].eventuallyExists)


XCode9 tiene un método waitForExistence (timeout: TimeInterval) de XCUIElement

extension XCUIElement { // A method for tap element @discardableResult func waitAndTap() -> Bool { let _ = self.waitForExistence(timeout: 10) let b = self.exists && self.isHittable if (b) { self.tap() } return b } } // Ex: if (btnConfig.waitAndTap() == true) { // Continue UI automation } else { // `btnConfig` is not exist or not hittable. }

Pero me encuentro con otro problema, el element existe, pero no se puede golpear. Así que extiendo un método para esperar que un elemento sea golpeable.

extension XCTestCase { /// Wait for XCUIElement is hittable. func waitHittable(element: XCUIElement, timeout: TimeInterval = 30) { let predicate = NSPredicate(format: "isHittable == 1") expectation(for: predicate, evaluatedWith: element, handler: nil) waitForExpectations(timeout: timeout, handler: nil) } } // Ex: // waitHittable(element: btnConfig)


Xcode 7 Beta 4 agregó soporte nativo para eventos asíncronos. Aquí hay un ejemplo rápido de cómo esperar a que aparezca una UILabel .

XCUIElement *label = self.app.staticTexts[@"Hello, world!"]; NSPredicate *exists = [NSPredicate predicateWithFormat:@"exists == 1"]; [self expectationForPredicate:exists evaluatedWithObject:label handler:nil]; [self waitForExpectationsWithTimeout:5 handler:nil];

Primero cree una consulta para esperar una etiqueta con el texto "¡Hola, mundo!" a aparecer. El predicado coincide cuando existe el elemento (element.exists == YES) . Luego pase el predicado y evalúelo con respecto a la etiqueta.

Si pasan cinco segundos antes de que se cumpla la expectativa, la prueba fallará. También puede adjuntar un bloqueo de controlador en el que se llama cuando la expectativa falla o se agota el tiempo de espera.

Si está buscando más información sobre las pruebas de UI en general, consulte las Pruebas de UI en Xcode 7 .


Swift 3:

let predicate = NSPredicate(format: "exists == 1") let query = app!.staticTexts["identifier"] expectation(for: predicate, evaluatedWith: query, handler: nil) waitForExpectations(timeout: 5, handler: nil)

Verificará continuamente durante 5 segundos si ese texto se muestra o no.

Tan pronto como encuentre que el texto puede estar en menos de 5 segundos, ejecutará un código adicional.