xtekky/gpt4free · warning · TimeoutError
Timeout waiting for event {method}
Error message
Timeout waiting for event {method} What it means
Raised by CDPSession.wait_for_event() in g4f/requests/cdp.py when the awaited CDP event did not fire within `timeout` (default 30s). Unlike call(), this waits for browser-emitted events (e.g. Network.loadingFinished, Page.loadEventFired); the future is removed from the handler list on timeout so it does not leak. It means the expected lifecycle event never happened on the page.
Source
Thrown at g4f/requests/cdp.py:462
try:
return await asyncio.wait_for(fut, timeout=30.0)
except asyncio.TimeoutError:
raise TimeoutError(f"CDP call {method} timed out after 30 seconds")
finally:
self._pending_requests.pop(req_id, None)
async def wait_for_event(self, method: str, timeout: float = 30.0) -> dict:
"""Wait for a specific CDP event to fire (one-time)."""
fut = asyncio.get_running_loop().create_future()
if method not in self._event_handlers:
self._event_handlers[method] = []
self._event_handlers[method].append(fut)
try:
return await asyncio.wait_for(fut, timeout=timeout)
except asyncio.TimeoutError:
self._event_handlers[method].remove(fut)
raise TimeoutError(f"Timeout waiting for event {method}")
def add_event_handler(self, method: str, queue: asyncio.Queue):
"""Add a persistent event listener that pushes events to an asyncio.Queue."""
if method not in self._event_queues:
self._event_queues[method] = []
self._event_queues[method].append(queue)
def remove_event_handler(self, method: str, queue: asyncio.Queue):
"""Remove a persistent event listener."""
if method in self._event_queues and queue in self._event_queues[method]:
self._event_queues[method].remove(queue)
async def evaluate_js(self, expression: str) -> Any:
"""Execute JavaScript and return the value."""
res = await self.call(
"Runtime.evaluate", expression=expression, returnByValue=True
)
return res.get("result", {}).get("value")View on GitHub (pinned to 973504e177)
Solutions
- Increase the timeout argument where the page is known to be slow (e.g. wait_for_event("Page.loadEventFired", timeout=120)).
- Enable the relevant domain before waiting (Page.enable / Network.enable) — events only stream for enabled domains.
- Double-check the exact CDP event name against the protocol docs (case-sensitive, e.g. 'Page.loadEventFired').
- Attach the waiter before triggering the action that causes the event to avoid the race.
- Fall back to polling (evaluate_js on document.readyState) when load events are unreliable.
Example fix
// before
await session.navigate(url)
await session.wait_for_event("Page.loadEventFired") # attached too late / too short
// after
task = asyncio.create_task(session.wait_for_event("Page.loadEventFired", timeout=120))
await session.navigate(url)
await task Defensive patterns
Strategy: fallback
Try / catch
try:
params = await session.wait_for_event("Page.loadEventFired", timeout=60)
except TimeoutError:
# fall back to polling readiness instead of failing
while (await session.evaluate_js("document.readyState")) != "complete":
await asyncio.sleep(0.5) Prevention
- Register the event waiter before triggering the action that fires the event.
- Enable the relevant CDP domain before waiting on its events.
- Size timeouts to the slowest realistic page load; default is 30s.
When it happens
Trigger: Waiting for Page.loadEventFired on a page whose load stalls (pending WebSocket, long-poll); waiting for a network event for a request that was served from cache or blocked; waiting for an event name that is disabled because its CDP domain was never enabled; the event fired before wait_for_event registered (race).
Common situations: Flaky third-party pages that never finish loading; ad-blockers or Chrome's cache suppressing the expected Network event; typos in CDP event method names; races where navigation completes before the waiter attaches.
Understand the failure class
- Timeouts: ETIMEDOUT, deadlines, and hung requests — what actually expires when a request times out.
Related errors
- CDPSession is not connected
- CDP call {method} timed out after 30 seconds
- Upload timeout for {file_id}
- Aliyun captcha SDK failed to load
- GLM captcha solving failed after {SOLVE_RETRIES} attempts: {
AI-assisted analysis of xtekky/gpt4free@973504e177 (2026-08-14).
Data as JSON: /api/errors/5109e0aa12811c65.
Report an issue: GitHub.