From 4523ff6db35d415f3842808aa4007417df5512cb Mon Sep 17 00:00:00 2001 From: Radislav Date: Mon, 15 Dec 2025 13:25:59 +0300 Subject: [PATCH] =?UTF-8?q?=D0=9E=D0=B1=D0=BD=D0=BE=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=D0=B8=D0=B5=20=D0=BB=D0=BE=D0=BA=D0=B0=D1=82=D0=BE=D1=80?= =?UTF-8?q?=D0=BE=D0=B2=20=D1=8D=D0=BB=D0=B5=D0=BC=D0=B5=D0=BD=D1=82=D0=BE?= =?UTF-8?q?=D0=B2=20=D1=81=D1=82=D0=BE=D0=B9=D0=BA=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- locators/rack_locators.py | 37 +++++++++++++++++++------------------ 1 file changed, 19 insertions(+), 18 deletions(-) diff --git a/locators/rack_locators.py b/locators/rack_locators.py index 298b979..42ded6a 100644 --- a/locators/rack_locators.py +++ b/locators/rack_locators.py @@ -17,34 +17,35 @@ class RackLocators: """ # Основной контейнер вкладок стойки (верхние вкладки) - TABS_CONTAINER = "//div[@class='v-tabs__container']" + TABS_CONTAINER = "//div[starts-with(@data-testid, 'CABINET_SHOW__') and contains(@class, 'v-tabs__div')]" # Все элементы верхних вкладок стойки - ALL_TABS = "//div[@class='v-tabs__container']//a[contains(@class, 'v-tabs__item')]" + ALL_TABS = "//div[starts-with(@data-testid, 'CABINET_SHOW__') and contains(@class, 'v-tabs__div')]//a[contains(@class, 'v-tabs__item')]" # Кнопка редактирования свойств стойки - EDIT_BUTTON = "//button[@data-v-5f34ceac and contains(@class, 'font-weight-medium')]" + EDIT_BUTTON ="//button[@data-testid='CABINET_SHOW__btn__edit']" # Кнопка "Скрыть стойку" - HIDE_RACK_BUTTON = "//div[contains(@class, 'cabinet_hide_button')]//i[contains(@class, 'material-icons') and text()='navigate_before']" + HIDE_RACK_BUTTON = "//div[@data-testid='CABINET_SHOW__div__hideCabinet']" # Кнопка "Показать стойку" - SHOW_RACK_BUTTON = "//div[contains(@class, 'cabinet_hide_button')]//i[contains(@class, 'material-icons') and text()='navigate_next']" + SHOW_RACK_BUTTON = "//div[@data-testid='CABINET_SHOW__div__hideCabinet']" # Универсальный локатор для любой вкладки по имени - TAB_BY_NAME = "//div[@class='v-tabs__container']//a[contains(@class, 'v-tabs__item') and contains(., '{}')]" + TAB_BY_NAME = "//div[starts-with(@data-testid, 'CABINET_SHOW__') and contains(@class, 'v-tabs__div')]//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(., 'Сервисы')]" + COMPOSITION_TAB = "//div[@data-testid='CABINET_SHOW__composition_tab']//a[contains(@class, 'v-tabs__item')]" + GENERAL_INFO_TAB = "//div[@data-testid='CABINET_SHOW__general_info_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[@class='v-tabs__container']//a[contains(@class, 'v-tabs__item--active')]" + ACTIVE_TAB = "//div[starts-with(@data-testid, 'CABINET_SHOW__') and contains(@class, 'v-tabs__div')]//a[contains(@class, 'v-tabs__item--active')]" # Контейнер формы FORM_CONTAINER = "//div[contains(@class, 'container')]" @@ -85,15 +86,15 @@ class RackLocators: MAIN_CONTAINER = "//div[contains(@class, 'layout cabinet')]" # Кнопки переключения сторон - FRONT_SIDE_BUTTON = "//button[contains(@class, 'v-btn')]//div[contains(@class, 'v-btn__content') and normalize-space(text())='Лицевая сторона']" - BACK_SIDE_BUTTON = "//button[contains(@class, 'v-btn')]//div[contains(@class, 'v-btn__content') and normalize-space(text())='Обратная сторона']" + FRONT_SIDE_BUTTON = "//button[@data-testid='page-cabinet__btn__mount_front']" + BACK_SIDE_BUTTON = "//button[@data-testid='page-cabinet__btn__mount_rear']" - # Активная кнопка (имеет класс primary, но НЕ имеет outline) - ACTIVE_SIDE_BUTTON = "//button[contains(@class, 'v-btn') and contains(@class, 'primary') and not(contains(@class, 'v-btn--outline'))]" - ACTIVE_SIDE_BUTTON_TEXT = "//button[contains(@class, 'v-btn') and contains(@class, 'primary') and not(contains(@class, 'v-btn--outline'))]//div[contains(@class, 'v-btn__content')]" + # Локаторы для определения активной стороны + ACTIVE_SIDE_BUTTON = "//button[contains(@class, 'primary--text')]" + INACTIVE_SIDE_BUTTON = "//button[contains(@class, 'secondary--text')]" - # Неактивная кнопка (имеет outline или не имеет primary) - INACTIVE_SIDE_BUTTON = "//button[contains(@class, 'v-btn') and (contains(@class, 'v-btn--outline') or not(contains(@class, 'primary')))]" + # Для получения текста активной стороны + 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')]"