029dbf57bd
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
54 lines
2.5 KiB
Markdown
54 lines
2.5 KiB
Markdown
---
|
|
name: cdp_hover_ref
|
|
kind: function
|
|
lang: go
|
|
domain: browser
|
|
version: "1.0.0"
|
|
purity: impure
|
|
signature: "func CdpHoverRef(c *CDPConn, backendNodeID int, opts MouseHumanOpts) error"
|
|
description: "Mueve el ratón con trayectoria humanizada (Bézier) sobre el elemento identificado por su #ref del AX outline. Útil para activar menús desplegables, tooltips y cualquier interacción que dependa de hover. El #ref es el backendDOMNodeId estable del nodo DOM."
|
|
tags: [cdp, browser, action, ref, humanized, navegator]
|
|
uses_functions: [cdp_move_mouse_human_go_browser]
|
|
uses_types: []
|
|
returns: []
|
|
returns_optional: false
|
|
error_type: "error_go_core"
|
|
imports: []
|
|
tested: false
|
|
tests: []
|
|
test_file_path: ""
|
|
params:
|
|
- name: c
|
|
desc: "Conexión CDP activa al tab objetivo."
|
|
- name: backendNodeID
|
|
desc: "El #ref del AX outline = backendDOMNodeId estable del nodo DOM. Se obtiene de page_perceive / render_ax_outline."
|
|
- name: opts
|
|
desc: "Opciones de trayectoria humanizada (jitter, velocidad, curva Bézier). Zero-value da humanización por defecto."
|
|
output: "nil si el movimiento de ratón se completó; error si la conexión es nil, el nodo no tiene boxModel visible, o el movimiento CDP falla."
|
|
file_path: "functions/browser/cdp_hover_ref.go"
|
|
---
|
|
|
|
## Ejemplo
|
|
|
|
```go
|
|
// Activar un menú desplegable cuyo trigger tiene #ref=9999:
|
|
conn, _ := CdpConnect(9222)
|
|
err := CdpHoverRef(conn, 9999, MouseHumanOpts{})
|
|
if err != nil {
|
|
log.Fatal(err)
|
|
}
|
|
// esperar a que el menú aparezca y re-percibir el outline
|
|
```
|
|
|
|
## Cuando usarla
|
|
|
|
Tras `page_perceive` / `render_ax_outline`, cuando el agente necesita hacer hover sobre un elemento del `#ref` para revelar contenido oculto (menús, submenús, tooltips, dropdowns) — cierra el bucle percibir→actuar para interacciones hover. Seguir con otro `page_perceive` tras el hover para capturar el nuevo estado del DOM.
|
|
|
|
## Gotchas
|
|
|
|
- El `#ref` es un **backendDOMNodeId**, no el nodeId efímero del AX tree. Si la página recargó o navegó tras el snapshot, el ref puede estar muerto — re-percibir antes de actuar.
|
|
- `DOM.getBoxModel` falla si el elemento no está en el DOM renderizado. El error describe la causa.
|
|
- `DOM.scrollIntoViewIfNeeded` se invoca antes del cálculo de coordenadas pero su fallo se ignora (no fatal).
|
|
- Solo mueve el ratón — no hace click. Para activar elementos que requieren click usar `CdpClickRef`.
|
|
- Algunos menús hover requieren un pequeño `time.Sleep` o `CdpWaitIdle` tras el hover para que el DOM se actualice antes del siguiente `page_perceive`.
|