diff --git a/brozzler/browser.py b/brozzler/browser.py index aaff56e..585e8e9 100644 --- a/brozzler/browser.py +++ b/brozzler/browser.py @@ -34,6 +34,7 @@ from requests.structures import CaseInsensitiveDict import select import re import base64 +import psutil __all__ = ["BrowserPool", "Browser"] @@ -127,6 +128,7 @@ class Browser: def start(self, proxy=None): if not self._chrome_instance: # these can raise exceptions + self.chrome_port = self._find_available_port() self._work_dir = tempfile.TemporaryDirectory() self._chrome_instance = Chrome(port=self.chrome_port, executable=self.chrome_exe, @@ -151,6 +153,19 @@ class Browser: except: self.logger.error("problem stopping", exc_info=True) + def _find_available_port(self): + port_available = False + port = self.chrome_port + while not port_available: + for connection in psutil.net_connections(kind='tcp'): + if connection.laddr[1] == port: + self.logger.warn("Port already open %s", port) + port_available = False + port += 1 + break + port_available = True + return port + def is_running(self): return bool(self._websocket_url)