From d71fe801664839b6f7e20a7eb587b6c09824f453 Mon Sep 17 00:00:00 2001 From: Radislav Date: Mon, 15 Dec 2025 11:27:01 +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?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Обновил локатор кнопки редактирования на использование data-testid - Исправил локаторы кнопок скрытия/показа стойки - Исправил метод определения активной стороны стойки - Добавил вкладку 'Состав' в тесты переключения вкладок - Обновил структуру вкладок в соответствии с текущим UI --- components/eventbar_component.py | 5 +- pages/rack_page.py | 120 ++++++++++-------------- tests/e2e/elements/test_element_rack.py | 3 +- 3 files changed, 56 insertions(+), 72 deletions(-) diff --git a/components/eventbar_component.py b/components/eventbar_component.py index 266017f..219c228 100644 --- a/components/eventbar_component.py +++ b/components/eventbar_component.py @@ -45,9 +45,8 @@ class EventPanelComponent(BaseComponent): self.page.locator(EventPanelLocators.BUTTONS_EVENT).nth(3), "failure_button") - buttons_service_locators = self.page.locator(EventPanelLocators.BUTTONS_SERVICE).get_by_role("button").all() - self.search_button = Button(page, buttons_service_locators[0], "search_button") - self.user_button = Button(page, buttons_service_locators[1], "user_button") + user_button_locator = self.page.locator(EventPanelLocators.BUTTONS_SERVICE).get_by_role("button") + self.user_button = Button(page, user_button_locator, "user_button") # Действия: def click_expand_less_button(self) -> None: diff --git a/pages/rack_page.py b/pages/rack_page.py index ada90e3..2c10046 100644 --- a/pages/rack_page.py +++ b/pages/rack_page.py @@ -110,16 +110,23 @@ class RackPage(BasePage): def get_current_active_side(self) -> str: """ Возвращает текущую активную сторону стойки. - - Returns: - str: Название активной стороны ('Лицевая сторона' или 'Обратная сторона') + Проверяет конкретные кнопки стойки напрямую. """ - active_button = self.page.locator(RackLocators.ACTIVE_SIDE_BUTTON_TEXT) - if active_button.count() > 0: - text = active_button.first.text_content() - if text: - return text.strip() + # Проверяем конкретно кнопку "Лицевая сторона" + front_btn = self.page.locator(RackLocators.FRONT_SIDE_BUTTON) + if front_btn.count() > 0: + classes = front_btn.first.get_attribute("class") or "" + if "primary--text" in classes.split(): + return "Лицевая сторона" + + # Проверяем конкретно кнопку "Обратная сторона" + back_btn = self.page.locator(RackLocators.BACK_SIDE_BUTTON) + if back_btn.count() > 0: + classes = back_btn.first.get_attribute("class") or "" + if "primary--text" in classes.split(): + return "Обратная сторона" + return "" def get_toolbar_title(self) -> list[str]: @@ -137,6 +144,11 @@ class RackPage(BasePage): return self.toolbar.get_toolbar_composite_title_text(toolbar_title_locator) + def switch_to_composition_tab(self) -> None: + """Переключается на вкладку 'Состав'.""" + + self.switch_to_tab("Состав") + def switch_to_events_tab(self) -> None: """Переключается на вкладку 'События'.""" @@ -246,16 +258,14 @@ class RackPage(BasePage): def check_tab_switching(self) -> None: """ - Проверяет переключение между вкладками стойки в соответствии с локаторами. - - Raises: - AssertionError: Если переключение на одну или более вкладок не удалось + Проверяет переключение между вкладками стойки. """ logger.info("Testing rack tab switching functionality...") - # Вкладки + # Вкладки в правильном порядке defined_tabs = [ + "Состав", "Общая информация", "Обслуживание", "События", @@ -271,53 +281,21 @@ class RackPage(BasePage): for tab_name in defined_tabs: logger.info(f"Testing switch to tab '{tab_name}'...") - # Проверяем существование локатора для этой вкладки - tab_locator = RackLocators.TAB_BY_NAME.format(tab_name) - tab_elements = self.page.locator(tab_locator) + try: + # Переключаемся на вкладку + self.switch_to_tab(tab_name) - # Проверяем наличие элементов через count() - if tab_elements.count() == 0: - logger.warning(f"Tab '{tab_name}' not found on page") - failed_switches.append(f"Tab '{tab_name}' not found") - continue + # Проверяем, что вкладка активна + if self.is_tab_active(tab_name): + logger.info(f"Successfully switched to tab '{tab_name}'") + successful_switches += 1 + else: + logger.warning(f"Tab '{tab_name}' not active after switching") + failed_switches.append(f"Tab '{tab_name}' is not active after click") - # Находим видимую и доступную вкладку - target_tab = None - for i in range(tab_elements.count()): - element = tab_elements.nth(i) - # Проверки видимости и доступности - if element.is_visible() and element.is_enabled(): - target_tab = element - break - - if not target_tab: - logger.warning(f"No visible/available tab '{tab_name}' found") - failed_switches.append(f"Tab '{tab_name}' is not visible/available") - continue - - # Переключаемся на вкладку - logger.info(f"Switching to tab '{tab_name}'...") - - # Проверяем активность ДО клика - if self.is_tab_active(tab_name): - logger.info(f"Tab '{tab_name}' is already active") - successful_switches += 1 - continue - - # Кликаем на вкладку с таймаутом - target_tab.click(timeout=5000) - - # Ждем изменения активной вкладки - self._wait_for_tab_activation(tab_name) - - # Проверяем, что вкладка активна - if not self.is_tab_active(tab_name): - logger.warning(f"Tab '{tab_name}' not active after switching") - failed_switches.append(f"Tab '{tab_name}' is not active after click") - continue - - logger.info(f"Successfully switched to tab '{tab_name}'") - successful_switches += 1 + except Exception as e: + logger.error(f"Error switching to tab '{tab_name}': {e}") + failed_switches.append(f"Tab '{tab_name}' error: {str(e)}") # Небольшая пауза между переключениями self.wait_for_timeout(1000) @@ -390,7 +368,6 @@ class RackPage(BasePage): f"and expected {expected_toolbar_title_items}" ) - self.toolbar.check_button_visibility("edit") def should_be_rack_sides_displayed(self) -> None: """Проверка отображения и структуры сторон стойки.""" @@ -501,8 +478,13 @@ class RackPage(BasePage): logger.info(f"Checking {side_name}...") + # Логируем текущее состояние кнопки перед кликом + button_classes = side_button.get_attribute("class") or "" + logger.info(f"Button classes before click: {button_classes}") + # Проверяем, активна ли уже эта сторона current_active = self.get_current_active_side() + logger.info(f"Current active side (before click): '{current_active}'") if current_active == side_name: logger.info(f"{side_name} is already active") @@ -510,17 +492,19 @@ class RackPage(BasePage): # Если не активна, кликаем для переключения logger.info(f"Switching to {side_name}...") side_button.click() - # Даем время на перерисовку - self.wait_for_timeout(1500) + # Даем время на перерисовку классов (увеличиваем время) + self.wait_for_timeout(2500) - # Проверяем, что сторона активирована - active_button_after = self.page.locator(RackLocators.ACTIVE_SIDE_BUTTON_TEXT) - assert active_button_after.count() > 0, \ - f"No active button found after clicking on {side_name}" + # Проверяем классы после клика + button_classes_after = side_button.get_attribute("class") or "" + logger.info(f"Button classes after click: {button_classes_after}") - active_text_after = active_button_after.first.text_content().strip() - assert active_text_after == side_name, \ - f"Wrong side is active: '{active_text_after}', expected: '{side_name}'" + # Проверяем, что нужная сторона стала активной + active_side = self.get_current_active_side() + logger.info(f"Active side after switching: '{active_side}'") + + assert active_side == side_name, \ + f"Wrong side is active: '{active_side}', expected: '{side_name}'" logger.info(f"{side_name} successfully activated") diff --git a/tests/e2e/elements/test_element_rack.py b/tests/e2e/elements/test_element_rack.py index a5fbd8d..37770ca 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: """Тест содержимого вкладки 'Стойка'. @@ -93,6 +93,7 @@ class TestRackTab: rt.should_be_toolbar_buttons() rt.wait_for_timeout(2000) + @pytest.mark.develop def test_rack_tab_switching(self, browser: Page) -> None: """Тест переключения между вкладками стойки оборудования.