Cómo utilizar UIAutomation para pruebas automatizadas de iOS
El código de prueba funcional de UIAutomation está escrito en Javascript. UIAutomation está directamente relacionado con la Accesibilidad, que se utiliza para acceder a los elementos de la UI a través de etiquetas y valores y realizar las interacciones correspondientes.
Escribamos nuestro primer código de prueba.
Usando el simulador de iOS
1. Descargue la aplicación de muestra TestAutomation.xcodeproj y ábrala. Este proyecto es una aplicación de barra de pestañas muy simple que contiene 2 pestañas.
2. Asegúrese de que el modo "TestAutomation > iPhone 5.0 Simulator" esté seleccionado como se muestra en la imagen a continuación (tal vez haya cambiado a 5.1, por lo que puede ser iPhone 5.1 Simulator).
3. Inicie Instrumentos (Producto > Perfil), o mediante "I.
4. Seleccione Simulador de iOS a la izquierda, luego seleccione la plantilla de Automatización y haga clic en "Perfil". ".
5. En este momento, el instrumento se ha iniciado y luego la grabación comienza directamente. Detén la grabación aquí (botón rojo o "R").
6. En la ventana "Scripts" de la izquierda, haga clic en "Agregar > Crear" para crear un nuevo script.
7. En el editor de secuencias de comandos, ingrese el siguiente código
var target = UIATarget.localTarget();
var app = target.frontMostApp();
var ventana = app.mainWindow();
target.logElementTree();
clip_image007[4]
8. - Ejecutar script ?R (sin guardar). Una vez que el script se está ejecutando, puede detenerlo después de una visita al registro.
clip_image009[4]
¡Gracias! De esta manera, completamos nuestro primer caso de prueba de UIAutomation.
Usar dispositivos iOS
Además de ejecutar en el simulador, también puede ejecutar casos de prueba en un dispositivo real. Sin embargo, los casos de prueba automatizados solo se pueden ejecutar en dispositivos que admitan multitarea: iPhone 3GS, iPad, iOS > 4.0, etc. Lamentablemente, el iPhone 3G no es compatible independientemente de la versión del sistema.
A continuación se explica cómo hacerlo:
1. Conecte su iPhone a través del puerto USB.
2. Seleccione el modo "TestAutomation > Dispositivo iOS".
3. Asegúrese de que el perfil de desarrollador esté configurado en modo de lanzamiento (no en el perfil de "Distribución Ad-Hoc"). De forma predeterminada, el perfil está configurado en modo de lanzamiento (ya que no es necesario configurar el perfil en modo de depuración).
4 Inicie la prueba
5. Consulte el capítulo anterior sobre el simulador para conocer los siguientes pasos.
2. Manejo de UIAElement y accesibilidad de elementos
Jerarquía de UIAElement
La accesibilidad está estrechamente relacionada con la automatización UIA: si la accesibilidad del control es Si el control es accesible , puede configurar y leer su valor y realizar operaciones relacionadas, mientras que si la accesibilidad del control no es visible, no puede acceder a él a través de la automatización.
Puede configurar la accesibilidad o la automatización de un control a través de Interface Builder o configurando la propiedad isAccessibilityElement mediante programación. Debe tener cuidado al configurar la accesibilidad para las vistas de contenedor (es decir, vistas que contienen otros elementos UIKit). Configurar la accesibilidad de una vista completa "ocultará" la accesibilidad de sus subvistas; por ejemplo, en el proyecto de muestra no puede configurar la accesibilidad de una vista de salida o todas sus subvistas serán inaccesibles. En todo momento, logElementTree es su fiel amigo: imprime en el registro todos los elementos accesibles de la interfaz actual.
Cada control UIKit accesible puede describirse mediante un objeto Javascript (UIAElement), que tiene múltiples propiedades: nombre, valor, elemento, nodo principal. Estas jerarquías UIKit corresponden a árboles jerárquicos de UIAElements. Por ejemplo, en el código de prueba anterior, al llamar a logElementTree, podemos obtener la estructura de árbol como se muestra a continuación:
+- UIATarget: nombre:iPhone Simulator rect:{{0,0},{320,480} }
| +- UIAApplication: nombre:TestAutomation rect: {UIAWindow: rect:{{0,0},{320,480}}
| :Valor de primera vista:Primera vista rect:{{54,52},{212,43}}
| +- UIATextField: nombre:Valor de texto de usuario: ¡Toque algún texto aquí! rect:{{20,179},{280,31}}
| +- UIAStaticText: nombre:El texto es: valor:El texto es: rect:{{20,231},{112, 21}}
| | | +- UIAStaticText: valor: rect:{{145,231},{155,21}}
| {{0,431},{320,49}}
| | | +- Imagen UIA: rect:{{0,431},{320,49}}
| ,48}}
| | | +- UIAButton: nombre:Segundo rect:{{162,432},{156,48}}
clip_ image001[6]
Puedes acceder al campo de texto usando el siguiente código:
var textField =
UIATarget.localTarget().frontMostApp().mainWindow().textFields()[ 0] ;
Puedes elegir acceder al elemento por índice comenzando desde 0 o por el nombre del elemento, por ejemplo, también puedes acceder al control de texto con el siguiente código.
var textField =
UIATarget.localTarget().frontMostApp().mainWindow().textFields()["Texto de usuario"];
Último Este método es más claro y debería utilizarse con más frecuencia. Puede configurar la propiedad de nombre del UIAElement a través de Interface Builder,
clip_image002[6]
o escribiendo código:
myTextField.accessibilityEnabled = YES;
myTextField.accessibilityLabel = @"User Text";
Ahora puedes ver que UIAutomation puede usar propiedades auxiliares para encontrar diferentes controles. Esto es bastante obvio porque, en primer lugar, solo necesita aprender un marco de prueba; en segundo lugar, al escribir código de prueba automatizado, se asegura de que su programa sea accesible al mismo tiempo; Por lo tanto, puede acceder a los controles secundarios de cada objeto UIAElement a través de los siguientes métodos: button(), image(), scrollViews(), textFields(), webViews(), segmentedControls(), slider(), staticTexts(), switch(), tabBar(), tableViews(), textViews(), barra de herramientas(), barra de herramientas(), etc.
Puedes utilizar el siguiente código para acceder a la primera pestaña de la barra de pestañas:
Puedes utilizar el siguiente código para acceder a la primera pestaña de la barra de pestañas:
p>
var tabBar = UIATarget.localTarget().frontMostApp().tabBar();
var tabButton = tabBar.buttons()["Primero"];
La jerarquía de la estructura UIAElement es muy importante y la utilizará con frecuencia más adelante. También debe recordar que puede llamar a logElementTree de UIAAplication en cualquier momento para obtener su estructura.
UIATarget.localTarget().frontMostApp().logElementTree();
En el emulador, también puedes activar el detector de accesibilidad. Inicie el emulador, busque "Configuración > General > Accesibilidad > Comprobador de accesibilidad" y configúrelo en "Activado".
Ese pequeño cuadro colorido es el Comprobador de Accesibilidad. Cuando está cerrado, la accesibilidad está desactivada; cuando está expandida, la accesibilidad está activada. Puede activar o desactivar las funciones de accesibilidad haciendo clic en el botón de flecha de arriba.
Ahora, abre nuestro programa de muestra y activa el detector.
Luego, haga clic en el cuadro de texto para examinar las propiedades de nombre y valor del UIAElement (que en realidad son valores de tipo NSObject, correspondientes a accesibilidadLabel y accesibilidadValue). Este verificador le ayudará a depurar y escribir código de prueba.
Simular acciones del usuario
Vayamos un paso más allá y simulemos alguna interacción del usuario.
Solo necesita llamar al tap() del botón para lograr la operación de clic:
var tabBar = UIATarget.localTarget().frontMostApp().tabBar();
var tabButton = tabBar .buttons()["Primero"];
// ¡Haga clic en la barra de pestañas!
tabButton.tap();
También puedes llamar a doubleTap() y twoFingerTap() en UIAButtons. Si no desea operar un elemento específico, también puede operar directamente según el punto de coordenadas especificado en la pantalla. Puede usarlo así:
UIATarget.doubleTap({x:100, y:200});
UIATarget.localTarget().tap({x:100,y:200});
UIATarget.localTarget().twoFingerTap({x: 100,y:200});
UIATarget.localTarget().dragFromToForDuration({x:160,y:200},{x:160,y:400},1);
UIATarget.localTarget(). flickFromTo({x:160,y:200},{x:160,y:400});
Tenga en cuenta que cuando especifica el intervalo de tiempo de la operación , tiene un rango específico, es decir, arrastrar El intervalo de tiempo entre las operaciones de arrastrar y soltar debe ser mayor o igual a 0,5 segundos y menor a 60 segundos.
Ahora comencemos el ejercicio:
Detenga el instrumento (?R)
En la ventana del script, elimine el script actual
Haga clic en "Agregar > Importar" y seleccione TestAutomation/TestUI/Test-1.js (guarde el siguiente código en esta ruta)
Haga clic en el botón "Grabar" (?R) y vea qué sucede. .
El siguiente es el código de Test-1.js:
var testName = "Prueba 1";
var target = UIATarget.localTarget(. );
var app = target.frontMostApp();
var window = app.mainWindow();
UIALogger.logStart( testName ); p>
app.logElementTree();
//-- Seleccionar elemento
UIALogger.logMessage("Seleccionar elemento").
logMessage( "Seleccione la primera pestaña" );
var tabBar = app.tabBar();
var selectedTabName = tabBar.selectedButton().name();
p>
if (selectedTabName != "Primero") {
tabBar.buttons()["Primero"].tap()
}; p>
//-- Haga clic en el campo de texto
UIALogger.logMessage("Haga clic en el campo de texto ahora");
var recetaName = "Nombre inusualmente largo para una receta";
window.textFields(0)[0][0];
for (selectedTabName !delay( 2 );
//- - Haga clic en el campo de texto
UIALogger.logMessage( "Release Keyboard");
app.logElementTree();
app.keyboard().buttons ()["return"].tap ();
var textValue = window.staticTexts()["RecipeName"].value();
if (textValue === nombreReceta){
UIALogger.logPass( nombrePrueba
}
else{
UIALogger.logFail( nombrePrueba ); p>
}
Este script primero inicia el programa que se va a probar. Luego, si la primera pestaña no está seleccionada, cambia a esa pestaña y establece el valor del cuadro de texto encima de ella en ". Nombre de receta excepcionalmente largo". y luego cierre el teclado virtual. También hay algunos métodos nuevos que vale la pena señalar: el método logMessage (mensaje de cadena) de UIALogger se utiliza para generar información que se imprimirá en el registro, y el método logPage (mensaje de cadena) de UIALogger se utiliza para imprimir en el registro El mensaje en el método logPass(String message) de UIALogger indica que el script de prueba completó exitosamente la prueba
También aprendió cómo acceder a los botones del teclado y hacer clic en ellos: <. /p>
aplicación .teclado().botones()["retorno"].tap();