summaryrefslogtreecommitdiff
path: root/crocoite/browser.py
diff options
context:
space:
mode:
authorLars-Dominik Braun <lars@6xq.net>2017-12-06 19:37:53 +0100
committerLars-Dominik Braun <lars@6xq.net>2017-12-06 19:37:53 +0100
commitf816319081d5253974ddb70b655d55f4a880a77a (patch)
tree2188686ad3fd606f5bcab05fc8da271b6e106713 /crocoite/browser.py
parent1b3710f9586acca56c8384afe60e51b5ae16fe36 (diff)
downloadcrocoite-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.py52
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
+
+