Skip to content

TemplatesTab

Модуль вкладки 'Шаблоны'.

Содержит класс TemplatesTab для работы с таблицей шаблонов. Позволяет проверять состояние и взаимодействовать с элементами вкладки.

TemplatesTab

Bases: BasePage

Класс для работы с вкладкой 'Шаблоны'.

Предоставляет методы для взаимодействия с таблицей шаблонов и проверки её состояния.

Parameters:

Name Type Description Default
page Page

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

required
Source code in pages\templates_tab.py
 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
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
class TemplatesTab(BasePage):
    """Класс для работы с вкладкой 'Шаблоны'.

    Предоставляет методы для взаимодействия с таблицей шаблонов и проверки
    её состояния.

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

    def __init__(self, page: Page) -> None:
        """Инициализирует компоненты вкладки 'Шаблоны'."""

        super().__init__(page)

        self.toolbar = ToolbarComponent(page, "Шаблоны")

        self.templates_table = TableComponent(page)
        self.modal_windows = {}

        self.json_container = JsonContainerComponent(page)
        self.alert = AlertComponent(page)

    def add_modal_window(self, title: str) -> None:
        """Добавляет модальное окно в коллекцию.

        Args:
            title: Заголовок окна.
        """

        self.modal_windows[title] = ViewTemplateModalWindow(self.page, title)

    def get_modal_window(self, title: str) -> ViewTemplateModalWindow:
        """Возвращает модальное окно по заголовку.

        Args:
            title: Заголовок окна.

        Returns:
            ViewTemplateModalWindow: Экземпляр модального окна.

        Raises:
            AssertionError: Если окно не найдено.
        """

        modal_window = self.modal_windows.get(title)

        if modal_window is None:
            assert False, f"Modal window with title '{title}' not found"
        return modal_window

    def delete_modal_window(self, title: str) -> None:
        """Удаляет модальное окно из коллекции.

        Args:
            title: Заголовок окна.

        Raises:
            AssertionError: Если окно не найдено.
        """

        if self.modal_windows.get(title) is None:
            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:
        """Открывает модальное окно шаблона по клику на строку таблицы.

        Args:
            row_index: Индекс строки для клика (по умолчанию 0 - первая строка).

        Returns:
            str: Имя шаблона.
        """
        row_locator = self.templates_table.get_row_locator(
            TableLocators.TABLE_WORK_AREA,
            row_index
        )
        row_locator.click()

        # Получаем имя шаблона из выбранной строки
        table_content = self.templates_table.read(TableLocators.TABLE_WORK_AREA)
        # +1 потому что первая строка - заголовки
        template_name = table_content[row_index + 1][0]

        # Добавляем модальное окно в коллекцию после открытия
        self.add_modal_window(template_name)

        return template_name

    def close_modal_window_by_toolbar_button(self, title: str) -> None:
        """Закрывает модальное окно через кнопку в тулбаре.

        Args:
            title: Заголовок окна.
        """

        modal_window = self.get_modal_window(title)
        modal_window.click_toolbar_close_button()
        self.delete_modal_window(title)

    def get_rows_count(self) -> int:
        """Возвращает количество строк в таблице (без заголовка).

        Returns:
            int: Количество строк с данными.

        Raises:
            AssertionError: Если таблица пуста.
        """

        return self.templates_table.get_rows_count(TableLocators.TABLE_WORK_AREA)

    def scroll_templates_table_up(self) -> None:
        """Прокручивает таблицу шаблонов вверх."""

        self.templates_table.scroll_up(TableLocators.TABLE_SCROLL_CONTAINER)

    def scroll_templates_table_down(self) -> None:
        """Прокручивает таблицу шаблонов вниз."""

        self.templates_table.scroll_down(TableLocators.TABLE_SCROLL_CONTAINER)

    def scroll_modal_up(self) -> None:
        """Прокручивает содержимое модального окна вверх."""
        self.templates_table.scroll_up(
            ModalWindowLocators.MODAL_WINDOW_SCROLL_CONTAINER
        )

    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.

        Args:
            template_name: Имя шаблона для извлечения.
            response_data: Данные ответа от API.

        Returns:
            dict: Структура конкретного шаблона.

        Raises:
            AssertionError: Если шаблон с указанным именем не найден
                или структура ответа некорректна.
        """
        # Проверяем, что ответ является списком шаблонов
        assert isinstance(response_data, list), "API response is not a list of templates"

        # Ищем шаблон с указанным именем
        for template in response_data:
            if template.get('id') == template_name:
                logger.info("Found template: %s", template_name)
                return template

        # Если шаблон не найден
        available_templates = [t.get('id', 'Unknown') for t in response_data]

        # Генерируем понятное сообщение об ошибке
        error_msg = (
            f"Template '{template_name}' 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:
        """Проверяет наличие и корректность элементов модального окна шаблона.

        Args:
            template_name: Имя шаблона для проверки заголовка окна.

        Raises:
            AssertionError: Если элементы окна некорректны.
        """
        modal_window = self.get_modal_window(template_name)
        modal_window.check_content()

    def check_templates_table_content(self) -> None:
        """Проверяет содержимое таблицы шаблонов.

        Проверяет заголовки и наличие данных в таблице.

        Raises:
            AssertionError: Если таблица пуста или заголовки неверны.
        """

        expected_headers = [
            'Имя',
            'Описание',
            'Тип устройства',
            'Производитель'
        ]

        self.templates_table.check_content(TableLocators.TABLE_WORK_AREA, expected_headers)

    def check_templates_table_verticall_scrolling(self) -> bool:
        """Проверяет возможность вертикальной прокрутки таблицы.

        Returns:
            bool: True если прокрутка возможна, иначе False.
        """

        return self.templates_table.is_scrollable_vertically(
            TableLocators.TABLE_SCROLL_CONTAINER
        )

    def check_templates_table_first_row_visibility(self) -> None:
        """Проверяет видимость первой строки таблицы.

        Raises:
            AssertionError: Если строка не видна.
        """

        self.templates_table.check_first_row_visibility(TableLocators.TABLE_WORK_AREA)

    def check_templates_table_last_row_visibility(self) -> None:
        """Проверяет видимость последней строки таблицы.

        Raises:
            AssertionError: Если строка не видна.
        """

        self.templates_table.check_last_row_visibility(TableLocators.TABLE_WORK_AREA)

    def check_templates_table_row_highlighting(self, row_index: int) -> None:
        """Проверяет выделение указанной строки таблицы.

        Args:
            row_index: Индекс проверяемой строки.

        Raises:
            AssertionError: Если строка не выделена.
        """

        self.templates_table.check_row_highlighting(
            TableLocators.TABLE_WORK_AREA,
            row_index
        )

    def should_be_toolbar(self) -> None:
        """Проверяет наличие тулбара на вкладке.

        Raises:
            AssertionError: Если тулбар отсутствует.
        """

        self.toolbar.check_toolbar_presence("Toolbar is missing")

    def should_be_templates_table(self) -> None:
        """Проверяет наличие таблицы шаблонов.

        Raises:
            AssertionError: Если таблица отсутствует.
        """

        self.templates_table.check_visibility(
            TableLocators.TABLE_WORK_AREA,
            "Templates table is missing"
        )

    def should_be_modal_window(self) -> None:
        """Проверяет наличие модального окна.

        Raises:
            AssertionError: Если модальное окно отсутствует.
        """
        self.templates_table.check_visibility(
            ModalWindowLocators.MODAL_WINDOW,
            "Modal window is not visible"
        )

    def should_not_be_modal_window(self) -> None:
        """Проверяет, что модальное окно отсутствует.

        Raises:
            AssertionError: Если модальное окно все еще видно.
        """
        is_visible = self.page.locator(
            ModalWindowLocators.MODAL_WINDOW
        ).is_visible(timeout=1000)
        if is_visible:
            assert False, "Modal window should not be visible"

    def check_modal_vertical_scrolling(self) -> bool:
        """Проверяет возможность вертикального скроллинга в модальном окне.

        Returns:
            bool: True если скроллинг возможен, иначе False.
        """
        return self.templates_table.is_scrollable_vertically(
            ModalWindowLocators.MODAL_WINDOW_SCROLL_CONTAINER
        )

    def verify_json_container_content(self, template_name: str, save_to_file: bool = False) -> None:
        """Проверяет соответствие данных контейнера данным из API.

        Args:
            template_name: Имя шаблона для проверки.
            save_to_file: Флаг для сохранения данных в файл.
        """

        # Читаем данные из контейнера
        actual_data = self.json_container.read_data(JsonContainerLocators.CONTAINER)

        # Отправляем запрос к backend для получения информации о шаблоне
        response = self.send_get_api_request("e-cmdb/api/device/template")
        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)

        # Сравниваем actual_data с данными конкретного шаблона
        self.json_container.check_json_equals(
            actual_data,
            template_data,
            "Expected json content is not equal actual:"
        )

