From e8f42aa4809f19a73ff8ce35c482ddf9e3305d49 Mon Sep 17 00:00:00 2001 From: Radislav Date: Mon, 19 Jan 2026 13:59:46 +0300 Subject: [PATCH] =?UTF-8?q?refactor(test=5Felement=5Frack):=20=D0=BE=D0=BF?= =?UTF-8?q?=D1=82=D0=B8=D0=BC=D0=B8=D0=B7=D0=B0=D1=86=D0=B8=D1=8F=20=D1=82?= =?UTF-8?q?=D0=B5=D1=81=D1=82=D0=BE=D0=B2=20=D1=81=D1=82=D0=BE=D0=B9=D0=BA?= =?UTF-8?q?=D0=B8=20=D0=BE=D0=B1=D0=BE=D1=80=D1=83=D0=B4=D0=BE=D0=B2=D0=B0?= =?UTF-8?q?=D0=BD=D0=B8=D1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tests/e2e/elements/test_element_rack.py | 196 ++++++++++++++++++++---- 1 file changed, 165 insertions(+), 31 deletions(-) diff --git a/tests/e2e/elements/test_element_rack.py b/tests/e2e/elements/test_element_rack.py index e3c6770..ecf8292 100644 --- a/tests/e2e/elements/test_element_rack.py +++ b/tests/e2e/elements/test_element_rack.py @@ -6,12 +6,17 @@ import pytest from playwright.sync_api import Page -from pages.rack_page import RackPage +from locators.navigation_panel_locators import NavigationPanelLocators +from components_derived.accounting_objects.rack_maker import RackObjectMaker, RackData +from components_derived.frames.create_child_element_frame import CreateChildElementFrame +from pages.location_page import LocationPage from pages.login_page import LoginPage from pages.main_page import MainPage +from pages.rack_page import RackPage +# Константы +RACK_NAME = "Test-Rack-Functionality" -# @pytest.mark.smoke class TestRackTab: """Набор тестов для вкладки 'Стойка' в модуле Объекты. @@ -23,41 +28,178 @@ class TestRackTab: 2. test_rack_tab_switching - Функциональность переключения между вкладками стойки """ + # Инициализируем атрибуты + main_page: MainPage = None + location_page: LocationPage = None + + def _check_rack_existance(self, browser: Page, rack_name: str) -> bool: + """Проверяет существование стойки. + + Args: + browser: Страница Playwright + rack_name: Имя стойки для проверки + + Returns: + bool: True если стойка существует, False в противном случае + """ + + # Обновляем навигационную панель + self.main_page.wait_for_timeout(500) + self.main_page.click_subpanel_item("test-zone") + + nav_panel_locator = NavigationPanelLocators.TREEVIEW + + # Проверяем видимость элемента + element = browser.locator(nav_panel_locator).get_by_text(rack_name, exact=True).first + + if element.is_visible(): + return True + return False + + def _create_rack(self, browser: Page, rack_name: str) -> None: + """Создает стойку. + + Args: + browser: Страница Playwright + rack_name: Имя стойки для создания + """ + # Нажимаем кнопку "Создать" на тулбаре + self.location_page.click_create_button() + + # Создаем фрейм создания дочернего элемента + create_child_frame = CreateChildElementFrame(browser) + + # Нажимаем на плашку "Класс объекта учета" + create_child_frame.open_object_class_combobox() + + # Из выпадающего меню выбираем пункт "Стойка" + create_child_frame.select_object_class("Стойка") + + # Открывается набор плашек для задания параметров стойки + rack_maker = RackObjectMaker(browser) + + # Создаем объект данных стойки + rack_data = RackData( + name=rack_name, + height="42", + depth="1000" + ) + + # Заполняем данные стойки + rack_maker.fill_rack_data(rack_data) + + # Нажимаем кнопку создания + create_child_frame.click_add_button() + + def _delete_rack_from_context_menu(self, browser: Page, rack_name: str) -> None: + """Удаляет стойку через контекстное меню. + + Args: + browser: Страница Playwright + rack_name: Имя стойки для удаления + """ + + # 1. Находим элемент стойки в навигационной панели + rack_element = browser.locator(NavigationPanelLocators.TREEVIEW).get_by_text(rack_name, exact=True).first + + # Прокручиваем до элемента если нужно + rack_element.scroll_into_view_if_needed() + self.main_page.wait_for_timeout(500) + + # 2. Проверяем и нажимаем кнопку "Изменить" + rack_page = RackPage(browser) + + # Проверяем видимость кнопки + rack_page.toolbar.check_button_visibility("edit") + + # Проверяем тултип кнопки + rack_page.toolbar.check_button_tooltip("edit", "Изменить") + + # Кликаем на кнопку "Изменить" + rack_page.toolbar.get_button_by_name("edit").click() + + # 3. Используем метод click_remove_button, который обрабатывает весь процесс удаления + # включая диалог подтверждения + rack_page.click_remove_button() + @pytest.fixture(scope="function", autouse=True) def setup(self, browser: Page) -> None: """Фикстура для подготовки тестового окружения. Выполняет: 1. Авторизацию в системе - 2. Переход к стойке оборудования через панель навигации: - - Объекты → Физические устройства с опросом → Здание ЦОД 4 → Стойка КСПД + 2. Создание стойки если она не существует + 3. Переход к стойке Args: browser (Page): Экземпляр страницы Playwright для взаимодействия с UI """ - # Авторизация в системе - lp = LoginPage(browser) - lp.do_login() + login_page = LoginPage(browser) + login_page.do_login() # Мы на главной странице - mp = MainPage(browser) - mp.should_be_navigation_panel() - mp.wait_for_timeout(3000) + self.main_page = MainPage(browser) + self.main_page.should_be_navigation_panel() # Переходим к Объектам - mp.click_main_navigation_panel_item("Объекты") - mp.wait_for_timeout(3000) + self.main_page.click_main_navigation_panel_item("Объекты") + self.main_page.wait_for_timeout(1000) + self.main_page.click_main_navigation_panel_item("test-zone") - mp.click_subpanel_item("test-zone") - mp.wait_for_timeout(3000) + # Создаем экземпляр страницы локации + self.location_page = LocationPage(browser) + # Проверяем существование стойки + if not self._check_rack_existance(browser, RACK_NAME): + self._create_rack(browser, RACK_NAME) + self.main_page.wait_for_timeout(3000) - # Переходим к Стойка КСПД с указанием родителя - mp.click_subpanel_item("Test-Rack-01", parent="test-zone") - mp.wait_for_timeout(3000) + # Переходим к стойке для тестирования + self.main_page.click_subpanel_item(RACK_NAME, parent="test-zone") + self.main_page.wait_for_timeout(3000) - @pytest.mark.develop + @pytest.fixture(scope="class", autouse=True) + def cleanup_rack(self, browser: Page): + """Фикстура для очистки созданной стойки после ВСЕХ тестов класса. + + Выполняется один раз после завершения всех тестов класса TestRackTab. + Удаляет созданную стойку. + + Args: + browser: Экземпляр страницы Playwright + """ + # Тесты выполняются здесь + yield + + # Переходим на главную страницу и в нужную зону + login_page = LoginPage(browser) + login_page.do_login() + + self.main_page = MainPage(browser) + self.main_page.should_be_navigation_panel() + + # Переходим к Объектам + self.main_page.click_main_navigation_panel_item("Объекты") + self.main_page.wait_for_timeout(1000) + self.main_page.click_main_navigation_panel_item("test-zone") + self.main_page.wait_for_timeout(1000) + + # Проверяем существование стойки + if self._check_rack_existance(browser, RACK_NAME): + + # Переходим на страницу стойки + self.main_page.click_subpanel_item(RACK_NAME, parent="test-zone") + self.main_page.wait_for_timeout(2000) + + # Удаляем стойку + self._delete_rack_from_context_menu(browser, RACK_NAME) + + # Дополнительная проверка + self.main_page.click_subpanel_item("test-zone") + self.main_page.wait_for_timeout(1000) + + #@pytest.mark.develop def test_rack_tab_content(self, browser: Page) -> None: """Тест содержимого вкладки 'Стойка'. @@ -74,7 +216,7 @@ class TestRackTab: expected_toolbar_subtitles = [ "test-zone", 'chevron_right', - 'Test-Rack-01' + RACK_NAME ] rt = RackPage(browser) @@ -89,21 +231,13 @@ class TestRackTab: # Проверка кнопки "Показать стойку" rt.should_have_show_rack_button() - rt.wait_for_timeout(2000) + rt.wait_for_timeout(1000) def test_rack_tab_switching(self, browser: Page) -> None: """Тест переключения между вкладками стойки оборудования. - Проверяет функциональность переключения на все доступные вкладки: - 1. Общая информация - 2. Обслуживание - 3. События - 4. Сервисы - - Проверяет: - 1. Наличие и доступность всех вкладок - 2. Корректность активации вкладок после переключения - 3. Отсутствие ошибок при последовательном переключении + Тестирует переключение на все доступные вкладки: Общая информация, + Обслуживание, События, Сервисы. Args: browser (Page): Экземпляр страницы Playwright для взаимодействия с UI @@ -116,4 +250,4 @@ class TestRackTab: # Переход в режим редактирования rt.should_be_toolbar_buttons() - rt.wait_for_timeout(2000) + rt.wait_for_timeout(1000)