218 lines
10 KiB
Python
218 lines
10 KiB
Python
"""Модуль вкладки 'Конфигурация' в модуле Zero Touch Provisioning.
|
||
|
||
Содержит класс ZTPConfigTab для работы с таблицей конфигурации ZTP.
|
||
Позволяет проверять состояние и взаимодействовать с элементами вкладки.
|
||
"""
|
||
|
||
from playwright.sync_api import Page
|
||
from tools.logger import get_logger
|
||
from locators.table_locators import TableLocators
|
||
from elements.tooltip_button_element import TooltipButton
|
||
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)
|
||
|
||
# Действия:
|
||
def click_sync_button(self, index: int) -> None:
|
||
"""Нажимает кнопку 'Reload' в указанной ячейке заголовка таблицы.
|
||
|
||
Перед кликом проверяет наличие кнопки.
|
||
|
||
Args:
|
||
index: Индекс ячейки в заголовке таблицы.
|
||
|
||
Raises:
|
||
AssertionError: Если индекс выходит за пределы или кнопка не найдена.
|
||
"""
|
||
|
||
# Проверяем наличие кнопки перед кликом
|
||
sync_button = self.ztp_config_table.get_header_cell_button(TableLocators.TABLE_WORK_AREA, index)
|
||
assert sync_button.is_enabled(), f"Sync button is missing in {index} header cell"
|
||
|
||
# Выполняем клик по кнопке
|
||
sync_button.click()
|
||
logger.info("Нажата кнопка синхронизации (Reload)")
|
||
|
||
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 check_sync_button_visibility(self, index: int) -> None:
|
||
"""Проверяет видимость кнопки синхронизации (Reload) в указанной ячейке заголовка.
|
||
|
||
Args:
|
||
index: Индекс ячейки в заголовке таблицы.
|
||
|
||
Raises:
|
||
AssertionError: Если кнопка не видна на странице.
|
||
"""
|
||
sync_button = self.ztp_config_table.get_header_cell_button(TableLocators.TABLE_WORK_AREA, index)
|
||
assert sync_button.is_enabled(), f"Sync button is missing in {index} header cell"
|
||
|
||
# Прокручиваем к элементу для гарантии видимости
|
||
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: Если подсказка не соответствует ожидаемой или отсутствует.
|
||
"""
|
||
# Убеждаемся, что кнопка существует
|
||
sync_button = self.ztp_config_table.get_header_cell_button(TableLocators.TABLE_WORK_AREA, index)
|
||
assert sync_button.is_enabled(), f"Sync button is missing in {index} header cell"
|
||
|
||
sync_tooltip_button = TooltipButton(self.page, sync_button, "sync_button")
|
||
|
||
# Проверка подсказки
|
||
sync_tooltip_button.check_tooltip_with_text(expected_tooltip)
|
||
|
||
logger.info(
|
||
"Подсказка кнопки синхронизации (Reload) в ячейке %d: '%s'",
|
||
index,
|
||
expected_tooltip
|
||
)
|
||
|
||
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"
|
||
)
|