from playwright.sync_api import Page, Locator, expect, TimeoutError from tools.logger import get_logger logger = get_logger("BASE_ELEMENT") class BaseElement: """Базовый класс для работы с элементами страницы. Атрибуты: page: Экземпляр страницы Playwright. name: Название элемента (для логирования). locator: Локатор элемента (строка или объект Locator). """ def __init__(self, page: Page, locator: str | Locator, name: str) -> None: """Инициализирует базовый элемент страницы. Args: page: Экземпляр страницы Playwright. locator: Локатор элемента (строка или объект Locator). name: Название элемента (для логирования). Raises: TypeError: Если передан некорректный тип локатора. """ self.page = page self.name = name if isinstance(locator, Locator): self.locator = locator elif isinstance(locator, str): self.locator = self.page.locator(locator) else: raise TypeError("locator value should be string type or Locator type") @property def type_of(self) -> str: """Возвращает тип элемента. Returns: Строка с описанием типа элемента. """ return "base element" # Действия: def click(self) -> None: """Кликает на элемент.""" logger.info(f'Clicking {self.type_of} "{self.name}"') self.locator.click() def get_text(self, index: int) -> str: """Получает текст элемента по указанному индексу. Args: index: Индекс элемента (0 для единичного локатора). Returns: Текст элемента. """ logger.info(f'Get text for {self.type_of} "{self.name}"') return self.locator.nth(index).text_content() def wait_for_element(self, timeout=12000) -> None: """Ожидает появления элемента на странице. Args: timeout: Время ожидания в миллисекундах. """ logger.info(f'Wait for {self.type_of} "{self.name}"') self.locator.wait_for(timeout=timeout) # Проверки: def check_have_text(self, text: str, msg): """Проверяет, что элемент содержит указанный текст. Args: text: Ожидаемый текст. msg: Сообщение об ошибке при неудачной проверке. """ logger.info(f'Check that {self.type_of} "{self.name}" has text "{text}"') expect(self.locator).to_have_text(text), msg def check_presence(self, msg): """Проверяет видимость элемента на странице. Args: msg: Сообщение об ошибке при неудачной проверке. """ logger.info(f'Check that {self.type_of} "{self.name}" is present') print(self.locator) expect(self.locator).to_be_visible(visible=True, timeout=12000), msg 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') try: self.locator.wait_for(timeout=timeout) except TimeoutError: return False return True 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') try: self.locator.wait_for(timeout=timeout) except TimeoutError: return True return False