UI Automator: qué es, conceptos clave y cómo funciona

Autor: IT Sectr Publicado: 2026-04-08 Tiempo de lectura: 8 min

UI Automator es un framework de Google para pruebas automatizadas de UI en aplicaciones Android que opera a nivel del sistema y puede interactuar con elementos de la interfaz más allá de una sola aplicación. A diferencia de Espresso, UI Automator no está vinculado al proceso de una aplicación específica: puede abrir diálogos del sistema, la cortina de notificaciones y cambiar entre aplicaciones. Según Google Android Developers, UI Automator utiliza el Accessibility Service estándar para acceder al árbol de UI del dispositivo.

Puntos clave

  • UI Automator — un framework para pruebas de UI entre aplicaciones en Android.
  • UiDevice — el punto de entrada para acceder a la pantalla del dispositivo y sus elementos.
  • UiSelector — un mecanismo para encontrar elementos por texto, clase, descripción y jerarquía.
  • Cross-application — las pruebas pueden cambiar entre Settings, Browser y la aplicación bajo prueba.
  • Accessibility Service — UI Automator lo usa para leer y manipular el árbol de UI.

¿Qué es UI Automator?

UI Automator es un framework para pruebas funcionales de UI en Android que opera a nivel del sistema operativo. Proporciona una API para acceder a cualquier elemento en la pantalla del dispositivo, independientemente de a qué aplicación pertenezca — incluyendo la barra de estado del sistema, diálogos de permisos, la pantalla de inicio y aplicaciones de terceros. Esto lo hace indispensable para probar escenarios que van más allá de una sola aplicación.

Arquitectónicamente, UI Automator utiliza el Accessibility Service — el mismo servicio que usan TalkBack, Switch Access y otras herramientas de accesibilidad. A través de este servicio, el framework obtiene el árbol completo de componentes UI de la pantalla actual y permite realizar acciones sobre ellos: tocar, deslizar, ingresar texto y mantener pulsado.

UI Automator apareció por primera vez en Android 4.3 (API 18) y desde entonces ha sido parte de Android Testing Support Library como la herramienta oficial de Google para pruebas entre aplicaciones. En AndroidX Test está disponible como un artefacto separado androidx.test.uiautomator:uiautomator versión 2.3.0 (2024), que soporta todas las versiones de Android desde API 18.

Cómo funciona UI Automator

Principio de funcionamiento: UI Automator se basa en escanear el árbol de accesibilidad de la pantalla actual. Cuando se llama al método findObject(selector), el framework recorre la jerarquía de Views, encuentra el primer elemento que coincide con las condiciones de UiSelector y devuelve un UiObject — un proxy para interactuar con la View real.

Ciclo de vida de una prueba UI Automator

Una prueba típica de UI Automator comienza obteniendo una instancia de UiDevice, que representa el dispositivo físico. UiDevice proporciona métodos para encontrar elementos, gestionar pulsaciones de botones (Home, Back, Recent), rotar la pantalla y tomar capturas. Después de encontrar un elemento mediante UiSelector, se realizan acciones sobre el UiObject.

Ejemplo básico

En el siguiente ejemplo, la prueba abre la aplicación Settings, encuentra el elemento “Batería” por texto y lo toca. UI Automator no requiere lanzar una Activity — funciona con cualquier pantalla del dispositivo, incluyendo aplicaciones de terceros.

kotlin
val device = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation())

// Abrir pantalla de configuración
device.pressHome()
device.wait(Until.hasObject(UiSelector().text("Configuración")), 2000)

// Buscar el elemento "Batería" y tocar
val batteryItem = device.findObject(
    UiSelector().text("Batería")
)
batteryItem.clickAndWait(Until.newWindow(), 3000)

UiDevice y UiSelector: clases clave

UiDevice es la clase principal para interactuar con el dispositivo. Proporciona métodos para encontrar elementos, simular pulsaciones de botones físicos (Home, Back, Menu, Volume), gestionar la energía, tomar capturas de pantalla y esperar estados específicos de la pantalla. UiDevice se crea una vez por prueba y se reutiliza para todas las operaciones.

UiSelector es una API fluida para encontrar elementos UI. A diferencia de Espresso ViewMatchers, UiSelector no requiere compilación — las condiciones de búsqueda se forman mediante una cadena de métodos: text(), className(), description(), resourceId(), index(). Múltiples condiciones se combinan automáticamente mediante AND lógico.

