QANode Logo

Nó Mobile Flow

O nó Mobile Flow permite automatizar interações com aplicativos móveis nativos (Android e iOS) usando o Appium. Suporta dispositivos reais, emuladores e serviços cloud como BrowserStack, Sauce Labs e LambdaTest.


Visão Geral

PropriedadeValor
Tipomobile-flow
CategoriaMobile
Cor🔴 Vermelho claro (#f87171)
Entradain
Saídaout

Pré-requisitos

Appium

O nó Mobile Flow requer um servidor Appium acessível:

SituaçãoSolução
Versão DesktopO Appium é instalado automaticamente no primeiro uso e iniciado ao executar um fluxo com nó mobile
Servidor próprioInstale manualmente: npm install -g appium + driver: appium driver install uiautomator2 (Android) ou appium driver install xcuitest (iOS)
Cloud (BrowserStack, etc.)Nenhum Appium local necessário — use as credenciais do provedor

Versões 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, o XCUITest requer macOS com Xcode configurado.

Drivers Appium

PlataformaDriverInstalação
AndroidUiAutomator2appium driver install uiautomator2
iOSXCUITestappium driver install xcuitest (requer Xcode no Mac)

Configuração Geral

CampoTipoPadrãoDescrição
CredencialselectCredencial Mobile com configurações de conexão
Modo de Sessãonew / reusenewNova sessão ou reutilizar sessão existente
Session IDstringID para identificar/reutilizar a sessão
Self HealingbooleanfalseTenta recuperar elementos quando os seletores mobile deixam de localizar o alvo original

Modo de Sessão

  • Nova Sessão (new): Abre uma nova sessão Appium a cada execução. Ideal para testes isolados.
  • Reutilizar Sessão (reuse): Reaproveita uma sessão já criada por outro nó Mobile Flow no mesmo fluxo. Útil para dividir automações longas em múltiplos nós mantendo o mesmo dispositivo conectado.

Self Healing

Quando Self Healing está habilitado, o Mobile Flow tenta recuperar automaticamente elementos em ações como toque e digitação quando os seletores gravados deixam de funcionar.

No mobile, a recuperação considera sinais como:

  • accessibility_id
  • texto visível
  • label, name, value e hint
  • resource-id
  • tipo/classe nativa do elemento
  • contexto próximo na hierarquia capturada pelo Appium

Isso ajuda em mudanças comuns como:

  • ajustes pequenos de rótulo
  • diferenças de maiúsculas/minúsculas
  • texto com ou sem acento
  • mudança de seletor mantendo o mesmo elemento na tela

O self healing em mobile também respeita a plataforma ativa:

  • prioriza estratégias compatíveis com iOS quando a execução está em iOS
  • prioriza estratégias compatíveis com Android quando a execução está em Android

Quando uma recuperação é aplicada, ela aparece nos detalhes da execução com:

  • passo afetado
  • confiança da recuperação
  • seletor mobile utilizado
  • ação Aplicar ao Fluxo para promover o seletor recuperado ao fluxo original

Credencial Mobile

A credencial centraliza as configurações de conexão e capacidades do dispositivo. Configure em Credenciais → Nova Credencial → Mobile.

Modos de Conexão

ModoDescrição
LocalAppium rodando na mesma máquina (padrão: http://localhost:4723)
Self-hostedAppium em servidor próprio com URL e token de autenticação
SaaSProvedor cloud (BrowserStack, Sauce Labs, LambdaTest, ou Custom)

Capacidades do Dispositivo

CampoDescriçãoExemplo
PlataformaAndroid ou iOSAndroid
Nome do DispositivoNome ou ID do dispositivoemulator-5554, Pixel 7
Versão da PlataformaVersão do SO13.0, 17.0
App PackagePacote do app Androidcom.meuapp.android
App ActivityActivity inicial do Android.MainActivity
Bundle IDIdentificador do app iOScom.meuapp.ios
App PathCaminho do arquivo .apk/.ipa/path/to/app.apk
UDIDID único do dispositivo realR58M20XXXXX
No ResetNão resetar o app entre sessõestrue
Full ResetResetar completamente o estado do appfalse
Automation NameDriver de automaçãoUiAutomator2 (Android), XCUITest (iOS)
Capacidades ExtrasJSON com capacidades adicionais do Appium{"appium:language": "pt"}

Passos (Mobile Steps)

O nó Mobile Flow executa uma sequência de passos configuráveis. Cada passo representa uma ação no dispositivo.

Ações Disponíveis

AçãoDescrição
tapTocar em um elemento
double-tapToque duplo em um elemento
long-pressPressionar e segurar um elemento
tap-coordsTocar em coordenadas absolutas
typeDigitar texto em um campo
clearLimpar texto de um campo
swipeDeslizar na tela
pinch-zoomGesto de pinça / zoom
multi-touchToque simultâneo em múltiplos pontos
scrollRolar por direção ou até elemento/texto
waitAguardar condição ou tempo
assertVerificar condição no app
extractExtrair texto ou atributo de elemento
permissionAceitar/dispensar alertas e gerenciar permissões
resetReiniciar o aplicativo
backPressionar botão Voltar (Android)
homePressionar botão Home (Android)
key-eventEnviar código de tecla Android

Estratégias de Seletor Mobile

EstratégiaDescriçãoExemplo
idResource ID do elementocom.meuapp:id/login_button
accessibility_idContent description / accessibility labelBotão de login
xpathExpressão XPath na hierarquia XML//android.widget.Button[@text="Entrar"]
class_nameNome da classe nativaandroid.widget.EditText
-android uiautomatorSeletor UIAutomator2 (Android)new UiSelector().text("Entrar")
-ios predicate stringNSPredicate (iOS)type == 'XCUIElementTypeButton' AND name == 'Entrar'
-ios class chainiOS Class Chain**/XCUIElementTypeButton[\name == 'Entrar'`]`

Dica: O Inspetor Mobile gera automaticamente os seletores ao tocar nos elementos, sem necessidade de escrever XPath manualmente.


Detalhes das Ações

tap

Toca em um elemento usando estratégias de seletor.

CampoTipoDescrição
SeletoresarrayEstratégias de seletor do elemento
TentativasnumberNúmero de tentativas (padrão: 3)
Delay entre tentativas (ms)numberEspera entre tentativas (padrão: 500ms)

Caso o seletor falhe em todas as tentativas e houver coordenadas de fallback (geradas pelo inspetor), o toque será realizado nas coordenadas diretas.


double-tap

Toque duplo em um elemento.

CampoTipoDescrição
SeletoresarrayEstratégias de seletor do elemento
TentativasnumberNúmero de tentativas (padrão: 3)

long-press

Pressiona e segura um elemento por uma duração determinada. Útil para abrir menus de contexto, acionar seleção de texto e outros gestos longos.

CampoTipoDescrição
SeletoresarrayEstratégias de seletor do elemento (opcional se houver X/Y)
X / YnumberCoordenadas de fallback quando não há seletor
Duração (ms)numberTempo de pressionamento (padrão: 800ms)

tap-coords

Toca em coordenadas absolutas na tela.

CampoTipoDescrição
XnumberCoordenada X em pixels
YnumberCoordenada Y em pixels

type

Digita texto em um campo de entrada.

CampoTipoDescrição
SeletoresarrayEstratégias de seletor do campo
TextostringTexto a ser digitado (suporta {{ }})
Limpar PrimeirobooleanLimpa o campo antes de digitar
TentativasnumberNúmero de tentativas de localização

clear

Limpa o conteúdo de um campo de entrada.

CampoTipoDescrição
SeletoresarrayEstratégias de seletor do campo

swipe

Desliza na tela entre dois pontos.

CampoTipoDescrição
fromX / fromYnumberCoordenadas de início
toX / toYnumberCoordenadas de destino
Duração (ms)numberVelocidade do gesto (padrão: 350ms)
DireçãostringAlternativa: up, down, left, right
PercentualnumberPercentual da tela para deslizar (com direção)

pinch-zoom

Executa um gesto de pinça (aproximar dedos) ou zoom (afastar dedos) sobre um elemento ou ponto da tela.

CampoTipoDescrição
GestostringpinchIn (pinça, reduz) ou zoomOut (zoom, amplia)
SeletoresarraySeletor do elemento central do gesto (opcional)
X / YnumberCoordenadas centrais de fallback
DistâncianumberDistância em pixels entre os dois dedos (padrão: 160)
EscalanumberFator de escala do gesto (padrão: 0.45)
Duração (ms)numberVelocidade do gesto (padrão: 500ms)

multi-touch

Simula um toque simultâneo em dois ou mais pontos da tela.

CampoTipoDescrição
PontosarrayLista de coordenadas { x, y } a tocar simultaneamente
X1 / Y1numberPrimeiro ponto (alternativa a points)
X2 / Y2numberSegundo ponto (alternativa a points)
Duração (ms)numberDuração do toque (padrão: 120ms)

scroll

Rola o conteúdo em uma direção ou continua rolando até que um elemento ou texto apareça na tela.

CampoTipoDescrição
Modostringdirection (padrão), untilElement ou untilText
Direçãostringup, down, left, right
PercentualnumberPercentual da tela a rolar por ciclo (padrão: 70)
SeletoresarraySeletor do container a rolar, ou do elemento-alvo nos modos untilElement
TextostringTexto a aguardar na tela (modo untilText)
Máximo de RolagensnumberLimite de ciclos de rolagem nos modos until* (padrão: 8)

Modos:

ModoDescrição
directionRola uma vez na direção configurada
untilElementRola repetidamente até o elemento dos seletores estar visível
untilTextRola repetidamente até o texto aparecer no XML da tela

wait

Aguarda uma condição antes de prosseguir.

CampoTipoDescrição
ModostringTipo de espera
Timeout (ms)numberTempo máximo de espera
SeletoresarraySeletores do elemento alvo (quando aplicável)
Texto EsperadostringValor de referência (modos textContains, textEquals)
AtributostringNome do atributo (modo attributeEquals)
Valor EsperadostringValor do atributo (modo attributeEquals)

Modos:

ModoDescrição
timeoutAguarda um tempo fixo em milissegundos
elementVisibleAguarda um elemento aparecer na tela
elementHiddenAguarda um elemento desaparecer ou ficar oculto
elementEnabledAguarda um elemento ficar habilitado para interação
textContainsAguarda o texto do elemento conter o valor esperado
textEqualsAguarda o texto do elemento ser exatamente o valor esperado
attributeEqualsAguarda um atributo do elemento ter o valor esperado
screenChangedAguarda a tela mudar visualmente (screenshot diferente do inicial)

assert

Verifica uma condição no aplicativo. Se falhar, o passo é marcado como falha.

CampoTipoDescrição
NomestringIdentificador da asserção (chave no output)
ModostringTipo de verificação
SeletoresarraySeletores do elemento
Texto EsperadostringValor esperado (modos text)
Continuar em FalhabooleanNão interrompe o fluxo se falhar

Modos:

ModoDescrição
elementExistsVerifica se o elemento está visível na tela
textContainsVerifica se o texto do elemento contém o valor esperado
textEqualsVerifica se o texto do elemento é exatamente o valor esperado

Os resultados das asserções ficam disponíveis nos outputs:

{{ steps["mobile-flow"].outputs.asserts.nomeAsserção }}  →  true ou false

extract

Extrai texto ou atributo de um elemento.

CampoTipoDescrição
NomestringNome da extração (chave no output)
SeletoresarraySeletores do elemento
AtributostringO que extrair: text (padrão) ou nome do atributo

Os dados extraídos ficam disponíveis nos outputs:

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

permission

Gerencia alertas de sistema e permissões do aplicativo.

CampoTipoDescrição
OperaçãostringTipo de ação (ver tabela abaixo)
PermissãostringNome da permissão Android (somente grantPermission/revokePermission)

Operações:

OperaçãoDescrição
acceptAlertAceita o alerta de sistema atual (ex: "Permitir notificações?")
dismissAlertDispensa o alerta de sistema atual
grantPermissionConcede uma permissão Android ao app (ex: android.permission.CAMERA)
revokePermissionRevoga uma permissão Android do app

grantPermission e revokePermission são suportados apenas em sessões Android com o UiAutomator2.


reset

Reinicia o aplicativo, limpando seu estado (equivalente a desinstalar e reinstalar).


back

Pressiona o botão físico/virtual Voltar (Android — keycode 4).


home

Pressiona o botão Home (Android — keycode 3).


key-event

Envia um keycode Android diretamente ao dispositivo.

CampoTipoDescrição
KeycodenumberCódigo da tecla Android (ex: 4 = BACK, 3 = HOME, 66 = ENTER)
RepetiçõesnumberQuantas vezes enviar o evento

Keycodes comuns:

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

Evidências (Screenshots)

Cada passo pode ter configuração de evidência individual:

CampoTipoDescrição
Capturar ScreenshotbooleanAtivar captura de tela
Modobefore / after / bothQuando capturar
Template de NomestringNome customizado do arquivo
Aguardar EstabilizaçãobooleanEsperar tela estável antes de capturar
Timeout de Estabilização (ms)numberTempo máximo aguardando tela estável (padrão: 2000ms)
Delay (ms)numberTempo adicional antes de capturar (padrão: 300ms)

Os screenshots gerados ficam disponíveis na aba Evidências do resultado da execução. Toques e swipes são destacados com marcação visual verde sobre o screenshot.


Outputs

OutputTipoDescrição
sessionIdstringID da sessão mobile para reutilização em outros nós
extractsobjectDados extraídos pelos passos extract (chave → valor)
assertsobjectResultados das asserções (chave → true/false)

Exemplo Completo

Login em aplicativo Android

Passos configurados no nó:

  1. wait → Modo: elementVisible, Seletor: id=com.meuapp:id/email_field (timeout: 10000ms)
  2. tap → Seletor: id=com.meuapp:id/email_field
  3. type → Seletor: id=com.meuapp:id/email_field, Texto: {{ variables.USER_EMAIL }}
  4. type → Seletor: id=com.meuapp:id/password_field, Texto: {{ variables.USER_PASSWORD }}, Limpar: true
  5. tap → Seletor: accessibility_id=Entrar
  6. wait → Modo: elementVisible, Seletor: id=com.meuapp:id/home_title (timeout: 15000ms)
  7. assert → Nome: loginOk, Modo: elementExists, Seletor: id=com.meuapp:id/home_title
  8. extract → Nome: welcomeText, Seletor: id=com.meuapp:id/welcome_message, Atributo: text

Resultado após execução:

{
  "sessionId": "minha-sessao-android",
  "extracts": { "welcomeText": "Olá, João!" },
  "asserts": { "loginOk": true }
}

Reutilizando Sessão entre Nós

Nó 1 — Mobile Flow (Login)

  • Session ID: sessao-android
  • Passos: login no app

Nó 2 — Mobile Flow (Verificar Pedido)

  • Modo de Sessão: reuse
  • Session ID: sessao-android
  • Passos: navegar para pedidos, verificar status

Ambos os nós compartilham o mesmo dispositivo e estado de sessão.


Dicas

  • Use o Inspetor Mobile para gravar passos visualmente — ele gera os seletores automaticamente ao tocar nos elementos
  • Na versão desktop, o Appium é iniciado automaticamente quando um fluxo com nó mobile é executado — não é necessário nenhuma configuração manual
  • Prefira accessibility_id como seletor principal — é mais estável que XPath e funciona em Android e iOS
  • Configure screenshots nos passos críticos para facilitar a identificação de falhas
  • Use Continuar em Falha em asserções de monitoramento para coletar múltiplos resultados sem interromper o fluxo
  • Para apps que demoram para iniciar, adicione um passo wait com elementVisible antes de interagir
  • O Session ID personalizado facilita a reutilização de sessão entre múltiplos nós Mobile Flow no mesmo fluxo