--- id: cdp_list_frames_go_browser name: cdp_list_frames kind: function lang: go domain: browser purity: impure version: 1.0.0 tested: false description: "Lista todos los frames/iframes de la pestaña activa usando Page.getFrameTree y devuelve el árbol aplanado con ID, parentID, URL y nombre de cada frame." tags: [cdp, browser, iframe, frames, page, navegator] signature: "func CdpListFrames(c *CDPConn) ([]CdpFrame, error)" uses_functions: [] uses_types: [] returns: [] returns_optional: false error_type: error_go_core imports: [] file_path: "functions/browser/cdp_list_frames.go" example: | conn, _ := CdpConnect("localhost", 9222, "") frames, err := CdpListFrames(conn) for _, f := range frames { fmt.Printf("frame %s parent=%s url=%s\n", f.ID, f.ParentID, f.URL) } params: - name: c desc: "Conexión CDP activa obtenida con CdpConnect; apunta a la pestaña cuyo árbol de frames se quiere inspeccionar." output: "Slice de CdpFrame con ID, ParentID, URL y Name de cada frame aplanado; error si la conexión es nula, Page.enable falla o la respuesta CDP es inesperada." --- ## Ejemplo ```go conn, err := CdpConnect("localhost", 9222, "") if err != nil { log.Fatal(err) } defer conn.Close() frames, err := CdpListFrames(conn) if err != nil { log.Fatal(err) } for _, f := range frames { fmt.Printf("id=%-40s parent=%-40s url=%s\n", f.ID, f.ParentID, f.URL) } // Salida ejemplo: // id=ABCD1234 parent= url=https://example.com // id=EFGH5678 parent=ABCD1234 url=https://ads.example.com/iframe ``` ## Cuando usarla Antes de evaluar JS en un iframe con `CdpEvalInFrame`: necesitas el `frameID` exacto que usa CDP, no el `src` del iframe. También útil para auditar la estructura de frames de una página o detectar iframes de terceros. ## Gotchas - Requiere que la pestaña ya esté cargada; si se llama justo tras `CdpNavigate` en páginas con lazy-load de iframes, puede devolver un listado incompleto — espera a `Page.loadEventFired` o usa un breve delay. - `Page.enable` se llama internamente (idempotente); no hace falta llamarlo manualmente antes. - El frame raíz tiene `ParentID` vacío. Los iframes anidados tienen como `ParentID` el `ID` del frame contenedor. - `Name` puede ser vacío si el `