---
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.