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

- Обновил локатор кнопки редактирования на использование 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),
"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:

View File

@ -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)
# Проверяем наличие элементов через 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
try:
# Переключаемся на вкладку
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)
self.switch_to_tab(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
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")
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")

View File

@ -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:
"""Тест переключения между вкладками стойки оборудования.