Files
MediaCrawler/tests/test_cdp_browser.py
2026-06-18 17:22:38 +08:00

96 lines
3.1 KiB
Python

# -*- coding: utf-8 -*-
from unittest.mock import AsyncMock, MagicMock
import pytest
import config
from tools.cdp_browser import CDPBrowserManager
@pytest.mark.asyncio
async def test_existing_browser_connects_directly_to_devtools_browser(monkeypatch):
monkeypatch.setattr(config, "CDP_CONNECT_EXISTING", True)
monkeypatch.setattr(config, "BROWSER_LAUNCH_TIMEOUT", 60)
manager = CDPBrowserManager()
manager.debug_port = 9222
manager._get_browser_websocket_url = AsyncMock( # type: ignore[method-assign]
side_effect=AssertionError("existing browser mode must not call /json/version")
)
browser = MagicMock()
browser.is_connected.return_value = True
browser.contexts = []
playwright = MagicMock()
playwright.chromium.connect_over_cdp = AsyncMock(return_value=browser)
await manager._connect_via_cdp(playwright)
playwright.chromium.connect_over_cdp.assert_awaited_once_with(
"ws://localhost:9222/devtools/browser",
timeout=60000,
)
@pytest.mark.asyncio
async def test_existing_browser_falls_back_to_discovered_websocket_url(monkeypatch):
monkeypatch.setattr(config, "CDP_CONNECT_EXISTING", True)
monkeypatch.setattr(config, "BROWSER_LAUNCH_TIMEOUT", 60)
manager = CDPBrowserManager()
manager.debug_port = 9222
manager._get_browser_websocket_url = AsyncMock( # type: ignore[method-assign]
return_value="ws://localhost:9222/devtools/browser/generated-id"
)
browser = MagicMock()
browser.is_connected.return_value = True
browser.contexts = []
playwright = MagicMock()
playwright.chromium.connect_over_cdp = AsyncMock(
side_effect=[RuntimeError("direct websocket failed"), browser]
)
await manager._connect_via_cdp(playwright)
manager._get_browser_websocket_url.assert_awaited_once_with(9222)
assert playwright.chromium.connect_over_cdp.await_args_list[0].args == (
"ws://localhost:9222/devtools/browser",
)
assert playwright.chromium.connect_over_cdp.await_args_list[0].kwargs == {
"timeout": 60000,
}
assert playwright.chromium.connect_over_cdp.await_args_list[1].args == (
"ws://localhost:9222/devtools/browser/generated-id",
)
assert playwright.chromium.connect_over_cdp.await_args_list[1].kwargs == {
"timeout": 60000,
}
@pytest.mark.asyncio
async def test_launched_browser_uses_discovered_websocket_url(monkeypatch):
monkeypatch.setattr(config, "CDP_CONNECT_EXISTING", False)
manager = CDPBrowserManager()
manager.debug_port = 9223
manager._get_browser_websocket_url = AsyncMock( # type: ignore[method-assign]
return_value="ws://localhost:9223/devtools/browser/generated-id"
)
browser = MagicMock()
browser.is_connected.return_value = True
browser.contexts = []
playwright = MagicMock()
playwright.chromium.connect_over_cdp = AsyncMock(return_value=browser)
await manager._connect_via_cdp(playwright)
manager._get_browser_websocket_url.assert_awaited_once_with(9223)
playwright.chromium.connect_over_cdp.assert_awaited_once_with(
"ws://localhost:9223/devtools/browser/generated-id"
)