"""Модуль вкладки настройки резервного копирования. Содержит класс BackupSettings для работы с вкладкой настройки резервного копирования. Позволяет проверять состояние и взаимодействовать с элементами вкладки. """ import re from playwright.sync_api import Page from locators.backup_tab_locators import BackupTabLocators from elements.text_input_element import TextInput from elements.text_element import Text from elements.button_element import Button from components.toolbar_component import ToolbarComponent from components.alert_component import AlertComponent from components_derived.settings_form_component import SettingsFormComponent from components_derived.selection_bar_component import SelectionBarComponent from pages.base_page import BasePage class BackupSettingsTab(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(BackupTabLocators.BUTTON_EDIT_TOOLBAR) self.toolbar.add_tooltip_button(toolbar_button_edit, "edit") toolbar_button_save = self.page.get_by_role("navigation"). \ filter(has_text=re.compile("Резервное копирование")). \ locator(BackupTabLocators.BUTTON_SAVE_TOOLBAR) self.toolbar.add_tooltip_button(toolbar_button_save, "save") toolbar_button_cancel = self.page.get_by_role("navigation"). \ filter(has_text=re.compile("Резервное копирование")). \ locator(BackupTabLocators.BUTTON_CANCEL_TOOLBAR) self.toolbar.add_tooltip_button(toolbar_button_cancel, "cancel") # Форма для отображения/редактирования полей настроек 'Инвентаризация' self.inventory_settings = self._create_inventory_settings() # Форма для отображения/редактирования полей настроек 'Инвентаризация/Параметры планировщика' self.inventory_scheduler_settings = self._create_inventory_scheduler_settings() # Форма для отображения/редактирования полей настроек 'Потоковые данные' self.streaming_data_settings = self._create_streaming_data_settings() # Форма для отображения/редактирования полей настроек 'Потоковые данные/Параметры планировщика' self.streaming_data_scheduler_settings = self._create_streaming_data_scheduler_settings() 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() alert_type = self.alert.get_alert_type() assert alert_type == "success", f"Expected success alert, but got {alert_type} alert" self.alert.check_alert_presence('Параметры успешно\nобновлены') self.alert.check_alert_absence('Параметры успешно\nобновлены') def clear_inventory_dump_selection(self) -> None: """Удаление ранее выбранного имени дампа""" dump_selector = self.inventory_settings.get_content_item("inventory_dump_selector") dump_selector.clear_selections() def clear_streaming_data_dump_selection(self) -> None: """Удаление ранее выбранного имени дампа""" dump_selector = self.streaming_data_settings.get_content_item("streaming_data_dump_selector") dump_selector.clear_selections() def create_inventory_copy(self) -> None: """Создать резервную копию Системы.""" button_create_copy = self.inventory_settings.get_content_item("inventory_button_create_copy") button_create_copy.check_visibility("Inventory button to create copy is missing") button_create_copy.click() self.page.wait_for_load_state() alert_type = self.alert.get_alert_type() assert alert_type == "success", f"Expected success alert, but got {alert_type} alert" self.alert.check_alert_presence('\nРезервная копия создана\n') self.alert.check_alert_absence('\nРезервная копия создана\n') def create_streaming_data_copy(self) -> None: """Создать резервную копию потоковых данных.""" button_create_copy = self.streaming_data_settings.get_content_item("streaming_data_button_create_copy") button_create_copy.check_visibility("Streaming data button to create copy is missing") button_create_copy.click() self.page.wait_for_load_state() alert_type = self.alert.get_alert_type() assert alert_type == "success", f"Expected success alert, but got {alert_type} alert" self.alert.check_alert_presence('\nРезервная копия создана\n') self.alert.check_alert_absence('\nРезервная копия создана\n') def download_inventory_copy(self, dump: str, path_to_download: str) -> None: """Скачать резервную копию Системы.""" assert path_to_download.exists(), f"{path_to_download} does not exist" dump_selector = self.inventory_settings.get_content_item("inventory_dump_selector") if dump_selector: dump_selector.open_values_list() dump_selector.select_value(dump) button_download_copy = self.inventory_settings.get_content_item("inventory_button_download_copy") button_download_copy.check_visibility("Inventory button to download copy is missing") with self.page.expect_download() as download_info: button_download_copy.click() download = download_info.value download_error = download.failure() assert not download_error, f"Download error: {download_error}" download.save_as(str(path_to_download) + "/" + download.suggested_filename) def download_streaming_data_copy(self, dump: str, path_to_download: str) -> None: """Скачать резервную копию Потоковых данных.""" wait_download_timeout = 3*60000 is_set = self.page.evaluate("window.__PLAYWRIGHT__") assert is_set, "'window.__PLAYWRIGHT__' should be set to True" assert path_to_download.exists(), f"{path_to_download} does not exist" dump_selector = self.streaming_data_settings.get_content_item("streaming_data_dump_selector") if dump_selector: dump_selector.open_values_list() dump_selector.select_value(dump) button_download_copy = self.streaming_data_settings.get_content_item("streaming_data_button_download_copy") button_download_copy.check_visibility("Streaming data button to download copy is missing") with self.page.expect_download(timeout=wait_download_timeout) as download_info: button_download_copy.click() download = download_info.value download_error = download.failure() assert not download_error, f"Download error: {download_error}" download.save_as(str(path_to_download) + "/" + download.suggested_filename) def get_inventory_scheduler_settings_values(self) -> dict: """Возвращает текущее значение полей настроек 'Инвентаризация/Параметры планировщика'. Returns: dict : Текущее значение полей настроек 'Инвентаризация/Параметры планировщика'. """ values = {} field = self.inventory_scheduler_settings.get_content_item("backup_creation_time_input") values.update({"auto_backup": field.get_input_value().strip()}) field = self.inventory_scheduler_settings.get_content_item("backups_number_input") values.update({"backup_limitation": field.get_input_value().strip()}) return values def get_streaming_data_settings_values(self) -> dict: """Возвращает текущее значение полей настроек 'Потоковые данные'. Returns: dict : Текущее значение полей настроек 'Потоковые данные'. """ values = {} field = self.streaming_data_settings.get_content_item("audit_time_period_value") values.update({"data_limitation_default": field.get_input_value().strip()}) interval = self.streaming_data_settings.get_content_item("audit_time_period_value_interval_selector") interval_values = interval.get_selected_values() values.update({"interval_limitation_default": interval_values[0]}) field = self.streaming_data_settings.get_content_item("logs_time_period_value") values.update({"data_limitation_logs": field.get_input_value().strip()}) interval = self.streaming_data_settings.get_content_item("logs_time_period_value_interval_selector") interval_values = interval.get_selected_values() values.update({"interval_limitation_logs": interval_values[0]}) field = self.streaming_data_settings.get_content_item("metrics_time_period_value") values.update({"data_limitation_metrics": field.get_input_value().strip()}) interval = self.streaming_data_settings.get_content_item("metrics_time_period_value_interval_selector") interval_values = interval.get_selected_values() values.update({"interval_limitation_metrics": interval_values[0]}) field = self.streaming_data_settings.get_content_item("syslog_time_period_value") values.update({"data_limitation_syslog": field.get_input_value().strip()}) interval = self.streaming_data_settings.get_content_item("syslog_time_period_value_interval_selector") interval_values = interval.get_selected_values() values.update({"interval_limitation_syslog": interval_values[0]}) field = self.streaming_data_settings.get_content_item("tasks_time_period_value") values.update({"data_limitation_tasks": field.get_input_value().strip()}) interval = self.streaming_data_settings.get_content_item("tasks_time_period_value_interval_selector") interval_values = interval.get_selected_values() values.update({"interval_limitation_tasks": interval_values[0]}) return values def get_streaming_data_scheduler_settings_values(self) -> dict: """Возвращает текущее значение полей настроек 'Потоковые данные/Параметры планировщика'. Returns: dict : Текущее значение полей настроек 'Потоковые данные/Параметры планировщика'. """ values = {} field = self.streaming_data_scheduler_settings.get_content_item("backup_creation_time_input") values.update({"auto_backup": field.get_input_value().strip()}) return values def get_inventory_dumps_list(self) -> list[str]: """Возвращает текущий список дампов для настроек 'Инвентаризация'. Returns: list[str] : Текущий список дампов для настроек 'Инвентаризация'. """ dump_selector = self.inventory_settings.get_content_item("inventory_dump_selector") return dump_selector.get_available_options() def get_streaming_data_dumps_list(self) -> list[str]: """Возвращает текущий список дампов для настроек 'Потоковые данные'. Returns: list[str] : Текущий список дампов для настроек 'Потоковые данные'. """ dump_selector = self.streaming_data_settings.get_content_item("streaming_data_dump_selector") return dump_selector.get_available_options() def input_inventory_backup_creation_time(self, value: str) -> None: """Заполнение поля 'Время создания резервной копии' настроек 'Инвентаризация/Параметры планировщика'""" field = self.inventory_scheduler_settings.get_content_item("backup_creation_time_input") field.clear() field.input_value(value) def input_inventory_backups_number(self, value: str) -> None: """Заполнение поля 'Количество резервных копий' настроек 'Инвентаризация/Параметры планировщика'""" field = self.inventory_scheduler_settings.get_content_item("backups_number_input") field.clear() field.input_value(value) def input_audit_time_period(self, time_period: str, time_interval: str) -> None: """Заполнение поля 'Период хранения данных' для категории 'Аудит' настроек 'Потоковые данные'""" field = self.streaming_data_settings.get_content_item("audit_time_period_value") field.clear() field.input_value(time_period) interval = self.streaming_data_settings.get_content_item("audit_time_period_value_interval_selector") interval.open_values_list() interval.select_value(time_interval) def input_logs_time_period(self, time_period: str, time_interval: str) -> None: """Заполнение поля 'Период хранения данных' для категории 'Логи' настроек 'Потоковые данные'""" field = self.streaming_data_settings.get_content_item("logs_time_period_value") field.clear() field.input_value(time_period) interval = self.streaming_data_settings.get_content_item("logs_time_period_value_interval_selector") interval.open_values_list() interval.select_value(time_interval) def input_metrics_time_period(self, time_period: str, time_interval: str) -> None: """Заполнение поля 'Период хранения данных' для категории 'Метрики' настроек 'Потоковые данные'""" field = self.streaming_data_settings.get_content_item("metrics_time_period_value") field.clear() field.input_value(time_period) interval = self.streaming_data_settings.get_content_item("metrics_time_period_value_interval_selector") interval.open_values_list() interval.select_value(time_interval) def input_syslog_time_period(self, time_period: str, time_interval: str) -> None: """Заполнение поля 'Период хранения данных' для категории 'Системный лог' настроек 'Потоковые данные'""" field = self.streaming_data_settings.get_content_item("syslog_time_period_value") field.clear() field.input_value(time_period) interval = self.streaming_data_settings.get_content_item("syslog_time_period_value_interval_selector") interval.open_values_list() interval.select_value(time_interval) def input_tasks_time_period(self, time_period: str, time_interval: str) -> None: """Заполнение поля 'Период хранения данных' для категории 'Действия' настроек 'Потоковые данные'""" field = self.streaming_data_settings.get_content_item("tasks_time_period_value") field.clear() field.input_value(time_period) interval = self.streaming_data_settings.get_content_item("tasks_time_period_value_interval_selector") interval.open_values_list() interval.select_value(time_interval) def input_streaming_data_backup_creation_time(self, value: str) -> None: """Заполнение поля 'Время создания резервной копии' настроек 'Потоковые данные/Параметры планировщика'""" field = self.streaming_data_scheduler_settings.get_content_item("backup_creation_time_input") field.clear() field.input_value(value) def decrease_inventory_backups_number(self) -> None: """Уменьшение на единицу значения поля 'Количество резервных копий' настроек 'Инвентаризация/Параметры планировщика' с помощью стрелочки вниз.""" field = self.inventory_scheduler_settings.get_content_item("backups_number_input") field.decrease_value() def increase_inventory_backups_number(self) -> None: """Увеличение на единицу значения поля 'Количество резервных копий' настроек 'Инвентаризация/Параметры планировщика' с помощью стрелочки вверх.""" field = self.inventory_scheduler_settings.get_content_item("backups_number_input") field.increase_value() def decrease_audit_time_period(self) -> None: """Уменьшение на единицу значения поля 'Период хранения данных' для категории 'Аудит' настроек 'Потоковые данные' с помощью стрелочки вниз.""" field = self.streaming_data_settings.get_content_item("audit_time_period_value") field.decrease_value() def increase_audit_time_period(self) -> None: """Увеличение на единицу значения поля 'Период хранения данных' для категории 'Аудит' настроек 'Потоковые данные' с помощью стрелочки вверх.""" field = self.streaming_data_settings.get_content_item("audit_time_period_value") field.increase_value() def decrease_logs_time_period(self) -> None: """Уменьшение на единицу значения поля 'Период хранения данных' для категории 'Логи' настроек 'Потоковые данные' с помощью стрелочки вниз.""" field = self.streaming_data_settings.get_content_item("logs_time_period_value") field.decrease_value() def increase_logs_time_period(self) -> None: """Увеличение на единицу значения поля 'Период хранения данных' для категории 'Логи' настроек 'Потоковые данные' с помощью стрелочки вверх.""" field = self.streaming_data_settings.get_content_item("logs_time_period_value") field.increase_value() def decrease_metrics_time_period(self) -> None: """Уменьшение на единицу значения поля 'Период хранения данных' для категории 'Метрики' настроек 'Потоковые данные' с помощью стрелочки вниз.""" field = self.streaming_data_settings.get_content_item("metrics_time_period_value") field.decrease_value() def increase_metrics_time_period(self) -> None: """Увеличение на единицу значения поля 'Период хранения данных' для категории 'Метрики' настроек 'Потоковые данные' с помощью стрелочки вверх.""" field = self.streaming_data_settings.get_content_item("metrics_time_period_value") field.increase_value() def decrease_syslog_time_period(self) -> None: """Уменьшение на единицу значения поля 'Период хранения данных' для категории 'Системный лог' настроек 'Потоковые данные' с помощью стрелочки вниз.""" field = self.streaming_data_settings.get_content_item("syslog_time_period_value") field.decrease_value() def increase_syslog_time_period(self) -> None: """Увеличение на единицу значения поля 'Период хранения данных' для категории 'Системный лог' настроек 'Потоковые данные' с помощью стрелочки вверх.""" field = self.streaming_data_settings.get_content_item("syslog_time_period_value") field.increase_value() def decrease_tasks_time_period(self) -> None: """Уменьшение на единицу значения поля 'Период хранения данных' для категории 'Действия' настроек 'Потоковые данные' с помощью стрелочки вниз.""" field = self.streaming_data_settings.get_content_item("tasks_time_period_value") field.decrease_value() def increase_tasks_time_period(self) -> None: """Увеличение на единицу значения поля 'Период хранения данных' для категории 'Действия' настроек 'Потоковые данные' с помощью стрелочки вверх.""" field = self.streaming_data_settings.get_content_item("tasks_time_period_value") field.increase_value() def select_inventory_dump(self, dump: str) -> None: """Выбирает дамп для настроек 'Инвентаризация' из списка""" dump_selector = self.inventory_settings.get_content_item("inventory_dump_selector") if dump_selector: dump_selector.open_values_list() dump_selector.select_value(dump) def select_streaming_data_dump(self, dump: str) -> None: """Выбирает дамп для настроек 'Потоковые данные' из списка""" dump_selector = self.streaming_data_settings.get_content_item("streaming_data_dump_selector") if dump_selector: dump_selector.open_values_list() dump_selector.select_value(dump) def _create_inventory_settings(self) -> SettingsFormComponent: """ Конструктор для набора полей 'Инвентаризация'""" inventory_settings = SettingsFormComponent(self.page) inventory_settings.add_toolbar_title(" Инвентаризация ") inventory_container_locator = self.page.locator("//nav[contains(@class, 'active v-toolbar')]"). \ filter(has_text=" Инвентаризация ").locator("//following-sibling::div[1]") # Кнопка 'Создать копию' inventory_button_create_copy_loc = inventory_container_locator.\ locator(BackupTabLocators.BUTTON_INVENTORY_CREATE_COPY) inventory_button_create_copy = Button(self.page, inventory_button_create_copy_loc, "inventory_button_create_copy") inventory_settings.add_content_item("inventory_button_create_copy", inventory_button_create_copy) # Кнопка 'Загрузить копию' inventory_button_upload_copy_loc = inventory_container_locator.\ locator(BackupTabLocators.BUTTON_INVENTORY_UPLOAD_COPY) inventory_button_upload_copy = Button(self.page, inventory_button_upload_copy_loc, "inventory_button_upload_copy") inventory_settings.add_content_item("inventory_button_upload_copy", inventory_button_upload_copy) # Кнопка 'Восстановить копию' inventory_button_restore_copy_loc = inventory_container_locator.\ locator(BackupTabLocators.BUTTON_INVENTORY_RESTORE_COPY) inventory_button_restore_copy = Button(self.page, inventory_button_restore_copy_loc, "inventory_button_restore_copy") inventory_settings.add_content_item("inventory_button_restore_copy", inventory_button_restore_copy) # Кнопка 'Скачать копию' inventory_button_download_copy_loc = inventory_container_locator.\ locator(BackupTabLocators.BUTTON_INVENTORY_DOWNLOAD_COPY) inventory_button_download_copy = Button(self.page, inventory_button_download_copy_loc, "inventory_button_download_copy") inventory_settings.add_content_item("inventory_button_download_copy", inventory_button_download_copy) # Список дампов inventory_dump_selector_loc = inventory_container_locator.get_by_role("combobox") inventory_settings.add_content_item("inventory_dump_selector", SelectionBarComponent(self.page, inventory_dump_selector_loc)) return inventory_settings def _create_inventory_scheduler_settings(self) -> SettingsFormComponent: """ Конструктор для набора полей 'Инвентаризация/Параметры планировщика'""" inventory_scheduler_settings = SettingsFormComponent(self.page) inventory_scheduler_settings.add_toolbar_title(" Параметры планировщика ") # Вспомогательные локаторы div_locator = "div:nth-child(1) > div:nth-child(1)" input_locator = "div.v-text-field__slot > input" # Время создания резервной копии container_locator = self.page.locator("//nav[contains(@class, 'active v-toolbar')]"). \ filter(has_text=" Параметры планировщика ").locator("//following-sibling::div[1]").first loc_backup_creation_time_label = container_locator.locator(div_locator).locator(input_locator).first backup_creation_time_label = Text(self.page, loc_backup_creation_time_label, "backup_creation_time_label") inventory_scheduler_settings.add_content_item("backup_creation_time_label", backup_creation_time_label) loc_backup_creation_time_input = container_locator. \ locator(BackupTabLocators.INPUT_INVENTORY_BACKUP_CREATION_TIME) backup_creation_time_input = TextInput(self.page, loc_backup_creation_time_input, "backup_creation_time_input") inventory_scheduler_settings.add_content_item("backup_creation_time_input", backup_creation_time_input) # Количество резервных копий container_locator = self.page.locator("//nav[contains(@class, 'active v-toolbar')]"). \ filter(has_text=" Параметры планировщика ").locator("//following-sibling::div[2]") loc_backups_number_label = container_locator.locator(div_locator).locator(input_locator).first backups_number_label = Text(self.page, loc_backups_number_label, "backups_number_label") inventory_scheduler_settings.add_content_item("backups_number_label", backups_number_label) loc_backups_number_input = container_locator. \ locator(BackupTabLocators.INPUT_INVENTORY_BACKUP_NUMBERS) backups_number_input = TextInput(self.page, loc_backups_number_input, "backups_number_input") inventory_scheduler_settings.add_content_item("backups_number_input", backups_number_input) return inventory_scheduler_settings def _create_streaming_data_settings(self) -> SettingsFormComponent: """ Конструктор для набора полей 'Потоковые данные'""" streaming_data_settings = SettingsFormComponent(self.page) streaming_data_settings.add_toolbar_title(" Потоковые данные ") # Вспомогательные локаторы category_label_locator = "div:nth-child(1)" time_period_label_locator = "div:nth-child(1) > div:nth-child(1) input" time_period_value_locator = "div:nth-child(1) > div:nth-child(2)" time_period_interval_locator = "div:nth-child(1) > div:nth-child(3)" streaming_data_container_locator = self.page.locator("//nav[contains(@class, 'active v-toolbar')]"). \ filter(has_text=" Потоковые данные ").locator("//following-sibling::div[1]") # Кнопка 'Создать копию' streaming_data_button_create_copy_loc = streaming_data_container_locator.\ locator(BackupTabLocators.BUTTON_STREAMING_DATA_CREATE_COPY) streaming_data_button_create_copy = Button(self.page, streaming_data_button_create_copy_loc, "streaming_data_button_create_copy") streaming_data_settings.add_content_item("streaming_data_button_create_copy", streaming_data_button_create_copy) # Кнопка 'Загрузить копию' streaming_data_button_upload_copy_loc = streaming_data_container_locator.\ locator(BackupTabLocators.BUTTON_STREAMING_DATA_UPLOAD_COPY) streaming_data_button_upload_copy = Button(self.page, streaming_data_button_upload_copy_loc, "streaming_data_button_upload_copy") streaming_data_settings.add_content_item("streaming_data_button_upload_copy", streaming_data_button_upload_copy) # Кнопка 'Восстановить копию' streaming_data_button_restore_copy_loc = streaming_data_container_locator.\ locator(BackupTabLocators.BUTTON_STREAMING_DATA_RESTORE_COPY) streaming_data_button_restore_copy = Button(self.page, streaming_data_button_restore_copy_loc, "streaming_data_button_restore_copy") streaming_data_settings.add_content_item("streaming_data_button_restore_copy", streaming_data_button_restore_copy) # Кнопка 'Скачать копию' streaming_data_button_download_copy_loc = streaming_data_container_locator.\ locator(BackupTabLocators.BUTTON_STREAMING_DATA_DOWNLOAD_COPY) streaming_data_button_download_copy = Button(self.page, streaming_data_button_download_copy_loc, "streaming_data_button_download_copy") streaming_data_settings.add_content_item("streaming_data_button_download_copy", streaming_data_button_download_copy) # Список дампов streaming_data_dump_selector_loc = streaming_data_container_locator.get_by_role("combobox") streaming_data_settings.add_content_item("streaming_data_dump_selector", SelectionBarComponent(self.page, streaming_data_dump_selector_loc)) # Период хранения данных для категории Аудит audit_category_locator = self.page.locator("//nav[contains(@class, 'active v-toolbar')]"). \ filter(has_text=" Потоковые данные ").locator("//following-sibling::div[2]") audit_category_label = Text(self.page, audit_category_locator.locator(category_label_locator).first, "audit_category_label") streaming_data_settings.add_content_item("audit_category_label", audit_category_label) audit_time_period_label = Text(self.page, audit_category_locator.locator(time_period_label_locator).first, "audit_time_period_label") streaming_data_settings.add_content_item("audit_time_period_label", audit_time_period_label) audit_time_period_value = TextInput(self.page, audit_category_locator.locator(time_period_value_locator). \ locator(BackupTabLocators.INPUT_AUDIT_TIME_PERIOD), "audit_time_period_value") streaming_data_settings.add_content_item("audit_time_period_value", audit_time_period_value) audit_time_period_value_interval = TextInput(self.page, audit_category_locator.locator(time_period_interval_locator). \ locator(BackupTabLocators.INPUT_AUDIT_TIME_PERIOD_INTERVAL), "audit_time_period_value_interval") streaming_data_settings.add_content_item("audit_time_period_value_interval", audit_time_period_value_interval) audit_time_period_value_interval_selector_loc = audit_category_locator. \ locator(time_period_interval_locator). \ get_by_role("combobox") streaming_data_settings.add_content_item("audit_time_period_value_interval_selector", SelectionBarComponent(self.page, audit_time_period_value_interval_selector_loc)) # Период хранения данных для категории Логи logs_category_locator = self.page.locator("//nav[contains(@class, 'active v-toolbar')]"). \ filter(has_text=" Потоковые данные ").locator("//following-sibling::div[3]") logs_category_label = Text(self.page, logs_category_locator.locator(category_label_locator).first, "logs_category_label") streaming_data_settings.add_content_item("logs_category_label", logs_category_label) logs_time_period_label = Text(self.page, logs_category_locator.locator(time_period_label_locator).first, "logs_time_period_label") streaming_data_settings.add_content_item("logs_time_period_label", logs_time_period_label) logs_time_period_value = TextInput(self.page, logs_category_locator.locator(time_period_value_locator). \ locator(BackupTabLocators.INPUT_LOGS_TIME_PERIOD), "logs_time_period_value") streaming_data_settings.add_content_item("logs_time_period_value", logs_time_period_value) logs_time_period_value_interval = TextInput(self.page, logs_category_locator.locator(time_period_interval_locator). \ locator(BackupTabLocators.INPUT_LOGS_TIME_PERIOD_INTERVAL), "logs_time_period_value") streaming_data_settings.add_content_item("logs_time_period_value_interval", logs_time_period_value_interval) logs_time_period_value_interval_selector_loc = logs_category_locator. \ locator(time_period_interval_locator). \ get_by_role("combobox") streaming_data_settings.add_content_item("logs_time_period_value_interval_selector", SelectionBarComponent(self.page, logs_time_period_value_interval_selector_loc)) # Период хранения данных для категории Метрики metrics_category_locator = self.page.locator("//nav[contains(@class, 'active v-toolbar')]"). \ filter(has_text=" Потоковые данные ").locator("//following-sibling::div[4]") metrics_category_label = Text(self.page, metrics_category_locator.locator(category_label_locator).first, "metrics_category_label") streaming_data_settings.add_content_item("metrics_category_label", metrics_category_label) metrics_time_period_label = Text(self.page, metrics_category_locator.locator(time_period_label_locator).first, "metrics_time_period_label") streaming_data_settings.add_content_item("metrics_time_period_label", metrics_time_period_label) metrics_time_period_value = TextInput(self.page, metrics_category_locator.locator(time_period_value_locator). \ locator(BackupTabLocators.INPUT_METRICS_TIME_PERIOD), "metrics_time_period_value") streaming_data_settings.add_content_item("metrics_time_period_value", metrics_time_period_value) metrics_time_period_value_interval = TextInput(self.page, metrics_category_locator.locator(time_period_interval_locator). \ locator(BackupTabLocators.INPUT_METRICS_TIME_PERIOD_INTERVAL), "metrics_time_period_value_interval") streaming_data_settings.add_content_item("metrics_time_period_value_interval", metrics_time_period_value_interval) metrics_time_period_value_interval_selector_loc = metrics_category_locator. \ locator(time_period_interval_locator). \ get_by_role("combobox") streaming_data_settings.add_content_item("metrics_time_period_value_interval_selector", SelectionBarComponent(self.page, metrics_time_period_value_interval_selector_loc)) # Период хранения данных для категории Системный лог syslog_category_locator = self.page.locator("//nav[contains(@class, 'active v-toolbar')]"). \ filter(has_text=" Потоковые данные ").locator("//following-sibling::div[5]") syslog_category_label = Text(self.page, syslog_category_locator.locator(category_label_locator).first, "syslog_category_label") streaming_data_settings.add_content_item("syslog_category_label", syslog_category_label) syslog_time_period_label = Text(self.page, syslog_category_locator.locator(time_period_label_locator).first, "syslog_time_period_label") streaming_data_settings.add_content_item("syslog_time_period_label", syslog_time_period_label) syslog_time_period_value = TextInput(self.page, syslog_category_locator.locator(time_period_value_locator). \ locator(BackupTabLocators.INPUT_SYSLOG_TIME_PERIOD), "syslog_time_period_value") streaming_data_settings.add_content_item("syslog_time_period_value", syslog_time_period_value) syslog_time_period_value_interval = TextInput(self.page, syslog_category_locator.locator(time_period_interval_locator). \ locator(BackupTabLocators.INPUT_SYSLOG_TIME_PERIOD_INTERVAL), "syslog_time_period_value_interval") streaming_data_settings.add_content_item("syslog_time_period_value_interval", syslog_time_period_value_interval) syslog_time_period_value_interval_selector_loc = syslog_category_locator. \ locator(time_period_interval_locator). \ get_by_role("combobox") streaming_data_settings.add_content_item("syslog_time_period_value_interval_selector", SelectionBarComponent(self.page, syslog_time_period_value_interval_selector_loc)) # Период хранения данных для категории Действия tasks_category_locator = self.page.locator("//nav[contains(@class, 'active v-toolbar')]"). \ filter(has_text=" Потоковые данные ").locator("//following-sibling::div[6]") tasks_category_label = Text(self.page, tasks_category_locator.locator(category_label_locator).first, "tasks_category_label") streaming_data_settings.add_content_item("tasks_category_label", tasks_category_label) tasks_time_period_label = Text(self.page, tasks_category_locator.locator(time_period_label_locator).first, "tasks_time_period_label") streaming_data_settings.add_content_item("tasks_time_period_label", tasks_time_period_label) tasks_time_period_value = TextInput(self.page, tasks_category_locator.locator(time_period_value_locator). \ locator(BackupTabLocators.INPUT_TASKS_TIME_PERIOD), "tasks_time_period_value") streaming_data_settings.add_content_item("tasks_time_period_value", tasks_time_period_value) tasks_time_period_value_interval = TextInput(self.page, tasks_category_locator.locator(time_period_interval_locator). \ locator(BackupTabLocators.INPUT_TASKS_TIME_PERIOD_INTERVAL), "tasks_time_period_value_interval") streaming_data_settings.add_content_item("tasks_time_period_value_interval", tasks_time_period_value_interval) tasks_time_period_value_interval_selector_loc = tasks_category_locator. \ locator(time_period_interval_locator). \ get_by_role("combobox") streaming_data_settings.add_content_item("tasks_time_period_value_interval_selector", SelectionBarComponent(self.page, tasks_time_period_value_interval_selector_loc)) return streaming_data_settings def _create_streaming_data_scheduler_settings(self) -> SettingsFormComponent: """ Конструктор для набора полей 'Потоковые данные/Параметры планировщика'""" streaming_data_scheduler_settings = SettingsFormComponent(self.page) streaming_data_scheduler_settings.add_toolbar_title(" Параметры планировщика ") # Вспомогательные локаторы div_locator = "div:nth-child(1) > div:nth-child(1)" input_locator = "div.v-text-field__slot > input" # Время создания резервной копии container_locator = self.page.locator("//nav[contains(@class, 'active v-toolbar')]"). \ filter(has_text=" Параметры планировщика ").locator("//following-sibling::div").last loc_backup_creation_time_label = container_locator.locator(div_locator).locator(input_locator).first backup_creation_time_label = Text(self.page, loc_backup_creation_time_label, "backup_creation_time_label") streaming_data_scheduler_settings.add_content_item("backup_creation_time_label", backup_creation_time_label) loc_backup_creation_time_input = container_locator. \ locator(BackupTabLocators.INPUT_STREAMING_DATA_BACKUP_CREATION_TIME) backup_creation_time_input = TextInput(self.page, loc_backup_creation_time_input, "backup_creation_time_input") streaming_data_scheduler_settings.add_content_item("backup_creation_time_input", backup_creation_time_input) return streaming_data_scheduler_settings # Проверки: def check_content(self): """Проверяет наличие и корректность всех элементов страницы.""" self.should_be_toolbar() self._check_inventory_settings_content() self._check_inventory_scheduler_settings_content() self._check_streaming_data_settings_content() self._check_streaming_data_scheduler_settings_content() def check_inventory_restore_copy_button_disabling(self) -> bool: """Проверяет доступность кнопки 'Восстановить копию' настройки 'Инвентаризация'""" button_restore_copy = self.inventory_settings.get_content_item("inventory_button_restore_copy") button_restore_copy.check_visibility("Inventory button to restore copy is missing") return button_restore_copy.is_disabled() def check_streaming_data_restore_copy_button_disabling(self) -> bool: """Проверяет доступность кнопки 'Восстановить копию' настройки 'Потоковые данные'""" button_restore_copy = self.streaming_data_settings.get_content_item("streaming_data_button_restore_copy") button_restore_copy.check_visibility("Streaming data button to restore copy is missing") return button_restore_copy.is_disabled() 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") 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 should_be_inventory_download_button(self) -> None: """Проверяет наличие кнопки 'Скачать копию' настройки 'Инвентаризация'""" button_download_copy = self.inventory_settings.get_content_item("inventory_button_download_copy") button_download_copy.check_visibility("Inventory button to download copy is missing") def should_be_inventory_upload_button(self) -> None: """Проверяет наличие кнопки 'Загрузить копию' настройки 'Инвентаризация'""" button_upload_copy = self.inventory_settings.get_content_item("inventory_button_upload_copy") button_upload_copy.check_visibility("Inventory button to upload copy is missing") def should_be_streaming_data_download_button(self) -> None: """Проверяет наличие кнопки 'Скачать копию' настройки 'Потоковые данные'""" button_download_copy = self.streaming_data_settings.get_content_item("streaming_data_button_download_copy") button_download_copy.check_visibility("Streaming data button to download copy is missing") def should_be_streaming_data_upload_button(self) -> None: """Проверяет наличие кнопки 'Загрузить копию' настройки 'Потоковые данные'""" button_upload_copy = self.streaming_data_settings.get_content_item("streaming_data_button_upload_copy") button_upload_copy.check_visibility("Streaming data button to upload copy is missing") def _check_inventory_settings_content(self) -> None: """Проверяет наличие и корректность всех элементов настройки 'Инвентаризация'.""" self.inventory_settings.should_be_toolbar() button_create_copy = self.inventory_settings.get_content_item("inventory_button_create_copy") button_create_copy.check_visibility("Inventory button to create copy is missing") button_text = button_create_copy.get_text(0).strip() assert button_text == "Создать копию", f"Unexpected inventory button to create copy text: {button_text}" button_upload_copy = self.inventory_settings.get_content_item("inventory_button_upload_copy") button_upload_copy.check_visibility("Inventory button to upload copy is missing") button_text = button_upload_copy.get_text(0).strip() assert button_text == "Загрузить копию", f"Unexpected inventory button to upload copy text: {button_text}" button_restore_copy = self.inventory_settings.get_content_item("inventory_button_restore_copy") button_restore_copy.check_visibility("Inventory button to restore copy is missing") button_text = button_restore_copy.get_text(0).strip() assert button_text == "Восстановить копию", f"Unexpected inventory button to restore copy text: {button_text}" button_download_copy = self.inventory_settings.get_content_item("inventory_button_download_copy") dump_selector = self.inventory_settings.get_content_item("inventory_dump_selector") val = dump_selector.get_selected_values() if len(val) == 0: assert button_restore_copy.is_disabled(), "Inventory button to restore copy should be disabled" assert button_download_copy.get_locator().count() == 0, \ "Inventory button to download copy should be missing" else: assert not button_restore_copy.is_disabled(), "Inventory button to restore copy should be enabled" button_download_copy.check_visibility("Inventory button to download copy is missing") button_text = button_download_copy.get_text(0).strip() assert button_text == "Скачать копию", f"Unexpected inventory button to upload copy text: {button_text}" def _check_inventory_scheduler_settings_content(self) -> None: """Проверяет наличие и корректность всех элементов настройки 'Инвентаризация/Параметры планировщика'.""" self.inventory_scheduler_settings.should_be_toolbar() backup_creation_time_label = self.inventory_scheduler_settings.get_content_item("backup_creation_time_label") backup_creation_time_label.check_visibility("Inventory backup creation time label is missing") label_text = backup_creation_time_label.get_locator().input_value() assert label_text == "Время создания резервной копии", "Unexpected inventory backup creation time label text" backup_creation_time_input = self.inventory_scheduler_settings.get_content_item("backup_creation_time_input") backup_creation_time_input.check_visibility("Inventory backup creation time input field is missing") backups_number_label = self.inventory_scheduler_settings.get_content_item("backups_number_label") backups_number_label.check_visibility("Inventory backups number label is missing") label_text = backups_number_label.get_locator().input_value() assert label_text == "Количество резервных копий", "Unexpected inventory backups number label text" backups_number_input = self.inventory_scheduler_settings.get_content_item("backups_number_input") backups_number_input.check_visibility("Inventory backups number input field is missing") def _check_streaming_data_settings_content(self) -> None: """Проверяет наличие и корректность всех элементов настройки 'Потоковые данные'.""" self.streaming_data_settings.should_be_toolbar() button_create_copy = self.streaming_data_settings.get_content_item("streaming_data_button_create_copy") button_create_copy.check_visibility("Streaming data button to create copy is missing") button_text = button_create_copy.get_text(0).strip() assert button_text == "Создать копию", f"Unexpected streaming data button to create copy text: {button_text}" button_upload_copy = self.streaming_data_settings.get_content_item("streaming_data_button_upload_copy") button_upload_copy.check_visibility("Streaming data button to upload copy is missing") button_text = button_upload_copy.get_text(0).strip() assert button_text == "Загрузить копию", f"Unexpected streaming data button to upload copy text: {button_text}" button_restore_copy = self.streaming_data_settings.get_content_item("streaming_data_button_restore_copy") button_restore_copy.check_visibility("Streaming data button to restore copy is missing") button_text = button_restore_copy.get_text(0).strip() assert button_text == "Восстановить копию", \ f"Unexpected streaming data button to restore copy text: {button_text}" button_download_copy = self.streaming_data_settings.get_content_item("streaming_data_button_download_copy") dump_selector = self.streaming_data_settings.get_content_item("streaming_data_dump_selector") val = dump_selector.get_selected_values() if len(val) == 0: assert button_restore_copy.is_disabled(), "Streaming data button to restore copy should be disabled" assert button_download_copy.get_locator().count() == 0, \ "Streaming data button to download copy should be missing" else: assert not button_restore_copy.is_disabled(), "Streaming data button to restore copy should be enabled" button_download_copy.check_visibility("Streaming data button to download copy is missing") button_text = button_download_copy.get_text(0).strip() assert button_text == "Скачать копию", \ f"Unexpected streaming data button to upload copy text: {button_text}" audit_category_label = self.streaming_data_settings.get_content_item("audit_category_label") audit_category_label.check_visibility("Streaming data Audit category label is missing") audit_category_label_text = audit_category_label.get_text(0).strip() assert audit_category_label_text == "Аудит", \ f"Unexpected streaming data Audit category label text: {audit_category_label_text}" audit_time_period_label = self.streaming_data_settings.get_content_item("audit_time_period_label") audit_time_period_label.check_visibility("Streaming data Audit storage time period label is missing") audit_time_period_label_text = audit_time_period_label.get_locator().input_value() assert audit_time_period_label_text == "Период хранения данных", \ f"Unexpected streaming data Audit storage time period label text: {audit_time_period_label_text}" audit_time_period_value = self.streaming_data_settings.get_content_item("audit_time_period_value") audit_time_period_value.check_visibility("Streaming data Audit storage time period input field is missing") audit_time_period_value_interval = self.streaming_data_settings. \ get_content_item("audit_time_period_value_interval") audit_time_period_value_interval. \ check_visibility("Streaming data Audit storage time period interval field is missing") logs_category_label = self.streaming_data_settings.get_content_item("logs_category_label") logs_category_label.check_visibility("Streaming data Logs category label is missing") logs_category_label_text = logs_category_label.get_text(0).strip() assert logs_category_label_text == "Логи", \ f"Unexpected streaming data Logs category label text: {logs_category_label_text}" logs_time_period_label = self.streaming_data_settings.get_content_item("logs_time_period_label") logs_time_period_label.check_visibility("Streaming data Logs storage time period label is missing") logs_time_period_label_text = logs_time_period_label.get_locator().input_value() assert logs_time_period_label_text == "Период хранения данных", \ f"Unexpected streaming data Logs storage time period label text: {logs_time_period_label_text}" logs_time_period_value = self.streaming_data_settings.get_content_item("logs_time_period_value") logs_time_period_value.check_visibility("Streaming data Logs storage time period input field is missing") logs_time_period_value_interval = self.streaming_data_settings. \ get_content_item("logs_time_period_value_interval") logs_time_period_value_interval. \ check_visibility("Streaming data Logs storage time period interval field is missing") metrics_category_label = self.streaming_data_settings.get_content_item("metrics_category_label") metrics_category_label.check_visibility("Streaming data Metrics category label is missing") metrics_category_label_text = metrics_category_label.get_text(0).strip() assert metrics_category_label_text == "Метрики", \ f"Unexpected streaming data Metrics category label text: {metrics_category_label_text}" metrics_time_period_label = self.streaming_data_settings.get_content_item("metrics_time_period_label") metrics_time_period_label.check_visibility("Streaming data Metrics storage time period label is missing") metrics_time_period_label_text = metrics_time_period_label.get_locator().input_value() assert metrics_time_period_label_text == "Период хранения данных", \ f"Unexpected streaming data Metrics storage time period label text: {metrics_time_period_label_text}" metrics_time_period_value = self.streaming_data_settings.get_content_item("metrics_time_period_value") metrics_time_period_value.check_visibility("Streaming data Metrics storage time period input field is missing") metrics_time_period_value_interval = self.streaming_data_settings. \ get_content_item("metrics_time_period_value_interval") metrics_time_period_value_interval. \ check_visibility("Streaming data Metrics storage time period interval field is missing") syslog_category_label = self.streaming_data_settings.get_content_item("syslog_category_label") syslog_category_label.check_visibility("Streaming data Sys Log category label is missing") syslog_category_label_text = syslog_category_label.get_text(0).strip() assert syslog_category_label_text == "Системный лог", \ f"Unexpected streaming data Sys Log category label text: {syslog_category_label_text}" syslog_time_period_label = self.streaming_data_settings.get_content_item("syslog_time_period_label") syslog_time_period_label.check_visibility("Streaming data Sys Log storage time period label is missing") syslog_time_period_label_text = syslog_time_period_label.get_locator().input_value() assert syslog_time_period_label_text == "Период хранения данных", \ f"Unexpected streaming data Sys Log storage time period label text: {syslog_time_period_label_text}" syslog_time_period_value = self.streaming_data_settings.get_content_item("syslog_time_period_value") syslog_time_period_value.check_visibility("Streaming data Sys Log storage time period input field is missing") syslog_time_period_value_interval = self.streaming_data_settings. \ get_content_item("syslog_time_period_value_interval") syslog_time_period_value_interval. \ check_visibility("Streaming data Sys Log storage time period interval field is missing") tasks_category_label = self.streaming_data_settings.get_content_item("tasks_category_label") tasks_category_label.check_visibility("Streaming data Actions category label is missing") tasks_category_label_text = tasks_category_label.get_text(0).strip() assert tasks_category_label_text == "Действия", \ f"Unexpected streaming data Actions category label text: {tasks_category_label_text}" tasks_time_period_label = self.streaming_data_settings.get_content_item("tasks_time_period_label") tasks_time_period_label.check_visibility("Streaming data Actions storage time period label is missing") tasks_time_period_label_text = tasks_time_period_label.get_locator().input_value() assert tasks_time_period_label_text == "Период хранения данных", \ f"Unexpected streaming data Actions storage time period label text: {tasks_time_period_label_text}" tasks_time_period_value = self.streaming_data_settings.get_content_item("tasks_time_period_value") tasks_time_period_value.check_visibility("Streaming data Actions storage time period input field is missing") tasks_time_period_value_interval = self.streaming_data_settings. \ get_content_item("tasks_time_period_value_interval") tasks_time_period_value_interval. \ check_visibility("Streaming data Actions storage time period interval field is missing") def _check_streaming_data_scheduler_settings_content(self) -> None: """Проверяет наличие и корректность всех элементов настройки 'Потоковые данные/Параметры планировщика'.""" self.streaming_data_scheduler_settings.should_be_toolbar() backup_creation_time_label = self.streaming_data_scheduler_settings. \ get_content_item("backup_creation_time_label") backup_creation_time_label.check_visibility("Streaming data backup creation time label is missing") label_text = backup_creation_time_label.get_locator().input_value() assert label_text == "Время создания резервной копии", \ "Unexpected streaming data backup creation time label text" backup_creation_time_input = self.streaming_data_scheduler_settings. \ get_content_item("backup_creation_time_input") backup_creation_time_input.check_visibility("Streaming data backup creation time input field is missing")