diff --git a/requests_html.py b/requests_html.py index 7c5db74..f6ab3f5 100644 --- a/requests_html.py +++ b/requests_html.py @@ -665,13 +665,15 @@ class HTMLSession(requests.Session): def browser(self): if not hasattr(self, "_browser"): self.loop = asyncio.get_event_loop() - - async def get_browser(): - return await pyppeteer.launch(headless=True, args=['--no-sandbox']) - - self._browser = self.loop.run_until_complete(get_browser()) + self._browser = self.loop.run_until_complete(pyppeteer.launch(headless=True, args=['--no-sandbox'])) return self._browser + def close(self): + """ If a browser was created close it first. """ + if hasattr(self, "_browser"): + self.loop.run_until_complete(self._browser.close()) + super().close() + class AsyncHTMLSession(requests.Session): """ An async consumable session. """ diff --git a/tests/test_requests_html.py b/tests/test_requests_html.py index 9a3291b..54d2ff9 100644 --- a/tests/test_requests_html.py +++ b/tests/test_requests_html.py @@ -2,6 +2,7 @@ import os from functools import partial import pytest +import psutil from pyppeteer.browser import Browser from requests_html import HTMLSession, AsyncHTMLSession, HTML from requests_file import FileAdapter @@ -29,6 +30,14 @@ def async_get(event_loop): return partial(async_session.get, url) +def count_chromium_process(): + process = 0 + for proc in psutil.process_iter(attrs=['name']): + if proc.info["name"] == "Chromium": + process += 1 + return process + + @pytest.mark.ok def test_file_get(): r = get() @@ -227,8 +236,15 @@ def test_bare_js_eval(): @pytest.mark.ok def test_browser_session(): + """ Test browser instaces is created and properly close when session is closed. + Note: session.close method need to be tested together with browser creation, + since no doing that will left the browser running. """ + session = HTMLSession() assert isinstance(session.browser, Browser) assert hasattr(session, "loop") == True + assert count_chromium_process() == 2 + session.close() + assert count_chromium_process() == 0 if __name__ == '__main__':