97 lines
4.1 KiB
Python
97 lines
4.1 KiB
Python
"""Модуль компонента панели навигации. Содержит класс для работы с элементами навигации."""
|
||
|
||
from playwright.sync_api import Page, Locator
|
||
from tools.logger import get_logger
|
||
from locators.navigation_panel_locators import NavigationPanelLocators
|
||
from components.base_component import BaseComponent
|
||
|
||
logger = get_logger("NAVIGATION_PANEL")
|
||
|
||
|
||
class NavigationPanelComponent(BaseComponent):
|
||
"""Компонент панели навигации. Предоставляет методы для взаимодействия с ней."""
|
||
|
||
def __init__(self, page: Page):
|
||
"""Инициализирует компонент панели навигации.
|
||
|
||
Args:
|
||
page: Экземпляр страницы Playwright.
|
||
"""
|
||
|
||
super().__init__(page)
|
||
|
||
# Действия:
|
||
def get_item_names(self, locator: str | Locator) -> list[str]:
|
||
"""Возвращает тексты всех элементов по указанному локатору.
|
||
|
||
Args:
|
||
locator: Локатор элементов или строка с CSS/XPath.
|
||
|
||
Returns:
|
||
Список текстов элементов.
|
||
"""
|
||
|
||
loc = self.get_locator(locator)
|
||
return loc.all_inner_texts()
|
||
|
||
def click_item(self, locator: str | Locator, item_name: str) -> None:
|
||
"""Кликает по элементу с указанным текстом.
|
||
|
||
Args:
|
||
locator: Локатор элемента или строка с CSS/XPath.
|
||
item_name: Текст элемента для клика.
|
||
"""
|
||
|
||
loc = self.get_locator(locator)
|
||
loc.get_by_text(item_name).click()
|
||
|
||
def click_sub_item(self, locator: str | Locator, sublevel_number: int, item_name: str) -> None:
|
||
"""Кликает по вложенному элементу с указанным текстом.
|
||
|
||
Args:
|
||
locator: Локатор родительского элемента.
|
||
sublevel_number: Уровень вложенности (1 или 2).
|
||
item_name: Текст элемента для клика.
|
||
|
||
Raises:
|
||
ValueError: Если уровень вложенности не 1 или 2.
|
||
"""
|
||
|
||
root_locator = self.get_locator(NavigationPanelLocators.NODE_ROOT)
|
||
children_locator = self.get_locator(NavigationPanelLocators.NODE_CHILDREN)
|
||
|
||
loc = self.get_locator(locator)
|
||
|
||
if sublevel_number == 1:
|
||
loc.locator(root_locator).get_by_text(item_name).click()
|
||
elif sublevel_number == 2:
|
||
loc.locator(children_locator).locator(root_locator).get_by_text(item_name).click()
|
||
else:
|
||
raise ValueError("the navigation panel has two levels of nesting only")
|
||
|
||
# Проверки:
|
||
def check_item_visibility(self, locator: str | Locator, item_name: str) -> None:
|
||
"""Проверяет видимость элемента с указанным текстом.
|
||
|
||
Args:
|
||
locator: Локатор элемента или строка с CSS/XPath.
|
||
item_name: Текст элемента для проверки.
|
||
|
||
Note:
|
||
Временная обработка для элементов с текстом 'Шаблоны'.
|
||
"""
|
||
|
||
msg = f"Navigation panel item '{item_name}' is not visible"
|
||
|
||
## временно: в навигационной панели есть две панели с именем Шаблоны
|
||
## для их различия добавлены индексы Шаблоны_1 для Настройки/Шаблоны
|
||
## Шаблоны_2 для Настройки/ZTP/Шаблоны
|
||
loc = self.get_locator(locator)
|
||
if item_name == "Шаблоны_1":
|
||
loc = loc.get_by_text("Шаблоны").first
|
||
elif item_name == "Шаблоны_2":
|
||
loc = loc.get_by_text("Шаблоны").nth(1)
|
||
else:
|
||
loc = loc.get_by_text(item_name)
|
||
self.check_presence(loc, msg)
|