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)