16 KiB
Manual de uso de la herramienta Browser
Este manual explica que tools expone la herramienta browser, como usarlas y que puedes pedirle a OpenCode en la practica.
Alcance actual
- Browser:
Chromiumcontrolado porPlaywright - Integracion:
MCPporstdio - Modo por defecto: visible (
headless: false) - Artefactos: capturas en
opencode-browser-tool/artifacts/
Esquema de respuesta estandar
Todas las tools devuelven ahora un formato unificado.
Respuesta OK:
{
"ok": true,
"tool": "browser_<tool>",
"data": {},
"state": {
"isOpen": true,
"currentUrl": "https://..."
}
}
Respuesta con error:
{
"ok": false,
"tool": "browser_<tool>",
"error": {
"code": "TOOL_EXECUTION_ERROR",
"message": "detalle del error"
},
"state": {
"isOpen": false,
"currentUrl": null
}
}
Flujo recomendado de uso
- Abrir sesion de navegador con
browser_open - Navegar con
browser_navigate - Interactuar con
browser_click,browser_type,browser_press,browser_scroll - Esperar estados estables con
browser_wait - Capturar evidencia con
browser_snapshot - Inspeccionar estado dinamico con
browser_evaluate - Cerrar sesion con
browser_close
Importante: todas las tools excepto browser_open y browser_close requieren sesion abierta. Si no hay sesion, devuelve error.
Espera automatica nativa (comportamiento actual)
La herramienta ya incorpora estabilizacion automatica despues de acciones clave.
Que significa en la practica:
- despues de
browser_navigate,browser_click,browser_type,browser_press,browser_scrollybrowser_evaluate, la herramienta intenta esperar estado estable por si sola - combina
domcontentloaded, intento denetworkidley una ventana de "quietud" de actividad de red - si no logra estado estable, aplica salida segura por tiempo maximo para evitar bucles de espera infinita
Resultado:
- normalmente no necesitas pedir
waitmanual para casos comunes browser_waitsigue disponible cuando quieras una condicion explicita (selector/texto/url/timeout)
Tools disponibles
browser_help
Devuelve un resumen operativo de la herramienta: capacidades, defaults, notas y ejemplos.
Cuando usarla:
- al empezar una sesion nueva con un agente que no conoce la tool
- para recordar comportamiento por defecto (modo visible, timeouts, auto-wait)
Parametros: ninguno.
Ejemplo:
{}
browser_health
Devuelve estado operativo actual del runtime browser y artifacts recientes.
Incluye:
- estado de sesion (
isOpen,currentUrl) - actividad de red interna (
inflight,lastActivityAgoMs) - comportamiento activo (
verbose, overlay, delay humano) - pasos recientes (
recentSteps) para diagnostico rapido en vivo - lista de artifacts recientes (ruta, fecha, tamano)
Parametros:
limit(number, opcional): cantidad maxima de artifacts a devolver (default5, max20)
Ejemplo:
{
"limit": 5
}
browser_config
Permite leer o cambiar configuracion persistente de la herramienta (guardada en config/browser-tool.config.json).
Parametros:
action(string, opcional):getoset(defaultget)browserDefaultKind(string, opcional):testingosystembrowserSystemExecutablePath(string, opcional): ruta del navegador del sistema (ej./usr/bin/google-chrome)browserDefaultPersistentProfile(boolean, opcional): sitrue,browser_openusa perfil persistente por defectobrowserDefaultUserDataDir(string, opcional): ruta de perfil persistente por defectobrowserDefaultVerbose(boolean, opcional): modo verbose por defecto (truerecomendado para operacion)browserDefaultVerboseOverlay(boolean, opcional): overlay visual de estado en navegador visiblebrowserDefaultInteractionDelayMinMs(number, opcional): minimo de delay humano en acciones interactivasbrowserDefaultInteractionDelayMaxMs(number, opcional): maximo de delay humano en acciones interactivasreportDefaultSaveToFile(boolean, opcional): default persistente debrowser_report.saveToFilereportDefaultFormat(string, opcional):json,markdown,both
Ejemplo lectura:
{
"action": "get"
}
Ejemplo cambio persistente:
{
"action": "set",
"browserDefaultKind": "system",
"browserSystemExecutablePath": "/usr/bin/google-chrome",
"browserDefaultPersistentProfile": true,
"browserDefaultUserDataDir": "/home/pancho/.chrome-perfil-google-real",
"browserDefaultVerbose": true,
"browserDefaultVerboseOverlay": true,
"browserDefaultInteractionDelayMinMs": 1000,
"browserDefaultInteractionDelayMaxMs": 3000,
"reportDefaultSaveToFile": false,
"reportDefaultFormat": "json"
}
browser_diagnostics
Devuelve eventos recientes de diagnostico capturados durante la sesion:
console(log, warn, error, etc.)pageerror(errores JS no capturados)requestfailed(peticiones de red fallidas)
Parametros:
limit(number, opcional): maximo de eventos devueltos (default20, max200)
Ejemplo:
{
"limit": 20
}
browser_diagnostics_clear
Limpia el buffer interno de diagnostico.
Uso recomendado: antes de arrancar una prueba nueva para leer solo eventos de ese flujo.
Parametros: ninguno.
{}
browser_observe
Toma una "foto de estado" de la pagina durante el flujo y, opcionalmente, una captura.
Uso recomendado:
- cuando el flujo parece bloqueado
- cuando no avanza tras una accion
- antes de abortar una prueba para entender que esta viendo el navegador
Parametros:
screenshot(boolean, opcional, defaulttrue)label(string, opcional)
Ejemplo:
{
"screenshot": true,
"label": "mid-flow-check"
}
browser_handle_consent
Intenta pulsar botones comunes de consentimiento.
Parametros:
action(string, opcional):reject(default) oaccept
Ejemplo:
{
"action": "reject"
}
browser_handle_human_check
Intenta resolver controles comunes de verificacion humana (incluyendo checkbox de reCAPTCHA cuando es clicable).
Estrategia actual:
- intenta clic en checkboxs dentro de iframes comunes de reCAPTCHA
- intenta selectores de captcha tambien en pagina principal
- usa fallback por coordenadas para controles detectados por texto
Uso recomendado:
- cuando aparece bloqueo tipo
sorry/index - cuando el flujo queda detenido en "comprueba que eres humano"
Parametros: ninguno.
{}
browser_open
Abre una sesion de Chromium.
Parametros:
headless(boolean, opcional): por defectofalsestartUrl(string, opcional)width(number, opcional, default1440)height(number, opcional, default900)browserKind(string, opcional):testing(Playwright managed) osystem(browser del sistema)executablePath(string, opcional): ruta binaria explicita del navegadorpersistentProfile(boolean, opcional): activar perfil persistenteuserDataDir(string, opcional): ruta del perfil persistente (requerido sipersistentProfile=true)verbose(boolean, opcional, defaulttrue): muestra estado paso a paso en respuestasverboseOverlay(boolean, opcional, defaulttrue): muestra estado en overlay visual en navegador visibleinteractionDelayMinMs(number, opcional, default1000)interactionDelayMaxMs(number, opcional, default3000)recordVideo(boolean, opcional, defaultfalse)recordTrace(boolean, opcional, defaultfalse)recordLabel(string, opcional, defaultsession)
Ejemplo:
{
"headless": false,
"startUrl": "http://localhost:3000",
"width": 1440,
"height": 900,
"browserKind": "system",
"persistentProfile": true,
"userDataDir": "/home/pancho/.chrome-perfil-google-real",
"verbose": true,
"verboseOverlay": true,
"interactionDelayMinMs": 1000,
"interactionDelayMaxMs": 3000,
"recordVideo": true,
"recordTrace": true,
"recordLabel": "case-123"
}
Notas:
recordVideosigue desactivado por defecto para evitar consumo innecesario.- si activas
recordVideoorecordTrace, los artifacts se generan al cerrar sesion conbrowser_close. - con
verbose=true, la tool muestra estado actual y aplica guardas de estabilidad antes de pasos sensibles.
browser_close
Cierra la sesion activa de navegador.
Parametros: ninguno.
Ejemplo:
{}
browser_navigate
Navega la pagina activa a una URL.
Parametros:
url(string, requerido)waitUntil(string, opcional):load,domcontentloaded,networkidle(defaultdomcontentloaded)
Ejemplo:
{
"url": "http://localhost:3000/login",
"waitUntil": "domcontentloaded"
}
browser_click
Hace click sobre un selector CSS.
Nota: antes del click intenta mover el puntero al centro del elemento para hacer la interaccion mas natural.
Parametros:
selector(string, requerido)timeoutMs(number, opcional, default10000)
Ejemplo:
{
"selector": "button[type='submit']",
"timeoutMs": 10000
}
browser_hover
Hace hover sobre un elemento por selector.
Parametros:
selector(string, requerido)timeoutMs(number, opcional, default10000)
Ejemplo:
{
"selector": ".menu-item-settings",
"timeoutMs": 10000
}
browser_type
Escribe texto en un elemento por selector.
Nota: antes de escribir intenta mover puntero y enfocar el campo con click.
Parametros:
selector(string, requerido)text(string, requerido)clear(boolean, opcional, defaulttrue)timeoutMs(number, opcional, default10000)
Ejemplo:
{
"selector": "input[name='email']",
"text": "usuario@dominio.com",
"clear": true,
"timeoutMs": 10000
}
browser_select
Selecciona una opcion en un elemento <select> por valor.
Parametros:
selector(string, requerido)value(string, requerido)timeoutMs(number, opcional, default10000)
Ejemplo:
{
"selector": "#tipoConsentimiento",
"value": "quirurgico",
"timeoutMs": 10000
}
browser_press
Envia una tecla al contexto de teclado de la pagina.
Parametros:
key(string, requerido). Ejemplos:Enter,Escape,Tab,Control+A.
Ejemplo:
{
"key": "Enter"
}
browser_scroll
Hace scroll en pagina completa o dentro de un elemento.
Parametros:
x(number, opcional, default0)y(number, opcional, default400)selector(string, opcional): si se envia, el scroll se aplica al elemento
Nota: cuando el scroll es de pagina, se aplica en varios pasos cortos para que el desplazamiento sea visible y progresivo.
Si no hay desplazamiento por rueda, aplica fallback window.scrollBy.
La salida incluye metricas utiles:
startY,endY,maxY,movedYpara scroll de paginamovedX,movedYpara scroll de elemento
Ejemplo pagina:
{
"y": 700
}
Ejemplo elemento:
{
"selector": ".lista-scroll",
"y": 500
}
browser_wait
Espera a que se cumpla una condicion.
Nota: en esta version es opcional para muchos flujos, porque la herramienta ya aplica espera automatica nativa tras acciones comunes.
Parametros:
for(string, requerido):selector,text,url,timeoutvalue(string, requerido paraselector,text,url)timeoutMs(number, opcional, default10000)
Nota para for: timeout:
- si envias
value, se interpreta como milisegundos de espera - si no envias
value, usatimeoutMs
Ejemplo por selector:
{
"for": "selector",
"value": ".toast-success",
"timeoutMs": 10000
}
Ejemplo por tiempo:
{
"for": "timeout",
"timeoutMs": 1500
}
browser_snapshot
Toma screenshot y lo guarda en artifacts/.
Parametros:
label(string, opcional)fullPage(boolean, opcional, defaulttrue)
Ejemplo:
{
"label": "post-login",
"fullPage": true
}
browser_evaluate
Ejecuta JavaScript en la pagina. Puede recibir una funcion en texto (con arg) o una expresion directa.
Importante: si, puede inyectar y ejecutar logica JavaScript en runtime. Eso incluye leer variables del DOM y tambien modificarlas temporalmente dentro de la sesion de prueba.
Parametros:
script(string, requerido): funcion JS serializadaarg(object, opcional): dato de entrada a la funcion
Ejemplo:
{
"script": "(arg) => ({ title: document.title, arg })",
"arg": { "source": "qa" }
}
Ejemplo con expresion directa:
{
"script": "document.title"
}
browser_query
Lee estado DOM/UI por selector sin tener que escribir JavaScript para casos comunes.
Parametros:
selector(string, requerido)mode(string, opcional):text,html,value,exists,visible,enabled,count,attributes
Ejemplos:
{
"selector": "#email",
"mode": "value"
}
{
"selector": ".toast-success",
"mode": "exists"
}
browser_report
Genera un reporte consolidado de ejecucion a partir de pasos, diagnostico y artifacts.
Parametros:
format(string, opcional):json,markdown,both(defaultboth)includeSteps(boolean, opcional, defaulttrue)includeDiagnostics(boolean, opcional, defaulttrue)includeArtifacts(boolean, opcional, defaulttrue)saveToFile(boolean, opcional): por defecto usa configuracion persistente (trueal instalar)label(string, opcional, defaultreport)limitSteps(number, opcional, default200)limitDiagnostics(number, opcional, default50)
Ejemplo:
{
"format": "both",
"saveToFile": true,
"label": "consent-flow",
"includeSteps": true,
"includeDiagnostics": true,
"includeArtifacts": true
}
Resultado esperado:
- reporte estructurado para uso del agente
- opcionalmente archivos
.jsony.mdenartifacts/
Comportamiento recomendado:
- por defecto queda guardando a archivo (
saveToFile=true) para no perder evidencia - puedes desactivarlo temporalmente en una ejecucion concreta (
saveToFile=false) - para cambiar el default de forma persistente usa
browser_config
Que puede pedirle el usuario a OpenCode
Ejemplos utiles:
- "Abre el browser, entra a
http://localhost:3000y valida que aparece el botonIniciar sesion." - "Rellena email y password, envia el formulario y espera una URL que contenga
/dashboard." - "Haz scroll hasta el final, toma captura y guardala con etiqueta
dashboard-final." - "Ejecuta un
browser_evaluatepara devolver cantidad de filas de la tabla.orders-table." - "Usa
browser_querypara comprobar si.btn-guardaresta visible y habilitado." - "Ejecuta
browser_healthy dime si hay sesion abierta y cuales son los ultimos artifacts." - "Al terminar la prueba, genera
browser_reportenbothy guardalo a archivo para revisar resultado y evidencia."
Limites actuales de esta version
- El diagnostico actual es en memoria de sesion (no persiste historico entre reinicios del proceso).
- Video/trace se activan manualmente por ejecucion; todavia no hay politica automatica "solo en fallo".
- No hay politica de seguridad final para navegacion externa (pendiente de fases posteriores).
- El modo recomendado de v1 es
Chromium managed by Playwright.
Errores tipicos y recuperacion
Browser session is not open: ejecutabrowser_openantes de usar otras tools.Timeoutenbrowser_wait: valida si ya cambio URL/estado conbrowser_evaluate; si ya estas dentro, continua.- Si la pagina parece bloqueada: ejecuta
browser_observepara capturar estado/screenshot antes de cortar. - Si aparece banner de consentimiento: ejecuta
browser_handle_consent(rejectoaccept) y continua. - Si aparece verificacion humana: ejecuta
browser_handle_human_check; si no desbloquea, dejar evidencia y hacer handoff manual. - Selector no encontrado en
browser_clickobrowser_type: confirma selector conbrowser_evaluatey reintenta con uno mas estable. - Flujo lento de red: deja que actue la espera nativa; si no alcanza, usa
browser_waitexplicito por selector de estado final. - Error al evaluar JS en
browser_evaluate: envia una funcion valida en texto, por ejemplo(arg) => ({ title: document.title, arg }).