desktop.py (2745B)
1 # This Source Code Form is subject to the terms of the Mozilla Public 2 # License, v. 2.0. If a copy of the MPL was not distributed with this 3 # file, You can obtain one at http://mozilla.org/MPL/2.0/. 4 import os 5 import contextlib 6 7 import attr 8 from arsenic.services import Geckodriver, free_port, subprocess_based_service 9 10 from condprof.util import ( 11 BaseEnv, 12 latest_nightly, 13 logger, 14 get_version, 15 get_current_platform, 16 DEFAULT_PREFS, 17 ) 18 19 20 @attr.s 21 class DesktopGeckodriver(Geckodriver): 22 async def start(self): 23 port = free_port() 24 await self._check_version() 25 logger.info("Running Webdriver on port %d" % port) 26 logger.info("Running Marionette on port 2828") 27 pargs = [ 28 self.binary, 29 "--log", 30 "trace", 31 "--port", 32 str(port), 33 "--marionette-port", 34 "2828", 35 ] 36 try: 37 return await subprocess_based_service( 38 pargs, f"http://localhost:{port}", self.log_file 39 ) 40 except ProcessLookupError as e: 41 return await subprocess_based_service( 42 pargs.extend(["--host", "127.0.0.1"]), 43 f"http://localhost:{port}", 44 self.log_file, 45 ) 46 47 48 @contextlib.contextmanager 49 def dummy_device(*args, **kw): 50 yield None 51 52 53 class DesktopEnv(BaseEnv): 54 def get_target_platform(self): 55 return get_current_platform() 56 57 def get_device(self, *args, **kw): 58 return dummy_device(*args, **kw) 59 60 @contextlib.contextmanager 61 def get_browser(self): 62 with latest_nightly(self.firefox) as binary: 63 self.firefox = os.path.abspath(binary) 64 if not os.path.exists(self.firefox): 65 raise IOError(self.firefox) 66 yield 67 68 def get_browser_args(self, headless, prefs=None): 69 final_prefs = dict(DEFAULT_PREFS) 70 if prefs is not None: 71 final_prefs.update(prefs) 72 options = ["--allow-downgrade", "-profile", self.profile] 73 if headless: 74 options.append("-headless") 75 args = {"moz:firefoxOptions": {"args": options}} 76 if self.firefox is not None: 77 args["moz:firefoxOptions"]["binary"] = self.firefox 78 args["moz:firefoxOptions"]["prefs"] = final_prefs 79 args["moz:firefoxOptions"]["log"] = {"level": "trace"} 80 return args 81 82 def get_browser_version(self): 83 try: 84 return get_version(self.firefox) 85 except Exception: 86 logger.error("Could not get Firefox version", exc_info=True) 87 return "unknown" 88 89 def get_geckodriver(self, log_file): 90 return DesktopGeckodriver(binary=self.geckodriver, log_file=log_file)