From d9ebae3b191eefef5059fa49d2e77fa952046826 Mon Sep 17 00:00:00 2001 From: Radislav Date: Wed, 1 Oct 2025 15:27:38 +0300 Subject: [PATCH] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=20=D1=82=D0=B5=D1=81=D1=82=20=D0=B2=D0=BA=D0=BB=D0=B0?= =?UTF-8?q?=D0=B4=D0=BA=D0=B8=20'=D0=9A=D0=BE=D0=BD=D1=84=D0=B8=D0=B3?= =?UTF-8?q?=D1=83=D1=80=D0=B0=D1=86=D0=B8=D1=8F'=20=D0=B2=20=D0=BC=D0=BE?= =?UTF-8?q?=D0=B4=D1=83=D0=BB=D0=B5=20Zero=20Touch=20Provisioning?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pages/ztp_config_tab.py | 274 +++++++++++++++++++++++++++++++ tests/e2e/test_ztp_config_tab.py | 182 ++++++++++++++++++++ 2 files changed, 456 insertions(+) create mode 100644 pages/ztp_config_tab.py create mode 100644 tests/e2e/test_ztp_config_tab.py diff --git a/pages/ztp_config_tab.py b/pages/ztp_config_tab.py new file mode 100644 index 0000000..f9d1aec --- /dev/null +++ b/pages/ztp_config_tab.py @@ -0,0 +1,274 @@ +"""Модуль вкладки 'Конфигурация' в модуле Zero Touch Provisioning. + +Содержит класс ZTPConfigTab для работы с таблицей конфигурации ZTP. +Позволяет проверять состояние и взаимодействовать с элементами вкладки. +""" + +from playwright.sync_api import Page +from tools.logger import get_logger +from locators.table_locators import TableLocators +from components.toolbar_component import ToolbarComponent +from components.table_component import TableComponent +from pages.base_page import BasePage + +logger = get_logger("ZTP_CONFIG_TAB") + + +class ZTPConfigTab(BasePage): + """Класс для работы с вкладкой 'Конфигурация' в модуле Zero Touch Provisioning. + + Предоставляет методы для взаимодействия с таблицей конфигурации ZTP + и проверки состояния элементов интерфейса. Включает функциональность для: + - Проверки содержимого и структуры таблицы конфигурации + - Прокрутки таблицы и проверки видимости строк + - Выделения строк таблицы + - Работы с кнопкой синхронизации (Reload) в заголовке таблицы + - Проверки видимости и подсказок кнопок синхронизации + + Args: + page (Page): Экземпляр страницы Playwright. + """ + + def __init__(self, page: Page) -> None: + """Инициализирует компоненты вкладки 'Конфигурация'. + + Args: + page: Экземпляр страницы Playwright для взаимодействия с браузером. + """ + super().__init__(page) + + # Компонент тулбара вкладки конфигурации + self.toolbar = ToolbarComponent(page, "Конфигурация") + + # Компонент таблицы конфигурации ZTP + self.ztp_config_table = TableComponent(page) + + # Словарь для хранения кнопок синхронизации по индексам + self.sync_buttons = {} + + def get_rows_count(self) -> int: + """Возвращает количество строк в таблице конфигурации (без заголовка). + + Returns: + int: Количество строк с данными конфигурации ZTP. + + Raises: + AssertionError: Если таблица пуста или не загружена. + """ + return self.ztp_config_table.get_rows_count(TableLocators.TABLE_WORK_AREA) + + def scroll_config_table_up(self) -> None: + """Прокручивает таблицу конфигурации вверх до начала.""" + self.ztp_config_table.scroll_up(TableLocators.TABLE_SCROLL_CONTAINER) + + def scroll_config_table_down(self) -> None: + """Прокручивает таблицу конфигурации вниз до конца.""" + self.ztp_config_table.scroll_down(TableLocators.TABLE_SCROLL_CONTAINER) + + def check_config_table_content(self) -> None: + """Проверяет содержимое таблицы конфигурации ZTP. + + Проверяет соответствие заголовков таблицы ожидаемым значениям + и наличие данных в таблице. + + Raises: + AssertionError: Если таблица пуста или заголовки не соответствуют ожидаемым. + """ + # Ожидаемые заголовки столбцов таблицы конфигурации ZTP + expected_headers = [ + 'sync', + 'IDENTIFIER', + 'MAC', + 'DHCPRELAY', + 'ШАБЛОН', + 'IPSETTODEVICE', + 'СТАТУС', + 'ДЕЙСТВИЯ' + ] + + self.ztp_config_table.check_content( + TableLocators.TABLE_WORK_AREA, + expected_headers, + False + ) + + def should_be_config_table(self) -> None: + """Проверяет наличие и видимость таблицы конфигурации ZTP. + + Raises: + AssertionError: Если таблица конфигурации отсутствует на странице. + """ + self.ztp_config_table.check_visibility( + TableLocators.TABLE_WORK_AREA, "Configuration table is missing" + ) + + def get_sync_button(self, index: int): + """Получает кнопку синхронизации (Reload) по индексу ячейки заголовка таблицы. + + Args: + index: Индекс ячейки в заголовке таблицы (0-based). + + Returns: + Locator: Локатор кнопки синхронизации (Reload) для взаимодействия. + + Raises: + AssertionError: Если индекс выходит за пределы диапазона ячеек + или кнопка не найдена в указанной ячейке. + """ + table_locator = TableLocators.TABLE_WORK_AREA + + # Получаем локатор таблицы через компонент таблицы + table = self.ztp_config_table.get_locator(table_locator) + + # Проверяем количество ячеек в заголовке таблицы + header_cells_count = table.locator("//thead/tr/th").count() + assert index in range(header_cells_count), "Header cell index is out of range" + + # Ищем кнопку в указанной ячейке заголовка + sync_button = table.locator("//thead/tr/th").nth(index).get_by_role("button") + assert sync_button.is_enabled(), f"Sync button is missing in {index} header cell" + + return sync_button + + def add_sync_button_to_toolbar(self, index: int) -> None: + """Добавляет кнопку синхронизации (Reload) в тулбар для управления подсказками. + + Регистрирует кнопку в компоненте тулбара, что позволяет использовать + стандартные методы проверки подсказок. + + Args: + index: Индекс ячейки в заголовке таблицы. + """ + sync_button = self.get_sync_button(index) + button_name = f"sync_button_{index}" + + # Добавляем кнопку в тулбар компонент как кнопку с подсказкой + self.toolbar.add_tooltip_button(sync_button, button_name) + + # Сохраняем связь между индексом и именем кнопки для последующего доступа + self.sync_buttons[index] = button_name + + logger.info("Кнопка синхронизации (Reload) добавлена в тулбар как '%s'", button_name) + + def check_sync_button_visibility(self, index: int) -> None: + """Проверяет видимость кнопки синхронизации (Reload) в указанной ячейке заголовка. + + Args: + index: Индекс ячейки в заголовке таблицы. + + Raises: + AssertionError: Если кнопка не видна на странице. + """ + sync_button = self.get_sync_button(index) + + # Прокручиваем к элементу для гарантии видимости + sync_button.scroll_into_view_if_needed() + + # Проверяем видимость кнопки + assert sync_button.is_visible(), f"Sync button in header cell {index} is not visible" + + logger.info("Кнопка синхронизации (Reload) видима") + + def check_sync_button_tooltip(self, index: int, expected_tooltip: str = "reload") -> None: + """Проверяет текст подсказки кнопки синхронизации (Reload). + + Использует стандартный механизм проверки подсказок из ToolbarComponent. + + Args: + index: Индекс ячейки в заголовке таблицы. + expected_tooltip: Ожидаемый текст подсказки (по умолчанию 'reload'). + + Raises: + AssertionError: Если подсказка не соответствует ожидаемой или отсутствует. + """ + # Убеждаемся, что кнопка зарегистрирована в тулбаре + if index not in self.sync_buttons: + self.add_sync_button_to_toolbar(index) + + button_name = self.sync_buttons[index] + + # Проверка подсказки + self.toolbar.check_button_tooltip(button_name, expected_tooltip) + + logger.info( + "Подсказка кнопки синхронизации (Reload) в ячейке %d: '%s'", + index, + expected_tooltip + ) + + def click_sync_button(self, index: int) -> None: + """Нажимает кнопку 'Reload' в указанной ячейке заголовка таблицы. + + Перед кликом проверяет видимость кнопки. + + Args: + index: Индекс ячейки в заголовке таблицы. + + Raises: + AssertionError: Если индекс выходит за пределы или кнопка не найдена. + """ + sync_button = self.get_sync_button(index) + + # Проверяем видимость перед кликом + self.check_sync_button_visibility(index) + + # Выполняем клик по кнопке + sync_button.click() + logger.info("Нажата кнопка синхронизации (Reload)") + + def check_config_table_vertical_scrolling(self) -> bool: + """Проверяет возможность вертикальной прокрутки таблицы конфигурации. + + Returns: + bool: True если таблица поддерживает вертикальную прокрутку, иначе False. + """ + return self.ztp_config_table.is_scrollable_vertically( + TableLocators.TABLE_SCROLL_CONTAINER + ) + + def check_config_table_first_row_visibility(self) -> None: + """Проверяет видимость первой строки таблицы конфигурации. + + Raises: + AssertionError: Если первая строка таблицы не видна. + """ + self.ztp_config_table.check_first_row_visibility(TableLocators.TABLE_WORK_AREA) + + def check_config_table_last_row_visibility(self) -> None: + """Проверяет видимость последней строки таблицы конфигурации. + + Raises: + AssertionError: Если последняя строка таблицы не видна. + """ + self.ztp_config_table.check_last_row_visibility(TableLocators.TABLE_WORK_AREA) + + def check_config_table_row_highlighting(self, row_index: int) -> None: + """Проверяет выделение указанной строки таблицы конфигурации. + + Args: + row_index: Индекс проверяемой строки (0-based, без учета заголовка). + + Raises: + AssertionError: Если строка не выделена после взаимодействия. + """ + self.ztp_config_table.check_row_highlighting( + TableLocators.TABLE_WORK_AREA, row_index + ) + + def should_be_toolbar(self) -> None: + """Проверяет наличие и видимость тулбара на вкладке конфигурации. + + Raises: + AssertionError: Если тулбар отсутствует на странице. + """ + self.toolbar.check_toolbar_presence("Toolbar is missing") + + def should_be_config_table(self) -> None: + """Проверяет наличие и видимость таблицы конфигурации ZTP. + + Raises: + AssertionError: Если таблица конфигурации отсутствует на странице. + """ + self.ztp_config_table.check_visibility( + TableLocators.TABLE_WORK_AREA, "Configuration table is missing" + ) diff --git a/tests/e2e/test_ztp_config_tab.py b/tests/e2e/test_ztp_config_tab.py new file mode 100644 index 0000000..3b4fe3e --- /dev/null +++ b/tests/e2e/test_ztp_config_tab.py @@ -0,0 +1,182 @@ +"""Модуль тестов вкладки 'Конфигурация' в модуле Zero Touch Provisioning. + +Содержит тесты для проверки функциональности +работы с конфигурациями ZTP. +""" +import pytest + +from playwright.sync_api import Page +from pages.login_page import LoginPage +from pages.main_page import MainPage +from pages.ztp_config_tab import ZTPConfigTab + + +class TestZTPConfigTab: + """Набор тестов для вкладки 'Конфигурация' в модуле Zero Touch Provisioning. + + Проверяет корректность отображения, функциональность элементов интерфейса + на вкладке конфигурации ZTP. + + Тесты покрывают следующие функциональные области: + 1. test_ztp_config_tab_content - Базовая структура и содержимое вкладки + 2. test_ztp_config_sync_buttons - Функциональность кнопок синхронизации + 3. test_ztp_config_table_row_highlighting - Визуальное выделение строк таблицы + 4. test_ztp_config_table_scrolling - Навигация по таблице с большим объемом данных + """ + + @pytest.fixture(scope="function", autouse=True) + def setup(self, browser: Page) -> None: + """Фикстура для подготовки тестового окружения. + + Выполняет: + 1. Авторизацию в системе + 2. Переход на вкладку 'Конфигурация' через панель навигации + + Args: + browser (Page): Экземпляр страницы Playwright для взаимодействия с UI + """ + # Авторизация в системе + 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("Zero Touch Provisioning") + main_page.click_subpanel_item("Конфигурация", parent="Zero Touch Provisioning") + main_page.wait_for_timeout(1000) + + #@pytest.mark.skip(reason=" Временно исключено из тестирования") + def test_ztp_config_tab_content(self, browser: Page) -> None: + """Тест содержимого вкладки 'Конфигурация' ZTP. + + Проверяет: + 1. Наличие и корректность тулбара + 2. Наличие таблицы конфигураций + 3. Соответствие содержимого таблицы + + Args: + browser (Page): Экземпляр страницы Playwright для взаимодействия с UI + """ + # Инициализация страницы конфигурации ZTP + config_tab = ZTPConfigTab(browser) + + # Проверка тулбара вкладки + config_tab.should_be_toolbar() + + # Проверка наличия таблицы конфигурации + config_tab.should_be_config_table() + + # Проверка содержимого таблицы конфигураций + config_tab.check_config_table_content() + + #@pytest.mark.skip(reason="В разработке. Временно исключено из тестирования") + def test_ztp_config_sync_buttons(self, browser: Page) -> None: + """Тест функциональности кнопки синхронизации (Reload) в таблице конфигурации ZTP. + + Проверяет: + 1. Наличие и видимость кнопки синхронизации в заголовке таблицы + 2. Корректность текста подсказки кнопки (должна быть 'reload') + 3. Работоспособность кнопки при клике + 4. Интеграцию кнопки с системой управления подсказками тулбара + + Args: + browser (Page): Экземпляр страницы Playwright для взаимодействия с UI. + """ + # Инициализация страницы конфигурации ZTP + config_tab = ZTPConfigTab(browser) + + # Проверка наличия таблицы конфигурации + config_tab.should_be_config_table() + + # Ожидание загрузки данных таблицы + browser.wait_for_timeout(3000) + + # Тестирование кнопки синхронизации в первой ячейке заголовка (индекс 0) + + # Регистрация кнопки в системе управления тулбаром + config_tab.add_sync_button_to_toolbar(0) + + # Проверка видимости кнопки + config_tab.check_sync_button_visibility(0) + + # Проверка корректности подсказки кнопки + config_tab.check_sync_button_tooltip(0) + + # Проверка работоспособности кнопки при клике + config_tab.click_sync_button(0) + + @pytest.mark.skip(reason=" Временно исключено из тестирования") + def test_ztp_config_table_row_highlighting(self, browser: Page) -> None: + """Проверка выделения строк в таблице конфигураций ZTP. + + Проверяет корректность выделения строк при клике на различные позиции: + 1. Первая строка + 2. Последняя строка + 3. Строка в середине таблицы + + Args: + browser (Page): Экземпляр страницы Playwright для взаимодействия с UI + """ + config_tab = ZTPConfigTab(browser) + + # Проверка тулбара вкладки + config_tab.should_be_toolbar() + + # Проверка наличия таблицы конфигураций + config_tab.should_be_config_table() + + # Получение количества строк в таблице + rows_count = config_tab.get_rows_count() + + # Проверка выделения строк в различных позициях таблицы + config_tab.check_config_table_row_highlighting(0) # Первая строка + config_tab.check_config_table_row_highlighting(rows_count - 1) # Последняя строка + config_tab.check_config_table_row_highlighting(int(rows_count / 2)) # Строка в середине + + @pytest.mark.skip(reason=" Временно исключено из тестирования") + def test_ztp_config_table_scrolling(self, browser: Page) -> None: + """Проверка вертикального скроллинга таблицы конфигураций ZTP. + + Проверяет: + 1. Возможность вертикальной прокрутки таблицы + 2. Видимость строк после прокрутки вниз и вверх + 3. Корректность отображения данных после скроллинга + + Args: + browser (Page): Экземпляр страницы Playwright для взаимодействия с UI + """ + config_tab = ZTPConfigTab(browser) + + # Ожидание загрузки таблицы + browser.wait_for_timeout(2000) + + # Проверка возможности вертикального скроллинга + is_scrollable = config_tab.check_config_table_vertical_scrolling() + + if is_scrollable: + print("Таблица поддерживает вертикальный скроллинг") + + # Прокрутка вниз до конца таблицы + config_tab.scroll_config_table_down() + + browser.wait_for_timeout(1000) + + # Проверка видимости последней строки после прокрутки + config_tab.check_config_table_last_row_visibility() + + # Прокрутка вверх до начала таблицы + config_tab.scroll_config_table_up() + + browser.wait_for_timeout(1000) + + # Проверка видимости первой строки после прокрутки + config_tab.check_config_table_first_row_visibility() + else: + print("Таблица не поддерживает вертикальный скроллинг") + + # Проверка видимости первой строки при отсутствии скроллинга + config_tab.check_config_table_first_row_visibility()