__init__(page)

Инициализирует компоненты вкладки 'Шаблоны'.

Source code in pages\templates_tab.py
34
35
36
37
38
39
40
41
42
43
44
45
def __init__(self, page: Page) -> None:
    """Инициализирует компоненты вкладки 'Шаблоны'."""

    super().__init__(page)

    self.toolbar = ToolbarComponent(page, "Шаблоны")

    self.templates_table = TableComponent(page)
    self.modal_windows = {}

    self.json_container = JsonContainerComponent(page)
    self.alert = AlertComponent(page)

add_modal_window(title)

Добавляет модальное окно в коллекцию.

Parameters:

Name Type Description Default
title str

Заголовок окна.

required
Source code in pages\templates_tab.py
47
48
49
50
51
52
53
54
def add_modal_window(self, title: str) -> None:
    """Добавляет модальное окно в коллекцию.

    Args:
        title: Заголовок окна.
    """

    self.modal_windows[title] = ViewTemplateModalWindow(self.page, title)

check_modal_vertical_scrolling()

Проверяет возможность вертикального скроллинга в модальном окне.

Returns:

Name Type Description
bool bool

True если скроллинг возможен, иначе False.

Source code in pages\templates_tab.py
336
337
338
339
340
341
342
343
344
def check_modal_vertical_scrolling(self) -> bool:
    """Проверяет возможность вертикального скроллинга в модальном окне.

    Returns:
        bool: True если скроллинг возможен, иначе False.
    """
    return self.templates_table.is_scrollable_vertically(
        ModalWindowLocators.MODAL_WINDOW_SCROLL_CONTAINER
    )

