diff --git a/components/eventbar_component.py b/components/eventbar_component.py index d65bb69..3342851 100644 --- a/components/eventbar_component.py +++ b/components/eventbar_component.py @@ -43,8 +43,8 @@ class EventPanelComponent(BaseComponent): 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.unknown_reason_button = TooltipButton(page, page.locator(EventPanelLocators.BUTTONS_EVENT).nth(0), "unknown_reason_button") self.warning_button = TooltipButton(page, diff --git a/components_derived/container_actions_events.py b/components_derived/container_actions_events.py index ba48ae6..22ded36 100644 --- a/components_derived/container_actions_events.py +++ b/components_derived/container_actions_events.py @@ -96,22 +96,12 @@ class ActionsEventsContainer(EventsContainerComponent): events_filter = self.click_filter_button() events_filter.check_content() - filter_status_bar = events_filter.get_filtering_parameter("filter_status") - filter_status_title = filter_status_bar.get_selection_bar_title() - assert filter_status_title == "Статус", "Filtering parameter bar 'Статус' is missing" + events_filter.should_be_filtering_parameter("Статус") + events_filter.should_be_filtering_parameter("НАИМЕНОВАНИЕ ЗАДАЧИ") + events_filter.should_be_filtering_parameter("Объект") + events_filter.should_be_filtering_parameter("Пользователь") - filter_task_name_bar = events_filter.get_filtering_parameter("filter_task_name") - filter_task_name_title = filter_task_name_bar.get_selection_bar_title() - assert filter_task_name_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" - - filter_user_bar = events_filter.get_filtering_parameter("filter_user") - filter_user_title = filter_user_bar.get_selection_bar_title() - assert filter_user_title == "Пользователь", "Filtering parameter bar 'Пользователь' is missing" + events_filter.click_close_button() def check_events_table_content(self, expected_headers: list[str]) -> None: """Проверка содержимого таблицы""" diff --git a/components_derived/container_audit_events.py b/components_derived/container_audit_events.py index a82de7b..210032f 100644 --- a/components_derived/container_audit_events.py +++ b/components_derived/container_audit_events.py @@ -47,7 +47,6 @@ class AuditEventsContainer(EventsContainerComponent): """Проверяет содержимое контейнера для отображения событий аудита.""" expected_headers = [ 'ВРЕМЯ', 'ОПИСАНИЕ', 'ИДЕНТИФИКАТОР'] - expected_headers_security = [ 'ВРЕМЯ', 'ОПИСАНИЕ', 'ИДЕНТИФИКАТОР', 'ТИП'] self.should_be_toolbar() self.should_be_toolbar_buttons() @@ -72,21 +71,12 @@ class AuditEventsContainer(EventsContainerComponent): events_filter = self.click_filter_button() events_filter.check_content() - 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" + events_filter.should_be_filtering_parameter("Тип") + events_filter.should_be_filtering_parameter("Роль") + events_filter.should_be_filtering_parameter("Имя") + events_filter.should_be_filtering_parameter("ip") - filter_role_bar = events_filter.get_filtering_parameter("filter_role") - filter_role_title = filter_role_bar.get_selection_bar_title() - assert filter_role_title == "Роль", "Filtering parameter bar 'Роль' is missing" - - filter_name_bar = events_filter.get_filtering_parameter("filter_name") - filter_name_title = filter_name_bar.get_selection_bar_title() - assert filter_name_title == "Имя", "Filtering parameter bar 'Имя' is missing" - - filter_ip_bar = events_filter.get_filtering_parameter("filter_ip") - filter_ip_title = filter_ip_bar.get_selection_bar_title() - assert filter_ip_title == "ip", "Filtering parameter bar 'ip' is missing" + events_filter.click_close_button() def check_content_security(self) -> None: """Проверяет содержимое контейнера для отображения событий безопасности.""" @@ -116,21 +106,12 @@ class AuditEventsContainer(EventsContainerComponent): events_filter = self.click_filter_button() events_filter.check_content() - 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" + events_filter.should_be_filtering_parameter("Тип") + events_filter.should_be_filtering_parameter("Роль") + events_filter.should_be_filtering_parameter("Имя") + events_filter.should_be_filtering_parameter("ip") - filter_role_bar = events_filter.get_filtering_parameter("filter_role") - filter_role_title = filter_role_bar.get_selection_bar_title() - assert filter_role_title == "Роль", "Filtering parameter bar 'Роль' is missing" - - filter_name_bar = events_filter.get_filtering_parameter("filter_name") - filter_name_title = filter_name_bar.get_selection_bar_title() - assert filter_name_title == "Имя", "Filtering parameter bar 'Имя' is missing" - - filter_ip_bar = events_filter.get_filtering_parameter("filter_ip") - filter_ip_title = filter_ip_bar.get_selection_bar_title() - assert filter_ip_title == "ip", "Filtering parameter bar 'ip' is missing" + events_filter.click_close_button() def should_be_toolbar_buttons(self) -> None: """Проверяет наличие и видимость кнопок тулбара.""" diff --git a/components_derived/container_events.py b/components_derived/container_events.py index 759b279..239f428 100644 --- a/components_derived/container_events.py +++ b/components_derived/container_events.py @@ -70,17 +70,11 @@ class EventsTabContainer(EventsContainerComponent): events_filter = self.click_filter_button() events_filter.check_content() - 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" + events_filter.should_be_filtering_parameter("Тип") + events_filter.should_be_filtering_parameter("Критичность") + events_filter.should_be_filtering_parameter("Объект") - 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_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" + events_filter.click_close_button() def should_be_toolbar_buttons(self) -> None: """Проверяет наличие и видимость кнопок тулбара.""" diff --git a/components_derived/container_maintenance_events.py b/components_derived/container_maintenance_events.py index a48fa48..0e6103e 100644 --- a/components_derived/container_maintenance_events.py +++ b/components_derived/container_maintenance_events.py @@ -76,34 +76,15 @@ class MaintenanceEventsContainer(EventsContainerComponent): events_filter = self.click_filter_button() events_filter.check_content() - filter_date_bar = events_filter.get_filtering_parameter("filter_date") - filter_date_title = filter_date_bar.get_selection_bar_title() - assert filter_date_title == "Дата", "Filtering parameter bar 'Дата' is missing" + events_filter.should_be_filtering_parameter("Дата") + events_filter.should_be_filtering_parameter("Наименование события") + events_filter.should_be_filtering_parameter("Тип") + events_filter.should_be_filtering_parameter("Состояние") + events_filter.should_be_filtering_parameter("Объект") + events_filter.should_be_filtering_parameter("Автор") + events_filter.should_be_filtering_parameter("Расположение") - filter_event_name_bar = events_filter.get_filtering_parameter("filter_event_name") - filter_event_name_title = filter_event_name_bar.get_selection_bar_title() - assert filter_event_name_title == "Наименование события", \ - "Filtering parameter bar 'Наименование события' is missing" - - 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_status_bar = events_filter.get_filtering_parameter("filter_status") - filter_status_title = filter_status_bar.get_selection_bar_title() - assert filter_status_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" - - filter_author_bar = events_filter.get_filtering_parameter("filter_author") - filter_author_title = filter_author_bar.get_selection_bar_title() - assert filter_author_title == "Автор", "Filtering parameter bar 'Автор' is missing" - - filter_location_bar = events_filter.get_filtering_parameter("filter_location") - filter_location_title = filter_location_bar.get_selection_bar_title() - assert filter_location_title == "Расположение", "Filtering parameter bar 'Расположение' is missing" + events_filter.click_close_button() def should_be_toolbar_buttons(self) -> None: """Проверяет наличие и видимость кнопок тулбара.""" diff --git a/components_derived/container_system_log_events.py b/components_derived/container_system_log_events.py index 0b16420..ef34b9a 100644 --- a/components_derived/container_system_log_events.py +++ b/components_derived/container_system_log_events.py @@ -70,17 +70,11 @@ class SystemLogEventsContainer(EventsContainerComponent): events_filter = self.click_filter_button() events_filter.check_content() - 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" + events_filter.should_be_filtering_parameter("Тип") + events_filter.should_be_filtering_parameter("Критичность") + events_filter.should_be_filtering_parameter("Объект") - 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_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" + events_filter.click_close_button() def should_be_toolbar_buttons(self) -> None: """Проверяет наличие и видимость кнопок тулбара.""" diff --git a/components_derived/events_filter_panel.py b/components_derived/events_filter_panel.py index be674fe..bad1234 100644 --- a/components_derived/events_filter_panel.py +++ b/components_derived/events_filter_panel.py @@ -1,7 +1,7 @@ """Модуль панели формы ввода полей фильтрации отображения данных в панели событий. Содержит класс для работы с формами ввода, их элементами и проверками.""" -from playwright.sync_api import Page, Locator +from playwright.sync_api import Page, Locator, expect from tools.logger import get_logger from elements.button_element import Button from components.base_component import BaseComponent @@ -43,12 +43,16 @@ class EventsFilterPanel(BaseComponent): self.reset_button = Button(page, self.page.get_by_role("button").filter(has_text='Сбросить Фильтры'), "reset_button") + self.close_button = Button(page, + self.page.get_by_role("button").filter(has_text='Закрыть'), + "close_button") # Действия: def add_filtering_parameter(self, name: str, title: str) -> None: """Добавляет поле задания параметров фильтрации по заданному имени.""" - loc = self.events_filter_locator.get_by_role("combobox").filter(has_text=title) + # loc = self.events_filter_locator.get_by_role("combobox").filter(has_text=title) + loc = self.events_filter_locator.get_by_role("combobox").get_by_placeholder(title) self.filtering_parameters[name] = SelectionBarComponent(self.page, loc) def get_filtering_parameter(self, name: str) -> SelectionBarComponent | None: @@ -76,6 +80,11 @@ class EventsFilterPanel(BaseComponent): self.reset_button.click() + def click_close_button(self) -> None: + """Клик по кнопке закрытия окна фильтрации.""" + + self.close_button.click() + # Проверки: def check_content(self) -> None: """Проверяет наличие постоянных полей панели параметров фильтрации.""" @@ -85,7 +94,7 @@ class EventsFilterPanel(BaseComponent): self.check_apply_button_visibility() self.check_reset_button_visibility() - + self.check_close_button_visibility() def check_vertical_scrolling(self, locator: str| Locator) -> bool: """Проверяет возможность вертикальной прокрутки формы.""" @@ -97,7 +106,18 @@ class EventsFilterPanel(BaseComponent): self.apply_button.check_visibility("Apply Filter Button is missing") + def check_close_button_visibility(self) -> None: + """Проверяет наличие кнопки закрытия окна фильтрации.""" + + self.close_button.check_visibility("Close Filter window Button is missing") + def check_reset_button_visibility(self) -> None: """Проверяет наличие кнопки сброса фильтра.""" self.reset_button.check_visibility("Reset Filter Button is missing") + + def should_be_filtering_parameter(self, title: str) -> None: + """Проверяет наличие поля панели параметров фильтрации по его заголовку.""" + + loc = self.events_filter_locator.get_by_role("combobox").get_by_placeholder(title) + expect(loc).to_be_visible(), f"Filtering parameter bar '{title}' is missing" diff --git a/components_derived/modal_edit_user.py b/components_derived/modal_edit_user.py index 0c0598d..de80679 100644 --- a/components_derived/modal_edit_user.py +++ b/components_derived/modal_edit_user.py @@ -57,7 +57,7 @@ class EditUserModalWindow(ModalWindowComponent): self.add_content_item("name_input", name_input) # Поле Роль - role_loc = self.page.locator(input_form_locator).get_by_role("combobox").first + role_loc = elements_locators.get("Роль").get_by_role("combobox").first role_input = TextInput(page, role_loc, "role_input") self.add_content_item("role_input", role_input) self.add_content_item("roles_list", DropdownList(page)) @@ -240,16 +240,6 @@ class EditUserModalWindow(ModalWindowComponent): reset_password_button = self.get_button_by_name("reset_password") reset_password_button.click() - # def _get_fields_locators(self, page) -> dict: - # fields_locators = {} - # elements = page.locator(ModalWindowLocators.INPUT_FORM_USER_DATA). \ - # locator("div.v-text-field__slot > input").all() - # for el in elements: - # val = el.input_value().strip() - # if val: - # fields_locators[val] = el.locator("../ancestor::div[5]") - # return fields_locators - # Проверки: def check_content(self, user_name, role): """Проверяет наличие и корректность элементов окна. diff --git a/locators/event_panel_locators.py b/locators/event_panel_locators.py index 2927301..9113b41 100644 --- a/locators/event_panel_locators.py +++ b/locators/event_panel_locators.py @@ -19,7 +19,11 @@ class EventPanelLocators: TAB_AUDIT (str): кнопки Аудит. BUTTONS_EVENT (str): блока кнопок-счетчиков событий. BUTTON_USER (str): кнопки текущего пользователя. + CONTAINER_ACTIONS_TAB (str): контейнера для отображения событий вкладки Действия. + CONTAINER_EVENTS_TAB (str): контейнера для отображения событий вкладки События. + CONTAINER_MAINTENANCE_EVENTS (str): контейнера для отображения событий обслуживания. CONTAINER_SYSTEM_LOG_EVENTS (str): контейнера с событиями Системного журнала. + CONTAINER_AUDIT_EVENTS (str): контейнера для отображения событий аудита. """ AREA_EVENTS = "#app > div.application--wrap > div > div:nth-child(1)" @@ -27,6 +31,7 @@ class EventPanelLocators: BUTTON_EXPAND_LESS = "//button[contains(@data-testid, 'BASELINE__btn__toolbar_close')]" BUTTON_EXPAND_MORE = "//button[contains(@data-testid, 'BASELINE__btn__toolbar_open')]" + TABS_TOOLBAR = "//div[@data-testid='BASELINE__tabs__toolbar']" 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']" @@ -34,7 +39,7 @@ class EventPanelLocators: 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_EVENT = "//button[@data-testid='BASELINE__btn__user']/preceding-sibling::div//span[contains(@class, 'v-tooltip')]" BUTTON_USER = "//button[@data-testid='BASELINE__btn__user']" diff --git a/tests/e2e/event_panel/test_system_log_events_container.py b/tests/e2e/event_panel/test_system_log_events_container.py index 982b554..223fa2e 100644 --- a/tests/e2e/event_panel/test_system_log_events_container.py +++ b/tests/e2e/event_panel/test_system_log_events_container.py @@ -20,7 +20,7 @@ class TestSystemLogEventsContainer: Атрибуты: browser: Фикстура для работы с браузером. """ - @pytest.mark.develop + # @pytest.mark.develop def test_system_log_events_content(self, browser: Page) -> None: """Проверяет содержимое контейнера для отображения событий системного журнала. diff --git a/tests/e2e/test_expand_navigation_panel.py b/tests/e2e/test_expand_navigation_panel.py index e07fe51..59ca04f 100644 --- a/tests/e2e/test_expand_navigation_panel.py +++ b/tests/e2e/test_expand_navigation_panel.py @@ -102,7 +102,7 @@ class TestNavigationPanel: mp.wait_for_timeout(5000) - mp.click_subpanel_item("test-zone") + mp.click_subpanel_item("test-zone-01") mp.wait_for_timeout(3000) # Переходим к Стойке diff --git a/tests/e2e/users/test_edit_user.py b/tests/e2e/users/test_edit_user.py index 88860ce..480ce38 100644 --- a/tests/e2e/users/test_edit_user.py +++ b/tests/e2e/users/test_edit_user.py @@ -46,10 +46,12 @@ class TestUsersTabEditUser: # Выход из системы текущего пользователя mp = MainPage(browser) + mp.wait_for_timeout(500) mp.do_logout() # Авторизация администратором для очистки login_page = LoginPage(browser) + mp.wait_for_timeout(300) login_page.do_login() # Удаляем тестовых пользователей @@ -82,7 +84,7 @@ class TestUsersTabEditUser: ut = UsersTab(browser) browser.wait_for_timeout(500) - + user_name, role = ut.open_edit_user_page_by_index(0) ut.check_edit_user_window_content(user_name, role) @@ -95,7 +97,7 @@ class TestUsersTabEditUser: ut = UsersTab(browser) browser.wait_for_timeout(500) - + user_name, _ = ut.open_edit_user_page_by_index(0) ut.close_edit_user_window_by_toolbar_button(user_name) user_name, _ = ut.open_edit_user_page_by_index(0) diff --git a/tests/e2e/users/test_user_card.py b/tests/e2e/users/test_user_card.py index 88a40ef..d0a2420 100644 --- a/tests/e2e/users/test_user_card.py +++ b/tests/e2e/users/test_user_card.py @@ -180,7 +180,7 @@ class TestUserCard: is_changed, error = change_password_window.change_password(user_data["password"], user_data["new_password"]) assert is_changed, f"Unsucessful attempt to change password: {error}" - # @pytest.mark.develop + @pytest.mark.develop def test_change_password_unsuccessful(self, browser: Page, create_user: None, cleanup_user: None) -> None: @@ -199,6 +199,7 @@ class TestUserCard: # Значение полей нового пароля и подтверждения нового пароля не совпадают user_card = mp.click_user_button() + mp.wait_for_timeout(500) change_password_window = user_card.click_change_password_button() password_inputs = change_password_window.get_password_inputs() @@ -211,13 +212,16 @@ class TestUserCard: # Используется неправильный старый пароль user_card = mp.click_user_button() + mp.wait_for_timeout(500) change_password_window = user_card.click_change_password_button() is_changed, _ = change_password_window.change_password("123456789123", user_data["new_password"]) assert not is_changed, "Sucessful attempt to change password for incorrect old password" change_password_window.click_cancel_button() + # Пустое поле ввода пароля на примере поля ввода старого пароля user_card = mp.click_user_button() + mp.wait_for_timeout(500) change_password_window = user_card.click_change_password_button() is_changed, error = change_password_window.change_password("", user_data["new_password"]) assert not is_changed, "Sucessful attempt to change password for empty old password input"