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,70 @@
|
||||
---
|
||||
name: cdp_select_option
|
||||
kind: function
|
||||
lang: go
|
||||
domain: browser
|
||||
version: "1.0.0"
|
||||
purity: impure
|
||||
signature: "func CdpSelectOption(c *CDPConn, selector string, value string) error"
|
||||
description: "Selecciona la <option> de un <select> (localizado por selector CSS) cuyo value coincide con el valor dado; si ningun value coincide, busca por texto visible de la option. Tras setear select.value despacha los eventos 'input' y 'change' con bubbles:true para que frameworks (React/Vue) reaccionen al cambio. Via Runtime.evaluate, reusa CdpEvaluate."
|
||||
tags: [chrome, cdp, browser, automation, select, dropdown, form, dom, devtools]
|
||||
uses_functions: [cdp_evaluate_go_browser]
|
||||
uses_types: []
|
||||
returns: []
|
||||
returns_optional: false
|
||||
error_type: "error_go_core"
|
||||
imports: [fmt, strings]
|
||||
params:
|
||||
- name: c
|
||||
desc: "conexión CDP activa"
|
||||
- name: selector
|
||||
desc: "selector CSS del elemento <select> a modificar"
|
||||
- name: value
|
||||
desc: "value de la <option> a seleccionar; si no hay match por value, se busca por texto visible (textContent trimeado)"
|
||||
output: "error si el select no existe (\"select not found\") o ninguna option coincide por value ni por texto (\"option not found\"); nil si la selección y los eventos se despacharon correctamente"
|
||||
tested: false
|
||||
tests: []
|
||||
test_file_path: ""
|
||||
file_path: "functions/browser/cdp_select_option.go"
|
||||
---
|
||||
|
||||
## Ejemplo
|
||||
|
||||
```go
|
||||
conn, _ := CdpConnect(9222)
|
||||
CdpNavigate(conn, "https://example.com/form")
|
||||
|
||||
// Seleccionar por value
|
||||
if err := CdpSelectOption(conn, "#country", "ES"); err != nil {
|
||||
log.Fatal(err)
|
||||
}
|
||||
|
||||
// Seleccionar por texto visible cuando no se conoce el value interno
|
||||
if err := CdpSelectOption(conn, "select[name=lang]", "Español"); err != nil {
|
||||
log.Fatal(err)
|
||||
}
|
||||
```
|
||||
|
||||
## Cuando usarla
|
||||
|
||||
Usala cuando necesites elegir una opcion de un `<select>` nativo en un formulario
|
||||
web y quieras que un framework (React, Vue, Angular) reaccione al cambio. Es la
|
||||
forma robusta de rellenar dropdowns durante automatizacion/scraping: a diferencia
|
||||
de un click sobre la option, setea `select.value` y dispara `input`+`change`, que
|
||||
es lo que los frameworks escuchan. Combinala con `CdpClick` para enviar el
|
||||
formulario despues.
|
||||
|
||||
## Gotchas
|
||||
|
||||
- Solo funciona con `<select>` nativos (HTML). Dropdowns custom hechos con `<div>`
|
||||
+ JS (ej. react-select, headlessui) NO son `<select>` reales: para esos hay que
|
||||
clickar y elegir la opcion del menu desplegado, no usar esta funcion.
|
||||
- El match por value es exacto (`===`); el fallback por texto compara `textContent`
|
||||
trimeado de forma exacta tras `.trim()` (no substring, no case-insensitive).
|
||||
- No hace scroll ni verifica visibilidad: opera sobre el DOM directamente. Si el
|
||||
`<select>` esta deshabilitado (`disabled`), el value se setea igual pero la UI
|
||||
puede ignorarlo segun el framework.
|
||||
- Para `<select multiple>` solo selecciona una opcion (la que coincide) y resetea
|
||||
el resto, porque setea `select.value` (no añade a `selectedOptions`).
|
||||
- Si el elemento aun no existe (carga dinamica), retorna "select not found" sin
|
||||
esperar — combinar con `CdpWaitElement` para elementos diferidos.
|
||||
Reference in New Issue
Block a user