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))