194 lines
9.2 KiB
Python
194 lines
9.2 KiB
Python
"""Модуль вкладки настройки 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 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("Общие")
|
||
|
||
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_toolbar()
|
||
|
||
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_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')
|