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
Color🔴 Rojo 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
Self HealingbooleanfalseIntenta recuperar elementos cuando los selectores mobile dejan de localizar el objetivo original

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.

Self Healing

Cuando Self Healing está habilitado, Mobile Flow puede recuperar automáticamente elementos en acciones como toque y escritura cuando los selectores grabados dejan de funcionar.

En mobile, la recuperación considera señales como:

  • accessibility_id
  • texto visible
  • label, name, value y hint
  • resource-id
  • clase/tipo nativo del elemento
  • contexto cercano en la jerarquía capturada por Appium

Esto ayuda en cambios comunes como:

  • pequeños ajustes de etiqueta
  • diferencias entre mayúsculas y minúsculas
  • texto con o sin acentos
  • cambios de selector manteniendo el mismo elemento en pantalla

El self healing en mobile también respeta la plataforma activa:

  • prioriza estrategias compatibles con iOS cuando la ejecución corre en iOS
  • prioriza estrategias compatibles con Android cuando la ejecución corre en Android

Cuando una recuperación se aplica, aparece en los detalles de la ejecución con:

  • el paso afectado
  • la confianza de la recuperación
  • el selector mobile utilizado
  • una acción Aplicar al Flujo para promover el selector recuperado al flujo original

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.

Cuando el flujo se graba vía MCP, los pasos aparecen en el editor visual con el mismo patrón de revisión del Inspector Mobile, incluyendo destaques de interacción e información útil para revisar fallos.

Use MCP para grabar o ajustar jornadas mobile cuando un cliente de IA necesita interactuar con Appium, pero revise el editor visual para confirmar que cada objetivo grabado representa la acción esperada.

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
double-tapDoble toque en un elemento
long-pressPulsación larga en un elemento
pinch-zoomGesto de pellizco o zoom sobre un elemento
multi-touchGesto multitáctil con dos dedos simultáneos
permissionAceptar/descartar alertas del sistema o gestionar permisos Android
push-fileEnviar archivo al dispositivo
pull-fileDescargar archivo del dispositivo a QANode
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

Para campos de texto, QANode intenta localizar el objetivo por capas:

  1. identificadores fuertes como resource-id, accessibility id, name y content-desc;
  2. hint, label y text cuando pertenecen al propio campo;
  3. relación contextual entre el label visible y el input cercano;
  4. coordenadas grabadas como fallback visual;
  5. clase genérica de input solo como último recurso.

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
Modostringdirection (predeterminado), untilElement, untilText
Direcciónstringup, down, left, right
SelectoresarraySelector del contenedor a desplazar (opcional)
TextostringTexto a buscar (modo untilText)
Máx. DesplazamientosnumberNúmero máximo de intentos de desplazamiento (modos untilElement/untilText)

Modos:

ModoDescripción
directionDesplaza en la dirección especificada (comportamiento predeterminado)
untilElementSigue desplazando hasta que el elemento que coincide con los selectores aparezca en pantalla
untilTextSigue desplazando hasta que aparezca un elemento con el texto especificado

wait

Espera una condición antes de continuar.

CampoTipoDescripción
ModostringTipo de espera
Timeout (ms)numberTiempo máximo de espera
SelectoresarraySelectores (modos que requieren elemento)
Texto EsperadostringTexto o valor esperado (modos de texto/atributo)
Nombre del AtributostringAtributo a verificar (modo attributeEquals)

Modos:

ModoDescripción
timeoutEspera un tiempo fijo en milisegundos
elementVisibleEspera a que un elemento aparezca en pantalla
elementHiddenEspera a que un elemento desaparezca de la pantalla
elementEnabledEspera a que un elemento esté habilitado/interactivo
textContainsEspera a que el texto de un elemento contenga el valor esperado
textEqualsEspera a que el texto de un elemento sea exactamente el valor esperado
attributeEqualsEspera a que un atributo específico de un elemento sea igual al valor esperado
screenChangedEspera a que el contenido de la pantalla cambie tras una acción

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 }}

double-tap

Hace doble toque en 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)

