Logo de QANode

Nodo Smart Locators

El nodo Smart Locators permite automatizar interacciones con páginas web usando localizadores semánticos de Playwright — basados en roles ARIA, labels, placeholders y otros atributos de accesibilidad. Este enfoque es más resiliente que los selectores CSS, ya que refleja cómo los usuarios realmente encuentran los elementos en la página.

Consejo: Si prefieres selectores CSS y XPath tradicionales, usa el nodo Web Flow.


Descripción General

PropiedadValor
Tiposmart-locators
CategoríaWeb
ColorAzul (#3b82f6)
Entradain
Salidaout

Configuración General

Idéntica al nodo Web Flow:

CampoTipoPredeterminadoDescripción
Modo de Sesiónnew / reusenewNueva sesión o reutilizar una existente
Session IDstringID de la sesión a reutilizar
HeadlessbooleantrueEjecutar sin interfaz gráfica visible
Estrategia de StorageinMemory / persistedinMemoryPersistir cookies/localStorage
Clave de StoragestringIdentificador del storage persistido
Navegadorchromium / firefox / webkitchromiumNavegador a usar en la ejecución
Dispositivodesktop / mobiledesktopModo de emulación
Viewportpreset o custom1920x1080Tamaño de ventana (modo Desktop)
Ancho / AltonumberDimensiones personalizadas (cuando custom)
Modelo de DispositivostringiPhone 14Dispositivo a emular (modo Mobile)

Las opciones de Navegador & Dispositivo son idénticas al nodo Web Flow — consulta la documentación de Web Flow para detalles sobre presets de viewport y dispositivos mobile disponibles.


Sistema de Localizadores

Métodos de Localización

En lugar de selectores CSS, Smart Locators usa métodos semánticos de Playwright:

MétodoDescripciónEjemplo
getByRoleLocaliza por ARIA roleBotón "Ingresar", Enlace "Inicio"
getByTextLocaliza por texto visibleTexto "Bienvenido"
getByLabelLocaliza por label asociadaCampo con label "Correo electrónico"
getByPlaceholderLocaliza por placeholderCampo con placeholder "Ingresa tu nombre"
getByAltTextLocaliza por alt textImagen con alt "Logo"
getByTitleLocaliza por titleElemento con title "Cerrar"
getByTestIdLocaliza por data-testiddata-testid="submit-btn"

Configuración del Localizador

CampoTipoDescripción
MétodostringMétodo de localización
ValorstringTexto/valor a buscar
NombrestringNombre del role (solo para getByRole)
ExactobooleanCoincidencia exacta (false = contiene)
NthnumberÍndice del elemento (cuando hay múltiples)

ARIA Roles Disponibles

Para el método getByRole, están disponibles los siguientes roles:

Roles de InteracciónRoles de EstructuraRoles de Retroalimentación
buttonheadingalert
checkboxlistalertdialog
comboboxlistitemdialog
linknavigationprogressbar
listboxregionstatus
menurowtooltip
menuitemcell
optiongrid
radiotab
searchboxtablist
slidertabpanel
spinbuttontoolbar
switchtree
textboxtreeitem

Ejemplo de uso:

Método: getByRole
Valor: button
Nombre: Ingresar

Equivale en Playwright a: page.getByRole('button', { name: 'Ingresar' })


Acciones Disponibles

AcciónColorDescripción
navigateAzulNavegar a URL
clickAmarilloHacer clic en elemento
dblclickAmarilloDoble clic
fillVerdeRellenar campo (instantáneo)
typeVerdeEscribir carácter por carácter
checkVerdeMarcar checkbox/radio
uncheckVerdeDesmarcar checkbox
selectOptionMoradoSeleccionar opción de dropdown
hoverCianPasar mouse sobre elemento
focusAzul claroEnfocar elemento
pressVerdePresionar tecla
assertRojoVerificar condición
extractCianExtraer datos
waitMoradoEsperar condición
scrollAmarilloDesplazar página
refreshNaranjaRecargar página
frameGrisAlternar frame
rightClickAmarilloClic con botón derecho
uploadAzulSubir archivos
dialogMoradoManejar dialogs (alert/confirm)
dragDropAzulArrastrar y soltar
evaluateBlancoEjecutar JavaScript en la página
screenshotAzulCapturar screenshot

Detalles de las Acciones

navigate

Navega a una URL.

CampoTipoDescripción
URLstringURL de destino (soporta {{ }})

click

Hace clic en un elemento localizado semánticamente.

CampoTipoDescripción
LocalizadorlocatorConfiguración del localizador
IntentosnumberNúmero de intentos (predeterminado: 3)

El click espera a que el elemento sea visible, se desplaza hasta él si es necesario, y luego hace clic. Si falla, vuelve a intentarlo.

Ejemplo:

Método: getByRole
Valor: button
Nombre: Enviar
Intentos: 3

dblclick

Doble clic en un elemento.

CampoTipoDescripción
LocalizadorlocatorConfiguración del localizador
IntentosnumberNúmero de intentos

fill

Rellena un campo de entrada instantáneamente (reemplaza el valor).

CampoTipoDescripción
LocalizadorlocatorConfiguración del localizador
TextostringTexto a rellenar (soporta {{ }})
Limpiar PrimerobooleanLimpia el campo antes

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


type

Escribe texto carácter por carácter, simulando la escritura real.

CampoTipoDescripción
LocalizadorlocatorConfiguración del localizador
TextostringTexto a escribir
Delay (ms)numberIntervalo entre teclas (predeterminado: 50ms)
Limpiar PrimerobooleanLimpia el campo antes

Usa locator.pressSequentially() de Playwright — ideal para campos con:

  • Autocompletado (sugerencias aparecen mientras se escribe)
  • Máscaras (teléfonos, códigos postales)
  • Validación on-keypress (valida cada tecla)

Ejemplo:

Localizador: getByPlaceholder → "Teléfono"
Texto: 123.456.789-00
Delay: 100ms

check / uncheck

Marca o desmarca un checkbox/radio button.

CampoTipoDescripción
LocalizadorlocatorConfiguración del localizador

Ejemplo:

Método: getByLabel
Valor: Acepto los términos de uso

selectOption

Selecciona una opción de un dropdown (<select>).

CampoTipoDescripción
LocalizadorlocatorConfiguración del dropdown
Seleccionar Porstringvalue, label o index
ValorstringValor correspondiente

hover

Pasa el mouse sobre un elemento.

CampoTipoDescripción
LocalizadorlocatorConfiguración del localizador
IntentosnumberNúmero de intentos
Espera Después (ms)numberTiempo de espera tras hover

focus

Establece el foco en un elemento.

CampoTipoDescripción
LocalizadorlocatorConfiguración del localizador

press

Presiona una tecla del teclado en el contexto de un elemento.

CampoTipoDescripción
LocalizadorlocatorElemento que recibirá la tecla
TeclastringNombre de la tecla (Enter, Tab, Escape, etc.)
Espera Después (ms)numberTiempo de espera tras presionar

assert

Verifica condiciones en la página. Ofrece múltiples modos de verificación:

CampoTipoDescripción
NombrestringIdentificador de la aserción
LocalizadorlocatorElemento objetivo (cuando aplica)
ModostringTipo de verificación
Texto EsperadostringValor esperado
Continuar en FallobooleanNo fallar el nodo completo

Modos de Assert:

ModoDescripciónRequiere Localizador
visibleEl elemento es visible
hiddenEl elemento está oculto
textContainsEl texto contiene el valor
textEqualsEl texto es exactamente el valor
hasCountConteo de elementos
enabledEl elemento está habilitado
disabledEl elemento está deshabilitado
checkedEl checkbox/radio está marcado
hasValueEl input tiene un valor específico
hasAttributeEl elemento tiene atributo con valor
hasURLLa URL de la página contiene/es igual aNo
hasTitleEl título de la página contiene/es igual aNo

Ejemplos:

// Verificar que el botón "Enviar" es visible
Modo: visible, Localizador: getByRole("button", "Enviar")

// Verificar que el mensaje contiene "Éxito"
Modo: textContains, Localizador: getByText("Éxito"), Esperado: "Éxito"

// Verificar URL después del inicio de sesión
Modo: hasURL, Esperado: "/dashboard"

// Verificar que el campo está deshabilitado
Modo: disabled, Localizador: getByLabel("Correo electrónico")

extract

Extrae datos de un elemento.

CampoTipoDescripción
NombrestringNombre de la extracción
LocalizadorlocatorConfiguración del localizador
AtributostringQué extraer

Atributos disponibles:

AtributoDescripción
textTexto visible (textContent)
innerTextTexto interno
innerHTMLHTML interno
inputValueValor de campos de input
hrefURL de enlaces
srcURL de imágenes
valueValor genérico

wait

Espera una condición.

ModoDescripción
timeoutEspera un tiempo fijo
visibleEspera a que el elemento sea visible
hiddenEspera a que el elemento desaparezca
networkIdleEspera a que terminen las solicitudes de red

scroll

Desplaza la página.

ModoDescripción
toLocatorDesplaza hasta el elemento
byDesplaza una cantidad fija de píxeles
toBottomDesplaza hasta el final de la página

refresh

Recarga la página. Misma configuración que Web Flow.


frame

Cambia a un iframe. Soporta los modos name y main (volver al principal).


Evidencias (Screenshots por Paso)

Idéntico a Web Flow — cada paso puede tener configuración individual de captura de screenshot.


Prueba de Accesibilidad

Smart Locators soporta escaneo automático de accesibilidad con axe-core integrado. Cuando está habilitado, el nodo audita la página después de cada paso que captura un screenshot, identificando violaciones WCAG/ARIA y marcando visualmente los elementos afectados.

Smart Locators ya usa localizadores semánticos basados en roles ARIA — combinarlo con el escaneo de accesibilidad es especialmente útil para verificar que los elementos con los que interactúas cumplen los criterios de accesibilidad.

Configuración

CampoTipoPredeterminadoDescripción
Accessibility ScanbooleanfalseActiva el escaneo axe-core
Fail When Severity >=none / minor / moderate / serious / criticalseriousNivel mínimo de severidad que reprueba el nodo

Cómo Funciona

Después de cada paso que toma un screenshot, axe-core es inyectado en la página y analiza el documento en busca de violaciones. Las violaciones se dibujan sobre el screenshot con cajas de colores alrededor de los elementos afectados y un panel de conteo en la esquina:

SeveridadColorDescripción
Critical🔴 RojoBloquea el acceso a usuarios con discapacidad
Serious🟠 NaranjaCausa dificultad significativa
Moderate🟡 AmarilloCausa alguna dificultad
Minor🔵 AzulMejora recomendada

Al final de la ejecución se generan automáticamente:

  • Screenshots por paso — overlay con cajas de colores + panel Critical N / Serious N / Moderate N / Minor N + top 2 reglas
  • Gráfico de severidad{id}-accessibility-severity-chart.png — distribución por nivel
  • Gráfico de reglas{id}-accessibility-rule-chart.png — top 8 reglas más violadas
  • Reporte JSON{id}-accessibility-report.json — datos completos de todas las violaciones

Criterio de Aprobación

El nodo falla si hay cualquier violación con severidad igual o superior al umbral configurado. Usa none para nunca reprobar (recolectar métricas sin bloquear el flujo).

Ejemplo: Verificar accesibilidad del formulario de inicio de sesión

Configuración del nodo:
  Accessibility Scan: true
  Fail When Severity >= : serious

Pasos:
1. navigate → https://misitio.com/login               (sin screenshot = sin escaneo)
2. fill → getByLabel("Correo electrónico") → "..."     → screenshot after → escaneo ejecutado
3. fill → getByLabel("Contraseña") → "..."             → screenshot after → escaneo ejecutado
4. click → getByRole("button", { name: "Ingresar" })  → screenshot after → escaneo ejecutado
5. wait → networkIdle
6. assert → "loginOk" → textContains → getByText("Bienvenido") → screenshot → escaneo ejecutado

Si cualquier paso tiene una violación serious o critical, el nodo falla con:

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


Outputs

OutputTipoDescripción
sessionIdstringID de la sesión del navegador
extractsobjectDatos extraídos (clave → valor)
assertsobjectResultados de las aserciones (clave → boolean)
accessibilityPassedbooleanSi pasó el criterio de severidad (cuando está habilitado)
accessibilityViolationCountnumberTotal de instancias de violación encontradas
accessibilityobjectReporte completo de accesibilidad
accessibility.thresholdstringUmbral configurado
accessibility.scanCountnumberNúmero de checkpoints escaneados
accessibility.countsobject{ minor, moderate, serious, critical } — totales agregados
accessibility.stepsarrayDetalles por checkpoint (url, counts, topRules)
accessibility.rulesarrayTop 10 reglas violadas en todo el flujo

Ejemplo Completo: Inicio de Sesión con Smart Locators

Paso 1: navigate → https://misitio.com/login
Paso 2: fill → getByLabel("Correo electrónico") → "{{ variables.EMAIL }}"
Paso 3: fill → getByLabel("Contraseña") → "{{ variables.CONTRASENA }}"
Paso 4: click → getByRole("button", { name: "Ingresar" })
Paso 5: wait → networkIdle
Paso 6: assert → "loginOk" → textContains → getByText("Bienvenido")
Paso 7: extract → "userName" → getByRole("heading") → text

Cuándo Usar Smart Locators vs Web Flow

EscenarioRecomendación
Sitio con buenas prácticas de accesibilidadSmart Locators
Sitio con data-testid en todos los elementosWeb Flow
Formularios con labelsSmart Locators
Elementos sin texto ni roleWeb Flow (CSS/XPath)
Pruebas de accesibilidadSmart Locators
Legacy / sitios sin semánticaWeb Flow

Consejos

  • Prefiere getByRole — es el más resiliente y refleja cómo las tecnologías asistivas encuentran los elementos
  • Usa getByLabel para campos de formulario — es más estable que CSS
  • getByTestId es excelente para elementos sin role/label claro
  • Usa la acción type (en lugar de fill) para campos con máscaras o autocompletado
  • El campo Nth permite seleccionar un elemento específico cuando múltiples coinciden con el localizador