"""Модуль компонента карточки пользователя. Содержит класс для работы с карточкой пользователя через Playwright. """ from playwright.sync_api import Page from tools.logger import get_logger from locators.user_card_locators import UserCardLocators from elements.text_element import Text from elements.button_element import Button from data.roles_dict import roles_dict from data.environment import host from components.base_component import BaseComponent from components_derived.modal_change_password import ChangePasswordModalWindow logger = get_logger("USER_CARD") class UserCard(BaseComponent): """Компонент карточка. Предоставляет методы для взаимодействия с элементами карточки. """ def __init__(self, page: Page): """Инициализирует компонент карточки. Args: page: Экземпляр страницы Playwright. """ super().__init__(page) card_locator = page.locator(UserCardLocators.CARD_USER) # Обновленные локаторы согласно новой структуре карточки self.current_user_name = Text( page, card_locator.locator("xpath=/div/div[1]"), # Изменено с div[2] на div[1] "current user name" ) self.current_user_role = Text( page, card_locator.locator("xpath=/div/div[2]"), # Изменено с div[3] на div[2] "current user role" ) self.login_time = Text( page, card_locator.locator("xpath=/div/div[3]"), # Изменено с div[4] на div[3] "login time" ) self.session_time = Text( page, card_locator.locator("xpath=/div/div[4]"), # Изменено с div[5] на div[4] "session time" # Исправлено имя с "current user name" на "session time" ) self.logout_button = Button( page, page.get_by_role("button", name="Выйти"), "logout button" ) self.change_password_button = Button( page, page.get_by_role("button", name="Изменить пароль"), "change password button" ) self.close_button = Button( page, page.get_by_role("button", name="Закрыть"), "close button" ) # окна, отрываемые после нажатия кнопок self.change_password_modal_window = ChangePasswordModalWindow(page) # Действия: def click_change_password_button(self) -> ChangePasswordModalWindow: """Нажимает кнопку открытия окна изменения пароля. Выполняет клик по кнопке 'Изменить пароль' в карточке пользователя. """ self.change_password_button.click() return self.change_password_modal_window def click_logout_button(self) -> None: """Нажимает кнопку выхода из системы. Выполняет клик по кнопке 'Выйти' в карточке пользователя. """ self.logout_button.click() def click_close_button(self) -> None: """Нажимает кнопку закрытия окна карточки пользователя. Выполняет клик по кнопке 'Закрыть' в карточке пользователя. """ self.close_button.click() # Проверки: def check_content(self) -> None: """Проверяет наличие и корректность элементов карточки пользователя в зависимости от его роли в системе.""" current_user_credential = host.get_current_user_credential() name = current_user_credential["login"] text_to_check = f"Имя пользователя: {name}" self.current_user_name.check_have_text( text_to_check, f"Expected text {text_to_check} is missing in user card" ) role = roles_dict.get(current_user_credential["role"]) if role is None: assert False, "Unknown user role in current user credential" text_to_check = f"Роль: {role}" self.current_user_role.check_have_text( text_to_check, f"Expected text {text_to_check} is missing in user card" ) login_time_str = self.login_time.get_text(0) assert login_time_str.find("Время входа:") != -1, ( "Expected text 'Время входа:' is missing in user card" ) session_time_str = self.session_time.get_text(0) assert session_time_str.find("Время сессии:") != -1, ( "Expected text 'Время сессии:' is missing in user card" ) self.logout_button.check_visibility( "Logout button is missing on user card" ) self.change_password_button.check_visibility( "Change password button is missing on user card" ) self.close_button.check_visibility( "Close button is missing on user card" ) def check_card_is_closed(self) -> None: """Проверяет, что карточка пользователя отсутствует. Raises: AssertionError: Если карточка пользователя все еще открыта. """ card_locator = self.page.locator(UserCardLocators.CARD_USER).locator("xpath=../..") class_attr = card_locator.get_attribute('class') assert 'menuable__content__active' not in class_attr, "User card should be closed"