Добавлен тест вкладки 'Конфигурация' в модуле Zero Touch Provisioning

pull/1/head
Radislav 2025-10-01 15:27:38 +03:00
parent 4067c2f6b0
commit d9ebae3b19
2 changed files with 456 additions and 0 deletions

274
pages/ztp_config_tab.py Normal file
View File

@ -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"
)

View File

@ -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()