ccfa5bc78b
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).
5.7 KiB
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. |
|
false | error_go_core |
|
|
int: PID del proceso Chrome lanzado | true |
|
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
.exeson ultimo recurso en Linux nativo. - WSL2 + chrome.exe: la funcion detecta automaticamente WSL2 (
/proc/versioncontiene "microsoft"/"WSL") y que el ejecutable es.exe. En ese caso:UserDataDirvacio o con prefijo/tmp/o/home/se traduce viawslpath -wa ruta Windows. Por defecto:C:\Users\<USER>\AppData\Local\fn-chrome-cdp-profile.- Se inyecta
--remote-debugging-address=0.0.0.0para que Chrome sea accesible desde WSL2 vía127.0.0.1:<port>.
- Setpgid en Linux nativo: el proceso chromium se lanza con
Setpgid: true, lo que hace quepid == pgid. Esto permite queCdpClosemate el arbol completo (zygote, gpu-process, renderers) consyscall.Kill(-pid, SIGKILL). NO aplica en WSL+Windows. - KeepExtensions: por defecto se añade
--disable-extensions. PasarKeepExtensions: truepara omitir ese flag y mantener extensiones del perfil (útil con perfiles reales de usuario). wslpathdebe estar disponible (WSL2 desde Windows 10 1903+): se invoca como subproceso en modo WSL2+exe. Si falla,ChromeLaunchretorna error.- ProfileDirectory obligatorio con múltiples perfiles: sin
--profile-directory, si eluser-data-dircontiene 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. PasarProfileDirectory: "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,
waitCDPReadypuede conectar al proceso previo. Usar puertos distintos por sesión.
Notas
Busca Chrome en este orden (Linux nativo):
chromium,chromium-browser,google-chrome,google-chrome-stable,brave-browserchrome.exe(ultimo recurso, normalmente no en PATH en Linux nativo)
Busca Chrome en este orden (WSL2):
chrome.exeen PATH/mnt/c/Program Files/Google/Chrome/Application/chrome.exe/mnt/c/Program Files (x86)/Google/Chrome/Application/chrome.exe- 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)