feat(base_page): добавлены аннотации типов для базовой страницы
- Добавлены аннотации параметров: * 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() Изменения улучшают статическую проверку типов и документирование.pull/1/head
parent
855d6810fa
commit
a54358f900
|
|
@ -1,9 +1,7 @@
|
||||||
"""Базовый класс страницы для работы с Playwright.
|
"""Базовый класс страницы для работы с Playwright."""
|
||||||
|
|
||||||
Содержит общие методы для взаимодействия со страницей и API.
|
|
||||||
"""
|
|
||||||
|
|
||||||
from playwright.sync_api import Page, Response, APIRequestContext, expect
|
from playwright.sync_api import Page, Response, APIRequestContext, expect
|
||||||
|
from typing import Any, Dict, List, Optional
|
||||||
from data.environment import host
|
from data.environment import host
|
||||||
from tools.logger import get_logger
|
from tools.logger import get_logger
|
||||||
import json
|
import json
|
||||||
|
|
@ -12,69 +10,28 @@ logger = get_logger("BASE_PAGE")
|
||||||
|
|
||||||
|
|
||||||
class BasePage:
|
class BasePage:
|
||||||
"""Базовый класс для работы со страницами через Playwright.
|
"""Базовый класс для работы со страницами через Playwright."""
|
||||||
|
|
||||||
Атрибуты:
|
def __init__(self, page: Page) -> None:
|
||||||
page (Page): Экземпляр страницы Playwright.
|
|
||||||
"""
|
|
||||||
|
|
||||||
def __init__(self, page: Page):
|
|
||||||
"""Инициализирует базовую страницу.
|
|
||||||
|
|
||||||
Args:
|
|
||||||
page (Page): Экземпляр страницы Playwright.
|
|
||||||
"""
|
|
||||||
self.page = page
|
self.page = page
|
||||||
|
|
||||||
# Действия:
|
# Действия:
|
||||||
def current_url(self) -> str:
|
def current_url(self) -> str:
|
||||||
"""Возвращает текущий URL страницы.
|
|
||||||
|
|
||||||
Returns:
|
|
||||||
str: Текущий URL страницы.
|
|
||||||
"""
|
|
||||||
return self.page.url
|
return self.page.url
|
||||||
|
|
||||||
def open(self, uri) -> Response | None:
|
def open(self, uri: str) -> Optional[Response]:
|
||||||
"""Открывает указанный URI в браузере.
|
|
||||||
|
|
||||||
Args:
|
|
||||||
uri (str): URI для открытия (без базового URL).
|
|
||||||
|
|
||||||
Returns:
|
|
||||||
Response | None: Ответ сервера или None в случае ошибки.
|
|
||||||
"""
|
|
||||||
return self.page.goto(f"{host.get_base_url()}{uri}", wait_until='domcontentloaded')
|
return self.page.goto(f"{host.get_base_url()}{uri}", wait_until='domcontentloaded')
|
||||||
|
|
||||||
def page_reload(self) -> None:
|
def page_reload(self) -> None:
|
||||||
"""Перезагружает текущую страницу."""
|
|
||||||
self.page.reload()
|
self.page.reload()
|
||||||
|
|
||||||
def wait_for_timeout(self, timeout):
|
def wait_for_timeout(self, timeout: int) -> None:
|
||||||
"""Ожидает указанное количество миллисекунд.
|
|
||||||
|
|
||||||
Args:
|
|
||||||
timeout (int): Время ожидания в миллисекундах.
|
|
||||||
"""
|
|
||||||
self.page.wait_for_timeout(timeout)
|
self.page.wait_for_timeout(timeout)
|
||||||
|
|
||||||
def get_api_request_context(self) -> APIRequestContext:
|
def get_api_request_context(self) -> APIRequestContext:
|
||||||
"""Возвращает контекст API-запросов.
|
|
||||||
|
|
||||||
Returns:
|
|
||||||
APIRequestContext: Контекст для выполнения API-запросов.
|
|
||||||
"""
|
|
||||||
return self.page.context.request
|
return self.page.context.request
|
||||||
|
|
||||||
def send_get_api_request(self, uri) -> Response:
|
def send_get_api_request(self, uri: str) -> Response:
|
||||||
"""Отправляет GET-запрос к API.
|
|
||||||
|
|
||||||
Args:
|
|
||||||
uri (str): URI API-эндпоинта (без базового URL).
|
|
||||||
|
|
||||||
Returns:
|
|
||||||
Response: Ответ сервера.
|
|
||||||
"""
|
|
||||||
api_request_context = self.get_api_request_context()
|
api_request_context = self.get_api_request_context()
|
||||||
token = host.get_access_token()
|
token = host.get_access_token()
|
||||||
headers = {"Accept": "application/json", "Authorization": f"Bearer {token}"}
|
headers = {"Accept": "application/json", "Authorization": f"Bearer {token}"}
|
||||||
|
|
@ -84,16 +41,7 @@ class BasePage:
|
||||||
)
|
)
|
||||||
return response
|
return response
|
||||||
|
|
||||||
def send_post_api_request(self, uri, payload) -> Response:
|
def send_post_api_request(self, uri: str, payload: Dict[str, Any]) -> Response:
|
||||||
"""Отправляет POST-запрос к API.
|
|
||||||
|
|
||||||
Args:
|
|
||||||
uri (str): URI API-эндпоинта (без базового URL).
|
|
||||||
payload: Данные для отправки в теле запроса.
|
|
||||||
|
|
||||||
Returns:
|
|
||||||
Response: Ответ сервера.
|
|
||||||
"""
|
|
||||||
api_request_context = self.get_api_request_context()
|
api_request_context = self.get_api_request_context()
|
||||||
token = host.get_access_token()
|
token = host.get_access_token()
|
||||||
headers = {"Accept": "application/json", "Authorization": f"Bearer {token}"}
|
headers = {"Accept": "application/json", "Authorization": f"Bearer {token}"}
|
||||||
|
|
@ -104,15 +52,7 @@ class BasePage:
|
||||||
)
|
)
|
||||||
return response
|
return response
|
||||||
|
|
||||||
def get_response_body(self, response) -> dict | None:
|
def get_response_body(self, response: Response) -> Optional[Dict[str, Any]]:
|
||||||
"""Извлекает тело ответа в формате JSON.
|
|
||||||
|
|
||||||
Args:
|
|
||||||
response (Response): Ответ сервера.
|
|
||||||
|
|
||||||
Returns:
|
|
||||||
dict | None: Распарсенное тело ответа или None в случае ошибки.
|
|
||||||
"""
|
|
||||||
try:
|
try:
|
||||||
response_body = response.json()
|
response_body = response.json()
|
||||||
except json.JSONDecodeError:
|
except json.JSONDecodeError:
|
||||||
|
|
@ -122,54 +62,16 @@ class BasePage:
|
||||||
|
|
||||||
# Проверки:
|
# Проверки:
|
||||||
def check_URL(self, uri: str, msg: str) -> None:
|
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(
|
expect(self.page).to_have_url(
|
||||||
f"{host.get_base_url()}{uri}",
|
f"{host.get_base_url()}{uri}",
|
||||||
timeout=60000
|
timeout=60000
|
||||||
), msg
|
), msg
|
||||||
|
|
||||||
def check_equals(self, actual, expected, msg: str) -> None:
|
def check_equals(self, actual: Any, expected: Any, msg: str) -> None:
|
||||||
"""Проверяет равенство фактического и ожидаемого значений.
|
|
||||||
|
|
||||||
Args:
|
|
||||||
actual: Фактическое значение.
|
|
||||||
expected: Ожидаемое значение.
|
|
||||||
msg (str): Сообщение об ошибке при несоответствии.
|
|
||||||
|
|
||||||
Raises:
|
|
||||||
AssertionError: Если значения не равны.
|
|
||||||
"""
|
|
||||||
assert actual == expected, msg
|
assert actual == expected, msg
|
||||||
|
|
||||||
def check_lists_equals(self, actual: list, expected: list, msg: str) -> None:
|
def check_lists_equals(self, actual: List[Any], expected: List[Any], msg: str) -> None:
|
||||||
"""Рекурсивно проверяет равенство двух списков.
|
def compare_lists(list1: List[Any], list2: List[Any]) -> bool:
|
||||||
|
|
||||||
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.
|
|
||||||
"""
|
|
||||||
if len(list1) != len(list2):
|
if len(list1) != len(list2):
|
||||||
return False
|
return False
|
||||||
for item1, item2 in zip(list1, list2):
|
for item1, item2 in zip(list1, list2):
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue