"""Модуль вкладки настройки Push уведомлений. Содержит класс PushNotificationsSettings для работы с вкладкой настройки Push уведомлений. Позволяет проверять состояние и взаимодействовать с элементами вкладки. """ from playwright.sync_api import Page from locators.settings_form_locators import SettingsFormLocators from elements.text_input_element import TextInput from components.alert_component import AlertComponent from components_derived.settings_form_component import SettingsFormComponent from components_derived.interactive_dropdown_list import InteractiveDropdownList from pages.base_page import BasePage class PushNotificationsSettingsTab(BasePage): """Класс для работы с вкладкой настройки Push уведомлений. Предоставляет методы для взаимодействия с вкладкой настройки Push уведомлений. Args: page: Экземпляр страницы Playwright. """ def __init__(self, page: Page) -> None: """Инициализирует компоненты вкладки настройки Push уведомлений.""" super().__init__(page) # Форма для отображения/редактирования полей настроек Push уведомлений self.settings_form = SettingsFormComponent(page) self.settings_form.add_toolbar_title("Push уведомления") container_locator = self.page.locator(SettingsFormLocators.SETTINGS_FORM_INPUT_FORM_CONTAINER) self.input_fields_locators = self.settings_form.get_input_fields_locators(container_locator) print(self.input_fields_locators) loc = self.input_fields_locators.get("Сообщение") loc_message_input = loc.locator("//input[@data-testid='PUSH_NOTIFICATIONS__text-field__message']") message_setting_input = TextInput(page, loc_message_input, "message_setting_input") self.settings_form.add_content_item("message_setting_input", message_setting_input) loc = self.input_fields_locators.get("Пользователи") users_setting_input = TextInput(page, loc.get_by_role("combobox"), "users_setting_input") self.settings_form.add_content_item("users_setting_input", users_setting_input) self.settings_form.add_content_item("users_list", InteractiveDropdownList(page)) self.settings_form.add_tooltip_button(page.locator(SettingsFormLocators.PUSH_NOTIFICATIONS_BUTTON_SUBMIT), "submit_button") self.alert = AlertComponent(page) # Действия: def clear_users_setting_value(self) -> None: """Очищает текущее значение поля настроек 'Пользователи'.""" selected_users = self.get_users_setting_value() if len(selected_users) > 0: clear_selection_button = self.page.locator(SettingsFormLocators.SETTINGS_FORM_INPUT_FORM_CONTAINER).\ get_by_role("combobox").locator(SettingsFormLocators.CLEAR_SELECTION_BUTTON) clear_selection_button.click() def click_submit_button(self) -> None: """Нажатие кнопки 'Отправить' в форме ввода настроек.""" self.settings_form.check_button_visibility("submit_button") self.settings_form.get_button_by_name("submit_button").click() def get_message_setting_value(self) -> str: """Возвращает текущее значение поля настроек 'Сообщение'. Returns: str : Текущее значение поля настроек 'Сообщение'. """ input_field = self.settings_form.get_content_item("message_setting_input") return input_field.get_input_value().strip() def get_users_setting_value(self) -> str: """Возвращает текущее значение поля настроек 'Пользователи'. Returns: str : Текущее значение поля настроек 'Пользователи'. """ users_setting_field_loc = self.page.locator(SettingsFormLocators.SETTINGS_FORM_INPUT_FORM_CONTAINER).\ get_by_role("combobox").locator(SettingsFormLocators.SELECTED_VALUES) return users_setting_field_loc.text_content().strip() def input_message(self, text: str) -> None: """Заполнение поля 'Сообщение'.""" message_input = self.settings_form.get_content_item("message_setting_input") message_input.clear() message_input.input_value(text) def deselect_users(self, users: list[str]) -> None: """Изменение значения поля 'Пользователи' путем отмены выбора из выпадающего списка заданных имен.""" assert len(users) != 0, "Users list should not be empty" self.settings_form.get_content_item("users_setting_input").click() users_list = self.settings_form.get_content_item("users_list") for user in users: users_list.deselect_item_with_text(user) # Закрываем выпадающий список (кликаем вне его) self.page.mouse.click(10, 10) def select_users(self, users: list[str]) -> None: """Заполнение поля 'Пользователи' путем выбора из выпадающего списка заданных имен.""" assert len(users) != 0, "Users list should not be empty" self.settings_form.get_content_item("users_setting_input").click() users_list = self.settings_form.get_content_item("users_list") for user in users: users_list.select_item_with_text(user) # Закрываем выпадающий список (кликаем вне его) self.page.mouse.click(10, 10) # Проверки: def check_content(self): """Проверяет наличие и корректность всех элементов страницы.""" expected_input_field_names = ["Сообщение", "Пользователи"] self.should_be_form_toolbar() self.settings_form.check_button_visibility("submit_button") self.settings_form.check_button_tooltip("submit_button", "Отправить Push уведомление") 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(): if name == "users_list": self.settings_form.get_content_item("users_setting_input").click() users_list = self.settings_form.get_content_item(name) selected_users = users_list.get_selected_items(SettingsFormLocators.DROPDOWN_LIST) assert len(selected_users) == 0, "There should be no selected users" else: item = self.settings_form.get_content_item(name) item.check_visibility( f"Push notifications settings input form item with name '{name}' is missing" ) def should_be_form_toolbar(self) -> None: """Проверяет наличие тулбара формы редактирования настроек. Raises: AssertionError: Если тулбар отсутствует. """ self.settings_form.should_be_toolbar() def should_be_success_alert(self) -> None: """Проверяет наличие сообщения об успешной отправке push-уведомления. Raises: AssertionError: Если alert отсутствует. """ 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('\nPush-уведомление\nуспешно отправлено\n') self.alert.check_alert_absence('\nPush-уведомление\nуспешно отправлено\n') def should_be_disabled_button(self) -> None: """Проверяет, что кнопка 'Отправить' отключена. Raises: AssertionError: Если кнопка включена. """ submit_button = self.settings_form.get_button_by_name("submit_button") assert submit_button.is_disabled, "Submit button should be disabled"