"""Модуль rack_locators содержит локаторы элементов страницы стойки. Класс RackLocators хранит XPath локаторы для взаимодействия с элементами интерфейса стойки оборудования в тестах. """ class RackLocators: """Класс для хранения локаторов элементов страницы стойки. Содержит локаторы в формате XPath для поиска элементов: - Вкладки стойки (верхние вкладки) - Секции лицевой и обратной сторон стойки - Юниты и устройства на стойке - Поля формы редактирования и создания стойки - Контейнеры и структурные элементы """ # Основной контейнер вкладок стойки (верхние вкладки) ALL_TABS = "//div[@data-testid='CABINET_SHOW__tabs']//a[contains(@class, 'v-tabs__item')]" # Универсальный локатор для любой вкладки по имени TAB_BY_NAME = ("//div[starts-with(@data-testid, 'CABINET_SHOW__') and " "contains(@class, 'v-tabs__div')]//a[contains(@class, 'v-tabs__item') and " ".//*[contains(., '{}')]]") # Локатор для активной вкладки ACTIVE_TAB = ("//div[@data-testid='CABINET_SHOW__tabs']" "//a[contains(@class, 'v-tabs__item--active')]") # Контейнер формы создания/редактирования стойки FORM_INPUT_CONTAINER = "//div[contains(@class, 'flex xs6 pa-0')]" # Форма редактирования стойки в модальном окне RACK_EDIT_FORM = "[data-testid='cabinet-bar__cabinet-form']" # Локаторы полей формы INPUT_FORM_RACK_DATA = f"{RACK_EDIT_FORM}" INPUT_FORM_RACK_DATA_FIELD_NAME = "[data-testid='cabinet-bar__main__text-field__name']" INPUT_FORM_RACK_DATA_FIELD_COMMENT = "[data-testid='cabinet-bar__main__text-field__comment']" INPUT_FORM_RACK_DATA_FIELD_SERIAL = "[data-testid='cabinet-bar__main__text-field__serial_number']" INPUT_FORM_RACK_DATA_FIELD_INVENTORY = "[data-testid='cabinet-bar__main__text-field__inventory_number']" INPUT_FORM_RACK_DATA_FIELD_POWER = "[data-testid='cabinet-bar__main__text-field__allocated_power']" # Локаторы для combobox полей INPUT_FORM_RACK_DATA_FIELD_CABLE_ENTRY = "[data-testid='cabinet-bar__select_enum__select-field__cable_input']" INPUT_FORM_RACK_DATA_FIELD_CONDITION_TYPE = "[data-testid='cabinet-bar__select_enum__select-field__condition_type']" INPUT_FORM_RACK_DATA_FIELD_DEPTH = "[data-testid='cabinet-bar__select_enum__select-field__depth']" INPUT_FORM_RACK_DATA_FIELD_USIZE = "[data-testid='cabinet-bar__select_enum__select-field__usize']" INPUT_FORM_RACK_DATA_FIELD_OWNER = "[data-testid='cabinet-bar__select__select-field__owner']" INPUT_FORM_RACK_DATA_FIELD_SERVICE_PROVIDER = "[data-testid='cabinet-bar__select__select-field__service_provider']" INPUT_FORM_RACK_DATA_FIELD_PROJECT = "[data-testid='cabinet-bar__select__select-field__project']" # Чекбоксы INPUT_FORM_RACK_DATA_CHECKBOX_VENTILATION = "[data-testid='cabinet-bar__main__checkbox__available_ventilation_panel'] input[type='checkbox']" INPUT_FORM_RACK_DATA_CHECKBOX_VENTILATION_LABEL = "label:has-text('Вентиляционная панель')" INPUT_FORM_RACK_DATA_CHECKBOX_VENTILATION_CONTAINER = "[data-testid='cabinet-bar__main__checkbox__available_ventilation_panel']" # Локаторы для меню combobox MENU_ACTIVE_RACK_FORM = "//div[contains(@class, 'menuable__content__active')]" MENU_ACTIVE_ITEMS = "//div[@role='list']//div[@role='listitem']" # Локаторы для выпадающего меню (которые использовались в старом коде) DROPDOWN_LIST = 'div.menuable__content__active div[role="list"]' DROPDOWN_ITEM_BY_TEXT = ('div.menuable__content__active ' 'div[role="listitem"]:has(span:has-text("{}"))') # 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')]" # Кнопка добавления (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')]" # Кнопка редактирования свойств стойки 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')]") # Кнопки тулбара стойки TOOLBAR_REPLACE_BUTTON = "[data-testid='cabinet-bar__toolbar__btn__replace']" TOOLBAR_DONE_BUTTON = "[data-testid='cabinet-bar__toolbar__btn__done']" TOOLBAR_CLOSE_BUTTON = "[data-testid='cabinet-bar__toolbar__btn__close']" TOOLBAR_REMOVE_BUTTON = "[data-testid='cabinet-bar__toolbar__btn__remove']" # Диалог удаления REMOVE_DIALOG = "[data-testid='cabinet-bar__toolbar__dialog-remove']" # Кнопки подтверждения удаления CONFIRM_REMOVE_YES_BUTTON = "[data-testid='cabinet-bar__card_confirmation__btn__yes']" CONFIRM_REMOVE_NO_BUTTON = "[data-testid='cabinet-bar__card_confirmation__btn__no']" # ================ ЛОКАТОРЫ ДЛЯ ВКЛАДОК в модальном окне редактирования == # Локаторы для вкладок в модальном окне редактирования MODAL_TAB_GENERAL = "[data-testid='cabinet-bar__main_tab']" MODAL_TAB_IMAGE = "[data-testid='cabinet-bar__photo_tab']" MODAL_TAB_SETTINGS = "[data-testid='cabinet-bar__settings_tab']" # ================ ЛОКАТОРЫ ДЛЯ ВКЛАДКИ "Изображение" =================== IMAGE_UPLOAD_CONTAINER = "div.layout.column.fill-height.justify-center.align-center" IMAGE_UPLOAD_ICON = "i.mdi-add_photo_alternate" IMAGE_UPLOAD_INPUT = "input.button-file-upload__input[type='file']" IMAGE_PREVIEW = "img" IMAGE_CONTAINER = "div.layout.column.fill-height.justify-center.align-center" # ================ ЛОКАТОРЫ ДЛЯ ВКЛАДКИ "НАСТРОЙКИ" =================== # Контейнер вкладки "Настройки" SETTINGS_CONTAINER = "div.layout.back.fill-height.justify-start" SETTINGS_ACCESS_MANAGER_TITLE = "div.v-toolbar__title:has-text('Менеджер доступа')" # Локаторы для полей правил доступа SETTINGS_READ_RULES = "[data-testid='LOCATION_SETTINGS__select__rules.read']" SETTINGS_WRITE_RULES = "[data-testid='LOCATION_SETTINGS__select__rules.write']" SETTINGS_SMS_RULES = "[data-testid='LOCATION_SETTINGS__select__rules.sms']" SETTINGS_EMAIL_RULES = "[data-testid='LOCATION_SETTINGS__select__rules.email']" SETTINGS_PUSH_RULES = "[data-testid*='rules.push']" # Кнопки вкладки "Настройки" SETTINGS_CANCEL_BUTTON = "[data-testid='LOCATION_SETTINGS__btn__cancel']"