"""Модуль 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_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":
self.alert.check_alert_presence(' Неверно указан текущий пароль ')
self.alert.check_alert_absence(' Неверно указан текущий пароль ')
error = "Old password is not equal real password"
else:
error = f"Got unexpected alert type {alert_type}"
return is_changed, error
# Проверки:
[документация]
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")