From e87b428f09e9fb82c80653705024c431b0b1c6e8 Mon Sep 17 00:00:00 2001 From: Radislav Date: Mon, 15 Dec 2025 16:38:59 +0300 Subject: [PATCH] =?UTF-8?q?=D0=9E=D0=B1=D0=BD=D0=BE=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=D0=B8=D0=B5=20=D0=BB=D0=BE=D0=BA=D0=B0=D1=82=D0=BE=D1=80?= =?UTF-8?q?=D0=BE=D0=B2=20=D1=8D=D0=BB=D0=B5=D0=BC=D0=B5=D0=BD=D1=82=D0=BE?= =?UTF-8?q?=D0=B2=20=D1=81=D1=82=D0=BE=D0=B9=D0=BA=D0=B8=20v2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- locators/rack_locators.py | 18 +++++++---- pages/rack_page.py | 43 +++++++++++++++++++------ tests/e2e/elements/test_element_rack.py | 9 +++--- 3 files changed, 49 insertions(+), 21 deletions(-) diff --git a/locators/rack_locators.py b/locators/rack_locators.py index 42ded6a..8359988 100644 --- a/locators/rack_locators.py +++ b/locators/rack_locators.py @@ -16,27 +16,28 @@ class RackLocators: - Контейнеры и структурные элементы """ + # Основной контейнер вкладок стойки (верхние вкладки) - TABS_CONTAINER = "//div[starts-with(@data-testid, 'CABINET_SHOW__') and contains(@class, 'v-tabs__div')]" + TABS_CONTAINER = "//div[@data-testid='CABINET_SHOW__tabs' and contains(@class, 'v-tabs')]" # Все элементы верхних вкладок стойки - ALL_TABS = "//div[starts-with(@data-testid, 'CABINET_SHOW__') and contains(@class, 'v-tabs__div')]//a[contains(@class, 'v-tabs__item')]" + ALL_TABS = "//div[@data-testid='CABINET_SHOW__tabs']//a[contains(@class, 'v-tabs__item')]" # Кнопка редактирования свойств стойки EDIT_BUTTON ="//button[@data-testid='CABINET_SHOW__btn__edit']" # Кнопка "Скрыть стойку" - HIDE_RACK_BUTTON = "//div[@data-testid='CABINET_SHOW__div__hideCabinet']" + HIDE_RACK_BUTTON = "//div[@data-testid='CABINET_SHOW__div__hideCabinet' and contains(@class, 'cabinet_hide_button_trigger_show')]" # Кнопка "Показать стойку" - SHOW_RACK_BUTTON = "//div[@data-testid='CABINET_SHOW__div__hideCabinet']" + SHOW_RACK_BUTTON = "//div[@data-testid='CABINET_SHOW__div__hideCabinet' and contains(@class, 'cabinet_hide_button_trigger_hide')]" # Универсальный локатор для любой вкладки по имени TAB_BY_NAME = "//div[starts-with(@data-testid, 'CABINET_SHOW__') and contains(@class, 'v-tabs__div')]//a[contains(@class, 'v-tabs__item') and .//*[contains(., '{}')]]" # Конкретные вкладки по тексту COMPOSITION_TAB = "//div[@data-testid='CABINET_SHOW__composition_tab']//a[contains(@class, 'v-tabs__item')]" - GENERAL_INFO_TAB = "//div[@data-testid='CABINET_SHOW__general_info_tab']//a[contains(@class, 'v-tabs__item')]" + GENERAL_INFO_TAB = "//div[@data-testid='CABINET_SHOW__main_tab']//a[contains(@class, 'v-tabs__item')]" MAINTENANCE_TAB = "//div[@data-testid='CABINET_SHOW__service_tab']//a[contains(@class, 'v-tabs__item')]" EVENTS_TAB = "//div[@data-testid='CABINET_SHOW__events_tab']//a[contains(@class, 'v-tabs__item')]" SERVICES_TAB = "//div[@data-testid='CABINET_SHOW__services_tab']//a[contains(@class, 'v-tabs__item')]" @@ -45,7 +46,7 @@ class RackLocators: ACTIVE_TAB_CLASSES = ["accent--text", "v-tabs__item--active"] # Локатор для активной вкладки - ACTIVE_TAB = "//div[starts-with(@data-testid, 'CABINET_SHOW__') and contains(@class, 'v-tabs__div')]//a[contains(@class, 'v-tabs__item--active')]" + ACTIVE_TAB = "//div[@data-testid='CABINET_SHOW__tabs']//a[contains(@class, 'v-tabs__item--active')]" # Контейнер формы FORM_CONTAINER = "//div[contains(@class, 'container')]" @@ -82,7 +83,10 @@ class RackLocators: # ================ ЛОКАТОРЫ ДЛЯ СТРУКТУРЫ СТОЙКИ =================== - # Основной контейнер стойки + # Общий контейнер стойки (включает кнопки переключения сторон и MAIN_CONTAINER) + RACK_CONTAINER = "//div[contains(@class, 'layout active') and contains(@class, 'row') and contains(@class, 'shrink')]" + + # Основной контейнер стойки (изображение стойки) MAIN_CONTAINER = "//div[contains(@class, 'layout cabinet')]" # Кнопки переключения сторон diff --git a/pages/rack_page.py b/pages/rack_page.py index 2c10046..3489663 100644 --- a/pages/rack_page.py +++ b/pages/rack_page.py @@ -433,34 +433,57 @@ class RackPage(BasePage): def should_have_hide_rack_button(self) -> None: """ - Упрощенная проверка кнопки "Скрыть стойку". - Проверяет только кликабельность и наличие элемента. + Проверка кнопки "Скрыть стойку". + Проверяет видимость, тултип, кликабельность и эффект скрытия стойки. """ logger.info("Checking 'Hide rack' button...") - # Проверяем видимость + # Проверяем видимость кнопки self.toolbar.check_button_visibility("hide_rack") self.toolbar.check_button_tooltip("hide_rack", "Скрыть стойку") - # Проверяем, что кнопка кликабельна + # Получаем общий контейнер стойки до клика + rack_container = self.page.locator(RackLocators.RACK_CONTAINER) + + # Проверяем, что контейнер существует + expect(rack_container).to_be_visible(timeout=5000) + + # Кликаем на кнопку "Скрыть стойку" self.toolbar.get_button_by_name("hide_rack").click() - self.wait_for_timeout(1000) + self.wait_for_timeout(2000) # Даем время для применения стилей + + # Проверяем, что общий контейнер стойки теперь скрыт (имеет display: none) + expect(rack_container).to_have_css("display", "none", timeout=5000) + logger.info("Rack container successfully hidden (display: none)") + + logger.info("'Hide rack' button test completed successfully") def should_have_show_rack_button(self) -> None: """ Проверка кнопки "Показать стойку". - Проверяет наличие, тултип и кликабельность. + Проверяет наличие, тултип, кликабельность и эффект показа стойки. """ - logger.info("Checking 'Show rack' button...") - # Проверяем видимость + # Проверяем видимость кнопки self.toolbar.check_button_visibility("show_rack") self.toolbar.check_button_tooltip("show_rack", "Показать стойку") - # Проверяем кликабельность + # Получаем общий контейнер стойки + rack_container = self.page.locator(RackLocators.RACK_CONTAINER) + + # Проверяем, что контейнер существует + expect(rack_container).to_be_attached(timeout=5000) + + # Кликаем на кнопку "Показать стойку" self.toolbar.get_button_by_name("show_rack").click() - self.wait_for_timeout(1000) + self.wait_for_timeout(2000) # Даем время для применения стилей + + # Проверяем, что общий контейнер стойки теперь видим (display не равен "none") + expect(rack_container).not_to_have_css("display", "none", timeout=5000) + logger.info("Rack container successfully shown (display is not 'none')") + + logger.info("'Show rack' button test completed successfully") # Вспомогательные методы diff --git a/tests/e2e/elements/test_element_rack.py b/tests/e2e/elements/test_element_rack.py index 37770ca..29512df 100644 --- a/tests/e2e/elements/test_element_rack.py +++ b/tests/e2e/elements/test_element_rack.py @@ -57,7 +57,7 @@ class TestRackTab: mp.click_subpanel_item("Test-Rack-01", parent="test-zone") mp.wait_for_timeout(3000) - #@pytest.mark.develop + @pytest.mark.develop def test_rack_tab_content(self, browser: Page) -> None: """Тест содержимого вкладки 'Стойка'. @@ -89,11 +89,8 @@ class TestRackTab: # Проверка кнопки "Показать стойку" rt.should_have_show_rack_button() - # Переход в режим редактирования - rt.should_be_toolbar_buttons() rt.wait_for_timeout(2000) - @pytest.mark.develop def test_rack_tab_switching(self, browser: Page) -> None: """Тест переключения между вкладками стойки оборудования. @@ -116,3 +113,7 @@ class TestRackTab: # Проверяем переключение между всеми вкладками стойки rt.check_tab_switching() + + # Переход в режим редактирования + rt.should_be_toolbar_buttons() + rt.wait_for_timeout(2000)