from playwright.sync_api import Page from components.base_component import BaseComponent from components.toolbar_component import ToolbarComponent from elements.button_element import Button from locators.modal_window_locators import ModalWindowLocators from tools.logger import get_logger logger = get_logger("MODAL_WINDOW") class ModalWindowComponent(BaseComponent): """Компонент модального окна. Предоставляет методы для работы с модальными окнами: - управление содержимым и кнопками - прокрутка содержимого - проверка элементов интерфейса Атрибуты: page: экземпляр страницы Playwright toolbar: компонент панели инструментов окна content_items: словарь элементов содержимого buttons: список кнопок окна """ def __init__(self, page: Page): """Инициализация компонента модального окна. Args: page: экземпляр страницы Playwright """ super().__init__(page) self.toolbar = ToolbarComponent(page, "") self.content_items = {} self.buttons = [] # Действия: def add_content_item(self, name, item): """Добавление элемента содержимого в окно. Args: name: имя элемента item: объект элемента """ self.content_items[name] = item def get_content_item(self, name): """Получение элемента содержимого по имени. Args: name: имя элемента Returns: Элемент содержимого или None, если не найден """ return self.content_items.get(name) def add_toolbar_title(self, title: str): """Добавление заголовка в панель инструментов. Args: title: текст заголовка """ self.toolbar.add_title(title) def add_toolbar_button(self, locator, name): """Добавление кнопки в панель инструментов. Args: locator: локатор кнопки name: имя кнопки """ self.toolbar.add_button(locator, name) def add_button(self, locator, name): """Добавление кнопки в окно. Args: locator: локатор кнопки name: имя кнопки """ self.buttons.append(Button(self.page, locator, name)) def get_button_by_name(self, name) -> Button | None: """Поиск кнопки по имени. Args: name: имя кнопки Returns: Button: найденная кнопка или None """ for button in self.buttons: if button.name == name: return button return None def click_button(self, name): """Нажатие кнопки по имени. Args: name: имя кнопки Raises: AssertionError: если кнопка не найдена """ button = self.get_button_by_name(name) if button is None: assert False, f"Button with name '{name}' not found" button.click() def click_toolbar_close_button(self): """Нажатие кнопки закрытия в панели инструментов.""" self.toolbar.click_button("close") def scroll_window_down(self): """Прокрутка содержимого окна вниз.""" self.scroll_down(ModalWindowLocators.MODAL_WINDOW) def scroll_window_up(self): """Прокрутка содержимого окна вверх.""" self.scroll_up(ModalWindowLocators.MODAL_WINDOW) def scroll_window_left(self): """Прокрутка содержимого окна влево.""" self.scroll_left(ModalWindowLocators.MODAL_WINDOW) def scroll_window_right(self): """Прокрутка содержимого окна вправо.""" self.scroll_right(ModalWindowLocators.MODAL_WINDOW) # Проверки: def check_window_vertical_scrolling(self): """Проверка возможности вертикальной прокрутки. Returns: bool: True если прокрутка возможна """ return self.is_scrollable_vertically(ModalWindowLocators.MODAL_WINDOW) def check_window_horizontal_scrolling(self): """Проверка возможности горизонтальной прокрутки. Returns: bool: True если прокрутка возможна """ return self.is_scrollable_horizontally(ModalWindowLocators.MODAL_WINDOW) def check_by_window_title(self): """Проверка наличия окна по заголовку. Raises: AssertionError: если окно не найдено """ self.toolbar.check_presence(f"Modal window with '{self.toolbar.title}' is missing") def check_button_presence(self, name): """Проверка наличия кнопки по имени. Args: name: имя кнопки Raises: AssertionError: если кнопка не найдена """ button = self.get_button_by_name(name) if button is None: assert False, f"Button with name '{name}' not found" button.check_presence(f"Button with name '{name}' is missing") def check_toolbar_button_presence(self, name): """Проверка наличия кнопки в панели инструментов. Args: name: имя кнопки """ self.toolbar.check_button_presence(name) def check_toolbar_button_tooltip(self, name, tooltip): """Проверка подсказки кнопки в панели инструментов. Args: name: имя кнопки tooltip: ожидаемый текст подсказки """ self.toolbar.check_button_tooltip(name, tooltip)