check_templates_modal_content(template_name)

Проверяет наличие и корректность элементов модального окна шаблона.

Parameters:

Name Type Description Default
template_name str

Имя шаблона для проверки заголовка окна.

required

Raises:

Type Description
AssertionError

Если элементы окна некорректны.

Source code in pages\templates_tab.py
218
219
220
221
222
223
224
225
226
227
228
def check_templates_modal_content(self, template_name: str) -> None:
    """Проверяет наличие и корректность элементов модального окна шаблона.

    Args:
        template_name: Имя шаблона для проверки заголовка окна.

    Raises:
        AssertionError: Если элементы окна некорректны.
    """
    modal_window = self.get_modal_window(template_name)
    modal_window.check_content()

check_templates_table_content()

Проверяет содержимое таблицы шаблонов.

Проверяет заголовки и наличие данных в таблице.

Raises:

Type Description
AssertionError

Если таблица пуста или заголовки неверны.

Source code in pages\templates_tab.py
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
def check_templates_table_content(self) -> None:
    """Проверяет содержимое таблицы шаблонов.

    Проверяет заголовки и наличие данных в таблице.

    Raises:
        AssertionError: Если таблица пуста или заголовки неверны.
    """

    expected_headers = [
        'Имя',
        'Описание',
        'Тип устройства',
        'Производитель'
    ]

    self.templates_table.check_content(TableLocators.TABLE_WORK_AREA, expected_headers)

check_templates_table_first_row_visibility()

Проверяет видимость первой строки таблицы.

Raises:

Type Description
AssertionError

Если строка не видна.

