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: Se preferir seletores CSS e XPath tradicionais, 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

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.


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
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
wait🟣Aguardar condição
scroll🟡Rolar página
refresh🟠Recarregar página
frameCinzaAlternar frame
rightClick🟡Clique com botão direito
upload🔵Upload de arquivos
dialog🟣Tratar dialogs (alert/confirm)
dragDrop🔵Arrastar 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 {{ }})

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

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

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.


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

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