QANode Logo

Nó Smart Locators

O nó Smart Locators permite automatizar interações com páginas web usando localizadores semânticos do Playwright — baseados em roles ARIA, labels, placeholders e outros atributos de acessibilidade. Esta abordagem é mais resiliente que seletores CSS, pois reflete como os usuários realmente encontram elementos na página.

Dica: Para fluxos web novos gravados pela extensão, prefira o Smart Web Flow. Se preferir seletores CSS e XPath tradicionais em fluxos legados, use o nó Web Flow.


Visão Geral

PropriedadeValor
Tiposmart-locators
CategoriaWeb
Cor🔵 Azul (#3b82f6)
Entradain
Saídaout

Configuração Geral

Idêntica ao nó Web Flow:

CampoTipoPadrãoDescrição
Modo de Sessãonew / reusenewNova sessão ou reutilizar existente
Session IDstringID da sessão para reutilizar
HeadlessbooleantrueExecutar sem interface gráfica visível
Estratégia de StorageinMemory / persistedinMemoryPersistir cookies/localStorage
Chave de StoragestringIdentificador do storage persistido
Browserchromium / firefox / webkitchromiumNavegador a usar na execução
Dispositivodesktop / mobiledesktopModo de emulação
Viewportpreset ou custom1920x1080Tamanho da janela (modo Desktop)
Largura / AlturanumberDimensões customizadas (quando custom)
Modelo de DispositivostringiPhone 14Dispositivo a emular (modo Mobile)
Varredura de acessibilidadebooleanfalseExecutar diagnóstico de acessibilidade
Auditoria de performancebooleanfalseColetar métricas de carregamento e rede durante a execução
Tempo máximo de carregamento (ms)number4000Threshold para falhar quando o carregamento da página excede o limite
Tempo máximo de resposta da API (ms)number1500Threshold para APIs lentas capturadas na sessão
Falhar em erros de requisiçãobooleantrueMarca o nó como falho quando houver erro HTTP/rede nas APIs monitoradas
Self HealingbooleanfalseTenta recuperar localizadores quando o elemento muda e o locator original não resolve mais o alvo

As opções de Browser & Device são as mesmas do nó Web Flow — consulte a documentação do Web Flow para detalhes sobre presets de viewport e dispositivos mobile disponíveis.

Auditoria de Performance

Quando Auditoria de performance está habilitada, o Smart Locators monitora a sessão Playwright e gera evidências visuais de performance por tela.

O recurso coleta:

  • Page Load da tela
  • FCP (First Contentful Paint)
  • LCP (Largest Contentful Paint)
  • quantidade total de requests
  • quantidade de requests de API
  • erros de request/API
  • APIs lentas por tela

Além do resumo global, o QANode gera checkpoints por tela navegada, com:

  • nome da tela
  • URL
  • passo que originou a navegação
  • gráfico das APIs mais lentas
  • gráfico separado para erros de API quando existirem

Outputs de Performance

Quando a auditoria está ligada, o nó expõe:

  • performancePassed
  • performanceRequestCount
  • performanceApiRequestCount
  • performanceErrorCount
  • performanceSlowRequestCount
  • performance

O objeto performance contém um resumo estruturado da execução, incluindo os checkpoints por tela.

Self Healing

Quando Self Healing está habilitado, o Smart Locators tenta recuperar automaticamente ações baseadas em localizadores semânticos quando o locator original deixa de encontrar o elemento esperado.

Além do próprio locator semântico, o mecanismo considera:

  • texto e nome acessível do elemento
  • role
  • label, placeholder, title e outros atributos relevantes
  • contexto estrutural da página, como container, formulário, heading e posição relativa

Isso ajuda em cenários como:

  • mudança de texto com o mesmo significado
  • troca entre maiúsculas/minúsculas
  • texto com ou sem acento
  • variações curtas, como EntrarLogin ou AvançarContinuar

O recurso é conservador: ele só aplica a recuperação quando encontra um candidato claramente mais forte que os demais, evitando “chutes” em telas ambíguas.

Quando um passo é recuperado, a execução mostra:

  • o passo afetado
  • a confiança da recuperação
  • o locator utilizado
  • a opção Aplicar ao Fluxo para atualizar o fluxo com o locator recuperado

Sistema de Localizadores

Métodos de Localização

Em vez de seletores CSS, o Smart Locators usa métodos semânticos do Playwright:

MétodoDescriçãoExemplo
getByRoleLocaliza por ARIA roleBotão "Entrar", Link "Home"
getByTextLocaliza por texto visívelTexto "Bem-vindo"
getByLabelLocaliza por label associadaCampo com label "E-mail"
getByPlaceholderLocaliza por placeholderCampo com placeholder "Digite seu nome"
getByAltTextLocaliza por alt textImagem com alt "Logo"
getByTitleLocaliza por titleElemento com title "Fechar"
getByTestIdLocaliza por data-testiddata-testid="submit-btn"

Configuração do Localizador

CampoTipoDescrição
MétodostringMétodo de localização
ValorstringTexto/valor a ser buscado
NomestringNome do role (somente para getByRole)
ExatobooleanCorrespondência exata (false = contém)
NthnumberÍndice do elemento (quando há múltiplos)

ARIA Roles Disponíveis

Para o método getByRole, os seguintes roles estão disponíveis:

Roles de InteraçãoRoles de EstruturaRoles de Feedback
buttonheadingalert
checkboxlistalertdialog
comboboxlistitemdialog
linknavigationprogressbar
listboxregionstatus
menurowtooltip
menuitemcell
optiongrid
radiotab
searchboxtablist
slidertabpanel
spinbuttontoolbar
switchtree
textboxtreeitem

Exemplo de uso:

Método: getByRole
Valor: button
Nome: Entrar

Equivale ao Playwright: page.getByRole('button', { name: 'Entrar' })


Ações Disponíveis

AçãoCorDescrição
navigate🔵Navegar para URL
switchPage🟣Trocar para outra página ou aba
click🟡Clicar em elemento
dblclick🟡Duplo clique
fill🟢Preencher campo (instantâneo)
type🟢Digitar caractere por caractere
check🟢Marcar checkbox/radio
uncheck🟢Desmarcar checkbox
selectOption🟣Selecionar opção de dropdown
hover🔵 CianoPassar mouse sobre elemento
focus🔵 ClaroFocar em elemento
press🟢Pressionar tecla
assert🔴Verificar condição
extract🔵 CianoExtrair dados
extractList🟢 EsmeraldaExtrair lista de elementos repetidos
wait🟣Aguardar condição
scroll🟡Rolar página
refresh🟠Recarregar página
clock🟢 ÁguaControlar o relógio do navegador
frameCinzaAlternar frame
rightClick🟡Clique com botão direito
upload🔵Upload de arquivos
dialog🟣Tratar dialogs (alert/confirm)
dragRosaArrastar e soltar
evaluateExecutar JavaScript na página
screenshot🔵Capturar screenshot

Detalhes das Ações

navigate

Navega para uma URL.

CampoTipoDescrição
URLstringURL de destino (suporta {{ }})

switchPage

Troca a página ativa da sessão quando um clique, link ou ação abre uma nova aba/janela e os próximos passos precisam continuar nela.

CampoTipoDescrição
ModostringÚltima aba aberta, próxima, anterior ou busca por URL/título
URL contémstringTrecho opcional da URL para localizar a aba
Título contémstringTrecho opcional do título da página
Aguardar AtéstringEvento de carregamento esperado após a troca
Timeout (ms)numberTempo máximo para localizar/carregar a aba

Modos:

ModoDescrição
lastUsa a última aba aberta
nextUsa a próxima aba em relação à aba atual
previousUsa a aba anterior
matchProcura por trecho de URL e/ou título

Quando a extensão identifica links que abrem nova aba, ela pode inserir este passo automaticamente. Em fluxos manuais, adicione switchPage depois do click que abre a aba.


click

Clica em um elemento localizado semanticamente.

CampoTipoDescrição
LocalizadorlocatorConfiguração do localizador
TentativasnumberNúmero de tentativas (padrão: 3)

O click aguarda o elemento ficar visível, rola até ele se necessário, e então clica. Se falhar, tenta novamente.

Exemplo:

Método: getByRole
Valor: button
Nome: Enviar
Tentativas: 3

dblclick

Duplo clique em um elemento.

CampoTipoDescrição
LocalizadorlocatorConfiguração do localizador
TentativasnumberNúmero de tentativas

fill

Preenche um campo de entrada instantaneamente (substitui o valor).

CampoTipoDescrição
LocalizadorlocatorConfiguração do localizador
TextostringTexto a ser preenchido (suporta {{ }})
Limpar PrimeirobooleanLimpa o campo antes

Usa locator.fill() do Playwright — ideal para campos simples.


type

Digita texto caractere por caractere, simulando digitação real.

CampoTipoDescrição
LocalizadorlocatorConfiguração do localizador
TextostringTexto a ser digitado
Delay (ms)numberIntervalo entre teclas (padrão: 50ms)
Limpar PrimeirobooleanLimpa o campo antes

Usa locator.pressSequentially() do Playwright — ideal para campos com:

  • Autocomplete (sugestões aparecem enquanto digita)
  • Máscaras (CPF, telefone, CEP)
  • Validação on-keypress (verifica cada tecla)

Exemplo:

Localizador: getByPlaceholder → "CPF"
Texto: 123.456.789-00
Delay: 100ms

check / uncheck

Marca ou desmarca um checkbox/radio button.

CampoTipoDescrição
LocalizadorlocatorConfiguração do localizador

Exemplo:

Método: getByLabel
Valor: Aceito os termos de uso

selectOption

Seleciona uma opção de um dropdown (<select>).

CampoTipoDescrição
LocalizadorlocatorConfiguração do dropdown
Selecionar Porstringvalue, label ou index
ValorstringValor correspondente

hover

Passa o mouse sobre um elemento.

CampoTipoDescrição
LocalizadorlocatorConfiguração do localizador
TentativasnumberNúmero de tentativas
Espera Após (ms)numberTempo de espera após hover

focus

Define o foco em um elemento.

CampoTipoDescrição
LocalizadorlocatorConfiguração do localizador

press

Pressiona uma tecla do teclado no contexto de um elemento.

CampoTipoDescrição
LocalizadorlocatorElemento que receberá a tecla
TeclastringNome da tecla (Enter, Tab, Escape, etc.)
Espera Após (ms)numberTempo de espera após pressionar

drag

Arrasta um elemento localizado semanticamente e solta sobre outro localizador ou em coordenadas gravadas.

CampoTipoDescrição
Localizador de OrigemlocatorElemento que será arrastado
Localizador de DestinolocatorElemento onde será solto, quando houver
Destino X / YnumberCoordenadas absolutas exibidas quando o destino não possui localizador confiável
Esperar Após (ms)numberTempo de espera após soltar

O Smart Locators tenta usar os localizadores semânticos do Playwright, como getByRole, getByText, getByLabel e getByTestId. Quando a página possui elementos repetidos e o passo vem da extensão, o JSON pode carregar metadados internos de posição para ajudar o executor a escolher o elemento mais próximo do gesto original. Esses metadados não aparecem como campos principais no painel.

Para componentes de drag/drop, o QANode também tenta promover o localizador semântico para o container interativo real. Isso é útil quando o texto clicado fica dentro de outro elemento arrastável, por exemplo:

  • Um <p> dentro de um card arrastável
  • Uma imagem dentro de um container draggable
  • Uma área de drop marcada por classe ou atributos de drop

Se o destino semântico for genérico demais ou falhar, mas houver Destino X / Y, o Smart Locators pode usar as coordenadas gravadas como fallback. Isso permite automatizar canvas, Kanban e áreas de soltar que não têm texto, role ou label próprios.

Boas práticas:

  • Prefira componentes com nomes acessíveis (aria-label, texto visível, labels)
  • Use data-testid ou data-qa para cards, colunas e áreas de drop críticas
  • Evite botões apenas com ícone sem aria-label
  • Revise gravações que dependam de nth, principalmente quando há textos repetidos
  • Use screenshots before e after para comprovar visualmente o movimento

assert

Verifica condições na página. Oferece múltiplos modos de verificação:

CampoTipoDescrição
NomestringIdentificador da asserção
LocalizadorlocatorElemento alvo (quando aplicável)
ModostringTipo de verificação
Texto EsperadostringValor esperado
Continuar em FalhabooleanNão falhar o nó inteiro

Modos de Assert:

ModoDescriçãoRequer Localizador
visibleElemento está visívelSim
hiddenElemento está ocultoSim
textContainsTexto contém valorSim
textEqualsTexto é exatamente o valorSim
hasCountContagem de elementosSim
enabledElemento está habilitadoSim
disabledElemento está desabilitadoSim
checkedCheckbox/radio está marcadoSim
hasValueInput tem valor específicoSim
hasAttributeElemento tem atributo com valorSim
hasURLURL da página contém/é igual aNão
hasTitleTítulo da página contém/é igual aNão

Exemplos:

// Verificar que botão "Enviar" está visível
Modo: visible, Localizador: getByRole("button", "Enviar")

// Verificar que mensagem contém "Sucesso"
Modo: textContains, Localizador: getByText("Sucesso"), Esperado: "Sucesso"

// Verificar URL após login
Modo: hasURL, Esperado: "/dashboard"

// Verificar que campo está desabilitado
Modo: disabled, Localizador: getByLabel("E-mail")

extract

Extrai dados de um elemento.

CampoTipoDescrição
NomestringNome da extração
LocalizadorlocatorConfiguração do localizador
AtributostringO que extrair

Atributos disponíveis:

AtributoDescrição
textTexto visível (textContent)
innerTextTexto interno
innerHTMLHTML interno
inputValueValor de campos de input
hrefURL de links
srcURL de imagens
valueValor genérico

extractList

Itera sobre elementos repetidos na página — linhas de tabela, cards, itens de lista — e extrai um ou mais campos de cada item, produzindo um array de objetos no output.

CampoTipoDescrição
Nome da SaídastringNome da chave no output (ex: lista_pedidos)
Seletor dos ItensarrayEstratégias CSS/XPath que identificam cada elemento repetido
CamposarrayLista de campos a extrair de cada item (ver abaixo)
LimitenumberNúmero máximo de itens a processar (padrão: 100)

Cada entrada em Campos define:

PropriedadeTipoDescrição
namestringNome do campo no objeto de saída
selectorStrategiesarraySeletor relativo dentro do item (:scope = o próprio item)
attrstringAtributo a extrair: text, inputValue, innerHTML, href, src, etc.

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

{{ steps["smart-locators"].outputs.extracts.lista_pedidos }}
// → [ { numero: "#1042", status: "Enviado" }, { numero: "#1041", status: "Entregue" } ]

Para gravar um passo extractList automaticamente pela extensão Chrome, use Ctrl+Shift+E durante a gravação.


wait

Aguarda uma condição.

ModoDescrição
timeoutAguarda tempo fixo
visibleAguarda elemento ficar visível
hiddenAguarda elemento desaparecer
networkIdleAguarda requisições de rede terminarem

scroll

Rola a página.

ModoDescrição
toLocatorRola até o elemento
byRola quantidade fixa de pixels
toBottomRola até o fim da página

refresh

Recarrega a página. Mesma configuração do Web Flow.


clock

Controla o relógio do navegador usando page.clock do Playwright. A ação é a mesma disponível no Web Flow e pode ser usada para validar comportamentos por data/hora sem depender do horário real da máquina.

CampoTipoDescrição
OperaçãostringFixar data/hora, Avançar tempo, Pausar em ou Retomar relógio
Data / HorastringData/hora alvo para Fixar data/hora e Pausar em
Duraçãostring / numberTempo a avançar em Avançar tempo, como 20:00, 02:34:10 ou milissegundos
Recarregar página após aplicarbooleanRecarrega a página após aplicar o clock quando ativado
Aguardar recarregamento atéstringEvento usado para aguardar o reload

Novos passos de clock nascem com o reload desligado. Use reload ligado apenas quando a aplicação depende do carregamento da página para recalcular datas ou horários.


frame

Alterna para iframe. Suporta modos name e main (voltar ao principal).


Evidências (Screenshots por Passo)

Idêntico ao Web Flow — cada passo pode ter configuração individual de captura de screenshot.


Teste de Acessibilidade

O Smart Locators suporta escaneamento automático de acessibilidade com axe-core integrado. Quando ativado, o nó audita a página após cada passo que captura screenshot, identificando violações WCAG/ARIA e marcando visualmente os elementos problemáticos.

O Smart Locators já usa localizadores semânticos baseados em roles ARIA — combiná-lo com o escaneamento de acessibilidade é especialmente útil para verificar se os elementos que você interage passam nos critérios de acessibilidade.

Configuração

CampoTipoPadrãoDescrição
Accessibility ScanbooleanfalseAtiva o escaneamento axe-core
Fail When Severity >=none / minor / moderate / serious / criticalseriousNível mínimo que reprova o nó

Como Funciona

A cada passo que tira screenshot, o axe-core é injetado na página e analisa o documento em busca de violações. As violações são desenhadas sobre o screenshot com caixas coloridas no elemento afetado e um painel de contagem no canto:

SeveridadeCorDescrição
Critical🔴 VermelhoBloqueia acesso a usuários com deficiência
Serious🟠 LaranjaCausa dificuldade significativa
Moderate🟡 AmareloCausa alguma dificuldade
Minor🔵 AzulMelhoria recomendada

Ao final da execução são gerados automaticamente:

  • Screenshots por passo — overlay com caixas coloridas + painel Critical N / Serious N / Moderate N / Minor N + top 2 regras
  • Gráfico de severidade{id}-accessibility-severity-chart.png — distribuição por nível
  • Gráfico de regras{id}-accessibility-rule-chart.png — top 8 regras mais violadas
  • Relatório JSON{id}-accessibility-report.json — dados completos de todas as violações

Critério de Aprovação

O nó falha se houver qualquer violação com severidade igual ou superior ao threshold configurado. Use none para nunca reprovar (coletar métricas sem bloquear o fluxo).

Exemplo: Verificar acessibilidade do formulário de login

Configuração do nó:
  Accessibility Scan: true
  Fail When Severity >= : serious

Passos:
1. navigate → https://meusite.com/login         (sem screenshot = sem scan)
2. fill → getByLabel("E-mail") → "..."           → screenshot after → scan executado
3. fill → getByLabel("Senha") → "..."            → screenshot after → scan executado
4. click → getByRole("button", { name: "Entrar" }) → screenshot after → scan executado
5. wait → networkIdle
6. assert → "loginOk" → textContains → getByText("Bem-vindo") → screenshot → scan executado

Se qualquer passo tiver violação serious ou critical, o nó é reprovado com:

"Accessibility findings at or above "serious" were detected."


Outputs

OutputTipoDescrição
sessionIdstringID da sessão do navegador
extractsobjectDados extraídos (chave → valor)
assertsobjectResultados das asserções (chave → boolean)
accessibilityPassedbooleanSe passou no critério de severidade (quando habilitado)
accessibilityViolationCountnumberTotal de instâncias de violação encontradas
accessibilityobjectRelatório completo de acessibilidade
accessibility.thresholdstringThreshold configurado
accessibility.scanCountnumberNúmero de checkpoints escaneados
accessibility.countsobject{ minor, moderate, serious, critical } — totais agregados
accessibility.stepsarrayDetalhes por checkpoint (url, counts, topRules)
accessibility.rulesarrayTop 10 regras violadas em todo o fluxo

Exemplo Completo: Login com Smart Locators

Passo 1: navigate → https://meusite.com/login
Passo 2: fill → getByLabel("E-mail") → "{{ variables.EMAIL }}"
Passo 3: fill → getByLabel("Senha") → "{{ variables.SENHA }}"
Passo 4: click → getByRole("button", { name: "Entrar" })
Passo 5: wait → networkIdle
Passo 6: assert → "loginOk" → textContains → getByText("Bem-vindo")
Passo 7: extract → "userName" → getByRole("heading") → text

Quando Usar Smart Locators vs Web Flow

CenárioRecomendação
Site com boas práticas de acessibilidadeSmart Locators
Site com data-testid em todos os elementosWeb Flow
Formulários com labelsSmart Locators
Elementos sem texto nem roleWeb Flow (CSS/XPath)
Teste de acessibilidadeSmart Locators
Legacy / sites sem semânticaWeb Flow

Integração com Custom JavaScript

O nó Custom JavaScript tem acesso direto à sessão do Smart Locators, permitindo estender qualquer fluxo com lógica personalizada, asserções avançadas e manipulação da página usando a API completa do Playwright.

Variáveis disponíveis no Custom JS

VariávelTipoDescrição
pagePageAtalho direto para a página ativa da sessão atual
contextBrowserContextContexto do navegador (cookies, localStorage, múltiplas abas)
browserBrowserInstância do navegador
webobjectNamespace com métodos para gerenciar sessões web

Essas variáveis são populadas automaticamente a partir da sessão ativa. Use um nó Smart Locators antes do Custom JS com sessionMode: reuse para compartilhar a sessão.


Uso direto de page

Acesse a page diretamente para usar qualquer API do Playwright:

// Verificar texto com getByRole (mesmo modelo semântico do Smart Locators)
const heading = await page.getByRole('heading', { name: 'Bem-vindo' });
const texto = await heading.textContent();

// Verificar visibilidade
const botao = page.getByRole('button', { name: 'Enviar' });
const visivel = await botao.isVisible();

// Extrair valor de campo localizado por label
const campo = page.getByLabel('E-mail');
const valor = await campo.inputValue();

// Tirar screenshot personalizado
await page.screenshot({ path: '/tmp/resultado.png', fullPage: true });

// Controlar data/hora dentro da mesma sessão Playwright
await page.clock.install({ time: new Date('2026-04-24T10:00:00') });
await page.clock.fastForward('20:00');

Asserções com web.run()

Para usar o expect do Playwright (asserções nativas com retry automático):

await web.run(async ({ page, expect }) => {
  // Asserções semânticas — mesmo padrão do Smart Locators
  await expect(page.getByRole('button', { name: 'Enviar' })).toBeVisible();
  await expect(page.getByLabel('E-mail')).toBeEnabled();
  await expect(page.getByText('Sucesso')).toBeVisible();

  // Verificar URL após navegação
  await expect(page).toHaveURL('/dashboard');

  // Verificar título da página
  await expect(page).toHaveTitle(/Painel/);
});

O expect do Playwright faz retry automático por até 5 segundos, ideal para páginas com animações ou carregamento assíncrono.


Namespace web

MétodoDescrição
web.run(async ({ page, expect }) => {})Executa bloco com page e expect da sessão ativa
web.session(id?)Retorna { page, context, browser } de uma sessão específica
web.current()Retorna { page, context, browser } da sessão mais recente
web.hasSession(id?)Verifica se existe sessão ativa (ou com ID específico)

Múltiplas sessões

Quando o fluxo possui vários nós Smart Locators rodando com sessões diferentes:

// Sessão do primeiro nó Smart Locators
const { page: page1 } = web.session('sessao-login');

// Sessão do segundo nó Smart Locators
const { page: page2 } = web.session('sessao-admin');

// Ações em paralelo em sessões diferentes
const [textoUsuario, textoAdmin] = await Promise.all([
  page1.getByRole('heading').textContent(),
  page2.getByRole('heading').textContent(),
]);

Exemplo prático: validar resultado de busca semântica

// Após nó Smart Locators que realizou uma busca
await web.run(async ({ page, expect }) => {
  // Verificar que lista de resultados está presente
  await expect(page.getByRole('list', { name: 'Resultados' })).toBeVisible();

  // Contar itens
  const itens = page.getByRole('listitem');
  const quantidade = await itens.count();

  if (quantidade === 0) {
    throw new Error('Nenhum resultado encontrado');
  }

  // Verificar que o primeiro resultado contém o termo buscado
  const termo = variables.TERMO_BUSCA;
  await expect(itens.first()).toContainText(termo);
});

Dicas

  • Prefira getByRole — é o mais resiliente e reflete como assistive technologies encontram elementos
  • Use getByLabel para campos de formulário — é mais estável que CSS
  • getByTestId é ótimo para elementos sem role/label claro
  • Use a ação type (em vez de fill) para campos com máscaras ou autocomplete
  • O campo Nth permite selecionar um elemento específico quando múltiplos correspondem ao localizador