Skip to content

Commit 4487543

Browse files
authored
fix: Re-use pre-existing browser context in PlaywrightBrowserController (#1778)
### Description - `PlaywrightBrowserController` can receive a browser with already active contexts. If that is the case, use the first active context directly in the `PlaywrightBrowserController` instead of creating a new context ### Issues - Closes: #1776 ### Testing - Added unit test - Manual test on snippet reported by the user ### Checklist - [x] CI passed
1 parent 9fee0a2 commit 4487543

2 files changed

Lines changed: 20 additions & 1 deletion

File tree

src/crawlee/browsers/_playwright_browser_controller.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,9 @@ def __init__(
7272
self._fingerprint_generator = fingerprint_generator
7373
self._use_incognito_pages = use_incognito_pages
7474

75-
self._browser_context: BrowserContext | None = None
75+
self._browser_context: BrowserContext | None = (
76+
self._browser.contexts[0] if len(self._browser.contexts) > 0 else None
77+
)
7678
self._pages = list[Page]()
7779
self._last_page_opened_at = datetime.now(timezone.utc)
7880

tests/unit/browsers/test_playwright_browser_controller.py

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212

1313
if TYPE_CHECKING:
1414
from collections.abc import AsyncGenerator
15+
from pathlib import Path
1516

1617
from yarl import URL
1718

@@ -152,3 +153,19 @@ async def test_max_open_pages_limit_error_on_concurrent_creation(controller: Pla
152153
"""Test that max open pages limit is respected during concurrent page creation."""
153154
with pytest.raises(ValueError, match=r'Cannot open more pages in this browser.'):
154155
await asyncio.gather(controller.new_page(), controller.new_page(), controller.new_page())
156+
157+
158+
async def test_browser_with_pre_existing_context(tmp_path: Path) -> None:
159+
"""Test that using `Browser` with pre-existing active context re-uses such context."""
160+
async with async_playwright() as pw:
161+
persistent_context = await pw.firefox.launch_persistent_context(
162+
user_data_dir=str(tmp_path),
163+
headless=True,
164+
)
165+
browser = persistent_context.browser
166+
assert browser
167+
168+
controller = PlaywrightBrowserController(browser=browser)
169+
page_1 = await controller.new_page()
170+
page_2 = await controller.new_page()
171+
assert page_1.context == page_2.context == persistent_context

0 commit comments

Comments
 (0)