e-nms_qa_automation/pages/ztp_templates_tab.py

313 lines
13 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

"""Модуль вкладки 'Шаблоны' в модуле Zero Touch Provisioning.
Содержит класс ZTPTemplatesTab для работы с таблицей шаблонов.
Позволяет проверять состояние и взаимодействовать с элементами вкладки.
"""
from playwright.sync_api import Page
from tools.logger import get_logger
from locators.table_locators import TableLocators
from locators.modal_window_locators import ModalWindowLocators
from components_derived.modal_view_template import ViewTemplateModalWindow
from components.modal_window_component import ModalWindowComponent
from components.toolbar_component import ToolbarComponent
from components.table_component import TableComponent
from pages.base_page import BasePage
logger = get_logger("ZTP_TEMPLATES_TAB")
class ZTPTemplatesTab(BasePage):
"""Класс для работы с вкладкой 'Шаблоны' в модуле Zero Touch Provisioning.
Предоставляет методы для взаимодействия с таблицей шаблонов, модальными окнами
и проверки состояния элементов интерфейса. Включает функциональность для:
- Работы с таблицей шаблонов (прокрутка, проверка строк, выделение)
- Управления модальными окнами просмотра шаблонов
- Сравнения данных UI с API ответами
Args:
page (Page): Экземпляр страницы Playwright.
"""
def __init__(self, page: Page) -> None:
"""Инициализирует компоненты вкладки 'Шаблоны'."""
super().__init__(page)
self.toolbar = ToolbarComponent(page, "Шаблоны")
self.ztp_templates_table = TableComponent(page)
self.modal_windows = {}
def add_modal_window(self, title: str) -> None:
"""Добавляет модальное окно в коллекцию.
Args:
title: Заголовок окна.
"""
self.modal_windows[title] = ViewTemplateModalWindow(self.page, title)
def get_modal_window(self, title: str) -> ViewTemplateModalWindow:
"""Возвращает модальное окно по заголовку.
Args:
title: Заголовок окна.
Returns:
ViewTemplateModalWindow: Экземпляр модального окна шаблона.
Raises:
AssertionError: Если окно не найдено.
"""
modal_window = self.modal_windows.get(title)
if modal_window is None:
assert False, f"Modal window with title '{title}' not found"
return modal_window
def delete_modal_window(self, title: str) -> None:
"""Удаляет модальное окно из коллекции.
Args:
title: Заголовок окна.
Raises:
AssertionError: Если окно не найдено.
"""
if self.modal_windows.get(title) is None:
assert False, f"Modal window with title '{title}' not found"
self.modal_windows[title] = None
def open_template_modal_by_index(self, row_index: int = 0) -> str:
"""Открывает модальное окно шаблона по клику на строку таблицы.
Args:
row_index: Индекс строки для клика (по умолчанию 0 - первая строка).
Returns:
str: Имя шаблона.
"""
row_locator = self.ztp_templates_table.get_row_locator(
TableLocators.TABLE_WORK_AREA, row_index
)
row_locator.click()
# Создаем временный экземпляр модального окна для получения заголовка
temp_modal = ViewTemplateModalWindow(self.page, "")
title = temp_modal.toolbar.get_toolbar_title_text(
ModalWindowLocators.MODAL_WINDOW_TITLE
)
# Добавляем модальное окно в коллекцию после открытия
self.add_modal_window(title)
return title
def close_modal_window_by_toolbar_button(self, title: str) -> None:
"""Закрывает модальное окно через кнопку в тулбаре.
Args:
title: Заголовок окна.
"""
modal_window = self.get_modal_window(title)
modal_window.close_window_by_toolbar_button()
self.delete_modal_window(title)
def close_modal_window(self, title: str) -> None:
"""Закрывает модальное окно через кнопку 'Закрыть'.
Args:
title: Заголовок окна.
"""
modal_window = self.get_modal_window(title)
modal_window.close_window()
self.delete_modal_window(title)
def get_rows_count(self) -> int:
"""Возвращает количество строк в таблице (без заголовка).
Returns:
int: Количество строк с данными.
Raises:
AssertionError: Если таблица пуста.
"""
return self.ztp_templates_table.get_rows_count(TableLocators.TABLE_WORK_AREA)
def scroll_templates_table_up(self) -> None:
"""Прокручивает таблицу шаблонов вверх."""
self.ztp_templates_table.scroll_up(TableLocators.TABLE_SCROLL_CONTAINER)
def scroll_templates_table_down(self) -> None:
"""Прокручивает таблицу шаблонов вниз."""
self.ztp_templates_table.scroll_down(TableLocators.TABLE_SCROLL_CONTAINER)
def scroll_modal_up(self) -> None:
"""Прокручивает содержимое модального окна вверх."""
temp_modal = ModalWindowComponent(self.page)
temp_modal.scroll_window_up()
def scroll_modal_down(self) -> None:
"""Прокручивает содержимое модального окна вниз."""
temp_modal = ModalWindowComponent(self.page)
temp_modal.scroll_window_down()
def check_templates_modal_content(self, title: str) -> None:
"""Проверяет наличие и корректность элементов модального окна шаблона.
Args:
title: Имя шаблона для проверки заголовка окна.
Raises:
AssertionError: Если элементы окна некорректны.
"""
modal_window = self.get_modal_window(title)
modal_window.check_content()
def check_templates_table_content(self) -> None:
"""Проверяет содержимое таблицы шаблонов.
Проверяет заголовки и наличие данных в таблице.
Raises:
AssertionError: Если таблица пуста или заголовки неверны.
"""
expected_headers = [
'Производитель',
'vendorCode',
'authentication',
'deviceType',
'authenticationOption'
]
self.ztp_templates_table.check_content(TableLocators.TABLE_WORK_AREA, expected_headers)
def check_templates_table_vertical_scrolling(self) -> bool:
"""Проверяет возможность вертикальной прокрутки таблицы.
Returns:
bool: True если прокрутка возможна, иначе False.
"""
return self.ztp_templates_table.is_scrollable_vertically(
TableLocators.TABLE_SCROLL_CONTAINER
)
def check_templates_table_first_row_visibility(self) -> None:
"""Проверяет видимость первой строки таблицы.
Raises:
AssertionError: Если строка не видна.
"""
self.ztp_templates_table.check_first_row_visibility(TableLocators.TABLE_WORK_AREA)
def check_templates_table_last_row_visibility(self) -> None:
"""Проверяет видимость последней строки таблицы.
Raises:
AssertionError: Если строка не видна.
"""
self.ztp_templates_table.check_last_row_visibility(TableLocators.TABLE_WORK_AREA)
def check_templates_table_row_highlighting(self, row_index: int) -> None:
"""Проверяет выделение указанной строки таблицы.
Args:
row_index: Индекс проверяемой строки.
Raises:
AssertionError: Если строка не выделена.
"""
self.ztp_templates_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_templates_table(self) -> None:
"""Проверяет наличие таблицы шаблонов.
Raises:
AssertionError: Если таблица отсутствует.
"""
self.ztp_templates_table.check_visibility(
TableLocators.TABLE_WORK_AREA, "Templates table is missing"
)
def should_be_modal_window(self) -> None:
"""Проверяет наличие модального окна.
Raises:
AssertionError: Если модальное окно отсутствует.
"""
self.ztp_templates_table.check_visibility(
ModalWindowLocators.MODAL_WINDOW, "Modal window is not visible"
)
def should_not_be_modal_window(self) -> None:
"""Проверяет, что модальное окно отсутствует.
Raises:
AssertionError: Если модальное окно все еще видно.
"""
is_visible = self.page.locator(
ModalWindowLocators.MODAL_WINDOW
).is_visible(timeout=1000)
if is_visible:
assert False, "Modal window should not be visible"
def check_modal_vertical_scrolling(self) -> bool:
"""Проверяет возможность вертикального скроллинга в модальном окне.
Returns:
bool: True если скроллинг возможен, иначе False.
"""
temp_modal = ModalWindowComponent(self.page)
return temp_modal.check_window_vertical_scrolling()
def verify_template_data_with_api(self, title: str) -> None:
"""Проверяет соответствие данных модального окна данным из API.
Процесс проверки:
1. Получает модальное окно по имени шаблона
2. Извлекает данные из полей ввода модального окна
3. Отправляет API запрос для получения эталонных данных шаблона
4. Сравнивает данные из UI с данными из API
5. Выбрасывает assertion при обнаружении расхождений
Args:
title: Имя шаблона для проверки (должно совпадать с id в API).
Raises:
AssertionError: Если:
- Модальное окно не найдено
- API запрос завершился с ошибкой (status != 200)
- Обнаружены расхождения между данными UI и API
- Имя шаблона в модальном окне не соответствует ожидаемому
"""
# Получаем модальное окно
modal_window = self.get_modal_window(title)
# Читаем данные модального окна
actual_data = modal_window.get_modal_window_data()
# Читаем данные из API
encoded_title = title.replace(" ", "%20")
url = f"e-nms/DHCP/showOptPattern?template={encoded_title}"
response = self.send_get_api_request(url)
# Проверяем статус ответа
if response.status != 200:
logger.error("API request failed with status: %s", response.status)
assert False, f"API request failed with status: {response.status}"
# Извлекаем данные из ответа
response_data = response.json()
template_data = response_data['data']
# Сравниваем actual_data с данными конкретного шаблона
modal_window.compare_modal_with_api_data(actual_data, template_data, title)