---
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 <input type=\"file\"> 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 <input type=\"file\"> 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
`<input type="file">` 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 `<input type="file">` 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.
