refactor: единообразное именование переменных для модальных окон

pull/1/head
Radislav 2025-09-30 10:40:40 +03:00
parent ff707434f1
commit 6cd20c0947
5 changed files with 71 additions and 109 deletions

View File

@ -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)

View File

@ -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(

View File

@ -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)

View File

@ -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()

View File

@ -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()