From eb7fe13b0272813947e34c72d020f430efebae5c Mon Sep 17 00:00:00 2001 From: nsubbot Date: Tue, 28 Oct 2025 10:21:09 +0300 Subject: [PATCH] =?UTF-8?q?=D0=90=D0=BA=D1=82=D1=83=D0=B0=D0=BB=D0=B8?= =?UTF-8?q?=D0=B7=D0=B8=D1=80=D0=BE=D0=B2=D0=B0=D0=BD=D1=8B=20=D1=82=D0=B5?= =?UTF-8?q?=D1=81=D1=82=D1=8B=20=D0=B4=D0=BB=D1=8F=20=D0=B2=D0=BA=D0=BB?= =?UTF-8?q?=D0=B0=D0=B4=D0=BE=D0=BA=20=D0=A1=D0=B5=D0=B0=D0=BD=D1=81=D1=8B?= =?UTF-8?q?/=D0=A2=D0=B5=D0=BA=D1=83=D1=89=D0=B8=D0=B5=20=D0=B8=20=D0=A1?= =?UTF-8?q?=D0=B5=D0=B0=D0=BD=D1=81=D1=8B/=D0=9D=D0=B0=D1=81=D1=82=D1=80?= =?UTF-8?q?=D0=BE=D0=B9=D0=BA=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- components/settings_form_component.py | 92 ++++++++++ locators/settings_form_locators.py | 16 ++ ...{session_tab.py => current_session_tab.py} | 10 +- pages/session_settings_tab.py | 170 ++++++++++++++++++ .../test_current_sessions_tab.py} | 62 ++++--- .../e2e/sessions/test_session_settings_tab.py | 71 ++++++++ tests/e2e/test_expand_navigation_panel.py | 2 +- 7 files changed, 391 insertions(+), 32 deletions(-) create mode 100644 components/settings_form_component.py create mode 100644 locators/settings_form_locators.py rename pages/{session_tab.py => current_session_tab.py} (98%) create mode 100644 pages/session_settings_tab.py rename tests/e2e/{test_sessions_tab.py => sessions/test_current_sessions_tab.py} (93%) create mode 100644 tests/e2e/sessions/test_session_settings_tab.py diff --git a/components/settings_form_component.py b/components/settings_form_component.py new file mode 100644 index 0000000..79d4684 --- /dev/null +++ b/components/settings_form_component.py @@ -0,0 +1,92 @@ +"""Модуль компонента формы ввода и отображения полей настроек. Содержит класс для работы с формами ввода +и отображения полей настроек,их элементами и проверками.""" + +from playwright.sync_api import Page +from tools.logger import get_logger +from locators.settings_form_locators import SettingsFormLocators +from elements.button_element import Button +from components.toolbar_component import ToolbarComponent +from components.base_component import BaseComponent + +logger = get_logger("MODAL_WINDOW") + + +class SettingsFormComponent(BaseComponent): + """Компонент формы ввода и отображения полей настроек. Предоставляет методы для взаимодействия с формой, + ее содержимым и проверок.""" + + def __init__(self, page: Page): + super().__init__(page) + self.toolbar = ToolbarComponent(page, "") + self.content_items = {} + self.buttons = [] + + # Действия: + def add_content_item(self, name: str, item: object) -> None: + """Добавляет элемент содержимого в форму по заданному имени.""" + + self.content_items[name] = item + + def get_content_item(self, name: str) -> object | None: + """Возвращает элемент содержимого по имени или None, если не найден.""" + + return self.content_items.get(name) + + def add_toolbar_title(self, title: str) -> None: + """Добавляет заголовок в панель инструментов модального окна.""" + + self.toolbar.add_title(title) + + def add_button(self, locator: str, name: str) -> None: + """Добавляет кнопку в форму.""" + + self.buttons.append(Button(self.page, locator, name)) + + def get_button_by_name(self, name: str) -> Button | None: + """Ищет и возвращает кнопку по имени или None, если не найдена.""" + + for button in self.buttons: + if button.name == name: + return button + return None + + def click_button(self, name: str) -> None: + """Кликает по кнопке с заданным именем. Вызывает ошибку, если не найдена.""" + + button = self.get_button_by_name(name) + if button is None: + assert False, f"Button with name '{name}' not found" + button.click() + + def scroll_form_down(self) -> None: + """Прокручивает содержимое окна вниз.""" + + self.scroll_down(SettingsFormLocators.SETTTINGS_FORM_SCROLL_CONTAINER) + + def scroll_form_up(self) -> None: + """Прокручивает содержимое окна вверх.""" + + self.scroll_up(SettingsFormLocators.SETTTINGS_FORM_SCROLL_CONTAINER) + + # Проверки: + def check_form_vertical_scrolling(self) -> bool: + """Проверяет возможность вертикальной прокрутки окна.""" + + return self.is_scrollable_vertically(SettingsFormLocators.SETTTINGS_FORM_SCROLL_CONTAINER) + + def check_button_visibility(self, name: str) -> None: + """Проверяет наличие кнопки по имени. Вызывает ошибку, если не найдена.""" + + button = self.get_button_by_name(name) + if button is None: + assert False, f"Button with name '{name}' not found" + button.check_visibility(f"Button with name '{name}' is missing") + + def should_be_toolbar(self) -> None: + """Проверяет наличие тулбара. + + Raises: + AssertionError: Если тулбар или кнопка редактирования отсутствуют. + """ + + self.toolbar.check_toolbar_presence("Toolbar is missing") diff --git a/locators/settings_form_locators.py b/locators/settings_form_locators.py new file mode 100644 index 0000000..905012a --- /dev/null +++ b/locators/settings_form_locators.py @@ -0,0 +1,16 @@ +"""Модуль settings_form_locators содержит локаторы компонента формы ввода и отображения полей настроек. + +Класс SettingsFormLocators предоставляет XPath локаторы для взаимодействия +с элементами модальных окон в тестах. +""" + +class SettingsFormLocators: + """Локаторы для компонента формы ввода и отображения полей настроек. + + Содержит XPath локаторы для: + SETTTINGS_FORM_SCROLL_CONTAINER (str): контейнера с прокруткой модального окна + SETTTINGS_FORM_TITLE (str): заголовка тулбара + """ + + SETTTINGS_FORM_SCROLL_CONTAINER = "//div[contains(@class, 'scrollarea__body')]" + SETTTINGS_FORM_TITLE = f"{SETTTINGS_FORM_SCROLL_CONTAINER}//div[contains(@class, 'v-toolbar__title')]" diff --git a/pages/session_tab.py b/pages/current_session_tab.py similarity index 98% rename from pages/session_tab.py rename to pages/current_session_tab.py index def072a..c52d28a 100644 --- a/pages/session_tab.py +++ b/pages/current_session_tab.py @@ -1,6 +1,6 @@ -"""Модуль вкладки 'Сеансы'. +"""Модуль вкладки 'Сеансы/Текущие'. -Содержит класс SessionsTab для работы с таблицей сеансов. +Содержит класс CurrentSessionsTab для работы с таблицей сеансов. Позволяет проверять состояние и взаимодействовать с элементами вкладки. """ @@ -15,8 +15,8 @@ from components.table_component import TableComponent from components.confirm_component import ConfirmComponent from pages.base_page import BasePage -class SessionsTab(BasePage): - """Класс для работы с вкладкой 'Сеансы'. +class CurrentSessionsTab(BasePage): + """Класс для работы с вкладкой 'Сеансы/Текущие'. Предоставляет методы для взаимодействия с таблицей сеансов и проверки её состояния. @@ -26,7 +26,7 @@ class SessionsTab(BasePage): """ def __init__(self, page: Page) -> None: - """Инициализирует компоненты вкладки 'Сеансы'.""" + """Инициализирует компоненты вкладки 'Сеансы/Текущие'.""" super().__init__(page) diff --git a/pages/session_settings_tab.py b/pages/session_settings_tab.py new file mode 100644 index 0000000..0408e41 --- /dev/null +++ b/pages/session_settings_tab.py @@ -0,0 +1,170 @@ +"""Модуль вкладки 'Сеансы/Настройки'. + +Содержит класс SessionSettingsTab для работы с полями настройки сессий пользователей. +""" + +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.settings_form_component import SettingsFormComponent +from pages.base_page import BasePage + + +class SessionSettingsTab(BasePage): + """Класс для работы с вкладкой 'Сеансы/Настройки'. + + Предоставляет методы для взаимодействия с полями настройки сессий пользователей. + + Args: + page: Экземпляр страницы Playwright. + """ + + def __init__(self, page: Page) -> None: + """Инициализирует компоненты вкладки 'Сеансы/Настройки'.""" + + super().__init__(page) + + locator_button_1 = self.page.get_by_role("navigation").filter( + has_text=re.compile("Настройки") + ).get_by_role("button").nth(0) + locator_button_2 = self.page.get_by_role("navigation").filter( + has_text=re.compile("Настройки") + ).get_by_role("button").nth(1) + + self.toolbar = ToolbarComponent(page, "Настройки") + self.toolbar.add_tooltip_button(locator_button_1, "edit") + self.toolbar.add_tooltip_button(locator_button_1, "save") + self.toolbar.add_tooltip_button(locator_button_2, "cancel") + + # Форма для отображения/редактирования полей настроек сессии пользователя + self.settings_form = SettingsFormComponent(page) + + self.settings_form.add_toolbar_title("Время жизни сеанса") + + admin_setting_label = Text(page, + page.locator(SettingsFormLocators.SETTTINGS_FORM_SCROLL_CONTAINER).\ + get_by_text('Администратор'), + "admin_setting_label") + self.settings_form.add_content_item("admin_setting_label", admin_setting_label) + + loc_admin = page.locator(SettingsFormLocators.SETTTINGS_FORM_SCROLL_CONTAINER).\ + get_by_label('Администратор') + admin_setting = TextInput(page, loc_admin, "admin_setting") + self.settings_form.add_content_item("admin_setting", admin_setting) + + operator_setting_label = Text(page, + page.locator(SettingsFormLocators.SETTTINGS_FORM_SCROLL_CONTAINER).\ + get_by_text('Оператор'), + "operator_setting_label") + self.settings_form.add_content_item("operator_setting_label", operator_setting_label) + + loc_oper = page.locator(SettingsFormLocators.SETTTINGS_FORM_SCROLL_CONTAINER).\ + get_by_label('Оператор') + operator_setting = TextInput(page, loc_oper, "operator_setting") + self.settings_form.add_content_item("operator_setting", operator_setting) + + manager_setting_label = Text(page, + page.locator(SettingsFormLocators.SETTTINGS_FORM_SCROLL_CONTAINER).\ + get_by_text('Контактное лицо'), + "manager_setting_label") + self.settings_form.add_content_item("manager_setting_label", manager_setting_label) + + loc_manager = page.locator(SettingsFormLocators.SETTTINGS_FORM_SCROLL_CONTAINER).\ + get_by_label('Контактное лицо') + manager_setting = TextInput(page, loc_manager, "manager_setting") + self.settings_form.add_content_item("manager_setting", manager_setting) + + inform_secur_user_setting_label = Text(page, + page.locator(SettingsFormLocators.SETTTINGS_FORM_SCROLL_CONTAINER).\ + get_by_text('Специалист информационной безопасности'), + "inform_secur_user_setting_label") + self.settings_form.add_content_item("inform_secur_user_setting_label", inform_secur_user_setting_label) + + loc_inform_secur_user = page.locator(SettingsFormLocators.SETTTINGS_FORM_SCROLL_CONTAINER).\ + get_by_label('Специалист информационной безопасности') + inform_secur_user_setting = TextInput(page, loc_inform_secur_user, "inform_secur_user_setting") + self.settings_form.add_content_item("inform_secur_user_setting", inform_secur_user_setting) + + collector_setting_label = Text(page, + page.locator(SettingsFormLocators.SETTTINGS_FORM_SCROLL_CONTAINER).\ + get_by_text('$collector'), + "collector_setting_label") + self.settings_form.add_content_item("collector_setting_label", collector_setting_label) + + loc_collector = page.locator(SettingsFormLocators.SETTTINGS_FORM_SCROLL_CONTAINER).\ + get_by_label('$collector') + collector_setting = TextInput(page, loc_collector, "collector_setting") + self.settings_form.add_content_item("collector_setting", collector_setting) + + # Действия: + # Проверки: + def check_content(self): + """Проверяет наличие и корректность всех элементов формы.""" + + self.should_be_toolbar() + self.should_be_toolbar_buttons() + + self.settings_form.should_be_toolbar() + + for name in self.settings_form.content_items.keys(): + item = self.settings_form.get_content_item(name) + print("check item: "+name) + item.check_visibility( + f"Session 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("Настройки")).locator("div").nth(1) + self.toolbar.check_toolbar_presence_by_locator(loc, "Toolbar with title 'Настройки' is missing") + self.toolbar.check_button_visibility("edit") + + def should_be_toolbar_buttons(self) -> None: + """Проверяет наличие и функциональность кнопок тулбара. + + Raises: + AssertionError: Если кнопки недоступны или подсказки неверны. + """ + + self.toolbar.check_button_visibility("edit") + self.toolbar.check_button_tooltip("edit", "Редактировать") + + self.toolbar.get_button_by_name("edit").click() + self.toolbar.check_button_visibility("save") + self.toolbar.check_button_visibility("cancel") + self.toolbar.check_button_tooltip("save", "Сохранить") + self.toolbar.check_button_tooltip("cancel", "Отменить") + + self.toolbar.get_button_by_name("cancel").click() + self.toolbar.check_button_visibility("edit") + + def verify_form_data(self, session_settings: dict) -> None: + """Проверяет соответствие содержимого полей формы данным из БД. + + Raises: + AssertionError: Если содержимое поля не соответствует данным из БД. + """ + + for key, value in session_settings.items(): + field_value = "" + if key == "administrator": + field_value = self.settings_form.get_content_item("admin_setting").get_input_value().strip() + elif key == "operator": + field_value = self.settings_form.get_content_item("operator_setting").get_input_value().strip() + elif key == "manager": + field_value = self.settings_form.get_content_item("manager_setting").get_input_value().strip() + elif key == "inform_secur_user": + field_value = self.settings_form.get_content_item("inform_secur_user_setting").get_input_value().strip() + elif key == '$collector': + field_value = self.settings_form.get_content_item("collector_setting").get_input_value().strip() + else: + assert False, f"Got unsupported field name {key}" + assert field_value == str(value), f"{key} field value {field_value} is not equal value {value} from data base" diff --git a/tests/e2e/test_sessions_tab.py b/tests/e2e/sessions/test_current_sessions_tab.py similarity index 93% rename from tests/e2e/test_sessions_tab.py rename to tests/e2e/sessions/test_current_sessions_tab.py index 05e4bd6..5ebcd05 100644 --- a/tests/e2e/test_sessions_tab.py +++ b/tests/e2e/sessions/test_current_sessions_tab.py @@ -1,30 +1,30 @@ -"""Модуль тестов вкладки 'Сеансы'. +"""Модуль тестов вкладки 'Сеансы/Текущие'. Содержит тесты для проверки функциональности работы с пользовательтскими сеансами. """ -from typing import Dict + import pytest -from playwright.sync_api import Page +from playwright.sync_api import Page, expect from pages.login_page import LoginPage from pages.main_page import MainPage -from pages.session_tab import SessionsTab +from pages.current_session_tab import CurrentSessionsTab from pages.users_tab import UsersTab # @pytest.mark.smoke -class TestSessionsTab: - """Набор тестов для вкладки 'Сеансы'. +class TestCurrentSessionsTab: + """Набор тестов для вкладки 'Сеансы/Текущие'. Проверяет корректность отображения и функциональность элементов вкладки сеансов, включая работу с сеансами пользователей, их создание, удаление и автоматическую очистку. Тесты покрывают следующие сценарии: - 1. test_sessions_tab_content: Тест содержимого вкладки 'Сеансы' + 1. test_sessions_tab_content: Тест содержимого вкладки 'Сеансы/Текущие' 2. test_delete_session_confirm_window: Тест окна подтверждения удаления сеанса 3. test_delete_session_after_logout: Тест автоматического удаления сеанса после выхода пользователя из системы 4. test_delete_existed_session: Тест удаления созданного сеанса - 5 test_multiple_users_sessions: Тест создания нескольких пользователей и их сеансов + 5. test_multiple_users_sessions: Тест создания нескольких пользователей и их сеансов 6. test_session_removed_when_user_deleted: Тест удаления сеанса при удалении пользователя 7. test_session_auto_deletion_after_15_minutes: Тест автоматического удаления сеанса через 15 минут после выхода пользователя 8. test_user_cannot_delete_own_session: Тест проверки невозможности пользователя удалить свой собственный сеанс @@ -37,7 +37,7 @@ class TestSessionsTab: Выполняет: 1. Авторизацию в системе - 2. Переход на вкладку 'Сеансы' через панель навигации + 2. Переход на вкладку 'Сеансы/Текущие' через панель навигации """ # Авторизация в системе login_page = LoginPage(browser) @@ -51,6 +51,7 @@ class TestSessionsTab: main_page.click_main_navigation_panel_item("Настройки") main_page.click_subpanel_item("Обслуживание и диагностика") main_page.click_subpanel_item("Сеансы") + main_page.click_subpanel_item("Текущие", parent="Сеансы") @pytest.fixture(scope="function") def cleanup_users(self, browser: Page) -> None: @@ -97,7 +98,7 @@ class TestSessionsTab: 3. Соответствие содержимого таблицы данным из БД """ # Инициализация страницы сеансов - sessions_tab = SessionsTab(browser) + sessions_tab = CurrentSessionsTab(browser) # Проверка элементов интерфейса sessions_tab.should_be_toolbar() @@ -112,11 +113,9 @@ class TestSessionsTab: # Проверяем только заголовки sessions_tab.check_sessions_table_content(verify=False) else: + # Проверка содержимого таблица с верификацией данных из БД sessions_tab.check_sessions_table_content(verify=True) - # Проверка содержимого таблица с верификацией данных из БД - sessions_tab.check_sessions_table_content(verify=True) - def test_delete_session_confirm_window(self, browser: Page) -> None: """Тест окна подтверждения удаления сеанса. @@ -129,7 +128,7 @@ class TestSessionsTab: 5. Функциональность кнопок в окне подтверждения удаления """ # Инициализация страницы сеансов - sessions_tab = SessionsTab(browser) + sessions_tab = CurrentSessionsTab(browser) # Проверка наличия таблицы сеансов sessions_tab.should_be_sessions_table() @@ -178,9 +177,10 @@ class TestSessionsTab: new_mp.click_main_navigation_panel_item("Настройки") new_mp.click_subpanel_item("Обслуживание и диагностика") new_mp.click_subpanel_item("Сеансы") + new_mp.click_subpanel_item("Текущие", parent="Сеансы") # Инициализация страницы сеансов - st = SessionsTab(browser) + st = CurrentSessionsTab(browser) # # Проверка наличия таблицы сеансов st.should_be_sessions_table() @@ -204,6 +204,7 @@ class TestSessionsTab: admin_mp.click_main_navigation_panel_item("Настройки") admin_mp.click_subpanel_item("Обслуживание и диагностика") admin_mp.click_subpanel_item("Сеансы") + admin_mp.click_subpanel_item("Текущие", parent="Сеансы") # Проверка наличия таблица сеансов st.should_be_sessions_table() @@ -255,9 +256,10 @@ class TestSessionsTab: new_mp.click_main_navigation_panel_item("Настройки") new_mp.click_subpanel_item("Обслуживание и диагностика") new_mp.click_subpanel_item("Сеансы") + new_mp.click_subpanel_item("Текущие", parent="Сеансы") # Инициализация страницы сеансов - st = SessionsTab(browser) + st = CurrentSessionsTab(browser) # Проверка наличия таблицы сеансов st.should_be_sessions_table() @@ -276,9 +278,10 @@ class TestSessionsTab: admin_mp.click_main_navigation_panel_item("Настройки") admin_mp.click_subpanel_item("Обслуживание и диагностика") admin_mp.click_subpanel_item("Сеансы") + admin_mp.click_subpanel_item("Текущие", parent="Сеансы") # Удаление сеанса созданного пользователя по токену - admin_sessions_tab = SessionsTab(browser) + admin_sessions_tab = CurrentSessionsTab(browser) admin_sessions_tab.should_be_sessions_table() admin_sessions_tab.delete_session_by_token(new_user_token) @@ -327,7 +330,7 @@ class TestSessionsTab: login_page.do_login(username=user_data["name"], password=user_data["password"]) # Получение токена сеансов - sessions_tab = SessionsTab(browser) + sessions_tab = CurrentSessionsTab(browser) #sessions_tab.should_be_sessions_table() session_token = sessions_tab.get_session_token() session_tokens.append(session_token) @@ -340,8 +343,9 @@ class TestSessionsTab: mp.click_main_navigation_panel_item("Настройки") mp.click_subpanel_item("Обслуживание и диагностика") mp.click_subpanel_item("Сеансы") + mp.click_subpanel_item("Текущие", parent="Сеансы") - sessions_tab = SessionsTab(browser) + sessions_tab = CurrentSessionsTab(browser) sessions_tab.should_be_sessions_table() # Проверка наличия сеансов всех пользователей @@ -363,7 +367,7 @@ class TestSessionsTab: browser.wait_for_timeout(1000) sessions_tab.check_sessions_table_row_highlighting(rows_count - 1) - def _test_sessions_table_scrolling(self, sessions_tab: SessionsTab) -> None: + def _test_sessions_table_scrolling(self, sessions_tab: CurrentSessionsTab) -> None: """Вспомогательный метод для проверки скроллинга таблицы сеансов. Проверяет: @@ -432,9 +436,10 @@ class TestSessionsTab: new_mp.click_main_navigation_panel_item("Настройки") new_mp.click_subpanel_item("Обслуживание и диагностика") new_mp.click_subpanel_item("Сеансы") + new_mp.click_subpanel_item("Текущие", parent="Сеансы") # Получаем токен сеанса - sessions_tab = SessionsTab(browser) + sessions_tab = CurrentSessionsTab(browser) new_user_token = sessions_tab.get_session_token() # Проверка наличия сеанса в таблице @@ -462,9 +467,10 @@ class TestSessionsTab: admin_mp.click_main_navigation_panel_item("Настройки") admin_mp.click_subpanel_item("Обслуживание и диагностика") admin_mp.click_subpanel_item("Сеансы") + admin_mp.click_subpanel_item("Текущие", parent="Сеансы") # Проверка отсутствия сеанса после удаления пользователя - admin_sessions_tab = SessionsTab(browser) + admin_sessions_tab = CurrentSessionsTab(browser) admin_sessions_tab.should_be_sessions_table() # Сеанс должна автоматически удалиться при удалении пользователя @@ -511,9 +517,10 @@ class TestSessionsTab: new_mp.click_main_navigation_panel_item("Настройки") new_mp.click_subpanel_item("Обслуживание и диагностика") new_mp.click_subpanel_item("Сеансы") + new_mp.click_subpanel_item("Текущие", parent="Сеансы") # Получаем токен сеанса - sessions_tab = SessionsTab(browser) + sessions_tab = CurrentSessionsTab(browser) session_token = sessions_tab.get_session_token() # Проверка наличия сеанса в таблице @@ -532,9 +539,10 @@ class TestSessionsTab: admin_mp.click_main_navigation_panel_item("Настройки") admin_mp.click_subpanel_item("Обслуживание и диагностика") admin_mp.click_subpanel_item("Сеансы") + admin_mp.click_subpanel_item("Текущие", parent="Сеансы") # Проверка наличия сеанса сразу после выхода - admin_sessions_tab = SessionsTab(browser) + admin_sessions_tab = CurrentSessionsTab(browser) admin_sessions_tab.should_be_session_in_table(session_token) admin_mp.do_logout() @@ -553,9 +561,10 @@ class TestSessionsTab: admin_mp.click_main_navigation_panel_item("Настройки") admin_mp.click_subpanel_item("Обслуживание и диагностика") admin_mp.click_subpanel_item("Сеансы") + admin_mp.click_subpanel_item("Текущие", parent="Сеансы") # Проверка отсутствия сеанса после 15 минут - admin_sessions_tab = SessionsTab(browser) + admin_sessions_tab = CurrentSessionsTab(browser) admin_sessions_tab.should_be_sessions_table() admin_sessions_tab.should_not_be_session_in_table(session_token) @@ -598,9 +607,10 @@ class TestSessionsTab: new_mp.click_main_navigation_panel_item("Настройки") new_mp.click_subpanel_item("Обслуживание и диагностика") new_mp.click_subpanel_item("Сеансы") + new_mp.click_subpanel_item("Текущие", parent="Сеансы") # Получаем токен сеанса - sessions_tab = SessionsTab(browser) + sessions_tab = CurrentSessionsTab(browser) session_token = sessions_tab.get_session_token() # Проверка наличия сеанса в таблице diff --git a/tests/e2e/sessions/test_session_settings_tab.py b/tests/e2e/sessions/test_session_settings_tab.py new file mode 100644 index 0000000..130d816 --- /dev/null +++ b/tests/e2e/sessions/test_session_settings_tab.py @@ -0,0 +1,71 @@ +"""Модуль тестов вкладки 'Сеансы/Настройки'. + +Содержит тесты для проверки корректности отображения +и функциональности элементов вкладки настройки времени жизни сеансов. +""" + +import pytest +from playwright.sync_api import Page +from pages.login_page import LoginPage +from pages.main_page import MainPage +from pages.session_settings_tab import SessionSettingsTab + + +# @pytest.mark.smoke +class TestSessionSettingsTab: + """Набор тестов для вкладки 'Сеансы/Настройки'. + + Проверяет корректность отображения и функциональность элементов вкладки настройки времени жизни сеансов. + + Тесты покрывают следующие сценарии: + 1. test_session_settings_tab_content: Тест содержимого вкладки 'Сеансы/Настройки' + """ + + + @pytest.fixture(scope="function", autouse=True) + def setup(self, browser: Page) -> None: + """Фикстура для подготовки тестового окружения. + + Выполняет: + 1. Авторизацию в системе + 2. Переход на вкладку 'Сеансы/Настройки' через панель навигации + """ + # Авторизация в системе + login_page = LoginPage(browser) + login_page.do_login() + + # Инициализация главной страницы + main_page = MainPage(browser) + + # Проверка и взаимодействие с элементами навигации + main_page.should_be_navigation_panel() + main_page.click_main_navigation_panel_item("Настройки") + main_page.click_subpanel_item("Обслуживание и диагностика") + main_page.click_subpanel_item("Сеансы") + main_page.click_subpanel_item("Настройки", parent="Сеансы") + + # @pytest.mark.develop + def test_sessions_tab_content(self, browser: Page) -> None: + """Тест содержимого вкладки 'Сеансы/Настройки'. + + Проверяет: + 1. Наличие и корректность элементов интерфейса + 2. Соответствие содержимого полей формы данным из БД + """ + # Инициализация страницы сеансов + session_settings_tab = SessionSettingsTab(browser) + + # Проверка элементов интерфейса + session_settings_tab.check_content() + + # Проверяем API ответ + response = session_settings_tab.send_get_api_request("e-cmdb/api/objectByPath?path=/config/auth") + if response.status == 200: + response_body = session_settings_tab.get_response_body(response) + + if response_body: + # Проверка содержимого таблица с верификацией данных из БД + session_settings = response_body.get("options").get("key_ttl") + session_settings_tab.verify_form_data(session_settings) + else: + print(f"Error request session setings data from API: {response.status_text}") diff --git a/tests/e2e/test_expand_navigation_panel.py b/tests/e2e/test_expand_navigation_panel.py index 8998c93..0689d55 100644 --- a/tests/e2e/test_expand_navigation_panel.py +++ b/tests/e2e/test_expand_navigation_panel.py @@ -52,7 +52,7 @@ class TestNavigationPanel: mp.expand_navigation_subpanel() - @pytest.mark.develop + # @pytest.mark.develop def test_sub_panel_item_click(self, browser: Page): """Проверяет возможность клика заданного элемента в подпанели навигации.