from elements.text_element import Text from playwright.sync_api import Page, expect from tools.logger import get_logger from components.base_component import BaseComponent logger = get_logger("ALERT") class AlertComponent(BaseComponent): """Компонент для работы с alert-окнами. Поддерживает различные типы alert-окон: error, success, info, warning. Атрибуты: page: экземпляр страницы Playwright alert_type: тип alert-окна (error/success/info/warning) text: текстовый элемент сообщения alert-окна """ def __init__(self, page: Page, alert_type: str): """Инициализация компонента alert-окна. Args: page: экземпляр страницы Playwright alert_type: тип alert-окна (error/success/info/warning) Raises: ValueError: если передан неподдерживаемый тип alert-окна """ super().__init__(page) alert_types = ["error", "success", "info", "warning"] if alert_type not in alert_types: raise ValueError("Unsupported type of alert window") self.alert_type = alert_type self.text = Text(page, f"//div[@class='v-alert {self.alert_type}']/div", "Alert message") # Действия: def get_text(self) -> str: """Получение текста сообщения из alert-окна. Returns: str: текст сообщения alert-окна """ return self.text.get_text(0) # Проверки: def check_presence(self, text: str)-> None: """Проверка наличия alert-окна с заданным текстом. Args: text: текст для проверки (если пустая строка - проверяется только наличие окна) Raises: AssertionError: если alert-окно не найдено """ msg = f"No {self.alert_type} alert window on page" if text == "": expect(self.page.get_by_role("alert")).to_be_visible(), msg else: expect( self.page.get_by_role("alert").filter( has_text=text)).to_be_visible(), msg def check_absence(self, text: str, timeout: int = 30000): """Проверка отсутствия alert-окна с заданным текстом. Args: text: текст для проверки timeout: время ожидания исчезновения (в миллисекундах) Raises: AssertionError: если alert-окно не исчезает в течение заданного времени """ seconds = int(timeout / 1000) msg = f"Alert { self.alert_type} window should disappear after {seconds} seconds" expect( self.page.get_by_role("alert").filter( has_text=text)).to_be_hidden( timeout=timeout), msg def check_text(self, alert_text: str): """Проверка точного соответствия текста в alert-окне. Args: alert_text: ожидаемый текст сообщения Raises: AssertionError: если текст не соответствует ожидаемому """ self.text.check_have_text( alert_text, f"Unexpected message in alert { self.alert_type} window")