--- id: 0070 title: Funciones globales del registry para control de navegador (find by text, click by text, scroll, HAR, jsonld, opengraph, ...) status: pending priority: medium created: 2026-05-09 related_apps: [navegator_dashboard, graph_explorer] related_issues_app: [navegator/0001, graph_explorer/0038] --- ## Contexto `functions/browser/` (Go) tiene hoy 12 primitivas CDP de bajo nivel: `cdp_connect`, `cdp_navigate`, `cdp_evaluate`, `cdp_get_html`, `cdp_screenshot`, `cdp_click` (por selector CSS), `cdp_type_text`, `cdp_wait_load`, `cdp_wait_element`, `cdp_set_cookie`, `cdp_close`, `chrome_launch`. Todas reutilizables, todas testeadas. Estas primitivas son suficientes para muchos casos pero **siguen siendo bajo nivel**: el consumidor (cdp-cli, navegator_dashboard, agentes) tiene que componer manualmente patrones que se repiten una y otra vez. Falta una capa intermedia de funciones de mas alto nivel que **resuelvan tareas reales** sin que cada caller las re-componga. ## Objetivo Ampliar `functions/browser/` (Go preferentemente, Python cuando aplique) con primitivas componibles que resuelvan los patrones recurrentes: 1. **Localizacion robusta de elementos**: por texto visible, por XPath, por aria-label. 2. **Acciones combinadas**: click por texto, fill form, submit, scroll-to, wait-navigation. 3. **Captura estructurada**: HAR, jsonld, opengraph, meta tags, schema.org. 4. **Navegacion segura**: navegacion + wait + retry + screenshot diff. 5. **Multi-tab / multi-instance**: enumerar tabs de N instancias, copiar cookie entre profiles. Cualquier app del registry que controle browsers (navegator_dashboard, cdp-cli, graph_explorer, futuras) consume esta capa en vez de reimplementar. ## Funciones propuestas (lista inicial) Todas en `functions/browser/`. Lenguaje preferido entre parentesis. Pureza siempre `impure` (todas tocan red/IO). ### Localizacion / queries | ID | Que hace | |---|---| | `cdp_find_by_text_go_browser` | Devuelve selector CSS unico del primer elemento cuyo `innerText` contiene un texto dado. Filtros: `tag`, `case_sensitive`, `exact`. | | `cdp_find_all_by_text_go_browser` | Como el anterior pero retorna lista de selectores. | | `cdp_find_by_xpath_go_browser` | Equivalente con XPath. | | `cdp_find_by_aria_go_browser` | Por `aria-label` o `role`. Util en SPAs accesibles. | | `cdp_get_attribute_go_browser` | `.getAttribute(name)`. | | `cdp_count_elements_go_browser` | `document.querySelectorAll(sel).length`. | ### Acciones | ID | Que hace | |---|---| | `cdp_click_text_go_browser` | `find_by_text` + `click`. Errores claros si no encuentra. | | `cdp_fill_form_go_browser` | Recibe `map[selector]value`, hace click + type por cada uno. | | `cdp_submit_form_go_browser` | Click en boton submit + `wait_navigation`. | | `cdp_scroll_to_go_browser` | `selector.scrollIntoView({block:'center'})` + verifica que esta en viewport. | | `cdp_press_key_go_browser` | `Input.dispatchKeyEvent` con tecla nombrada (Enter, Tab, Escape, ArrowDown). | | `cdp_hover_go_browser` | `Input.dispatchMouseEvent` mouseMoved sobre el elemento. | ### Esperas robustas | ID | Que hace | |---|---| | `cdp_wait_navigation_go_browser` | Espera `Page.frameNavigated` + `Page.loadEventFired` con timeout. | | `cdp_wait_text_go_browser` | Espera a que aparezca un texto en cualquier sitio del DOM. | | `cdp_wait_url_go_browser` | Espera a que `location.href` matchee un regex. | | `cdp_wait_idle_go_browser` | Espera a que la red este idle N ms (Network.* events). | ### Captura estructurada | ID | Que hace | |---|---| | `cdp_har_record_go_browser` | Subscribe `Network.*` durante una accion, retorna HAR JSON estandar. | | `extract_jsonld_py_browser` | Parse `