163 lines
9.1 KiB
Python
163 lines
9.1 KiB
Python
"""Модуль rack_locators содержит локаторы элементов страницы стойки.
|
||
|
||
Класс RackLocators хранит XPath локаторы для взаимодействия
|
||
с элементами интерфейса стойки оборудования в тестах.
|
||
|
||
"""
|
||
|
||
class RackLocators:
|
||
"""Класс для хранения локаторов элементов страницы стойки.
|
||
|
||
Содержит локаторы в формате XPath для поиска элементов:
|
||
- Вкладки стойки (верхние вкладки)
|
||
- Секции лицевой и обратной сторон стойки
|
||
- Юниты и устройства на стойке
|
||
- Поля формы редактирования и создания стойки
|
||
- Контейнеры и структурные элементы
|
||
"""
|
||
|
||
|
||
# Основной контейнер вкладок стойки (верхние вкладки)
|
||
TABS_CONTAINER = "//div[@data-testid='CABINET_SHOW__tabs' and contains(@class, 'v-tabs')]"
|
||
|
||
# Все элементы верхних вкладок стойки
|
||
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' and "
|
||
"contains(@class, 'cabinet_hide_button_trigger_show')]")
|
||
|
||
# Кнопка "Показать стойку"
|
||
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__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')]")
|
||
|
||
# Классы для проверки активности
|
||
ACTIVE_TAB_CLASSES = ["accent--text", "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')]"
|
||
|
||
# Локаторы полей формы редактирования стойки
|
||
NAME_FIELD = "//input[@aria-label='Имя']"
|
||
SERIAL_NUMBER_FIELD = "//input[@aria-label='Серийный номер']"
|
||
INVENTORY_NUMBER_FIELD = "//input[@aria-label='Инвентарный номер']"
|
||
CABLE_ENTRY_FIELD = "//input[@aria-label='Ввод кабеля']"
|
||
STATUS_FIELD = "//input[@aria-label='Состояние']"
|
||
HEIGHT_FIELD = "//input[@aria-label='Высота в юнитах']"
|
||
OWNER_FIELD = "//input[@aria-label='Владелец']"
|
||
SERVICE_ORG_FIELD = "//input[@aria-label='Обслуживающая организация']"
|
||
PROJECT_FIELD = "//input[@aria-label='Проект/Титул']"
|
||
|
||
# Локаторы полей формы создания стойки
|
||
RACK_NAME_FIELD = ("//div[contains(@class, 'container')]"
|
||
"//label[text()='Имя']/following-sibling::input")
|
||
RACK_HEIGHT_FIELD = ("//div[contains(@class, 'container')]"
|
||
"//div[contains(@class, 'v-input__slot') and "
|
||
".//label[text()='Высота в юнитах']]")
|
||
RACK_DEPTH_FIELD = ("//div[contains(@class, 'container')]"
|
||
"//div[contains(@class, 'v-input__slot') and "
|
||
".//label[text()='Глубина (мм)']]")
|
||
RACK_SERIAL_FIELD = ("//div[contains(@class, 'container')]"
|
||
"//label[text()='Серийный номер']/following-sibling::input")
|
||
RACK_INVENTORY_FIELD = ("//div[contains(@class, 'container')]"
|
||
"//label[text()='Инвентарный номер']/following-sibling::input")
|
||
RACK_COMMENT_FIELD = ("//div[contains(@class, 'container')]"
|
||
"//label[text()='Комментарий']/following-sibling::input")
|
||
RACK_CABLE_ENTRY_FIELD = ("//div[contains(@class, 'container')]"
|
||
"//div[contains(@class, 'v-input__slot') and "
|
||
".//label[text()='Ввод кабеля']]")
|
||
RACK_STATE_FIELD = ("//div[contains(@class, 'container')]"
|
||
"//div[contains(@class, 'v-input__slot') and "
|
||
".//label[text()='Состояние']]")
|
||
|
||
RACK_OWNER_FIELD = ("//div[contains(@class, 'container')]"
|
||
"//div[contains(@class, 'v-input__slot') and "
|
||
".//label[text()='Владелец']]")
|
||
RACK_SERVICE_ORG_FIELD = ("//div[contains(@class, 'container')]"
|
||
"//div[contains(@class, 'v-input__slot') and "
|
||
".//label[text()='Обслуживающая организация']]")
|
||
RACK_PROJECT_FIELD = ("//div[contains(@class, 'container')]"
|
||
"//div[contains(@class, 'v-input__slot') and "
|
||
".//label[text()='Проект/Титул']]")
|
||
|
||
# Универсальные локаторы для поиска combobox полей по имени
|
||
COMBOBOX_BY_FIELD_NAME = ('//form[contains(@class, "v-form")]'
|
||
'//div[@role="combobox"][.//label[contains(text(), "{}")]]')
|
||
COMBOBOX_BY_LABEL = 'form.v-form div[role="combobox"]:has(label:has-text("{}"))'
|
||
|
||
# Локаторы для выпадающего меню
|
||
ACTIVE_MENU = 'div.menuable__content__active'
|
||
DROPDOWN_LIST = 'div.menuable__content__active div[role="list"]'
|
||
DROPDOWN_ITEM_BY_TEXT = ('div.menuable__content__active '
|
||
'div[role="listitem"]:has(span:has-text("{}"))')
|
||
DROPDOWN_ITEM_XPATH = ('//div[contains(@class, "menuable__content__active")]'
|
||
'//div[@role="list"]//div[@role="listitem"][.//*[text()="{}"]]')
|
||
|
||
# Локатор для родительского контейнера поля ввода
|
||
INPUT_PARENT_CONTAINER = "xpath=./ancestor::div[contains(@class, 'v-input')]"
|
||
|
||
# CSS селекторы для ошибок валидации
|
||
ERROR_CSS_SELECTORS = ".error--text, .v-input--error"
|
||
|
||
# ================ ЛОКАТОРЫ ДЛЯ СТРУКТУРЫ СТОЙКИ ===================
|
||
|
||
# Общий контейнер стойки (включает кнопки переключения сторон и MAIN_CONTAINER)
|
||
RACK_CONTAINER = ("//div[contains(@class, 'layout active') and "
|
||
"contains(@class, 'row') and contains(@class, 'shrink')]")
|
||
|
||
# Основной контейнер стойки (изображение стойки)
|
||
MAIN_CONTAINER = "//div[contains(@class, 'layout cabinet')]"
|
||
|
||
# Кнопки переключения сторон
|
||
FRONT_SIDE_BUTTON = "//button[@data-testid='page-cabinet__btn__mount_front']"
|
||
BACK_SIDE_BUTTON = "//button[@data-testid='page-cabinet__btn__mount_rear']"
|
||
|
||
# Локаторы для определения активной стороны
|
||
ACTIVE_SIDE_BUTTON = "//button[contains(@class, 'primary--text')]"
|
||
INACTIVE_SIDE_BUTTON = "//button[contains(@class, 'secondary--text')]"
|
||
|
||
# Для получения текста активной стороны
|
||
ACTIVE_SIDE_BUTTON_TEXT = ("//button[contains(@class, 'primary--text')]"
|
||
"//div[contains(@class, 'v-btn__content')]")
|
||
|
||
# Кнопка добавления (add_circle)
|
||
ADD_CIRCLE_BUTTON = "//i[contains(text(), 'add_circle')]"
|
||
|
||
# Все юниты на стойке
|
||
ALL_UNITS = "//div[contains(@class, 'unit')]"
|
||
|
||
# Позиции юнитов
|
||
UNIT_POSITIONS = ("//div[contains(@class, 'headline') and "
|
||
"contains(@class, 'test-xs-center') and "
|
||
"contains(@class, 'unit-positions')]")
|
||
|
||
# Локатор для устройств
|
||
DEVICE_ELEMENTS = "//div[contains(@class, 'parent-class')]"
|
||
|
||
# Локатор для слотов в устройствах
|
||
DEVICE_SLOTS = "//div[contains(@class, 'slot')]"
|