diff options
| author | Lars-Dominik Braun <lars@6xq.net> | 2017-12-06 19:37:53 +0100 | 
|---|---|---|
| committer | Lars-Dominik Braun <lars@6xq.net> | 2017-12-06 19:37:53 +0100 | 
| commit | f816319081d5253974ddb70b655d55f4a880a77a (patch) | |
| tree | 2188686ad3fd606f5bcab05fc8da271b6e106713 /crocoite/browser.py | |
| parent | 1b3710f9586acca56c8384afe60e51b5ae16fe36 (diff) | |
| download | crocoite-f816319081d5253974ddb70b655d55f4a880a77a.tar.gz crocoite-f816319081d5253974ddb70b655d55f4a880a77a.tar.bz2 crocoite-f816319081d5253974ddb70b655d55f4a880a77a.zip | |
Start Chrome browser instance
Unless --browser argument is given. Uses sane settings and a temporary
profile directory.
Diffstat (limited to 'crocoite/browser.py')
| -rw-r--r-- | crocoite/browser.py | 52 | 
1 files changed, 52 insertions, 0 deletions
| diff --git a/crocoite/browser.py b/crocoite/browser.py index e58fce8..765acbb 100644 --- a/crocoite/browser.py +++ b/crocoite/browser.py @@ -207,3 +207,55 @@ class SiteLoader:          self.logger.debug ('failed {} {}'.format (reqId, kwargs['errorText'], kwargs.get ('blockedReason')))          item = self.requests.pop (reqId, None) +import subprocess +from tempfile import mkdtemp +from contextlib import contextmanager +import socket, shutil + +@contextmanager +def ChromeService (binary='google-chrome-stable', host='localhost', port=9222, windowSize=(1920, 1080)): +    """ +    Start Chrome with socket activation (i.e. pass listening socket). Polling +    is not required with this method, since reads will block until Chrome is +    ready. +    """ +    s = socket.socket () +    s.setsockopt (socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) +    s.bind ((host, port)) +    s.listen (10) +    userDataDir = mkdtemp () +    args = [binary, +            '--window-size={},{}'.format (*windowSize), +            '--user-data-dir={}'.format (userDataDir), # use temporory user dir +            '--no-default-browser-check', +            '--no-first-run', # don’t show first run screen +            '--disable-breakpad', # no error reports +            '--disable-extensions', +            '--disable-infobars', +            '--disable-notifications', # no libnotify +            '--headless', +            '--disable-gpu', +            '--hide-scrollbars', # hide scrollbars on screenshots +            '--mute-audio', # don’t play any audio +            '--remote-debugging-socket-fd={}'.format (s.fileno ()), +            '--homepage=about:blank', +            'about:blank'] +    # start new session, so ^C does not affect subprocess +    p = subprocess.Popen (args, pass_fds=[s.fileno()], start_new_session=True, +            stdin=subprocess.DEVNULL, stdout=subprocess.DEVNULL, +            stderr=subprocess.DEVNULL) + +    # must be wrapped in try-finally, otherwise code in __exit__/finally is not +    # executed +    try: +        yield 'http://{}:{}'.format (host, port) +    finally: +        p.terminate () +        p.wait () +        shutil.rmtree (userDataDir) + +@contextmanager +def NullService (url): +    yield url + + | 
