示例#1
0
    def __init__(self, **kwargs):
        """
        :param firefox_profile:
        :param firefox_binary:
        :param timeout:
        :param capabilities:
        :param proxy:
        :param raise_exception:
        :param invisible:
        :return:
        """
        self.display = None
        self.visible = kwargs.get('visible', True)
        if not self.visible:
            self.display = Display(visible=self.visible)
            self.display.start()

        # important  - deal with that!
        # nose.proxy.TypeError: __init__() got an unexpected keyword argument 'visible'
        parameters = {k:v for k,v in kwargs.items() if k not in self._additional_parameters}
        if six.PY3:
            super().__init__(**parameters)
        else:
            super(SunnyWebdriverMixin, self).__init__(**parameters)
        self.raise_exception = kwargs.get('raise_exception', False)
示例#2
0
class SunnyWebdriverMixin(object):
    """

    """
    _additional_parameters = ('visible',
                              'raise_exception')

    def __init__(self, **kwargs):
        """
        :param firefox_profile:
        :param firefox_binary:
        :param timeout:
        :param capabilities:
        :param proxy:
        :param raise_exception:
        :param invisible:
        :return:
        """
        self.display = None
        self.visible = kwargs.get('visible', True)
        if not self.visible:
            self.display = Display(visible=self.visible)
            self.display.start()

        # important  - deal with that!
        # nose.proxy.TypeError: __init__() got an unexpected keyword argument 'visible'
        parameters = {k:v for k,v in kwargs.items() if k not in self._additional_parameters}
        if six.PY3:
            super().__init__(**parameters)
        else:
            super(SunnyWebdriverMixin, self).__init__(**parameters)
        self.raise_exception = kwargs.get('raise_exception', False)

    def __enter__(self):
        return self

    def __exit__(self, exc_type, exc_val, exc_tb):
        if six.PY3:
            super().quit()
        else:
            super(SunnyWebdriverMixin, self).quit()
        if self.display:
            self.display.stop()

    def __repr__(self):
        s = '<sunshine $name object at "$website">'
        template = string.Template(s)
        settings = {'name':self.name, 'website':self.current_url}
        return template.substitute(settings)

    def quit(self):
        if six.PY3:
            super().quit()
        else:
            super(SunnyWebdriverMixin, self).quit()

        if self.display:
            self.display.stop()

    def get(self, url):
        """
        Go to a website
        :param url: The URL of the website

        Usage::

            >>> from sunshine import webdriver
            >>> browser = webdriver.Firefox(visible=False)
            >>> browser.get('github.com')
            >>> browser.quit()
        """
        if not url.startswith('http://'):
            url = 'http://' + url

        if six.PY3:
            super().get(url)
        else:
            super(SunnyWebdriverMixin, self).get(url)

    def __find_element(self, selector, wait):

        if six.PY3:
            super_obj = super()
        else:
            super_obj = super(SunnyWebdriverMixin, self)

        try:
            waiter_obj = WebDriverWait(super_obj, wait)
            condition = EC.presence_of_element_located(selector)
            element = waiter_obj.until(condition)
            found_element = WebElement(parent=element.parent, id_=element.id)
        except TimeoutException as error:
            if self.raise_exception:
                raise TimeoutException(error.msg)
            found_element = None
        return found_element

    def find_element_by_id(self, _id, wait=5):
        """
        Search and find an element by id.
        :param _id:
        :param wait: Time to wait before stopping (default: 10 seconds)
        :return: the found element

        Usage::

            >>> from sunshine import webdriver
            >>> browser = webdriver.Firefox(visible=False)
            >>> browser.get('github.com')
            >>> element = browser.find_element_by_id('start-of-content')
            >>> browser.quit()
        """
        selector = (By.ID, _id)
        return self.__find_element(selector, wait=wait)

    def find_element_by_class_name(self, name, wait=5):
        """

        :param class_name:
        :param wait:
        :return:
        """
        selector = (By.CLASS_NAME, name)
        return self.__find_element(selector, wait=wait)

    def find_element_by_css_selector(self, css_selector, wait=5):
        """

        :param css_selector:
        :param wait:
        :return:
        """
        selector = (By.CSS_SELECTOR, css_selector)
        return self.__find_element(selector, wait=wait)

    def find_element_by_link_text(self, link_text, wait=5):
        """

        :param link_text:
        :param wait:
        :return:
        """
        selector = (By.LINK_TEXT, link_text)
        return self.__find_element(selector, wait=wait)

    def find_element_by_name(self, name, wait=5):
        """

        :param name:
        :param wait:
        :return:
        """
        selector = (By.NAME, name)
        return self.__find_element(selector, wait=wait)

    def find_element_by_partial_link_text(self, link_text, wait=5):
        """

        :param link_text:
        :param wait:
        :return:
        """
        selector = (By.LINK_TEXT, link_text)
        return self.__find_element(selector, wait=wait)

    def find_element_by_tag_name(self, tag_name, wait=5):
        """

        :param tag_name:
        :param wait:
        :return:
        """
        selector = (By.TAG_NAME, tag_name)
        return self.__find_element(selector, wait=wait)

    def find_element_by_xpath(self, xpath, wait=5):
        """

        :param xpath:
        :param wait:
        :return:
        """
        selector = (By.XPATH, xpath)
        return self.__find_element(selector, wait=wait)