--- name: cdp_set_file_input kind: function lang: go domain: browser version: "1.0.0" purity: impure signature: "func CdpSetFileInput(c *CDPConn, selector string, paths []string) error" description: "Sube archivos a un identificado por selector CSS, sin abrir el dialogo nativo de seleccion de archivos. Resuelve el nodo via DOM.getDocument + DOM.querySelector y asigna los archivos con DOM.setFileInputFiles. Valida con os.Stat que cada path exista en disco antes de tocar el DOM." tags: [chrome, cdp, browser, automation, upload, file, input, form, dom, devtools] uses_functions: [cdp_connect_go_browser] uses_types: [] returns: [] returns_optional: false error_type: "error_go_core" imports: [fmt, os] params: - name: c desc: "conexión CDP activa (*CDPConn)" - name: selector desc: "selector CSS del destino (ej. 'input[type=file]', '#avatar')" - name: paths desc: "rutas absolutas de los archivos a subir; cada una debe existir y ser accesible por el proceso Chrome" output: "error si algún path no existe, si el selector no coincide con ningún nodo, o si falla el comando CDP; nil si los archivos quedaron asignados al input" tested: false tests: [] test_file_path: "" file_path: "functions/browser/cdp_set_file_input.go" --- ## Ejemplo ```go conn, _ := CdpConnect(9222) CdpNavigate(conn, "https://example.com/upload") // Subir un solo archivo err := CdpSetFileInput(conn, "input[type=file]", []string{"/home/enmanuel/docs/cv.pdf"}) if err != nil { log.Fatal(err) } // Subir varios archivos a un input con multiple err = CdpSetFileInput(conn, "#gallery", []string{ "/home/enmanuel/fotos/1.jpg", "/home/enmanuel/fotos/2.jpg", }) if err != nil { log.Fatal(err) } ``` ## Cuando usarla Cuando automatices un formulario web de subida de archivos y necesites rellenar un `` sin poder interactuar con el dialogo nativo del sistema operativo (que CDP no puede manejar haciendo click). Llamala despues de navegar a la pagina y de que el input exista en el DOM; combina con `CdpWaitElement` si el input aparece de forma dinamica. ## Gotchas - **Los paths deben ser ABSOLUTOS y accesibles por el proceso de Chrome**, no por este programa. Chrome lee los archivos desde su propio contexto/usuario; un path relativo o un archivo en un directorio que Chrome no puede leer fallara en el navegador aunque `os.Stat` pase localmente (caso tipico: Chrome corriendo en otro usuario, contenedor o maquina remota via CDP). - La validacion `os.Stat` se ejecuta en la maquina donde corre esta funcion. Si el Chrome del CDP esta en otra maquina/contenedor, que `os.Stat` pase NO garantiza que Chrome encuentre el archivo. En ese escenario los paths deben ser validos en el filesystem de Chrome. - El selector debe apuntar a un `` real. Apuntar a un boton o label que dispara el dialogo nativo no funciona: hay que resolver el input subyacente. - Asignar mas de un archivo requiere que el input tenga el atributo `multiple`; si no lo tiene, Chrome puede rechazar o quedarse solo con el primero. - No dispara automaticamente el submit del formulario ni eventos `change` personalizados mas alla de los que el propio CDP emite al asignar los archivos; si la pagina depende de listeners adicionales, comprueba el comportamiento.