104 lines
6.3 KiB
Python
104 lines
6.3 KiB
Python
"""Модуль rack_locators содержит локаторы элементов страницы стойки.
|
||
|
||
Класс RackLocators хранит XPath локаторы для взаимодействия
|
||
с элементами интерфейса стойки оборудования в тестах.
|
||
"""
|
||
|
||
class RackLocators:
|
||
"""Класс для хранения локаторов элементов страницы стойки.
|
||
|
||
Содержит локаторы в формате XPath для поиска элементов:
|
||
- Вкладки стойки (верхние вкладки)
|
||
- Секции лицевой и обратной сторон стойки
|
||
- Юниты и устройства на стойке
|
||
- Поля формы редактирования и создания стойки
|
||
- Контейнеры и структурные элементы
|
||
"""
|
||
|
||
# Основной контейнер вкладок стойки (верхние вкладки)
|
||
TABS_CONTAINER = "//div[@class='v-tabs__container']"
|
||
|
||
# Все элементы верхних вкладок стойки
|
||
ALL_TABS = "//div[@class='v-tabs__container']//a[contains(@class, 'v-tabs__item')]"
|
||
|
||
# Универсальный локатор для любой вкладки по имени
|
||
TAB_BY_NAME = "//div[@class='v-tabs__container']//a[contains(@class, 'v-tabs__item') and contains(., '{}')]"
|
||
|
||
# Конкретные вкладки по тексту
|
||
GENERAL_INFO_TAB = "//div[@class='v-tabs__container']//a[contains(@class, 'v-tabs__item') and contains(., 'Общая информация')]"
|
||
MAINTENANCE_TAB = "//div[@class='v-tabs__container']//a[contains(@class, 'v-tabs__item') and contains(., 'Обслуживание')]"
|
||
EVENTS_TAB = "//div[@class='v-tabs__container']//a[contains(@class, 'v-tabs__item') and contains(., 'События')]"
|
||
SERVICES_TAB = "//div[@class='v-tabs__container']//a[contains(@class, 'v-tabs__item') and contains(., 'Сервисы')]"
|
||
|
||
# Классы для проверки активности
|
||
ACTIVE_TAB_CLASSES = ["accent--text", "v-tabs__item--active"]
|
||
|
||
# Локатор для активной вкладки
|
||
ACTIVE_TAB = "//div[@class='v-tabs__container']//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 = "//label[text()='Имя']/following-sibling::input"
|
||
RACK_HEIGHT_FIELD = "//div[contains(@class, 'v-input__slot') and .//label[text()='Высота в юнитах']]"
|
||
RACK_DEPTH_FIELD = "//div[contains(@class, 'v-input__slot') and .//label[text()='Глубина (мм)']]"
|
||
RACK_SERIAL_FIELD = "//label[text()='Серийный номер']/following-sibling::input"
|
||
RACK_INVENTORY_FIELD = "//label[text()='Инвентарный номер']/following-sibling::input"
|
||
RACK_COMMENT_FIELD = "//label[text()='Комментарий']/following-sibling::input"
|
||
RACK_CABLE_ENTRY_FIELD = "//div[contains(@class, 'v-input__slot') and .//label[text()='Ввод кабеля']]"
|
||
RACK_STATE_FIELD = "//div[contains(@class, 'container')]//div[contains(@class, 'v-input__slot white') and .//label[text()='Состояние']]"
|
||
RACK_OWNER_FIELD = "//div[contains(@class, 'v-input__slot') and .//label[text()='Владелец']]"
|
||
RACK_SERVICE_ORG_FIELD = "//div[contains(@class, 'v-input__slot') and .//label[text()='Обслуживающая организация']]"
|
||
RACK_PROJECT_FIELD = "//div[contains(@class, 'v-input__slot') and .//label[text()='Проект/Титул']]"
|
||
|
||
# Локатор для родительского контейнера поля ввода
|
||
INPUT_PARENT_CONTAINER = "xpath=./ancestor::div[contains(@class, 'v-input')]"
|
||
|
||
# Локаторы для отображения сторон стойки
|
||
FRONT_SIDE_CONTAINER = "//div[contains(@class, 'cabinet') and not(contains(@class, 'back'))]"
|
||
BACK_SIDE_CONTAINER = "//div[contains(@class, 'cabinet') and contains(@class, 'back')]"
|
||
|
||
FRONT_SIDE_TITLE = "//span[contains(@class, 'subheading') and contains(text(), 'Лицевая сторона')]"
|
||
BACK_SIDE_TITLE = "//span[contains(@class, 'subheading') and contains(text(), 'Обратная сторона')]"
|
||
|
||
# Юниты на лицевой стороне
|
||
FRONT_SIDE_UNITS = ".cabinet:not(.back) .unit, .unit:not(.back)"
|
||
|
||
# Юниты на обратной стороне
|
||
BACK_SIDE_UNITS = ".cabinet.back .unit"
|
||
|
||
# Локатор для всех юнитов
|
||
ALL_UNITS = ".unit"
|
||
|
||
# Устройства на лицевой стороне
|
||
FRONT_SIDE_DEVICES = "//*[contains(@class, 'parent-class')]"
|
||
|
||
# Устройства на обратной стороне
|
||
BACK_SIDE_DEVICES = "//*[contains(@class, 'parent-class')]"
|
||
|
||
# Позиции юнитов
|
||
UNIT_POSITIONS = "//div[contains(@class, 'unit-positions')]"
|
||
|
||
# Контейнер с обеими сторонами
|
||
SIDES_CONTAINER = "//div[contains(@class, 'layout row shrink fill-height ma-0 pa-0')]"
|
||
|
||
# ЛОКАТОРЫ ДЛЯ СТРУКТУРЫ СТОРОН
|
||
# Основные секции сторон
|
||
FRONT_SIDE_SECTION = "//span[contains(text(), 'Лицевая сторона')]//ancestor::div[contains(@class, 'flex shrink')]"
|
||
BACK_SIDE_SECTION = "//span[contains(text(), 'Обратная сторона')]//ancestor::div[contains(@class, 'flex shrink')]"
|
||
|
||
# Основной контейнер стойки
|
||
MAIN_CONTAINER = "//div[contains(@class, 'layout row')]"
|