Files
fn_registry/functions/browser/cdp_select_option.md
T
Egutierrez 9798aed2cf 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>
2026-06-16 20:21:46 +02:00

71 lines
3.0 KiB
Markdown

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