# -*- coding: utf-8 -*- from unittest.mock import MagicMock import pytest @pytest.fixture def mock_playwright(monkeypatch): pw = MagicMock() ctx = MagicMock() page = MagicMock() ctx.pages = [page] pw.chromium.launch_persistent_context.return_value = ctx sp = MagicMock() sp.start.return_value = pw monkeypatch.setattr("service.rpa_helpers.browser.sync_playwright", lambda: sp) return {"pw": pw, "ctx": ctx, "page": page, "sp": sp} def test_launch_browser_uses_chrome_channel_default(mock_playwright, monkeypatch, tmp_path): monkeypatch.setenv("OPENCLAW_PLAYWRIGHT_STEALTH", "1") monkeypatch.setattr( "service.rpa_helpers.browser.resolve_chromium_channel", lambda: "chrome", ) prof = tmp_path / "p1" from service.rpa_helpers.browser import launch_browser_with_profile ctx, page = launch_browser_with_profile(str(prof)) pw = mock_playwright["pw"] kw = pw.chromium.launch_persistent_context.call_args.kwargs assert kw["channel"] == "chrome" assert "--disable-blink-features=AutomationControlled" in kw["args"] assert ctx is mock_playwright["ctx"] assert page is mock_playwright["page"] def test_launch_browser_respects_explicit_channel(mock_playwright, monkeypatch, tmp_path): monkeypatch.setenv("OPENCLAW_PLAYWRIGHT_STEALTH", "1") prof = tmp_path / "p2" from service.rpa_helpers.browser import launch_browser_with_profile launch_browser_with_profile(str(prof), channel="msedge") kw = mock_playwright["pw"].chromium.launch_persistent_context.call_args.kwargs assert kw["channel"] == "msedge" def test_launch_browser_creates_profile_dir(mock_playwright, monkeypatch, tmp_path): monkeypatch.setenv("OPENCLAW_PLAYWRIGHT_STEALTH", "1") monkeypatch.setattr( "service.rpa_helpers.browser.resolve_chromium_channel", lambda: "chrome", ) prof = tmp_path / "new_prof" assert not prof.is_dir() from service.rpa_helpers.browser import launch_browser_with_profile launch_browser_with_profile(str(prof)) assert prof.is_dir()