---
name: cdp_open_url_and_wait
kind: function
lang: py
domain: pipelines
version: "1.0.0"
purity: impure
signature: "def cdp_open_url_and_wait(debug_port: int, url: str, timeout_s: int = 30) -> str"
description: "Crea tab nuevo en Chrome remoto via CDP, navega a URL y espera Page.loadEventFired. Devuelve tab_id."
tags: [navegator, cdp, chrome, browser]
uses_functions: []
uses_types: []
returns: []
returns_optional: false
error_type: "error_go_core"
imports: [json, threading, urllib.request, urllib.parse, websocket]
params:
  - name: debug_port
    desc: "Puerto de depuracion remota de Chrome (tipicamente 9222)."
  - name: url
    desc: "URL completa a la que navegar en el tab nuevo."
  - name: timeout_s
    desc: "Segundos maximos esperando Page.loadEventFired. Default 30."
output: "tab_id (str) del tab recien creado en Chrome."
tested: false
tests: []
test_file_path: ""
file_path: "python/functions/pipelines/cdp_open_url_and_wait.py"
---

## Ejemplo

```python
import sys
sys.path.insert(0, "python/functions")
from pipelines.cdp_open_url_and_wait import cdp_open_url_and_wait

tab_id = cdp_open_url_and_wait(9222, "https://example.com", timeout_s=15)
print(tab_id)  # "B1C2D3E4-..."
```

## Cuando usarla

Cuando necesites abrir una URL nueva en Chrome remoto y asegurarte de que la pagina cargo antes de interactuar con ella via CDP. Paso previo a cualquier extraccion de AX tree o ejecucion de JS.

## Gotchas

- Chrome debe estar corriendo con `--remote-debugging-port=<debug_port>` y `--remote-allow-origins=*`.
- PUT a `/json/new?<url>` crea el tab; si Chrome no acepta PUT responde 404 (version antigua).
- `Page.loadEventFired` puede no dispararse en SPAs con routing sin recarga — usar `timeout_s` conservador o esperar selector via `cdp_extract_recipe`.
- `websocket-client` debe estar instalado en el venv.