Source code in pages\templates_tab.py
259
260
261
262
263
264
265
266
def check_templates_table_first_row_visibility(self) -> None:
    """Проверяет видимость первой строки таблицы.

    Raises:
        AssertionError: Если строка не видна.
    """

    self.templates_table.check_first_row_visibility(TableLocators.TABLE_WORK_AREA)

check_templates_table_last_row_visibility()

Проверяет видимость последней строки таблицы.

Raises:

Type Description
AssertionError

Если строка не видна.

Source code in pages\templates_tab.py
268
269
270
271
272
273
274
275
def check_templates_table_last_row_visibility(self) -> None:
    """Проверяет видимость последней строки таблицы.

    Raises:
        AssertionError: Если строка не видна.
    """

    self.templates_table.check_last_row_visibility(TableLocators.TABLE_WORK_AREA)

check_templates_table_row_highlighting(row_index)

Проверяет выделение указанной строки таблицы.

Parameters:

Name Type Description Default
row_index int

Индекс проверяемой строки.

required

Raises:

Type Description
AssertionError

Если строка не выделена.

Source code in pages\templates_tab.py
277
278
279
280
281
282
283
284
285
286
287
288
289
290
def check_templates_table_row_highlighting(self, row_index: int) -> None:
    """Проверяет выделение указанной строки таблицы.

    Args:
        row_index: Индекс проверяемой строки.

    Raises:
        AssertionError: Если строка не выделена.
    """

    self.templates_table.check_row_highlighting(
        TableLocators.TABLE_WORK_AREA,
        row_index
    )

check_templates_table_verticall_scrolling()

Проверяет возможность вертикальной прокрутки таблицы.

Returns:

Name Type Description
bool bool

True если прокрутка возможна, иначе False.

Source code in pages\templates_tab.py
248
249
250
251
252
253
254
255
256
257
def check_templates_table_verticall_scrolling(self) -> bool:
    """Проверяет возможность вертикальной прокрутки таблицы.

    Returns:
        bool: True если прокрутка возможна, иначе False.
    """

    return self.templates_table.is_scrollable_vertically(
        TableLocators.TABLE_SCROLL_CONTAINER
    )

close_modal_window_by_toolbar_button(title)

Закрывает модальное окно через кнопку в тулбаре.

Parameters:

Name Type Description Default
title str

Заголовок окна.

required
Source code in pages\templates_tab.py
114
115
116
117
118
119
120
121
122
123
def close_modal_window_by_toolbar_button(self, title: str) -> None:
    """Закрывает модальное окно через кнопку в тулбаре.

    Args:
        title: Заголовок окна.
    """

    modal_window = self.get_modal_window(title)
    modal_window.click_toolbar_close_button()
    self.delete_modal_window(title)

delete_modal_window(title)

Удаляет модальное окно из коллекции.

Parameters:

Name Type Description Default
title str

Заголовок окна.

required

Raises:

Type Description
AssertionError

Если окно не найдено.

Source code in pages\templates_tab.py
75
76
77
78
79
80
81
82
83
84
85
86
87
def delete_modal_window(self, title: str) -> None:
    """Удаляет модальное окно из коллекции.

    Args:
        title: Заголовок окна.

    Raises:
        AssertionError: Если окно не найдено.
    """

    if self.modal_windows.get(title) is None:
        assert False, f"Modal window with title '{title}' not found"
    self.modal_windows[title] = None

extract_specific_template(template_name, response_data)

Извлекает структуру конкретного шаблона по template_name из данных API.

Parameters:

Name Type Description Default
template_name str

Имя шаблона для извлечения.

required
response_data dict

Данные ответа от API.

required

Returns:

Name Type Description
dict dict

Структура конкретного шаблона.

Raises:

Type Description
AssertionError

Если шаблон с указанным именем не найден или структура ответа некорректна.

