Добавлены тесты для вкладок 'Действия', 'События', 'Обслуживание', 'Аудит' панели событий
parent
cb1465ad7c
commit
410d279e23
|
|
@ -6,6 +6,10 @@ from locators.event_panel_locators import EventPanelLocators
|
|||
from elements.tooltip_button_element import TooltipButton
|
||||
from elements.tab_button_element import TabButton
|
||||
from elements.button_element import Button
|
||||
from components_derived.container_actions_events import ActionsEventsContainer
|
||||
from components_derived.container_audit_events import AuditEventsContainer
|
||||
from components_derived.container_events import EventsTabContainer
|
||||
from components_derived.container_maintenance_events import MaintenanceEventsContainer
|
||||
from components_derived.container_system_log_events import SystemLogEventsContainer
|
||||
from components_derived.user_card import UserCard
|
||||
from components.base_component import BaseComponent
|
||||
|
|
@ -66,6 +70,42 @@ class EventPanelComponent(BaseComponent):
|
|||
|
||||
self.expand_more_button.click()
|
||||
|
||||
def click_actions_tab(self) -> ActionsEventsContainer:
|
||||
"""Выполняет нажатие tab-кнопки Действия."""
|
||||
|
||||
self.actions_tab.check_visibility("Actions tab button is missing on event panel")
|
||||
self.actions_tab.click()
|
||||
|
||||
actions_tab = ActionsEventsContainer(self.page, EventPanelLocators.CONTAINER_ACTIONS_TAB)
|
||||
return actions_tab
|
||||
|
||||
def click_audit_tab(self) -> AuditEventsContainer:
|
||||
"""Выполняет нажатие tab-кнопки Аудит."""
|
||||
|
||||
self.audit_tab.check_visibility("Audit tab button is missing on event panel")
|
||||
self.audit_tab.click()
|
||||
|
||||
audit_tab = AuditEventsContainer(self.page, EventPanelLocators.CONTAINER_AUDIT_EVENTS)
|
||||
return audit_tab
|
||||
|
||||
def click_events_tab(self) -> EventsTabContainer:
|
||||
"""Выполняет нажатие tab-кнопки События."""
|
||||
|
||||
self.events_tab.check_visibility("Events tab button is missing on event panel")
|
||||
self.events_tab.click()
|
||||
|
||||
events_tab = EventsTabContainer(self.page, EventPanelLocators.CONTAINER_EVENTS_TAB)
|
||||
return events_tab
|
||||
|
||||
def click_maintenance_tab(self) -> MaintenanceEventsContainer:
|
||||
"""Выполняет нажатие tab-кнопки Обслуживание."""
|
||||
|
||||
self.maintenance_tab.check_visibility("Maintenance tab button is missing on event panel")
|
||||
self.maintenance_tab.click()
|
||||
|
||||
maintenance_tab = MaintenanceEventsContainer(self.page, EventPanelLocators.CONTAINER_MAINTENANCE_EVENTS)
|
||||
return maintenance_tab
|
||||
|
||||
def click_system_log_tab(self) -> SystemLogEventsContainer:
|
||||
"""Выполняет нажатие tab-кнопки Системный журнал."""
|
||||
|
||||
|
|
|
|||
|
|
@ -84,7 +84,7 @@ class EventsContainerComponent(BaseComponent):
|
|||
self.chevron_right.click()
|
||||
|
||||
def click_first_page(self) -> None:
|
||||
"""Нажатие кнопки перехода на первую сраницу"""
|
||||
"""Нажатие кнопки перехода на первую страницу"""
|
||||
|
||||
self.first_page.click()
|
||||
|
||||
|
|
@ -94,7 +94,7 @@ class EventsContainerComponent(BaseComponent):
|
|||
self.last_page.click()
|
||||
|
||||
def click_filter_button(self) -> EventsFilterPanel:
|
||||
"""Нажатие кнопки перехода на первую сраницу"""
|
||||
"""Нажатие кнопки перехода на первую страницу"""
|
||||
|
||||
self.toolbar.click_button("filter_button")
|
||||
expect(self.page.locator("div.menuable__content__active")).to_be_visible(), "Events filter is missing"
|
||||
|
|
@ -110,6 +110,15 @@ class EventsContainerComponent(BaseComponent):
|
|||
loc = self.container_locator.locator(self.table_locator)
|
||||
self.events_table.click_arrow_button(loc, index)
|
||||
|
||||
def get_events_table_row_locator(self, index: int) -> Locator:
|
||||
""" Возвращает локатор строки таблицы по ее индексу
|
||||
|
||||
Args:
|
||||
index: Индекс строки в таблице.
|
||||
"""
|
||||
loc = self.container_locator.locator(self.table_locator)
|
||||
return self.events_table.get_row_locator(loc, index)
|
||||
|
||||
def get_current_data_set_number(self) -> int:
|
||||
"""Получение номера текущего набора данных"""
|
||||
|
||||
|
|
@ -368,7 +377,7 @@ class EventsContainerComponent(BaseComponent):
|
|||
def should_be_toolbar(self) -> None:
|
||||
"""Проверка наличия тулбара"""
|
||||
|
||||
loc = self.container_locator.locator(self.toolbar_locator)
|
||||
loc = self.container_locator.locator(self.toolbar_locator).first
|
||||
self.toolbar.check_toolbar_presence_by_locator(loc, "Toolbar is missing")
|
||||
|
||||
def should_be_pagination_buttons(self) -> None:
|
||||
|
|
|
|||
|
|
@ -0,0 +1,140 @@
|
|||
"""Модуль контейнера для отображения событий вкладки Действия.
|
||||
|
||||
Содержит класс для работы с контейнером для отображения событий
|
||||
вкладки Действия через Playwright.
|
||||
"""
|
||||
|
||||
from playwright.sync_api import Page, Locator
|
||||
from tools.logger import get_logger
|
||||
from locators.event_panel_locators import EventPanelLocators
|
||||
from components.events_container_component import EventsContainerComponent
|
||||
from components_derived.modal_view_task import ViewTaskModalWindow
|
||||
|
||||
logger = get_logger("ACTIONS_EVENTS_CONTAINER")
|
||||
|
||||
|
||||
class ActionsEventsContainer(EventsContainerComponent):
|
||||
"""Компонент контейнера для отображения событий вкладки Действия.
|
||||
|
||||
Предоставляет методы для взаимодействия с элементами
|
||||
контейнера для отображения событий вкладки Действия.
|
||||
"""
|
||||
|
||||
def __init__(self, page: Page, locator: str | Locator):
|
||||
"""Инициализирует компонент контейнера для отображения событий вкладки Действия.
|
||||
|
||||
Args:
|
||||
page: Экземпляр страницы Playwright.
|
||||
"""
|
||||
|
||||
super().__init__(page, locator)
|
||||
|
||||
toolbar_locator = self.get_locator(locator).locator(EventPanelLocators.TOOLBAR). \
|
||||
filter(has_text="Фильтр Реальное время Архив")
|
||||
|
||||
self.add_tab_to_toolbar(toolbar_locator.locator(EventPanelLocators.FILTER_TOOLBAR_BUTTON), "filter_button")
|
||||
self.add_tab_to_toolbar(toolbar_locator.locator(EventPanelLocators.REAL_TIME_TOOLBAR_BUTTON),
|
||||
"real_time_button")
|
||||
self.add_tab_to_toolbar(toolbar_locator.locator(EventPanelLocators.ARCHIVE_TOOLBAR_BUTTON), "archive_button")
|
||||
self.add_tab_to_toolbar(toolbar_locator.locator(EventPanelLocators.PDF_TOOLBAR_BUTTON), "export_to_pdf_button")
|
||||
self.add_tab_to_toolbar(toolbar_locator.locator(EventPanelLocators.CSV_TOOLBAR_BUTTON), "export_to_csv_button")
|
||||
|
||||
events_filter = self.get_events_filter()
|
||||
events_filter.add_filtering_parameter("filter_status", "Статус")
|
||||
events_filter.add_filtering_parameter("filter_task_name", "НАИМЕНОВАНИЕ ЗАДАЧИ")
|
||||
events_filter.add_filtering_parameter("filter_object", "Объект")
|
||||
events_filter.add_filtering_parameter("filter_user", "Пользователь")
|
||||
|
||||
|
||||
# Действия:
|
||||
def click_archive_button(self) -> None:
|
||||
"""Нажимает кнопку Архив на тулбаре."""
|
||||
|
||||
self.toolbar.check_button_visibility("archive_button")
|
||||
self.click_tab_button("archive_button")
|
||||
|
||||
def click_real_time_button(self) -> None:
|
||||
"""Нажимает кнопку Реальное время на тулбаре."""
|
||||
|
||||
self.toolbar.check_button_visibility("real_time_button")
|
||||
self.click_tab_button("real_time_button")
|
||||
|
||||
def click_events_table_row(self, index) -> ViewTaskModalWindow:
|
||||
"""Выбор и нажатие на строку таблицы по ее индексу."""
|
||||
|
||||
loc = self.get_events_table_row_locator(index)
|
||||
loc.scroll_into_view_if_needed()
|
||||
loc.click()
|
||||
|
||||
return ViewTaskModalWindow(self.page)
|
||||
|
||||
# Проверки:
|
||||
def check_content(self) -> None:
|
||||
"""Проверяет содержимое контейнера для отображения событий вкладки Действия."""
|
||||
|
||||
expected_real_time_headers = ['ВРЕМЯ НАЧАЛА', 'ВРЕМЯ ЗАВЕРШЕНИЯ','СТАТУС',
|
||||
'НАИМЕНОВАНИЕ ЗАДАЧИ', 'ОБЪЕКТ', 'ПОЛЬЗОВАТЕЛЬ', 'ОПИСАНИЕ']
|
||||
|
||||
expected_archive_headers = ['ВРЕМЯ НАЧАЛА', 'ВРЕМЯ ЗАВЕРШЕНИЯ','СТАТУС',
|
||||
'НАИМЕНОВАНИЕ ЗАДАЧИ', 'ОБЪЕКТ', 'ПОЛЬЗОВАТЕЛЬ', 'ПРОЦЕССИНГ']
|
||||
|
||||
self.should_be_toolbar()
|
||||
self.should_be_toolbar_buttons()
|
||||
|
||||
if not self.is_tab_active("real_time_button"):
|
||||
self.click_tab_button("real_time_button")
|
||||
self.wait_for_timeout(1000)
|
||||
|
||||
self.check_events_table_content(expected_real_time_headers)
|
||||
|
||||
if not self.is_tab_active("archive_button"):
|
||||
self.click_tab_button("archive_button")
|
||||
self.wait_for_timeout(1000)
|
||||
|
||||
self.check_events_table_content(expected_archive_headers)
|
||||
|
||||
events_filter = self.click_filter_button()
|
||||
events_filter.check_content()
|
||||
|
||||
filter_status_bar = events_filter.get_filtering_parameter("filter_status")
|
||||
filter_status_title = filter_status_bar.get_selection_bar_title()
|
||||
assert filter_status_title == "Статус", "Filtering parameter bar 'Статус' is missing"
|
||||
|
||||
filter_task_name_bar = events_filter.get_filtering_parameter("filter_task_name")
|
||||
filter_task_name_title = filter_task_name_bar.get_selection_bar_title()
|
||||
assert filter_task_name_title == "НАИМЕНОВАНИЕ ЗАДАЧИ", \
|
||||
"Filtering parameter bar 'НАИМЕНОВАНИЕ ЗАДАЧИ' is missing"
|
||||
|
||||
filter_object_bar = events_filter.get_filtering_parameter("filter_object")
|
||||
filter_object_title = filter_object_bar.get_selection_bar_title()
|
||||
assert filter_object_title == "Объект", "Filtering parameter bar 'Объект' is missing"
|
||||
|
||||
filter_user_bar = events_filter.get_filtering_parameter("filter_user")
|
||||
filter_user_title = filter_user_bar.get_selection_bar_title()
|
||||
assert filter_user_title == "Пользователь", "Filtering parameter bar 'Пользователь' is missing"
|
||||
|
||||
def check_events_table_content(self, expected_headers: list[str]) -> None:
|
||||
"""Проверка содержимого таблицы"""
|
||||
|
||||
self.should_be_events_table()
|
||||
events_table = self.get_events_table_content()
|
||||
|
||||
if len(events_table) == 0:
|
||||
assert False, "The contents of the events table are missing"
|
||||
|
||||
self.check_events_table_headers(events_table[0], expected_headers)
|
||||
|
||||
if len(events_table) == 1:
|
||||
logger.info("Table body is missing")
|
||||
|
||||
self.should_be_pagination_buttons()
|
||||
|
||||
|
||||
def should_be_toolbar_buttons(self) -> None:
|
||||
"""Проверяет наличие и видимость кнопок тулбара."""
|
||||
|
||||
self.toolbar.check_button_visibility("filter_button")
|
||||
self.toolbar.check_button_visibility("real_time_button")
|
||||
self.toolbar.check_button_visibility("archive_button")
|
||||
self.toolbar.check_button_visibility("export_to_pdf_button")
|
||||
self.toolbar.check_button_visibility("export_to_csv_button")
|
||||
|
|
@ -0,0 +1,96 @@
|
|||
"""Модуль контейнера для отображения событий аудита.
|
||||
|
||||
Содержит класс для работы с контейнером для отображения событий
|
||||
аудита через Playwright.
|
||||
"""
|
||||
|
||||
from playwright.sync_api import Page, Locator
|
||||
from tools.logger import get_logger
|
||||
from locators.event_panel_locators import EventPanelLocators
|
||||
from components.events_container_component import EventsContainerComponent
|
||||
|
||||
logger = get_logger("AUDIT_EVENTS_CONTAINER")
|
||||
|
||||
|
||||
class AuditEventsContainer(EventsContainerComponent):
|
||||
"""Компонент контейнера для отображения событий аудита.
|
||||
|
||||
Предоставляет методы для взаимодействия с элементами
|
||||
контейнера для отображения событий аудита.
|
||||
"""
|
||||
|
||||
def __init__(self, page: Page, locator: str | Locator):
|
||||
"""Инициализирует компонент контейнера для отображения событий аудита.
|
||||
|
||||
Args:
|
||||
page: Экземпляр страницы Playwright.
|
||||
"""
|
||||
|
||||
super().__init__(page, locator)
|
||||
|
||||
toolbar_locator = self.get_locator(locator).locator(EventPanelLocators.TOOLBAR)
|
||||
|
||||
self.add_tab_to_toolbar(toolbar_locator.locator(EventPanelLocators.FILTER_TOOLBAR_BUTTON), "filter_button")
|
||||
self.add_tab_to_toolbar(toolbar_locator.locator(EventPanelLocators.EVENTS_TOOLBAR_BUTTON), "view_events_button")
|
||||
self.add_tab_to_toolbar(toolbar_locator.locator(EventPanelLocators.PDF_TOOLBAR_BUTTON), "export_to_pdf_button")
|
||||
self.add_tab_to_toolbar(toolbar_locator.locator(EventPanelLocators.CSV_TOOLBAR_BUTTON), "export_to_csv_button")
|
||||
|
||||
events_filter = self.get_events_filter()
|
||||
events_filter.add_filtering_parameter("filter_type", "Тип")
|
||||
events_filter.add_filtering_parameter("filter_role", "Роль")
|
||||
events_filter.add_filtering_parameter("filter_name", "Имя")
|
||||
events_filter.add_filtering_parameter("filter_ip", "ip")
|
||||
|
||||
# Действия:
|
||||
# Проверки:
|
||||
def check_content(self) -> None:
|
||||
"""Проверяет содержимое контейнера для отображения событий системного журнала."""
|
||||
|
||||
expected_headers = [ 'ВРЕМЯ', 'ОПИСАНИЕ', 'ИДЕНТИФИКАТОР']
|
||||
|
||||
self.should_be_toolbar()
|
||||
self.should_be_toolbar_buttons()
|
||||
|
||||
if not self.is_tab_active("view_events_button"):
|
||||
self.click_tab_button("view_events_button")
|
||||
self.wait_for_timeout(1000)
|
||||
|
||||
self.should_be_events_table()
|
||||
events_table = self.get_events_table_content()
|
||||
|
||||
if len(events_table) == 0:
|
||||
assert False, "The contents of the events table are missing"
|
||||
|
||||
self.check_events_table_headers(events_table[0], expected_headers)
|
||||
|
||||
if len(events_table) == 1:
|
||||
logger.info("Table body is missing")
|
||||
|
||||
self.should_be_pagination_buttons()
|
||||
|
||||
events_filter = self.click_filter_button()
|
||||
events_filter.check_content()
|
||||
|
||||
filter_type_bar = events_filter.get_filtering_parameter("filter_type")
|
||||
filter_type_title = filter_type_bar.get_selection_bar_title()
|
||||
assert filter_type_title == "Тип", "Filtering parameter bar 'Тип' is missing"
|
||||
|
||||
filter_role_bar = events_filter.get_filtering_parameter("filter_role")
|
||||
filter_role_title = filter_role_bar.get_selection_bar_title()
|
||||
assert filter_role_title == "Роль", "Filtering parameter bar 'Роль' is missing"
|
||||
|
||||
filter_name_bar = events_filter.get_filtering_parameter("filter_name")
|
||||
filter_name_title = filter_name_bar.get_selection_bar_title()
|
||||
assert filter_name_title == "Имя", "Filtering parameter bar 'Имя' is missing"
|
||||
|
||||
filter_ip_bar = events_filter.get_filtering_parameter("filter_ip")
|
||||
filter_ip_title = filter_ip_bar.get_selection_bar_title()
|
||||
assert filter_ip_title == "ip", "Filtering parameter bar 'ip' is missing"
|
||||
|
||||
def should_be_toolbar_buttons(self) -> None:
|
||||
"""Проверяет наличие и видимость кнопок тулбара."""
|
||||
|
||||
self.toolbar.check_button_visibility("filter_button")
|
||||
self.toolbar.check_button_visibility("view_events_button")
|
||||
self.toolbar.check_button_visibility("export_to_pdf_button")
|
||||
self.toolbar.check_button_visibility("export_to_csv_button")
|
||||
|
|
@ -0,0 +1,91 @@
|
|||
"""Модуль контейнера для отображения событий вкладки События панели событий.
|
||||
|
||||
Содержит класс для работы с контейнером для отображения событий
|
||||
вкладки События панели событий через Playwright.
|
||||
"""
|
||||
|
||||
from playwright.sync_api import Page, Locator
|
||||
from tools.logger import get_logger
|
||||
from locators.event_panel_locators import EventPanelLocators
|
||||
from components.events_container_component import EventsContainerComponent
|
||||
|
||||
logger = get_logger("EVENTS_TAB_CONTAINER")
|
||||
|
||||
|
||||
class EventsTabContainer(EventsContainerComponent):
|
||||
"""Компонент контейнера для отображения событий вкладки События панели событий.
|
||||
|
||||
Предоставляет методы для взаимодействия с элементами
|
||||
контейнера для отображения событий вкладки События панели событий.
|
||||
"""
|
||||
|
||||
def __init__(self, page: Page, locator: str | Locator):
|
||||
"""Инициализирует компонент контейнера для отображения событий вкладки События панели событий.
|
||||
|
||||
Args:
|
||||
page: Экземпляр страницы Playwright.
|
||||
"""
|
||||
|
||||
super().__init__(page, locator)
|
||||
|
||||
toolbar_locator = self.get_locator(locator).locator(EventPanelLocators.TOOLBAR)
|
||||
|
||||
self.add_tab_to_toolbar(toolbar_locator.locator(EventPanelLocators.FILTER_TOOLBAR_BUTTON), "filter_button")
|
||||
self.add_tab_to_toolbar(toolbar_locator.locator(EventPanelLocators.EVENTS_TOOLBAR_BUTTON), "view_events_button")
|
||||
self.add_tab_to_toolbar(toolbar_locator.locator(EventPanelLocators.PDF_TOOLBAR_BUTTON), "export_to_pdf_button")
|
||||
self.add_tab_to_toolbar(toolbar_locator.locator(EventPanelLocators.CSV_TOOLBAR_BUTTON), "export_to_csv_button")
|
||||
|
||||
events_filter = self.get_events_filter()
|
||||
events_filter.add_filtering_parameter("filter_type", "Тип")
|
||||
events_filter.add_filtering_parameter("filter_strictness", "Критичность")
|
||||
events_filter.add_filtering_parameter("filter_object", "Объект")
|
||||
|
||||
# Действия:
|
||||
# Проверки:
|
||||
def check_content(self) -> None:
|
||||
"""Проверяет содержимое контейнера для отображения событий системного журнала."""
|
||||
|
||||
expected_headers = [ 'ВРЕМЯ', 'ТИП', 'КРИТИЧНОСТЬ', 'ОБЪЕКТ', 'ОПИСАНИЕ']
|
||||
|
||||
self.should_be_toolbar()
|
||||
self.should_be_toolbar_buttons()
|
||||
|
||||
if not self.is_tab_active("view_events_button"):
|
||||
self.click_tab_button("view_events_button")
|
||||
self.wait_for_timeout(1000)
|
||||
|
||||
self.should_be_events_table()
|
||||
events_table = self.get_events_table_content()
|
||||
|
||||
if len(events_table) == 0:
|
||||
assert False, "The contents of the events table are missing"
|
||||
|
||||
self.check_events_table_headers(events_table[0], expected_headers)
|
||||
|
||||
if len(events_table) == 1:
|
||||
logger.info("Table body is missing")
|
||||
|
||||
self.should_be_pagination_buttons()
|
||||
|
||||
events_filter = self.click_filter_button()
|
||||
events_filter.check_content()
|
||||
|
||||
filter_type_bar = events_filter.get_filtering_parameter("filter_type")
|
||||
filter_type_title = filter_type_bar.get_selection_bar_title()
|
||||
assert filter_type_title == "Тип", "Filtering parameter bar 'Тип' is missing"
|
||||
|
||||
filter_strictness_bar = events_filter.get_filtering_parameter("filter_strictness")
|
||||
filter_strictness_title = filter_strictness_bar.get_selection_bar_title()
|
||||
assert filter_strictness_title == "Критичность", "Filtering parameter bar 'Критичность' is missing"
|
||||
|
||||
filter_object_bar = events_filter.get_filtering_parameter("filter_object")
|
||||
filter_object_title = filter_object_bar.get_selection_bar_title()
|
||||
assert filter_object_title == "Объект", "Filtering parameter bar 'Объект' is missing"
|
||||
|
||||
def should_be_toolbar_buttons(self) -> None:
|
||||
"""Проверяет наличие и видимость кнопок тулбара."""
|
||||
|
||||
self.toolbar.check_button_visibility("filter_button")
|
||||
self.toolbar.check_button_visibility("view_events_button")
|
||||
self.toolbar.check_button_visibility("export_to_pdf_button")
|
||||
self.toolbar.check_button_visibility("export_to_csv_button")
|
||||
|
|
@ -0,0 +1,114 @@
|
|||
"""Модуль контейнера для отображения событий обслуживания.
|
||||
|
||||
Содержит класс для работы с контейнером для отображения событий
|
||||
обслуживания через Playwright.
|
||||
"""
|
||||
|
||||
from playwright.sync_api import Page, Locator
|
||||
from tools.logger import get_logger
|
||||
from locators.event_panel_locators import EventPanelLocators
|
||||
from components.events_container_component import EventsContainerComponent
|
||||
|
||||
logger = get_logger("MAINTENANCE_EVENTS_CONTAINER")
|
||||
|
||||
|
||||
class MaintenanceEventsContainer(EventsContainerComponent):
|
||||
"""Компонент контейнера для отображения событий обслуживания.
|
||||
|
||||
Предоставляет методы для взаимодействия с элементами
|
||||
контейнера для отображения событий системного журнала.
|
||||
"""
|
||||
|
||||
def __init__(self, page: Page, locator: str | Locator):
|
||||
"""Инициализирует компонент контейнера для отображения событий обслуживания.
|
||||
|
||||
Args:
|
||||
page: Экземпляр страницы Playwright.
|
||||
"""
|
||||
|
||||
super().__init__(page, locator)
|
||||
|
||||
toolbar_locator = self.get_locator(locator).locator(EventPanelLocators.TOOLBAR)
|
||||
|
||||
self.add_tab_to_toolbar(toolbar_locator.locator(EventPanelLocators.FILTER_TOOLBAR_BUTTON), "filter_button")
|
||||
self.add_tab_to_toolbar(toolbar_locator.locator(EventPanelLocators.MAINTENANCE_TOOLBAR_BUTTON),
|
||||
"maintenance_button")
|
||||
self.add_tab_to_toolbar(toolbar_locator.locator(EventPanelLocators.PDF_TOOLBAR_BUTTON), "export_to_pdf_button")
|
||||
self.add_tab_to_toolbar(toolbar_locator.locator(EventPanelLocators.CSV_TOOLBAR_BUTTON), "export_to_csv_button")
|
||||
|
||||
events_filter = self.get_events_filter()
|
||||
events_filter.add_filtering_parameter("filter_date", "Дата")
|
||||
events_filter.add_filtering_parameter("filter_event_name", "Наименование события")
|
||||
events_filter.add_filtering_parameter("filter_type", "Тип")
|
||||
events_filter.add_filtering_parameter("filter_status", "Состояние")
|
||||
events_filter.add_filtering_parameter("filter_object", "Объект")
|
||||
events_filter.add_filtering_parameter("filter_author", "Автор")
|
||||
events_filter.add_filtering_parameter("filter_location", "Расположение")
|
||||
|
||||
# Действия:
|
||||
# Проверки:
|
||||
def check_content(self) -> None:
|
||||
"""Проверяет содержимое контейнера для отображения событий обслуживания."""
|
||||
|
||||
expected_headers = ['ДАТА', 'НАИМЕНОВАНИЕ СОБЫТИЯ' ,'ТИП',
|
||||
'СОСТОЯНИЕ', 'ОБЪЕКТ', 'АВТОР', 'РАСПОЛОЖЕНИЕ']
|
||||
|
||||
self.should_be_toolbar()
|
||||
self.should_be_toolbar_buttons()
|
||||
|
||||
if not self.is_tab_active("maintenance_button"):
|
||||
self.click_tab_button("maintenance_button")
|
||||
self.wait_for_timeout(1000)
|
||||
|
||||
self.should_be_events_table()
|
||||
events_table = self.get_events_table_content()
|
||||
|
||||
if len(events_table) == 0:
|
||||
assert False, "The contents of the events table are missing"
|
||||
|
||||
self.check_events_table_headers(events_table[0], expected_headers)
|
||||
|
||||
if len(events_table) == 1:
|
||||
logger.info("Table body is missing")
|
||||
|
||||
self.should_be_pagination_buttons()
|
||||
|
||||
events_filter = self.click_filter_button()
|
||||
events_filter.check_content()
|
||||
|
||||
filter_date_bar = events_filter.get_filtering_parameter("filter_date")
|
||||
filter_date_title = filter_date_bar.get_selection_bar_title()
|
||||
assert filter_date_title == "Дата", "Filtering parameter bar 'Дата' is missing"
|
||||
|
||||
filter_event_name_bar = events_filter.get_filtering_parameter("filter_event_name")
|
||||
filter_event_name_title = filter_event_name_bar.get_selection_bar_title()
|
||||
assert filter_event_name_title == "Наименование события", \
|
||||
"Filtering parameter bar 'Наименование события' is missing"
|
||||
|
||||
filter_type_bar = events_filter.get_filtering_parameter("filter_type")
|
||||
filter_type_title = filter_type_bar.get_selection_bar_title()
|
||||
assert filter_type_title == "Тип", "Filtering parameter bar 'Тип' is missing"
|
||||
|
||||
filter_status_bar = events_filter.get_filtering_parameter("filter_status")
|
||||
filter_status_title = filter_status_bar.get_selection_bar_title()
|
||||
assert filter_status_title == "Состояние", "Filtering parameter bar 'Состояние' is missing"
|
||||
|
||||
filter_object_bar = events_filter.get_filtering_parameter("filter_object")
|
||||
filter_object_title = filter_object_bar.get_selection_bar_title()
|
||||
assert filter_object_title == "Объект", "Filtering parameter bar 'Объект' is missing"
|
||||
|
||||
filter_author_bar = events_filter.get_filtering_parameter("filter_author")
|
||||
filter_author_title = filter_author_bar.get_selection_bar_title()
|
||||
assert filter_author_title == "Автор", "Filtering parameter bar 'Автор' is missing"
|
||||
|
||||
filter_location_bar = events_filter.get_filtering_parameter("filter_location")
|
||||
filter_location_title = filter_location_bar.get_selection_bar_title()
|
||||
assert filter_location_title == "Расположение", "Filtering parameter bar 'Расположение' is missing"
|
||||
|
||||
def should_be_toolbar_buttons(self) -> None:
|
||||
"""Проверяет наличие и видимость кнопок тулбара."""
|
||||
|
||||
self.toolbar.check_button_visibility("filter_button")
|
||||
self.toolbar.check_button_visibility("maintenance_button")
|
||||
self.toolbar.check_button_visibility("export_to_pdf_button")
|
||||
self.toolbar.check_button_visibility("export_to_csv_button")
|
||||
|
|
@ -45,7 +45,7 @@ class SystemLogEventsContainer(EventsContainerComponent):
|
|||
def check_content(self) -> None:
|
||||
"""Проверяет содержимое контейнера для отображения событий системного журнала."""
|
||||
|
||||
expected_headers = ['ТИП', 'ВРЕМЯ', 'КРИТИЧНОСТЬ', 'ОБЪЕКТ', 'ОПИСАНИЕ']
|
||||
expected_headers = ['ВРЕМЯ', 'ТИП','КРИТИЧНОСТЬ', 'ОБЪЕКТ', 'ОПИСАНИЕ']
|
||||
|
||||
self.should_be_toolbar()
|
||||
self.should_be_toolbar_buttons()
|
||||
|
|
@ -63,7 +63,7 @@ class SystemLogEventsContainer(EventsContainerComponent):
|
|||
self.check_events_table_headers(events_table[0], expected_headers)
|
||||
|
||||
if len(events_table) == 1:
|
||||
assert False, "Table body is missing"
|
||||
logger.info("Table body is missing")
|
||||
|
||||
self.should_be_pagination_buttons()
|
||||
|
||||
|
|
|
|||
|
|
@ -5,9 +5,8 @@
|
|||
|
||||
from playwright.sync_api import Page, Locator, expect
|
||||
from tools.logger import get_logger
|
||||
# from elements.text_element import Text
|
||||
from elements.text_input_element import TextInput
|
||||
from elements.button_element import Button
|
||||
from elements.tooltip_button_element import TooltipButton
|
||||
from components.date_picker_component import DatePickerComponent
|
||||
from components.base_component import BaseComponent
|
||||
|
||||
|
|
@ -32,7 +31,7 @@ class DateInput(BaseComponent):
|
|||
|
||||
self.date_input_locator = self.get_locator(locator)
|
||||
|
||||
self.switch_mode_button = Button(page,
|
||||
self.switch_mode_button = TooltipButton(page,
|
||||
self.date_input_locator.get_by_role("button"),
|
||||
"switch_mode_button")
|
||||
|
||||
|
|
@ -88,11 +87,15 @@ class DateInput(BaseComponent):
|
|||
except ValueError:
|
||||
assert False, f"Incorrect year value {year} for selection"
|
||||
|
||||
if self.is_text_input_mode():
|
||||
# Temporarily due to error in UI
|
||||
if not self.is_text_input_mode():
|
||||
# if self.is_text_input_mode():
|
||||
# print("by keyboard")
|
||||
self.date_input_field.check_editable_input("Text field for date input should be editable")
|
||||
self.date_input_field.clear()
|
||||
self.date_input_field.input_value(date)
|
||||
else:
|
||||
# print("by date picker")
|
||||
self.date_picker.select_year_and_month(year, month)
|
||||
self.date_picker.select_day(day)
|
||||
|
||||
|
|
@ -123,8 +126,9 @@ class DateInput(BaseComponent):
|
|||
|
||||
self.check_switch_mode_button_visibility()
|
||||
|
||||
label_locator = self.date_input_locator.get_by_label(label)
|
||||
expect(label_locator).to_be_visible()
|
||||
# Temporarily: due to error in UI
|
||||
# label_locator = self.date_input_locator.get_by_label(label)
|
||||
# expect(label_locator).to_be_visible()
|
||||
|
||||
self.date_input_field.check_visibility("Text field for date input is missing")
|
||||
self.date_input_field.check_empty_input("Text field for date input should be empty")
|
||||
|
|
@ -135,11 +139,14 @@ class DateInput(BaseComponent):
|
|||
self.page.wait_for_timeout(300)
|
||||
|
||||
self.date_picker.check_content()
|
||||
self.check_switch_mode_button_tooltip()
|
||||
|
||||
self.click_switch_mode_button()
|
||||
self.check_switch_mode_button_tooltip()
|
||||
|
||||
self.click_switch_mode_button()
|
||||
|
||||
self.page.wait_for_timeout(300)
|
||||
self.page.wait_for_timeout(1000)
|
||||
self.input_date("11.11.2011")
|
||||
|
||||
label_locator = self.date_input_locator.get_by_label("Время")
|
||||
|
|
@ -154,6 +161,20 @@ class DateInput(BaseComponent):
|
|||
|
||||
self.switch_mode_button.check_visibility("Switch Mode Button is missing")
|
||||
|
||||
def check_switch_mode_button_tooltip(self) -> None:
|
||||
""" Проверка tooltip кнопки переключения режимов ввода."""
|
||||
|
||||
text_mode = self.is_text_input_mode()
|
||||
|
||||
tooltip_text = self.switch_mode_button.get_tooltip_text()
|
||||
|
||||
if text_mode:
|
||||
assert tooltip_text == "Ручной ввод", \
|
||||
"Should be 'Ручной ввод' tooltip for switch mode button"
|
||||
else:
|
||||
assert tooltip_text == "Выбрать в календаре", \
|
||||
"Should be 'Выбрать в календаре' tooltip for switch mode button"
|
||||
|
||||
def is_text_input_mode(self) -> bool:
|
||||
""" Проверка текстового режима ввода."""
|
||||
|
||||
|
|
|
|||
|
|
@ -26,9 +26,11 @@ class EventsFilterPanel(BaseComponent):
|
|||
self.events_filter_locator = self.page.locator("div.menuable__content__active div.scrollarea__body")
|
||||
|
||||
# Поля ввода даты начала и даты окончания события
|
||||
loc = self.page.locator("div.menuable__content__active div.scrollarea__body").locator("//div/div").nth(0)
|
||||
loc = self.page. \
|
||||
locator("div.menuable__content__active div.scrollarea__body > div:nth-child(1) > div:nth-child(1)")
|
||||
self.start_time_filter = DateInput(page, loc)
|
||||
loc = self.page.locator("div.menuable__content__active div.scrollarea__body > div > div:nth-child(3)")
|
||||
loc = self.page. \
|
||||
locator("div.menuable__content__active div.scrollarea__body > div:nth-child(1) > div:nth-child(3)")
|
||||
self.finish_time_filter = DateInput(page, loc)
|
||||
|
||||
# Поля задания параметров фильтрации (произвольное количество)
|
||||
|
|
|
|||
|
|
@ -0,0 +1,76 @@
|
|||
"""Модуль modal_view_task содержит класс для работы с модальным окном отображения задачи вкладки
|
||||
Действия панели событий.
|
||||
|
||||
Класс ViewTaskModalWindow наследует базовый функционал ModalWindowComponent
|
||||
и реализует методы просмотра модального окна отображения задачи.
|
||||
"""
|
||||
|
||||
from playwright.sync_api import Page
|
||||
from tools.logger import get_logger
|
||||
from locators.modal_window_locators import ModalWindowLocators
|
||||
from components.table_component import TableComponent
|
||||
from components.modal_window_component import ModalWindowComponent
|
||||
|
||||
logger = get_logger("VIEW_TASK_MODAL_WINDOW")
|
||||
|
||||
|
||||
class ViewTaskModalWindow(ModalWindowComponent):
|
||||
"""Модальное окно отображения отображения задачи.
|
||||
|
||||
Наследует ModalWindowComponent и добавляет функционал для:
|
||||
1. Инициализации модального окна
|
||||
2. Закрытия модального окна через тулбар
|
||||
3. Проверки содержимого модального окна
|
||||
"""
|
||||
|
||||
def __init__(self, page: Page):
|
||||
"""Инициализирует элементы формы модального окна отображения задачи."""
|
||||
super().__init__(page)
|
||||
|
||||
self.window_title_locator = page.locator(ModalWindowLocators.TASK_MODAL_WINDOW). \
|
||||
locator("//div[@class='v-toolbar__title']")
|
||||
|
||||
# Настройка кнопки закрытия
|
||||
button_close_locator = page.locator(ModalWindowLocators.TASK_MODAL_WINDOW).get_by_role("button")
|
||||
self.add_toolbar_button(button_close_locator, "close")
|
||||
|
||||
self.task_stages_table_locator = page.locator(ModalWindowLocators.TASK_MODAL_WINDOW). \
|
||||
locator("//div[@class='scrolltable']/div/table")
|
||||
self.task_stages_table = TableComponent(page)
|
||||
|
||||
# Действия:
|
||||
def close(self):
|
||||
"""Закрывает окно кнопкой на тулбаре."""
|
||||
|
||||
self.click_toolbar_close_button()
|
||||
|
||||
def get_stages_table_content(self) -> list[list[str]]:
|
||||
"""Возвращает содержимое таблицы, включая заголовки.
|
||||
|
||||
Returns:
|
||||
Двумерный список с содержимым таблицы.
|
||||
"""
|
||||
|
||||
return self.task_stages_table.read(self.task_stages_table_locator)
|
||||
|
||||
def get_window_title(self) -> str:
|
||||
"""Возвращает заголовок окна"""
|
||||
|
||||
return self.toolbar.get_toolbar_title_text(self.window_title_locator)
|
||||
|
||||
# Проверки:
|
||||
def check_content(self) -> None:
|
||||
"""Проверяет наличие элементов окна.
|
||||
"""
|
||||
|
||||
self.toolbar.check_toolbar_presence_by_locator(self.page.locator(ModalWindowLocators.TASK_MODAL_WINDOW). \
|
||||
locator("//nav"), "Toolbar is missing")
|
||||
self.check_toolbar_button_visibility("close")
|
||||
self.check_toolbar_button_tooltip("close", "Закрыть")
|
||||
|
||||
self.task_stages_table.check_visibility(self.task_stages_table_locator, "Task stages table is missing")
|
||||
|
||||
def check_stages_table_headers(self, actual_headers, expected_headers) -> None:
|
||||
""" Проверка соответствия заголовка таблицы ожидаемому"""
|
||||
|
||||
self.task_stages_table.check_table_headers(actual_headers, expected_headers)
|
||||
|
|
@ -33,6 +33,7 @@ class EventPanelLocators:
|
|||
TAB_MAINTENANCE = "//div[@data-testid='BASELINE__service_tab__toolbar']"
|
||||
TAB_SYSTEM_LOG = "//div[@data-testid='BASELINE__system journal_tab__toolbar']"
|
||||
TAB_AUDIT = "//div[@data-testid='BASELINE__audit_tab__toolbar']"
|
||||
TAB_INFORMATION_SECURITY = "//div[@data-testid='BASELINE__information security_tab__toolbar']"
|
||||
|
||||
BUTTONS_EVENT = "//nav/div[@class='v-toolbar__content']/div[@class='v-toolbar__items'][2]//span[contains(@class, 'v-tooltip')]"
|
||||
|
||||
|
|
@ -43,7 +44,15 @@ class EventPanelLocators:
|
|||
|
||||
FILTER_TOOLBAR_BUTTON = "//div[contains(@class, 'journal-tab-button')]//span[text()='Фильтр']"
|
||||
EVENTS_TOOLBAR_BUTTON = "//div[contains(@class, 'journal-tab-button')]//span[text()='События']"
|
||||
MAINTENANCE_TOOLBAR_BUTTON = "//div[contains(@class, 'journal-tab-button')]//span[text()='Обслуживание']"
|
||||
REAL_TIME_TOOLBAR_BUTTON = "//div[contains(@class, 'journal-tab-button')]//span[text()='Реальное время']"
|
||||
ARCHIVE_TOOLBAR_BUTTON = "//div[contains(@class, 'journal-tab-button')]//span[text()='Архив']"
|
||||
PDF_TOOLBAR_BUTTON = "//div[contains(@class, 'journal-tab-button')]//span[text()='pdf']"
|
||||
CSV_TOOLBAR_BUTTON = "//div[contains(@class, 'journal-tab-button')]//span[text()='csv']"
|
||||
|
||||
CONTAINER_ACTIONS_TAB = "#app > div.application--wrap > div > div:nth-child(3) > div:nth-child(2)"
|
||||
CONTAINER_EVENTS_TAB = "#app > div.application--wrap > div > div:nth-child(3) > div:nth-child(3)"
|
||||
CONTAINER_MAINTENANCE_EVENTS = "#app > div.application--wrap > div > div:nth-child(3) > div:nth-child(4)"
|
||||
CONTAINER_SYSTEM_LOG_EVENTS = "#app > div.application--wrap > div > div:nth-child(3) > div:nth-child(5)"
|
||||
CONTAINER_AUDIT_EVENTS = "#app > div.application--wrap > div > div:nth-child(3) > div:nth-child(6)"
|
||||
CONTAINER_INFORMATION_SECURITY = "#app > div.application--wrap > div > div:nth-child(3) > div:nth-child(6)"
|
||||
|
|
|
|||
|
|
@ -30,3 +30,4 @@ class ModalWindowLocators:
|
|||
MENU_ACTIVE_ITEMS = "//div[@role='list']//div[@role='listitem']"
|
||||
LABEL_INPUT_FORM_USER_DATA = "//label[contains(@class,'v-label')]/span"
|
||||
|
||||
TASK_MODAL_WINDOW = "//div[@data-testid='BASELINE__dialog-drag__modal_0']"
|
||||
|
|
|
|||
|
|
@ -6,6 +6,10 @@
|
|||
|
||||
from playwright.sync_api import Page
|
||||
from locators.navigation_panel_locators import NavigationPanelLocators
|
||||
from components_derived.container_actions_events import ActionsEventsContainer
|
||||
from components_derived.container_audit_events import AuditEventsContainer
|
||||
from components_derived.container_events import EventsTabContainer
|
||||
from components_derived.container_maintenance_events import MaintenanceEventsContainer
|
||||
from components_derived.container_system_log_events import SystemLogEventsContainer
|
||||
from components_derived.user_card import UserCard
|
||||
from components.eventbar_component import EventPanelComponent
|
||||
|
|
@ -45,6 +49,26 @@ class MainPage(BasePage):
|
|||
|
||||
self.event_panel.click_expand_more_button()
|
||||
|
||||
def click_events_panel_actions_tab(self) -> ActionsEventsContainer:
|
||||
"""Выполняет нажатие tab-кнопки Действия."""
|
||||
|
||||
return self.event_panel.click_actions_tab()
|
||||
|
||||
def click_events_panel_audit_tab(self) -> AuditEventsContainer:
|
||||
"""Выполняет нажатие tab-кнопки Аудит."""
|
||||
|
||||
return self.event_panel.click_audit_tab()
|
||||
|
||||
def click_events_panel_events_tab(self) -> EventsTabContainer:
|
||||
"""Выполняет нажатие tab-кнопки События."""
|
||||
|
||||
return self.event_panel.click_events_tab()
|
||||
|
||||
def click_events_panel_maintenance_tab(self) -> MaintenanceEventsContainer:
|
||||
"""Выполняет нажатие tab-кнопки Обслуживание."""
|
||||
|
||||
return self.event_panel.click_maintenance_tab()
|
||||
|
||||
def click_events_panel_system_log_tab(self) -> SystemLogEventsContainer:
|
||||
"""Выполняет нажатие tab-кнопки Системный журнал."""
|
||||
|
||||
|
|
|
|||
|
|
@ -0,0 +1,388 @@
|
|||
"""Модуль тестов контейнера для отображения событий вкладки Действия.
|
||||
|
||||
Содержит тесты для проверки функциональности
|
||||
контейнера для отображения событий вкладки Действия.
|
||||
"""
|
||||
|
||||
# import pytest
|
||||
from playwright.sync_api import Page
|
||||
from pages.main_page import MainPage
|
||||
from pages.login_page import LoginPage
|
||||
|
||||
|
||||
# @pytest.mark.smoke
|
||||
class TestActionsEventsContainer:
|
||||
"""Класс тестов для проверки контейнера для отображения событий вкладки Действия.
|
||||
|
||||
Атрибуты:
|
||||
browser: Фикстура для работы с браузером.
|
||||
"""
|
||||
# @pytest.mark.develop
|
||||
def test_actions_events_tab_content(self, browser: Page) -> None:
|
||||
"""Проверяет содержимое контейнера для отображения событий вкладки Действия.
|
||||
|
||||
Args:
|
||||
browser: Экземпляр страницы Playwright.
|
||||
"""
|
||||
|
||||
lp = LoginPage(browser)
|
||||
lp.do_login()
|
||||
|
||||
mp = MainPage(browser)
|
||||
mp.should_be_event_panel()
|
||||
|
||||
actions_events_container = mp.click_events_panel_actions_tab()
|
||||
actions_events_container.check_content()
|
||||
|
||||
def test_events_tables_row_highlighting(self, browser: Page):
|
||||
"""Проверяет выделение строк в таблицах событий: Реальное время и Архив.
|
||||
|
||||
Args:
|
||||
browser: Экземпляр страницы Playwright.
|
||||
"""
|
||||
|
||||
lp = LoginPage(browser)
|
||||
lp.do_login()
|
||||
|
||||
mp = MainPage(browser)
|
||||
mp.should_be_event_panel()
|
||||
|
||||
actions_events_container = mp.click_events_panel_actions_tab()
|
||||
|
||||
actions_events_container.click_real_time_button()
|
||||
# Получение количества строк в таблице Реальное время
|
||||
rows_count = actions_events_container.get_events_table_rows_count()
|
||||
|
||||
# Проверка выделения строк
|
||||
actions_events_container.check_events_table_row_highlighting(0)
|
||||
actions_events_container.check_events_table_row_highlighting(rows_count - 1)
|
||||
actions_events_container.check_events_table_row_highlighting(int(rows_count / 2))
|
||||
|
||||
actions_events_container.click_archive_button()
|
||||
# Получение количества строк в таблице Архив
|
||||
rows_count = actions_events_container.get_events_table_rows_count()
|
||||
|
||||
# Проверка выделения строк
|
||||
actions_events_container.check_events_table_row_highlighting(0)
|
||||
actions_events_container.check_events_table_row_highlighting(rows_count - 1)
|
||||
actions_events_container.check_events_table_row_highlighting(int(rows_count / 2))
|
||||
|
||||
# @pytest.mark.develop
|
||||
def test_events_table_scrolling(self, browser: Page):
|
||||
"""Проверяет возможность скроллинга таблицы событий.
|
||||
|
||||
Args:
|
||||
browser: Экземпляр страницы Playwright.
|
||||
"""
|
||||
|
||||
lp = LoginPage(browser)
|
||||
lp.do_login()
|
||||
|
||||
mp = MainPage(browser)
|
||||
mp.should_be_event_panel()
|
||||
|
||||
actions_events_container = mp.click_events_panel_actions_tab()
|
||||
|
||||
events_panel_position = mp.get_events_panel_position()
|
||||
|
||||
# Проверка, что панель с таблицей открыта
|
||||
assert events_panel_position != "bottom", "Panel with system log events should be opened"
|
||||
|
||||
is_scrollable = actions_events_container.check_events_table_verticall_scrolling()
|
||||
|
||||
# Убеждаемся, что панель открыта наполовину и проверяем скроллинг
|
||||
assert events_panel_position == "center",\
|
||||
"Panel with system log events should be located on the main page center"
|
||||
assert is_scrollable, "System log events table should be scrollable"
|
||||
|
||||
# Скроллинг вниз
|
||||
actions_events_container.scroll_events_table_down()
|
||||
browser.wait_for_timeout(1000)
|
||||
|
||||
# Проверка видимости последней строки после прокрутки
|
||||
actions_events_container.check_events_table_last_row_visibility()
|
||||
|
||||
# Скроллинг вверх
|
||||
actions_events_container.scroll_events_table_up()
|
||||
browser.wait_for_timeout(1000)
|
||||
|
||||
# Проверка видимости первой строки после прокрутки
|
||||
actions_events_container.check_events_table_first_row_visibility()
|
||||
|
||||
# Раскрываем панель полностью и проверяем скроллинг
|
||||
assert mp.check_expand_more_button(), \
|
||||
"Expand more button should be present"
|
||||
mp.click_events_panel_expand_more_button()
|
||||
mp.wait_for_timeout(500)
|
||||
|
||||
events_panel_position = mp.get_events_panel_position()
|
||||
assert events_panel_position == "top",\
|
||||
"Panel with system log events should be located on the main page top"
|
||||
|
||||
is_scrollable = actions_events_container.check_events_table_verticall_scrolling()
|
||||
assert is_scrollable, "System log events table should be scrollable in the full window"
|
||||
|
||||
# Скроллинг вниз
|
||||
actions_events_container.scroll_events_table_down()
|
||||
browser.wait_for_timeout(1000)
|
||||
|
||||
# Проверка видимости последней строки после прокрутки
|
||||
actions_events_container.check_events_table_last_row_visibility()
|
||||
|
||||
# Скроллинг вверх
|
||||
actions_events_container.scroll_events_table_up()
|
||||
browser.wait_for_timeout(1000)
|
||||
|
||||
# Проверка видимости первой строки после прокрутки
|
||||
actions_events_container.check_events_table_first_row_visibility()
|
||||
|
||||
# @pytest.mark.develop
|
||||
def test_real_time_task_view(self, browser: Page):
|
||||
"""Проверяет содержимое окна вывода информации о задаче.
|
||||
|
||||
Args:
|
||||
browser: Экземпляр страницы Playwright.
|
||||
"""
|
||||
|
||||
index = 0
|
||||
expected_task_headers = ['СООБЩЕНИЕ','СТАТУС', 'ОПИСАНИЕ']
|
||||
expected_task_stages = []
|
||||
|
||||
lp = LoginPage(browser)
|
||||
lp.do_login()
|
||||
|
||||
mp = MainPage(browser)
|
||||
mp.should_be_event_panel()
|
||||
|
||||
actions_events_container = mp.click_events_panel_actions_tab()
|
||||
|
||||
actions_events_container.click_real_time_button()
|
||||
task_view_window = actions_events_container.click_events_table_row(index)
|
||||
|
||||
task_view_window.check_content()
|
||||
|
||||
title, task_id = task_view_window.get_window_title().split(" ")
|
||||
assert title == "Task", "Window title should start with the word 'Task'"
|
||||
|
||||
stages_table_content = task_view_window.get_stages_table_content()
|
||||
|
||||
task_view_window.check_stages_table_headers(stages_table_content[0], expected_task_headers)
|
||||
stages_table_content.pop(0)
|
||||
|
||||
payload = {"filter": {"page": 1},
|
||||
"count": 40}
|
||||
|
||||
response = mp.send_post_api_request("e-nms/task_manager/showTaskWithFilter", payload)
|
||||
if response.status == 200:
|
||||
response_body = mp.get_response_body(response)
|
||||
|
||||
if response_body:
|
||||
for item in response_body["data"]["data"]:
|
||||
if item["id"] == task_id:
|
||||
for stage in item["progress"]:
|
||||
expected_task_stages.append(stage)
|
||||
break
|
||||
|
||||
assert len(expected_task_stages) > 0, f"No expected task stages found for task with id {task_id}"
|
||||
|
||||
assert len (expected_task_stages) == len(stages_table_content), "Incorrect actual task stages list"
|
||||
for i in range(len(expected_task_stages)):
|
||||
expected_message = expected_task_stages[i]["message"]
|
||||
actual_message = stages_table_content[i][0]
|
||||
assert expected_message == actual_message, \
|
||||
f"Expected message {expected_message} is not equal actual message {actual_message} for {i} row"
|
||||
|
||||
expected_status = expected_task_stages[i]["status"]
|
||||
if expected_status == "ok":
|
||||
expected_status = "Норма"
|
||||
actual_status = stages_table_content[i][1]
|
||||
assert expected_status == actual_status, \
|
||||
f"Expected message {expected_status} is not equal actual message {actual_status} for {i} row"
|
||||
|
||||
task_view_window.close()
|
||||
|
||||
# TO-DO: Вернуть тесты после прояснения как должна отображаться информация в таблицах Реальное время и Архив
|
||||
|
||||
# def test_events_table_column_sorting(self, browser: Page):
|
||||
# """Проверяет сортировку колонки 'Время' в таблице событий.
|
||||
|
||||
# Args:
|
||||
# browser: Экземпляр страницы Playwright.
|
||||
# """
|
||||
|
||||
# lp = LoginPage(browser)
|
||||
# lp.do_login()
|
||||
|
||||
# mp = MainPage(browser)
|
||||
# mp.should_be_event_panel()
|
||||
|
||||
# actions_events_container = mp.click_events_panel_actions_tab()
|
||||
|
||||
# index = 0
|
||||
# state = actions_events_container.get_arrow_button_state(index)
|
||||
# assert state == "down", "Arrow button should be down"
|
||||
|
||||
# actions_events_container.click_event_table_header_arrow(index)
|
||||
# browser.wait_for_timeout(500)
|
||||
|
||||
# state = actions_events_container.get_arrow_button_state(index)
|
||||
# assert state == "up", "Arrow button should be up"
|
||||
# is_descending_order = actions_events_container.check_events_table_column_descending_order(index,
|
||||
# convert2timestamp=True)
|
||||
# assert not is_descending_order, "Column data should be in ascending order"
|
||||
|
||||
# actions_events_container.click_event_table_header_arrow(index)
|
||||
# browser.wait_for_timeout(500)
|
||||
# state = actions_events_container.get_arrow_button_state(index)
|
||||
# assert state == "down", "Arrow button should be down"
|
||||
# is_descending_order = actions_events_container.check_events_table_column_descending_order(index,
|
||||
# convert2timestamp=True)
|
||||
# assert is_descending_order, "Column data should be in descending order"
|
||||
|
||||
# def test_events_table_pagination(self, browser: Page):
|
||||
# """Проверяет возможность пагинации таблицы событий.
|
||||
|
||||
# Args:
|
||||
# browser: Экземпляр страницы Playwright.
|
||||
# """
|
||||
|
||||
# lp = LoginPage(browser)
|
||||
# lp.do_login()
|
||||
|
||||
# mp = MainPage(browser)
|
||||
# mp.should_be_event_panel()
|
||||
|
||||
# actions_events_container = mp.click_events_panel_actions_tab()
|
||||
|
||||
# audit_events_container.should_be_pagination_buttons()
|
||||
|
||||
# # Проверка начального состояния
|
||||
# tested_pages = 1
|
||||
|
||||
# # to do: некорректный запрос в бэк, должно быть "filter": {"page": 0}
|
||||
# payload = {"table": "default",
|
||||
# "filter": {
|
||||
# "tags": [
|
||||
# "testaudit",
|
||||
# "type:action"
|
||||
# ],
|
||||
# "page": 1
|
||||
# },
|
||||
# "count": 40
|
||||
# }
|
||||
# response = mp.send_post_api_request("e-nms/logs_enode", payload)
|
||||
# if response.status == 200:
|
||||
# response_body = mp.get_response_body(response)
|
||||
|
||||
# if response_body:
|
||||
# pages = response_body["data"]["pages"]
|
||||
|
||||
# if pages > 5:
|
||||
# tested_pages = 5
|
||||
# else:
|
||||
# tested_pages = pages
|
||||
|
||||
# current_number = audit_events_container.get_current_data_set_number()
|
||||
# assert current_number == 1, "The first page should be number one"
|
||||
|
||||
# if tested_pages == 1:
|
||||
# audit_events_container.should_be_all_disabled()
|
||||
# else:
|
||||
# audit_events_container.should_be_initial_state()
|
||||
|
||||
# # Переход на самую последнюю страницу, возврат на страницу назад, потом на страницу вперед
|
||||
# audit_events_container.click_last_page()
|
||||
# browser.wait_for_timeout(2000)
|
||||
|
||||
# audit_events_container.should_be_final_state()
|
||||
|
||||
# last_number = audit_events_container.get_current_data_set_number()
|
||||
|
||||
# audit_events_container.click_chevron_left()
|
||||
# browser.wait_for_timeout(4000)
|
||||
|
||||
# if last_number == 2:
|
||||
# audit_events_container.should_be_initial_state()
|
||||
# else:
|
||||
# audit_events_container.should_be_all_enabled()
|
||||
|
||||
# counter = last_number - 1
|
||||
# current_number = audit_events_container.get_current_data_set_number()
|
||||
# assert current_number == counter, f"Expected page number {counter} is not equal actual {current_number}"
|
||||
|
||||
# audit_events_container.click_chevron_right()
|
||||
# browser.wait_for_timeout(4000)
|
||||
|
||||
# audit_events_container.should_be_final_state()
|
||||
|
||||
# current_number = audit_events_container.get_current_data_set_number()
|
||||
# assert current_number == last_number, \
|
||||
# f"Expected page number {last_number} is not equal actual {current_number}"
|
||||
|
||||
# # Переход на первую страницу, переход на следующую страницу, возврат на первую страницу
|
||||
# audit_events_container.click_first_page()
|
||||
# browser.wait_for_timeout(2000)
|
||||
|
||||
# audit_events_container.should_be_initial_state()
|
||||
|
||||
# current_number = audit_events_container.get_current_data_set_number()
|
||||
# assert current_number == 1, f"Expected page number 1 is not equal actual {current_number}"
|
||||
|
||||
# audit_events_container.click_chevron_right()
|
||||
# browser.wait_for_timeout(4000)
|
||||
|
||||
# if tested_pages == 2:
|
||||
# audit_events_container.should_be_final_state()
|
||||
# else:
|
||||
# audit_events_container.should_be_all_enabled()
|
||||
|
||||
# current_number = audit_events_container.get_current_data_set_number()
|
||||
# assert current_number == 2, f"Expected page number 2 is not equal actual {current_number}"
|
||||
|
||||
# audit_events_container.click_chevron_left()
|
||||
# browser.wait_for_timeout(4000)
|
||||
|
||||
# audit_events_container.should_be_initial_state()
|
||||
|
||||
# current_number = audit_events_container.get_current_data_set_number()
|
||||
# assert current_number == 1, f"Expected page number 1 is not equal actual {current_number}"
|
||||
|
||||
# if tested_pages > 2:
|
||||
# # загрузка страниц от начала и до конца
|
||||
# # to_do: проверка, что происходит обновление содержимого таблицы
|
||||
# counter = 1
|
||||
|
||||
# while counter < tested_pages:
|
||||
# audit_events_container.click_chevron_right()
|
||||
# counter += 1
|
||||
# browser.wait_for_timeout(2000)
|
||||
|
||||
# if counter == tested_pages:
|
||||
# audit_events_container.should_be_final_state()
|
||||
# else:
|
||||
# audit_events_container.should_be_all_enabled()
|
||||
# current_number = audit_events_container.get_current_data_set_number()
|
||||
# assert current_number == counter,\
|
||||
# f"Expected page number {counter} is not equal actual {current_number}"
|
||||
|
||||
# # загрузка страниц от конца к началу
|
||||
# # to_do: проверка, что происходит обновление содержимого таблицы
|
||||
# while counter > 2:
|
||||
# audit_events_container.click_chevron_left()
|
||||
# browser.wait_for_timeout(2000)
|
||||
|
||||
# audit_events_container.should_be_all_enabled()
|
||||
|
||||
# counter -= 1
|
||||
# current_number = audit_events_container.get_current_data_set_number()
|
||||
# assert current_number == counter,\
|
||||
# f"Expected page number {counter} is not equal actual {current_number}"
|
||||
|
||||
# # Проверка возврата к начальному состоянию
|
||||
# audit_events_container.click_chevron_left()
|
||||
# browser.wait_for_timeout(2000)
|
||||
|
||||
# audit_events_container.should_be_initial_state()
|
||||
|
||||
# current_number = audit_events_container.get_current_data_set_number()
|
||||
# assert current_number == 1, "The first page should be number one"
|
||||
|
|
@ -0,0 +1,310 @@
|
|||
"""Модуль тестов контейнера для отображения событий аудита.
|
||||
|
||||
Содержит тесты для проверки функциональности
|
||||
контейнера для отображения событий аудита.
|
||||
"""
|
||||
|
||||
# import pytest
|
||||
from playwright.sync_api import Page
|
||||
from pages.main_page import MainPage
|
||||
from pages.login_page import LoginPage
|
||||
|
||||
|
||||
# @pytest.mark.smoke
|
||||
class TestAuditEventsContainer:
|
||||
"""Класс тестов для проверки контейнера для отображения событий аудита.
|
||||
|
||||
Атрибуты:
|
||||
browser: Фикстура для работы с браузером.
|
||||
"""
|
||||
# @pytest.mark.develop
|
||||
def test_events_tab_content(self, browser: Page) -> None:
|
||||
"""Проверяет содержимое контейнера для отображения событий аудита.
|
||||
|
||||
Args:
|
||||
browser: Экземпляр страницы Playwright.
|
||||
"""
|
||||
|
||||
lp = LoginPage(browser)
|
||||
lp.do_login()
|
||||
|
||||
mp = MainPage(browser)
|
||||
mp.should_be_event_panel()
|
||||
|
||||
audit_events_container = mp.click_events_panel_audit_tab()
|
||||
audit_events_container.check_content()
|
||||
|
||||
def test_events_table_row_highlighting(self, browser: Page):
|
||||
"""Проверяет выделение строк в таблице событий.
|
||||
|
||||
Args:
|
||||
browser: Экземпляр страницы Playwright.
|
||||
"""
|
||||
|
||||
lp = LoginPage(browser)
|
||||
lp.do_login()
|
||||
|
||||
mp = MainPage(browser)
|
||||
mp.should_be_event_panel()
|
||||
|
||||
audit_events_container = mp.click_events_panel_audit_tab()
|
||||
|
||||
# Получение количества строк в таблице
|
||||
rows_count = audit_events_container.get_events_table_rows_count()
|
||||
|
||||
# Проверка выделения строк
|
||||
audit_events_container.check_events_table_row_highlighting(0)
|
||||
audit_events_container.check_events_table_row_highlighting(rows_count - 1)
|
||||
audit_events_container.check_events_table_row_highlighting(int(rows_count / 2))
|
||||
|
||||
def test_events_table_scrolling(self, browser: Page):
|
||||
"""Проверяет возможность скроллинга таблицы событий.
|
||||
|
||||
Args:
|
||||
browser: Экземпляр страницы Playwright.
|
||||
"""
|
||||
|
||||
lp = LoginPage(browser)
|
||||
lp.do_login()
|
||||
|
||||
mp = MainPage(browser)
|
||||
mp.should_be_event_panel()
|
||||
|
||||
audit_events_container = mp.click_events_panel_audit_tab()
|
||||
|
||||
events_panel_position = mp.get_events_panel_position()
|
||||
|
||||
# Проверка, что панель с таблицей открыта
|
||||
assert events_panel_position != "bottom", "Panel with system log events should be opened"
|
||||
|
||||
is_scrollable = audit_events_container.check_events_table_verticall_scrolling()
|
||||
|
||||
# Убеждаемся, что панель открыта наполовину и проверяем скроллинг
|
||||
assert events_panel_position == "center",\
|
||||
"Panel with system log events should be located on the main page center"
|
||||
assert is_scrollable, "System log events table should be scrollable"
|
||||
|
||||
# Скроллинг вниз
|
||||
audit_events_container.scroll_events_table_down()
|
||||
browser.wait_for_timeout(1000)
|
||||
|
||||
# Проверка видимости последней строки после прокрутки
|
||||
audit_events_container.check_events_table_last_row_visibility()
|
||||
|
||||
# Скроллинг вверх
|
||||
audit_events_container.scroll_events_table_up()
|
||||
browser.wait_for_timeout(1000)
|
||||
|
||||
# Проверка видимости первой строки после прокрутки
|
||||
audit_events_container.check_events_table_first_row_visibility()
|
||||
|
||||
# Раскрываем панель полностью и проверяем скроллинг
|
||||
assert mp.check_expand_more_button(), \
|
||||
"Expand more button should be present"
|
||||
mp.click_events_panel_expand_more_button()
|
||||
mp.wait_for_timeout(500)
|
||||
|
||||
events_panel_position = mp.get_events_panel_position()
|
||||
assert events_panel_position == "top",\
|
||||
"Panel with system log events should be located on the main page top"
|
||||
|
||||
is_scrollable = audit_events_container.check_events_table_verticall_scrolling()
|
||||
assert is_scrollable, "System log events table should be scrollable in the full window"
|
||||
|
||||
# Скроллинг вниз
|
||||
audit_events_container.scroll_events_table_down()
|
||||
browser.wait_for_timeout(1000)
|
||||
|
||||
# Проверка видимости последней строки после прокрутки
|
||||
audit_events_container.check_events_table_last_row_visibility()
|
||||
|
||||
# Скроллинг вверх
|
||||
audit_events_container.scroll_events_table_up()
|
||||
browser.wait_for_timeout(1000)
|
||||
|
||||
# Проверка видимости первой строки после прокрутки
|
||||
audit_events_container.check_events_table_first_row_visibility()
|
||||
|
||||
def test_events_table_column_sorting(self, browser: Page):
|
||||
"""Проверяет сортировку колонки 'Время' в таблице событий.
|
||||
|
||||
Args:
|
||||
browser: Экземпляр страницы Playwright.
|
||||
"""
|
||||
|
||||
lp = LoginPage(browser)
|
||||
lp.do_login()
|
||||
|
||||
mp = MainPage(browser)
|
||||
mp.should_be_event_panel()
|
||||
|
||||
audit_events_container = mp.click_events_panel_audit_tab()
|
||||
|
||||
index = 0
|
||||
state = audit_events_container.get_arrow_button_state(index)
|
||||
assert state == "down", "Arrow button should be down"
|
||||
|
||||
audit_events_container.click_event_table_header_arrow(index)
|
||||
browser.wait_for_timeout(500)
|
||||
|
||||
state = audit_events_container.get_arrow_button_state(index)
|
||||
assert state == "up", "Arrow button should be up"
|
||||
is_descending_order = audit_events_container.check_events_table_column_descending_order(index,
|
||||
convert2timestamp=True)
|
||||
assert not is_descending_order, "Column data should be in ascending order"
|
||||
|
||||
audit_events_container.click_event_table_header_arrow(index)
|
||||
browser.wait_for_timeout(500)
|
||||
state = audit_events_container.get_arrow_button_state(index)
|
||||
assert state == "down", "Arrow button should be down"
|
||||
is_descending_order = audit_events_container.check_events_table_column_descending_order(index,
|
||||
convert2timestamp=True)
|
||||
assert is_descending_order, "Column data should be in descending order"
|
||||
|
||||
def test_events_table_pagination(self, browser: Page):
|
||||
"""Проверяет возможность пагинации таблицы событий.
|
||||
|
||||
Args:
|
||||
browser: Экземпляр страницы Playwright.
|
||||
"""
|
||||
|
||||
lp = LoginPage(browser)
|
||||
lp.do_login()
|
||||
|
||||
mp = MainPage(browser)
|
||||
mp.should_be_event_panel()
|
||||
|
||||
audit_events_container = mp.click_events_panel_audit_tab()
|
||||
|
||||
audit_events_container.should_be_pagination_buttons()
|
||||
|
||||
# Проверка начального состояния
|
||||
tested_pages = 1
|
||||
|
||||
# to do: некорректный запрос в бэк, должно быть "filter": {"page": 0}
|
||||
payload = {"table": "default",
|
||||
"filter": {
|
||||
"tags": [
|
||||
"testaudit",
|
||||
"type:action"
|
||||
],
|
||||
"page": 1
|
||||
},
|
||||
"count": 40
|
||||
}
|
||||
response = mp.send_post_api_request("e-nms/logs_enode", payload)
|
||||
if response.status == 200:
|
||||
response_body = mp.get_response_body(response)
|
||||
|
||||
if response_body:
|
||||
pages = response_body["data"]["pages"]
|
||||
|
||||
if pages > 5:
|
||||
tested_pages = 5
|
||||
else:
|
||||
tested_pages = pages
|
||||
|
||||
current_number = audit_events_container.get_current_data_set_number()
|
||||
assert current_number == 1, "The first page should be number one"
|
||||
|
||||
if tested_pages == 1:
|
||||
audit_events_container.should_be_all_disabled()
|
||||
else:
|
||||
audit_events_container.should_be_initial_state()
|
||||
|
||||
# Переход на самую последнюю страницу, возврат на страницу назад, потом на страницу вперед
|
||||
audit_events_container.click_last_page()
|
||||
browser.wait_for_timeout(2000)
|
||||
|
||||
audit_events_container.should_be_final_state()
|
||||
|
||||
last_number = audit_events_container.get_current_data_set_number()
|
||||
|
||||
audit_events_container.click_chevron_left()
|
||||
browser.wait_for_timeout(4000)
|
||||
|
||||
if last_number == 2:
|
||||
audit_events_container.should_be_initial_state()
|
||||
else:
|
||||
audit_events_container.should_be_all_enabled()
|
||||
|
||||
counter = last_number - 1
|
||||
current_number = audit_events_container.get_current_data_set_number()
|
||||
assert current_number == counter, f"Expected page number {counter} is not equal actual {current_number}"
|
||||
|
||||
audit_events_container.click_chevron_right()
|
||||
browser.wait_for_timeout(4000)
|
||||
|
||||
audit_events_container.should_be_final_state()
|
||||
|
||||
current_number = audit_events_container.get_current_data_set_number()
|
||||
assert current_number == last_number, \
|
||||
f"Expected page number {last_number} is not equal actual {current_number}"
|
||||
|
||||
# Переход на первую страницу, переход на следующую страницу, возврат на первую страницу
|
||||
audit_events_container.click_first_page()
|
||||
browser.wait_for_timeout(2000)
|
||||
|
||||
audit_events_container.should_be_initial_state()
|
||||
|
||||
current_number = audit_events_container.get_current_data_set_number()
|
||||
assert current_number == 1, f"Expected page number 1 is not equal actual {current_number}"
|
||||
|
||||
audit_events_container.click_chevron_right()
|
||||
browser.wait_for_timeout(4000)
|
||||
|
||||
if tested_pages == 2:
|
||||
audit_events_container.should_be_final_state()
|
||||
else:
|
||||
audit_events_container.should_be_all_enabled()
|
||||
|
||||
current_number = audit_events_container.get_current_data_set_number()
|
||||
assert current_number == 2, f"Expected page number 2 is not equal actual {current_number}"
|
||||
|
||||
audit_events_container.click_chevron_left()
|
||||
browser.wait_for_timeout(4000)
|
||||
|
||||
audit_events_container.should_be_initial_state()
|
||||
|
||||
current_number = audit_events_container.get_current_data_set_number()
|
||||
assert current_number == 1, f"Expected page number 1 is not equal actual {current_number}"
|
||||
|
||||
if tested_pages > 2:
|
||||
# загрузка страниц от начала и до конца
|
||||
# to_do: проверка, что происходит обновление содержимого таблицы
|
||||
counter = 1
|
||||
|
||||
while counter < tested_pages:
|
||||
audit_events_container.click_chevron_right()
|
||||
counter += 1
|
||||
browser.wait_for_timeout(2000)
|
||||
|
||||
if counter == tested_pages:
|
||||
audit_events_container.should_be_final_state()
|
||||
else:
|
||||
audit_events_container.should_be_all_enabled()
|
||||
current_number = audit_events_container.get_current_data_set_number()
|
||||
assert current_number == counter,\
|
||||
f"Expected page number {counter} is not equal actual {current_number}"
|
||||
|
||||
# загрузка страниц от конца к началу
|
||||
# to_do: проверка, что происходит обновление содержимого таблицы
|
||||
while counter > 2:
|
||||
audit_events_container.click_chevron_left()
|
||||
browser.wait_for_timeout(2000)
|
||||
|
||||
audit_events_container.should_be_all_enabled()
|
||||
|
||||
counter -= 1
|
||||
current_number = audit_events_container.get_current_data_set_number()
|
||||
assert current_number == counter,\
|
||||
f"Expected page number {counter} is not equal actual {current_number}"
|
||||
|
||||
# Проверка возврата к начальному состоянию
|
||||
audit_events_container.click_chevron_left()
|
||||
browser.wait_for_timeout(2000)
|
||||
|
||||
audit_events_container.should_be_initial_state()
|
||||
|
||||
current_number = audit_events_container.get_current_data_set_number()
|
||||
assert current_number == 1, "The first page should be number one"
|
||||
|
|
@ -0,0 +1,308 @@
|
|||
"""Модуль тестов контейнера для отображения событий системного журнала.
|
||||
|
||||
Содержит тесты для проверки функциональности
|
||||
контейнера для отображения событий системного журнала.
|
||||
"""
|
||||
|
||||
import pytest
|
||||
from playwright.sync_api import Page
|
||||
from pages.main_page import MainPage
|
||||
from pages.login_page import LoginPage
|
||||
|
||||
|
||||
# @pytest.mark.smoke
|
||||
class TestEventsTabContainer:
|
||||
"""Класс тестов для проверки контейнера для отображения событий вкладки События панели событий.
|
||||
|
||||
Атрибуты:
|
||||
browser: Фикстура для работы с браузером.
|
||||
"""
|
||||
# @pytest.mark.develop
|
||||
def test_events_tab_content(self, browser: Page) -> None:
|
||||
"""Проверяет содержимое контейнера для отображения событий вкладки События панели событий.
|
||||
|
||||
Args:
|
||||
browser: Экземпляр страницы Playwright.
|
||||
"""
|
||||
|
||||
lp = LoginPage(browser)
|
||||
lp.do_login()
|
||||
|
||||
mp = MainPage(browser)
|
||||
mp.should_be_event_panel()
|
||||
|
||||
events_tab_container = mp.click_events_panel_events_tab()
|
||||
events_tab_container.check_content()
|
||||
|
||||
@pytest.mark.skip(reason="Отсутствуют данные для вывода в таблицу событий")
|
||||
def test_events_table_row_highlighting(self, browser: Page):
|
||||
"""Проверяет выделение строк в таблице событий.
|
||||
|
||||
Args:
|
||||
browser: Экземпляр страницы Playwright.
|
||||
"""
|
||||
|
||||
lp = LoginPage(browser)
|
||||
lp.do_login()
|
||||
|
||||
mp = MainPage(browser)
|
||||
mp.should_be_event_panel()
|
||||
|
||||
events_tab_container = mp.click_events_panel_events_tab()
|
||||
|
||||
# Получение количества строк в таблице
|
||||
rows_count = events_tab_container.get_events_table_rows_count()
|
||||
|
||||
# Проверка выделения строк
|
||||
events_tab_container.check_events_table_row_highlighting(0)
|
||||
events_tab_container.check_events_table_row_highlighting(rows_count - 1)
|
||||
events_tab_container.check_events_table_row_highlighting(int(rows_count / 2))
|
||||
|
||||
@pytest.mark.skip(reason="Отсутствуют данные для вывода в таблицу событий")
|
||||
def test_events_table_scrolling(self, browser: Page):
|
||||
"""Проверяет возможность скроллинга таблицы событий.
|
||||
|
||||
Args:
|
||||
browser: Экземпляр страницы Playwright.
|
||||
"""
|
||||
|
||||
lp = LoginPage(browser)
|
||||
lp.do_login()
|
||||
|
||||
mp = MainPage(browser)
|
||||
mp.should_be_event_panel()
|
||||
|
||||
events_tab_container = mp.click_events_panel_events_tab()
|
||||
|
||||
events_panel_position = mp.get_events_panel_position()
|
||||
|
||||
# Проверка, что панель с таблицей открыта
|
||||
assert events_panel_position != "bottom", "Panel with system log events should be opened"
|
||||
|
||||
is_scrollable = events_tab_container.check_events_table_verticall_scrolling()
|
||||
|
||||
# Убеждаемся, что панель открыта наполовину и проверяем скроллинг
|
||||
assert events_panel_position == "center",\
|
||||
"Panel with system log events should be located on the main page center"
|
||||
assert is_scrollable, "System log events table should be scrollable"
|
||||
|
||||
# Скроллинг вниз
|
||||
events_tab_container.scroll_events_table_down()
|
||||
browser.wait_for_timeout(1000)
|
||||
|
||||
# Проверка видимости последней строки после прокрутки
|
||||
events_tab_container.check_events_table_last_row_visibility()
|
||||
|
||||
# Скроллинг вверх
|
||||
events_tab_container.scroll_events_table_up()
|
||||
browser.wait_for_timeout(1000)
|
||||
|
||||
# Проверка видимости первой строки после прокрутки
|
||||
events_tab_container.check_events_table_first_row_visibility()
|
||||
|
||||
# Раскрываем панель полностью и проверяем скроллинг
|
||||
assert mp.check_expand_more_button(), \
|
||||
"Expand more button should be present"
|
||||
mp.click_events_panel_expand_more_button()
|
||||
mp.wait_for_timeout(500)
|
||||
|
||||
events_panel_position = mp.get_events_panel_position()
|
||||
assert events_panel_position == "top",\
|
||||
"Panel with system log events should be located on the main page top"
|
||||
|
||||
is_scrollable = events_tab_container.check_events_table_verticall_scrolling()
|
||||
assert is_scrollable, "System log events table should be scrollable in the full window"
|
||||
|
||||
# Скроллинг вниз
|
||||
events_tab_container.scroll_events_table_down()
|
||||
browser.wait_for_timeout(1000)
|
||||
|
||||
# Проверка видимости последней строки после прокрутки
|
||||
events_tab_container.check_events_table_last_row_visibility()
|
||||
|
||||
# Скроллинг вверх
|
||||
events_tab_container.scroll_events_table_up()
|
||||
browser.wait_for_timeout(1000)
|
||||
|
||||
# Проверка видимости первой строки после прокрутки
|
||||
events_tab_container.check_events_table_first_row_visibility()
|
||||
|
||||
@pytest.mark.skip(reason="Отсутствуют данные для вывода в таблицу событий")
|
||||
def test_events_table_column_sorting(self, browser: Page):
|
||||
"""Проверяет сортировку колонки 'Время' в таблице событий.
|
||||
|
||||
Args:
|
||||
browser: Экземпляр страницы Playwright.
|
||||
"""
|
||||
|
||||
lp = LoginPage(browser)
|
||||
lp.do_login()
|
||||
|
||||
mp = MainPage(browser)
|
||||
mp.should_be_event_panel()
|
||||
|
||||
events_tab_container = mp.click_events_panel_events_tab()
|
||||
|
||||
index = 0
|
||||
state = events_tab_container.get_arrow_button_state(index)
|
||||
assert state == "down", "Arrow button should be down"
|
||||
|
||||
events_tab_container.click_event_table_header_arrow(index)
|
||||
browser.wait_for_timeout(500)
|
||||
|
||||
state = events_tab_container.get_arrow_button_state(index)
|
||||
assert state == "up", "Arrow button should be up"
|
||||
is_descending_order = events_tab_container.check_events_table_column_descending_order(index,
|
||||
convert2timestamp=True)
|
||||
assert not is_descending_order, "Column data should be in ascending order"
|
||||
|
||||
events_tab_container.click_event_table_header_arrow(index)
|
||||
browser.wait_for_timeout(500)
|
||||
state = events_tab_container.get_arrow_button_state(index)
|
||||
assert state == "down", "Arrow button should be down"
|
||||
is_descending_order = events_tab_container.check_events_table_column_descending_order(index,
|
||||
convert2timestamp=True)
|
||||
assert is_descending_order, "Column data should be in descending order"
|
||||
|
||||
@pytest.mark.skip(reason="Отсутствуют данные для вывода в таблицу событий")
|
||||
def test_events_table_pagination(self, browser: Page):
|
||||
"""Проверяет возможность пагинации таблицы событий.
|
||||
|
||||
Args:
|
||||
browser: Экземпляр страницы Playwright.
|
||||
"""
|
||||
|
||||
lp = LoginPage(browser)
|
||||
lp.do_login()
|
||||
|
||||
mp = MainPage(browser)
|
||||
mp.should_be_event_panel()
|
||||
|
||||
events_tab_container = mp.click_events_panel_events_tab()
|
||||
|
||||
events_tab_container.should_be_pagination_buttons()
|
||||
|
||||
# Проверка начального состояния
|
||||
tested_pages = 1
|
||||
|
||||
# to do: некорректный запрос в бэк, должно быть "filter": {"page": 0}
|
||||
payload = {"table": "syslogs",
|
||||
"filter": {"page": 1},
|
||||
"count": 40
|
||||
}
|
||||
response = mp.send_post_api_request("e-nms/logs_enode", payload)
|
||||
if response.status == 200:
|
||||
response_body = mp.get_response_body(response)
|
||||
|
||||
if response_body:
|
||||
pages = response_body["data"]["pages"]
|
||||
|
||||
if pages > 5:
|
||||
tested_pages = 5
|
||||
else:
|
||||
tested_pages = pages
|
||||
|
||||
current_number = events_tab_container.get_current_data_set_number()
|
||||
assert current_number == 1, "The first page should be number one"
|
||||
|
||||
if tested_pages == 1:
|
||||
events_tab_container.should_be_all_disabled()
|
||||
else:
|
||||
events_tab_container.should_be_initial_state()
|
||||
|
||||
# Переход на самую последнюю страницу, возврат на страницу назад, потом на страницу вперед
|
||||
events_tab_container.click_last_page()
|
||||
browser.wait_for_timeout(2000)
|
||||
|
||||
events_tab_container.should_be_final_state()
|
||||
|
||||
last_number = events_tab_container.get_current_data_set_number()
|
||||
|
||||
events_tab_container.click_chevron_left()
|
||||
browser.wait_for_timeout(4000)
|
||||
|
||||
if last_number == 2:
|
||||
events_tab_container.should_be_initial_state()
|
||||
else:
|
||||
events_tab_container.should_be_all_enabled()
|
||||
|
||||
counter = last_number - 1
|
||||
current_number = events_tab_container.get_current_data_set_number()
|
||||
assert current_number == counter, f"Expected page number {counter} is not equal actual {current_number}"
|
||||
|
||||
events_tab_container.click_chevron_right()
|
||||
browser.wait_for_timeout(4000)
|
||||
|
||||
events_tab_container.should_be_final_state()
|
||||
|
||||
current_number = events_tab_container.get_current_data_set_number()
|
||||
assert current_number == last_number, \
|
||||
f"Expected page number {last_number} is not equal actual {current_number}"
|
||||
|
||||
# Переход на первую страницу, переход на следующую страницу, возврат на первую страницу
|
||||
events_tab_container.click_first_page()
|
||||
browser.wait_for_timeout(2000)
|
||||
|
||||
events_tab_container.should_be_initial_state()
|
||||
|
||||
current_number = events_tab_container.get_current_data_set_number()
|
||||
assert current_number == 1, f"Expected page number 1 is not equal actual {current_number}"
|
||||
|
||||
events_tab_container.click_chevron_right()
|
||||
browser.wait_for_timeout(4000)
|
||||
|
||||
if tested_pages == 2:
|
||||
events_tab_container.should_be_final_state()
|
||||
else:
|
||||
events_tab_container.should_be_all_enabled()
|
||||
|
||||
current_number = events_tab_container.get_current_data_set_number()
|
||||
assert current_number == 2, f"Expected page number 2 is not equal actual {current_number}"
|
||||
|
||||
events_tab_container.click_chevron_left()
|
||||
browser.wait_for_timeout(4000)
|
||||
|
||||
events_tab_container.should_be_initial_state()
|
||||
|
||||
current_number = events_tab_container.get_current_data_set_number()
|
||||
assert current_number == 1, f"Expected page number 1 is not equal actual {current_number}"
|
||||
|
||||
if tested_pages > 2:
|
||||
# загрузка страниц от начала и до конца
|
||||
# to_do: проверка, что происходит обновление содержимого таблицы
|
||||
counter = 1
|
||||
|
||||
while counter < tested_pages:
|
||||
events_tab_container.click_chevron_right()
|
||||
counter += 1
|
||||
browser.wait_for_timeout(2000)
|
||||
|
||||
if counter == tested_pages:
|
||||
events_tab_container.should_be_final_state()
|
||||
else:
|
||||
events_tab_container.should_be_all_enabled()
|
||||
current_number = events_tab_container.get_current_data_set_number()
|
||||
assert current_number == counter,\
|
||||
f"Expected page number {counter} is not equal actual {current_number}"
|
||||
|
||||
# загрузка страниц от конца к началу
|
||||
# to_do: проверка, что происходит обновление содержимого таблицы
|
||||
while counter > 2:
|
||||
events_tab_container.click_chevron_left()
|
||||
browser.wait_for_timeout(2000)
|
||||
|
||||
events_tab_container.should_be_all_enabled()
|
||||
|
||||
counter -= 1
|
||||
current_number = events_tab_container.get_current_data_set_number()
|
||||
assert current_number == counter,\
|
||||
f"Expected page number {counter} is not equal actual {current_number}"
|
||||
|
||||
# Проверка возврата к начальному состоянию
|
||||
events_tab_container.click_chevron_left()
|
||||
browser.wait_for_timeout(2000)
|
||||
|
||||
events_tab_container.should_be_initial_state()
|
||||
|
||||
current_number = events_tab_container.get_current_data_set_number()
|
||||
assert current_number == 1, "The first page should be number one"
|
||||
|
|
@ -0,0 +1,309 @@
|
|||
"""Модуль тестов контейнера для отображения событий обслуживания.
|
||||
|
||||
Содержит тесты для проверки функциональности
|
||||
контейнера для отображения событий обслуживания.
|
||||
"""
|
||||
|
||||
import pytest
|
||||
from playwright.sync_api import Page
|
||||
from pages.main_page import MainPage
|
||||
from pages.login_page import LoginPage
|
||||
|
||||
|
||||
# @pytest.mark.smoke
|
||||
class TestMaintenanceEventsContainer:
|
||||
"""Класс тестов для проверки контейнера для отображения событий обслуживания.
|
||||
|
||||
Атрибуты:
|
||||
browser: Фикстура для работы с браузером.
|
||||
"""
|
||||
# @pytest.mark.develop
|
||||
def test_events_tab_content(self, browser: Page) -> None:
|
||||
"""Проверяет содержимое контейнера для отображения событий обслуживания.
|
||||
|
||||
Args:
|
||||
browser: Экземпляр страницы Playwright.
|
||||
"""
|
||||
|
||||
lp = LoginPage(browser)
|
||||
lp.do_login()
|
||||
|
||||
mp = MainPage(browser)
|
||||
mp.should_be_event_panel()
|
||||
|
||||
maintenance_events_container = mp.click_events_panel_maintenance_tab()
|
||||
maintenance_events_container.check_content()
|
||||
|
||||
@pytest.mark.skip(reason="Отсутствуют данные для вывода в таблицу событий")
|
||||
def test_events_table_row_highlighting(self, browser: Page):
|
||||
"""Проверяет выделение строк в таблице событий.
|
||||
|
||||
Args:
|
||||
browser: Экземпляр страницы Playwright.
|
||||
"""
|
||||
|
||||
lp = LoginPage(browser)
|
||||
lp.do_login()
|
||||
|
||||
mp = MainPage(browser)
|
||||
mp.should_be_event_panel()
|
||||
|
||||
maintenance_events_container = mp.click_events_panel_maintenance_tab()
|
||||
|
||||
# Получение количества строк в таблице
|
||||
rows_count = maintenance_events_container.get_events_table_rows_count()
|
||||
|
||||
# Проверка выделения строк
|
||||
maintenance_events_container.check_events_table_row_highlighting(0)
|
||||
maintenance_events_container.check_events_table_row_highlighting(rows_count - 1)
|
||||
maintenance_events_container.check_events_table_row_highlighting(int(rows_count / 2))
|
||||
|
||||
@pytest.mark.skip(reason="Отсутствуют данные для вывода в таблицу событий")
|
||||
def test_events_table_scrolling(self, browser: Page):
|
||||
"""Проверяет возможность скроллинга таблицы событий.
|
||||
|
||||
Args:
|
||||
browser: Экземпляр страницы Playwright.
|
||||
"""
|
||||
|
||||
lp = LoginPage(browser)
|
||||
lp.do_login()
|
||||
|
||||
mp = MainPage(browser)
|
||||
mp.should_be_event_panel()
|
||||
|
||||
maintenance_events_container = mp.click_events_panel_maintenance_tab()
|
||||
|
||||
events_panel_position = mp.get_events_panel_position()
|
||||
|
||||
# Проверка, что панель с таблицей открыта
|
||||
assert events_panel_position != "bottom", "Panel with system log events should be opened"
|
||||
|
||||
is_scrollable = maintenance_events_container.check_events_table_verticall_scrolling()
|
||||
|
||||
# Убеждаемся, что панель открыта наполовину и проверяем скроллинг
|
||||
assert events_panel_position == "center",\
|
||||
"Panel with system log events should be located on the main page center"
|
||||
assert is_scrollable, "System log events table should be scrollable"
|
||||
|
||||
# Скроллинг вниз
|
||||
maintenance_events_container.scroll_events_table_down()
|
||||
browser.wait_for_timeout(1000)
|
||||
|
||||
# Проверка видимости последней строки после прокрутки
|
||||
maintenance_events_container.check_events_table_last_row_visibility()
|
||||
|
||||
# Скроллинг вверх
|
||||
maintenance_events_container.scroll_events_table_up()
|
||||
browser.wait_for_timeout(1000)
|
||||
|
||||
# Проверка видимости первой строки после прокрутки
|
||||
maintenance_events_container.check_events_table_first_row_visibility()
|
||||
|
||||
# Раскрываем панель полностью и проверяем скроллинг
|
||||
assert mp.check_expand_more_button(), \
|
||||
"Expand more button should be present"
|
||||
mp.click_events_panel_expand_more_button()
|
||||
mp.wait_for_timeout(500)
|
||||
|
||||
events_panel_position = mp.get_events_panel_position()
|
||||
assert events_panel_position == "top",\
|
||||
"Panel with system log events should be located on the main page top"
|
||||
|
||||
is_scrollable = maintenance_events_container.check_events_table_verticall_scrolling()
|
||||
assert is_scrollable, "System log events table should be scrollable in the full window"
|
||||
|
||||
# Скроллинг вниз
|
||||
maintenance_events_container.scroll_events_table_down()
|
||||
browser.wait_for_timeout(1000)
|
||||
|
||||
# Проверка видимости последней строки после прокрутки
|
||||
maintenance_events_container.check_events_table_last_row_visibility()
|
||||
|
||||
# Скроллинг вверх
|
||||
maintenance_events_container.scroll_events_table_up()
|
||||
browser.wait_for_timeout(1000)
|
||||
|
||||
# Проверка видимости первой строки после прокрутки
|
||||
maintenance_events_container.check_events_table_first_row_visibility()
|
||||
|
||||
@pytest.mark.skip(reason="Отсутствуют данные для вывода в таблицу событий")
|
||||
def test_events_table_column_sorting(self, browser: Page):
|
||||
"""Проверяет сортировку колонки 'Время' в таблице событий.
|
||||
|
||||
Args:
|
||||
browser: Экземпляр страницы Playwright.
|
||||
"""
|
||||
|
||||
lp = LoginPage(browser)
|
||||
lp.do_login()
|
||||
|
||||
mp = MainPage(browser)
|
||||
mp.should_be_event_panel()
|
||||
|
||||
maintenance_events_container = mp.click_events_panel_maintenance_tab()
|
||||
|
||||
index = 0
|
||||
state = maintenance_events_container.get_arrow_button_state(index)
|
||||
assert state == "down", "Arrow button should be down"
|
||||
|
||||
maintenance_events_container.click_event_table_header_arrow(index)
|
||||
browser.wait_for_timeout(500)
|
||||
|
||||
state = maintenance_events_container.get_arrow_button_state(index)
|
||||
assert state == "up", "Arrow button should be up"
|
||||
is_descending_order = maintenance_events_container.check_events_table_column_descending_order(index,
|
||||
convert2timestamp=True)
|
||||
assert not is_descending_order, "Column data should be in ascending order"
|
||||
|
||||
maintenance_events_container.click_event_table_header_arrow(index)
|
||||
browser.wait_for_timeout(500)
|
||||
state = maintenance_events_container.get_arrow_button_state(index)
|
||||
assert state == "down", "Arrow button should be down"
|
||||
is_descending_order = maintenance_events_container.check_events_table_column_descending_order(index,
|
||||
convert2timestamp=True)
|
||||
assert is_descending_order, "Column data should be in descending order"
|
||||
|
||||
@pytest.mark.skip(reason="Отсутствуют данные для вывода в таблицу событий")
|
||||
def test_events_table_pagination(self, browser: Page):
|
||||
"""Проверяет возможность пагинации таблицы событий.
|
||||
|
||||
Args:
|
||||
browser: Экземпляр страницы Playwright.
|
||||
"""
|
||||
|
||||
lp = LoginPage(browser)
|
||||
lp.do_login()
|
||||
|
||||
mp = MainPage(browser)
|
||||
mp.should_be_event_panel()
|
||||
|
||||
maintenance_events_container = mp.click_events_panel_maintenance_tab()
|
||||
|
||||
maintenance_events_container.should_be_pagination_buttons()
|
||||
|
||||
# Проверка начального состояния
|
||||
tested_pages = 1
|
||||
|
||||
# to do: некорректный запрос в бэк, должно быть "filter": {"page": 0}
|
||||
payload = {"id": [ "/physical"],
|
||||
"notNull": True,
|
||||
"data": {"links": {"flatten": True}},
|
||||
"reducer": "events"
|
||||
}
|
||||
response = mp.send_post_api_request("e-cmdb/api/query", payload)
|
||||
if response.status == 200:
|
||||
response_body = mp.get_response_body(response)
|
||||
|
||||
if response_body:
|
||||
pages = response_body["data"]["pages"]
|
||||
|
||||
if pages > 5:
|
||||
tested_pages = 5
|
||||
else:
|
||||
tested_pages = pages
|
||||
|
||||
current_number = maintenance_events_container.get_current_data_set_number()
|
||||
assert current_number == 1, "The first page should be number one"
|
||||
|
||||
if tested_pages == 1:
|
||||
maintenance_events_container.should_be_all_disabled()
|
||||
else:
|
||||
maintenance_events_container.should_be_initial_state()
|
||||
|
||||
# Переход на самую последнюю страницу, возврат на страницу назад, потом на страницу вперед
|
||||
maintenance_events_container.click_last_page()
|
||||
browser.wait_for_timeout(2000)
|
||||
|
||||
maintenance_events_container.should_be_final_state()
|
||||
|
||||
last_number = maintenance_events_container.get_current_data_set_number()
|
||||
|
||||
maintenance_events_container.click_chevron_left()
|
||||
browser.wait_for_timeout(4000)
|
||||
|
||||
if last_number == 2:
|
||||
maintenance_events_container.should_be_initial_state()
|
||||
else:
|
||||
maintenance_events_container.should_be_all_enabled()
|
||||
|
||||
counter = last_number - 1
|
||||
current_number = maintenance_events_container.get_current_data_set_number()
|
||||
assert current_number == counter, f"Expected page number {counter} is not equal actual {current_number}"
|
||||
|
||||
maintenance_events_container.click_chevron_right()
|
||||
browser.wait_for_timeout(4000)
|
||||
|
||||
maintenance_events_container.should_be_final_state()
|
||||
|
||||
current_number = maintenance_events_container.get_current_data_set_number()
|
||||
assert current_number == last_number, \
|
||||
f"Expected page number {last_number} is not equal actual {current_number}"
|
||||
|
||||
# Переход на первую страницу, переход на следующую страницу, возврат на первую страницу
|
||||
maintenance_events_container.click_first_page()
|
||||
browser.wait_for_timeout(2000)
|
||||
|
||||
maintenance_events_container.should_be_initial_state()
|
||||
|
||||
current_number = maintenance_events_container.get_current_data_set_number()
|
||||
assert current_number == 1, f"Expected page number 1 is not equal actual {current_number}"
|
||||
|
||||
maintenance_events_container.click_chevron_right()
|
||||
browser.wait_for_timeout(4000)
|
||||
|
||||
if tested_pages == 2:
|
||||
maintenance_events_container.should_be_final_state()
|
||||
else:
|
||||
maintenance_events_container.should_be_all_enabled()
|
||||
|
||||
current_number = maintenance_events_container.get_current_data_set_number()
|
||||
assert current_number == 2, f"Expected page number 2 is not equal actual {current_number}"
|
||||
|
||||
maintenance_events_container.click_chevron_left()
|
||||
browser.wait_for_timeout(4000)
|
||||
|
||||
maintenance_events_container.should_be_initial_state()
|
||||
|
||||
current_number = maintenance_events_container.get_current_data_set_number()
|
||||
assert current_number == 1, f"Expected page number 1 is not equal actual {current_number}"
|
||||
|
||||
if tested_pages > 2:
|
||||
# загрузка страниц от начала и до конца
|
||||
# to_do: проверка, что происходит обновление содержимого таблицы
|
||||
counter = 1
|
||||
|
||||
while counter < tested_pages:
|
||||
maintenance_events_container.click_chevron_right()
|
||||
counter += 1
|
||||
browser.wait_for_timeout(2000)
|
||||
|
||||
if counter == tested_pages:
|
||||
maintenance_events_container.should_be_final_state()
|
||||
else:
|
||||
maintenance_events_container.should_be_all_enabled()
|
||||
current_number = maintenance_events_container.get_current_data_set_number()
|
||||
assert current_number == counter,\
|
||||
f"Expected page number {counter} is not equal actual {current_number}"
|
||||
|
||||
# загрузка страниц от конца к началу
|
||||
# to_do: проверка, что происходит обновление содержимого таблицы
|
||||
while counter > 2:
|
||||
maintenance_events_container.click_chevron_left()
|
||||
browser.wait_for_timeout(2000)
|
||||
|
||||
maintenance_events_container.should_be_all_enabled()
|
||||
|
||||
counter -= 1
|
||||
current_number = maintenance_events_container.get_current_data_set_number()
|
||||
assert current_number == counter,\
|
||||
f"Expected page number {counter} is not equal actual {current_number}"
|
||||
|
||||
# Проверка возврата к начальному состоянию
|
||||
maintenance_events_container.click_chevron_left()
|
||||
browser.wait_for_timeout(2000)
|
||||
|
||||
maintenance_events_container.should_be_initial_state()
|
||||
|
||||
current_number = maintenance_events_container.get_current_data_set_number()
|
||||
assert current_number == 1, "The first page should be number one"
|
||||
|
|
@ -4,7 +4,7 @@
|
|||
контейнера для отображения событий системного журнала.
|
||||
"""
|
||||
|
||||
# import pytest
|
||||
import pytest
|
||||
from playwright.sync_api import Page
|
||||
from pages.main_page import MainPage
|
||||
from pages.login_page import LoginPage
|
||||
|
|
@ -20,7 +20,7 @@ class TestSystemLogEventsContainer:
|
|||
Атрибуты:
|
||||
browser: Фикстура для работы с браузером.
|
||||
"""
|
||||
# @pytest.mark.develop
|
||||
@pytest.mark.develop
|
||||
def test_system_log_events_content(self, browser: Page) -> None:
|
||||
"""Проверяет содержимое контейнера для отображения событий системного журнала.
|
||||
|
||||
Loading…
Reference in New Issue