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