From 743815cab40ccc911d6ca741d07616cc335ec672 Mon Sep 17 00:00:00 2001 From: Radislav Date: Thu, 26 Feb 2026 15:41:20 +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=D1=8B=20=D1=82=D0=B5=D1=81=D1=82=D1=8B=20=D1=83=D0=B2?= =?UTF-8?q?=D0=B5=D0=B4=D0=BE=D0=BC=D0=BB=D0=B5=D0=BD=D0=B8=D0=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../test_create_rack_element.py | 81 ++++++++++-------- tests/e2e/elements/test_edit_rack.py | 41 ++++++++- tests/e2e/elements/test_image.jpg | Bin 5340 -> 0 bytes tests/e2e/elements/test_management_rack.py | 26 ++++++ 4 files changed, 106 insertions(+), 42 deletions(-) delete mode 100644 tests/e2e/elements/test_image.jpg diff --git a/tests/e2e/create_elements/test_create_rack_element.py b/tests/e2e/create_elements/test_create_rack_element.py index 8e37919..ae83040 100644 --- a/tests/e2e/create_elements/test_create_rack_element.py +++ b/tests/e2e/create_elements/test_create_rack_element.py @@ -12,10 +12,10 @@ 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 +from components.alert_component import AlertComponent logger = get_logger("CREATE_RACK_ELEMENT_TEST") - logger.setLevel("INFO") # @pytest.mark.smoke @@ -137,6 +137,12 @@ class TestCreateRackElement: # Нажимаем кнопку создания create_child_frame.click_add_button() + # Проверяем уведомление об успешном создании + alert = AlertComponent(browser) + expected_alert_text = f"Элемент {rack_name} создан" + alert.check_alert_presence(expected_alert_text) + alert.close_alert_by_text(expected_alert_text) + def _delete_rack_from_context_menu(self, browser: Page, rack_name: str) -> None: """Удаляет стойку через контекстное меню. @@ -171,22 +177,17 @@ class TestCreateRackElement: rack_edit.click_remove_button() self.main_page.wait_for_timeout(1000) - # 4. Проверяем уведомление об успешном удалении - требуется создать разработчику (заведена задача) - # Создаем экземпляр фрейма для доступа к alert компоненту - # create_child_frame = CreateChildElementFrame(browser) + # 4. Проверяем уведомление об успешном удалении + alert = AlertComponent(browser) + expected_alert_text = "Успешно удалено" + alert.check_alert_presence(expected_alert_text) - # Проверяем наличие любого alert-окна (не обязательно точного текста) - # create_child_frame.alert.check_alert_presence("") - - # Получаем текст alert, чтобы убедиться что удаление прошло успешно - # alert_text = create_child_frame.alert.get_text() - # logger.debug(f"Alert text after deletion: {alert_text}") - - # Проверяем что в тексте есть указание на успешное удаление - # assert "удален" in alert_text.lower() or "успешно" in alert_text.lower() + # Получаем текст alert для логирования + alert_text = alert.get_text() + logger.debug(f"Alert text after deletion: {alert_text}") # Закрываем alert - # create_child_frame.alert.close_alert() + alert.close_alert_by_text(expected_alert_text) logger.debug("Rack deletion completed") @@ -248,17 +249,19 @@ class TestCreateRackElement: # Проверяем валидацию полей logger.debug("Checking validation results") + alert = AlertComponent(create_child_frame.page) + # Обрабатываем alert-окна if not height_value: logger.debug("Expecting height validation alert") - create_child_frame.alert.check_alert_presence(expected_alert_height) - create_child_frame.alert.close_alert_by_text(expected_alert_height) + alert.check_alert_presence(expected_alert_height) + alert.close_alert_by_text(expected_alert_height) logger.debug("Height alert handled") if not depth_value: logger.debug("Expecting depth validation alert") - create_child_frame.alert.check_alert_presence(expected_alert_depth) - create_child_frame.alert.close_alert_by_text(expected_alert_depth) + alert.check_alert_presence(expected_alert_depth) + alert.close_alert_by_text(expected_alert_depth) logger.debug("Depth alert handled") # Проверяем подсветку обязательных полей @@ -320,22 +323,23 @@ class TestCreateRackElement: # Нажимаем кнопку "Добавить" create_child_frame.click_add_button() - # 1. Проверяем уведомление об успешном создании стойки - требуется создать разработчику (заведена задача) - # Проверяем наличие alert-окна - # create_child_frame.alert.check_alert_presence("") + # Проверяем уведомление об успешном создании стойки + alert = AlertComponent(browser) + expected_alert_text = f"Элемент {rack_name} создан" + alert.check_alert_presence(expected_alert_text) # Получаем текст alert - # alert_text = create_child_frame.alert.get_text() - # logger.debug(f"Alert text after creation: {alert_text}") + alert_text = alert.get_text() + logger.debug(f"Alert text after creation: {alert_text}") # Проверяем, что в тексте есть указание на успешное создание - # assert "создан" in alert_text.lower() or "успешно" in alert_text.lower() - # assert final_rack_name in alert_text + assert "создан" in alert_text.lower() + assert rack_name in alert_text # Закрываем alert - # create_child_frame.alert.close_alert() + alert.close_alert_by_text(expected_alert_text) - # 2. Проверяем, что стойка создана и отображается + # Проверяем, что стойка создана и отображается logger.debug(f"Verifying that rack '{rack_name}' was created...") # Обновляем навигационную панель @@ -346,7 +350,6 @@ class TestCreateRackElement: assert rack_exists, f"Rack '{rack_name}' should be visible in navigation panel after creation" logger.debug(f"Rack '{rack_name}' is visible in navigation panel") - logger.debug("Test for creating 'Rack' child element completed successfully") def test_create_rack_content(self, browser: Page) -> None: @@ -431,15 +434,16 @@ class TestCreateRackElement: create_child_frame.wait_for_timeout(2000) # Проверяем наличие alert-окна с сообщением о дублирующемся имени + alert = AlertComponent(browser) expected_alert_text = f"Имя {rack_name} уже используется" - create_child_frame.alert.check_alert_presence(expected_alert_text) + alert.check_alert_presence(expected_alert_text) # Проверяем, что остались на странице создания (стойка не создана) create_child_frame.check_toolbar_title('Создать дочерний элемент в') # Закрываем alert-окно с помощью кнопки закрытия create_child_frame.wait_for_timeout(2000) - create_child_frame.alert.close_alert_by_text(expected_alert_text) + alert.close_alert_by_text(expected_alert_text) logger.debug("System prevented creating rack with duplicate name") @@ -571,20 +575,21 @@ class TestCreateRackElement: create_child_frame.click_add_button() create_child_frame.wait_for_timeout(500) - # Проверяем уведомление об успешном создании стойки - требуется создать разработчику (заведена задача) - # Проверяем наличие alert-окна - # create_child_frame.alert.check_alert_presence("") + # Проверяем уведомление об успешном создании стойки + alert = AlertComponent(browser) + expected_alert_text = f"Элемент {final_rack_name} создан" + alert.check_alert_presence(expected_alert_text) # Получаем текст alert - # alert_text = create_child_frame.alert.get_text() - # logger.debug(f"Alert text after creation: {alert_text}") + alert_text = alert.get_text() + logger.debug(f"Alert text after creation: {alert_text}") # Проверяем что в тексте есть указание на успешное создание - # assert "создан" in alert_text.lower() or "успешно" in alert_text.lower() - # assert final_rack_name in alert_text + assert "создан" in alert_text.lower() + assert final_rack_name in alert_text # Закрываем alert - # create_child_frame.alert.close_alert() + alert.close_alert_by_text(expected_alert_text) logger.debug("Required fields validation test completed successfully") diff --git a/tests/e2e/elements/test_edit_rack.py b/tests/e2e/elements/test_edit_rack.py index a250426..2c429e9 100644 --- a/tests/e2e/elements/test_edit_rack.py +++ b/tests/e2e/elements/test_edit_rack.py @@ -15,6 +15,7 @@ from pages.rack_page import RackPage 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, RackEditData +from components.alert_component import AlertComponent from tools.logger import get_logger # Константы @@ -101,6 +102,12 @@ class TestRackTab: # Нажимаем кнопку создания create_child_frame.click_add_button() + # Проверяем уведомление об успешном создании + alert = AlertComponent(browser) + expected_alert_text = f"Элемент {rack_name} создан" + alert.check_alert_presence(expected_alert_text) + alert.close_alert_by_text(expected_alert_text) + logger.info(f"Rack '{rack_name}' created successfully") def _delete_rack_from_context_menu(self, browser: Page, rack_name: str) -> None: @@ -138,6 +145,12 @@ class TestRackTab: rack_edit.click_remove_button() self.main_page.wait_for_timeout(1000) + # 4. Проверяем уведомление об успешном удалении + alert = AlertComponent(browser) + expected_alert_text = "Успешно удалено" + alert.check_alert_presence(expected_alert_text) + alert.close_alert_by_text(expected_alert_text) + logger.info(f"Rack '{rack_name}' deleted successfully") @pytest.fixture(scope="function", autouse=True) @@ -237,7 +250,7 @@ class TestRackTab: # Создаем тестовые данные для заполнения всех полей rack_edit_data = RackEditData( # Основные поля - name="Test-Rack-Functionality", + name=RACK_NAME, serial="SN123456789", inventory="INV987654321", comment="Тестовый комментарий для стойки (обновленный)", @@ -262,6 +275,13 @@ class TestRackTab: # Сохраняем изменения rack_edit.click_done_button() rack_edit.wait_for_timeout(2000) + + # Проверяем уведомление об успешном обновлении + alert = AlertComponent(browser) + expected_alert_text = "Элемент успешно обновлён" + alert.check_alert_presence(expected_alert_text) + alert.close_alert_by_text(expected_alert_text) + browser.mouse.click(10, 10) # Вход в режим редактирования @@ -299,11 +319,10 @@ class TestRackTab: rack_edit.switch_to_tab(ModalEditRack.TAB_IMAGE) # Проверяем вкладку - assert rack_edit.is_tab_active(ModalEditRack.TAB_IMAGE), \ - "Image tab should be active" + assert rack_edit.is_tab_active(ModalEditRack.TAB_IMAGE), "Image tab should be active" # Загружаем изображение если есть - test_image_path = os.path.join(os.path.dirname(__file__), "test_image.jpg") + test_image_path = os.path.join(os.path.dirname(__file__), "test_edit_rack_image.jpg") if os.path.exists(test_image_path): logger.debug(f"Found test image: {test_image_path}") # Находим input и загружаем файл @@ -321,6 +340,13 @@ class TestRackTab: # Сохраняем rack_edit.click_done_button() rack_page.wait_for_timeout(2000) + + # Проверяем уведомление об успешном обновлении + alert = AlertComponent(browser) + expected_alert_text = "Элемент успешно обновлён" + alert.check_alert_presence(expected_alert_text) + alert.close_alert_by_text(expected_alert_text) + browser.mouse.click(10, 10) @pytest.mark.develop @@ -397,6 +423,13 @@ class TestRackTab: # Сохраняем изменения rack_edit.click_done_button() rack_page.wait_for_timeout(2000) + + # Проверяем уведомление об успешном обновлении + alert = AlertComponent(browser) + expected_alert_text = "Элемент успешно обновлён" + alert.check_alert_presence(expected_alert_text) + alert.close_alert_by_text(expected_alert_text) + browser.mouse.click(10, 10) # Возвращаемся в режим редактирования и проверяем снова diff --git a/tests/e2e/elements/test_image.jpg b/tests/e2e/elements/test_image.jpg deleted file mode 100644 index 1e21bdcc5a2da2a4ae0d9cce24220e6f4f44fdf5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5340 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 diff --git a/tests/e2e/elements/test_management_rack.py b/tests/e2e/elements/test_management_rack.py index f1d9a2c..20c6f66 100644 --- a/tests/e2e/elements/test_management_rack.py +++ b/tests/e2e/elements/test_management_rack.py @@ -14,10 +14,16 @@ from pages.location_page import LocationPage from pages.login_page import LoginPage from pages.main_page import MainPage from pages.rack_page import RackPage +from components.alert_component import AlertComponent +from tools.logger import get_logger # Константы RACK_NAME = "Test-Rack-Functionality" +# Инициализация логгера для всего модуля +logger = get_logger("RACK_MANAGEMENT_TESTS") +logger.setLevel("INFO") + class TestRackTab: """Набор тестов для вкладки 'Стойка' в модуле Объекты. @@ -63,6 +69,8 @@ class TestRackTab: browser: Страница Playwright rack_name: Имя стойки для создания """ + logger.debug(f"Creating rack: {rack_name}") + # Нажимаем кнопку "Создать" на тулбаре self.location_page.click_create_button() @@ -91,6 +99,14 @@ class TestRackTab: # Нажимаем кнопку создания create_child_frame.click_add_button() + # Проверяем уведомление об успешном создании + alert = AlertComponent(browser) + expected_alert_text = f"Элемент {rack_name} создан" + alert.check_alert_presence(expected_alert_text) + alert.close_alert_by_text(expected_alert_text) + + logger.info(f"Rack '{rack_name}' created successfully") + def _delete_rack_from_context_menu(self, browser: Page, rack_name: str) -> None: """Удаляет стойку через контекстное меню. @@ -126,6 +142,14 @@ class TestRackTab: rack_edit.click_remove_button() self.main_page.wait_for_timeout(1000) + # 4. Проверяем уведомление об успешном удалении + alert = AlertComponent(browser) + expected_alert_text = "Успешно удалено" + alert.check_alert_presence(expected_alert_text) + alert.close_alert_by_text(expected_alert_text) + + logger.info(f"Rack '{rack_name}' deleted successfully") + @pytest.fixture(scope="function", autouse=True) def setup(self, browser: Page) -> None: """Фикстура для подготовки тестового окружения. @@ -158,6 +182,8 @@ class TestRackTab: if not self._check_rack_existance(browser, RACK_NAME): self._create_rack(browser, RACK_NAME) self.main_page.wait_for_timeout(3000) + else: + logger.info(f"Rack '{RACK_NAME}' already exists") # Переходим к стойке для тестирования self.main_page.click_subpanel_item(RACK_NAME, parent="test-zone")