"""Модуль главной страницы приложения. Содержит класс MainPage для работы с элементами главной страницы. Включает взаимодействие с панелью навигации, кнопками и карточкой пользователя. """ from playwright.sync_api import Page from locators.navigation_panel_locators import NavigationPanelLocators from components_derived.container_actions_events import ActionsEventsContainer from components_derived.container_audit_events import AuditEventsContainer from components_derived.container_events import EventsTabContainer from components_derived.container_maintenance_events import MaintenanceEventsContainer from components_derived.container_system_log_events import SystemLogEventsContainer from components_derived.user_card import UserCard from components.eventbar_component import EventPanelComponent from components.navbar_component import NavigationPanelComponent 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) self.event_panel = EventPanelComponent(page) # Действия: def click_events_panel_expand_less_button(self) -> None: """Выполняет нажатие кнопки галочка вверх.""" self.event_panel.click_expand_less_button() def click_events_panel_expand_more_button(self) -> None: """Выполняет нажатие кнопки галочка вниз.""" self.event_panel.click_expand_more_button() def click_events_panel_actions_tab(self) -> ActionsEventsContainer: """Выполняет нажатие tab-кнопки Действия.""" return self.event_panel.click_actions_tab() def click_events_panel_audit_tab(self) -> AuditEventsContainer: """Выполняет нажатие tab-кнопки Аудит.""" return self.event_panel.click_audit_tab() def click_events_panel_events_tab(self) -> EventsTabContainer: """Выполняет нажатие tab-кнопки События.""" return self.event_panel.click_events_tab() def click_events_panel_maintenance_tab(self) -> MaintenanceEventsContainer: """Выполняет нажатие tab-кнопки Обслуживание.""" return self.event_panel.click_maintenance_tab() def click_events_panel_system_log_tab(self) -> SystemLogEventsContainer: """Выполняет нажатие tab-кнопки Системный журнал.""" return self.event_panel.click_system_log_tab() 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, parent=None) -> 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, parent ) def click_expand_workarea_button(self) -> None: """Выполняеи нажатие кнопки расширения рабочей области страницы""" self.navigation_panel.expand_workarea() def click_reduce_workarea_button(self) -> None: """Выполняеи нажатие кнопки сжатия рабочей области страницы""" self.navigation_panel.reduce_workarea() def click_user_button(self) -> UserCard: """Выполняет нажатие кнопки пользователя.""" return self.event_panel.click_user_button() def do_logout(self) -> None: """Выполняет выход из системы.""" self.event_panel.do_logout() def expand_navigation_subpanel(self) -> 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 выбранной подпанели # и вывод информации об элементах в режиме отладки (debug=True) self.navigation_panel.traverse_panel_tree( node_locator, debug=False ) def get_event_counters_by_buttons(self) -> dict: """Возвращает набор значений кнопок счетчиков событий.""" return self.event_panel.get_event_button_values() def get_event_counters_by_tooltips(self) -> dict: """Возвращает набор текстов всплывающих подсказок кнопок счетчиков событий.""" events = self.event_panel.get_event_tooltip_texts() event_counters = {} for event in events: if len(event) > 0: event_name, count = event.split(" ") event_counters[event_name] = count return event_counters def get_events_panel_position(self) -> str: """Возвращает текущее положение панели событий относительно страницы: "top", "center","bottom".""" return self.event_panel.get_panel_position() def scroll_navigation_panel_down(self) -> None: """Прокручивает панель навигации вниз.""" self.navigation_panel.scroll_down( NavigationPanelLocators.PANEL_SCROLL_CONTAINER ) def scroll_navigation_panel_up(self) -> None: """Прокручивает панель навигации вверх.""" self.navigation_panel.scroll_up( NavigationPanelLocators.PANEL_SCROLL_CONTAINER ) # Проверки: def check_expand_less_button(self) -> bool: """Проверяет наличие кнопки галочка вверх.""" return self.event_panel.check_expand_less_button() def check_expand_more_button(self) -> bool: """Проверяет наличие кнопки галочка вниз.""" return self.event_panel.check_expand_more_button() def check_navigation_item_exists(self, item_name: str) -> bool: """Проверяет существование элемента в навигационной панели. Args: item_name: Название элемента для проверки Returns: bool: True если элемент существует, False если нет """ return self.navigation_panel.is_item_visible( NavigationPanelLocators.PANEL_MAIN, item_name ) def check_navigation_panel_item_visibility(self, item_name: str, parent=None) -> None: """Проверяет видимость элемента в панели навигации. Args: item_name: Название элемента для проверки. """ self.navigation_panel.check_item_visibility( NavigationPanelLocators.PANEL_MAIN, item_name, parent ) def check_subpanel_item_state(self, item_name: str, parent=None) -> str|None: """Выполняет рекурсивный поиск по панели навигации заданного элемента, делает клик по нему, проверяет наличие индикатора состояния. Если индикатор состояния присутствует, возвращается его цвет. Иначе 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 заданного элемента # и клик по нему return self.navigation_panel.check_sub_item_state( node_locator, item_name, parent ) def check_navigation_panel_verticall_scrolling(self) -> bool: """Проверяет возможность вертикальной прокрутки панели. Returns: bool: True если прокрутка возможна, иначе False. """ return self.navigation_panel.is_scrollable_vertically( NavigationPanelLocators.PANEL_SCROLL_CONTAINER ) def should_be_event_panel(self) -> None: """Проверяет наличие элементов панели событий.""" ## to-do: кнопки галочки??? self.event_panel.should_be_tab_buttons() self.event_panel.should_be_event_buttons() self.event_panel.should_be_user_button() def should_be_navigation_panel(self) -> None: """Проверяет наличие панели навигации.""" self.navigation_panel.check_visibility( NavigationPanelLocators.PANEL_MAIN, "Navigation panel is missing" ) def should_be_expand_workarea_button(self) -> None: """Проверяет наличие кнопки расширения рабочей области страницы.""" self.navigation_panel.should_be_expand_workarea_button() def should_be_reduce_workarea_button(self) -> None: """Проверяет наличие кнопки сжатия рабочей области страницы.""" self.navigation_panel.should_be_reduce_workarea_button()