"""Модуль вкладки настройки 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')