"""Модуль главной страницы приложения. Содержит класс MainPage для работы с элементами главной страницы. Включает взаимодействие с панелью навигации, кнопками и карточкой пользователя. """ from playwright.sync_api import Page from locators.navigation_panel_locators import NavigationPanelLocators from locators.event_panel_locators import EventPanelLocators from elements.button_element import Button from components.navbar_component import NavigationPanelComponent from components.card_component import CardComponent from pages.base_page import BasePage class MainPage(BasePage): """Класс для работы с главной страницей приложения. Атрибуты: page: Экземпляр страницы Playwright. navigation_panel: Компонент панели навигации. user_button: Кнопка пользователя. user_card: Карточка пользователя. """ def __init__(self, page: Page) -> None: """Инициализирует элементы главной страницы. Args: page: Экземпляр страницы Playwright. """ super().__init__(page) self.navigation_panel = NavigationPanelComponent(page) locators = self.page.locator(EventPanelLocators.BUTTONS_BLOCK).get_by_role("button").all() self.user_button = Button(page, locators[0], "search_button") self.user_button = Button(page, locators[1], "user_button") self.user_card = CardComponent(page) # Действия: def click_main_navigation_panel_item(self, item_name: str) -> None: """Кликает по элементу основной панели навигации. Args: item_name: Название элемента для клика. """ self.navigation_panel.click_item(NavigationPanelLocators.PANEL_MAIN, item_name) def click_subpanel_item(self, item_name: str) -> None: """Выполняет рекурсивный поиск по панели навигации заданного элемента и делает клик по нему.""" active_item_locator = self.page.locator(NavigationPanelLocators.PANEL_MAIN).locator(NavigationPanelLocators.ACTIVE_CONTAINER) node_locator = active_item_locator.locator(NavigationPanelLocators.SUB_PANEL_MAIN).locator(NavigationPanelLocators.TREEVIEW).first # Рекурсивный поиск в дереве v-treeview заданного элемента и клик по нему self.navigation_panel.click_sub_item(node_locator, item_name) def click_user_button(self) -> None: """Кликает по кнопке пользователя.""" self.user_button.click() def do_logout(self) -> None: """Выполняет выход из системы.""" self.should_be_user_button() self.click_user_button() self.user_card.click_logout_button() def expand_navigation_subpanel(self): """Выполняет полное открытие активной главной навигационной подпанели.""" active_item_locator = self.page.locator(NavigationPanelLocators.PANEL_MAIN).locator(NavigationPanelLocators.ACTIVE_CONTAINER) node_locator = active_item_locator.locator(NavigationPanelLocators.SUB_PANEL_MAIN).locator(NavigationPanelLocators.TREEVIEW).first # Рекурсивный обход дерева v-treeview выбранной подпанели и вывод информации об элементах в режиме отладки (debug=True) self.navigation_panel.traverse_panel_tree(node_locator, debug=False) def scroll_navigation_panel_up(self) -> None: """Прокручивает панель навигации вверх.""" self.navigation_panel.scroll_up(NavigationPanelLocators.PANEL_SCROLL_CONTAINER) def scroll_navigation_panel_down(self) -> None: """Прокручивает панель навигации вниз.""" self.navigation_panel.scroll_down(NavigationPanelLocators.PANEL_SCROLL_CONTAINER) # Проверки: def should_be_navigation_panel(self) -> None: """Проверяет наличие панели навигации.""" self.navigation_panel.check_presence( NavigationPanelLocators.PANEL_MAIN, "Navigation panel is missing" ) def should_be_user_button(self) -> None: """Проверяет наличие кнопки пользователя.""" self.user_button.check_presence("User button is missing on event panel") def check_navigation_panel_verticall_scrolling(self) -> bool: """Проверяет возможность вертикальной прокрутки панели. Returns: bool: True если прокрутка возможна, иначе False. """ return self.navigation_panel.is_scrollable_vertically( NavigationPanelLocators.PANEL_SCROLL_CONTAINER ) def check_navigation_panel_item_visibility(self, item_name: str) -> None: """Проверяет видимость элемента в панели навигации. Args: item_name: Название элемента для проверки. """ self.navigation_panel.check_item_visibility( NavigationPanelLocators.PANEL_MAIN, item_name )