Source code in pages\templates_tab.py
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
def extract_specific_template(self, template_name: str, response_data: dict) -> dict:
    """Извлекает структуру конкретного шаблона по template_name из данных API.

    Args:
        template_name: Имя шаблона для извлечения.
        response_data: Данные ответа от API.

    Returns:
        dict: Структура конкретного шаблона.

    Raises:
        AssertionError: Если шаблон с указанным именем не найден
            или структура ответа некорректна.
    """
    # Проверяем, что ответ является списком шаблонов
    assert isinstance(response_data, list), "API response is not a list of templates"

    # Ищем шаблон с указанным именем
    for template in response_data:
        if template.get('id') == template_name:
            logger.info("Found template: %s", template_name)
            return template

    # Если шаблон не найден
    available_templates = [t.get('id', 'Unknown') for t in response_data]

    # Генерируем понятное сообщение об ошибке
    error_msg = (
        f"Template '{template_name}' not found. "
        f"Available templates: {available_templates}"
    )
    logger.error(error_msg)
    assert False, error_msg

get_modal_window(title)

Возвращает модальное окно по заголовку.

Parameters:

Name Type Description Default
title str

Заголовок окна.

required

Returns:

Name Type Description
ViewTemplateModalWindow ViewTemplateModalWindow

Экземпляр модального окна.

Raises:

Type Description
AssertionError

Если окно не найдено.

Source code in pages\templates_tab.py
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
def get_modal_window(self, title: str) -> ViewTemplateModalWindow:
    """Возвращает модальное окно по заголовку.

    Args:
        title: Заголовок окна.

    Returns:
        ViewTemplateModalWindow: Экземпляр модального окна.

    Raises:
        AssertionError: Если окно не найдено.
    """

    modal_window = self.modal_windows.get(title)

    if modal_window is None:
        assert False, f"Modal window with title '{title}' not found"
    return modal_window

get_rows_count()

Возвращает количество строк в таблице (без заголовка).

Returns:

Name Type Description
int int

Количество строк с данными.

Raises:

Type Description
AssertionError

Если таблица пуста.

Source code in pages\templates_tab.py
125
126
127
128
129
130
131
132
133
134
135
def get_rows_count(self) -> int:
    """Возвращает количество строк в таблице (без заголовка).

    Returns:
        int: Количество строк с данными.

    Raises:
        AssertionError: Если таблица пуста.
    """

    return self.templates_table.get_rows_count(TableLocators.TABLE_WORK_AREA)

open_template_modal(row_index=0)

Открывает модальное окно шаблона по клику на строку таблицы.

Parameters:

Name Type Description Default
row_index int

Индекс строки для клика (по умолчанию 0 - первая строка).

0

Returns:

Name Type Description
str str

Имя шаблона.

Source code in pages\templates_tab.py
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
def open_template_modal(self, row_index: int = 0) -> str:
    """Открывает модальное окно шаблона по клику на строку таблицы.

    Args:
        row_index: Индекс строки для клика (по умолчанию 0 - первая строка).

    Returns:
        str: Имя шаблона.
    """
    row_locator = self.templates_table.get_row_locator(
        TableLocators.TABLE_WORK_AREA,
        row_index
    )
    row_locator.click()

    # Получаем имя шаблона из выбранной строки
    table_content = self.templates_table.read(TableLocators.TABLE_WORK_AREA)
    # +1 потому что первая строка - заголовки
    template_name = table_content[row_index + 1][0]

    # Добавляем модальное окно в коллекцию после открытия
    self.add_modal_window(template_name)

    return template_name

save_template_data_to_file(template_data, filename=None)

Инструмент отладки. Сохраняет данные шаблона в JSON файл в текущей директории.

Parameters:

Name Type Description Default
template_data dict

Данные шаблона для сохранения.

required
filename str

Имя файла (если None, генерируется автоматически).

None

Returns:

Name Type Description
str str

Путь к сохраненному файлу.

Source code in pages\templates_tab.py
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
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)

scroll_modal_down()

Прокручивает содержимое модального окна вниз.

Source code in pages\templates_tab.py
153
154
155
156
157
def scroll_modal_down(self) -> None:
    """Прокручивает содержимое модального окна вниз."""
    self.templates_table.scroll_down(
        ModalWindowLocators.MODAL_WINDOW_SCROLL_CONTAINER
    )

scroll_modal_up()

Прокручивает содержимое модального окна вверх.

