Исходный код components.toolbar_component

"""Модуль компонента тулбара (панели инструментов).

Содержит класс 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) -> None: """Инициализирует компонент тулбара с указанным заголовком.""" 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 = None, timeout: int = 5000) -> str: """Получает заголовок тулбара окна. Args: locator: Локатор для заголовка тулбара 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("Toolbar title: '%s'", title_text) return title_text
# Проверки:
[документация] def is_button_present(self, name: str) -> bool: """Проверяет наличие кнопки. Args: name (str): Имя кнопки Returns: bool: True если кнопка присутствует Raises: AssertionError: Если имя кнопки не поддерживается """ button = self.get_button_by_name(name) if button is None: raise AssertionError(f"Unsupported button name {name}") return button.is_present(timeout=1000) # Ожидание 1 секунда
[документация] def is_button_not_present(self, name: str) -> bool: """Проверяет отсутствие кнопки. Args: name (str): Имя кнопки Returns: bool: True если кнопка отсутствует Raises: AssertionError: Если имя кнопки не поддерживается """ button = self.get_button_by_name(name) if button is None: raise AssertionError(f"Unsupported button name {name}") return button.is_not_present(timeout=1000) # Ожидание 1 секунда
[документация] def check_toolbar_presence(self, message: str) -> None: """Проверяет видимость тулбара. Args: message (str): Сообщение об ошибке если тулбар не виден """ locator = self.get_locator(ToolbarLocators.TITLE).filter( has_text=self.title ) expect(locator).to_be_visible(), message
[документация] def check_toolbar_presence_by_locator(self, locator: str | Locator, message: str) -> None: """Проверяет видимость тулбара. Args: locator: Локатор тулбара message (str): Сообщение об ошибке если тулбар не виден """ locator = self.get_locator(locator) expect(locator).to_be_visible(), message
[документация] def check_toolbar_presence_by_locator_and_title(self, locator: str | Locator, message: str) -> None: """Проверяет видимость тулбара. Args: locator: Локатор тулбара message (str): Сообщение об ошибке если тулбар не виден """ locator = self.get_locator(locator).filter(has_text=self.title) expect(locator).to_be_visible(), message
[документация] def check_button_visibility(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.locator.scroll_into_view_if_needed() button.check_visibility(f"Button with name {name} is missing")
[документация] def check_button_tooltip(self, name: str, tooltip: str) -> None: """Проверяет текст подсказки кнопки. Args: name (str): Имя кнопки tooltip (str): Ожидаемый текст подсказки Raises: AssertionError: Если текст подсказки не совпадает """ button = self.get_button_by_name(name) if button is None: raise AssertionError(f"Unsupported button name {name}") button.check_tooltip_with_text(tooltip)