Nodo Web Flow
El nodo Web Flow permite automatizar interacciones con páginas web usando selectores CSS, XPath, data-testid y texto. Es ideal cuando necesitas selectores tradicionales y control detallado sobre la localización de elementos.
Consejo: Si prefieres localizadores semánticos basados en accesibilidad (getByRole, getByLabel, etc.), usa el nodo Smart Locators.
Descripción General
| Propiedad | Valor |
|---|---|
| Tipo | web-flow |
| Categoría | Web |
| Color | Azul (#3b82f6) |
| Entrada | in |
| Salida | out |
Configuración General
| Campo | Tipo | Predeterminado | Descripción |
|---|---|---|---|
| Modo de Sesión | new / reuse | new | Nueva sesión o reutilizar una existente |
| Session ID | string | — | ID de la sesión a reutilizar (cuando reuse) |
| Headless | boolean | true | Ejecutar sin interfaz gráfica visible |
| Estrategia de Storage | inMemory / persisted | inMemory | Persistir cookies/localStorage entre ejecuciones |
| Clave de Storage | string | — | Identificador del storage persistido |
| Navegador | chromium / firefox / webkit | chromium | Navegador a usar en la ejecución |
| Dispositivo | desktop / mobile | desktop | Modo de emulación |
| Viewport | preset o custom | 1920x1080 | Tamaño de ventana (modo Desktop) |
| Ancho / Alto | number | — | Dimensiones personalizadas (cuando custom) |
| Modelo de Dispositivo | string | iPhone 14 | Dispositivo a emular (modo Mobile) |
Navegador
| Valor | Navegador |
|---|---|
chromium | Chrome / Chromium (predeterminado) |
firefox | Firefox |
webkit | Safari / WebKit |
Firefox y WebKit se descargan automáticamente en el primer uso si no están instalados.
Dispositivo — Desktop
Presets de viewport disponibles:
| Preset | Resolución |
|---|---|
| Full HD (predeterminado) | 1920 × 1080 |
| 2K | 2560 × 1440 |
| 4K | 3840 × 2160 |
| Laptop | 1440 × 900 |
| HD | 1366 × 768 |
| WXGA | 1280 × 720 |
| XGA | 1024 × 768 |
| Personalizado | ancho y alto libres |
Dispositivo — Mobile
Usa perfiles reales de Playwright (viewport, user agent, escala de píxeles, touch). Modelos disponibles:
iOS: iPhone SE, iPhone 12, iPhone 13, iPhone 14, iPhone 14 Pro, iPhone 15, iPhone 15 Pro, iPad Mini, iPad (gen 9), iPad Pro 11
Android: Pixel 5, Pixel 7, Galaxy S8, Galaxy S9+, Galaxy Tab S4
En modo Mobile con Firefox, las opciones
isMobileyhasTouchse eliminan automáticamente (no son compatibles con Firefox en Playwright). El viewport y el user agent del dispositivo se aplican igualmente.
Modo de Sesión
- Nueva Sesión (
new): Abre un nuevo navegador para cada ejecución. Ideal para pruebas aisladas. - Reutilizar Sesión (
reuse): Usa una sesión de navegador ya abierta por otro nodo Web Flow/Smart Locators. Útil para dividir pruebas largas en múltiples nodos manteniendo el mismo navegador y cookies.
Estrategia de Storage
- En Memoria (
inMemory): Las cookies y el localStorage se descartan al final de la ejecución. - Persistido (
persisted): Las cookies y el localStorage se guardan con una clave y pueden reutilizarse en ejecuciones futuras. Ideal para mantener sesiones de inicio de sesión entre ejecuciones.
Pasos (Web Steps)
El nodo Web Flow ejecuta una secuencia de pasos configurables. Cada paso representa una acción en el navegador.
Acciones Disponibles
| Acción | Color | Descripción |
|---|---|---|
| navigate | Azul | Navegar a una URL |
| click | Amarillo | Hacer clic en un elemento |
| type | Verde | Escribir texto en un campo |
| wait | Morado | Esperar una condición o tiempo |
| assert | Rojo | Verificar una condición en la página |
| extract | Cian | Extraer datos de un elemento |
| hover | Cian | Pasar el mouse sobre un elemento |
| scroll | Amarillo | Desplazar la página |
| refresh | Naranja | Recargar la página |
| select | Morado | Seleccionar una opción de un dropdown |
| press-key | Verde | Presionar una tecla |
| frame | Gris | Alternar entre frames/iframes |
Estrategias de Selector
Web Flow usa estrategias de selector para localizar elementos en la página. Cada paso puede tener múltiples estrategias ordenadas por prioridad — si la primera no encuentra el elemento, se intenta con la siguiente.
| Estrategia | Descripción | Ejemplo |
|---|---|---|
css | Selector CSS | #login-button, .submit-btn, [data-testid="login"] |
dataTestId | Atributo data-testid | login-button |
role | ARIA role | button |
text | Texto visible | Ingresar |
xpath | Expresión XPath | //button[@type="submit"] |
Prioridad recomendada:
dataTestId— Más estable, no cambia con el diseñocsscon ID — Generalmente único en la páginarole— Basado en accesibilidadtext— Puede cambiar con traduccionesxpath— Último recurso, más frágil
Detalles de las Acciones
navigate
Navega a una URL específica.
| Campo | Tipo | Descripción |
|---|---|---|
| URL | string | URL de destino (soporta expresiones {{ }}) |
Ejemplo:
URL: https://misitio.com/login
URL: {{ variables.BASE_URL }}/dashboard
click
Hace clic en un elemento de la página.
| Campo | Tipo | Descripción |
|---|---|---|
| Selectores | array | Estrategias de selector |
| Intentos | number | Número de intentos (predeterminado: 3) |
El click intenta localizar el elemento usando cada estrategia en orden. Si falla, espera y vuelve a intentar (hasta el número de intentos configurado).
type
Escribe texto en un campo de entrada.
| Campo | Tipo | Descripción |
|---|---|---|
| Selectores | array | Estrategias de selector |
| Texto | string | Texto a escribir (soporta {{ }}) |
| Limpiar Primero | boolean | Limpia el campo antes de escribir |
Nota: La acción
typeusafill()de Playwright, que reemplaza el valor del campo de forma instantánea. Para simular la escritura carácter por carácter, usa el nodo Smart Locators con la accióntype(pressSequentially).
wait
Espera una condición antes de continuar.
| Campo | Tipo | Descripción |
|---|---|---|
| Modo | string | Tipo de espera |
| Timeout (ms) | number | Tiempo máximo de espera |
| Selectores | array | Selectores (modo selectorVisible) |
Modos:
| Modo | Descripción |
|---|---|
networkIdle | Espera a que terminen todas las solicitudes de red |
selectorVisible | Espera a que un elemento sea visible |
timeout | Espera un tiempo fijo (ms) |
assert
Verifica una condición en la página. Si la condición falla, el paso se marca como fallido.
| Campo | Tipo | Descripción |
|---|---|---|
| Nombre | string | Identificador de la aserción |
| Modo | string | Tipo de verificación |
| Selectores | array | Selectores del elemento |
| Texto Esperado | string | Valor esperado |
| Case Sensitive | boolean | Sensible a mayúsculas |
| Continuar en Fallo | boolean | No fallar el nodo completo |
Modos:
| Modo | Descripción |
|---|---|
elementExists | Verifica si el elemento existe en la página |
textContains | Verifica si el texto del elemento contiene el valor esperado |
textEquals | Verifica si el texto del elemento es exactamente el valor esperado |
Los resultados de las aserciones están disponibles en los outputs:
{{ steps["web-flow"].outputs.asserts.nombreAsercion }} → true o false
extract
Extrae datos de un elemento de la página.
| Campo | Tipo | Descripción |
|---|---|---|
| Nombre | string | Nombre de la extracción (clave en el output) |
| Selectores | array | Selectores del elemento |
| Atributo | string | Qué extraer |
Atributos:
| Atributo | Descripción |
|---|---|
text | Texto visible del elemento |
innerHTML | HTML interno |
href | URL de enlaces |
src | URL de imágenes |
value | Valor de campos de formulario |
Los datos extraídos están disponibles en los outputs:
{{ steps["web-flow"].outputs.extracts.nombreExtraccion }}
hover
Pasa el mouse sobre un elemento.
| Campo | Tipo | Descripción |
|---|---|---|
| Selectores | array | Selectores del elemento |
| Intentos | number | Número de intentos |
| Espera Después (ms) | number | Tiempo de espera tras el hover |
scroll
Desplaza la página o hasta un elemento.
| Campo | Tipo | Descripción |
|---|---|---|
| Modo | string | Tipo de desplazamiento |
| Píxeles | number | Cantidad de píxeles (modo by) |
| Espera Después (ms) | number | Tiempo de espera tras desplazar |
| Selectores | array | Selectores (modo toSelector) |
Modos:
| Modo | Descripción |
|---|---|
toSelector | Desplaza hasta que el elemento sea visible |
by | Desplaza una cantidad fija de píxeles |
toBottom | Desplaza hasta el final de la página |
refresh
Recarga la página actual.
| Campo | Tipo | Descripción |
|---|---|---|
| Esperar Hasta | string | Evento de carga |
| Espera Después (ms) | number | Tiempo adicional tras recargar |
Eventos:
| Evento | Descripción |
|---|---|
load | Página completamente cargada |
domcontentloaded | DOM listo (más rápido) |
networkidle | Sin solicitudes de red pendientes |
select
Selecciona una opción de un elemento <select> (dropdown).
| Campo | Tipo | Descripción |
|---|---|---|
| Selectores | array | Selectores del dropdown |
| Seleccionar Por | string | Criterio de selección |
| Valor | string | Valor correspondiente al criterio |
Criterios:
| Criterio | Descripción |
|---|---|
value | Por el atributo value de la opción |
label | Por el texto visible de la opción |
index | Por el índice (posición) de la opción |
press-key
Presiona una tecla del teclado.
| Campo | Tipo | Descripción |
|---|---|---|
| Tecla | string | Nombre de la tecla (ej: Enter, Tab, Escape) |
| Selectores | array | Selectores del elemento enfocado (opcional) |
| Espera Después (ms) | number | Tiempo de espera tras presionar |
frame
Cambia el contexto a un iframe.
| Campo | Tipo | Descripción |
|---|---|---|
| Modo | string | Método de selección del frame |
| Selectores | array | Selectores (modo selector) |
| Nombre del Frame | string | Nombre (modo name) |
| Timeout (ms) | number | Tiempo máximo de espera |
Modos:
| Modo | Descripción |
|---|---|
selector | Localiza el iframe por selector CSS |
name | Localiza el iframe por el atributo name |
main | Vuelve al contexto principal (fuera del iframe) |
Evidencias (Screenshots)
Cada paso puede tener configuración de evidencia individual:
| Campo | Tipo | Descripción |
|---|---|---|
| Capturar Screenshot | boolean | Activar captura |
| Modo | before / after / both | Cuándo capturar |
| Plantilla de Nombre | string | Nombre personalizado del archivo |
| Esperar Carga | string | Evento antes de capturar |
| Delay (ms) | number | Tiempo adicional antes de la captura |
Prueba de Accesibilidad
Web Flow 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.
Configuración
| Campo | Tipo | Predeterminado | Descripción |
|---|---|---|---|
| Accessibility Scan | boolean | false | Activa el escaneo axe-core |
| Fail When Severity >= | none / minor / moderate / serious / critical | serious | Nivel 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:
| Severidad | Color | Descripción |
|---|---|---|
| Critical | 🔴 Rojo | Bloquea el acceso a usuarios con discapacidad |
| Serious | 🟠 Naranja | Causa dificultad significativa |
| Moderate | 🟡 Amarillo | Causa alguna dificultad |
| Minor | 🔵 Azul | Mejora 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: Auditoría 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. type → #email → "{{ variables.EMAIL }}" → screenshot after → escaneo ejecutado
3. click → button[type="submit"] → screenshot after → escaneo ejecutado
4. wait → networkIdle
5. assert → loginOk → hasURL → /dashboard → screenshot after → 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
| Output | Tipo | Descripción |
|---|---|---|
sessionId | string | ID de la sesión del navegador |
extracts | object | Datos extraídos (clave → valor) |
asserts | object | Resultados de las aserciones (clave → boolean) |
accessibilityPassed | boolean | Si pasó el criterio de severidad (cuando está habilitado) |
accessibilityViolationCount | number | Total de instancias de violación encontradas |
accessibility | object | Reporte completo de accesibilidad |
accessibility.threshold | string | Umbral configurado |
accessibility.scanCount | number | Número de checkpoints escaneados |
accessibility.counts | object | { minor, moderate, serious, critical } — totales agregados |
accessibility.steps | array | Detalles por checkpoint (url, counts, topRules) |
accessibility.rules | array | Top 10 reglas violadas en todo el flujo |
Ejemplo Completo
Inicio de sesión en un sitio
Pasos configurados en el nodo:
- navigate →
https://misitio.com/login - type → Selector:
#email, Texto:{{ variables.USER_EMAIL }} - type → Selector:
#password, Texto:{{ variables.USER_PASSWORD }} - click → Selector:
button[type="submit"] - wait → Modo:
networkIdle - assert → Nombre:
loginOk, Modo:textContains, Selector:.welcome, Texto:Bienvenido - extract → Nombre:
userName, Selector:.user-name, Atributo:text
Resultado: Tras la ejecución, los outputs serán:
{
"sessionId": "abc-123",
"extracts": { "userName": "João Silva" },
"asserts": { "loginOk": true }
}
Consejos
- Usa data-testid como estrategia principal de selector — es más estable
- Configura screenshots en los pasos críticos para facilitar la depuración
- Usa reutilización de sesión cuando múltiples nodos Web Flow/Smart Locators necesiten compartir el mismo navegador
- Para formularios con autocompletado o máscaras, considera usar el nodo Smart Locators con la acción
type(escritura carácter por carácter) - El modo headless: false es útil durante el desarrollo para visualizar lo que hace la prueba