Source code in pages\templates_tab.py
147
148
149
150
151
def scroll_modal_up(self) -> None:
    """Прокручивает содержимое модального окна вверх."""
    self.templates_table.scroll_up(
        ModalWindowLocators.MODAL_WINDOW_SCROLL_CONTAINER
    )

scroll_templates_table_down()

Прокручивает таблицу шаблонов вниз.

Source code in pages\templates_tab.py
142
143
144
145
def scroll_templates_table_down(self) -> None:
    """Прокручивает таблицу шаблонов вниз."""

    self.templates_table.scroll_down(TableLocators.TABLE_SCROLL_CONTAINER)

scroll_templates_table_up()

Прокручивает таблицу шаблонов вверх.

Source code in pages\templates_tab.py
137
138
139
140
def scroll_templates_table_up(self) -> None:
    """Прокручивает таблицу шаблонов вверх."""

    self.templates_table.scroll_up(TableLocators.TABLE_SCROLL_CONTAINER)

should_be_modal_window()

Проверяет наличие модального окна.

Raises:

Type Description
AssertionError

Если модальное окно отсутствует.

Source code in pages\templates_tab.py
313
314
315
316
317
318
319
320
321
322
def should_be_modal_window(self) -> None:
    """Проверяет наличие модального окна.

    Raises:
        AssertionError: Если модальное окно отсутствует.
    """
    self.templates_table.check_visibility(
        ModalWindowLocators.MODAL_WINDOW,
        "Modal window is not visible"
    )

should_be_templates_table()

Проверяет наличие таблицы шаблонов.

Raises:

Type Description
AssertionError

Если таблица отсутствует.

Source code in pages\templates_tab.py
301
302
303
304
305
306
307
308
309
310
311
def should_be_templates_table(self) -> None:
    """Проверяет наличие таблицы шаблонов.

    Raises:
        AssertionError: Если таблица отсутствует.
    """

    self.templates_table.check_visibility(
        TableLocators.TABLE_WORK_AREA,
        "Templates table is missing"
    )

should_be_toolbar()

Проверяет наличие тулбара на вкладке.

Raises:

Type Description
AssertionError

Если тулбар отсутствует.

Source code in pages\templates_tab.py
292
293
294
295
296
297
298
299
def should_be_toolbar(self) -> None:
    """Проверяет наличие тулбара на вкладке.

    Raises:
        AssertionError: Если тулбар отсутствует.
    """

    self.toolbar.check_toolbar_presence("Toolbar is missing")

should_not_be_modal_window()

Проверяет, что модальное окно отсутствует.

Raises:

Type Description
AssertionError

Если модальное окно все еще видно.

Source code in pages\templates_tab.py
324
325
326
327
328
329
330
331
332
333
334
def should_not_be_modal_window(self) -> None:
    """Проверяет, что модальное окно отсутствует.

    Raises:
        AssertionError: Если модальное окно все еще видно.
    """
    is_visible = self.page.locator(
        ModalWindowLocators.MODAL_WINDOW
    ).is_visible(timeout=1000)
    if is_visible:
        assert False, "Modal window should not be visible"

verify_json_container_content(template_name, save_to_file=False)

Проверяет соответствие данных контейнера данным из API.

Parameters:

Name Type Description Default
template_name str

Имя шаблона для проверки.

required
save_to_file bool

Флаг для сохранения данных в файл.

False
Source code in pages\templates_tab.py
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
def verify_json_container_content(self, template_name: str, save_to_file: bool = False) -> None:
    """Проверяет соответствие данных контейнера данным из API.

    Args:
        template_name: Имя шаблона для проверки.
        save_to_file: Флаг для сохранения данных в файл.
    """

    # Читаем данные из контейнера
    actual_data = self.json_container.read_data(JsonContainerLocators.CONTAINER)

    # Отправляем запрос к backend для получения информации о шаблоне
    response = self.send_get_api_request("e-cmdb/api/device/template")
    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)

    # Сравниваем actual_data с данными конкретного шаблона
    self.json_container.check_json_equals(
        actual_data,
        template_data,
        "Expected json content is not equal actual:"
    )