Исходный код elements.base_element

"""Модуль base_element содержит базовый класс для работы с элементами страницы.

Класс BaseElement предоставляет основные методы взаимодействия с элементами
и их проверки через Playwright.
"""

from playwright.sync_api import Page, Locator, expect, TimeoutError
from tools.logger import get_logger

logger = get_logger("BASE_ELEMENT")

[документация] class BaseElement: """Базовый класс для работы с элементами страницы через Playwright. Предоставляет основные методы взаимодействия с элементами: клики, получение текста, ожидание и проверки состояния. """
[документация] def __init__(self, page: Page, locator: str | Locator, name: str) -> None: """Инициализирует базовый элемент страницы. Args: page: Экземпляр страницы Playwright locator: Локатор элемента (строка или объект Locator) name: Имя элемента для логирования """ self.page = page self.name = name self.locator: Locator 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: """Возвращает тип элемента (для логирования).""" 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: """Возвращает текст элемента по указанному индексу.""" logger.info(f"Get text for {self.type_of} '{self.name}'") return self.locator.nth(index).text_content()
[документация] def update_locator(self, new_locator: Locator) -> None: """Меняет значение локатора для элемента""" logger.info(f"Update locator for {self.type_of} '{self.name}'") self.locator = new_locator
[документация] def wait_for_element(self, timeout: int = 12000) -> None: """Ожидает появление элемента в течение заданного времени.""" logger.info(f"Wait for {self.type_of} '{self.name}'") self.locator.wait_for(timeout=timeout)
# Проверки:
[документация] def check_have_text(self, text: str, msg: str) -> None: """Проверяет наличие указанного текста в элементе.""" logger.info(f"Check that {self.type_of} '{self.name}' has text '{text}'") expect(self.locator).to_have_text(text), msg
[документация] def check_visibility(self, msg: str) -> None: """Проверяет видимость элемента на странице.""" logger.info(f"Check that {self.type_of} '{self.name}' is present") # print(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: """Проверяет наличие элемента в течение заданного времени.""" 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: """Проверяет отсутствие элемента в течение заданного времени.""" 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