La idea es clara sobre el papel. Los tres bloques están esbozados. Solo queda escribir el código, y descubrir que los formularios web son un abismo de complejidad que no se sospecha hasta que intentas rellenarlos de forma programática.
Las primeras 50 líneas
El primer prototipo cabe en unas cincuenta líneas de JavaScript. La lógica es simple:
- Abrir la URL en Chromium con Playwright
- Listar todos los elementos
input,select,textareavisibles - Para cada elemento, obtener su
name,id,placeholdery el texto de lalabelasociada - Pasar esta lista al LLM junto con las columnas de Excel: devuelve un JSON de mapeo
- Rellenar cada campo:
page.fill(selector, valor)para textos,page.selectOption()para desplegables,page.check()para casillas
Funciona. En el formulario de prueba. Durante cinco minutos. Luego probamos un segundo formulario: un formulario real de incorporación de RRHH.
Desastre.
El muro de la complejidad
La diversidad de los formularios web es un abismo cuya magnitud no se aprecia hasta que intentas rellenarlos de forma programática. Lo que imaginamos como "un campo de texto" esconde en realidad docenas de variantes:
Selectores en cascada. Seleccionar "España" en el campo "País" muestra las comunidades autónomas. Seleccionar "Cataluña" muestra las provincias. Cada selección dispara una petición asíncrona y una recarga parcial de la página. Si encadenas llamadas a selectOption() sin esperar, el segundo valor desaparece cuando se carga el tercero.
Selectores de fecha personalizados. El campo nativo input[type="date"] del navegador suele reemplazarse por un componente JavaScript con su propio calendario gráfico. page.fill() no hace nada: el campo no es un input real. Hay que simular clics para abrir el calendario, clicar el mes, el año y el día.
Campos condicionalmente ocultos. Algunos formularios de RRHH solo muestran los campos de "Datos bancarios" cuando una pestaña concreta está activa. El inspector que lista todos los input los encuentra, pero no se pueden rellenar porque no son visibles. Hay que filtrar los elementos realmente interactivos.
Selectores disfrazados. Elementos <div> que actúan como <select> con roles ARIA (role="combobox", role="listbox"), navegación por teclado, pero sin ninguna etiqueta <option> en el DOM. page.selectOption() no funciona: hay que hacer clic en el div, esperar a que se abra la lista y clicar el valor.
Campos con autocompletado. Escribir "Mad" en un campo "Ciudad" dispara una petición a una API. Aparece un desplegable con sugerencias. Hay que clicar en "Madrid" en ese desplegable, no simplemente rellenar el campo con el valor final.
Ante todo esto, form-inspector.js crece. 50 líneas. 150. 300. 600. Aprende a filtrar elementos verdaderamente visibles, a deducir la etiqueta de un campo recorriendo el DOM, a distinguir los selects reales de los selects ARIA.
La IA para el mapeo: una regla innegociable
La cuestión del mapeo columnas Excel → campos de formulario es donde entra la IA. ¿Cómo saber que la columna "APELLIDO" debe ir en el campo last_name? ¿Que "Fecha nacimiento" corresponde a "DOB" en un formulario en inglés? Es semántica, lenguaje natural: exactamente para lo que está diseñado un LLM.
Pero hay una regla establecida desde el primer día, innegociable: el LLM nunca ve tus valores reales.
Solo recibe dos listas:
- Nombres de columnas del archivo Excel:
["Nombre", "APELLIDO", "Fecha_nacimiento", "IBAN", ...] - Etiquetas de los campos detectados en el formulario:
["first_name", "last_name", "dob", "bank_iban", ...]
Devuelve un objeto JSON de mapeo. Las 500 filas de tu Excel, con nombres reales, IBANs reales, fechas reales, nunca pasan por un servidor de IA. Es una restricción arquitectónica, no una promesa de privacidad enterrada en los términos de uso.
Para archivos Excel con estructura compleja, se añade una primera llamada al LLM (extractExcelData) que recibe solo texto representativo del Excel. Identifica dónde está la cabecera, qué filas son títulos de sección, qué columnas contienen datos útiles. La segunda llamada (suggestMapping) trabaja con una lista limpia de cabeceras.
Primer resultado que realmente funciona
Tras varias semanas de desarrollo, el asistente toma forma: subir el archivo Excel, introducir la URL del formulario, validar el mapeo sugerido por la IA, rellenar fila a fila.
Primera prueba en un formulario real de incorporación de RRHH: 8 de 11 campos mapeados correctamente en el primer intento. Los 3 errores: columnas con nombres ambiguos en el Excel —"Info1", "Zona_temp", "Ref_interna"— que incluso un humano tendría dificultades para mapear sin contexto. El usuario los corrige con dos clics.
No es perfecto, pero es usable. Es la primera vez que la herramienta hace lo que se supone que debe hacer en un caso real.
El siguiente paso: abrirlo a personas reales y ver qué se rompe con el uso.