265 lines
10 KiB
Python
265 lines
10 KiB
Python
"""Модуль компонента тулбара (панели инструментов).
|
||
|
||
Содержит класс 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 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:
|
||
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)
|