Обновление локаторов элементов стойки

- Обновил локатор кнопки редактирования на использование data-testid
- Исправил локаторы кнопок скрытия/показа стойки
- Исправил метод определения активной стороны стойки
- Добавил вкладку 'Состав' в тесты переключения вкладок
- Обновил структуру вкладок в соответствии с текущим UI
radislav/element_rack
Radislav 2025-12-15 11:27:01 +03:00
parent 348530fe37
commit d71fe80166
3 changed files with 56 additions and 72 deletions

View File

@ -45,9 +45,8 @@ class EventPanelComponent(BaseComponent):
self.page.locator(EventPanelLocators.BUTTONS_EVENT).nth(3), self.page.locator(EventPanelLocators.BUTTONS_EVENT).nth(3),
"failure_button") "failure_button")
buttons_service_locators = self.page.locator(EventPanelLocators.BUTTONS_SERVICE).get_by_role("button").all() user_button_locator = self.page.locator(EventPanelLocators.BUTTONS_SERVICE).get_by_role("button")
self.search_button = Button(page, buttons_service_locators[0], "search_button") self.user_button = Button(page, user_button_locator, "user_button")
self.user_button = Button(page, buttons_service_locators[1], "user_button")
# Действия: # Действия:
def click_expand_less_button(self) -> None: def click_expand_less_button(self) -> None:

View File

@ -110,16 +110,23 @@ class RackPage(BasePage):
def get_current_active_side(self) -> str: def get_current_active_side(self) -> str:
""" """
Возвращает текущую активную сторону стойки. Возвращает текущую активную сторону стойки.
Проверяет конкретные кнопки стойки напрямую.
Returns:
str: Название активной стороны ('Лицевая сторона' или 'Обратная сторона')
""" """
active_button = self.page.locator(RackLocators.ACTIVE_SIDE_BUTTON_TEXT) # Проверяем конкретно кнопку "Лицевая сторона"
if active_button.count() > 0: front_btn = self.page.locator(RackLocators.FRONT_SIDE_BUTTON)
text = active_button.first.text_content() if front_btn.count() > 0:
if text: classes = front_btn.first.get_attribute("class") or ""
return text.strip() 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 "" return ""
def get_toolbar_title(self) -> list[str]: 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) 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: def switch_to_events_tab(self) -> None:
"""Переключается на вкладку 'События'.""" """Переключается на вкладку 'События'."""
@ -246,16 +258,14 @@ class RackPage(BasePage):
def check_tab_switching(self) -> None: def check_tab_switching(self) -> None:
""" """
Проверяет переключение между вкладками стойки в соответствии с локаторами. Проверяет переключение между вкладками стойки.
Raises:
AssertionError: Если переключение на одну или более вкладок не удалось
""" """
logger.info("Testing rack tab switching functionality...") logger.info("Testing rack tab switching functionality...")
# Вкладки # Вкладки в правильном порядке
defined_tabs = [ defined_tabs = [
"Состав",
"Общая информация", "Общая информация",
"Обслуживание", "Обслуживание",
"События", "События",
@ -271,53 +281,21 @@ class RackPage(BasePage):
for tab_name in defined_tabs: for tab_name in defined_tabs:
logger.info(f"Testing switch to tab '{tab_name}'...") logger.info(f"Testing switch to tab '{tab_name}'...")
# Проверяем существование локатора для этой вкладки try:
tab_locator = RackLocators.TAB_BY_NAME.format(tab_name)
tab_elements = self.page.locator(tab_locator)
# Проверяем наличие элементов через 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
# Находим видимую и доступную вкладку
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}'...") self.switch_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): if 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}'") logger.info(f"Successfully switched to tab '{tab_name}'")
successful_switches += 1 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")
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) self.wait_for_timeout(1000)
@ -390,7 +368,6 @@ class RackPage(BasePage):
f"and expected {expected_toolbar_title_items}" f"and expected {expected_toolbar_title_items}"
) )
self.toolbar.check_button_visibility("edit")
def should_be_rack_sides_displayed(self) -> None: def should_be_rack_sides_displayed(self) -> None:
"""Проверка отображения и структуры сторон стойки.""" """Проверка отображения и структуры сторон стойки."""
@ -501,8 +478,13 @@ class RackPage(BasePage):
logger.info(f"Checking {side_name}...") 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() current_active = self.get_current_active_side()
logger.info(f"Current active side (before click): '{current_active}'")
if current_active == side_name: if current_active == side_name:
logger.info(f"{side_name} is already active") logger.info(f"{side_name} is already active")
@ -510,17 +492,19 @@ class RackPage(BasePage):
# Если не активна, кликаем для переключения # Если не активна, кликаем для переключения
logger.info(f"Switching to {side_name}...") logger.info(f"Switching to {side_name}...")
side_button.click() side_button.click()
# Даем время на перерисовку # Даем время на перерисовку классов (увеличиваем время)
self.wait_for_timeout(1500) self.wait_for_timeout(2500)
# Проверяем, что сторона активирована # Проверяем классы после клика
active_button_after = self.page.locator(RackLocators.ACTIVE_SIDE_BUTTON_TEXT) button_classes_after = side_button.get_attribute("class") or ""
assert active_button_after.count() > 0, \ logger.info(f"Button classes after click: {button_classes_after}")
f"No active button found after clicking on {side_name}"
active_text_after = active_button_after.first.text_content().strip() # Проверяем, что нужная сторона стала активной
assert active_text_after == side_name, \ active_side = self.get_current_active_side()
f"Wrong side is active: '{active_text_after}', expected: '{side_name}'" 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") logger.info(f"{side_name} successfully activated")

View File

@ -57,7 +57,7 @@ class TestRackTab:
mp.click_subpanel_item("Test-Rack-01", parent="test-zone") mp.click_subpanel_item("Test-Rack-01", parent="test-zone")
mp.wait_for_timeout(3000) mp.wait_for_timeout(3000)
@pytest.mark.develop #@pytest.mark.develop
def test_rack_tab_content(self, browser: Page) -> None: def test_rack_tab_content(self, browser: Page) -> None:
"""Тест содержимого вкладки 'Стойка'. """Тест содержимого вкладки 'Стойка'.
@ -93,6 +93,7 @@ class TestRackTab:
rt.should_be_toolbar_buttons() rt.should_be_toolbar_buttons()
rt.wait_for_timeout(2000) rt.wait_for_timeout(2000)
@pytest.mark.develop
def test_rack_tab_switching(self, browser: Page) -> None: def test_rack_tab_switching(self, browser: Page) -> None:
"""Тест переключения между вкладками стойки оборудования. """Тест переключения между вкладками стойки оборудования.