e-nms_qa_automation/components/json_container_component.py

100 lines
3.9 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.

from playwright.sync_api import Page
import json
import jsondiff
from components.base_component import BaseComponent
from tools.logger import get_logger
logger = get_logger("JSON_CONTAINER")
class JsonContainerComponent(BaseComponent):
"""Компонент для работы с JSON-данными на странице.
Предоставляет методы для чтения и проверки JSON-данных,
отображаемых в специальных контейнерах на странице.
Атрибуты:
page: экземпляр страницы Playwright
"""
def __init__(self, page: Page):
"""Инициализация JSON-контейнера.
Args:
page: экземпляр страницы Playwright
"""
super().__init__(page)
# Действия:
def read_data(self, locator):
"""Чтение и форматирование JSON-данных из указанного локатора.
Args:
locator: локатор элемента, содержащего JSON-данные
Returns:
dict: распарсенный JSON-объект
Raises:
json.JSONDecodeError: если данные не могут быть преобразованы в JSON
"""
def format_json_string(json_string):
"""Вспомогательная функция для форматирования строки JSON.
Args:
json_string: сырая строка с JSON-данными
Returns:
str: отформатированная строка JSON
"""
substrings = json_string.splitlines()
formatted_string_list = []
last_substring = substrings.pop()
for substring in substrings:
if substring.find(':') == -1:
if substring == '{':
formatted_string_list.append(substring)
elif substring == '}':
s1 = formatted_string_list.pop()
formatted_string_list.append(s1.rstrip(','))
formatted_string_list.append(substring + ',')
else:
formatted_string_list.append(substring + ',')
continue
key, value = substring.split(':')
s = ':'.join(['"' + key + '" ', " " + value])
if value == '{':
formatted_string_list.append(s)
else:
formatted_string_list.append(s + ',')
s2 = formatted_string_list.pop()
formatted_string_list.append(s2.rstrip(','))
formatted_string_list.append(last_substring)
return " ".join(formatted_string_list)
# Чтение JSON-содержимого из рабочей области
loc = self.get_locator(locator)
json_string = loc.inner_text()
formatted_json_string = format_json_string(json_string)
return json.loads(formatted_json_string)
# Проверки:
def check_json_equals(self, actual, expected, msg):
"""Сравнение JSON-объектов на идентичность.
Args:
actual: фактический JSON-объект
expected: ожидаемый JSON-объект
msg: сообщение об ошибке
Raises:
AssertionError: если объекты не идентичны
"""
diff = jsondiff.diff(expected, actual, syntax='symmetric')
assert len(diff) == 0, f"{msg}. DIFF is {diff}"