feat(browser): cdp_collect_console + cdp_print_pdf + cdp_select_option + cdp_set_file_input
Cuatro primitivas CDP nuevas para el dominio browser, base de nuevas tools del browser_mcp: - cdp_collect_console: snapshot temporal de console + exceptions + log entries - cdp_print_pdf: Page.printToPDF -> []byte - cdp_select_option: selecciona <option> en un <select> y dispara input/change - cdp_set_file_input: sube archivos a un <input type=file> via DOM.setFileInputFiles Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,79 @@
|
||||
---
|
||||
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.
|
||||
Reference in New Issue
Block a user