Skip to content

Commit 084daca

Browse files
committed
Test browser restart
1 parent e31bee0 commit 084daca

File tree

3 files changed

+51
-5
lines changed

3 files changed

+51
-5
lines changed

scrapy_playwright/handler.py

+1-2
Original file line numberDiff line numberDiff line change
@@ -636,10 +636,9 @@ async def browser_disconnected_callback() -> None:
636636
*[ctx_wrapper.context.close() for ctx_wrapper in self.context_wrappers.values()]
637637
)
638638
logger.debug(
639-
"Browser %s disconnected (remote=%s, restart=%s)",
639+
"Browser %s disconnected (remote=%s)",
640640
name,
641641
remote,
642-
self.config.restart_disconnected_browser,
643642
extra={"browser_name": name, "remote": remote},
644643
)
645644
if self.config.restart_disconnected_browser:

tests/__init__.py

+5-3
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import platform
55
from contextlib import asynccontextmanager
66
from functools import wraps
7+
from typing import Optional
78

89
from scrapy import Request
910
from scrapy.http.response.html import HtmlResponse
@@ -37,12 +38,13 @@ def allow_windows(test_method):
3738

3839

3940
@asynccontextmanager
40-
async def make_handler(settings_dict: dict):
41+
async def make_handler(settings_dict: Optional[dict] = None):
4142
"""Convenience function to obtain an initialized handler and close it gracefully"""
4243
from scrapy_playwright.handler import ScrapyPlaywrightDownloadHandler
4344

44-
settings_dict.setdefault("TELNETCONSOLE_ENABLED", False)
45-
crawler = get_crawler(settings_dict=settings_dict)
45+
settings: dict = settings_dict or {}
46+
settings.setdefault("TELNETCONSOLE_ENABLED", False)
47+
crawler = get_crawler(settings_dict=settings)
4648
handler = ScrapyPlaywrightDownloadHandler(crawler=crawler)
4749
try:
4850
await handler._launch()

tests/tests_asyncio/test_browser.py

+45
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
import pytest
1414
from playwright.async_api import async_playwright
1515
from scrapy import Request, Spider
16+
from scrapy.http import Response
1617

1718
from tests import allow_windows, make_handler, assert_correct_response
1819
from tests.mockserver import StaticMockServer
@@ -128,3 +129,47 @@ async def test_connect(self):
128129
logging.WARNING,
129130
"Connecting to remote browser, ignoring PLAYWRIGHT_LAUNCH_OPTIONS",
130131
) in self._caplog.record_tuples
132+
133+
134+
class TestBrowserReconnect(IsolatedAsyncioTestCase):
135+
@pytest.fixture(autouse=True)
136+
def inject_fixtures(self, caplog):
137+
caplog.set_level(logging.DEBUG)
138+
self._caplog = caplog
139+
140+
@allow_windows
141+
async def test_restart_browser(self):
142+
spider = Spider("foo")
143+
async with make_handler() as handler:
144+
with StaticMockServer() as server:
145+
req1 = Request(
146+
server.urljoin("/index.html"),
147+
meta={"playwright": True, "playwright_include_page": True},
148+
)
149+
resp1 = await handler._download_request(req1, spider)
150+
page = resp1.meta["playwright_page"]
151+
await page.context.browser.close()
152+
req2 = Request(server.urljoin("/gallery.html"), meta={"playwright": True})
153+
resp2 = await handler._download_request(req2, spider)
154+
assert_correct_response(resp1, req1)
155+
assert_correct_response(resp2, req2)
156+
assert (
157+
self._caplog.record_tuples.count(
158+
(
159+
"scrapy-playwright",
160+
logging.DEBUG,
161+
"Browser chromium disconnected (remote=False)",
162+
)
163+
)
164+
== 2 # one mid-crawl after calling Browser.close() manually, one at the end
165+
)
166+
assert (
167+
self._caplog.record_tuples.count(
168+
(
169+
"scrapy-playwright",
170+
logging.INFO,
171+
"Launching browser chromium",
172+
)
173+
)
174+
== 2 # one at the beginning, one after calling Browser.close() manually
175+
)

0 commit comments

Comments
 (0)