"""Модуль 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')]"