Files
fn_registry/functions/browser/chrome_launch.md
T
Egutierrez ccfa5bc78b feat(browser): funciones anti-deteccion + perfiles para web_scraping
Funciones nuevas del dominio browser (grupo navegator):
- cdp_move_mouse_human / cdp_click_human: movimiento de raton con curva
  de Bezier cubica, easing y micro-jitter para imitar comportamiento
  humano y reducir deteccion de automatizacion.
- cdp_wait_idle: espera network-idle contando requests en vuelo via
  eventos CDP Network.*; inmune a extensiones que mutan el DOM
  (Dark Reader, uBlock) y a animaciones JS.
- list_chrome_profiles: lista perfiles de un user-data-dir (extensiones,
  nombre legible, preferencias).
- prepare_chrome_profile (bash): clona un user-data-dir conservando solo
  una whitelist de extensiones (default uBlock Origin Lite).

Modificadas:
- chrome_launch: Linux-first (chromium/google-chrome/brave antes que
  chrome.exe), KeepExtensions y Setpgid para matar el arbol con cdp_close.
- cdp_close: kill por grupo de proceso.

Todas con tests verdes (go test ./functions/browser ok).
2026-06-05 16:25:11 +02:00

5.7 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
chrome_launch function go browser 1.3.0 impure func ChromeLaunch(opts ChromeLaunchOpts) (int, error) Lanza Google Chrome con remote debugging habilitado en el puerto indicado. En Linux nativo busca primero chromium/google-chrome/brave; en WSL2 busca chrome.exe primero. En WSL2+chrome.exe traduce UserDataDir a ruta Windows via wslpath e inyecta --remote-debugging-address=0.0.0.0. En Linux nativo setea Setpgid=true para crear grupo de proceso propio (permite matar el arbol completo con CdpClose). Espera hasta 15s a que el puerto CDP este listo. Retorna el PID del proceso.
chrome
cdp
browser
automation
wsl2
headless
navegator
linux
false error_go_core
fmt
net
os
os/exec
regexp
strings
syscall
time
name desc
opts opciones de lanzamiento: Port (defecto 9222), UserDataDir (defecto /tmp/chrome-cdp-profile en Linux, C:\Users<USER>\AppData\Local\fn-chrome-cdp-profile en WSL2+exe), Headless, ChromePath, ExtraArgs, KeepExtensions (si true no añade --disable-extensions, util para cargar extensiones del perfil), ProfileDirectory (selecciona el perfil con --profile-directory, ej: Default / Automation; vacío = no se pasa el flag)
int: PID del proceso Chrome lanzado true
TestIsWSL2
TestTranslateUserDataDirForWindows
TestIsWindowsExe
TestFindChrome
TestChromeLaunchAndConnect
functions/browser/chrome_launch_test.go functions/browser/chrome_launch.go

Ejemplo

// Linux nativo: chromium se detecta automaticamente, grupo de proceso propio
pid, err := ChromeLaunch(ChromeLaunchOpts{
    Port:     9222,
    Headless: true,
})
if err != nil {
    log.Fatal(err)
}
defer CdpClose(nil, pid) // mata grupo completo (zygote, gpu, renderers)
// Linux nativo con extensiones del perfil cargadas
pid, err := ChromeLaunch(ChromeLaunchOpts{
    Port:           9222,
    UserDataDir:    "/home/user/.config/chromium",
    KeepExtensions: true,
})
// WSL2 → chrome.exe Windows: cero configuracion, todo automatico
pid, err := ChromeLaunch(ChromeLaunchOpts{})
if err != nil {
    log.Fatal(err)
}
// CDP listo en 127.0.0.1:9222 desde WSL2
conn, err := CdpConnect(9222)

Cuando usarla

Cuando necesites lanzar Chrome con CDP desde Go para automatizacion (scraping, tests, capturas). Usar antes de CdpConnect / CdpNavigate / CdpScreenshot. Funciona en Linux nativo y en WSL2 apuntando al chrome.exe de Windows.

Gotchas

  • Linux nativo — orden de busqueda: chromium > chromium-browser > google-chrome > google-chrome-stable > brave-browser. Los .exe son ultimo recurso en Linux nativo.
  • WSL2 + chrome.exe: la funcion detecta automaticamente WSL2 (/proc/version contiene "microsoft"/"WSL") y que el ejecutable es .exe. En ese caso:
    • UserDataDir vacio o con prefijo /tmp/ o /home/ se traduce via wslpath -w a ruta Windows. Por defecto: C:\Users\<USER>\AppData\Local\fn-chrome-cdp-profile.
    • Se inyecta --remote-debugging-address=0.0.0.0 para que Chrome sea accesible desde WSL2 vía 127.0.0.1:<port>.
  • Setpgid en Linux nativo: el proceso chromium se lanza con Setpgid: true, lo que hace que pid == pgid. Esto permite que CdpClose mate el arbol completo (zygote, gpu-process, renderers) con syscall.Kill(-pid, SIGKILL). NO aplica en WSL+Windows.
  • KeepExtensions: por defecto se añade --disable-extensions. Pasar KeepExtensions: true para omitir ese flag y mantener extensiones del perfil (útil con perfiles reales de usuario).
  • wslpath debe estar disponible (WSL2 desde Windows 10 1903+): se invoca como subproceso en modo WSL2+exe. Si falla, ChromeLaunch retorna error.
  • ProfileDirectory obligatorio con múltiples perfiles: sin --profile-directory, si el user-data-dir contiene varios perfiles (Default, Personal, Profile 1, Automation…) Chrome se queda atascado en el selector de perfil y no carga nada — el puerto CDP responde pero no hay perfil activo y las extensiones no se procesan. Pasar ProfileDirectory: "Default" (o el nombre exacto del subdirectorio) para evitarlo.
  • Chrome no cierra solo: el PID devuelto es el proceso Chrome. Usar CdpClose(nil, pid) para terminar el arbol de procesos.
  • Puerto ocupado: si el puerto ya está en uso por otra instancia de Chrome, waitCDPReady puede conectar al proceso previo. Usar puertos distintos por sesión.

Notas

Busca Chrome en este orden (Linux nativo):

  1. chromium, chromium-browser, google-chrome, google-chrome-stable, brave-browser
  2. chrome.exe (ultimo recurso, normalmente no en PATH en Linux nativo)

Busca Chrome en este orden (WSL2):

  1. chrome.exe en PATH
  2. /mnt/c/Program Files/Google/Chrome/Application/chrome.exe
  3. /mnt/c/Program Files (x86)/Google/Chrome/Application/chrome.exe
  4. binarios Linux como fallback

Los flags aplicados desactivan funcionalidades de red y actualizacion en segundo plano para entornos de automatizacion. En modo headless se agrega --headless=new --disable-gpu.

El struct ChromeLaunchOpts se define en el mismo archivo.

Capability growth log

  • v1.1.0 (2026-05-16) — auto-handle WSL2→Windows chrome.exe: translate user-data-dir via wslpath + inject --remote-debugging-address=0.0.0.0
  • v1.2.0 (2026-06-05) — Linux-first: reordena busqueda (chromium antes que chrome.exe) en Linux nativo; añade KeepExtensions; setea Setpgid=true en Linux para habilitar kill-by-group en CdpClose
  • v1.3.0 (2026-06-05) — añade ProfileDirectory / --profile-directory para seleccionar perfil dentro del user-data-dir (evita quedarse atascado en el selector cuando hay varios perfiles)