Добавлен тест вкладки 'Конфигурация' в модуле Zero Touch Provisioning
parent
4067c2f6b0
commit
d9ebae3b19
|
|
@ -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"
|
||||||
|
)
|
||||||
|
|
@ -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()
|
||||||
Loading…
Reference in New Issue