Ejemplo n.º 1
0
    def __new__(mcs, class_name, bases, attrs):
        """
        Args:
            class_name (str): the name of the class being created
            bases (list of class): the parents of the class being created
            attrs (str => obj dict): the attributes as defined in the class
                definition

        Returns:
            A new class
        """
        new_attrs = {}
        all_attrs = get_parents_classes_attrs(bases)
        all_attrs.update(attrs)

        page_conf: Optional[PageConfig] = all_attrs.get('page_conf')
        if not page_conf or not isinstance(page_conf, PageConfig):
            raise BasePageException('Page object must have "page_conf" attribute which inherit from PageConfig')

        new_attrs['_base_url'] = page_conf.base_url

        page_url = all_attrs.pop('page_url', None)
        if page_url is None:
            raise BasePageException(f'Page object must have "page_url" attribute')
        new_attrs['page_url'] = urljoin(page_conf.base_url, page_url)

        valid_urls = all_attrs.pop('valid_urls', [])
        valid_urls.append(page_url)
        new_attrs['valid_urls'] = [urljoin(page_conf.base_url, url) for url in valid_urls]

        all_attrs.update(new_attrs)

        new_class = type.__new__(mcs, class_name, bases, all_attrs)

        return new_class
Ejemplo n.º 2
0
 def __init__(self, page, by, value, target_object, attr_name=None):
     # пропускает __init__ метод класса WebElement, т.к. данный класс является проксирующим
     if isinstance(target_object, WebElementProxy):
         raise BasePageException('target_object already is instance WebElementProxy')
     object.__setattr__(self, 'page', page)
     object.__setattr__(self, '_obj', target_object)
     object.__setattr__(self, 'locator', (by, value))
     object.__setattr__(self, 'attr_name', attr_name)
Ejemplo n.º 3
0
 def __getattr__(self, item):
     # вся магия происходит здесь
     # навигационный объект прокидывает все вызовы в связанную страницу,
     # если вызван атрибут, которого навигационный компонент не имеет
     if self.page:
         return getattr(self.page, item)
     raise BasePageException(
         f'{self.__class__.__name__} not initialized from Page object')
Ejemplo n.º 4
0
 def get_by_index(self, *numbers) -> WebElementProxy:
     """
     Получить элемент по его порядковому номеру на отрисованной странице. Является интерфейсом к
     get-методу, который ограничивает numbers только типом int
     :param numbers:
     :return:
     """
     if not all([isinstance(num, int) for num in numbers]):
         raise BasePageException('all of parameters must be int')
     return self.get(*numbers)
Ejemplo n.º 5
0
    def _make_attr_name(self, args):
        params = list(map(str, args))
        if len(params) != len(self.base_name_parts):
            raise BasePageException(f'You pass to get method only {len(params)} params '
                                    f'but required {len(self.base_name_parts)}')

        indexed_names = []
        for val in zip(self.base_name_parts, params):
            indexed_names.append('_'.join(val))

        return '_'.join(indexed_names)
Ejemplo n.º 6
0
 def wait_accessibility_of(self, element_descriptor: Union[ElementDescriptor, WebElementProxy, Table],
                           timeout: int = None, frequency: float = 0.2) -> None:
     """
     Ждет пока элемент появится на странице
     :param element_descriptor:  дескриптор элемента
     :param timeout: максимальное время ожидания (в секундах)
     :param frequency: частота опросов (в секундах)
     :return:
     """
     if not isinstance(element_descriptor, (ElementDescriptor, Table)):
         raise BasePageException('It wait only Element Descriptor instance objects')
     search_pattern = (element_descriptor.search_by, element_descriptor.value)
     self.custom_wait(timeout, frequency).until(EC.visibility_of_element_located(search_pattern))
Ejemplo n.º 7
0
    def __init__(self, base_name_parts: List[str], many: bool = False, tag_attr_name: str = DATA_E2E_ATTRIBUTE_NAME,
                 context=None):
        """

        :param base_name_parts: список из общих частей значения атрибута, объединяемых элемнтов
        :param many: флаг, что по полному значению атрибута будет найдено несколько элементов
        :param tag_attr_name: имя атрибута, по значению которого группируются элементы
        :param context:
        """
        if not isinstance(base_name_parts, list):
            raise BasePageException('base_name_parts must be list of string')
        self.base_name_parts = [name.strip('_') for name in base_name_parts]
        self.many = many
        self.tag_attr_name = tag_attr_name
        self.page = context
Ejemplo n.º 8
0
    def reload_element(self, el: Union[WebElementProxy, List[WebElementProxy]]) -> Union[WebElementProxy,
                                                                                         List[WebElementProxy]]:
        """
        Перегрузить элемент, если есть предположение, что он пропал из сессии
        :el: элемент, который надо перегрузить
        :return:
        """
        many = False
        if isinstance(el, list):
            el = el[0]
            many = True
        if not isinstance(el, WebElementProxy):
            raise BasePageException('Element must be instance of WebElementProxy')

        if el.attr_name:
            self._cached_attrs.pop(el.attr_name, None)

        return self.find_elements(*el.locator) if many else self.find_element(*el.locator)
Ejemplo n.º 9
0
 def wait_page_loaded(self) -> None:
     try:
         if self.page_conf.has_page_ready_script:
             self.wait.until(check_js_condition_is_true(PAGE_READY_SCRIPT))
     except TimeoutException:
         raise BasePageException('Check that "e2eReady" attribute set by frontend on the current page.')
Ejemplo n.º 10
0
 def __getitem__(self, item: int):
     if not isinstance(item, int):
         raise BasePageException('ListOfElementDescriptor support only number access to attributes')
     return self.get(item)
Ejemplo n.º 11
0
 def _validate_params(self):
     if not self.search_by or not self.value:
         raise BasePageException('[value, search_by] param must be passed to ElementDescriptor')
Ejemplo n.º 12
0
 def _find_elements(self, by=By.ID, value=None) -> List[WebElement]:
     elements = self._driver.find_elements(by, value)
     if not elements:
         raise BasePageException(f'Elements not found by {by} value: "{value}"')
     return elements
Ejemplo n.º 13
0
 def _find_element(self, by=By.ID, value=None) -> WebElement:
     element = self._driver.find_element(by, value)
     if not element:
         raise BasePageException(f'Element not found by {by} value: "{value}"')
     return element