feat(base_element): добавлены аннотации типов для базового элемента

- обавлены аннотации для параметров методов:
  * msg: str в check_have_text() и check_presence()
  * timeout: int в wait_for_element(), is_present(), is_not_present()

- обавлены возвращаемые типы:
  * -> None для методов click(), wait_for_element(), check_have_text(), check_presence()
  * -> bool для is_present() и is_not_present()

- обавлена аннотация типа для атрибута locator: Locator

зменения улучшают статическую проверку типов и документирование.
pull/1/head
Radislav 2025-07-22 08:30:39 +03:00
parent 1ca9822bac
commit 855d6810fa
1 changed files with 6 additions and 66 deletions

View File

@ -1,4 +1,5 @@
from playwright.sync_api import Page, Locator, expect, TimeoutError from playwright.sync_api import Page, Locator, expect, TimeoutError
from typing import Optional
from tools.logger import get_logger from tools.logger import get_logger
@ -6,27 +7,12 @@ logger = get_logger("BASE_ELEMENT")
class BaseElement: class BaseElement:
"""Базовый класс для работы с элементами страницы. """Базовый класс для работы с элементами страницы."""
Атрибуты:
page: Экземпляр страницы Playwright.
name: Название элемента (для логирования).
locator: Локатор элемента (строка или объект Locator).
"""
def __init__(self, page: Page, locator: str | Locator, name: str) -> None: def __init__(self, page: Page, locator: str | Locator, name: str) -> None:
"""Инициализирует базовый элемент страницы.
Args:
page: Экземпляр страницы Playwright.
locator: Локатор элемента (строка или объект Locator).
name: Название элемента (для логирования).
Raises:
TypeError: Если передан некорректный тип локатора.
"""
self.page = page self.page = page
self.name = name self.name = name
self.locator: Locator
if isinstance(locator, Locator): if isinstance(locator, Locator):
self.locator = locator self.locator = locator
@ -37,70 +23,32 @@ class BaseElement:
@property @property
def type_of(self) -> str: def type_of(self) -> str:
"""Возвращает тип элемента.
Returns:
Строка с описанием типа элемента.
"""
return "base element" return "base element"
# Действия: # Действия:
def click(self) -> None: def click(self) -> None:
"""Кликает на элемент."""
logger.info(f'Clicking {self.type_of} "{self.name}"') logger.info(f'Clicking {self.type_of} "{self.name}"')
self.locator.click() self.locator.click()
def get_text(self, index: int) -> str: def get_text(self, index: int) -> str:
"""Получает текст элемента по указанному индексу.
Args:
index: Индекс элемента (0 для единичного локатора).
Returns:
Текст элемента.
"""
logger.info(f'Get text for {self.type_of} "{self.name}"') logger.info(f'Get text for {self.type_of} "{self.name}"')
return self.locator.nth(index).text_content() return self.locator.nth(index).text_content()
def wait_for_element(self, timeout=12000) -> None: def wait_for_element(self, timeout: int = 12000) -> None:
"""Ожидает появления элемента на странице.
Args:
timeout: Время ожидания в миллисекундах.
"""
logger.info(f'Wait for {self.type_of} "{self.name}"') logger.info(f'Wait for {self.type_of} "{self.name}"')
self.locator.wait_for(timeout=timeout) self.locator.wait_for(timeout=timeout)
# Проверки: # Проверки:
def check_have_text(self, text: str, msg): def check_have_text(self, text: str, msg: str) -> None:
"""Проверяет, что элемент содержит указанный текст.
Args:
text: Ожидаемый текст.
msg: Сообщение об ошибке при неудачной проверке.
"""
logger.info(f'Check that {self.type_of} "{self.name}" has text "{text}"') logger.info(f'Check that {self.type_of} "{self.name}" has text "{text}"')
expect(self.locator).to_have_text(text), msg expect(self.locator).to_have_text(text), msg
def check_presence(self, msg): def check_presence(self, msg: str) -> None:
"""Проверяет видимость элемента на странице.
Args:
msg: Сообщение об ошибке при неудачной проверке.
"""
logger.info(f'Check that {self.type_of} "{self.name}" is present') logger.info(f'Check that {self.type_of} "{self.name}" is present')
print(self.locator) print(self.locator)
expect(self.locator).to_be_visible(visible=True, timeout=12000), msg expect(self.locator).to_be_visible(visible=True, timeout=12000), msg
def is_present(self, timeout: int = 5000) -> bool: def is_present(self, timeout: int = 5000) -> bool:
"""Проверяет наличие элемента на странице.
Args:
timeout: Время ожидания в миллисекундах.
Returns:
True, если элемент присутствует, иначе False.
"""
logger.info(f'Check that {self.type_of} "{self.name}" is present') logger.info(f'Check that {self.type_of} "{self.name}" is present')
try: try:
self.locator.wait_for(timeout=timeout) self.locator.wait_for(timeout=timeout)
@ -109,14 +57,6 @@ class BaseElement:
return True return True
def is_not_present(self, timeout: int = 5000) -> bool: def is_not_present(self, timeout: int = 5000) -> bool:
"""Проверяет отсутствие элемента на странице.
Args:
timeout: Время ожидания в миллисекундах.
Returns:
True, если элемент отсутствует, иначе False.
"""
logger.info(f'Check that {self.type_of} "{self.name}" is missing') logger.info(f'Check that {self.type_of} "{self.name}" is missing')
try: try:
self.locator.wait_for(timeout=timeout) self.locator.wait_for(timeout=timeout)