"""Модуль вкладки 'Сеансы/Настройки'. Содержит класс SessionSettingsTab для работы с полями настройки сессий пользователей. """ import re from playwright.sync_api import Page from locators.settings_form_locators import SettingsFormLocators from elements.text_input_element import TextInput from components.toolbar_component import ToolbarComponent from components.alert_component import AlertComponent from components_derived.settings_form_component import SettingsFormComponent from pages.base_page import BasePage class SessionSettingsTab(BasePage): """Класс для работы с вкладкой 'Сеансы/Настройки'. Предоставляет методы для взаимодействия с полями настройки сессий пользователей. Args: page: Экземпляр страницы Playwright. """ def __init__(self, page: Page) -> None: """Инициализирует компоненты вкладки 'Сеансы/Настройки'.""" super().__init__(page) self.toolbar = ToolbarComponent(page, "Время жизни сеанса") toolbar_button_edit = self.page.get_by_role("navigation").filter(has_text=re.compile("Время жизни сеанса")). \ locator("//button[@data-testid='SESSION_SETTINGS__btn__edit']") self.toolbar.add_tooltip_button(toolbar_button_edit, "edit") toolbar_button_save = self.page.get_by_role("navigation").filter(has_text=re.compile("Время жизни сеанса")). \ locator("//button[@data-testid='SESSION_SETTINGS__btn__submit']") self.toolbar.add_tooltip_button(toolbar_button_save, "save") toolbar_button_cancel = self.page.get_by_role("navigation").filter(has_text=re.compile("Время жизни сеанса")). \ locator("//button[@data-testid='SESSION_SETTINGS__btn__cancelEdit']") self.toolbar.add_tooltip_button(toolbar_button_cancel, "cancel") # Форма для отображения/редактирования полей настроек сессии пользователя self.settings_form = SettingsFormComponent(page) container_locator = self.page.locator(SettingsFormLocators.SETTINGS_FORM_INPUT_FORM_CONTAINER) self.input_fields_locators = self.settings_form.get_input_fields_locators(container_locator) # Используем локаторы для числовых полей loc = self.input_fields_locators.get("Администратор") loc_admin = loc.locator("//input[@data-testid='SESSION_SETTINGS__text-field__administrator']") admin_setting = TextInput(page, loc_admin, "admin_setting") self.settings_form.add_content_item("admin_setting", admin_setting) loc = self.input_fields_locators.get("Оператор") loc_oper = loc.locator("//input[@data-testid='SESSION_SETTINGS__text-field__operator']") operator_setting = TextInput(page, loc_oper, "operator_setting") self.settings_form.add_content_item("operator_setting", operator_setting) loc = self.input_fields_locators.get("Контактное лицо") loc_manager = loc.locator("//input[@data-testid='SESSION_SETTINGS__text-field__manager']") manager_setting = TextInput(page, loc_manager, "manager_setting") self.settings_form.add_content_item("manager_setting", manager_setting) loc = self.input_fields_locators.get("Специалист информационной безопасности") loc_inform_secur_user = loc.locator("//input[@data-testid='SESSION_SETTINGS__text-field__inform_secur_user']") inform_secur_user_setting = TextInput(page, loc_inform_secur_user, "inform_secur_user_setting") self.settings_form.add_content_item("inform_secur_user_setting", inform_secur_user_setting) loc = self.input_fields_locators.get('$collector') loc_collector = loc.locator("//input[@data-testid='SESSION_SETTINGS__text-field__$collector']") collector_setting = TextInput(page, loc_collector, "collector_setting") self.settings_form.add_content_item("collector_setting", collector_setting) # Окно сообщения об успешном/неуспешном сохранении настроек self.alert = AlertComponent(page) # Действия: def click_cancel_button(self) -> None: """Нажатие кнопки 'Отменить' на тулбаре.""" self.toolbar.check_button_visibility("cancel") self.toolbar.get_button_by_name("cancel").click() def click_edit_button(self) -> None: """Нажатие кнопки 'Редактировать' на тулбаре.""" self.toolbar.check_button_visibility("edit") self.toolbar.get_button_by_name("edit").click() def click_save_button(self) -> None: """Нажатие кнопки 'Сохранить' на тулбаре.""" self.toolbar.check_button_visibility("save") self.toolbar.get_button_by_name("save").click() def decrease_setting_value(self, field_name: str) -> None: """Уменьшение на единицу значения поля настройки с помощью стрелочки вниз.""" field = self.get_field_by_name(field_name) field.decrease_value() def increase_setting_value(self, field_name: str) -> None: """Увеличение на единицу значения поля настройки с помощью стрелочки вверх.""" field = self.get_field_by_name(field_name) field.increase_value() def get_field_by_name(self, field_name: str) -> TextInput: """Возвращает элемент поле ввода по его имени. Returns: TextInput: Элемент поле ввода. """ if field_name == "administrator": field = self.settings_form.get_content_item("admin_setting") elif field_name == "operator": field = self.settings_form.get_content_item("operator_setting") elif field_name == "manager": field = self.settings_form.get_content_item("manager_setting") elif field_name == "inform_secur_user": field = self.settings_form.get_content_item("inform_secur_user_setting") elif field_name == '$collector': field = self.settings_form.get_content_item("collector_setting") else: assert False, f"Got unsupported field name {field_name}" return field def get_setting_value(self, field_name: str) -> str: """Возвращает текущее значение требуемого поля настроек. Returns: str : Текущее значение требуемого поля настроек. """ return self.get_field_by_name(field_name).get_input_value().strip() def get_settings_values(self) -> dict: """Возвращает словарь с текущими значениями настроек времени жизни сессии. Returns: dict: Cловарь с текущими значениями настроек времени жизни сессии. """ current_values = {} current_values['administrator'] = self.settings_form.get_content_item("admin_setting").\ get_input_value().strip() current_values['operator'] = self.settings_form.get_content_item("operator_setting").\ get_input_value().strip() current_values['manager'] = self.settings_form.get_content_item("manager_setting").\ get_input_value().strip() current_values['inform_secur_user'] = self.settings_form.get_content_item("inform_secur_user_setting").\ get_input_value().strip() current_values['$collector'] = self.settings_form.get_content_item("collector_setting").\ get_input_value().strip() return current_values def edit_settings(self, new_settings: dict) -> None: """Изменение текущих значений настроек времени жизни сессии. """ self.click_edit_button() for key, value in new_settings.items(): field = self.get_field_by_name(key) field.input_value(value) # temporararily # self.click_save_button() # alert_type = self.alert.get_alert_type() # if alert_type == "success": # self.alert.check_alert_presence(' Параметры успешно\n обновлены ') # self.alert.check_alert_absence(' Параметры успешно\n обновлены ') # else: # assert False, f"Got unexpected alert type {alert_type}" def scroll_down(self) -> None: """Скроллинг вниз формы настроек времени жизни сессии. """ locator = self.page.locator(SettingsFormLocators.SETTINGS_FORM_INPUT_FORM_CONTAINER) self.settings_form.scroll_down(locator) def scroll_up(self) -> None: """Скроллинг вверх формы настроек времени жизни сессии. """ locator = self.page.locator(SettingsFormLocators.SETTINGS_FORM_INPUT_FORM_CONTAINER) self.settings_form.scroll_up(locator) # Проверки: def check_content(self): """Проверяет наличие и корректность всех элементов формы.""" expected_input_field_names = ["Администратор", "Оператор", "Специалист информационной безопасности", "Контактное лицо", "$collector"] self.should_be_toolbar() self.should_be_toolbar_buttons() actual_input_field_names = self.input_fields_locators.keys() assert set(actual_input_field_names) == set(expected_input_field_names), \ f"Misscomparison input field names: Expected {expected_input_field_names}, Actual {actual_input_field_names}" for name in self.settings_form.content_items.keys(): item = self.settings_form.get_content_item(name) item.check_visibility( f"Session settings input form item with name '{name}' is missing" ) for name in actual_input_field_names: # Для суффикса "минут" value_suffix_loc = self.input_fields_locators.get(name). \ locator(SettingsFormLocators.SETTINGS_FORM_INPUT_VALUE_SUFFIX) value_suffix = value_suffix_loc.text_content().strip() assert value_suffix == "минут", f"Incorrect value suffix for field {name}" def check_vertical_scrolling(self) -> bool: """Проверка возможности вертикального скроллинга формы настроек времени жизни сессии. """ locator = self.page.locator(SettingsFormLocators.SETTINGS_FORM_INPUT_FORM_CONTAINER) return self.settings_form.check_vertical_scrolling(locator) def should_be_toolbar(self) -> None: """Проверяет наличие тулбара вкладки. Raises: AssertionError: Если тулбар или кнопка редактирования отсутствуют. """ loc = self.page.get_by_role("navigation").filter( has_text=re.compile("Время жизни сеанса")).locator("div").nth(1) self.toolbar.check_toolbar_presence_by_locator(loc, "Toolbar with title 'Время жизни сеанса' is missing") self.toolbar.check_button_visibility("edit") def should_be_toolbar_buttons(self) -> None: """Проверяет наличие и функциональность кнопок тулбара. Raises: AssertionError: Если кнопки недоступны или подсказки неверны. """ self.toolbar.check_button_visibility("edit") self.toolbar.check_button_tooltip("edit", "Редактировать") self.toolbar.get_button_by_name("edit").click() self.toolbar.check_button_visibility("save") self.toolbar.check_button_visibility("cancel") self.toolbar.check_button_tooltip("save", "Сохранить") self.toolbar.check_button_tooltip("cancel", "Отменить") self.toolbar.get_button_by_name("cancel").click() self.toolbar.check_button_visibility("edit") def verify_form_data(self, session_settings: dict) -> None: """Проверяет соответствие содержимого полей формы данным из БД. Raises: AssertionError: Если содержимое поля не соответствует данным из БД. """ for key, value in session_settings.items(): field_value = "" if key == "administrator": field_value = self.settings_form.get_content_item("admin_setting").get_input_value().strip() elif key == "operator": field_value = self.settings_form.get_content_item("operator_setting").get_input_value().strip() elif key == "manager": field_value = self.settings_form.get_content_item("manager_setting").get_input_value().strip() elif key == "inform_secur_user": field_value = self.settings_form.get_content_item("inform_secur_user_setting").get_input_value().strip() elif key == '$collector': field_value = self.settings_form.get_content_item("collector_setting").get_input_value().strip() else: assert False, f"Got unsupported field name {key}" assert field_value==str(value),f"{key} field value {field_value} is not equal value {value} from data base"