CdpCollectConsole gana un parametro maxEntries (default 200): al alcanzarlo deja de acumular y marca una ConsoleEntry final '_truncated', evitando reventar la salida en paginas verbosas. Ademas descarta los eventos console anteriores al inicio de la captura (backlog acumulado en la conexion CDP viva), capturando solo lo emitido dentro de la ventana durationMs. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
7.9 KiB
name, kind, lang, domain, version, purity, signature, description, tags, uses_functions, uses_types, returns, returns_optional, error_type, imports, params, output, tested, tests, test_file_path, file_path
| name | kind | lang | domain | version | purity | signature | description | tags | uses_functions | uses_types | returns | returns_optional | error_type | imports | params | output | tested | tests | test_file_path | file_path | ||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| cdp_collect_console | function | go | browser | 1.1.0 | impure | func CdpCollectConsole(c *CDPConn, durationMs int, maxEntries int) ([]ConsoleEntry, error) | Captura un snapshot temporal del log de consola y diagnostico de una pagina Chrome via CDP. Habilita los dominios Runtime y Log, se suscribe a Runtime.consoleAPICalled (console.log/info/warn/error con args concatenados), Runtime.exceptionThrown (errores JS no capturados, type=exception con descripcion + stack) y Log.entryAdded (avisos del propio navegador: network, security, deprecaciones) y acumula todo lo que ocurra durante durationMs ms (default 1500), hasta un maximo de maxEntries entradas (default 200). Devuelve un slice de ConsoleEntry (Type, Text, URL, Line, Timestamp). Es un snapshot de la ventana, no historico previo: filtra por timestamp para descartar el backlog de eventos que una conexion del pool acumulo antes de la llamada. Si se alcanza maxEntries deja de acumular pero no corta la ventana; anade una entrada final con Type=_truncated. Robusta ante silencio: devuelve slice vacio si no llega ningun evento. |
|
false | error_go_core |
|
|
slice de ConsoleEntry (Type, Text, URL, Line, Timestamp) con todo lo emitido en la ventana (filtrado de backlog previo a la llamada y acotado a maxEntries); si se truncó, la última entrada tiene Type=_truncated; slice vacío (no nil, no error) si no hubo eventos; error solo si la conexión es nula o falla Runtime.enable | false | functions/browser/cdp_collect_console.go |
Ejemplo
conn, _ := CdpConnect(9222)
CdpNavigate(conn, "https://example.com")
// Captura todo lo que la pagina escriba en consola durante 2 segundos,
// hasta un maximo de 100 entradas (descarta el backlog previo de la conexion).
entries, err := CdpCollectConsole(conn, 2000, 100)
if err != nil {
log.Fatal(err)
}
for _, e := range entries {
if e.Type == "_truncated" {
fmt.Println("...", e.Text) // se alcanzo el cap de 100 entradas
continue
}
fmt.Printf("[%s] %s (%s:%d)\n", e.Type, e.Text, e.URL, e.Line)
}
// Ejemplo de salida:
// [error] Uncaught TypeError: x is not a function (https://example.com/app.js:42)
// [warning] Mixed Content: requested an insecure resource (https://example.com:0)
// [log] app initialized (https://example.com/app.js:5)
// Cap por defecto (200): pasar maxEntries <= 0.
entries, _ = CdpCollectConsole(conn, 1500, 0)
Cuando usarla
Cuando necesitas ver qué errores, warnings o mensajes de consola produce una página justo después de navegar o tras disparar una acción (click, submit). Úsala para depurar por qué un flujo web falla en silencio (excepción JS no capturada, recurso bloqueado por CSP/mixed-content, error de red que solo aparece en consola), para validar que una SPA arrancó sin errores, o como paso de diagnóstico dentro de un flow-replay antes de dar por bueno un replay. Llámala envolviendo la acción que quieres observar: navega/interactúa y deja que la ventana de captura recoja lo que emita.
Gotchas
- Impura: requiere Chrome vivo. Necesita una conexión CDP activa (
*CDPConn) contra una instancia de Chrome con el target abierto. No funciona sin navegador. - Es un snapshot temporal, no histórico — y filtra el backlog. Solo captura eventos emitidos DURANTE la ventana
durationMs. La función capturastartMs(wall time, ms epoch) justo antes de habilitar los dominios y descarta todo evento contimestampanterior a ese inicio. Esto resuelve el problema real con conexiones del pool que llevan rato abiertas conRuntimeya habilitado: cuandoRuntime.enablese reenvía, Chrome flusheaconsoleAPICalledrezagados con timestamps antiguos; esos backlog se descartan por el filtro. Sin el filtro, en una página verbosa o con unsetIntervalla función devolvía cientos de entradas históricas que reventaban el output. Por quéOnEventno basta: los handlers deOnEventsolo reciben eventos que lleguen alreadLoopDESPUÉS del registro, pero el flush deRuntime.enablellega justo después y arrastra mensajes viejos — de ahí el backlog. El filtro por timestamp es la defensa que lo separa. Si quieres capturar el arranque, conéctate y llama ANTES de navegar, o navega dentro de la ventana. - Eventos sin timestamp se aceptan. Si un evento llega con
timestamp0 (sin fechar) no se puede clasificar como backlog, así que se acumula. En la práctica casi siempre son nuevos. Log.entryAddedreporta en segundos, no ms. A diferencia deconsoleAPICalled/exceptionThrown(ms epoch),Log.entryAddeddatimestampen segundos epoch. La función lo normaliza a ms (heurística: si el valor es varios órdenes menor que un ms epoch actual, lo multiplica por 1000) para que el filtro porstartMscompare en el mismo dominio.- Cap por cantidad (
maxEntries). Al alcanzarmaxEntriesentradas (default 200) la función deja de acumular y descarta las posteriores, pero NO corta la ventana — sigue durmiendo hastadurationMspara no dejar los dominios CDP a medio drenar (handlers a medias) ni el estado de la conexión raro. Si se truncó, la última entrada del slice tieneType == "_truncated"y unTextcon el cap alcanzado; el caller debe filtrarla o tratarla como señal, no como un log real. - Bloquea durante
durationMs. La función duerme la goroutine la ventana completa antes de devolver — no hay early-return aunque ya tengas eventos o se alcance el cap. EligedurationMsacorde a lo que esperas observar (1500ms default suele bastar para el load inicial). Typemezcla tres taxonomías.consoleAPICalledusalog|info|warning|error|debug|...;exceptionThrownsiempre marcaexception;Log.entryAddedusa elleveldel navegador (verbose|info|warning|error). Filtra por substring (warn,error) si quieres agrupar severidades; nota que console.warn producewarning, nowarn.Linees 1-based. CDP reportalineNumber0-based; esta función suma 1 para que coincida con lo que muestran las DevTools. LosLog.entryAddedse dejan tal cual los da Chrome.- No deshabilita
Runtimeal salir. Otras funciones del package (ej.cdp_pick_element_js) dependen deRuntime.consoleAPICalled; deshabilitarlo rompería sus handlers. Sí cierra el dominioLogque abre aquí. Log.enablepuede no estar disponible en algunos targets (workers, ciertos contextos). Si falla, la función NO aborta: sigue capturandoRuntime.*y solo pierde los avisos deLog.entryAdded.
Notas
ConsoleEntry se define como tipo simple del package browser en el mismo .go (igual que HarEntry/HarHeader en cdp_har_record.go), no como tipo del registry — evita import circular y mantiene la firma autosuficiente. La acumulación usa un sync.Mutex porque los handlers de OnEvent corren en la goroutine del readLoop de CDPConn, concurrente con la goroutine que duerme la ventana. La conversión de args de consoleAPICalled serializa objetos/arrays a JSON real (no la repr %v de Go) para que datos estructurados sean parseables.