From a6b0347c785b4dd97b6467f99dd4e61fb0b5202e Mon Sep 17 00:00:00 2001 From: nsubbot Date: Wed, 17 Dec 2025 14:54:07 +0300 Subject: [PATCH] =?UTF-8?q?=D0=90=D0=BA=D1=82=D1=83=D0=B0=D0=BB=D0=B8?= =?UTF-8?q?=D0=B7=D0=B0=D1=86=D0=B8=D1=8F=20=D1=82=D0=B5=D1=81=D1=82=D0=BE?= =?UTF-8?q?=D0=B2=20=D0=BF=D0=B0=D0=BD=D0=B5=D0=BB=D0=B8=20=D1=81=D0=BE?= =?UTF-8?q?=D0=B1=D1=8B=D1=82=D0=B8=D0=B9=20=D0=BF=D0=BE=D1=81=D0=BB=D0=B5?= =?UTF-8?q?=20=D0=B8=D0=B7=D0=BC=D0=B5=D0=BD=D0=B5=D0=BD=D0=B8=D1=8F=20UI?= =?UTF-8?q?=20=D0=B2=20=D0=B2=D0=B5=D1=80=D1=81=D0=B8=D0=B8=201.25?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- components/eventbar_component.py | 51 +++++++------ components/events_container_component.py | 73 ++++++++++--------- .../container_system_log_events.py | 47 +++++++----- ...er_component.py => events_filter_panel.py} | 46 ++++-------- elements/base_element.py | 5 ++ locators/event_panel_locators.py | 41 +++++++---- tests/e2e/test_event_panel.py | 38 +++++----- tests/e2e/test_system_log_events_container.py | 10 +-- 8 files changed, 165 insertions(+), 146 deletions(-) rename components_derived/{sidebar_filter_component.py => events_filter_panel.py} (60%) diff --git a/components/eventbar_component.py b/components/eventbar_component.py index b92b615..aa18900 100644 --- a/components/eventbar_component.py +++ b/components/eventbar_component.py @@ -25,43 +25,46 @@ class EventPanelComponent(BaseComponent): super().__init__(page) - self.states_tab = TabButton(page, self.page.locator(EventPanelLocators.TAB_STATES), "states_tab") - self.actions_tab = TabButton(page, self.page.locator(EventPanelLocators.TAB_ACTIONS), "actions_tab") - self.events_tab = TabButton(page, self.page.locator(EventPanelLocators.TAB_EVENTS), "events_tab") + self.expand_less_button = Button(page, + page. locator(EventPanelLocators.BUTTON_EXPAND_LESS), + "expand_less_button") + self.expand_more_button = Button(page, + page. locator(EventPanelLocators.BUTTON_EXPAND_MORE), + "expand_more_button") + + self.states_tab = TabButton(page, page.locator(EventPanelLocators.TAB_STATES), "states_tab") + self.actions_tab = TabButton(page, page.locator(EventPanelLocators.TAB_ACTIONS), "actions_tab") + self.events_tab = TabButton(page, page.locator(EventPanelLocators.TAB_EVENTS), "events_tab") self.maintenance_tab = TabButton(page, - self.page.locator(EventPanelLocators.TAB_MAINTENANCE), "maintenance_tab") - self.system_log_tab = TabButton(page, self.page.locator(EventPanelLocators.TAB_SYSTEM_LOG), "system_log_tab") + page.locator(EventPanelLocators.TAB_MAINTENANCE), "maintenance_tab") + self.system_log_tab = TabButton(page, page.locator(EventPanelLocators.TAB_SYSTEM_LOG), "system_log_tab") + self.audit_tab = TabButton(page, page.locator(EventPanelLocators.TAB_AUDIT), "audit_tab") self.unknown_reason_button = TooltipButton(page, - self.page.locator(EventPanelLocators.BUTTONS_EVENT).nth(0), + page.locator(EventPanelLocators.BUTTONS_EVENT).nth(0), "unknown_reason_button") self.warning_button = TooltipButton(page, - self.page.locator(EventPanelLocators.BUTTONS_EVENT).nth(1), + page.locator(EventPanelLocators.BUTTONS_EVENT).nth(1), "warning_button") self.damage_button = TooltipButton(page, - self.page.locator(EventPanelLocators.BUTTONS_EVENT).nth(2), + page.locator(EventPanelLocators.BUTTONS_EVENT).nth(2), "damage_button") self.failure_button = TooltipButton(page, - self.page.locator(EventPanelLocators.BUTTONS_EVENT).nth(3), + page.locator(EventPanelLocators.BUTTONS_EVENT).nth(3), "failure_button") - user_button_locator = self.page.locator(EventPanelLocators.BUTTONS_SERVICE).get_by_role("button") - self.user_button = Button(page, user_button_locator, "user_button") + self.user_button = Button(page, page.locator(EventPanelLocators.BUTTON_USER), "user_button") # Действия: def click_expand_less_button(self) -> None: """Выполняет нажатие кнопки галочка вверх.""" - button_locator = self.page.locator(EventPanelLocators.TAB_EXPAND_BUTTONS).\ - get_by_role("button").filter(has_text='expand_less') - button_locator.click() + self.expand_less_button.click() def click_expand_more_button(self) -> None: """Выполняет нажатие кнопки галочка вниз.""" - button_locator = self.page.locator(EventPanelLocators.TAB_EXPAND_BUTTONS).\ - get_by_role("button").filter(has_text='expand_more') - button_locator.click(force=True) + self.expand_more_button.click() def click_system_log_tab(self) -> SystemLogEventsContainer: """Выполняет нажатие tab-кнопки Системный журнал.""" @@ -128,21 +131,19 @@ class EventPanelComponent(BaseComponent): # Проверки: def check_expand_less_button(self) -> bool: - """Проверяет наличие кнопки галочка вверх.""" + """Проверяет наличие кнопки галочка вниз.""" try: - _ = self.page.locator(EventPanelLocators.TAB_EXPAND_BUTTONS).\ - get_by_role("button").filter(has_text='expand_less') + _ = self.page.locator(EventPanelLocators.BUTTON_EXPAND_LESS) except TimeoutError: return False return True def check_expand_more_button(self) -> bool: - """Проверяет наличие кнопки галочка вниз""" + """Проверяет наличие кнопки галочка вверх""" try: - _ = self.page.locator(EventPanelLocators.TAB_EXPAND_BUTTONS).\ - get_by_role("button").filter(has_text='expand_more') + _ = self.page.locator(EventPanelLocators.BUTTON_EXPAND_MORE) except TimeoutError: return False return True @@ -153,7 +154,7 @@ class EventPanelComponent(BaseComponent): self.user_button.check_visibility("User button is missing on event panel") def should_be_tab_buttons(self) -> None: - """Проверяет наличие блока tab-кнопок Состояния, Действия, События, Обслуживание, Системный журнал.""" + """Проверяет наличие блока tab-кнопок Состояния, Действия, События, Обслуживание, Системный журнал, Аудит.""" self.states_tab.check_have_text('Состояния', "Tab button with text Состояния is missing on event panel") self.actions_tab.check_have_text('Действия',"Tab button with text Действия is missing on event panel") @@ -162,6 +163,8 @@ class EventPanelComponent(BaseComponent): "Tab button with text Обслуживание is missing on event panel") self.system_log_tab.check_have_text('Системный журнал', "Tab button with text Системный журнал is missing on event panel") + self.audit_tab.check_have_text('Аудит', + "Tab button with text Аудит is missing on event panel") def should_be_event_buttons(self) -> None: """Проверяет наличие блока кнопок-счетчиков событий.""" diff --git a/components/events_container_component.py b/components/events_container_component.py index 58013b5..cfab590 100644 --- a/components/events_container_component.py +++ b/components/events_container_component.py @@ -1,13 +1,13 @@ """Модуль компонента контейнера с перечнем событий. Содержит класс для работы с контейнерами, их элементами и проверками.""" -from playwright.sync_api import Page, Locator +from playwright.sync_api import Page, Locator, expect from tools.logger import get_logger -from locators.toolbar_locators import ToolbarLocators +from locators.event_panel_locators import EventPanelLocators from elements.tooltip_button_element import TooltipButton from elements.tab_button_element import TabButton from elements.button_element import Button -from components_derived.sidebar_filter_component import SidebarFilterComponent +from components_derived.events_filter_panel import EventsFilterPanel from components.toolbar_component import ToolbarComponent from components.table_component import TableComponent from components.base_component import BaseComponent @@ -32,18 +32,11 @@ class EventsContainerComponent(BaseComponent): # тулбар self.toolbar = ToolbarComponent(page, "") - filter_button_locator = self.container_locator.locator(ToolbarLocators.TITLE).\ - get_by_role("button") - self.toolbar.add_button(filter_button_locator, "filter_button") - - export_buttons = self.container_locator.locator(ToolbarLocators.ITEMS).\ - get_by_role("button").all() - self.toolbar.add_tooltip_button(export_buttons[1], "export_to_csv_button") - self.toolbar.add_tooltip_button(export_buttons[0], "export_to_pdf_button") + self.toolbar_locator = EventPanelLocators.TOOLBAR # Таблица событий self.events_table = TableComponent(page) - self.table_locator = "//div[@class='scrolltable']/div/table" + self.table_locator = EventPanelLocators.TABLE # Кнопки пагинации в нижней части контейнера self.chevron_left = Button(page, @@ -64,16 +57,21 @@ class EventsContainerComponent(BaseComponent): locator("xpath=..").get_by_role("button").nth(2) self.data_set_number = Button(page, loc, "data_set_number") - self.sidebar_filter_locator = self.container_locator.locator("//aside//div[@class='scrollarea__container']") - self.sidebar_filter = SidebarFilterComponent(self.page, - self.sidebar_filter_locator) + self.events_filter = EventsFilterPanel(self.page) # Действия: def add_tab_to_toolbar(self, locator: str | Locator, name: str) -> None: """Добавление кнопки типа v-tabs к тулбару""" - tabs_locator = self.get_locator(locator) - self.toolbar.add_tab_button(self.container_locator.locator(tabs_locator), name) + tab_locator = self.get_locator(locator) + self.toolbar.add_tab_button(tab_locator, name) + + def click_tab_button(self, name: str) -> None: + """Нажатие tab кнопки на тулбаре""" + + tab_button = self.toolbar.get_button_by_name(name) + assert tab_button, f"Try to click unexisted button {name}" + tab_button.click() def click_chevron_left(self) -> None: """Нажатие кнопки получения предыдущего набора данных""" @@ -95,13 +93,13 @@ class EventsContainerComponent(BaseComponent): self.last_page.click() - def click_filter_button(self) -> SidebarFilterComponent: + def click_filter_button(self) -> EventsFilterPanel: """Нажатие кнопки перехода на первую сраницу""" self.toolbar.click_button("filter_button") - self.sidebar_filter.check_visibility(self.sidebar_filter_locator, - "Filter sidebar is missing") - return self.sidebar_filter + expect(self.page.locator("div.menuable__content__active")).to_be_visible(), "Events filter is missing" + + return self.events_filter def click_event_table_header_arrow(self, index: int) -> None: """ Нажатие кнопки-стрелочки вверх/вниз в ячейке заголовка таблицы @@ -157,10 +155,10 @@ class EventsContainerComponent(BaseComponent): loc = self.container_locator.locator(self.table_locator) return self.events_table.get_rows_count(loc) - def get_sidebar_filter(self) -> SidebarFilterComponent: - """Возвращает боковую панель фильтрации.""" + def get_events_filter(self) -> EventsFilterPanel: + """Возвращает панель фильтрации.""" - return self.sidebar_filter + return self.events_filter def get_toolbar_filter_button(self) -> Button: """Возвращает кнопку фильтрации.""" @@ -279,6 +277,21 @@ class EventsContainerComponent(BaseComponent): return self.last_page.is_disabled() + def is_tab_active(self, name: str) -> bool: + """Проверка является ли tab-button активным""" + + tab_button = self.toolbar.get_button_by_name(name) + assert tab_button, f"Try to find unexisted button {name}" + + tab_button_locator = tab_button.get_locator() + + is_active = True + attr = tab_button_locator.locator("../..").get_attribute("class") + if attr.find("active") == -1: + is_active = False + + return is_active + def should_be_all_disabled(self) -> None: """Проверка видимости кнопок пагинации: все кнопки disabled""" @@ -355,19 +368,9 @@ class EventsContainerComponent(BaseComponent): def should_be_toolbar(self) -> None: """Проверка наличия тулбара""" - loc = self.container_locator.locator("//nav[contains(@class, 'v-toolbar')]").nth(0) + loc = self.container_locator.locator(self.toolbar_locator) self.toolbar.check_toolbar_presence_by_locator(loc, "Toolbar is missing") - def should_be_base_toolbar_buttons(self) -> None: - """Проверяет наличие и видимость базовых кнопок тулбара.""" - - self.toolbar.check_button_visibility("filter_button") - self.toolbar.check_button_visibility("export_to_pdf_button") - self.toolbar.check_button_tooltip("export_to_pdf_button", "Скачать в формате PDF") - self.toolbar.check_button_visibility("export_to_csv_button") - self.toolbar.check_button_tooltip("export_to_csv_button", "Скачать в формате CSV") - - def should_be_pagination_buttons(self) -> None: """Проверяет наличие и видимость кнопок пагинации.""" diff --git a/components_derived/container_system_log_events.py b/components_derived/container_system_log_events.py index d4f6dac..fafabc2 100644 --- a/components_derived/container_system_log_events.py +++ b/components_derived/container_system_log_events.py @@ -6,7 +6,7 @@ from playwright.sync_api import Page, Locator from tools.logger import get_logger -from locators.toolbar_locators import ToolbarLocators +from locators.event_panel_locators import EventPanelLocators from components.events_container_component import EventsContainerComponent logger = get_logger("SYSTEM_LOG_EVENTS_CONTAINER") @@ -28,12 +28,17 @@ class SystemLogEventsContainer(EventsContainerComponent): super().__init__(page, locator) - self.add_tab_to_toolbar(ToolbarLocators.TABS, "events") + toolbar_locator = self.get_locator(locator).locator(EventPanelLocators.TOOLBAR) - sidebar_filter = self.get_sidebar_filter() - sidebar_filter.add_filtering_parameter("filter_type", "Тип") - sidebar_filter.add_filtering_parameter("filter_strictness", "Критичность") - sidebar_filter.add_filtering_parameter("filter_host", "Объект") + self.add_tab_to_toolbar(toolbar_locator.locator(EventPanelLocators.FILTER_TOOLBAR_BUTTON), "filter_button") + self.add_tab_to_toolbar(toolbar_locator.locator(EventPanelLocators.EVENTS_TOOLBAR_BUTTON), "view_events_button") + self.add_tab_to_toolbar(toolbar_locator.locator(EventPanelLocators.PDF_TOOLBAR_BUTTON), "export_to_pdf_button") + self.add_tab_to_toolbar(toolbar_locator.locator(EventPanelLocators.CSV_TOOLBAR_BUTTON), "export_to_csv_button") + + events_filter = self.get_events_filter() + events_filter.add_filtering_parameter("filter_type", "Тип") + events_filter.add_filtering_parameter("filter_strictness", "Критичность") + events_filter.add_filtering_parameter("filter_object", "Объект") # Действия: # Проверки: @@ -43,11 +48,11 @@ class SystemLogEventsContainer(EventsContainerComponent): expected_headers = ['ТИП', 'ВРЕМЯ', 'КРИТИЧНОСТЬ', 'ОБЪЕКТ', 'ОПИСАНИЕ'] self.should_be_toolbar() - self.should_be_base_toolbar_buttons() + self.should_be_toolbar_buttons() - events_tab = self.get_toolbar_tab_button("events") - events_tab_text = events_tab.get_text(0) - assert events_tab_text.find("События") != -1, "Tab button with text События is missing on toolbar" + if not self.is_tab_active("view_events_button"): + self.click_tab_button("view_events_button") + self.wait_for_timeout(1000) self.should_be_events_table() events_table = self.get_events_table_content() @@ -62,17 +67,25 @@ class SystemLogEventsContainer(EventsContainerComponent): self.should_be_pagination_buttons() - sidebar_filter = self.click_filter_button() - sidebar_filter.check_content() + events_filter = self.click_filter_button() + events_filter.check_content() - filter_type_bar = sidebar_filter.get_filtering_parameter("filter_type") + filter_type_bar = events_filter.get_filtering_parameter("filter_type") filter_type_title = filter_type_bar.get_selection_bar_title() assert filter_type_title == "Тип", "Filtering parameter bar 'Тип' is missing" - filter_strictness_bar = sidebar_filter.get_filtering_parameter("filter_strictness") + filter_strictness_bar = events_filter.get_filtering_parameter("filter_strictness") filter_strictness_title = filter_strictness_bar.get_selection_bar_title() assert filter_strictness_title == "Критичность", "Filtering parameter bar 'Критичность' is missing" - filter_host_bar = sidebar_filter.get_filtering_parameter("filter_host") - filter_host_title = filter_host_bar.get_selection_bar_title() - assert filter_host_title == "Объект", "Filtering parameter bar 'Объект' is missing" + filter_object_bar = events_filter.get_filtering_parameter("filter_object") + filter_object_title = filter_object_bar.get_selection_bar_title() + assert filter_object_title == "Объект", "Filtering parameter bar 'Объект' is missing" + + def should_be_toolbar_buttons(self) -> None: + """Проверяет наличие и видимость кнопок тулбара.""" + + self.toolbar.check_button_visibility("filter_button") + self.toolbar.check_button_visibility("view_events_button") + self.toolbar.check_button_visibility("export_to_pdf_button") + self.toolbar.check_button_visibility("export_to_csv_button") diff --git a/components_derived/sidebar_filter_component.py b/components_derived/events_filter_panel.py similarity index 60% rename from components_derived/sidebar_filter_component.py rename to components_derived/events_filter_panel.py index 6eb6196..6793142 100644 --- a/components_derived/sidebar_filter_component.py +++ b/components_derived/events_filter_panel.py @@ -1,59 +1,52 @@ -"""Модуль компонента боковой панели формы ввода полей фильтрации отображения данных в панели событий. Содержит класс +"""Модуль панели формы ввода полей фильтрации отображения данных в панели событий. Содержит класс для работы с формами ввода, их элементами и проверками.""" from playwright.sync_api import Page, Locator from tools.logger import get_logger from elements.button_element import Button -from components.toolbar_component import ToolbarComponent from components.base_component import BaseComponent from components_derived.selection_bar_component import SelectionBarComponent from components_derived.date_input_component import DateInput -logger = get_logger("SIDEBAR_FILTER") +logger = get_logger("EVENTS_FILTER_PANEL") -class SidebarFilterComponent(BaseComponent): - """Компонент боковой панели формы ввода полей фильтрации отображения данных в панели событий. Предоставляет методы +class EventsFilterPanel(BaseComponent): + """Панель формы ввода полей фильтрации отображения данных в панели событий. Предоставляет методы для взаимодействия с формой, ее содержимым и проверок.""" - def __init__(self, page: Page, locator: str | Locator): - """Инициализирует компонент боковой панели формы ввода параметров фильтрации. + def __init__(self, page: Page): + """Инициализирует компонент модального окна формы ввода параметров фильтрации. Args: page: Экземпляр страницы Playwright - locator: Локатор контейнера (строка или объект Locator) для которого вызывается панель """ super().__init__(page) - self.sidebar_locator = self.get_locator(locator) - - self.toolbar = ToolbarComponent(page, "Настройки и параметры") + self.events_filter_locator = self.page.locator("div.menuable__content__active div.scrollarea__body") # Поля ввода даты начала и даты окончания события - self.start_time_filter = DateInput(page, - self.sidebar_locator.locator( - "//div[contains(@class, 'scrollarea__body')]/div").nth(0)) - self.finish_time_filter = DateInput(page, - self.sidebar_locator.locator( - "//div[contains(@class, 'scrollarea__body')]/div").nth(1)) + loc = self.page.locator("div.menuable__content__active div.scrollarea__body").locator("//div/div").nth(0) + self.start_time_filter = DateInput(page, loc) + loc = self.page.locator("div.menuable__content__active div.scrollarea__body > div > div:nth-child(3)") + self.finish_time_filter = DateInput(page, loc) # Поля задания параметров фильтрации (произвольное количество) self.filtering_parameters = {} # Кнопки задания/сброса параметров фильтрации self.apply_button = Button(page, - self.sidebar_locator.get_by_role("button").filter(has_text='Применить Фильтры'), + self.page.get_by_role("button").filter(has_text='Применить Фильтры'), "apply_button") self.reset_button = Button(page, - self.sidebar_locator.get_by_role("button").filter(has_text='Сбросить Фильтры'), + self.page.get_by_role("button").filter(has_text='Сбросить Фильтры'), "reset_button") # Действия: def add_filtering_parameter(self, name: str, title: str) -> None: """Добавляет поле задания параметров фильтрации по заданному имени.""" - loc = self.sidebar_locator.locator("//div[contains(@class, 'scrollarea__body')]").\ - get_by_role("combobox").filter(has_text=title) + loc = self.events_filter_locator.get_by_role("combobox").filter(has_text=title) self.filtering_parameters[name] = SelectionBarComponent(self.page, loc) def get_filtering_parameter(self, name: str) -> SelectionBarComponent | None: @@ -85,7 +78,6 @@ class SidebarFilterComponent(BaseComponent): def check_content(self) -> None: """Проверяет наличие постоянных полей панели параметров фильтрации.""" - self.should_be_toolbar() self.start_time_filter.check_content("Дата начала") self.finish_time_filter.check_content("Дата окончания") @@ -107,13 +99,3 @@ class SidebarFilterComponent(BaseComponent): """Проверяет наличие кнопки сброса фильтра.""" self.reset_button.check_visibility("Reset Filter Button is missing") - - def should_be_toolbar(self) -> None: - """Проверяет наличие тулбара. - - Raises: - AssertionError: Если тулбар отсутствует. - """ - - self.toolbar.check_toolbar_presence_by_locator_and_title(self.sidebar_locator, - "Sidebar Filter form toolbar is missing") diff --git a/elements/base_element.py b/elements/base_element.py index 8ce5126..840ce9f 100644 --- a/elements/base_element.py +++ b/elements/base_element.py @@ -58,6 +58,11 @@ class BaseElement: logger.info(f"Get text for {self.type_of} '{self.name}'") return self.locator.nth(index).text_content() + def get_locator(self) -> Locator: + """Возвращает локатор элемента.""" + + return self.locator + def update_locator(self, new_locator: Locator) -> None: """Меняет значение локатора для элемента""" diff --git a/locators/event_panel_locators.py b/locators/event_panel_locators.py index b91880b..6d92362 100644 --- a/locators/event_panel_locators.py +++ b/locators/event_panel_locators.py @@ -8,31 +8,42 @@ class EventPanelLocators: """Локаторы элементов панели событий. Содержит XPath локаторы для: - TABS_BLOCK (str): блока кнопок в панели событий. - TAB_EXPAND_BUTTONS (str): блока кнопок расширения панели событий. + AREA_EVENTS (str): рабочей области страницы. + BUTTON_EXPAND_LESS (str): кнопки сжатия рабочей области отображения содержимого панели событий. + BUTTON_EXPAND_MORE (str): кнопки расширения рабочей области отображения содержимого панели событий. TAB_STATES (str): кнопки Состояния. TAB_ACTIONS (str): кнопки Действия. TAB_EVENTS (str): кнопки События. TAB_MAINTENANCE (str): кнопки Обслуживания. TAB_SYSTEM_LOG (str): кнопки Системный журнал. - CONTAINER_SYSTEM_LOG_EVENTS (str): контейнера с событиями Системного журнала. + TAB_AUDIT (str): кнопки Аудит. BUTTONS_EVENT (str): блока кнопок-счетчиков событий. - BUTTONS_SERVICE (str): блока кнопок, содержащего кнопки Поиска и Текущего пользователя. - AREA_EVENTS (str): рабочей области страницы. + BUTTON_USER (str): кнопки текущего пользователя. + CONTAINER_SYSTEM_LOG_EVENTS (str): контейнера с событиями Системного журнала. """ - TABS_BLOCK = "//nav/div[@class='v-toolbar__content']/div[@class='v-toolbar__items'][1]" - TAB_EXPAND_BUTTONS = f"{TABS_BLOCK}/div[1]/div[1]/div" - TAB_STATES = f"{TABS_BLOCK}//div[@class='v-tabs']//div[@class='v-tabs__container']/div[2]" - TAB_ACTIONS = f"{TABS_BLOCK}//div[@class='v-tabs']//div[@class='v-tabs__container']/div[3]" - TAB_EVENTS = f"{TABS_BLOCK}//div[@class='v-tabs']//div[@class='v-tabs__container']/div[4]" - TAB_MAINTENANCE = f"{TABS_BLOCK}//div[@class='v-tabs']//div[@class='v-tabs__container']/div[5]" - TAB_SYSTEM_LOG = f"{TABS_BLOCK}//div[@class='v-tabs']//div[@class='v-tabs__container']/div[6]" + AREA_EVENTS = "#app > div.application--wrap > div > div:nth-child(3)" - CONTAINER_SYSTEM_LOG_EVENTS = "#app > div.application--wrap > div > div:nth-child(3) > div:nth-child(5)" + BUTTON_EXPAND_LESS = "//button[contains(@data-testid, 'BASELINE__btn__toolbar_close')]" + BUTTON_EXPAND_MORE = "//button[contains(@data-testid, 'BASELINE__btn__toolbar_open')]" + TAB_STATES = "//div[@data-testid='BASELINE__states_tab__toolbar']" + TAB_ACTIONS = "//div[@data-testid='BASELINE__actions_tab__toolbar']" + TAB_EVENTS = "//div[@data-testid='BASELINE__events_tab__toolbar']" + TAB_MAINTENANCE = "//div[@data-testid='BASELINE__service_tab__toolbar']" + TAB_SYSTEM_LOG = "//div[@data-testid='BASELINE__system journal_tab__toolbar']" + TAB_AUDIT = "//div[@data-testid='BASELINE__audit_tab__toolbar']" BUTTONS_EVENT = "//nav/div[@class='v-toolbar__content']/div[@class='v-toolbar__items'][2]//span[contains(@class, 'v-tooltip')]" - BUTTONS_SERVICE = "//nav/div[@class='v-toolbar__content']/div[@class='v-toolbar__items'][2]" - AREA_EVENTS = "#app > div.application--wrap > div > div:nth-child(3)" + BUTTON_USER = "//button[@data-testid='BASELINE__btn__user']" + + TOOLBAR = "//nav[contains(@class, 'v-toolbar')]" + TABLE = "//div[@class='scrolltable']/div/table" + + FILTER_TOOLBAR_BUTTON = "//div[contains(@class, 'journal-tab-button')]//span[text()='Фильтр']" + EVENTS_TOOLBAR_BUTTON = "//div[contains(@class, 'journal-tab-button')]//span[text()='События']" + PDF_TOOLBAR_BUTTON = "//div[contains(@class, 'journal-tab-button')]//span[text()='pdf']" + CSV_TOOLBAR_BUTTON = "//div[contains(@class, 'journal-tab-button')]//span[text()='csv']" + + CONTAINER_SYSTEM_LOG_EVENTS = "#app > div.application--wrap > div > div:nth-child(3) > div:nth-child(5)" diff --git a/tests/e2e/test_event_panel.py b/tests/e2e/test_event_panel.py index 07957ef..d0f64ef 100644 --- a/tests/e2e/test_event_panel.py +++ b/tests/e2e/test_event_panel.py @@ -4,7 +4,7 @@ панели событий в приложении. """ -# import pytest +import pytest from playwright.sync_api import Page from pages.main_page import MainPage from pages.login_page import LoginPage @@ -16,7 +16,8 @@ class TestEventPanel: Тесты покрывают следующие сценарии: 1. test_event_panel_content: Проверяет содержимое панели событий - 2. test_event_panel_expand_buttons: Проверяет состояние и количество кнопок расширения рабочей области панели событий + 2. test_event_panel_expand_buttons: Проверяет состояние и количество кнопок расширения рабочей области панели + событий Атрибуты: browser: Фикстура для работы с браузером. @@ -48,6 +49,7 @@ class TestEventPanel: if button_counter != counter: assert False, f"Expected tooltip value {counter} is not equal button value {button_counter} for event button {event}" + @pytest.mark.develop def test_event_panel_expand_buttons(self, browser: Page) -> None: """Проверяет состояние и количество кнопок расширения рабочей области панели событий. @@ -60,16 +62,16 @@ class TestEventPanel: mp = MainPage(browser) - # Проверяем начальное состояние - панель событий внизу, видна одна кнопка expand less + # Проверяем начальное состояние - панель событий внизу, видна одна кнопка expand more current_position = mp.get_events_panel_position() assert current_position == "bottom", \ "Events panel should be located on main page bottom" - assert mp.check_expand_less_button(), \ - "Expand less button should be present" assert mp.check_expand_more_button(), \ - "Expand more button should be absent" + "Expand more button should be present" + assert mp.check_expand_less_button(), \ + "Expand less button should be absent" - mp.click_events_panel_expand_less_button() + mp.click_events_panel_expand_more_button() mp.wait_for_timeout(500) # Проверяем, что панель событий переместилась в середину экрана, @@ -82,21 +84,21 @@ class TestEventPanel: assert mp.check_expand_more_button(), \ "Expand more button should be present" - mp.click_events_panel_expand_less_button() + mp.click_events_panel_expand_more_button() mp.wait_for_timeout(500) # Проверяем, что панель событий находится вверху экрана, - # видна кнопки expand more и отсутствует expand less + # видна кнопки expand less и отсутствует expand more current_position = mp.get_events_panel_position() assert current_position == "top", \ "Events panel should be located on main page top" - assert mp.check_expand_less_button(), \ - "Expand less button should be absent" assert mp.check_expand_more_button(), \ - "Expand more button should be present" + "Expand more button should be absent" + assert mp.check_expand_less_button(), \ + "Expand less button should be present" - # перемещение в отратном напрвлении сверху вниз - mp.click_events_panel_expand_more_button() + # перемещение в отратном направлении сверху вниз + mp.click_events_panel_expand_less_button() mp.wait_for_timeout(500) current_position = mp.get_events_panel_position() @@ -107,13 +109,13 @@ class TestEventPanel: assert mp.check_expand_more_button(), \ "Expand more button should be present" - mp.click_events_panel_expand_more_button() + mp.click_events_panel_expand_less_button() mp.wait_for_timeout(500) current_position = mp.get_events_panel_position() assert current_position == "bottom", \ "Events panel should be located on main page bottom" - assert mp.check_expand_less_button(), \ - "Expand less button should be present" assert mp.check_expand_more_button(), \ - "Expand more button should be absent" + "Expand more button should be present" + assert mp.check_expand_more_button(), \ + "Expand less button should be absent" diff --git a/tests/e2e/test_system_log_events_container.py b/tests/e2e/test_system_log_events_container.py index de6da92..576dbe7 100644 --- a/tests/e2e/test_system_log_events_container.py +++ b/tests/e2e/test_system_log_events_container.py @@ -4,7 +4,7 @@ контейнера для отображения событий системного журнала. """ -import pytest +# import pytest from playwright.sync_api import Page from pages.main_page import MainPage from pages.login_page import LoginPage @@ -102,9 +102,9 @@ class TestSystemLogEventsContainer: system_log_events_container.check_events_table_first_row_visibility() # Раскрываем панель полностью и проверяем скроллинг - assert mp.check_expand_less_button(), \ - "Expand less button should be present" - mp.click_events_panel_expand_less_button() + assert mp.check_expand_more_button(), \ + "Expand more button should be present" + mp.click_events_panel_expand_more_button() mp.wait_for_timeout(500) events_panel_position = mp.get_events_panel_position() @@ -144,7 +144,7 @@ class TestSystemLogEventsContainer: system_log_events_container = mp.click_events_panel_system_log_tab() - index = 1 + index = 0 state = system_log_events_container.get_arrow_button_state(index) assert state == "down", "Arrow button should be down"