Update toolbar component for rack tab functionality

Radislav 2025-11-01 11:44:38 +03:00
parent b2d73a3a05
commit dc589ce467
1 changed files with 248 additions and 0 deletions

View File

@ -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)
# Найти все элементы <li> внутри <ul>
list_items = title_locator.locator("ul > li")
# Перебрать элементы и получить текст
for i in range(list_items.count()):
item_text = list_items.nth(i).inner_text()
toolbar_title_items.append(item_text)
return toolbar_title_items
# Проверки:
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:
message (str): Сообщение об ошибке если тулбар не виден
"""
locator = self.get_locator(locator)
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)