# BasePage - Документация тестов eNODE-Мониторинг

Skip to content

# BasePage

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

Класс BasePage предоставляет общие методы для взаимодействия со страницами через Playwright и выполнения API-запросов.

## `BasePage`

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

Содержит общие методы для: - Навигации по страницам - Выполнения API-запросов - Проверок состояния страницы

Source code in `pages\base_page.py`

     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
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153

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

        Содержит общие методы для:
        - Навигации по страницам
        - Выполнения API-запросов
        - Проверок состояния страницы
        """

        def __init__(self, page: Page) -> None:
            """Инициализирует базовую страницу.

            Args:
                page: Экземпляр страницы Playwright
            """

            self.page = page

        # Действия:
        def current_url(self) -> str:
            """Возвращает текущий URL страницы."""

            return self.page.url

        def open(self, uri: str) -> Optional[Response]:
            """Открывает указанный URI на базовом URL."""

            return self.page.goto(f"{host.get_base_url()}{uri}", wait_until='domcontentloaded')

        def page_reload(self) -> None:
            """Перезагружает текущую страницу."""

            self.page.reload()

        def wait_for_timeout(self, timeout: int) -> None:
            """Ожидает указанное количество миллисекунд."""

            self.page.wait_for_timeout(timeout)

        def get_api_request_context(self) -> APIRequestContext:
            """Возвращает контекст для выполнения API-запросов."""

            return self.page.context.request

        def send_get_api_request(self, uri: str) -> Response:
            """Отправляет GET-запрос к API.

            Args:
                uri: URI для запроса
            """

            api_request_context = self.get_api_request_context()
            token = host.get_access_token()
            headers = {"Accept": "application/json", "Authorization": f"Bearer {token}"}
            response = api_request_context.get(
                f"{host.get_request_url()}{uri}",
                headers=headers
            )
            return response

        def send_post_api_request(self, uri: str, payload: Dict[str, Any]) -> Response:
            """Отправляет POST-запрос к API.

            Args:
                uri: URI для запроса
                payload: Тело запроса
            """

            api_request_context = self.get_api_request_context()
            token = host.get_access_token()
            headers = {"Accept": "application/json", "Authorization": f"Bearer {token}"}
            response = api_request_context.post(
                f"{host.get_request_url()}{uri}",
                headers=headers,
                data=payload
            )
            return response

        def get_response_body(self, response: Response) -> Optional[Dict[str, Any]]:
            """Возвращает тело ответа в формате JSON.

            Args:
                response: Объект ответа
            """

            try:
                response_body = response.json()
            except json.JSONDecodeError:
                logger.error("Failed to decode JSON response")
                return None
            return response_body

        # Проверки:
        def check_URL(self, uri: str, msg: str) -> None:
            """Проверяет соответствие текущего URL ожидаемому.

            Args:
                uri: Ожидаемый URI
                msg: Сообщение об ошибке
            """

            expect(self.page).to_have_url(
                f"{host.get_base_url()}{uri}",
                timeout=60000
            ), msg

        def check_equals(self, actual: Any, expected: Any, msg: str) -> None:
            """Проверяет равенство фактического и ожидаемого значений.

            Args:
                actual: Фактическое значение
                expected: Ожидаемое значение
                msg: Сообщение об ошибке
            """

            assert actual == expected, msg

        def check_lists_equals(self, actual: List[Any], expected: List[Any], msg: str) -> None:
            """Рекурсивно проверяет равенство двух списков.

            Args:
                actual: Фактический список
                expected: Ожидаемый список
                msg: Сообщение об ошибке
            """

            def compare_lists(list1: List[Any], list2: List[Any]) -> bool:
                if len(list1) != len(list2):
                    return False
                for item1, item2 in zip(list1, list2):
                    if isinstance(item1, list) and isinstance(item2, list):
                        if not compare_lists(item1, item2):
                            return False
                    elif item1 != item2:
                        return False
                return True

            assert compare_lists(actual, expected), msg

### `__init__(page)`

Инициализирует базовую страницу.

Parameters:

Name | Type | Description | Default
--- | --- | --- | ---
`page` | `Page` | Экземпляр страницы Playwright | required

Source code in `pages\base_page.py`

    25
    26
    27
    28
    29
    30
    31
    32

    def __init__(self, page: Page) -> None:
        """Инициализирует базовую страницу.

        Args:
            page: Экземпляр страницы Playwright
        """

        self.page = page

### `check_URL(uri, msg)`

Проверяет соответствие текущего URL ожидаемому.

Parameters:

Name | Type | Description | Default
--- | --- | --- | ---
`uri` | `str` | Ожидаемый URI | required
`msg` | `str` | Сообщение об ошибке | required

Source code in `pages\base_page.py`

    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120

    def check_URL(self, uri: str, msg: str) -> None:
        """Проверяет соответствие текущего URL ожидаемому.

        Args:
            uri: Ожидаемый URI
            msg: Сообщение об ошибке
        """

        expect(self.page).to_have_url(
            f"{host.get_base_url()}{uri}",
            timeout=60000
        ), msg

### `check_equals(actual, expected, msg)`

Проверяет равенство фактического и ожидаемого значений.

Parameters:

Name | Type | Description | Default
--- | --- | --- | ---
`actual` | `Any` | Фактическое значение | required
`expected` | `Any` | Ожидаемое значение | required
`msg` | `str` | Сообщение об ошибке | required

Source code in `pages\base_page.py`

    122
    123
    124
    125
    126
    127
    128
    129
    130
    131

    def check_equals(self, actual: Any, expected: Any, msg: str) -> None:
        """Проверяет равенство фактического и ожидаемого значений.

        Args:
            actual: Фактическое значение
            expected: Ожидаемое значение
            msg: Сообщение об ошибке
        """

        assert actual == expected, msg

### `check_lists_equals(actual, expected, msg)`

Рекурсивно проверяет равенство двух списков.

Parameters:

Name | Type | Description | Default
--- | --- | --- | ---
`actual` | `List[Any]` | Фактический список | required
`expected` | `List[Any]` | Ожидаемый список | required
`msg` | `str` | Сообщение об ошибке | required

Source code in `pages\base_page.py`

    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153

    def check_lists_equals(self, actual: List[Any], expected: List[Any], msg: str) -> None:
        """Рекурсивно проверяет равенство двух списков.

        Args:
            actual: Фактический список
            expected: Ожидаемый список
            msg: Сообщение об ошибке
        """

        def compare_lists(list1: List[Any], list2: List[Any]) -> bool:
            if len(list1) != len(list2):
                return False
            for item1, item2 in zip(list1, list2):
                if isinstance(item1, list) and isinstance(item2, list):
                    if not compare_lists(item1, item2):
                        return False
                elif item1 != item2:
                    return False
            return True

        assert compare_lists(actual, expected), msg

### `current_url()`

Возвращает текущий URL страницы.

Source code in `pages\base_page.py`

    35
    36
    37
    38

    def current_url(self) -> str:
        """Возвращает текущий URL страницы."""

        return self.page.url

### `get_api_request_context()`

Возвращает контекст для выполнения API-запросов.

Source code in `pages\base_page.py`

    55
    56
    57
    58

    def get_api_request_context(self) -> APIRequestContext:
        """Возвращает контекст для выполнения API-запросов."""

        return self.page.context.request

### `get_response_body(response)`

Возвращает тело ответа в формате JSON.

Parameters:

Name | Type | Description | Default
--- | --- | --- | ---
`response` | `Response` | Объект ответа | required

Source code in `pages\base_page.py`

     94
     95
     96
     97
     98
     99
    100
    101
    102
    103
    104
    105
    106

    def get_response_body(self, response: Response) -> Optional[Dict[str, Any]]:
        """Возвращает тело ответа в формате JSON.

        Args:
            response: Объект ответа
        """

        try:
            response_body = response.json()
        except json.JSONDecodeError:
            logger.error("Failed to decode JSON response")
            return None
        return response_body

### `open(uri)`

Открывает указанный URI на базовом URL.

Source code in `pages\base_page.py`

    40
    41
    42
    43

    def open(self, uri: str) -> Optional[Response]:
        """Открывает указанный URI на базовом URL."""

        return self.page.goto(f"{host.get_base_url()}{uri}", wait_until='domcontentloaded')

### `page_reload()`

Перезагружает текущую страницу.

Source code in `pages\base_page.py`

    45
    46
    47
    48

    def page_reload(self) -> None:
        """Перезагружает текущую страницу."""

        self.page.reload()

### `send_get_api_request(uri)`

Отправляет GET-запрос к API.

Parameters:

Name | Type | Description | Default
--- | --- | --- | ---
`uri` | `str` | URI для запроса | required

Source code in `pages\base_page.py`

    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74

    def send_get_api_request(self, uri: str) -> Response:
        """Отправляет GET-запрос к API.

        Args:
            uri: URI для запроса
        """

        api_request_context = self.get_api_request_context()
        token = host.get_access_token()
        headers = {"Accept": "application/json", "Authorization": f"Bearer {token}"}
        response = api_request_context.get(
            f"{host.get_request_url()}{uri}",
            headers=headers
        )
        return response

### `send_post_api_request(uri, payload)`

Отправляет POST-запрос к API.

Parameters:

Name | Type | Description | Default
--- | --- | --- | ---
`uri` | `str` | URI для запроса | required
`payload` | `Dict[str, Any]` | Тело запроса | required

Source code in `pages\base_page.py`

    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92

    def send_post_api_request(self, uri: str, payload: Dict[str, Any]) -> Response:
        """Отправляет POST-запрос к API.

        Args:
            uri: URI для запроса
            payload: Тело запроса
        """

        api_request_context = self.get_api_request_context()
        token = host.get_access_token()
        headers = {"Accept": "application/json", "Authorization": f"Bearer {token}"}
        response = api_request_context.post(
            f"{host.get_request_url()}{uri}",
            headers=headers,
            data=payload
        )
        return response

### `wait_for_timeout(timeout)`

Ожидает указанное количество миллисекунд.

Source code in `pages\base_page.py`

    50
    51
    52
    53

    def wait_for_timeout(self, timeout: int) -> None:
        """Ожидает указанное количество миллисекунд."""

        self.page.wait_for_timeout(timeout)