示例#1
0
    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)