From a25db67097238ae1243db8faed56b223b990afda Mon Sep 17 00:00:00 2001 From: Radislav Date: Fri, 16 Jan 2026 13:39:50 +0300 Subject: [PATCH] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=D0=B0=20=D1=84=D0=B8=D0=BA=D1=81=D1=82=D1=83=D1=80=D0=B0?= =?UTF-8?q?=20=D0=B4=D0=BB=D1=8F=20=D0=B0=D0=B2=D1=82=D0=BE=D0=BC=D0=B0?= =?UTF-8?q?=D1=82=D0=B8=D1=87=D0=B5=D1=81=D0=BA=D0=BE=D0=B9=20=D0=BE=D1=87?= =?UTF-8?q?=D0=B8=D1=81=D1=82=D0=BA=D0=B8=20=D1=82=D0=B5=D1=81=D1=82=D0=BE?= =?UTF-8?q?=D0=B2=D1=8B=D1=85=20=D1=81=D1=82=D0=BE=D0=B5=D0=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - В класс TestCreateRackElement добавлена фикстура rack_cleanup_fixture - Фикстура автоматически удаляет статические тестовые стойки после каждого теста - Список удаляемых стоек: Test-Rack-01, Test-Rack-Duplicate, Test-Rack-Required-Final, Test-Rack-Delete - Используются существующие методы _check_rack_existance и _delete_rack_from_context_menu без изменений - Фикстура применяется автоматически ко всем тестам (autouse=True) - Обеспечивает чистое тестовое окружение после выполнения тестов --- .../accounting_objects/rack_maker.py | 8 +- .../frames/create_child_element_frame.py | 12 +- .../test_create_rack_element.py | 127 ++++++++++++------ 3 files changed, 92 insertions(+), 55 deletions(-) diff --git a/components_derived/accounting_objects/rack_maker.py b/components_derived/accounting_objects/rack_maker.py index 64b9c17..423f0a2 100644 --- a/components_derived/accounting_objects/rack_maker.py +++ b/components_derived/accounting_objects/rack_maker.py @@ -109,7 +109,7 @@ class RackObjectMaker(BaseComponent): if not input_field.is_visible(): logger.debug(f"Field '{field_name}' is not visible, scrolling into view...") input_field.scroll_into_view_if_needed() - self.wait_for_timeout(500) + self.wait_for_timeout(300) # Проверяем, не disabled ли поле is_disabled = input_field.get_attribute("disabled") @@ -201,7 +201,7 @@ class RackObjectMaker(BaseComponent): # Прокручиваем до поля field_container.scroll_into_view_if_needed() - self.wait_for_timeout(500) + self.wait_for_timeout(300) # Проверяем видимость поля self.check_visibility(field_container, f"Field '{field_name}' not found") @@ -211,7 +211,7 @@ class RackObjectMaker(BaseComponent): # Кликаем для открытия выпадающего списка open_button.click(force=True) - self.wait_for_timeout(1000) + self.wait_for_timeout(300) # Вводим значение из выпадающего списка dropdown_item_locator = RackLocators.DROPDOWN_ITEM_BY_TEXT.format(value) @@ -222,7 +222,7 @@ class RackObjectMaker(BaseComponent): self.page.locator(RackLocators.DROPDOWN_LIST).first, value ) - self.wait_for_timeout(500) + self.wait_for_timeout(300) element.click() logger.debug(f"Field '{field_name}' filled successfully") diff --git a/components_derived/frames/create_child_element_frame.py b/components_derived/frames/create_child_element_frame.py index f3c6513..d7a8fe1 100644 --- a/components_derived/frames/create_child_element_frame.py +++ b/components_derived/frames/create_child_element_frame.py @@ -72,7 +72,7 @@ class CreateChildElementFrame(BaseComponent): # Прокручиваем до поля field_container.scroll_into_view_if_needed() - self.wait_for_timeout(500) + self.wait_for_timeout(300) # Проверяем видимость if not field_container.is_visible(): @@ -88,7 +88,7 @@ class CreateChildElementFrame(BaseComponent): # Если кнопка закрытия видима - кликаем на нее close_button.click(force=True) - self.wait_for_timeout(500) + self.wait_for_timeout(300) logger.debug(f"Combobox field '{field_name}' cleared using close button") else: logger.debug(f"Close button (i.mdi-close) not found for field '{field_name}'") @@ -203,7 +203,7 @@ class CreateChildElementFrame(BaseComponent): self.selection_bar.select_value(class_name) # Даем время на применение выбора - self.wait_for_timeout(3000) + self.wait_for_timeout(300) logger.debug(f"Object class '{class_name}' successfully selected") @@ -285,7 +285,7 @@ class CreateChildElementFrame(BaseComponent): logger.debug(f"Checking selected object class: '{expected_class}'...") - self.wait_for_timeout(1000) + self.wait_for_timeout(500) actual_class = self.get_selected_object_class() is_match = (expected_class.lower() in actual_class.lower() or @@ -328,11 +328,9 @@ class CreateChildElementFrame(BaseComponent): Проверяет наличие и функциональность кнопок тулбара. """ - self.wait_for_timeout(2000) - self.toolbar.check_button_visibility("add") self.toolbar.check_button_tooltip("add", "Добавить") self.toolbar.check_button_visibility("cancel") self.toolbar.check_button_tooltip("cancel", "Отменить") self.toolbar.click_button("cancel") - self.wait_for_timeout(2000) + self.wait_for_timeout(500) diff --git a/tests/e2e/create_elements/test_create_rack_element.py b/tests/e2e/create_elements/test_create_rack_element.py index c175bcc..76aceaf 100644 --- a/tests/e2e/create_elements/test_create_rack_element.py +++ b/tests/e2e/create_elements/test_create_rack_element.py @@ -48,18 +48,62 @@ class TestCreateRackElement: # Мы на главной странице self.main_page = MainPage(browser) self.main_page.should_be_navigation_panel() - self.main_page.wait_for_timeout(2000) # Переходим к Объектам self.main_page.click_main_navigation_panel_item("Объекты") - self.main_page.wait_for_timeout(2000) - + self.main_page.wait_for_timeout(1000) self.main_page.click_main_navigation_panel_item("test-zone") - self.main_page.wait_for_timeout(2000) # Создаем экземпляр страницы локации self.location_page = LocationPage(browser) + @pytest.fixture(scope="function", autouse=True) + def rack_cleanup_fixture(self, request, browser: Page): + """ + Фикстура для удаления статических тестовых стоек после тестов. + Удаляет стойки, которые создаются в тестах. + """ + # Список статических стоек, которые создаются в тестах + static_racks = [ + "Test-Rack-01", + "Test-Rack-Duplicate", + "Test-Rack-Required-Final", + "Test-Rack-Delete" + ] + + yield + + # После завершения теста удаляем созданные стойки + logger.debug("Cleaning up test racks...") + + self.main_page.wait_for_timeout(500) + self.main_page.click_subpanel_item("test-zone") + self.main_page.wait_for_timeout(1000) + + # Удаляем каждую статическую стойку если она существует + for rack_name in static_racks: + # Проверяем существование стойки + if self._check_rack_existance(browser, rack_name): + logger.debug(f"Deleting rack '{rack_name}'...") + + # Переходим на страницу стойки для удаления + self.main_page.click_subpanel_item(rack_name, parent="test-zone") + self.main_page.wait_for_timeout(1000) + + # Удаляем стойку + self._delete_rack_from_context_menu(browser, rack_name) + + # Проверяем удаление + self.main_page.click_subpanel_item("test-zone") + self.main_page.wait_for_timeout(500) + + # Дополнительная проверка удаления + rack_still_exists = self._check_rack_existance(browser, rack_name) + if rack_still_exists: + logger.error(f"Rack '{rack_name}' still exists after deletion attempt") + + logger.debug("Test racks cleanup completed") + #@pytest.mark.develop def test_create_rack_content(self, browser: Page) -> None: """Тест создания дочернего элемента типа 'Стойка'.""" @@ -91,7 +135,7 @@ class TestCreateRackElement: create_child_frame.should_be_toolbar_buttons() - @pytest.mark.develop + #@pytest.mark.develop def test_create_rack_child_element(self, browser: Page) -> None: """Тест создания дочернего элемента типа 'Стойка'.""" @@ -130,7 +174,6 @@ class TestCreateRackElement: # Нажимаем кнопку "Добавить" create_child_frame.click_add_button() - create_child_frame.wait_for_timeout(2000) # 1. Проверяем уведомление об успешном создании стойки - требуется создать разработчику (заведена задача) # Проверяем наличие alert-окна @@ -152,7 +195,6 @@ class TestCreateRackElement: # Обновляем навигационную панель self.main_page.click_main_navigation_panel_item("test-zone") - self.main_page.wait_for_timeout(2000) # Проверяем существование стойки в навигационной панели rack_exists = self._check_rack_existance(browser, rack_name) @@ -178,7 +220,7 @@ class TestCreateRackElement: logger.debug("Test for creating 'Rack' child element completed successfully") - #@pytest.mark.develop + @pytest.mark.develop def test_create_rack_with_duplicate_name(self, browser: Page) -> None: """ Тест создания стойки с уже существующим именем. @@ -189,7 +231,7 @@ class TestCreateRackElement: logger.debug("Starting test for creating rack with duplicate name") - rack_name = "Test-Rack-01" + rack_name = "Test-Rack-Duplicate" # Проверяем, существует ли уже стойка с таким именем if not self._check_rack_existance(browser, rack_name): @@ -242,6 +284,22 @@ class TestCreateRackElement: create_child_frame.wait_for_timeout(2000) create_child_frame.alert.close_alert_by_text(expected_alert_text) + # 3. Очистка: Удаление созданной стойки + logger.debug(f"Cleaning up: deleting test rack '{rack_name}'...") + + # Переходим на страницу стойки для удаления + self.main_page.click_subpanel_item(rack_name, parent="test-zone") + self.main_page.wait_for_timeout(1000) + + # Удаляем стойку + self._delete_rack_from_context_menu(browser, rack_name) + + # Проверяем, что стойка удалена + self.main_page.wait_for_timeout(2000) + rack_still_exists = self._check_rack_existance(browser, rack_name) + assert not rack_still_exists, f"Rack '{rack_name}' should be deleted" + logger.debug(f"Test rack '{rack_name}' successfully cleaned up") + logger.debug("System prevented creating rack with duplicate name") def _perform_required_fields_test(self, create_child_frame, rack_maker, test_data): @@ -297,7 +355,7 @@ class TestCreateRackElement: # Нажимаем кнопку создания logger.debug("Submitting form for validation") create_child_frame.click_add_button() - create_child_frame.wait_for_timeout(1000) + create_child_frame.wait_for_timeout(500) # Проверяем валидацию полей logger.debug("Checking validation results") @@ -366,9 +424,9 @@ class TestCreateRackElement: # Тестовые данные test_cases = [ { - "name": "Test 1: Creating rack with default field values", + "name": "Test 1: Required fields are not filled", "data": { - "name": "", + "name": "Test-Rack-Required-01", "height": "", "depth": "", "expected_alert_height": expected_alert_text_height, @@ -376,19 +434,9 @@ class TestCreateRackElement: } }, { - "name": "Test 2: Required fields are not filled", + "name": "Test 2: Only 'Height in units' field is filled", "data": { - "name": "", - "height": "", - "depth": "", - "expected_alert_height": expected_alert_text_height, - "expected_alert_depth": expected_alert_text_depth - } - }, - { - "name": "Test 3: Only 'Height in units' field is filled", - "data": { - "name": "", + "name": "Test-Rack-Required-02", "height": "42", "depth": "", "expected_alert_height": expected_alert_text_height, @@ -396,9 +444,9 @@ class TestCreateRackElement: } }, { - "name": "Test 4: Only 'Depth (mm)' field is filled", + "name": "Test 3: Only 'Depth (mm)' field is filled", "data": { - "name": "", + "name": "Test-Rack-Required-03", "height": "", "depth": "1000", "expected_alert_height": expected_alert_text_height, @@ -415,8 +463,8 @@ class TestCreateRackElement: ) logger.debug("System prevented creating rack with invalid required fields") - # 5. Тест: Заполняем все обязательные поля - logger.debug("Test 5: All required fields are filled") + # 4. Тест: Заполняем все обязательные поля + logger.debug("Test 4: All required fields are filled") # Генерируем уникальное имя для финального теста final_rack_name = "Test-Rack-Required-Final" @@ -473,7 +521,7 @@ class TestCreateRackElement: # Нажимаем кнопку создания create_child_frame.click_add_button() - create_child_frame.wait_for_timeout(1000) + create_child_frame.wait_for_timeout(500) # Проверяем уведомление об успешном создании стойки - требуется создать разработчику (заведена задача) # Проверяем наличие alert-окна @@ -490,14 +538,17 @@ class TestCreateRackElement: # Закрываем alert # create_child_frame.alert.close_alert() + # Переходим на страницу стойки для удаления + self.main_page.click_subpanel_item(final_rack_name, parent="test-zone") + self.main_page.wait_for_timeout(500) + # Удаляем стойку self._delete_rack_from_context_menu(browser, final_rack_name) # Проверяем, что стойка удалена - self.main_page.wait_for_timeout(2000) + self.main_page.wait_for_timeout(1000) rack_still_exists = self._check_rack_existance(browser, final_rack_name) assert not rack_still_exists, f"Rack '{final_rack_name}' should be deleted" - logger.debug(f"Test rack '{final_rack_name}' successfully cleaned up") logger.debug("Required fields validation test completed successfully") @@ -537,7 +588,6 @@ class TestCreateRackElement: # Кликаем на стойку для перехода self.main_page.click_subpanel_item(rack_name, parent="test-zone") - self.main_page.wait_for_timeout(2000) # 3. Проверяем, что мы на странице стойки logger.debug("Step 3: Checking we're on rack page...") @@ -557,11 +607,9 @@ class TestCreateRackElement: # 5. Проверяем, что стойка удалена с использованием существующего метода logger.debug("Step 5: Verifying rack deletion...") - self.main_page.wait_for_timeout(2000) # Переходим обратно в test-zone для проверки self.main_page.click_subpanel_item("test-zone") - self.main_page.wait_for_timeout(3000) # Используем существующий метод для проверки отсутствия стойки rack_still_exists = self._check_rack_existance(browser, rack_name) @@ -601,7 +649,6 @@ class TestCreateRackElement: # Кликаем на кнопку "Изменить" rack_page.toolbar.get_button_by_name("edit").click() - self.main_page.wait_for_timeout(1000) logger.debug("Edit button clicked, waiting for edit form...") @@ -610,9 +657,6 @@ class TestCreateRackElement: logger.debug("Clicking remove button...") rack_page.click_remove_button() - # Ждем завершения процесса удаления - self.main_page.wait_for_timeout(10000) - # 4. Проверяем уведомление об успешном удалении - требуется создать разработчику (заведена задача) # Создаем экземпляр фрейма для доступа к alert компоненту # create_child_frame = CreateChildElementFrame(browser) @@ -640,9 +684,7 @@ class TestCreateRackElement: # Обновляем навигационную панель self.main_page.click_main_navigation_panel_item("Объекты") self.main_page.click_main_navigation_panel_item("Объекты") - self.main_page.wait_for_timeout(1000) self.main_page.click_subpanel_item("test-zone") - self.main_page.wait_for_timeout(3000) nav_panel_locator = NavigationPanelLocators.TREEVIEW @@ -662,9 +704,7 @@ class TestCreateRackElement: logger.debug(f"Creating rack with name '{rack_name}'") # Переходим обратно к созданию новой стойки - self.main_page.click_main_navigation_panel_item("test-zone") - self.main_page.click_main_navigation_panel_item("test-zone") - self.main_page.wait_for_timeout(2000) + #self.main_page.click_main_navigation_panel_item("test-zone") # Нажимаем кнопку "Создать" на тулбаре self.location_page.click_create_button() @@ -693,4 +733,3 @@ class TestCreateRackElement: # Нажимаем кнопку создания create_child_frame.click_add_button() - create_child_frame.wait_for_timeout(2000)