--- id: cdp_get_frame_html_go_browser name: cdp_get_frame_html kind: function lang: go domain: browser purity: impure version: 1.0.0 tested: false description: "Devuelve el HTML completo (document.documentElement.outerHTML) de un iframe concreto componiendo sobre CdpEvalInFrame con un mundo aislado CDP." tags: [cdp, browser, iframe, html, scraping, navegator] signature: "func CdpGetFrameHTML(c *CDPConn, frameID string) (string, error)" uses_functions: [cdp_eval_in_frame_go_browser] uses_types: [] returns: [] returns_optional: false error_type: error_go_core imports: [] file_path: "functions/browser/cdp_get_frame_html.go" example: | conn, _ := CdpConnect("localhost", 9222, "") frames, _ := CdpListFrames(conn) html, err := CdpGetFrameHTML(conn, frames[1].ID) fmt.Println(html[:200]) // primeros 200 chars del HTML del iframe params: - name: c desc: "Conexión CDP activa obtenida con CdpConnect." - name: frameID desc: "ID del frame cuyo HTML se quiere obtener; obtenido de CdpListFrames (campo CdpFrame.ID)." output: "String con el HTML completo del iframe (outerHTML del documentElement); error si la conexión es nula, el frameID está vacío o la evaluación CDP falla." --- ## Ejemplo ```go conn, err := CdpConnect("localhost", 9222, "") if err != nil { log.Fatal(err) } defer conn.Close() // 1. Listar frames para obtener el ID del iframe deseado frames, err := CdpListFrames(conn) if err != nil { log.Fatal(err) } // frames[0] = frame raíz, frames[1] = primer iframe for _, f := range frames { if f.ParentID != "" { // es un iframe, no el raíz html, err := CdpGetFrameHTML(conn, f.ID) if err != nil { log.Printf("error en frame %s: %v", f.ID, err) continue } fmt.Printf("=== iframe %s (%s) ===\n%s\n", f.ID, f.URL, html[:min(500, len(html))]) } } ``` ## Cuando usarla Cuando necesites el HTML completo de un iframe para parsearlo, scrapearlo o inspeccionarlo. Flujo típico: `CdpListFrames` → elegir frame por URL → `CdpGetFrameHTML` → parsear con `golang.org/x/net/html` o regexp. ## Gotchas - El mundo aislado ve el DOM pero NO las variables JS del page-world del iframe; suficiente para leer `outerHTML` y hacer scraping estructural. - `frameID` debe obtenerse de `CdpListFrames`; un ID obsoleto (frame recargado) provoca error en `CdpEvalInFrame`. - Para iframes con contenido dinámico (renderizado por JS), espera a que el iframe termine de cargar antes de llamar a esta función; de lo contrario el HTML puede estar incompleto. - En páginas con muchos iframes pesados, el outerHTML puede ser muy grande (MBs); considera evaluar selectores más específicos con `CdpEvalInFrame` si solo necesitas parte del DOM.