243 lines
11 KiB
Python
243 lines
11 KiB
Python
from playwright.sync_api import Page
|
||
from components.confirm_component import ConfirmComponent
|
||
from components.modal_window_component import ModalWindowComponent
|
||
from elements.checkbox_element import Checkbox
|
||
from elements.dropdown_list_element import DropdownList
|
||
from elements.text_element import Text
|
||
from elements.text_input_element import TextInput
|
||
from locators.modal_window_locators import ModalWindowLocators
|
||
import re
|
||
from tools.logger import get_logger
|
||
|
||
logger = get_logger("EDIT_USER_MODAL_WINDOW")
|
||
|
||
|
||
class EditUserModalWindow(ModalWindowComponent):
|
||
"""Класс модального окна редактирования пользователя.
|
||
|
||
Наследует функциональность базового модального окна и добавляет:
|
||
- Поля редактирования данных пользователя
|
||
- Чекбоксы настроек
|
||
- Выпадающий список ролей
|
||
- Кнопки действий (Сохранить, Удалить, Сбросить пароль)
|
||
|
||
Args:
|
||
page (Page): Экземпляр страницы Playwright
|
||
user_name (str): Имя редактируемого пользователя (используется в заголовке)
|
||
"""
|
||
|
||
def __init__(self, page: Page, user_name: str):
|
||
"""Инициализация компонентов модального окна редактирования пользователя."""
|
||
super().__init__(page)
|
||
|
||
# Локаторы элементов формы
|
||
text_field_locator = ModalWindowLocators.TEXT_FIELD_INPUT_FORM_USER_DATA
|
||
roles_field_locator = ModalWindowLocators.ROLES_FIELD_INPUT_FORM_USER_DATA
|
||
input_form_locator = ModalWindowLocators.INPUT_FORM_USER_DATA
|
||
label_locator = ModalWindowLocators.LABEL_INPUT_FORM_USER_DATA
|
||
roles_menu_locator = ModalWindowLocators.ROLES_MENU_INPUT_FORM_USER_DATA
|
||
|
||
# Настройка заголовка и кнопки закрытия
|
||
self.window_title = user_name
|
||
locator_button_toolbar_close = self.page.get_by_role("navigation").filter(
|
||
has_text=re.compile(self.window_title)
|
||
).get_by_role("button")
|
||
|
||
self.add_toolbar_title(self.window_title)
|
||
self.add_toolbar_button(locator_button_toolbar_close, "close")
|
||
|
||
# Добавление полей формы
|
||
loc = self.page.locator(input_form_locator).locator("xpath=div[1]").locator(text_field_locator)
|
||
type_auth_input = TextInput(page, loc, "type_auth_input")
|
||
self.add_content_item("type_auth_input", type_auth_input)
|
||
|
||
loc = self.page.locator(input_form_locator).locator("xpath=div[2]").locator(text_field_locator)
|
||
name_input = TextInput(page, loc, "name_input")
|
||
self.add_content_item("name_input", name_input)
|
||
|
||
role_loc = self.page.locator(input_form_locator).locator("xpath=div[3]").locator(roles_field_locator)
|
||
role_input = TextInput(page, role_loc, "role_input")
|
||
self.add_content_item("role_input", role_input)
|
||
self.add_content_item(
|
||
"roles_list",
|
||
DropdownList(page, roles_menu_locator, "roles_list")
|
||
)
|
||
|
||
loc = self.page.locator(input_form_locator).locator("xpath=div[4]").locator(text_field_locator)
|
||
commentary_input = TextInput(page, loc, "commentary_input")
|
||
self.add_content_item("commentary_input", commentary_input)
|
||
|
||
loc = self.page.locator(input_form_locator).locator("xpath=div[5]").locator(text_field_locator)
|
||
email_input = TextInput(page, loc, "email_input")
|
||
self.add_content_item("email_input", email_input)
|
||
|
||
loc = self.page.locator(input_form_locator).locator("xpath=div[6]").locator(text_field_locator)
|
||
phone_input = TextInput(page, loc, "phone_input")
|
||
self.add_content_item("phone_input", phone_input)
|
||
|
||
# Добавление чекбоксов и их меток
|
||
checkbox_2 = Checkbox(
|
||
page,
|
||
page.get_by_role("checkbox").nth(0),
|
||
"push_notification"
|
||
)
|
||
self.add_content_item("push_notification_checkbox", checkbox_2)
|
||
|
||
label_2 = Text(
|
||
page,
|
||
self.page.locator(label_locator).nth(0),
|
||
"push_notification_checkbox_label"
|
||
)
|
||
self.add_content_item("push_notification_checkbox_label", label_2)
|
||
|
||
# Добавление кнопок действий
|
||
locator_button_save = self.page.get_by_role("button", name="Сохранить")
|
||
self.add_button(locator_button_save, "save")
|
||
|
||
locator_button_delete = self.page.get_by_role("button", name="Удалить")
|
||
self.add_button(locator_button_delete, "delete")
|
||
|
||
locator_button_reset = self.page.get_by_role("button", name="Сбросить пароль")
|
||
self.add_button(locator_button_reset, "reset_password")
|
||
|
||
locator_button_close = self.page.get_by_role("button", name="Закрыть")
|
||
self.add_button(locator_button_close, "close")
|
||
|
||
# Инициализация компонентов подтверждения
|
||
self.save_user_confirm = ConfirmComponent(page, " Отмена ", " Сохранить ")
|
||
self.delete_user_confirm = ConfirmComponent(page, " Отмена ", " Удалить ")
|
||
|
||
def close_window(self):
|
||
"""Закрывает модальное окно с помощью кнопки 'Закрыть'."""
|
||
close_button = self.get_button_by_name("close")
|
||
close_button.click()
|
||
|
||
def close_window_by_toolbar_button(self):
|
||
"""Закрывает модальное окно с помощью кнопки закрытия в тулбаре."""
|
||
self.click_toolbar_close_button()
|
||
|
||
def delete_user(self):
|
||
"""Удаляет пользователя с подтверждением действия.
|
||
|
||
Raises:
|
||
AssertionError: Если окно подтверждения не отображается
|
||
"""
|
||
delete_button = self.get_button_by_name("delete")
|
||
delete_button.click()
|
||
|
||
title = "Удаление"
|
||
self.delete_user_confirm.check_title(
|
||
title,
|
||
f"Confirmation dialog window with title '{title}' is missing"
|
||
)
|
||
self.delete_user_confirm.click_allow_button()
|
||
|
||
def edit_user(self, user_data):
|
||
"""Редактирует данные пользователя.
|
||
|
||
Args:
|
||
user_data (dict): Словарь с обновляемыми данными пользователя. Может содержать:
|
||
- type_auth (str): Тип авторизации
|
||
- name (str): Имя пользователя
|
||
- role (str): Роль пользователя
|
||
- commentary (str): Комментарий
|
||
- email (str): Email
|
||
- phone_number (str): Номер телефона
|
||
- push_notification_checked (bool): Состояние чекбокса уведомлений
|
||
"""
|
||
fields = user_data.keys()
|
||
|
||
if "type_auth" in fields:
|
||
input_field = self.get_content_item("type_auth_input")
|
||
input_field.input_value(user_data["type_auth"])
|
||
|
||
if "name" in fields:
|
||
input_field = self.get_content_item("name_input")
|
||
input_field.input_value(user_data["name"])
|
||
|
||
if "role" in fields:
|
||
role_field = self.get_content_item("role_input")
|
||
role_field.click()
|
||
|
||
roles_list = self.get_content_item("roles_list")
|
||
roles_list.check_item_with_text(user_data["role"])
|
||
roles_list.click_item_with_text(user_data["role"])
|
||
|
||
if "commentary" in fields:
|
||
input_field = self.get_content_item("commentary_input")
|
||
input_field.input_value(user_data["commentary"])
|
||
|
||
if "email" in fields:
|
||
input_field = self.get_content_item("email_input")
|
||
input_field.input_value(user_data["email"])
|
||
|
||
if "phone_number" in fields:
|
||
input_field = self.get_content_item("phone_input")
|
||
input_field.input_value(user_data["phone_number"])
|
||
|
||
if "push_notification_checked" in fields:
|
||
checkbox = self.get_content_item("push_notification_checkbox")
|
||
if user_data["push_notification_checked"]:
|
||
checkbox.check()
|
||
else:
|
||
checkbox.uncheck()
|
||
|
||
save_button = self.get_button_by_name("save")
|
||
save_button.click()
|
||
|
||
title = "Сохранение"
|
||
self.save_user_confirm.check_title(
|
||
title,
|
||
f"Confirmation dialog window with title '{title}' is missing"
|
||
)
|
||
self.save_user_confirm.click_allow_button()
|
||
|
||
def reset_password(self):
|
||
"""Инициирует сброс пароля пользователя."""
|
||
reset_password_button = self.get_button_by_name("reset_password")
|
||
reset_password_button.click()
|
||
|
||
def check_content(self, user_name, role):
|
||
"""Проверяет наличие и корректность всех элементов окна.
|
||
|
||
Args:
|
||
user_name (str): Ожидаемое имя пользователя
|
||
role (str): Ожидаемая роль пользователя
|
||
|
||
Raises:
|
||
AssertionError: Если какой-либо элемент отсутствует или содержит некорректные данные
|
||
"""
|
||
self.check_by_window_title()
|
||
self.check_toolbar_button_presence("close")
|
||
self.check_toolbar_button_tooltip("close", "Закрыть")
|
||
|
||
for name in self.content_items.keys():
|
||
item = self.get_content_item(name)
|
||
|
||
if name == "push_notification_checkbox_label":
|
||
item.check_have_text(
|
||
"Подписка на Push-уведомления",
|
||
"Label 'Подписка на Push-уведомления' is missing"
|
||
)
|
||
elif name == "name_input":
|
||
name = self.get_content_item("name_input")
|
||
text_value = name.get_input_value()
|
||
assert text_value == user_name, (
|
||
f"Expected user name '{user_name}' is not equal real user name '{text_value}'"
|
||
)
|
||
elif name == "role_input":
|
||
item.click()
|
||
roles_list = self.get_content_item("roles_list")
|
||
roles_list.check_presence("Roles list is missing")
|
||
roles_list.check_item_with_text(role)
|
||
elif name == "roles_list":
|
||
continue
|
||
else:
|
||
item.check_presence(
|
||
f"Modal window content item with name '{name}' is missing"
|
||
)
|
||
|
||
self.check_button_presence("save")
|
||
self.check_button_presence("delete")
|
||
self.check_button_presence("reset_password")
|
||
self.check_button_presence("close") |