Skip to content

# BaseElement

Модуль base_element содержит базовый класс для работы с элементами страницы.

Класс BaseElement предоставляет основные методы взаимодействия с элементами и их проверки через Playwright.

## `BaseElement`

Базовый класс для работы с элементами страницы через Playwright.

Предоставляет основные методы взаимодействия с элементами: клики, получение текста, ожидание и проверки состояния.

Source code in `elements\base_element.py`

     12
     13
     14
     15
     16
     17
     18
     19
     20
     21
     22
     23
     24
     25
     26
     27
     28
     29
     30
     31
     32
     33
     34
     35
     36
     37
     38
     39
     40
     41
     42
     43
     44
     45
     46
     47
     48
     49
     50
     51
     52
     53
     54
     55
     56
     57
     58
     59
     60
     61
     62
     63
     64
     65
     66
     67
     68
     69
     70
     71
     72
     73
     74
     75
     76
     77
     78
     79
     80
     81
     82
     83
     84
     85
     86
     87
     88
     89
     90
     91
     92
     93
     94
     95
     96
     97
     98
     99
    100
    101
    102
    class BaseElement:
        """Базовый класс для работы с элементами страницы через Playwright.

        Предоставляет основные методы взаимодействия с элементами:
        клики, получение текста, ожидание и проверки состояния.
        """

        def __init__(self, page: Page, locator: str | Locator, name: str) -> None:
            """Инициализирует базовый элемент страницы.

            Args:
                page: Экземпляр страницы Playwright
                locator: Локатор элемента (строка или объект Locator)
                name: Имя элемента для логирования
            """

            self.page = page
            self.name = name
            self.locator: Locator

            if isinstance(locator, Locator):
                self.locator = locator
            elif isinstance(locator, str):
                self.locator = self.page.locator(locator)
            else:
                raise TypeError("locator value should be string type or Locator type")

        @property
        def type_of(self) -> str:
            """Возвращает тип элемента (для логирования)."""

            return "base element"

        # Действия:
        def click(self) -> None:
            """Выполняет клик по элементу."""

            logger.info(f"Clicking {self.type_of} '{self.name}'")
            self.locator.click()

        def get_text(self, index: int) -> str:
            """Возвращает текст элемента по указанному индексу."""

            logger.info(f"Get text for {self.type_of} '{self.name}'")
            return self.locator.nth(index).text_content()

        def update_locator(self, new_locator: Locator) -> None:
            """Меняет значение локатора для элемента"""

            logger.info(f"Update locator for {self.type_of} '{self.name}'")
            self.locator = new_locator

        def wait_for_element(self, timeout: int = 12000) -> None:
            """Ожидает появление элемента в течение заданного времени."""

            logger.info(f"Wait for {self.type_of} '{self.name}'")
            self.locator.wait_for(timeout=timeout)

        # Проверки:
        def check_have_text(self, text: str, msg: str) -> None:
            """Проверяет наличие указанного текста в элементе."""

            logger.info(f"Check that {self.type_of} '{self.name}' has text '{text}'")
            expect(self.locator).to_have_text(text), msg

        def check_visibility(self, msg: str) -> None:
            """Проверяет видимость элемента на странице."""

            logger.info(f"Check that {self.type_of} '{self.name}' is present")
            print(self.locator)
            expect(self.locator).to_be_visible(visible=True, timeout=12000), msg

        def is_present(self, timeout: int = 5000) -> bool:
            """Проверяет наличие элемента в течение заданного времени."""

            logger.info(f"Check that {self.type_of} '{self.name}' is present")
            try:
                self.locator.wait_for(timeout=timeout)
            except TimeoutError:
                return False
            return True

        def is_not_present(self, timeout: int = 5000) -> bool:
            """Проверяет отсутствие элемента в течение заданного времени."""

            logger.info(f"Check that {self.type_of} '{self.name}' is missing")
            try:
                self.locator.wait_for(timeout=timeout)
            except TimeoutError:
                return True
            return False

### `type_of` `property`

Возвращает тип элемента (для логирования).

### `__init__(page, locator, name)`

Инициализирует базовый элемент страницы.

