5b10b419a2
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
57 lines
1.7 KiB
Go
57 lines
1.7 KiB
Go
package browser
|
|
|
|
import (
|
|
"encoding/json"
|
|
"fmt"
|
|
"net/http"
|
|
"strings"
|
|
)
|
|
|
|
// CdpConnectTarget se conecta a un target CDP DETERMINISTA identificado por match.
|
|
//
|
|
// Si host es "" se usa "localhost".
|
|
// match puede ser:
|
|
// - "" → primer target con Type "page" y WebSocketDebuggerURL no vacío (misma
|
|
// semántica que CdpConnectHost, útil como fallback compatible).
|
|
// - ID exacto del target (campo "id" en /json).
|
|
// - Substring case-insensitive de la URL del target.
|
|
//
|
|
// Retorna error si ningún target type=page satisface el match.
|
|
func CdpConnectTarget(host string, port int, match string) (*CDPConn, error) {
|
|
if host == "" {
|
|
host = "localhost"
|
|
}
|
|
|
|
resp, err := http.Get(fmt.Sprintf("http://%s:%d/json", host, port))
|
|
if err != nil {
|
|
return nil, fmt.Errorf("cdp connect target: listar targets: %w", err)
|
|
}
|
|
defer resp.Body.Close()
|
|
|
|
var targets []cdpTarget
|
|
if err := json.NewDecoder(resp.Body).Decode(&targets); err != nil {
|
|
return nil, fmt.Errorf("cdp connect target: decode targets: %w", err)
|
|
}
|
|
|
|
matchLower := strings.ToLower(match)
|
|
|
|
for _, t := range targets {
|
|
if t.Type != "page" || t.WebSocketDebuggerURL == "" {
|
|
continue
|
|
}
|
|
if match == "" {
|
|
// Sin filtro: primera tab page disponible.
|
|
return cdpConnectWS(t.WebSocketDebuggerURL, port)
|
|
}
|
|
// Coincidencia por ID exacto o substring de URL (case-insensitive).
|
|
if t.ID == match || strings.Contains(strings.ToLower(t.URL), matchLower) {
|
|
return cdpConnectWS(t.WebSocketDebuggerURL, port)
|
|
}
|
|
}
|
|
|
|
if match == "" {
|
|
return nil, fmt.Errorf("cdp connect target: no hay ninguna tab 'page' disponible en %s:%d", host, port)
|
|
}
|
|
return nil, fmt.Errorf("cdp connect target: no hay tab 'page' que matchee %q en %s:%d", match, host, port)
|
|
}
|