Logo de QANode

Nodo Mobile Flow

El nodo Mobile Flow permite automatizar interacciones con aplicaciones móviles nativas (Android e iOS) usando Appium. Soporta dispositivos reales, emuladores y servicios cloud como BrowserStack, Sauce Labs y LambdaTest.


Descripción General

PropiedadValor
Tipomobile-flow
CategoríaMobile
ColorRojo claro (#f87171)
Entradain
Salidaout

Requisitos Previos

Appium

El nodo Mobile Flow requiere un servidor Appium accesible:

SituaciónSolución
Edición DesktopAppium se instala automáticamente en el primer uso y se inicia al ejecutar un flujo con nodo mobile
Servidor propioInstalar manualmente: npm install -g appium + driver: appium driver install uiautomator2 (Android) o appium driver install xcuitest (iOS)
Cloud (BrowserStack, etc.)No se necesita Appium local — usa las credenciales del proveedor

Versiones recomendadas (QANode 0.2.2+)

npm install -g appium@3.2.0
appium driver install --source=npm appium-uiautomator2-driver@7.0.0
appium driver install --source=npm appium-xcuitest-driver@10.25.0

Para iOS, XCUITest requiere macOS con Xcode configurado.

Drivers de Appium

PlataformaDriverInstalación
AndroidUiAutomator2appium driver install uiautomator2
iOSXCUITestappium driver install xcuitest (requiere Xcode en Mac)

Configuración General

CampoTipoPredeterminadoDescripción
CredencialselectCredencial Mobile con configuraciones de conexión
Modo de Sesiónnew / reusenewNueva sesión o reutilizar sesión existente
Session IDstringID para identificar/reutilizar la sesión

Modo de Sesión

  • Nueva Sesión (new): Abre una nueva sesión Appium en cada ejecución. Ideal para pruebas aisladas.
  • Reutilizar Sesión (reuse): Reutiliza una sesión ya creada por otro nodo Mobile Flow en el mismo flujo. Útil para dividir automatizaciones largas en múltiples nodos manteniendo el mismo dispositivo conectado.

Credencial Mobile

La credencial centraliza la configuración de conexión y las capacidades del dispositivo. Configura en Credenciales → Nueva Credencial → Mobile.

Modos de Conexión

ModoDescripción
LocalAppium ejecutándose en la misma máquina (predeterminado: http://localhost:4723)
Self-hostedAppium en servidor propio con URL y token de autenticación
SaaSProveedor cloud (BrowserStack, Sauce Labs, LambdaTest, o Custom)

Capacidades del Dispositivo

CampoDescripciónEjemplo
PlataformaAndroid o iOSAndroid
Nombre del DispositivoNombre o ID del dispositivoemulator-5554, Pixel 7
Versión de PlataformaVersión del SO13.0, 17.0
App PackagePaquete de la app Androidcom.miapp.android
App ActivityActivity inicial de Android.MainActivity
Bundle IDIdentificador de la app iOScom.miapp.ios
App PathRuta al archivo .apk/.ipa/path/to/app.apk
UDIDID único del dispositivo realR58M20XXXXX
No ResetNo reiniciar la app entre sesionestrue
Full ResetReiniciar completamente el estado de la appfalse
Automation NameDriver de automatizaciónUiAutomator2 (Android), XCUITest (iOS)
Capacidades ExtraJSON con capacidades adicionales de Appium{"appium:language": "es"}

Pasos (Mobile Steps)

El nodo Mobile Flow ejecuta una secuencia de pasos configurables. Cada paso representa una acción en el dispositivo.

Acciones Disponibles

AcciónDescripción
tapTocar un elemento
tap-coordsTocar en coordenadas absolutas
typeEscribir texto en un campo
clearLimpiar el texto de un campo
swipeDeslizar en la pantalla
scrollDesplazar en una dirección
waitEsperar una condición o tiempo
assertVerificar una condición en la app
extractExtraer texto o atributo de un elemento
resetReiniciar la aplicación
backPresionar el botón Atrás (Android)
homePresionar el botón Home (Android)
key-eventEnviar un código de tecla Android

Estrategias de Selector Mobile

EstrategiaDescripciónEjemplo
idResource ID del elementocom.miapp:id/login_button
accessibility_idContent description / accessibility labelBotón de inicio de sesión
xpathExpresión XPath en la jerarquía XML//android.widget.Button[@text="Iniciar sesión"]
class_nameNombre de clase nativaandroid.widget.EditText
-android uiautomatorSelector UIAutomator2 (Android)new UiSelector().text("Iniciar sesión")
-ios predicate stringNSPredicate (iOS)type == 'XCUIElementTypeButton' AND name == 'Login'
-ios class chainiOS Class Chain**/XCUIElementTypeButton[\name == 'Login'`]`

Consejo: El Inspector Mobile genera automáticamente los selectores al tocar los elementos, sin necesidad de escribir XPath manualmente.


Detalle de las Acciones

tap

Toca un elemento usando estrategias de selector.

CampoTipoDescripción
SelectoresarrayEstrategias de selector del elemento
IntentosnumberNúmero de intentos (predeterminado: 3)
Delay entre intentos (ms)numberEspera entre intentos (predeterminado: 500ms)

Si el selector falla en todos los intentos y existen coordenadas de fallback (generadas por el inspector), el toque se realizará en las coordenadas directas.


tap-coords

Toca en coordenadas absolutas en la pantalla.

CampoTipoDescripción
XnumberCoordenada X en píxeles
YnumberCoordenada Y en píxeles

type

Escribe texto en un campo de entrada.

CampoTipoDescripción
SelectoresarrayEstrategias de selector del campo
TextostringTexto a escribir (soporta {{ }})
Limpiar PrimerobooleanLimpia el campo antes de escribir
IntentosnumberNúmero de intentos de localización

clear

Limpia el contenido de un campo de entrada.

CampoTipoDescripción
SelectoresarrayEstrategias de selector del campo

swipe

Desliza en la pantalla entre dos puntos.

CampoTipoDescripción
fromX / fromYnumberCoordenadas de inicio
toX / toYnumberCoordenadas de destino
Duración (ms)numberVelocidad del gesto (predeterminado: 350ms)
DirecciónstringAlternativa: up, down, left, right
PorcentajenumberPorcentaje de pantalla a deslizar (con dirección)

scroll

Desplaza el contenido en una dirección.

CampoTipoDescripción
Direcciónstringup, down, left, right
SelectoresarraySelector del contenedor a desplazar (opcional)

wait

Espera una condición antes de continuar.

CampoTipoDescripción
ModostringTipo de espera
Timeout (ms)numberTiempo máximo de espera
SelectoresarraySelectores (modo elementVisible)

Modos:

ModoDescripción
timeoutEspera un tiempo fijo en milisegundos
elementVisibleEspera a que un elemento aparezca en pantalla

assert

Verifica una condición en la aplicación. Si falla, el paso se marca como fallido.

CampoTipoDescripción
NombrestringIdentificador de la aserción (clave en el output)
ModostringTipo de verificación
SelectoresarraySelectores del elemento
Texto EsperadostringValor esperado (modos texto)
Continuar en FallobooleanNo interrumpir el flujo si falla

Modos:

ModoDescripción
elementExistsVerifica si el elemento está visible en pantalla
textContainsVerifica si el texto del elemento contiene el valor esperado
textEqualsVerifica si el texto del elemento es exactamente el valor esperado

Los resultados de las aserciones están disponibles en los outputs:

{{ steps["mobile-flow"].outputs.asserts.nombreAsercion }}  →  true o false

extract

Extrae texto o un atributo de un elemento.

CampoTipoDescripción
NombrestringNombre de la extracción (clave en el output)
SelectoresarraySelectores del elemento
AtributostringQué extraer: text (predeterminado) o nombre del atributo

Los datos extraídos están disponibles en los outputs:

{{ steps["mobile-flow"].outputs.extracts.nombreExtraccion }}

reset

Reinicia la aplicación, limpiando su estado (equivalente a desinstalar y reinstalar).


back

Presiona el botón físico/virtual Atrás (Android — keycode 4).


home

Presiona el botón Home (Android — keycode 3).


key-event

Envía un keycode de Android directamente al dispositivo.

CampoTipoDescripción
KeycodenumberCódigo de tecla Android (ej.: 4 = BACK, 3 = HOME, 66 = ENTER)
RepeticionesnumberCuántas veces enviar el evento

Keycodes comunes:

KeycodeTecla
3HOME
4BACK
66ENTER
67BACKSPACE/DEL
82MENU
84SEARCH

Evidencias (Capturas de pantalla)

Cada paso puede tener configuración de evidencia individual:

CampoTipoDescripción
Capturar PantallabooleanActivar captura de pantalla
Modobefore / after / bothCuándo capturar
Nombre de archivostringNombre personalizado del archivo
Esperar EstabilizaciónbooleanEsperar pantalla estable antes de capturar
Timeout de Estabilización (ms)numberTiempo máximo esperando pantalla estable (predeterminado: 2000ms)
Delay (ms)numberTiempo adicional antes de capturar (predeterminado: 300ms)

Las capturas generadas están disponibles en la pestaña Evidencias del resultado de ejecución. Los toques y swipes se destacan con marcación visual verde sobre la captura.


Outputs

OutputTipoDescripción
sessionIdstringID de sesión mobile para reutilización en otros nodos
extractsobjectDatos extraídos por los pasos extract (clave → valor)
assertsobjectResultados de aserciones (clave → true/false)

Ejemplo Completo

Inicio de sesión en app Android

Pasos configurados en el nodo:

  1. wait → Modo: elementVisible, Selector: id=com.miapp:id/email_field (timeout: 10000ms)
  2. tap → Selector: id=com.miapp:id/email_field
  3. type → Selector: id=com.miapp:id/email_field, Texto: {{ variables.USER_EMAIL }}
  4. type → Selector: id=com.miapp:id/password_field, Texto: {{ variables.USER_PASSWORD }}, Limpiar: true
  5. tap → Selector: accessibility_id=Iniciar sesión
  6. wait → Modo: elementVisible, Selector: id=com.miapp:id/home_title (timeout: 15000ms)
  7. assert → Nombre: loginOk, Modo: elementExists, Selector: id=com.miapp:id/home_title
  8. extract → Nombre: welcomeText, Selector: id=com.miapp:id/welcome_message, Atributo: text

Resultado tras la ejecución:

{
  "sessionId": "mi-sesion-android",
  "extracts": { "welcomeText": "¡Hola, Juan!" },
  "asserts": { "loginOk": true }
}

Reutilizando Sesión entre Nodos

Nodo 1 — Mobile Flow (Inicio de sesión)

  • Session ID: sesion-android
  • Pasos: inicio de sesión en la app

Nodo 2 — Mobile Flow (Verificar Pedido)

  • Modo de Sesión: reuse
  • Session ID: sesion-android
  • Pasos: navegar a pedidos, verificar estado

Ambos nodos comparten el mismo dispositivo y estado de sesión.


Consejos

  • Usa el Inspector Mobile para grabar pasos visualmente — genera los selectores automáticamente al tocar los elementos
  • En la edición Desktop, Appium se inicia automáticamente cuando se ejecuta un flujo con nodo mobile — no se necesita configuración manual
  • Prefiere accessibility_id como selector principal — es más estable que XPath y funciona en Android e iOS
  • Configura capturas de pantalla en los pasos críticos para facilitar la identificación de fallos
  • Usa Continuar en Fallo en aserciones de monitoreo para recopilar múltiples resultados sin interrumpir el flujo
  • Para apps que tardan en iniciar, agrega un paso wait con elementVisible antes de interactuar
  • El Session ID personalizado facilita la reutilización de sesión entre múltiples nodos Mobile Flow en el mismo flujo