long-press

Realiza una pulsación larga en un elemento.

CampoTipoDescripción
SelectoresarrayEstrategias de selector del elemento
XnumberCoordenada X (usada cuando no hay selectores)
YnumberCoordenada Y (usada cuando no hay selectores)
Duración (ms)numberDuración de la pulsación (predeterminado: 800ms)

pinch-zoom

Realiza un gesto de pellizco o zoom sobre un elemento.

CampoTipoDescripción
SelectoresarrayEstrategias de selector del elemento
GestostringpinchIn (pellizco para alejar) o zoomOut (apertura para acercar)
Distancia (px)numberDistancia de movimiento de los dedos en píxeles
EscalanumberFactor de escala del gesto
Duración (ms)numberDuración del gesto en milisegundos

multi-touch

Realiza un gesto multitáctil con dos dedos simultáneos.

CampoTipoDescripción
PuntosarrayArray de puntos de toque con x, y, duration
X1 / Y1numberCoordenadas del primer dedo (cuando no se usa el array de puntos)
X2 / Y2numberCoordenadas del segundo dedo (cuando no se usa el array de puntos)

permission

Acepta o descarta alertas del sistema, o concede/revoca permisos de la app Android.

CampoTipoDescripción
AcciónstringacceptAlert, dismissAlert, grantPermission, revokePermission
Nombre del PermisostringNombre del permiso Android (acciones grantPermission/revokePermission)

Acciones:

AcciónDescripción
acceptAlertAcepta la alerta del sistema actual (Aceptar / Permitir)
dismissAlertDescarta la alerta del sistema actual (Cancelar / Denegar)
grantPermissionConcede un permiso Android a la app
revokePermissionRevoca un permiso Android de la app

Las acciones grantPermission y revokePermission son exclusivas de Android. El nombre del permiso sigue el formato Android, por ejemplo: android.permission.CAMERA.


push-file

Envía un archivo de QANode al dispositivo antes de continuar la automatización.

CampoTipoDescripción
ArchivofileRefArchivo a enviar
Ruta en el dispositivostringRuta de destino. Si está vacía, QANode usa un lugar predeterminado de la plataforma

Use este paso cuando la aplicación necesita que un archivo exista en el dispositivo antes de abrir un selector nativo, galería, picker de documentos o flujo de upload.

En Android, las rutas comunes quedan en /sdcard/Download/.... En iOS, QANode intenta enviar al container de la aplicación cuando está disponible y usa un fallback compatible con Appium/XCUITest.


pull-file

Descarga un archivo del dispositivo, lo guarda como artefacto de QANode y retorna fileRef.

CampoTipoDescripción
ModoselecciónRuta exacta, carpeta/patrón o detección del más reciente
Ruta en el dispositivostringRuta exacta del archivo, cuando se conoce
CarpetastringCarpeta a consultar, como /sdcard/Download
PatrónstringFiltro de nombre, como *.pdf, *.txt, *.jpg o *
Nombre de la variablestringClave en outputs.files
Nombre del archivo de salidastringNombre guardado en QANode. Si está vacío, usa el nombre encontrado

Cuando sea posible, prefiera Ruta exacta. Cuando la aplicación genera el archivo con nombre dinámico, use carpeta/patrón para capturar el archivo compatible más reciente.

Archivos como imágenes, PDFs, textos, planillas y videos pueden capturarse siempre que Appium consiga leer el archivo en el dispositivo o en el container de la aplicación.


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)
filesobjectArchivos descargados por pasos pull-file
fileReffileRefAtajo para el último archivo descargado

Archivos descargados

Cuando se ejecuta un paso Descargar archivo, el output queda disponible por el nombre de la variable:

{{ steps["mobile-flow"].outputs.files.reporte.fileRef }}
{{ steps["mobile-flow"].outputs.files.reporte.name }}
{{ steps["mobile-flow"].outputs.fileRef }}

Use el fileRef para pasar el archivo a Extraer Archivo, Archivo a Base64, HTTP Request, componentes u otros nodos que aceptan archivo.


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