100 lines
3.9 KiB
Python
100 lines
3.9 KiB
Python
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}" |