216cad4c12
Optimiza el dominio browser para que el manejo del navegador via CDP sea mucho más rápido en automatización propia, manteniendo el camino sigiloso disponible. - CDPConn cachea los enable de Accessibility/Network/Page por conexión (ensureAX/ensureNetwork/ensurePage): elimina un round-trip redundante en cada percepción y espera, que son las operaciones más frecuentes del bucle percibir->actuar del agente. - sendCDP adquiere timeout (cdpCmdTimeout 30s): antes una respuesta que Chrome nunca enviaba colgaba la goroutine del tool indefinidamente; ahora falla limpio y el retry puede reconectar. - CdpWaitLoad pasa de polling de document.readyState cada 200ms a esperar el evento Page.loadEventFired, con fast path inicial de readyState y re-chequeo anti-carrera tras suscribir. Si la página ya está cargada retorna en microsegundos. - cdp_wait_idle usa ensureNetwork y deja de hacer Network.disable al salir (borraba el estado y forzaba el enable de nuevo). - Nuevas funciones de escritura rápida: CdpInsertText (todo el texto en un solo Input.insertText) y CdpTypeRefFast (focus + insertText). El chequeo de foco se extrajo a assertEditableFocus, compartido con CdpTypeText. - CdpTypeText pasa su pausa entre caracteres de 10ms fija a aleatoria 15-65ms (ritmo humano irregular). - El modo 'auto' se añade al perfil de ratón (MouseProfileForMode, mouseHumanDefaults, clickPauseMs) como alias rápido de 'fast'. No se tocan las firmas públicas existentes; CdpTypeRef y CdpTypeText conservan su comportamiento (camino human).
54 lines
1.7 KiB
Go
54 lines
1.7 KiB
Go
package browser
|
|
|
|
import (
|
|
"fmt"
|
|
"time"
|
|
)
|
|
|
|
// CdpWaitLoad espera a que la página actual termine de cargar completamente.
|
|
// Bloquea hasta recibir el evento CDP Page.loadEventFired (sin polling): suscribe
|
|
// el evento via OnEvent y espera en un canal con timeout. Antes de esperar hace un
|
|
// fast path comprobando document.readyState — si la página ya está "complete",
|
|
// retorna de inmediato sin armar el handler.
|
|
// Retorna error si el timeout se agota o si no logra habilitar el dominio Page.
|
|
func CdpWaitLoad(c *CDPConn, timeout time.Duration) error {
|
|
if c == nil {
|
|
return fmt.Errorf("cdp wait load: conexion nula")
|
|
}
|
|
if timeout <= 0 {
|
|
timeout = 30 * time.Second
|
|
}
|
|
|
|
// Fast path: si el documento ya terminó de cargar, no esperamos eventos.
|
|
if rs, err := CdpEvaluate(c, "document.readyState"); err == nil && rs == "complete" {
|
|
return nil
|
|
}
|
|
|
|
// Habilitar Page (idempotente, cacheado) y suscribir el evento de carga.
|
|
if err := c.ensurePage(); err != nil {
|
|
return fmt.Errorf("cdp wait load: Page.enable: %w", err)
|
|
}
|
|
loaded := make(chan struct{}, 1)
|
|
cancel := c.OnEvent("Page.loadEventFired", func(_ string, _ map[string]any) {
|
|
select {
|
|
case loaded <- struct{}{}:
|
|
default:
|
|
}
|
|
})
|
|
defer cancel()
|
|
|
|
// Re-chequear readyState tras suscribir: si la carga terminó entre el fast
|
|
// path y el registro del handler, ya no llegaría el evento (carrera) — lo
|
|
// captamos aquí en vez de colgarnos hasta el timeout.
|
|
if rs, err := CdpEvaluate(c, "document.readyState"); err == nil && rs == "complete" {
|
|
return nil
|
|
}
|
|
|
|
select {
|
|
case <-loaded:
|
|
return nil
|
|
case <-time.After(timeout):
|
|
return fmt.Errorf("cdp wait load: pagina no cargo despues de %s", timeout)
|
|
}
|
|
}
|