Parameters:

Name | Type | Description | Default
--- | --- | --- | ---
`page` | `Page` | Экземпляр страницы Playwright | required
`locator` | `str | Locator` | Локатор элемента (строка или объект Locator) | required
`name` | `str` | Имя элемента для логирования | required

Source code in `elements\base_element.py`

    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    def __init__(self, page: Page, locator: str | Locator, name: str) -> None:
        """Инициализирует базовый элемент страницы.

        Args:
            page: Экземпляр страницы Playwright
            locator: Локатор элемента (строка или объект Locator)
            name: Имя элемента для логирования
        """

        self.page = page
        self.name = name
        self.locator: Locator

        if isinstance(locator, Locator):
            self.locator = locator
        elif isinstance(locator, str):
            self.locator = self.page.locator(locator)
        else:
            raise TypeError("locator value should be string type or Locator type")

### `check_have_text(text, msg)`

Проверяет наличие указанного текста в элементе.

Source code in `elements\base_element.py`

    71
    72
    73
    74
    75
    def check_have_text(self, text: str, msg: str) -> None:
        """Проверяет наличие указанного текста в элементе."""

        logger.info(f"Check that {self.type_of} '{self.name}' has text '{text}'")
        expect(self.locator).to_have_text(text), msg

### `check_visibility(msg)`

Проверяет видимость элемента на странице.

Source code in `elements\base_element.py`

    77
    78
    79
    80
    81
    82
    def check_visibility(self, msg: str) -> None:
        """Проверяет видимость элемента на странице."""

        logger.info(f"Check that {self.type_of} '{self.name}' is present")
        print(self.locator)
        expect(self.locator).to_be_visible(visible=True, timeout=12000), msg

### `click()`

Выполняет клик по элементу.

Source code in `elements\base_element.py`

    46
    47
    48
    49
    50
    def click(self) -> None:
        """Выполняет клик по элементу."""

        logger.info(f"Clicking {self.type_of} '{self.name}'")
        self.locator.click()

### `get_text(index)`

Возвращает текст элемента по указанному индексу.

Source code in `elements\base_element.py`

    52
    53
    54
    55
    56
    def get_text(self, index: int) -> str:
        """Возвращает текст элемента по указанному индексу."""

        logger.info(f"Get text for {self.type_of} '{self.name}'")
        return self.locator.nth(index).text_content()

### `is_not_present(timeout=5000)`

Проверяет отсутствие элемента в течение заданного времени.

Source code in `elements\base_element.py`

     94
     95
     96
     97
     98
     99
    100
    101
    102
    def is_not_present(self, timeout: int = 5000) -> bool:
        """Проверяет отсутствие элемента в течение заданного времени."""

        logger.info(f"Check that {self.type_of} '{self.name}' is missing")
        try:
            self.locator.wait_for(timeout=timeout)
        except TimeoutError:
            return True
        return False

### `is_present(timeout=5000)`

Проверяет наличие элемента в течение заданного времени.

Source code in `elements\base_element.py`

    84
    85
    86
    87
    88
    89
    90
    91
    92
    def is_present(self, timeout: int = 5000) -> bool:
        """Проверяет наличие элемента в течение заданного времени."""

        logger.info(f"Check that {self.type_of} '{self.name}' is present")
        try:
            self.locator.wait_for(timeout=timeout)
        except TimeoutError:
            return False
        return True

### `update_locator(new_locator)`

Меняет значение локатора для элемента

Source code in `elements\base_element.py`

    58
    59
    60
    61
    62
    def update_locator(self, new_locator: Locator) -> None:
        """Меняет значение локатора для элемента"""

        logger.info(f"Update locator for {self.type_of} '{self.name}'")
        self.locator = new_locator

### `wait_for_element(timeout=12000)`

Ожидает появление элемента в течение заданного времени.

Source code in `elements\base_element.py`

    64
    65
    66
    67
    68
    def wait_for_element(self, timeout: int = 12000) -> None:
        """Ожидает появление элемента в течение заданного времени."""

        logger.info(f"Wait for {self.type_of} '{self.name}'")
        self.locator.wait_for(timeout=timeout)