Evita usar XPATH en automatizaciones para iOS

En esta publicación se compartirá información para construir automatizaciones para iOS más rápidas. La idea es entender porque a pesar de ser el mismo script, la ejecución puede tardar el doble o más del tiempo de ejecución con respecto a Android y plantear una solución.

Cabe aclarar que esta estrategia es para aplicaciones nativas. No aplica para aplicaciones híbridas o web apps, ya que para este tipo de aplicaciones los locators son cross platform.

En el caso de las aplicaciones nativas hay 2 detalles técnicos muy importantes que se deben entender.

Primero, generalmente se recurre a identificar los objetos en una aplicación móvil usando las estrategias que Selenium brinda, las cuales son identificar los objetos en el DOM por Id, Class Name, Name, etc. Selenium usa estos atributos para construir un XPATH relativo internamente y buscarlo en el DOM. Si deseas aclarar dudas, entra a la clase By de Selenium y entenderás el funcionamiento de la misma. Esto permite concluir que independientemente del tipo de locator enviado, el Framework lo transforma en un XPATH.

Segundo, Una aplicación móvil se compone por vistas. Estas vistas tienen un comportamiento diferente al front de una página web. A la hora de identificar los objetos, el DOM que vemos de la aplicación en Appium no es HTML sino XML. Appium toma la vista activa, hace un screenshot y genera el árbol XML de esta. En el caso de Android existe una libreria llamada UIDevice — dumpWindowHierarchy, la cual permite que Appium obtenga los objetos visible en pantalla de manera jerarquica, en el caso de iOS al no existir una libreria de este tipo, Appium obtiene todos los objetos de la vista esten o no visibles en pantalla.

Al analizar los dos puntos mencionados anteriormente, se entiende que buscar un elemento en iOS toma mas tiempo, ya que su DOM es más extenso. Por este motivo se plantea una estrategia en la cual se usa Appium en lugar de Selenium para mapear los objetos y de esta manera mejorar la velocidad de los tests.

En la siguiente tabla se mostrará los tipos de locators de Appium para iOS según prioridad recomendada.

Lastimosamente existen algunos casos en que la única forma de identificar un objeto es usando XPATH, para estos casos en específico, la estrategia planteada no aplicaría.

A continuación se puede ver una comparación de tiempos usando los XPATH de Selenium y los locators de Appium mostrados en la tabla anterior.

Objeto a identificar: Botón Suscribirse en Youtube

XPATH Locator (Selenium) — Tiempo de búsqueda: 824 milisegundos.

//XCUIElementTypeButton[@name="id.ui.channel.subscribe"]

Accessibility ID Locator (Appium) — Tiempo de búsqueda: 369 milisegundos.

id.ui.channel.subscribe

Predicate String Locator (Appium) — Tiempo de búsqueda: 419 milisegundos.

type == 'XCUIElementTypeButton' && name CONTAINS 'subscribe'

Class Chain Locator (Appium)— Tiempo de búsqueda: 300 milisegundos.

**/XCUIElementTypeButton[`name CONTAINS "subscribe"`]

Como se puede ver en las anteriores imágenes, los tiempos de búsqueda de los objetos disminuyen notablemente usando un mapeo adecuado. Por lo que podemos concluir que la estrategia nos da una solución con respecto al problema planteado inicialmente, ya que mejora los tiempos de búsqueda de los objetos, lo que se reflejaría como una mejora en los tiempos de ejecución de la automatización.

--

--