From db9e324bc21d502e29c33c73c79e57886d987448 Mon Sep 17 00:00:00 2001 From: Volodymyr Kasaraba Date: Wed, 13 May 2026 19:10:14 -0400 Subject: [PATCH] init page domcontentloaded --- packages/narada/pyproject.toml | 2 +- packages/narada/src/narada/client.py | 8 +- packages/narada/tests/test_cloud_browser.py | 91 +++++++++++++++++++++ uv.lock | 2 +- 4 files changed, 99 insertions(+), 4 deletions(-) create mode 100644 packages/narada/tests/test_cloud_browser.py diff --git a/packages/narada/pyproject.toml b/packages/narada/pyproject.toml index f3e175f..8968e2a 100644 --- a/packages/narada/pyproject.toml +++ b/packages/narada/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "narada" -version = "0.1.53a3" +version = "0.1.53a4" description = "Python client SDK for Narada" license = "Apache-2.0" readme = "README.md" diff --git a/packages/narada/src/narada/client.py b/packages/narada/src/narada/client.py index ee72605..a1b2093 100644 --- a/packages/narada/src/narada/client.py +++ b/packages/narada/src/narada/client.py @@ -279,7 +279,9 @@ async def _initialize_cloud_browser_window( # Navigate to login URL (provided by backend with custom token) context = browser.contexts[0] initialization_page = context.pages[0] - await initialization_page.goto(login_url, timeout=15_000) + await initialization_page.goto( + login_url, timeout=15_000, wait_until="domcontentloaded" + ) # Wait for browser window ID. The extension can take a bit to be installed, so we retry a # few times. @@ -302,7 +304,9 @@ async def _initialize_cloud_browser_window( raise # If browser window ID is not found, reload the page and try again # try to go to the login URL again (with customToken query param) - await initialization_page.goto(login_url, timeout=15_000) + await initialization_page.goto( + login_url, timeout=15_000, wait_until="domcontentloaded" + ) cloud_window = CloudBrowserWindow( browser_window_id=browser_window_id, diff --git a/packages/narada/tests/test_cloud_browser.py b/packages/narada/tests/test_cloud_browser.py new file mode 100644 index 0000000..7588610 --- /dev/null +++ b/packages/narada/tests/test_cloud_browser.py @@ -0,0 +1,91 @@ +from types import SimpleNamespace +from unittest.mock import AsyncMock, call + +import pytest +from narada.client import Narada +from narada.config import BrowserConfig +from narada_core.errors import NaradaTimeoutError + + +def _build_client_with_cloud_page(page: AsyncMock) -> Narada: + client = Narada(auth_headers={"x-api-key": "test-key"}) + browser = SimpleNamespace(contexts=[SimpleNamespace(pages=[page])]) + client._playwright = SimpleNamespace( + chromium=SimpleNamespace(connect_over_cdp=AsyncMock(return_value=browser)) + ) + return client + + +@pytest.mark.asyncio +async def test_initialize_cloud_browser_window_uses_domcontentloaded_for_login_navigation( + monkeypatch: pytest.MonkeyPatch, +) -> None: + page = AsyncMock() + client = _build_client_with_cloud_page(page) + + wait_for_browser_window_id = AsyncMock(return_value="browser-window-123") + monkeypatch.setattr( + client, "_wait_for_browser_window_id", wait_for_browser_window_id + ) + + window = await client._initialize_cloud_browser_window( + config=BrowserConfig(interactive=False), + cdp_websocket_url="wss://agentcore.example.test/session-123", + session_id="session-123", + login_url="https://app.narada.ai/chat?customToken=test-token", + cdp_auth_headers={"Authorization": "signed-cdp"}, + ) + + page.goto.assert_awaited_once_with( + "https://app.narada.ai/chat?customToken=test-token", + timeout=15_000, + wait_until="domcontentloaded", + ) + wait_for_browser_window_id.assert_awaited_once_with( + page, + BrowserConfig(interactive=False), + timeout=30_000, + ) + assert window.browser_window_id == "browser-window-123" + assert window.cloud_browser_session_id == "session-123" + + +@pytest.mark.asyncio +async def test_initialize_cloud_browser_window_uses_domcontentloaded_for_retry_navigation( + monkeypatch: pytest.MonkeyPatch, +) -> None: + page = AsyncMock() + client = _build_client_with_cloud_page(page) + + wait_for_browser_window_id = AsyncMock( + side_effect=[ + NaradaTimeoutError("Timed out waiting for browser window ID"), + "browser-window-123", + ] + ) + monkeypatch.setattr( + client, "_wait_for_browser_window_id", wait_for_browser_window_id + ) + + window = await client._initialize_cloud_browser_window( + config=BrowserConfig(interactive=False), + cdp_websocket_url="wss://agentcore.example.test/session-123", + session_id="session-123", + login_url="https://app.narada.ai/chat?customToken=test-token", + cdp_auth_headers={"Authorization": "signed-cdp"}, + ) + + assert page.goto.await_args_list == [ + call( + "https://app.narada.ai/chat?customToken=test-token", + timeout=15_000, + wait_until="domcontentloaded", + ), + call( + "https://app.narada.ai/chat?customToken=test-token", + timeout=15_000, + wait_until="domcontentloaded", + ), + ] + assert wait_for_browser_window_id.await_count == 2 + assert window.browser_window_id == "browser-window-123" diff --git a/uv.lock b/uv.lock index 2f2b9a2..e2f2c1b 100644 --- a/uv.lock +++ b/uv.lock @@ -312,7 +312,7 @@ wheels = [ [[package]] name = "narada" -version = "0.1.53a3" +version = "0.1.53a4" source = { editable = "packages/narada" } dependencies = [ { name = "aiohttp" },