"""Модуль modal_change_password содержит класс для работы с окном изменения пароля текущего пользователя. Класс ChangePasswordModalWindow наследует базовый функционал ModalWindowComponent и реализует методы для изменения пароля пользователя. """ from playwright.sync_api import Page from tools.logger import get_logger from locators.text_input_locators import TextInputLocators from locators.modal_window_locators import ModalWindowLocators from elements.text_element import Text from elements.text_input_element import TextInput from elements.icon_element import Icon from data.environment import host from components.modal_window_component import ModalWindowComponent from components.alert_component import AlertComponent logger = get_logger("CHANGE_PASSWORD_MODAL_WINDOW") class ChangePasswordModalWindow(ModalWindowComponent): """Модальное окно изменения пароля текущего пользователя. Наследует ModalWindowComponent и добавляет: - Поля задания пароля - Кнопки действий (Сохранить, Отменить) """ def __init__(self, page: Page): """Инициализирует элементы формы редактирования пользователя.""" super().__init__(page) modal_window_locator = page.locator(ModalWindowLocators.MODAL_WINDOW) # Тулбар с заголовком user_name = host.get_current_user_name() self.add_toolbar_title(f"Изменить пароль для пользователя {user_name}?") # Поля ввода пароля loc = modal_window_locator.get_by_label("Введите текущий пароль *") old_password_input = TextInput(page, loc, "old_password_input") self.add_content_item("old_password_input", old_password_input) icon_locator = loc.locator("xpath=../..").locator(TextInputLocators.ICON_PASSWORD_HIDING) old_password_hidden_icon = Icon(page, icon_locator, "old password hidden icon") self.add_content_item("old_password_hidden_icon", old_password_hidden_icon) loc = modal_window_locator.get_by_label("Введите новый пароль *") new_password_input = TextInput(page, loc, "new_password_input") self.add_content_item("new_password_input", new_password_input) icon_locator = loc.locator("xpath=../..").locator(TextInputLocators.ICON_PASSWORD_HIDING) new_password_hidden_icon = Icon(page, icon_locator, "new password hidden icon") self.add_content_item("new_password_hidden_icon", new_password_hidden_icon) loc = modal_window_locator.get_by_label("Введите повторно новый пароль *") confirm_password_input = TextInput(page, loc, "confirm_password_input") self.add_content_item("confirm_password_input", confirm_password_input) icon_locator = loc.locator("xpath=../..").locator(TextInputLocators.ICON_PASSWORD_HIDING) confirm_password_hidden_icon = Icon(page, icon_locator, "confirm password hidden icon") self.add_content_item("confirm_password_hidden_icon", confirm_password_hidden_icon) input_form_error_message = Text(page, modal_window_locator.locator(TextInputLocators.INPUT_FORM_MESSAGE), "input form error message") self.add_content_item("input_form_error_message", input_form_error_message) # Добавление кнопок действий locator_button_save = self.page.get_by_role("button", name="Сохранить") self.add_button(locator_button_save, "save") locator_button_cancel = self.page.get_by_role("button", name="Отменить") self.add_button(locator_button_cancel, "cancel") # Alert при успешном добавлении пользователя self.alert = AlertComponent(page) # Действия: def click_cancel_button(self) -> None: """Нажимает кнопку 'Отменить'""" self.get_button_by_name("cancel").click() def click_old_password_hidden_icon(self) -> None: """Нажатие на иконку скрытия старого пароля.""" self.get_content_item("old_password_hidden_icon").click() def click_new_password_hidden_icon(self) -> None: """Нажатие на иконку скрытия нового пароля.""" self.get_content_item("new_password_hidden_icon").click() def click_confirm_password_hidden_icon(self) -> None: """Нажатие на иконку скрытия пароля подтверждения.""" self.get_content_item("confirm_password_hidden_icon").click() def change_password(self, old_password: str, new_password: str): """Заполняет элементы формы, нажимает кнопку 'Сохранить'""" error = "" self.get_content_item("old_password_input").input_value(old_password) self.get_content_item("new_password_input").input_value(new_password) self.get_content_item("confirm_password_input").input_value(new_password) button_save = self.get_button_by_name("save") if button_save.is_disabled(): error_message = self.get_content_item("input_form_error_message") error = error_message.get_text(0) return False, error button_save.click() is_changed = False alert_type = self.alert.get_alert_type() if alert_type == "success": self.alert.check_alert_presence(' Пароль успешно изменён ') self.alert.check_alert_absence(' Пароль успешно изменён ') is_changed = True elif alert_type == "error": # to do: fix message after translation self.alert.check_alert_presence(' Old password not equal ') self.alert.check_alert_absence(' Old password not equal ') error = "Old password is not equal real password" else: error = f"Got unexpected alert type {alert_type}" return is_changed, error def get_password_inputs(self) -> []: """Возвращает список полей ввода пароля (для тестовых целей).""" text_inputs = [] text_inputs.append(self.get_content_item("old_password_input")) text_inputs.append(self.get_content_item("new_password_input")) text_inputs.append(self.get_content_item("confirm_password_input")) return text_inputs # Проверки: def check_content(self): """Проверяет наличие и корректность всех элементов формы.""" self.check_by_window_title() self.get_content_item("old_password_input").check_visibility( "Old password input form is missing" ) old_password_hidden_icon = self.get_content_item("old_password_hidden_icon") old_password_hidden_icon.check_visibility( "Old password hidden icon is missing" ) is_hidden_state = old_password_hidden_icon.is_password_hidden() assert is_hidden_state, "Old password hidden icon should be in hidden state" self.get_content_item("new_password_input").check_visibility( "New password input form is missing" ) new_password_hidden_icon = self.get_content_item("new_password_hidden_icon") new_password_hidden_icon.check_visibility( "New password hidden icon is missing" ) is_hidden_state = new_password_hidden_icon.is_password_hidden() assert is_hidden_state, "New password hidden icon should be in hidden state" self.get_content_item("confirm_password_input").check_visibility( "Confirm password input form is missing" ) confirm_password_hidden_icon = self.get_content_item("confirm_password_hidden_icon") confirm_password_hidden_icon.check_visibility( "Confirm password hidden icon is missing" ) is_hidden_state = confirm_password_hidden_icon.is_password_hidden() assert is_hidden_state, "Confirm password hidden icon should be in hidden state" self.check_button_visibility("cancel") button_save = self.get_button_by_name("save") is_disabled = button_save.is_disabled() assert is_disabled, "Button 'Сохранить' should be hidden" def check_error_message(self, text: str) -> None: """Проверяет сообщение об ошибке, возникшее при заполнении полей формы.""" error_message = self.get_content_item("input_form_error_message") error_message.check_have_text(text, "Unexpected error message")