diff --git a/components/toolbar_component.py b/components/toolbar_component.py new file mode 100644 index 0000000..75ec2ec --- /dev/null +++ b/components/toolbar_component.py @@ -0,0 +1,248 @@ +"""Модуль компонента тулбара (панели инструментов). + +Содержит класс ToolbarComponent для работы с элементами тулбара: +- Управление кнопками и их подсказками +- Проверка видимости элементов +- Взаимодействие с панелью инструментов +""" + +from playwright.sync_api import Page, expect, Locator +from tools.logger import get_logger +from locators.toolbar_locators import ToolbarLocators +from elements.tooltip_button_element import TooltipButton +from elements.tab_button_element import TabButton +from elements.button_element import Button +from components.base_component import BaseComponent + +logger = get_logger("TOOLBAR") + + +class ToolbarComponent(BaseComponent): + """Компонент тулбара. Предоставляет методы для работы с панелью инструментов. + + Args: + page (Page): Экземпляр страницы Playwright + title (str): Заголовок тулбара + """ + + # Действия: + def __init__(self, page: Page, title: str): + """Инициализирует компонент тулбара с указанным заголовком.""" + super().__init__(page) + self.title = title + self.buttons = [] + + def add_title(self, title: str) -> None: + """Устанавливает новый заголовок тулбара. + + Args: + title (str): Новый заголовок + """ + self.title = title + + def add_tooltip_button(self, locator: Locator, name: str) -> None: + """Добавляет кнопку с подсказкой в тулбар. + + Args: + locator (Locator): Локатор кнопки + name (str): Уникальное имя кнопки + """ + self.buttons.append(TooltipButton(self.page, locator, name)) + + def add_tab_button(self, locator: Locator, name: str) -> None: + """Добавляет кнопку типа v-tab в тулбар. + + Args: + locator (Locator): Локатор кнопки + name (str): Уникальное имя кнопки + """ + self.buttons.append(TabButton(self.page, locator, name)) + + def add_button(self, locator: Locator, name: str) -> None: + """Добавляет кнопку в тулбар. + + Args: + locator (Locator): Локатор кнопки + name (str): Уникальное имя кнопки + """ + self.buttons.append(Button(self.page, locator, name)) + + def get_button_by_name(self, name: str) -> TooltipButton | TabButton | Button | None: + """Возвращает кнопку по имени. + + Args: + name (str): Имя кнопки + + Returns: + TooltipButton | TabButton | Button | None: Найденная кнопка или None + """ + for button in self.buttons: + if button.name == name: + return button + return None + + def click_button(self, name: str) -> None: + """Кликает по кнопке тулбара. + + Args: + name (str): Имя кнопки + + Raises: + AssertionError: Если кнопка не найдена + """ + button = self.get_button_by_name(name) + if button is None: + raise AssertionError(f"Unsupported button name {name}") + button.click() + + def get_toolbar_title_text(self, locator: str = 'ToolbarLocators.TITLE', + filter_text: str = None, timeout: int = 5000) -> str: + """Получает заголовок тулбара окна. + + Args: + locator: Локатор для заголовка тулбара (по умолчанию 'ToolbarLocators.TITLE') + filter_text: Текст для фильтрации заголовка (опционально) + timeout: Таймаут ожидания в миллисекундах + + Returns: + str: Текст заголовка тулбара + + Raises: + Exception: Если не удалось получить заголовок + """ + # Получаем локатор заголовка + title_locator = self.get_locator(locator) + + # Фильтруем по тексту если указан + if filter_text: + title_locator = title_locator.filter(has_text=filter_text) + + # Ждем появления заголовка с помощью expect + expect(title_locator).to_be_visible(timeout=timeout) + + # Получаем текст заголовка + title_text = title_locator.text_content().strip() + logger.info("Заголовок тулбара: '%s'", title_text) + + return title_text + + def get_toolbar_composite_title_text(self, locator: str|Locator , + timeout: int = 5000) -> []: + """Получает составной заголовок тулбара окна в виде списка подзаголовков. + + Args: + locator: Локатор для заголовка тулбара + separator: Разделитель подзаголовков, по умолчанию галочка вправо (chevron_right) + timeout: Таймаут ожидания в миллисекундах + + Returns: + str: Текст заголовка тулбара + + Raises: + Exception: Если не удалось получить заголовок + """ + + toolbar_title_items = [] + + # Получаем локатор заголовка + title_locator = self.get_locator(locator) + + # Ждем появления заголовка с помощью expect + expect(title_locator).to_be_visible(timeout=timeout) + + # Найти все элементы
  • внутри