Skip to content

TemplatesTab

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

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

TemplatesTab

Bases: BasePage

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

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

Parameters:

Name Type Description Default
page Page

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

required
Source code in pages\templates_tab.py
 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
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
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
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):
        """Возвращает модальное окно по заголовку.

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

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

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

        Args:
            row_index: Индекс строки для клика (по умолчанию 0 - первая строка).
        """
        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)
        template_name = table_content[row_index + 1][0]  # +1 потому что первая строка - заголовки

        # Добавляем модальное окно в коллекцию после открытия
        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: Если таблица пуста.
        """

        table_content = self.templates_table.read(TableLocators.TABLE_WORK_AREA)
        rows_count = len(table_content)

        if rows_count == 0:
            assert False, "The contents of the table are missing"

        return rows_count - 1

    def get_first_template_name(self) -> str:
        """Получает имя шаблона из первой строки таблицы.

        Returns:
            str: Имя шаблона из первого столбца первой строки.

        Raises:
            AssertionError: Если таблица пуста или имя не найдено.
        """
        table_content = self.templates_table.read(TableLocators.TABLE_WORK_AREA)

        if len(table_content) < 2:  # Заголовок + хотя бы одна строка
            assert False, "Table is empty or missing data rows"

        # Первая строка с данными (индекс 1, так как индекс 0 - заголовки)
        first_row = table_content[1]

        if len(first_row) == 0:
            assert False, "First row is empty"

        template_name = first_row[0]  # Первый столбец - имя шаблона
        return template_name

    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 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 = [
            'Имя',
            'Описание',
            'Тип устройства',
            'Производитель'
        ]

        table_content = self.templates_table.read(TableLocators.TABLE_WORK_AREA)

        if len(table_content) == 0:
            assert False, "The contents of the table are missing"

        actual_headers = table_content[0]

        self.check_equals(
            actual_headers,
            expected_headers,
            f"Expected table headers {expected_headers} are not equal {actual_headers}"
        )

        if len(table_content) == 1:
            assert False, "Table body is missing"

    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 get_template_data_from_api(self, template_name: str) -> dict:
        """Получает JSON данные конкретного шаблона из API.

        Args:
            template_name: Имя шаблона.

        Returns:
            dict: JSON данные шаблона из API.

        Raises:
            AssertionError: Если не удалось получить данные из API.
        """

        # Отправляем запрос к API для получения данных конкретного шаблона
        response = self.send_get_api_request("e-cmdb/api/device/template")
        response_data = self.get_response_body(response)
        print(response_data)

        if response.status_code != 200:
            assert False, f"API request failed with status {response.status_code}"

        # Проверяем, что ответ содержит данные нужного шаблона
        if 'name' in response_data and response_data['name'] != template_name:
            assert False, f"API returned data for wrong template: expected '{template_name}', got '{response_data['name']}'"

        return response_data

    def verify_modal_content_with_api(self, template_name: str) -> None:
        """Проверяет соответствие данных модального окна данным из API.

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

        Raises:
            AssertionError: Если данные не соответствуют API.
        """
        # Получаем данные из модального окна
        modal_window = self.get_modal_window(template_name)
        modal_data = modal_window.get_modal_content_data()

        # Получаем данные из API
        api_data = self.get_template_data_from_api(template_name)

        # Сравниваем данные
        self.compare_modal_with_api_data(modal_data, api_data, template_name)


    def compare_modal_with_api_data(self, modal_data: dict, api_data: dict, template_name: str) -> None:
        """Сравнивает JSON конфигурационные данные модального окна с данными из API.

        Args:
            modal_data: JSON данные из модального окна.
            api_data: JSON данные из API.
            template_name: Имя шаблона для сообщений об ошибках.

        Raises:
            AssertionError: Если JSON конфигурационные данные не совпадают.
        """
        # Проверяем, что modal_data содержит данные
        if not modal_data:
            assert False, f"No modal data found for template '{template_name}'"

        # Проверяем, что api_data содержит данные
        if not api_data:
            assert False, f"No API data found for template '{template_name}'"

        # Получаем конфигурационные данные из обоих источников
        modal_config = modal_data.get('config', {})
        api_config = api_data.get('config', {})

        # Проверяем, что оба источника содержат конфигурацию
        if not modal_config:
            assert False, f"No config data found in modal for template '{template_name}'"

        if not api_config:
            assert False, f"No config data found in API for template '{template_name}'"

        # Сравниваем JSON конфигурации
        self.check_equals(
            modal_config,
            api_config,
            f"JSON config data mismatch for template '{template_name}'"
        )

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

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

        """
        # send request to backend to get template info
        response = self.send_get_api_request("e-cmdb/api/device/template")
        response_body = self.get_response_body(response)

        # compare actual and response from cmdb
        self.json_container.check_json_equals(
            actual_data,
            response_body,
            "Expected json content is not equal actual:"
        )
        """

__init__(page)

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

Source code in pages\templates_tab.py
31
32
33
34
35
36
37
38
39
40
41
42
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
44
45
46
47
48
49
50
51
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
307
308
309
310
311
312
313
314
315
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
177
178
179
180
181
182
183
184
185
186
187
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
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
def check_templates_table_content(self) -> None:
    """Проверяет содержимое таблицы шаблонов.

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

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

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

    table_content = self.templates_table.read(TableLocators.TABLE_WORK_AREA)

    if len(table_content) == 0:
        assert False, "The contents of the table are missing"

    actual_headers = table_content[0]

    self.check_equals(
        actual_headers,
        expected_headers,
        f"Expected table headers {expected_headers} are not equal {actual_headers}"
    )

    if len(table_content) == 1:
        assert False, "Table body is missing"

