From 29d8aa8354bad54704f951574134c0bddb565d21 Mon Sep 17 00:00:00 2001 From: nsubbot Date: Tue, 27 Jan 2026 14:02:37 +0300 Subject: [PATCH] =?UTF-8?q?=D0=9F=D0=B5=D1=80=D0=B5=D0=B2=D0=BE=D0=B4=20?= =?UTF-8?q?=D0=BB=D0=BE=D0=BA=D0=B0=D1=82=D0=BE=D1=80=D0=BE=D0=B2=20=D1=8D?= =?UTF-8?q?=D0=BB=D0=B5=D0=BC=D0=B5=D0=BD=D1=82=D0=BE=D0=B2=20=D0=BE=D0=BA?= =?UTF-8?q?=D0=BE=D0=BD=20=D1=80=D0=B0=D0=B1=D0=BE=D1=82=D1=8B=20=D1=81=20?= =?UTF-8?q?=D0=BF=D0=BE=D0=BB=D1=8C=D0=B7=D0=BE=D0=B2=D0=B0=D1=82=D0=B5?= =?UTF-8?q?=D0=BB=D1=8F=D0=BC=D0=B8=20=D0=BD=D0=B0=20=D0=B8=D1=81=D0=BF?= =?UTF-8?q?=D0=BE=D0=BB=D1=8C=D0=B7=D0=BE=D0=B2=D0=B0=D0=BD=D0=B8=D0=B5=20?= =?UTF-8?q?testid?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- components_derived/modal_add_user.py | 73 ++++++++++++--------------- components_derived/modal_edit_user.py | 37 +++++++------- locators/modal_window_locators.py | 16 ++++-- 3 files changed, 63 insertions(+), 63 deletions(-) diff --git a/components_derived/modal_add_user.py b/components_derived/modal_add_user.py index 69a910d..be3fb86 100644 --- a/components_derived/modal_add_user.py +++ b/components_derived/modal_add_user.py @@ -35,7 +35,6 @@ class AddUserModalWindow(ModalWindowComponent): super().__init__(page) # Локаторы элементов формы - text_field_locator = f"//{ModalWindowLocators.TEXT_FIELD_INPUT_FORM_USER_DATA}" input_form_locator = ModalWindowLocators.INPUT_FORM_USER_DATA # Настройка заголовка и кнопки закрытия тулбара @@ -49,16 +48,16 @@ class AddUserModalWindow(ModalWindowComponent): self.add_toolbar_title(self.window_title) self.add_toolbar_button(locator_button_toolbar_close, "close") - elements_locators = self._get_fields_locators(page) + elements_locators = self.get_input_fields_locators(page.locator(input_form_locator)) # Поле Тип авторизации loc = elements_locators.get("Тип авторизации") - if loc: + if loc: auth_type_selector = SelectionBarComponent(page, loc.get_by_role("combobox")) self.add_content_item("auth_type_selector", auth_type_selector) # Поле Имя - loc = elements_locators.get("Имя").locator(text_field_locator) + loc = elements_locators.get("Имя").locator(ModalWindowLocators.INPUT_FORM_USER_DATA_FIELD_NAME) name_input = TextInput(page, loc, "name_input") self.add_content_item("name_input", name_input) @@ -76,34 +75,34 @@ class AddUserModalWindow(ModalWindowComponent): # Чекбокс "Блокировка" checkbox_blocking = Checkbox( page, - label_blocking_locator.locator("../..").get_by_role("checkbox"), + page.locator(input_form_locator).locator(ModalWindowLocators.INPUT_FORM_USER_DATA_CHECKBOX_BLOCKED), "blocking" ) self.add_content_item("blocking_checkbox", checkbox_blocking) # Поле Роль - role_loc = elements_locators.get("Роль").get_by_role("combobox") + role_loc = elements_locators.get("Роль").get_by_role("combobox").first role_input = TextInput(page, role_loc, "role_input") self.add_content_item("role_input", role_input) self.add_content_item("roles_list", DropdownList(page)) # Поле Пароль - loc = elements_locators.get("Пароль").locator(text_field_locator) + loc = elements_locators.get("Пароль").locator(ModalWindowLocators.INPUT_FORM_USER_DATA_FIELD_PASSWORD) password_input = TextInput(page, loc, "password_input") self.add_content_item("password_input", password_input) # Поле Комментарий - loc = elements_locators.get("Комментарий").locator(text_field_locator) + loc = elements_locators.get("Комментарий").locator(ModalWindowLocators.INPUT_FORM_USER_DATA_FIELD_COMMENT) commentary_input = TextInput(page, loc, "commentary_input") self.add_content_item("commentary_input", commentary_input) # Поле E-mail - loc = elements_locators.get("E-mail").locator(text_field_locator) + loc = elements_locators.get("E-mail").locator(ModalWindowLocators.INPUT_FORM_USER_DATA_FIELD_EMAIL) email_input = TextInput(page, loc, "email_input") self.add_content_item("email_input", email_input) # Поле Номер для СМС - loc = elements_locators.get("Номер для СМС").locator(text_field_locator) + loc = elements_locators.get("Номер для СМС").locator(ModalWindowLocators.INPUT_FORM_USER_DATA_FIELD_SMS) phone_input = TextInput(page, loc, "phone_input") self.add_content_item("phone_input", phone_input) @@ -120,7 +119,7 @@ class AddUserModalWindow(ModalWindowComponent): # Чекбокс "Подписка на Push-уведомления" checkbox_push = Checkbox( page, - label_push_locator.locator("../..").get_by_role("checkbox"), + page.locator(input_form_locator).locator(ModalWindowLocators.INPUT_FORM_USER_DATA_CHECKBOX_PUSH_ACTIVE), "push_notification" ) self.add_content_item("push_notification_checkbox", checkbox_push) @@ -161,7 +160,7 @@ class AddUserModalWindow(ModalWindowComponent): auth_type = None auth_type_selector = self.get_content_item("auth_type_selector") - if auth_type_selector: + if auth_type_selector: values = auth_type_selector.get_selected_values() auth_type = values[0] return auth_type @@ -192,7 +191,8 @@ class AddUserModalWindow(ModalWindowComponent): if auth_type == "LDAP": menu_locator = self.page.locator(ModalWindowLocators.MENU_ACTIVE_INPUT_FORM) - elements_locators = self._get_fields_locators(self.page) + elements_locators = self.get_input_fields_locators( + self.page.locator(ModalWindowLocators.INPUT_FORM_USER_DATA)) # Добавилось поле Группа group_loc = elements_locators.get("Группа").get_by_role("combobox") @@ -223,7 +223,8 @@ class AddUserModalWindow(ModalWindowComponent): search_button.click() # Если в группе есть пользователи, открывается новое поле, заново вычисляем локаторы - elements_locators = self._get_fields_locators(self.page) + elements_locators = self.get_input_fields_locators( + self.page.locator(ModalWindowLocators.INPUT_FORM_USER_DATA)) users_ad_loc = elements_locators.get("Пользователи AD") # users_ad_loc = elements_locators.get("Пользователи LDAP") assert users_ad_loc, f"Selected group {group_name} is empty. Use another group." @@ -323,39 +324,28 @@ class AddUserModalWindow(ModalWindowComponent): def locators_recalculation(self, is_active_directory=False) -> None: """Пересчет локаторов полей ввода""" - text_field_locator = f"//{ModalWindowLocators.TEXT_FIELD_INPUT_FORM_USER_DATA}" + elements_locators = self.get_input_fields_locators( + self.page.locator(ModalWindowLocators.INPUT_FORM_USER_DATA)) - elements_locators = self._get_fields_locators(self.page) - - new_loc = elements_locators.get("Имя").locator(text_field_locator) + new_loc = elements_locators.get("Имя").locator(ModalWindowLocators.INPUT_FORM_USER_DATA_FIELD_NAME) self.get_content_item("name_input").update_locator(new_loc) if not is_active_directory: - new_loc = elements_locators.get("Пароль").locator(text_field_locator) + new_loc = elements_locators.get("Пароль").locator(ModalWindowLocators.INPUT_FORM_USER_DATA_FIELD_PASSWORD) self.get_content_item("password_input").update_locator(new_loc) - new_loc = elements_locators.get("Роль").get_by_role("combobox") + new_loc = elements_locators.get("Роль").get_by_role("combobox").first self.get_content_item("role_input").update_locator(new_loc) - new_loc = elements_locators.get("Комментарий").locator(text_field_locator) + new_loc = elements_locators.get("Комментарий").locator(ModalWindowLocators.INPUT_FORM_USER_DATA_FIELD_COMMENT) self.get_content_item("commentary_input").update_locator(new_loc) - new_loc = elements_locators.get("E-mail").locator(text_field_locator) + new_loc = elements_locators.get("E-mail").locator(ModalWindowLocators.INPUT_FORM_USER_DATA_FIELD_EMAIL) self.get_content_item("email_input").update_locator(new_loc) - new_loc = elements_locators.get("Номер для СМС").locator(text_field_locator) + new_loc = elements_locators.get("Номер для СМС").locator(ModalWindowLocators.INPUT_FORM_USER_DATA_FIELD_SMS) self.get_content_item("phone_input").update_locator(new_loc) - def _get_fields_locators(self, page) -> dict: - fields_locators = {} - elements = page.locator(ModalWindowLocators.INPUT_FORM_USER_DATA). \ - locator("div.v-text-field__slot > input").all() - for el in elements: - val = el.input_value().strip() - if val: - fields_locators[val] = el.locator("../ancestor::div[5]") - return fields_locators - # Проверки: def check_content(self): """Проверяет наличие и корректность всех элементов формы создания локального пользователя. @@ -419,8 +409,8 @@ class AddUserModalWindow(ModalWindowComponent): elif name == "roles_list": continue else: - print(f"check item: {name}") - print(item) + # print(f"check item: {name}") + # print(item) item.check_visibility( f"Modal window content item with name '{name}' is missing" ) @@ -442,22 +432,23 @@ class AddUserModalWindow(ModalWindowComponent): auth_type_selector = self.get_content_item("auth_type_selector") if auth_type_selector: self.select_auth_type("LDAP") - - elements_locators = self._get_fields_locators(self.page) - + + elements_locators = self.get_input_fields_locators( + self.page.locator(ModalWindowLocators.INPUT_FORM_USER_DATA)) + # Добавилось поле Группа group_loc = elements_locators.get("Группа").get_by_role("combobox") group_input = TextInput(self.page, group_loc, "group_input") self.add_content_item("group_input", group_input) self.add_content_item("group_list", DropdownList(self.page)) - + group_field = self.get_content_item("group_input") group_field.click() - + group_list = self.get_content_item("group_list") group_list.check_visibility(menu_locator, "Groups list is missing") - + is_scrollable_vertically = group_list.check_vertical_scrolling(menu_locator) assert is_scrollable_vertically, "Groups list should be scrollable_vertically" self.page.keyboard.press("Escape") diff --git a/components_derived/modal_edit_user.py b/components_derived/modal_edit_user.py index 83c1e7f..0c0598d 100644 --- a/components_derived/modal_edit_user.py +++ b/components_derived/modal_edit_user.py @@ -34,8 +34,6 @@ class EditUserModalWindow(ModalWindowComponent): super().__init__(page) # Локаторы элементов формы - # text_field_locator = ModalWindowLocators.TEXT_FIELD_INPUT_FORM_USER_DATA - text_field_locator = f"xpath={ModalWindowLocators.TEXT_FIELD_INPUT_FORM_USER_DATA}" input_form_locator = ModalWindowLocators.INPUT_FORM_USER_DATA # Настройка заголовка и кнопки закрытия @@ -50,31 +48,32 @@ class EditUserModalWindow(ModalWindowComponent): self.add_toolbar_button(locator_button_toolbar_close, "close") # Добавление полей формы - elements_locators = self._get_fields_locators(page) + elements_locators = self.get_input_fields_locators( + self.page.locator(ModalWindowLocators.INPUT_FORM_USER_DATA)) # Поле Имя - loc = elements_locators.get("Имя").locator(text_field_locator) + loc = elements_locators.get("Имя").locator(ModalWindowLocators.INPUT_FORM_USER_DATA_FIELD_NAME) name_input = TextInput(page, loc, "name_input") self.add_content_item("name_input", name_input) # Поле Роль - role_loc = self.page.locator(input_form_locator).get_by_role("combobox") + role_loc = self.page.locator(input_form_locator).get_by_role("combobox").first role_input = TextInput(page, role_loc, "role_input") self.add_content_item("role_input", role_input) self.add_content_item("roles_list", DropdownList(page)) # Поле Комментарий - loc = elements_locators.get("Комментарий").locator(text_field_locator) + loc = elements_locators.get("Комментарий").locator(ModalWindowLocators.INPUT_FORM_USER_DATA_FIELD_COMMENT) commentary_input = TextInput(page, loc, "commentary_input") self.add_content_item("commentary_input", commentary_input) # Поле E-mail - loc = elements_locators.get("E-mail").locator(text_field_locator) + loc = elements_locators.get("E-mail").locator(ModalWindowLocators.INPUT_FORM_USER_DATA_FIELD_EMAIL) email_input = TextInput(page, loc, "email_input") self.add_content_item("email_input", email_input) # Поле Номер для СМС - loc = elements_locators.get("Номер для СМС").locator(text_field_locator) + loc = elements_locators.get("Номер для СМС").locator(ModalWindowLocators.INPUT_FORM_USER_DATA_FIELD_SMS) phone_input = TextInput(page, loc, "phone_input") self.add_content_item("phone_input", phone_input) @@ -93,7 +92,7 @@ class EditUserModalWindow(ModalWindowComponent): # Чекбокс "Блокировка" checkbox_blocking = Checkbox( page, - label_blocking_locator.locator("../..").get_by_role("checkbox"), + page.locator(input_form_locator).locator(ModalWindowLocators.INPUT_FORM_USER_DATA_CHECKBOX_BLOCKED), "blocking" ) self.add_content_item("blocking_checkbox", checkbox_blocking) @@ -111,7 +110,7 @@ class EditUserModalWindow(ModalWindowComponent): # Чекбокс "Подписка на Push-уведомления" checkbox_push = Checkbox( page, - label_push_locator.locator("../..").get_by_role("checkbox"), + page.locator(input_form_locator).locator(ModalWindowLocators.INPUT_FORM_USER_DATA_CHECKBOX_PUSH_ACTIVE), "push_notification" ) self.add_content_item("push_notification_checkbox", checkbox_push) @@ -241,15 +240,15 @@ class EditUserModalWindow(ModalWindowComponent): reset_password_button = self.get_button_by_name("reset_password") reset_password_button.click() - def _get_fields_locators(self, page) -> dict: - fields_locators = {} - elements = page.locator(ModalWindowLocators.INPUT_FORM_USER_DATA). \ - locator("div.v-text-field__slot > input").all() - for el in elements: - val = el.input_value().strip() - if val: - fields_locators[val] = el.locator("../ancestor::div[5]") - return fields_locators + # def _get_fields_locators(self, page) -> dict: + # fields_locators = {} + # elements = page.locator(ModalWindowLocators.INPUT_FORM_USER_DATA). \ + # locator("div.v-text-field__slot > input").all() + # for el in elements: + # val = el.input_value().strip() + # if val: + # fields_locators[val] = el.locator("../ancestor::div[5]") + # return fields_locators # Проверки: def check_content(self, user_name, role): diff --git a/locators/modal_window_locators.py b/locators/modal_window_locators.py index 3b61298..76b4bb7 100644 --- a/locators/modal_window_locators.py +++ b/locators/modal_window_locators.py @@ -24,14 +24,24 @@ class ModalWindowLocators: MODAL_WINDOW_TEXT_FIELD_INPUT = f"{MODAL_WINDOW}//input" INPUT_FORM_USER_DATA = f"{MODAL_WINDOW}//form[@class='v-form']" - TEXT_FIELD_INPUT_FORM_USER_DATA = "div[2]/div/div/div/div/input" - # TEXT_FIELD_INPUT_FORM_USER_DATA = "xpath=div[2]/div/div/div/div/input" + INPUT_FORM_USER_DATA_FIELD_NAME = "//input[@data-testid='USER_CARD__text-field__name']" + INPUT_FORM_USER_DATA_FIELD_ROLE = "//input[@data-testid='USER_CARD__select__role']" + INPUT_FORM_USER_DATA_FIELD_PASSWORD = "//input[@data-testid='USER_CARD__text-field__password']" + INPUT_FORM_USER_DATA_FIELD_COMMENT = "//input[@data-testid='USER_CARD__text-field__comment']" + INPUT_FORM_USER_DATA_FIELD_EMAIL = "//input[@data-testid='USER_CARD__text-field__email']" + INPUT_FORM_USER_DATA_FIELD_SMS = "//input[@data-testid='USER_CARD__text-field__sms_phone']" + + INPUT_FORM_USER_DATA_CHECKBOX_BLOCKED = "//input[@data-testid='USER_CARD__checkbox__blocked']" + INPUT_FORM_USER_DATA_CHECKBOX_PUSH_ACTIVE = "//input[@data-testid='USER_CARD__checkbox__push_active']" + + # TEXT_FIELD_INPUT_FORM_USER_DATA = "div[2]/div/div/div/div/input" + MENU_ACTIVE_INPUT_FORM = "//div[contains(@class, 'menuable__content__active')]" MENU_ACTIVE_ITEMS = "//div[@role='list']//div[@role='listitem']" LABEL_INPUT_FORM_USER_DATA = "//label[contains(@class,'v-label')]/span" TASK_MODAL_WINDOW = "//div[@data-testid='BASELINE__dialog-drag__modal_0']" - + CHANDE_PASSWORD_WINDOW_CURRENT_PASSWORD = "//input[@data-testid='CHANGE_PASS_CARD__text-field__current_password']" CHANDE_PASSWORD_WINDOW_NEW_PASSWORD = "//input[@data-testid='CHANGE_PASS_CARD__text-field__new_password']" CHANDE_PASSWORD_WINDOW_CHECK_PASSWORD = "//input[@data-testid='CHANGE_PASS_CARD__text-field__check_password']"