"""Модуль 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='Проект/Титул']" # Локаторы для отображения сторон стойки 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')]"