9798aed2cf
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>
71 lines
3.0 KiB
Markdown
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.
|