Skip to content

JsonContainerComponent

Модуль для работы с JSON-контейнерами на веб-страницах.

Содержит компонент для чтения и проверки JSON-данных в контейнерах. Использует playwright для взаимодействия с элементами страницы.

JsonContainerComponent

Bases: BaseComponent

Компонент для работы с JSON-данными на странице.

Предоставляет методы чтения и проверки JSON-данных в контейнерах.

Source code in components\json_container_component.py
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
class JsonContainerComponent(BaseComponent):
    """Компонент для работы с JSON-данными на странице.

    Предоставляет методы чтения и проверки JSON-данных в контейнерах.

    """

    def __init__(self, page: Page):
        """Инициализирует JSON-контейнер.

        Args:
            page: Экземпляр страницы Playwright.
        """

        super().__init__(page)

    # Действия:
    def read_data(self, locator: Any) -> Dict:
        """Читает и форматирует 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: Any, expected: Any, msg: str) -> None:
        """Сравнивает 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}"

__init__(page)

Инициализирует JSON-контейнер.

Parameters:

Name Type Description Default
page Page

Экземпляр страницы Playwright.

required
Source code in components\json_container_component.py
24
25
26
27
28
29
30
31
def __init__(self, page: Page):
    """Инициализирует JSON-контейнер.

    Args:
        page: Экземпляр страницы Playwright.
    """

    super().__init__(page)

check_json_equals(actual, expected, msg)

Сравнивает JSON-объекты на идентичность.

Parameters:

Name Type Description Default
actual Any

Фактический JSON-объект.

required
expected Any

Ожидаемый JSON-объект.

required
msg str

Сообщение об ошибке.

required

Raises:

Type Description
AssertionError

Если объекты не идентичны.

Source code in components\json_container_component.py
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
def check_json_equals(self, actual: Any, expected: Any, msg: str) -> None:
    """Сравнивает 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}"

read_data(locator)

Читает и форматирует JSON-данные из указанного локатора.

Parameters:

Name Type Description Default
locator Any

Локатор элемента с JSON-данными.

required

Returns:

Name Type Description
dict Dict

Распарсенный JSON-объект.

Raises:

Type Description
JSONDecodeError

Если данные не могут быть преобразованы в JSON.

Source code in components\json_container_component.py
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
def read_data(self, locator: Any) -> Dict:
    """Читает и форматирует 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)