Добавлена фикстура для автоматической очистки тестовых стоек

- В класс 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)
- Обеспечивает чистое тестовое окружение после выполнения тестов
ra2/create_element_rack
Radislav 2026-01-16 13:39:50 +03:00
parent 8140769583
commit a25db67097
3 changed files with 92 additions and 55 deletions

View File

@ -109,7 +109,7 @@ class RackObjectMaker(BaseComponent):
if not input_field.is_visible(): if not input_field.is_visible():
logger.debug(f"Field '{field_name}' is not visible, scrolling into view...") logger.debug(f"Field '{field_name}' is not visible, scrolling into view...")
input_field.scroll_into_view_if_needed() input_field.scroll_into_view_if_needed()
self.wait_for_timeout(500) self.wait_for_timeout(300)
# Проверяем, не disabled ли поле # Проверяем, не disabled ли поле
is_disabled = input_field.get_attribute("disabled") is_disabled = input_field.get_attribute("disabled")
@ -201,7 +201,7 @@ class RackObjectMaker(BaseComponent):
# Прокручиваем до поля # Прокручиваем до поля
field_container.scroll_into_view_if_needed() 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") self.check_visibility(field_container, f"Field '{field_name}' not found")
@ -211,7 +211,7 @@ class RackObjectMaker(BaseComponent):
# Кликаем для открытия выпадающего списка # Кликаем для открытия выпадающего списка
open_button.click(force=True) 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) dropdown_item_locator = RackLocators.DROPDOWN_ITEM_BY_TEXT.format(value)
@ -222,7 +222,7 @@ class RackObjectMaker(BaseComponent):
self.page.locator(RackLocators.DROPDOWN_LIST).first, self.page.locator(RackLocators.DROPDOWN_LIST).first,
value value
) )
self.wait_for_timeout(500) self.wait_for_timeout(300)
element.click() element.click()
logger.debug(f"Field '{field_name}' filled successfully") logger.debug(f"Field '{field_name}' filled successfully")

View File

