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}"