From a54358f900c8bf63cf462ca073047096310cc5bf Mon Sep 17 00:00:00 2001 From: Radislav Date: Tue, 22 Jul 2025 08:35:08 +0300 Subject: [PATCH] =?UTF-8?q?feat(base=5Fpage):=20=D0=B4=D0=BE=D0=B1=D0=B0?= =?UTF-8?q?=D0=B2=D0=BB=D0=B5=D0=BD=D1=8B=20=D0=B0=D0=BD=D0=BD=D0=BE=D1=82?= =?UTF-8?q?=D0=B0=D1=86=D0=B8=D0=B8=20=D1=82=D0=B8=D0=BF=D0=BE=D0=B2=20?= =?UTF-8?q?=D0=B4=D0=BB=D1=8F=20=D0=B1=D0=B0=D0=B7=D0=BE=D0=B2=D0=BE=D0=B9?= =?UTF-8?q?=20=D1=81=D1=82=D1=80=D0=B0=D0=BD=D0=B8=D1=86=D1=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Добавлены аннотации параметров: * uri: str в open(), send_get_api_request(), send_post_api_request(), check_URL() * timeout: int в wait_for_timeout() * payload: Dict[str, Any] в send_post_api_request() * response: Response в get_response_body() * msg: str в check_URL(), check_equals(), check_lists_equals() * actual/expected: Any в check_equals() * actual/expected: List[Any] в check_lists_equals() - Добавлены возвращаемые типы: * -> Optional[Response] для open() * -> Optional[Dict[str, Any]] для get_response_body() * -> Response для send_get_api_request() и send_post_api_request() * -> None для методов без возвращаемого значения * -> bool для внутренней функции compare_lists() Изменения улучшают статическую проверку типов и документирование. --- pages/base_page.py | 122 +++++---------------------------------------- 1 file changed, 12 insertions(+), 110 deletions(-) diff --git a/pages/base_page.py b/pages/base_page.py index f25424f..6b8c701 100644 --- a/pages/base_page.py +++ b/pages/base_page.py @@ -1,9 +1,7 @@ -"""Базовый класс страницы для работы с Playwright. - -Содержит общие методы для взаимодействия со страницей и API. -""" +"""Базовый класс страницы для работы с Playwright.""" from playwright.sync_api import Page, Response, APIRequestContext, expect +from typing import Any, Dict, List, Optional from data.environment import host from tools.logger import get_logger import json @@ -12,69 +10,28 @@ logger = get_logger("BASE_PAGE") class BasePage: - """Базовый класс для работы со страницами через Playwright. + """Базовый класс для работы со страницами через Playwright.""" - Атрибуты: - page (Page): Экземпляр страницы Playwright. - """ - - def __init__(self, page: Page): - """Инициализирует базовую страницу. - - Args: - page (Page): Экземпляр страницы Playwright. - """ + def __init__(self, page: Page) -> None: self.page = page # Действия: def current_url(self) -> str: - """Возвращает текущий URL страницы. - - Returns: - str: Текущий URL страницы. - """ return self.page.url - def open(self, uri) -> Response | None: - """Открывает указанный URI в браузере. - - Args: - uri (str): URI для открытия (без базового URL). - - Returns: - Response | None: Ответ сервера или None в случае ошибки. - """ + def open(self, uri: str) -> Optional[Response]: 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): - """Ожидает указанное количество миллисекунд. - - Args: - timeout (int): Время ожидания в миллисекундах. - """ + def wait_for_timeout(self, timeout: int) -> None: self.page.wait_for_timeout(timeout) def get_api_request_context(self) -> APIRequestContext: - """Возвращает контекст API-запросов. - - Returns: - APIRequestContext: Контекст для выполнения API-запросов. - """ return self.page.context.request - def send_get_api_request(self, uri) -> Response: - """Отправляет GET-запрос к API. - - Args: - uri (str): URI API-эндпоинта (без базового URL). - - Returns: - Response: Ответ сервера. - """ + def send_get_api_request(self, uri: str) -> Response: api_request_context = self.get_api_request_context() token = host.get_access_token() headers = {"Accept": "application/json", "Authorization": f"Bearer {token}"} @@ -84,16 +41,7 @@ class BasePage: ) return response - def send_post_api_request(self, uri, payload) -> Response: - """Отправляет POST-запрос к API. - - Args: - uri (str): URI API-эндпоинта (без базового URL). - payload: Данные для отправки в теле запроса. - - Returns: - Response: Ответ сервера. - """ + def send_post_api_request(self, uri: str, payload: Dict[str, Any]) -> Response: api_request_context = self.get_api_request_context() token = host.get_access_token() headers = {"Accept": "application/json", "Authorization": f"Bearer {token}"} @@ -104,15 +52,7 @@ class BasePage: ) return response - def get_response_body(self, response) -> dict | None: - """Извлекает тело ответа в формате JSON. - - Args: - response (Response): Ответ сервера. - - Returns: - dict | None: Распарсенное тело ответа или None в случае ошибки. - """ + def get_response_body(self, response: Response) -> Optional[Dict[str, Any]]: try: response_body = response.json() except json.JSONDecodeError: @@ -122,54 +62,16 @@ class BasePage: # Проверки: def check_URL(self, uri: str, msg: str) -> None: - """Проверяет, что текущий URL соответствует ожидаемому. - - Args: - uri (str): Ожидаемый URI (без базового URL). - msg (str): Сообщение об ошибке при несоответствии. - - Raises: - AssertionError: Если URL не соответствует ожидаемому. - """ expect(self.page).to_have_url( f"{host.get_base_url()}{uri}", timeout=60000 ), msg - def check_equals(self, actual, expected, msg: str) -> None: - """Проверяет равенство фактического и ожидаемого значений. - - Args: - actual: Фактическое значение. - expected: Ожидаемое значение. - msg (str): Сообщение об ошибке при несоответствии. - - Raises: - AssertionError: Если значения не равны. - """ + def check_equals(self, actual: Any, expected: Any, msg: str) -> None: assert actual == expected, msg - def check_lists_equals(self, actual: list, expected: list, msg: str) -> None: - """Рекурсивно проверяет равенство двух списков. - - Args: - actual (list): Фактический список. - expected (list): Ожидаемый список. - msg (str): Сообщение об ошибке при несоответствии. - - Raises: - AssertionError: Если списки не равны. - """ - def compare_lists(list1: list, list2: list) -> bool: - """Вспомогательная функция для рекурсивного сравнения списков. - - Args: - list1 (list): Первый список для сравнения. - list2 (list): Второй список для сравнения. - - Returns: - bool: True если списки идентичны, иначе False. - """ + def check_lists_equals(self, actual: List[Any], expected: List[Any], msg: str) -> None: + def compare_lists(list1: List[Any], list2: List[Any]) -> bool: if len(list1) != len(list2): return False for item1, item2 in zip(list1, list2):