Método UiSelectorPropósito
text(String)Buscar por texto exacto del elemento
textContains(String)Buscar por coincidencia parcial de texto
resourceId(String)Buscar por ID de recurso (ej., com.example:id/button)
className(String)Buscar por nombre de clase de la View
description(String)Buscar por content-description
childSelector(selector)Buscar un elemento hijo dentro de un contenedor

Ejemplo de búsqueda con múltiples condiciones

Cuando hay varios elementos en la pantalla con el mismo texto, UiSelector permite combinar criterios: encontrar un contenedor por ID, luego dentro de él — un elemento por texto y clase. Esto garantiza la identificación única del componente deseado. El método childSelector reduce el alcance de la búsqueda a un contenedor específico, acelerando la navegación por el árbol de UI.

kotlin
val scrollView = device.findObject(
    UiSelector().resourceId("android:id/list")
)

// Dentro de la lista, buscar el elemento con texto "Wi-Fi"
val wifiItem = scrollView.findObject(
    UiSelector().text("Wi-Fi")
wifiItem.click()

Pruebas entre aplicaciones con UI Automator

Las pruebas entre aplicaciones (cross-application) son la función principal por la que se elige UI Automator. El framework puede cambiar entre aplicaciones, probar el inicio de sesión OAuth a través del navegador, verificar diálogos del sistema (permisos, selector de aplicación) e interactuar con la barra de estado del sistema, el panel de notificaciones y la pantalla de bloqueo.

Prueba de inicio de sesión OAuth

Un escenario típico de prueba cross-app: la aplicación abre un navegador para autorización OAuth, el usuario ingresa su usuario y contraseña, y el navegador redirige de vuelta a la aplicación. UI Automator cambia entre procesos, encuentra los campos de entrada en el navegador, los completa y toca “Iniciar sesión”.

kotlin
// Esperando que aparezca el navegador
device.wait(Until.hasObject(
    UiSelector().packageName("com.android.chrome")
), 5000)

// Buscando campo de entrada de email en el navegador
val emailField = device.findObject(
    UiSelector().className("android.widget.EditText").instance(0)
)
emailField.text = "user@example.com"

Verificación de diálogos del sistema

UI Automator puede verificar y cerrar diálogos del sistema — permisos de ubicación, notificaciones, acceso a archivos. Esto es críticamente importante para probar escenarios de primer inicio cuando el sistema solicita varios permisos secuencialmente. Sin UI Automator, estos escenarios no se pueden automatizar porque los diálogos del sistema no pertenecen al proceso de la aplicación.

UI Automator vs Espresso: comparación de enfoques

La elección entre UI Automator y Espresso depende del escenario de prueba. Espresso está optimizado para probar una sola aplicación con sincronización automática y mínimo boilerplate. UI Automator es adecuado para escenarios donde se necesita interactuar con el sistema, el navegador o múltiples aplicaciones.

CriterioUI AutomatorEspresso
AlcanceTodo el dispositivo, múltiples aplicacionesUna sola aplicación
SincronizaciónManual (wait, sleep)Automática (Idling Resource)
VelocidadMás lento (acceso mediante servicio)Más rápido (funciona dentro del proceso)
System UISoporta (Notificaciones, Configuración rápida)No soporta
Precisión de búsquedaUiSelector por atributosViewMatchers por tipo y jerarquía
EstabilidadMenor (depende de tiempos)Mayor (espera automática)

En la práctica, estos frameworks se usan a menudo juntos: Espresso cubre las pruebas de UI de la aplicación principal con alta estabilidad, mientras que UI Automator se incorpora para escenarios que van más allá de los límites de la aplicación — inicio de sesión OAuth, permisos del sistema, trabajo con Share Intent. Esta combinación proporciona la máxima cobertura de UI con costos mínimos de mantenimiento de pruebas.

Configuración de UI Automator en un proyecto Android

La integración de UI Automator se realiza añadiendo una dependencia en build.gradle. El framework es parte de AndroidX Test y no requiere permisos adicionales en el manifiesto — el acceso al Accessibility Service se configura automáticamente al lanzar la prueba instrumentada.

Dependencias de Gradle

La configuración mínima incluye el artefacto uiautomator y el ejecutor de pruebas estándar AndroidJUnitRunner. Las pruebas de UI Automator se colocan en el directorio src/androidTest y se ejecutan en un emulador o dispositivo físico con Android API 18+.

kotlin
dependencies {
    androidTestImplementation("androidx.test.uiautomator:uiautomator:2.3.0")
    androidTestImplementation("androidx.test.ext:junit:1.2.1")
    androidTestImplementation("androidx.test:runner:1.6.1")
}

UiDevice y configuración de pruebas

Para obtener una instancia de UiDevice se usa InstrumentationRegistry.getInstrumentation(). UiDevice debe crearse una vez en el método setUp() y reutilizarse en todas las pruebas de la clase para conservar los recursos del dispositivo. Es importante tener en cuenta que UiDevice no es thread-safe — todas las operaciones deben ejecutarse en el mismo hilo del método de prueba. Crear un nuevo UiDevice en cada prueba genera sobrecarga y ralentiza la ejecución. Se recomienda crear UiDevice una vez en el método beforeClass y reutilizarlo para todas las pruebas de la clase.

Espera en UI Automator

A diferencia de Espresso, UI Automator no tiene sincronización automática. Para esperar la aparición de elementos se usa el método UiDevice.wait(condition, timeout) con un objeto Until: Until.findObject(selector), Until.hasObject(selector), Until.gone(selector). Sin esperas adecuadas, las pruebas se vuelven inestables debido a condiciones de carrera — un elemento puede no haber aparecido en la pantalla en el momento de la búsqueda. Se recomienda establecer un tiempo de espera de al menos 3–5 segundos para la estabilidad.

Preguntas frecuentes

¿En qué se diferencia UI Automator de Espresso?

UI Automator opera a nivel del Accessibility Service y puede interactuar con cualquier aplicación. Espresso funciona dentro del proceso de una sola aplicación y utiliza sincronización automática con el hilo de UI. UI Automator es mejor para escenarios entre aplicaciones, mientras que Espresso es mejor para pruebas estables de una sola aplicación.

¿Se puede ejecutar UI Automator en cualquier dispositivo?

Sí, UI Automator funciona en todos los dispositivos con Android API 18+. No requiere acceso root — utiliza el Accessibility Service estándar, que se activa a través de Instrumentation al lanzar las pruebas.

¿Cómo encuentra UI Automator elementos en la pantalla?

UI Automator usa el Accessibility Service para obtener el árbol completo de componentes UI de la pantalla actual. Luego UiSelector recorre este árbol y encuentra elementos según los criterios especificados: texto, clase, ID, content-description o una combinación de estos.

¿UI Automator soporta capturas de pantalla?

Sí, el método UiDevice.takeScreenshot(storePath) permite tomar una captura de la pantalla actual y guardarla en un archivo. Esto es útil para depuración: cuando una prueba falla, se puede guardar la captura y analizar el estado de la pantalla.

¿Por qué las pruebas de UI Automator a veces fallan sin cambios en el código?

UI Automator no tiene sincronización automática, por lo que las pruebas son sensibles a los tiempos. Si una animación no ha terminado o una View no se ha renderizado aún, findObject puede no encontrar el elemento. La solución es usar UiDevice.wait() con un tiempo de espera suficiente.

Resumen

El conjunto de herramientas de UI Automator cubre todos los escenarios clave de pruebas entre aplicaciones y es el estándar para la automatización de Android a nivel del sistema.

  • UI Automator — un framework para pruebas entre aplicaciones Android mediante Accessibility Service.
  • UiDevice — el punto de entrada para acceder al dispositivo y los elementos de la pantalla.
  • UiSelector — una API fluida para encontrar elementos por texto, ID, clase y jerarquía.
  • Pruebas cross-app — inicio de sesión OAuth, permisos del sistema, interacción con múltiples aplicaciones.
  • Comparación con Espresso — UI Automator tiene mayor alcance pero menor estabilidad y velocidad.
  • Espera — UiDevice.wait() y condiciones Until son esenciales para la estabilidad de las pruebas.
  • API 18+ — el framework soporta todos los dispositivos desde Android 4.3.

Desarrollaremos una aplicación móvil llave en mano

IT Sectr crea aplicaciones para iOS y Android para startups y empresas desde 2017. Le asesoraremos y le propondremos la mejor solución.

Discutir el proyecto

Lea también