--- id: cdp_scroll_go_browser name: cdp_scroll kind: function lang: go domain: browser purity: impure version: 1.0.0 tested: false tests: [] test_file_path: "" description: "Desplaza la pagina via rueda del raton con Input.dispatchMouseEvent type mouseWheel; imprescindible para scroll infinito en SPAs." tags: [cdp, browser, input, scroll, navegator] signature: "func CdpScroll(c *CDPConn, deltaX, deltaY float64) error" uses_functions: [] uses_types: [] returns: [] returns_optional: false error_type: error_go_core imports: [] file_path: "functions/browser/cdp_scroll.go" example: | // Scroll hacia abajo 800px en una SPA con feed infinito for i := 0; i < 5; i++ { _ = CdpScroll(c, 0, 800) _ = CdpWaitIdle(c, 1500) } params: - name: c desc: "Conexion CDP activa obtenida con CdpConnect." - name: deltaX desc: "Desplazamiento horizontal en pixeles. Positivo = derecha, negativo = izquierda. 0 para scroll solo vertical." - name: deltaY desc: "Desplazamiento vertical en pixeles. Positivo = hacia abajo, negativo = hacia arriba. Valores tipicos: 300-800 por paso." output: "nil si el evento de scroll se despacho correctamente. Error si la conexion es nula o CDP rechaza el evento." --- ## Ejemplo ```go conn, _ := CdpConnect(9222) _ = CdpNavigate(conn, "https://news.ycombinator.com") _ = CdpWaitLoad(conn, 3000) // Scroll hacia abajo en 5 pasos con pausa entre cada uno for i := 0; i < 5; i++ { if err := CdpScroll(conn, 0, 600); err != nil { log.Fatal(err) } // Esperar que la SPA cargue nuevo contenido _ = CdpWaitIdle(conn, 1500) } // Volver al inicio _ = CdpScroll(conn, 0, -99999) ``` ## Cuando usarla Usar para cargar contenido de scroll infinito en SPAs (Twitter, LinkedIn, feeds), para desplazarse hasta elementos fuera del viewport antes de interactuar con ellos, o para simular lectura humana de una pagina. Combinar con CdpWaitIdle entre scrolls para dar tiempo a que el framework cargue nuevo contenido. ## Gotchas - El evento se despacha en las coordenadas fijas (100, 100) del viewport. Si la pagina tiene un panel lateral o header que ocupa esa zona, el scroll puede no afectar al contenedor principal. En ese caso, evaluar `window.scrollBy(deltaX, deltaY)` via CdpEvaluate como alternativa. - deltaY positivo = hacia abajo (igual que WheelEvent nativo del navegador). - Para SPAs con scroll infinito es imprescindible llamar CdpWaitIdle despues de cada CdpScroll; sin la pausa, los scrolls consecutivos llegan antes de que el framework procese el primero. - No hay garantia de que el scroll llegue al valor exacto de deltaY: el navegador puede aplicar aceleracion o limitar el desplazamiento al final del contenido.