Esempio n. 1
0
class HTMLElement(object):

    _label = None
    _click_phrase = _LOG_PHRASES['default_click']
    _set_phrase = _LOG_PHRASES['default_set']
    _locator = None
    _wait = None
    _timeout = 60
    _driver = None
    _element = None
    _expected_condition = 'visible'
    _ec = _EXPECTED_COND_MAP

    def __init__(self, **kwargs):
        
        if not kwargs:
            raise ValueError('Specify a locator.')

        for key, value in list(kwargs.items()):
            if key in _LOCATOR_MAP:
                self._locator = (_LOCATOR_MAP[key], value)
            elif key in _USER_LOCATOR_MAP:
                self._locator = (By.XPATH, _USER_LOCATOR_MAP[key].format(value))
            elif key == 'expected_condition':
                self._expected_condition = value
                if value not in self._ec:
                    raise ValueError('Incorrect expected condition %s' % value)
            elif key == 'label':
                self._label = value
            elif key == 'timeout':
                self._timeout = value
                if value < 0:
                    raise ValueError('%s is a wrong value for timeout.' % value)
            else:
                raise ValueError('Incorrect input: %s' % key)

        if self._locator is None:
            raise ValueError('Specify a locator.')

    def __eq__(self, other):
        return self.text() == str(other)

    def __ne__(self, other):
        return self.text() != str(other)

    def __get__(self, instance, owner):
        self._element = self._find(instance.driver)
        return self

    def __set__(self, instance, value):
        if value:
            element = self._find(instance.driver)
            value = str(value)
            if len(value) > 0:
                element.clear()
                element.send_keys(value)
                self._set_log(value)

    def _find(self, driver):

        self._driver = driver
        self._wait = Wait(self._driver, self._timeout)

        # waiting for loading elements
        for locator in _LOADING_LOCATORS:
            self._wait.element_disappear(locator)
        self._element = self._wait.element_appear(self._locator, msg="Didn't find element by %s: <%s>" % self._locator)
        return self._element

    def click(self):
        while True:
            try:
                self._element.click()
                break
            except SE.WebDriverException as e:
                if "Other element would receive the click" in e.msg:
                    self._driver.execute_script("window.scrollTo(0, 0);")
                else:
                    raise e
        self._click_log()

    def text(self):
        return self._element.text

    def _set_log(self, value):
        time = strftime("%H:%M:%S", localtime())
        if self._label:
            print("[%s] [%s] %s \"%s\"" % (time, self._label, self._set_phrase, value))

    def _click_log(self):
        time = strftime("%H:%M:%S", localtime())
        if self._label:
            print("[%s] [%s] %s" % (time, self._label, self._click_phrase))