Skip to content

Commit

Permalink
Test browser restart
Browse files Browse the repository at this point in the history
  • Loading branch information
elacuesta committed Jul 7, 2024
1 parent e31bee0 commit 084daca
Show file tree
Hide file tree
Showing 3 changed files with 51 additions and 5 deletions.
3 changes: 1 addition & 2 deletions scrapy_playwright/handler.py
Original file line number Diff line number Diff line change
Expand Up @@ -636,10 +636,9 @@ async def browser_disconnected_callback() -> None:
*[ctx_wrapper.context.close() for ctx_wrapper in self.context_wrappers.values()]
)
logger.debug(
"Browser %s disconnected (remote=%s, restart=%s)",
"Browser %s disconnected (remote=%s)",
name,
remote,
self.config.restart_disconnected_browser,
extra={"browser_name": name, "remote": remote},
)
if self.config.restart_disconnected_browser:
Expand Down
8 changes: 5 additions & 3 deletions tests/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
import platform
from contextlib import asynccontextmanager
from functools import wraps
from typing import Optional

from scrapy import Request
from scrapy.http.response.html import HtmlResponse
Expand Down Expand Up @@ -37,12 +38,13 @@ def allow_windows(test_method):


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

settings_dict.setdefault("TELNETCONSOLE_ENABLED", False)
crawler = get_crawler(settings_dict=settings_dict)
settings: dict = settings_dict or {}
settings.setdefault("TELNETCONSOLE_ENABLED", False)
crawler = get_crawler(settings_dict=settings)
handler = ScrapyPlaywrightDownloadHandler(crawler=crawler)
try:
await handler._launch()
Expand Down
45 changes: 45 additions & 0 deletions tests/tests_asyncio/test_browser.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
import pytest
from playwright.async_api import async_playwright
from scrapy import Request, Spider
from scrapy.http import Response

from tests import allow_windows, make_handler, assert_correct_response
from tests.mockserver import StaticMockServer
Expand Down Expand Up @@ -128,3 +129,47 @@ async def test_connect(self):
logging.WARNING,
"Connecting to remote browser, ignoring PLAYWRIGHT_LAUNCH_OPTIONS",
) in self._caplog.record_tuples


class TestBrowserReconnect(IsolatedAsyncioTestCase):
@pytest.fixture(autouse=True)
def inject_fixtures(self, caplog):
caplog.set_level(logging.DEBUG)
self._caplog = caplog

@allow_windows
async def test_restart_browser(self):
spider = Spider("foo")
async with make_handler() as handler:
with StaticMockServer() as server:
req1 = Request(
server.urljoin("/index.html"),
meta={"playwright": True, "playwright_include_page": True},
)
resp1 = await handler._download_request(req1, spider)
page = resp1.meta["playwright_page"]
await page.context.browser.close()
req2 = Request(server.urljoin("/gallery.html"), meta={"playwright": True})
resp2 = await handler._download_request(req2, spider)
assert_correct_response(resp1, req1)
assert_correct_response(resp2, req2)
assert (
self._caplog.record_tuples.count(
(
"scrapy-playwright",
logging.DEBUG,
"Browser chromium disconnected (remote=False)",
)
)
== 2 # one mid-crawl after calling Browser.close() manually, one at the end
)
assert (
self._caplog.record_tuples.count(
(
"scrapy-playwright",
logging.INFO,
"Launching browser chromium",
)
)
== 2 # one at the beginning, one after calling Browser.close() manually
)

0 comments on commit 084daca

Please sign in to comment.