diff --git a/components_derived/modal_view_template.py b/components_derived/modal_view_template.py index ed582fc..258e85f 100644 --- a/components_derived/modal_view_template.py +++ b/components_derived/modal_view_template.py @@ -24,12 +24,12 @@ class ViewTemplateModalWindow(ModalWindowComponent): 4. Проверки содержимого модального окна """ - def __init__(self, page: Page, template_name: str): + def __init__(self, page: Page, title: str): """Инициализирует элементы формы модального окна шаблона.""" super().__init__(page) - # Настройка заголовка и кнопки закрытия - self.window_title = template_name + # Настройка заголовка и кнопок закрытия + self.window_title = title locator_button_toolbar_close = self.page.get_by_role("navigation").filter( has_text=re.compile(self.window_title) ).get_by_role("button") @@ -122,7 +122,7 @@ class ViewTemplateModalWindow(ModalWindowComponent): return modal_data def compare_modal_with_api_data(self, modal_data: dict, api_data: dict, - template_name: str) -> None: + title: str) -> None: """Сравнивает данные из модального окна с данными из API.""" errors = [] @@ -149,10 +149,10 @@ class ViewTemplateModalWindow(ModalWindowComponent): # Дополнительная проверка имени шаблона modal_template = modal_data.get('Шаблон', '') - if modal_template != template_name: + if modal_template != title: error_msg = ( f"Расхождение в имени шаблона: " - f"модальное окно='{modal_template}', ожидается='{template_name}'" + f"модальное окно='{modal_template}', ожидается='{title}'" ) logger.error(error_msg) errors.append(error_msg) @@ -161,7 +161,7 @@ class ViewTemplateModalWindow(ModalWindowComponent): if errors: error_details = "\n".join(errors) assert False, ( - f"Обнаружены расхождения для шаблона '{template_name}':\n{error_details}" + f"Обнаружены расхождения для шаблона '{title}':\n{error_details}" ) - logger.info("Данные модального окна соответствуют API для шаблона '%s'", template_name) + logger.info("Данные модального окна соответствуют API для шаблона '%s'", title) diff --git a/pages/templates_tab.py b/pages/templates_tab.py index 05b10c9..97c56d7 100644 --- a/pages/templates_tab.py +++ b/pages/templates_tab.py @@ -4,18 +4,16 @@ Позволяет проверять состояние и взаимодействовать с элементами вкладки. """ -import json -from pathlib import Path 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 locators.json_container_locators import JsonContainerLocators 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 components.json_container_component import JsonContainerComponent -from components.alert_component import AlertComponent from pages.base_page import BasePage logger = get_logger("TEMPLATES_TAB") @@ -42,7 +40,6 @@ class TemplatesTab(BasePage): self.modal_windows = {} self.json_container = JsonContainerComponent(page) - self.alert = AlertComponent(page) def add_modal_window(self, title: str) -> None: """Добавляет модальное окно в коллекцию. @@ -86,7 +83,7 @@ class TemplatesTab(BasePage): assert False, f"Modal window with title '{title}' not found" self.modal_windows[title] = None - def open_template_modal(self, row_index: int = 0) -> str: + def open_template_modal_by_index(self, row_index: int = 0) -> str: """Открывает модальное окно шаблона по клику на строку таблицы. Args: @@ -104,12 +101,12 @@ class TemplatesTab(BasePage): # Получаем имя шаблона из выбранной строки table_content = self.templates_table.read(TableLocators.TABLE_WORK_AREA) # +1 потому что первая строка - заголовки - template_name = table_content[row_index + 1][0] + title = table_content[row_index + 1][0] # Добавляем модальное окно в коллекцию после открытия - self.add_modal_window(template_name) + self.add_modal_window(title) - return template_name + return title def close_modal_window_by_toolbar_button(self, title: str) -> None: """Закрывает модальное окно через кнопку в тулбаре. @@ -119,7 +116,7 @@ class TemplatesTab(BasePage): """ modal_window = self.get_modal_window(title) - modal_window.click_toolbar_close_button() + modal_window.close_window_by_toolbar_button() self.delete_modal_window(title) def get_rows_count(self) -> int: @@ -146,21 +143,21 @@ class TemplatesTab(BasePage): def scroll_modal_up(self) -> None: """Прокручивает содержимое модального окна вверх.""" - self.templates_table.scroll_up( - ModalWindowLocators.MODAL_WINDOW_SCROLL_CONTAINER - ) + + temp_modal = ModalWindowComponent(self.page) + temp_modal.scroll_window_up() def scroll_modal_down(self) -> None: """Прокручивает содержимое модального окна вниз.""" - self.templates_table.scroll_down( - ModalWindowLocators.MODAL_WINDOW_SCROLL_CONTAINER - ) - def extract_specific_template(self, template_name: str, response_data: dict) -> dict: - """Извлекает структуру конкретного шаблона по template_name из данных API. + temp_modal = ModalWindowComponent(self.page) + temp_modal.scroll_window_down() + + def extract_specific_template(self, title: str, response_data: dict) -> dict: + """Извлекает структуру конкретного шаблона по title из данных API. Args: - template_name: Имя шаблона для извлечения. + title: Имя шаблона для извлечения. response_data: Данные ответа от API. Returns: @@ -175,8 +172,8 @@ class TemplatesTab(BasePage): # Ищем шаблон с указанным именем for template in response_data: - if template.get('id') == template_name: - logger.info("Found template: %s", template_name) + if template.get('id') == title: + logger.info("Found template: %s", title) return template # Если шаблон не найден @@ -184,47 +181,22 @@ class TemplatesTab(BasePage): # Генерируем понятное сообщение об ошибке error_msg = ( - f"Template '{template_name}' not found. " + f"Template '{title}' not found. " f"Available templates: {available_templates}" ) logger.error(error_msg) assert False, error_msg - def save_template_data_to_file(self, template_data: dict, filename: str = None) -> str: - """Инструмент отладки. Сохраняет данные шаблона в JSON файл в текущей директории. - - Args: - template_data: Данные шаблона для сохранения. - filename: Имя файла (если None, генерируется автоматически). - - Returns: - str: Путь к сохраненному файлу. - """ - # Генерируем имя файла если не указано - if filename is None: - template_name = template_data.get('id', 'unknown_template') - filename = f"{template_name}_data.json" - - # Сохраняем файл в текущей директории - file_path = Path(filename) - - # Сохраняем данные в файл с форматированием - with open(file_path, 'w', encoding='utf-8') as file: - json.dump(template_data, file, ensure_ascii=False, indent=2) - - logger.info("Template data saved to: %s", file_path) - return str(file_path) - - def check_templates_modal_content(self, template_name: str) -> None: + def check_templates_modal_content(self, title: str) -> None: """Проверяет наличие и корректность элементов модального окна шаблона. Args: - template_name: Имя шаблона для проверки заголовка окна. + title: Имя шаблона для проверки заголовка окна. Raises: AssertionError: Если элементы окна некорректны. """ - modal_window = self.get_modal_window(template_name) + modal_window = self.get_modal_window(title) modal_window.check_content() def check_templates_table_content(self) -> None: @@ -245,7 +217,7 @@ class TemplatesTab(BasePage): self.templates_table.check_content(TableLocators.TABLE_WORK_AREA, expected_headers) - def check_templates_table_verticall_scrolling(self) -> bool: + def check_templates_table_vertical_scrolling(self) -> bool: """Проверяет возможность вертикальной прокрутки таблицы. Returns: @@ -339,16 +311,14 @@ class TemplatesTab(BasePage): Returns: bool: True если скроллинг возможен, иначе False. """ - return self.templates_table.is_scrollable_vertically( - ModalWindowLocators.MODAL_WINDOW_SCROLL_CONTAINER - ) + temp_modal = ModalWindowComponent(self.page) + return temp_modal.check_window_vertical_scrolling() - def verify_json_container_content(self, template_name: str, save_to_file: bool = False) -> None: + def verify_json_container_content(self, title: str) -> None: """Проверяет соответствие данных контейнера данным из API. Args: - template_name: Имя шаблона для проверки. - save_to_file: Флаг для сохранения данных в файл. + title: Имя шаблона для проверки. """ # Читаем данные из контейнера @@ -359,12 +329,7 @@ class TemplatesTab(BasePage): response_body = self.get_response_body(response) # Извлекаем конкретный шаблон по имени из ответа API - template_data = self.extract_specific_template(template_name, response_body) - - # Сохраняем данные в файл если требуется - if save_to_file: - file_path = self.save_template_data_to_file(template_data) - logger.info("Template data saved to: %s", file_path) + template_data = self.extract_specific_template(title, response_body) # Сравниваем actual_data с данными конкретного шаблона self.json_container.check_json_equals( diff --git a/pages/ztp_templates_tab.py b/pages/ztp_templates_tab.py index acf5595..7b66a2e 100644 --- a/pages/ztp_templates_tab.py +++ b/pages/ztp_templates_tab.py @@ -93,13 +93,13 @@ class ZTPTemplatesTab(BasePage): # Создаем временный экземпляр модального окна для получения заголовка temp_modal = ViewTemplateModalWindow(self.page, "") - template_name = temp_modal.toolbar.get_toolbar_title_text( + title = temp_modal.toolbar.get_toolbar_title_text( ModalWindowLocators.MODAL_WINDOW_TITLE ) # Добавляем модальное окно в коллекцию после открытия - self.add_modal_window(template_name) - return template_name + self.add_modal_window(title) + return title def close_modal_window_by_toolbar_button(self, title: str) -> None: """Закрывает модальное окно через кнопку в тулбаре. @@ -150,16 +150,16 @@ class ZTPTemplatesTab(BasePage): temp_modal = ModalWindowComponent(self.page) temp_modal.scroll_window_down() - def check_templates_modal_content(self, template_name: str) -> None: + def check_templates_modal_content(self, title: str) -> None: """Проверяет наличие и корректность элементов модального окна шаблона. Args: - template_name: Имя шаблона для проверки заголовка окна. + title: Имя шаблона для проверки заголовка окна. Raises: AssertionError: Если элементы окна некорректны. """ - modal_window = self.get_modal_window(template_name) + modal_window = self.get_modal_window(title) modal_window.check_content() def check_templates_table_content(self) -> None: @@ -268,7 +268,7 @@ class ZTPTemplatesTab(BasePage): temp_modal = ModalWindowComponent(self.page) return temp_modal.check_window_vertical_scrolling() - def verify_template_data_with_api(self, template_name: str) -> None: + def verify_template_data_with_api(self, title: str) -> None: """Проверяет соответствие данных модального окна данным из API. Процесс проверки: @@ -279,7 +279,7 @@ class ZTPTemplatesTab(BasePage): 5. Выбрасывает assertion при обнаружении расхождений Args: - template_name: Имя шаблона для проверки (должно совпадать с id в API). + title: Имя шаблона для проверки (должно совпадать с id в API). Raises: AssertionError: Если: @@ -289,14 +289,14 @@ class ZTPTemplatesTab(BasePage): - Имя шаблона в модальном окне не соответствует ожидаемому """ # Получаем модальное окно - modal_window = self.get_modal_window(template_name) + modal_window = self.get_modal_window(title) - # Читаем данные модального окна (метод теперь в ViewTemplateModalWindow) + # Читаем данные модального окна actual_data = modal_window.get_modal_window_data() # Читаем данные из API - encoded_template_name = template_name.replace(" ", "%20") - url = f"e-nms/DHCP/showOptPattern?template={encoded_template_name}" + encoded_title = title.replace(" ", "%20") + url = f"e-nms/DHCP/showOptPattern?template={encoded_title}" response = self.send_get_api_request(url) # Проверяем статус ответа @@ -308,5 +308,5 @@ class ZTPTemplatesTab(BasePage): response_data = response.json() template_data = response_data['data'] - # Сравниваем actual_data с данными конкретного шаблона (метод теперь в ViewTemplateModalWindow) - modal_window.compare_modal_with_api_data(actual_data, template_data, template_name) + # Сравниваем actual_data с данными конкретного шаблона + modal_window.compare_modal_with_api_data(actual_data, template_data, title) diff --git a/tests/e2e/test_templates_tab.py b/tests/e2e/test_templates_tab.py index 6ab7bf6..4eee554 100644 --- a/tests/e2e/test_templates_tab.py +++ b/tests/e2e/test_templates_tab.py @@ -46,7 +46,7 @@ class TestTemplatesTab: main_page.click_subpanel_item("Шаблоны") def test_templates_tab_content(self, browser: Page) -> None: - """Тест содержимого вкладки 'Шаблоны'. + """Тест содержимого вкладка 'Шаблоны'. Проверяет: 1. Наличие и корректность тулбара @@ -106,7 +106,7 @@ class TestTemplatesTab: browser.wait_for_timeout(2000) # Проверка возможности вертикального скроллинга - is_scrollable = templates_tab.check_templates_table_verticall_scrolling() + is_scrollable = templates_tab.check_templates_table_vertical_scrolling() if is_scrollable: print("Таблица поддерживает вертикальный скроллинг") @@ -152,7 +152,7 @@ class TestTemplatesTab: browser.wait_for_timeout(2000) # Открываем модальное окно, кликая на первую строку таблицы - template_name = templates_tab.open_template_modal(0) + title = templates_tab.open_template_modal_by_index(0) # Добавляем задержку для открытия модального окна browser.wait_for_timeout(1000) @@ -161,10 +161,10 @@ class TestTemplatesTab: templates_tab.should_be_modal_window() # Проверка содержимого модального окна - templates_tab.check_templates_modal_content(template_name) + templates_tab.check_templates_modal_content(title) # Закрытие модального окна через кнопку закрытия - templates_tab.close_modal_window_by_toolbar_button(template_name) + templates_tab.close_modal_window_by_toolbar_button(title) # Проверяем, что модальное окно закрылось templates_tab.should_not_be_modal_window() @@ -188,7 +188,7 @@ class TestTemplatesTab: browser.wait_for_timeout(2000) # Открываем модальное окно, кликая на первую строку таблицы - template_name = templates_tab.open_template_modal(0) + title = templates_tab.open_template_modal_by_index(0) # Добавляем задержку для открытия модального окна browser.wait_for_timeout(1000) @@ -213,7 +213,7 @@ class TestTemplatesTab: print("Модальное окно не поддерживает вертикальный скроллинг") # Закрытие модального окна через кнопку закрытия - templates_tab.close_modal_window_by_toolbar_button(template_name) + templates_tab.close_modal_window_by_toolbar_button(title) # Проверяем, что модальное окно закрылось templates_tab.should_not_be_modal_window() @@ -237,7 +237,7 @@ class TestTemplatesTab: browser.wait_for_timeout(5000) # Открываем модальное окно, кликая на первую строку таблицы - template_name = templates_tab.open_template_modal(0) + title = templates_tab.open_template_modal_by_index(0) # Добавляем задержку для открытия модального окна browser.wait_for_timeout(2000) @@ -246,13 +246,10 @@ class TestTemplatesTab: templates_tab.should_be_modal_window() # Проверка соответствия данных модального окна данным из API - templates_tab.verify_json_container_content( - template_name, - save_to_file=False - ) + templates_tab.verify_json_container_content(title) # Закрытие модального окна через кнопку закрытия - templates_tab.close_modal_window_by_toolbar_button(template_name) + templates_tab.close_modal_window_by_toolbar_button(title) # Проверяем, что модальное окно закрылось templates_tab.should_not_be_modal_window() diff --git a/tests/e2e/test_ztp_templates_tab.py b/tests/e2e/test_ztp_templates_tab.py index 50d87bc..a3431fa 100644 --- a/tests/e2e/test_ztp_templates_tab.py +++ b/tests/e2e/test_ztp_templates_tab.py @@ -167,14 +167,14 @@ class TestZTPTemplatesTab: # Тест 1: Закрытие через кнопку 'Закрыть' в содержимом окна print("Тест 1: Закрытие через кнопку 'Закрыть'") - template_name = ztp_templates_tab.open_template_modal_by_index(0) + title = ztp_templates_tab.open_template_modal_by_index(0) browser.wait_for_timeout(1000) # Проверка открытия модального окна ztp_templates_tab.should_be_modal_window() # Закрытие через кнопку 'Закрыть' - ztp_templates_tab.close_modal_window(template_name) + ztp_templates_tab.close_modal_window(title) # Проверяем, что модальное окно закрылось ztp_templates_tab.should_not_be_modal_window() @@ -182,14 +182,14 @@ class TestZTPTemplatesTab: # Тест 2: Закрытие через кнопку в тулбаре print("Тест 2: Закрытие через кнопку в тулбаре") - template_name = ztp_templates_tab.open_template_modal_by_index(0) + title = ztp_templates_tab.open_template_modal_by_index(0) browser.wait_for_timeout(1000) # Проверка открытия модального окна ztp_templates_tab.should_be_modal_window() # Закрытие через кнопку в тулбаре - ztp_templates_tab.close_modal_window_by_toolbar_button(template_name) + ztp_templates_tab.close_modal_window_by_toolbar_button(title) # Проверяем, что модальное окно закрылось ztp_templates_tab.should_not_be_modal_window() @@ -217,7 +217,7 @@ class TestZTPTemplatesTab: browser.wait_for_timeout(2000) # Открываем модальное окно, кликая на первую строку таблицы - template_name = ztp_templates_tab.open_template_modal_by_index(0) + title = ztp_templates_tab.open_template_modal_by_index(0) # Добавляем задержку для открытия модального окна browser.wait_for_timeout(1000) @@ -226,10 +226,10 @@ class TestZTPTemplatesTab: ztp_templates_tab.should_be_modal_window() # Проверка содержимого модального окна - ztp_templates_tab.check_templates_modal_content(template_name) + ztp_templates_tab.check_templates_modal_content(title) # Закрытие модального окна через кнопку 'Закрыть' - ztp_templates_tab.close_modal_window(template_name) + ztp_templates_tab.close_modal_window(title) # Проверяем, что модальное окно закрылось ztp_templates_tab.should_not_be_modal_window() @@ -254,7 +254,7 @@ class TestZTPTemplatesTab: browser.wait_for_timeout(2000) # Открываем модальное окно, кликая на первую строку таблицы - template_name = ztp_templates_tab.open_template_modal_by_index(0) + title = ztp_templates_tab.open_template_modal_by_index(0) # Добавляем задержку для открытия модального окна browser.wait_for_timeout(1000) @@ -279,7 +279,7 @@ class TestZTPTemplatesTab: print("Модальное окно не поддерживает вертикальный скроллинг") # Закрытие модального окна через кнопку 'Закрыть' - ztp_templates_tab.close_modal_window(template_name) + ztp_templates_tab.close_modal_window(title) # Проверяем, что модальное окно закрылось ztp_templates_tab.should_not_be_modal_window() @@ -308,7 +308,7 @@ class TestZTPTemplatesTab: browser.wait_for_timeout(5000) # Открываем модальное окно, кликая на первую строку таблицы и возвращаем имя заголовка - template_name = ztp_templates_tab.open_template_modal_by_index(0) + title = ztp_templates_tab.open_template_modal_by_index(0) # Добавляем задержку для открытия модального окна browser.wait_for_timeout(2000) @@ -317,10 +317,10 @@ class TestZTPTemplatesTab: ztp_templates_tab.should_be_modal_window() # Проверка соответствия данных модального окна данным из API - ztp_templates_tab.verify_template_data_with_api(template_name) + ztp_templates_tab.verify_template_data_with_api(title) # Закрытие модального окна через кнопку закрытия - ztp_templates_tab.close_modal_window_by_toolbar_button(template_name) + ztp_templates_tab.close_modal_window_by_toolbar_button(title) # Проверяем, что модальное окно закрылось ztp_templates_tab.should_not_be_modal_window()