Funciones útiles en Instruments para automatizar tests en iOs

Después de tener claro los conceptos básicos, de instruments, vamos a ver algunas funciones que nos pueden resultar útiles.

DIFERENCIA ENTRE “PUSHTIMEOUT” Y “DELAY”

Algunas veces, se necesita un retardo antes de ejecutar el siguiente commando, por ejemplo, esperar un poco hasta que la conexión se ha establecido después de una petición http.
En ese caso, es posible utilizar “delay” pero quizás tarde un poco más en establecer la conexión o quizás es más rápido y estamos esperando sin motivo.

Por ese motivo, es mejor utilizar “pushTimeout” porque espera hasta X segundos o hasta que una condición se cumpla.
Así que, si la condición se cumple antes de X segundos, el test sigue inmediatamente.

Ejemplo: esperaría hasta 60 segundos


target.pushTimeout(60);
target.frontMostApp().mainWindow().tableViews()[0].groups()["Secure Connection Established"];
target.popTimeout();

MANEJO DE ALERTS (ESPERADOS E INESPERADOS)

El manejo de los alerts en los test automáticos siempre ha sido un tema complicado.
El problema viene de que en dispositivos reales, se muestra un alert inesperadamente y debido a ello el test falla o se bloquea.
Para evitarlo, se puede añadir este código al principio del script para manejar el evento. Al devolver false, el alert es automáticamente cerrado y el script puede continuar sin interferencia.


UIATarget.onAlert = function onAlert(alert){
  var alertName = alert.name();
  UIALogger.logWarning( alertName + "’ pops up!”);
  return false; // use default handler
}

Pero los alert pueden ser parte del proceso a probar, y no querríamos descartarlos sin más.
El modo de descartar como parte del flujo los alerts que no son parte de la aplicación y de no descartar los que son parte, es comprobar el titulo del alert y en caso de coincidencia con lo esperado, devolver true.


UIATarget.onAlert = function onAlert(alert) {
  var alertName = alert.name();
  UIALogger.logWarning( alertName + "’ pops up!”);
  if (alertName == “match title”) {
    alert.buttons()["ok"].tap();
    return true; // bypass default handler
  }
  return false; // use default handler
}

Algunas veces, el hecho de que aparezca el alert es lo que indica si el test ha funcionado o fallado.
En esos casos, no es correcto escribir el comando “logPass” en el evento onAlert porque de ese modo, no se podría indicar si el test ha fallado si el alert no llegase a mostrarse nunca.
El modo correcto es cerrar el alert y devolver true, y en el flujo del código donde nos encontramos, comprobar si el titulo del alert es el esperado, así:


if (target.frontMostApp().alert().name() == “Title of the alert) {
 UIALogger.logPass(testName);
}else{
 UIALogger.logFail(testName);
}

OTRAS FUNCIONES INTERESANTES

  • Establecer la orientación de dispositivo
    
    target.setDeviceOrientation(UIA_DEVICE_ORIENTATION_LANDSCAPERIGHT);
    target.setDeviceOrientation(UIA_DEVICE_ORIENTATION_PORTRAIT);
    
  • Desplazarse para ver un elemento
    
    if(varTableView.cells()[3].isVisible()){
         varTableView.cells()[3].scrollToVisible();
    }
    
  • Simular que se ha pulsado “Done”
    target.frontMostApp().keyboard().typeString("\n");
    
  • Cerrar “popover”
    target.frontMostApp().mainWindow().popover().dismiss();
  • Dar un valor a un campo
    
    target.frontMostApp().mainWindow().textFields()[0].setValue("valor");
    

    en vez de

    
    target.frontMostApp().mainWindow().tableViews()[0].cells()[2].textFields()[0].tap();
    target.frontMostApp().keyboard().typeString(passwordAccount1);
    

    Es mejor usar lo primero, porque utilizando lo segundo, a veces se pierde alguna letra.

  • Borrar un campo
    
    target.frontMostApp().mainWindow().tableViews()[0].cells()[0].textFields()[0].setValue("");
    
  • Hacer “swipe”
    Añadir un poco de retardo antes y despise, es recomendable.

    
    container.tableViews()[0].cells()[0].dragInsideWithOptions({startOffset:{x:0.87, y:0.2}, endOffset:{x:0.0, y:0.2}, duration:0.25});
    
  • Ver el árbol de elementos
    
    UIATarget.localTarget().frontMostApp().logElementTree()
    
  • Pulsar sobre un elemento
    element.tap()
  • Poner la aplicación en segundo plano
    
    UIATarget.localTarget().deactivateAppForDuration(10);
    
  • Esperar a que un proceso se termine.
    Es útil porque algunas acciones llevan más tiempo del esperado debido a problemas de conexión,por ejemplo. Así que podemos esperar hasta que una condición se halla cumplido en vez de especificar un momento.

    waitUntilInvisible();
  • Acceder al elemento de un array
    elements().firstWithName("1")

En próximos artículos, se comentará como ejecutar instruments desde la consola y como integrar test automáticos en Jenkins.

 

 

 

Deja un comentario

Responsable » Solidgear.
Finalidad » Gestionar los comentarios.
Legitimación » Tu consentimiento.
Destinatarios » Los datos que me facilitas estarán ubicados en los servidores SolidgearGroup dentro de la UE.
Derechos » Podrás ejercer tus derechos, entre otros, a acceder, rectificar, limitar y suprimir tus datos.

¿Necesitas una estimación?

Calcula ahora