def __init__(self, browser, base_url, components, **env): """ Controller for managing components. :param browser: Webdriver for controller and components to reference. :type browser: webdriver :param base_url: Base url for navigations, will navigate to this url in init. :type base_url: string :param components: Component objects to instantiate. :type components: dict :param env: Key value pairs to pass to instantiated components. :type env: **kwargs => dict """ self.browser = self.__patch_webdriver(browser) self.js = E2EJS(browser) # pylint: disable=invalid-name self.base_url = base_url log_format = '%(asctime)s - %(name)s - %(funcName)s - %(levelname)s - %(message)s' if self._FILTER_SELENIUM_LOGS_: SeleniumLogger.propagate = False if self._FILTER_SELENIUM_LOG_STREAM_: for handler in SeleniumLogger.handlers: if isinstance(handler, logging.StreamHandler): SeleniumLogger.removeHandler(handler) logging.getLogger().setLevel(logging.DEBUG) logging.setLoggerClass(ControllerLogger) self.logger = logging.getLogger('pyscc') if self._LOG_TO_FILE_: if not os.path.exists('logs/'): os.makedirs('logs/') log_time = str(time.time()) # -- file logging for all logs bfh = logging.FileHandler('logs/{}.log'.format(log_time)) bfh.setFormatter(logging.Formatter(log_format)) logging.getLogger().addHandler(bfh) # -- file logging for pyscc logs pfh = logging.FileHandler( 'logs/{}_controller.log'.format(log_time)) pfh.setFormatter(logging.Formatter(log_format)) self.logger.addHandler(pfh) # -- file logging for pyscc logs sfh = logging.FileHandler('logs/{}_selenium.log'.format(log_time)) sfh.setFormatter(logging.Formatter(log_format)) SeleniumLogger.addHandler(sfh) if not isinstance(components, (tuple, list, dict)): raise TypeError( 'Components must be either a tuple, list, or dictionary') self.env = Resource(**env) if env else Resource() self.components = Resource( **{ name: component(controller=self) for name, component in iteritems(components) }) self.services = Resource() self.browser.get(self.base_url)