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__':