"""Модуль вкладки 'Конфигурация' в модуле 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" )