check_templates_table_first_row_visibility()

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

Raises:

Type Description
AssertionError

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

Source code in pages\templates_tab.py
232
233
234
235
236
237
238
239
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
241
242
243
244
245
246
247
248
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
250
251
252
253
254
255
256
257
258
259
260
261
262
263
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
221
222
223
224
225
226
227
228
229
230
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
107
108
109
110
111
112
113
114
115
116
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)

compare_modal_with_api_data(modal_data, api_data, template_name)

Сравнивает JSON конфигурационные данные модального окна с данными из API.

Parameters:

Name Type Description Default
modal_data dict

JSON данные из модального окна.

required
api_data dict

JSON данные из API.

required
template_name str

Имя шаблона для сообщений об ошибках.

required

Raises:

Type Description
AssertionError

Если JSON конфигурационные данные не совпадают.

Source code in pages\templates_tab.py
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
def compare_modal_with_api_data(self, modal_data: dict, api_data: dict, template_name: str) -> None:
    """Сравнивает JSON конфигурационные данные модального окна с данными из API.

    Args:
        modal_data: JSON данные из модального окна.
        api_data: JSON данные из API.
        template_name: Имя шаблона для сообщений об ошибках.

    Raises:
        AssertionError: Если JSON конфигурационные данные не совпадают.
    """
    # Проверяем, что modal_data содержит данные
    if not modal_data:
        assert False, f"No modal data found for template '{template_name}'"

    # Проверяем, что api_data содержит данные
    if not api_data:
        assert False, f"No API data found for template '{template_name}'"

    # Получаем конфигурационные данные из обоих источников
    modal_config = modal_data.get('config', {})
    api_config = api_data.get('config', {})

    # Проверяем, что оба источника содержат конфигурацию
    if not modal_config:
        assert False, f"No config data found in modal for template '{template_name}'"

    if not api_config:
        assert False, f"No config data found in API for template '{template_name}'"

    # Сравниваем JSON конфигурации
    self.check_equals(
        modal_config,
        api_config,
        f"JSON config data mismatch for template '{template_name}'"
    )

delete_modal_window(title)

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

Parameters:

Name Type Description Default
title str

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

required

Raises:

Type Description
AssertionError

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

Source code in pages\templates_tab.py
72
73
74
75
76
77
78
79
80
81
82
83
84
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

get_first_template_name()

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

Returns:

Name Type Description
str str

Имя шаблона из первого столбца первой строки.

Raises:

Type Description
AssertionError

Если таблица пуста или имя не найдено.

