# Исходный код pages.push_notifications_settings_tab

    """Модуль вкладки настройки Push уведомлений.

    Содержит класс PushNotificationsSettings для работы с вкладкой настройки Push уведомлений.
    Позволяет проверять состояние и взаимодействовать с элементами вкладки.
    """

    import re
    from playwright.sync_api import Page
    from locators.settings_form_locators import SettingsFormLocators
    from elements.text_input_element import TextInput
    from elements.text_element import Text
    from components.toolbar_component import ToolbarComponent
    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)

            self.toolbar = ToolbarComponent(page, "Push уведомления")

            # Форма для отображения/редактирования полей настроек Push уведомлений
            self.settings_form = SettingsFormComponent(page)
            self.settings_form.add_toolbar_title("Общие")

            message_setting_label = Text(page,
                                       page.locator(SettingsFormLocators.SETTTINGS_FORM_SCROLL_CONTAINER).\
                                       get_by_text('Сообщение'),
                                       "message_setting_label")
            self.settings_form.add_content_item("message_setting_label", message_setting_label)

            loc_message_input = page.locator(SettingsFormLocators.SETTTINGS_FORM_SCROLL_CONTAINER).\
                                get_by_label('Сообщение').nth(1)
            message_setting_input = TextInput(page, loc_message_input, "message_setting_input")
            self.settings_form.add_content_item("message_setting_input", message_setting_input)

            users_settings_locator = page.locator(SettingsFormLocators.SETTTINGS_FORM_SCROLL_CONTAINER).\
                                     get_by_label('Пользователи')
            users_setting_label = Text(page, users_settings_locator, "users_setting_label")
            self.settings_form.add_content_item("users_setting_label", users_setting_label)

            users_setting_input = TextInput(page,
                                            page.locator(SettingsFormLocators.SETTTINGS_FORM_SCROLL_CONTAINER).\
                                            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.SETTTINGS_FORM_SCROLL_CONTAINER).\
                                                  get_by_role("button", name='Отправить'),
                                                  "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.SETTTINGS_FORM_SCROLL_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.SETTTINGS_FORM_SCROLL_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):
            """Проверяет наличие и корректность всех элементов страницы."""

            self.should_be_toolbar()

            self.should_be_form_toolbar()

            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"
                    )

            self.settings_form.check_button_visibility("submit_button")
            self.settings_form.check_button_tooltip("submit_button", "Отправить Push уведомление")

        def should_be_toolbar(self) -> None:
            """Проверяет наличие тулбара страницы.

            Raises:
                AssertionError: Если тулбар или кнопка редактирования отсутствуют.
            """
            loc = self.page.get_by_role("navigation").filter(
                  has_text=re.compile("Push уведомления")).locator("div").nth(1)
            self.toolbar.check_toolbar_presence_by_locator(loc, "Toolbar with title 'Push уведомления' 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_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')