Обновление локаторов элементов стойки
- Обновил локатор кнопки редактирования на использование data-testid - Исправил локаторы кнопок скрытия/показа стойки - Исправил метод определения активной стороны стойки - Добавил вкладку 'Состав' в тесты переключения вкладок - Обновил структуру вкладок в соответствии с текущим UIradislav/element_rack
parent
348530fe37
commit
d71fe80166
|
|
@ -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:
|
||||||
|
|
|
||||||
|
|
@ -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)
|
self.switch_to_tab(tab_name)
|
||||||
|
|
||||||
# Проверяем наличие элементов через count()
|
# Проверяем, что вкладка активна
|
||||||
if tab_elements.count() == 0:
|
if self.is_tab_active(tab_name):
|
||||||
logger.warning(f"Tab '{tab_name}' not found on page")
|
logger.info(f"Successfully switched to tab '{tab_name}'")
|
||||||
failed_switches.append(f"Tab '{tab_name}' not found")
|
successful_switches += 1
|
||||||
continue
|
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:
|
||||||
target_tab = None
|
logger.error(f"Error switching to tab '{tab_name}': {e}")
|
||||||
for i in range(tab_elements.count()):
|
failed_switches.append(f"Tab '{tab_name}' error: {str(e)}")
|
||||||
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
|
|
||||||
|
|
||||||
# Небольшая пауза между переключениями
|
# Небольшая пауза между переключениями
|
||||||
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")
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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:
|
||||||
"""Тест переключения между вкладками стойки оборудования.
|
"""Тест переключения между вкладками стойки оборудования.
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue