diff --git a/pages/rack_page.py b/pages/rack_page.py index fb63dc3..59d736d 100644 --- a/pages/rack_page.py +++ b/pages/rack_page.py @@ -56,16 +56,8 @@ class RackPage(BasePage): # Действия def click_edit_button(self) -> None: - """ - Кликает на кнопку 'Изменить'. - """ - logger.debug("Clicking on 'Edit' button...") + """ Кликает на кнопку 'Изменить'.""" - # Проверяем видимость кнопки - self.toolbar.check_button_visibility("edit") - self.toolbar.check_button_tooltip("edit", "Изменить") - - # Кликаем на кнопку self.toolbar.get_button_by_name("edit").click() self.wait_for_timeout(1000) @@ -458,7 +450,7 @@ class RackPage(BasePage): self.toolbar.check_button_tooltip("edit", "Изменить") # Кликаем на кнопку "Изменить" для проверки функциональности - self.toolbar.get_button_by_name("edit").click() + #self.toolbar.get_button_by_name("edit").click() def should_have_hide_rack_button(self) -> None: diff --git a/tests/e2e/create_elements/test_create_rack_element.py b/tests/e2e/create_elements/test_create_rack_element.py index a883483..8e37919 100644 --- a/tests/e2e/create_elements/test_create_rack_element.py +++ b/tests/e2e/create_elements/test_create_rack_element.py @@ -8,6 +8,7 @@ from locators.rack_locators import RackLocators 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 components_derived.modal_edit_rack import ModalEditRack, RackEditData from pages.login_page import LoginPage from pages.main_page import MainPage from pages.rack_page import RackPage @@ -153,24 +154,22 @@ class TestCreateRackElement: self.main_page.wait_for_timeout(500) # 2. Проверяем и нажимаем кнопку "Изменить" - logger.debug("Step 1: Clicking 'Edit' button...") rack_page = RackPage(browser) - # Проверяем видимость кнопки - rack_page.toolbar.check_button_visibility("edit") - - # Проверяем тултип кнопки - rack_page.toolbar.check_button_tooltip("edit", "Изменить") + # Проверяем видимость и тултип кнопки + rack_page.should_be_toolbar_buttons() # Кликаем на кнопку "Изменить" - rack_page.toolbar.get_button_by_name("edit").click() + rack_page.click_edit_button() - logger.debug("Edit button clicked, waiting for edit form...") + self.main_page.wait_for_timeout(1000) - # 3. Используем метод click_remove_button, который обрабатывает весь процесс удаления - # включая диалог подтверждения - logger.debug("Clicking remove button...") - rack_page.click_remove_button() + # 3. Создаем экземпляр ModalRackEditRack + rack_edit = ModalEditRack(browser, rack_name) + + # Используем метод для удаления + rack_edit.click_remove_button() + self.main_page.wait_for_timeout(1000) # 4. Проверяем уведомление об успешном удалении - требуется создать разработчику (заведена задача) # Создаем экземпляр фрейма для доступа к alert компоненту diff --git a/tests/e2e/elements/test_edit_rack.py b/tests/e2e/elements/test_edit_rack.py index 45a3e5e..a250426 100644 --- a/tests/e2e/elements/test_edit_rack.py +++ b/tests/e2e/elements/test_edit_rack.py @@ -123,20 +123,20 @@ class TestRackTab: # 2. Проверяем и нажимаем кнопку "Изменить" rack_page = RackPage(browser) - # Проверяем видимость кнопки - rack_page.toolbar.check_button_visibility("edit") - - # Проверяем тултип кнопки - rack_page.toolbar.check_button_tooltip("edit", "Изменить") + # Проверяем видимость и тултип кнопки + rack_page.should_be_toolbar_buttons() # Кликаем на кнопку "Изменить" - rack_page.toolbar.get_button_by_name("edit").click() + rack_page.click_edit_button() + + self.main_page.wait_for_timeout(1000) # 3. Создаем экземпляр ModalRackEditRack rack_edit = ModalEditRack(browser, rack_name) # Используем метод для удаления rack_edit.click_remove_button() + self.main_page.wait_for_timeout(1000) logger.info(f"Rack '{rack_name}' deleted successfully") @@ -261,7 +261,8 @@ class TestRackTab: # Сохраняем изменения rack_edit.click_done_button() - rack_edit.wait_for_timeout(3000) + rack_edit.wait_for_timeout(2000) + browser.mouse.click(10, 10) # Вход в режим редактирования rack_page.click_edit_button() @@ -319,6 +320,8 @@ class TestRackTab: # Сохраняем rack_edit.click_done_button() + rack_page.wait_for_timeout(2000) + browser.mouse.click(10, 10) @pytest.mark.develop def test_rack_access_rules(self, browser: Page) -> None: @@ -393,7 +396,8 @@ class TestRackTab: # Сохраняем изменения rack_edit.click_done_button() - rack_edit.wait_for_timeout(3000) + rack_page.wait_for_timeout(2000) + browser.mouse.click(10, 10) # Возвращаемся в режим редактирования и проверяем снова rack_page.click_edit_button() diff --git a/tests/e2e/elements/test_management_rack.py b/tests/e2e/elements/test_management_rack.py new file mode 100644 index 0000000..f1d9a2c --- /dev/null +++ b/tests/e2e/elements/test_management_rack.py @@ -0,0 +1,243 @@ +"""Модуль тестов вкладки 'Стойка' в модуле Объекты. + +Содержит тесты для проверки функциональности +работы со стойкой оборудования. +""" + +import pytest +from playwright.sync_api import Page +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 components_derived.modal_edit_rack import ModalEditRack +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" + +class TestRackTab: + """Набор тестов для вкладки 'Стойка' в модуле Объекты. + + Проверяет корректность отображения, функциональность элементов интерфейса + и переключение между вкладками стойки оборудования. + + Тесты покрывают следующие функциональные области: + 1. test_rack_tab_content - Базовая структура и содержимое вкладки стойки + """ + + # Инициализируем атрибуты + 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.should_be_toolbar_buttons() + + # Кликаем на кнопку "Изменить" + rack_page.click_edit_button() + + self.main_page.wait_for_timeout(1000) + + # 3. Создаем экземпляр ModalRackEditRack + rack_edit = ModalEditRack(browser, rack_name) + + # Используем метод для удаления + rack_edit.click_remove_button() + self.main_page.wait_for_timeout(1000) + + @pytest.fixture(scope="function", autouse=True) + def setup(self, browser: Page) -> None: + """Фикстура для подготовки тестового окружения. + + Выполняет: + 1. Авторизацию в системе + 2. Создание стойки если она не существует + 3. Переход к стойке + + Args: + browser (Page): Экземпляр страницы Playwright для взаимодействия с UI + """ + # Авторизация в системе + 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.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) + + # Переходим к стойке для тестирования + self.main_page.click_subpanel_item(RACK_NAME, parent="test-zone") + self.main_page.wait_for_timeout(3000) + + @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: + """Тест содержимого вкладки 'Стойка'. + + Проверяет: + 1. Наличие и корректность заголовка панели с навигационной цепочкой + 2. Отображение и структуру обеих сторон стойки (лицевой и обратной) + 3. Наличие и функциональность кнопок панели инструментов + 4. Корректность отображения юнитов и устройств на стойке + + Args: + browser (Page): Экземпляр страницы Playwright для взаимодействия с UI + """ + + expected_toolbar_subtitles = [ + "test-zone", + 'chevron_right', + RACK_NAME + ] + + rt = RackPage(browser) + rt.should_be_panel_header(expected_toolbar_subtitles) + + # Комплексная проверка отображения обеих сторон стойки с детальной информацией + rt.should_be_rack_sides_displayed() + + # Проверка кнопки "Скрыть стойку" + rt.should_have_hide_rack_button() + + # Проверка кнопки "Показать стойку" + rt.should_have_show_rack_button() + + # Проверяем переключение между всеми вкладками стойки + rt.check_tab_switching() + + # Переход в режим редактирования + rt.should_be_toolbar_buttons() + rt.wait_for_timeout(1000)