@ -72,7 +72,7 @@ class CreateChildElementFrame(BaseComponent):
# Прокручиваем до поля # Прокручиваем до поля
field_container.scroll_into_view_if_needed() field_container.scroll_into_view_if_needed()
self.wait_for_timeout(500) self.wait_for_timeout(300)
# Проверяем видимость # Проверяем видимость
if not field_container.is_visible(): if not field_container.is_visible():
@ -88,7 +88,7 @@ class CreateChildElementFrame(BaseComponent):
# Если кнопка закрытия видима - кликаем на нее # Если кнопка закрытия видима - кликаем на нее
close_button.click(force=True) 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") logger.debug(f"Combobox field '{field_name}' cleared using close button")
else: else:
logger.debug(f"Close button (i.mdi-close) not found for field '{field_name}'") 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.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") 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}'...") 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() actual_class = self.get_selected_object_class()
is_match = (expected_class.lower() in actual_class.lower() or 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_visibility("add")
self.toolbar.check_button_tooltip("add", "Добавить") self.toolbar.check_button_tooltip("add", "Добавить")
self.toolbar.check_button_visibility("cancel") self.toolbar.check_button_visibility("cancel")
self.toolbar.check_button_tooltip("cancel", "Отменить") self.toolbar.check_button_tooltip("cancel", "Отменить")
self.toolbar.click_button("cancel") self.toolbar.click_button("cancel")
self.wait_for_timeout(2000) self.wait_for_timeout(500)

View File

@ -48,18 +48,62 @@ class TestCreateRackElement:
# Мы на главной странице # Мы на главной странице
self.main_page = MainPage(browser) self.main_page = MainPage(browser)
self.main_page.should_be_navigation_panel() 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.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.click_main_navigation_panel_item("test-zone")
self.main_page.wait_for_timeout(2000)
# Создаем экземпляр страницы локации # Создаем экземпляр страницы локации
self.location_page = LocationPage(browser) 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 #@pytest.mark.develop
def test_create_rack_content(self, browser: Page) -> None: def test_create_rack_content(self, browser: Page) -> None:
"""Тест создания дочернего элемента типа 'Стойка'.""" """Тест создания дочернего элемента типа 'Стойка'."""
@ -91,7 +135,7 @@ class TestCreateRackElement:
create_child_frame.should_be_toolbar_buttons() create_child_frame.should_be_toolbar_buttons()
@pytest.mark.develop #@pytest.mark.develop
def test_create_rack_child_element(self, browser: Page) -> None: 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.click_add_button()
create_child_frame.wait_for_timeout(2000)
# 1. Проверяем уведомление об успешном создании стойки - требуется создать разработчику (заведена задача) # 1. Проверяем уведомление об успешном создании стойки - требуется создать разработчику (заведена задача)
# Проверяем наличие alert-окна # Проверяем наличие alert-окна
@ -152,7 +195,6 @@ class TestCreateRackElement:
# Обновляем навигационную панель # Обновляем навигационную панель
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)
# Проверяем существование стойки в навигационной панели # Проверяем существование стойки в навигационной панели
rack_exists = self._check_rack_existance(browser, rack_name) 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") 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: 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") 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): 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.wait_for_timeout(2000)
create_child_frame.alert.close_alert_by_text(expected_alert_text) 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") logger.debug("System prevented creating rack with duplicate name")
def _perform_required_fields_test(self, create_child_frame, rack_maker, test_data): 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") logger.debug("Submitting form for validation")
create_child_frame.click_add_button() 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") logger.debug("Checking validation results")
@ -366,9 +424,9 @@ class TestCreateRackElement:
# Тестовые данные # Тестовые данные
test_cases = [ test_cases = [
{ {
"name": "Test 1: Creating rack with default field values", "name": "Test 1: Required fields are not filled",
"data": { "data": {
"name": "", "name": "Test-Rack-Required-01",
"height": "", "height": "",
"depth": "", "depth": "",
"expected_alert_height": expected_alert_text_height, "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": { "data": {
"name": "", "name": "Test-Rack-Required-02",
"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": "",
"height": "42", "height": "42",
"depth": "", "depth": "",
"expected_alert_height": expected_alert_text_height, "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": { "data": {
"name": "", "name": "Test-Rack-Required-03",
"height": "", "height": "",
"depth": "1000", "depth": "1000",
"expected_alert_height": expected_alert_text_height, "expected_alert_height": expected_alert_text_height,
@ -415,8 +463,8 @@ class TestCreateRackElement:
) )
logger.debug("System prevented creating rack with invalid required fields") logger.debug("System prevented creating rack with invalid required fields")
# 5. Тест: Заполняем все обязательные поля # 4. Тест: Заполняем все обязательные поля
logger.debug("Test 5: All required fields are filled") logger.debug("Test 4: All required fields are filled")
# Генерируем уникальное имя для финального теста # Генерируем уникальное имя для финального теста
final_rack_name = "Test-Rack-Required-Final" final_rack_name = "Test-Rack-Required-Final"
@ -473,7 +521,7 @@ class TestCreateRackElement:
# Нажимаем кнопку создания # Нажимаем кнопку создания
create_child_frame.click_add_button() create_child_frame.click_add_button()
create_child_frame.wait_for_timeout(1000) create_child_frame.wait_for_timeout(500)
# Проверяем уведомление об успешном создании стойки - требуется создать разработчику (заведена задача) # Проверяем уведомление об успешном создании стойки - требуется создать разработчику (заведена задача)
# Проверяем наличие alert-окна # Проверяем наличие alert-окна
@ -490,14 +538,17 @@ class TestCreateRackElement:
# Закрываем alert # Закрываем alert
# create_child_frame.alert.close_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._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) rack_still_exists = self._check_rack_existance(browser, final_rack_name)
assert not rack_still_exists, f"Rack '{final_rack_name}' should be deleted" 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") 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.click_subpanel_item(rack_name, parent="test-zone")
self.main_page.wait_for_timeout(2000)
# 3. Проверяем, что мы на странице стойки # 3. Проверяем, что мы на странице стойки
logger.debug("Step 3: Checking we're on rack page...") logger.debug("Step 3: Checking we're on rack page...")
@ -557,11 +607,9 @@ class TestCreateRackElement:
# 5. Проверяем, что стойка удалена с использованием существующего метода # 5. Проверяем, что стойка удалена с использованием существующего метода
logger.debug("Step 5: Verifying rack deletion...") logger.debug("Step 5: Verifying rack deletion...")
self.main_page.wait_for_timeout(2000)
# Переходим обратно в test-zone для проверки # Переходим обратно в test-zone для проверки
self.main_page.click_subpanel_item("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) 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() 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...") logger.debug("Edit button clicked, waiting for edit form...")
@ -610,9 +657,6 @@ class TestCreateRackElement:
logger.debug("Clicking remove button...") logger.debug("Clicking remove button...")
rack_page.click_remove_button() rack_page.click_remove_button()
# Ждем завершения процесса удаления
self.main_page.wait_for_timeout(10000)
# 4. Проверяем уведомление об успешном удалении - требуется создать разработчику (заведена задача) # 4. Проверяем уведомление об успешном удалении - требуется создать разработчику (заведена задача)
# Создаем экземпляр фрейма для доступа к alert компоненту # Создаем экземпляр фрейма для доступа к alert компоненту
# create_child_frame = CreateChildElementFrame(browser) # 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.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.click_subpanel_item("test-zone")
self.main_page.wait_for_timeout(3000)
nav_panel_locator = NavigationPanelLocators.TREEVIEW nav_panel_locator = NavigationPanelLocators.TREEVIEW
@ -662,9 +704,7 @@ class TestCreateRackElement:
logger.debug(f"Creating rack with name '{rack_name}'") 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.click_main_navigation_panel_item("test-zone")
self.main_page.wait_for_timeout(2000)
# Нажимаем кнопку "Создать" на тулбаре # Нажимаем кнопку "Создать" на тулбаре
self.location_page.click_create_button() self.location_page.click_create_button()
@ -693,4 +733,3 @@ class TestCreateRackElement:
# Нажимаем кнопку создания # Нажимаем кнопку создания
create_child_frame.click_add_button() create_child_frame.click_add_button()
create_child_frame.wait_for_timeout(2000)