Source code in pages\templates_tab.py
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
def get_first_template_name(self) -> str:
    """Получает имя шаблона из первой строки таблицы.

    Returns:
        str: Имя шаблона из первого столбца первой строки.

    Raises:
        AssertionError: Если таблица пуста или имя не найдено.
    """
    table_content = self.templates_table.read(TableLocators.TABLE_WORK_AREA)

    if len(table_content) < 2:  # Заголовок + хотя бы одна строка
        assert False, "Table is empty or missing data rows"

    # Первая строка с данными (индекс 1, так как индекс 0 - заголовки)
    first_row = table_content[1]

    if len(first_row) == 0:
        assert False, "First row is empty"

    template_name = first_row[0]  # Первый столбец - имя шаблона
    return template_name

get_modal_window(title)

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

Parameters:

Name Type Description Default
title str

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

required

Returns:

Name Type Description
ModalWindowComponent

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

Raises:

Type Description
AssertionError

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

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

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

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

    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
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
def get_rows_count(self) -> int:
    """Возвращает количество строк в таблице (без заголовка).

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

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

    table_content = self.templates_table.read(TableLocators.TABLE_WORK_AREA)
    rows_count = len(table_content)

    if rows_count == 0:
        assert False, "The contents of the table are missing"

    return rows_count - 1

get_template_data_from_api(template_name)

Получает JSON данные конкретного шаблона из API.

Parameters:

Name Type Description Default
template_name str

Имя шаблона.

required

Returns:

Name Type Description
dict dict

JSON данные шаблона из API.

Raises:

Type Description
AssertionError

Если не удалось получить данные из API.

Source code in pages\templates_tab.py
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
def get_template_data_from_api(self, template_name: str) -> dict:
    """Получает JSON данные конкретного шаблона из API.

    Args:
        template_name: Имя шаблона.

    Returns:
        dict: JSON данные шаблона из API.

    Raises:
        AssertionError: Если не удалось получить данные из API.
    """

    # Отправляем запрос к API для получения данных конкретного шаблона
    response = self.send_get_api_request("e-cmdb/api/device/template")
    response_data = self.get_response_body(response)
    print(response_data)

    if response.status_code != 200:
        assert False, f"API request failed with status {response.status_code}"

    # Проверяем, что ответ содержит данные нужного шаблона
    if 'name' in response_data and response_data['name'] != template_name:
        assert False, f"API returned data for wrong template: expected '{template_name}', got '{response_data['name']}'"

    return response_data

open_template_modal(row_index=0)

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

Parameters:

Name Type Description Default
row_index int

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

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

    Args:
        row_index: Индекс строки для клика (по умолчанию 0 - первая строка).
    """
    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)
    template_name = table_content[row_index + 1][0]  # +1 потому что первая строка - заголовки

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

    return template_name

scroll_modal_down()

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

Source code in pages\templates_tab.py
173
174
175
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
169
170
171
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
164
165
166
167
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
159
160
161
162
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
286
287
288
289
290
291
292
293
294
295
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
274
275
276
277
278
279
280
281
282
283
284
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
265
266
267
268
269
270
271
272
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
297
298
299
300
301
302
303
304
305
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()

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

Source code in pages\templates_tab.py
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
def verify_json_container_content(self) -> None:
    """Проверяет соответствие данных контейнера данным из API."""

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

    """
    # send request to backend to get template info
    response = self.send_get_api_request("e-cmdb/api/device/template")
    response_body = self.get_response_body(response)

    # compare actual and response from cmdb
    self.json_container.check_json_equals(
        actual_data,
        response_body,
        "Expected json content is not equal actual:"
    )
    """

verify_modal_content_with_api(template_name)

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

Parameters:

Name Type Description Default
template_name str

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

required

Raises:

Type Description
AssertionError

Если данные не соответствуют API.

Source code in pages\templates_tab.py
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
def verify_modal_content_with_api(self, template_name: str) -> None:
    """Проверяет соответствие данных модального окна данным из API.

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

    Raises:
        AssertionError: Если данные не соответствуют API.
    """
    # Получаем данные из модального окна
    modal_window = self.get_modal_window(template_name)
    modal_data = modal_window.get_modal_content_data()

    # Получаем данные из API
    api_data = self.get_template_data_from_api(template_name)

    # Сравниваем данные
    self.compare_modal_with_api_data(modal_data, api_data, template_name)