Актуализация тестов панели событий после изменения UI в версии 1.25

ra2/create_element_rack
nsubbot 2025-12-17 14:54:07 +03:00
parent 453d6a5ec2
commit a6b0347c78
8 changed files with 165 additions and 146 deletions

View File

@ -25,43 +25,46 @@ class EventPanelComponent(BaseComponent):
super().__init__(page) super().__init__(page)
self.states_tab = TabButton(page, self.page.locator(EventPanelLocators.TAB_STATES), "states_tab") self.expand_less_button = Button(page,
self.actions_tab = TabButton(page, self.page.locator(EventPanelLocators.TAB_ACTIONS), "actions_tab") page. locator(EventPanelLocators.BUTTON_EXPAND_LESS),
self.events_tab = TabButton(page, self.page.locator(EventPanelLocators.TAB_EVENTS), "events_tab") "expand_less_button")
self.expand_more_button = Button(page,
page. locator(EventPanelLocators.BUTTON_EXPAND_MORE),
"expand_more_button")
self.states_tab = TabButton(page, page.locator(EventPanelLocators.TAB_STATES), "states_tab")
self.actions_tab = TabButton(page, page.locator(EventPanelLocators.TAB_ACTIONS), "actions_tab")
self.events_tab = TabButton(page, page.locator(EventPanelLocators.TAB_EVENTS), "events_tab")
self.maintenance_tab = TabButton(page, self.maintenance_tab = TabButton(page,
self.page.locator(EventPanelLocators.TAB_MAINTENANCE), "maintenance_tab") page.locator(EventPanelLocators.TAB_MAINTENANCE), "maintenance_tab")
self.system_log_tab = TabButton(page, self.page.locator(EventPanelLocators.TAB_SYSTEM_LOG), "system_log_tab") self.system_log_tab = TabButton(page, page.locator(EventPanelLocators.TAB_SYSTEM_LOG), "system_log_tab")
self.audit_tab = TabButton(page, page.locator(EventPanelLocators.TAB_AUDIT), "audit_tab")
self.unknown_reason_button = TooltipButton(page, self.unknown_reason_button = TooltipButton(page,
self.page.locator(EventPanelLocators.BUTTONS_EVENT).nth(0), page.locator(EventPanelLocators.BUTTONS_EVENT).nth(0),
"unknown_reason_button") "unknown_reason_button")
self.warning_button = TooltipButton(page, self.warning_button = TooltipButton(page,
self.page.locator(EventPanelLocators.BUTTONS_EVENT).nth(1), page.locator(EventPanelLocators.BUTTONS_EVENT).nth(1),
"warning_button") "warning_button")
self.damage_button = TooltipButton(page, self.damage_button = TooltipButton(page,
self.page.locator(EventPanelLocators.BUTTONS_EVENT).nth(2), page.locator(EventPanelLocators.BUTTONS_EVENT).nth(2),
"damage_button") "damage_button")
self.failure_button = TooltipButton(page, self.failure_button = TooltipButton(page,
self.page.locator(EventPanelLocators.BUTTONS_EVENT).nth(3), page.locator(EventPanelLocators.BUTTONS_EVENT).nth(3),
"failure_button") "failure_button")
user_button_locator = self.page.locator(EventPanelLocators.BUTTONS_SERVICE).get_by_role("button") self.user_button = Button(page, page.locator(EventPanelLocators.BUTTON_USER), "user_button")
self.user_button = Button(page, user_button_locator, "user_button")
# Действия: # Действия:
def click_expand_less_button(self) -> None: def click_expand_less_button(self) -> None:
"""Выполняет нажатие кнопки галочка вверх.""" """Выполняет нажатие кнопки галочка вверх."""
button_locator = self.page.locator(EventPanelLocators.TAB_EXPAND_BUTTONS).\ self.expand_less_button.click()
get_by_role("button").filter(has_text='expand_less')
button_locator.click()
def click_expand_more_button(self) -> None: def click_expand_more_button(self) -> None:
"""Выполняет нажатие кнопки галочка вниз.""" """Выполняет нажатие кнопки галочка вниз."""
button_locator = self.page.locator(EventPanelLocators.TAB_EXPAND_BUTTONS).\ self.expand_more_button.click()
get_by_role("button").filter(has_text='expand_more')
button_locator.click(force=True)
def click_system_log_tab(self) -> SystemLogEventsContainer: def click_system_log_tab(self) -> SystemLogEventsContainer:
"""Выполняет нажатие tab-кнопки Системный журнал.""" """Выполняет нажатие tab-кнопки Системный журнал."""
@ -128,21 +131,19 @@ class EventPanelComponent(BaseComponent):
# Проверки: # Проверки:
def check_expand_less_button(self) -> bool: def check_expand_less_button(self) -> bool:
"""Проверяет наличие кнопки галочка вверх.""" """Проверяет наличие кнопки галочка вниз."""
try: try:
_ = self.page.locator(EventPanelLocators.TAB_EXPAND_BUTTONS).\ _ = self.page.locator(EventPanelLocators.BUTTON_EXPAND_LESS)
get_by_role("button").filter(has_text='expand_less')
except TimeoutError: except TimeoutError:
return False return False
return True return True
def check_expand_more_button(self) -> bool: def check_expand_more_button(self) -> bool:
"""Проверяет наличие кнопки галочка вниз""" """Проверяет наличие кнопки галочка вверх"""
try: try:
_ = self.page.locator(EventPanelLocators.TAB_EXPAND_BUTTONS).\ _ = self.page.locator(EventPanelLocators.BUTTON_EXPAND_MORE)
get_by_role("button").filter(has_text='expand_more')
except TimeoutError: except TimeoutError:
return False return False
return True return True
@ -153,7 +154,7 @@ class EventPanelComponent(BaseComponent):
self.user_button.check_visibility("User button is missing on event panel") self.user_button.check_visibility("User button is missing on event panel")
def should_be_tab_buttons(self) -> None: def should_be_tab_buttons(self) -> None:
"""Проверяет наличие блока tab-кнопок Состояния, Действия, События, Обслуживание, Системный журнал.""" """Проверяет наличие блока tab-кнопок Состояния, Действия, События, Обслуживание, Системный журнал, Аудит."""
self.states_tab.check_have_text('Состояния', "Tab button with text Состояния is missing on event panel") self.states_tab.check_have_text('Состояния', "Tab button with text Состояния is missing on event panel")
self.actions_tab.check_have_text('Действия',"Tab button with text Действия is missing on event panel") self.actions_tab.check_have_text('Действия',"Tab button with text Действия is missing on event panel")
@ -162,6 +163,8 @@ class EventPanelComponent(BaseComponent):
"Tab button with text Обслуживание is missing on event panel") "Tab button with text Обслуживание is missing on event panel")
self.system_log_tab.check_have_text('Системный журнал', self.system_log_tab.check_have_text('Системный журнал',
"Tab button with text Системный журнал is missing on event panel") "Tab button with text Системный журнал is missing on event panel")
self.audit_tab.check_have_text('Аудит',
"Tab button with text Аудит is missing on event panel")
def should_be_event_buttons(self) -> None: def should_be_event_buttons(self) -> None:
"""Проверяет наличие блока кнопок-счетчиков событий.""" """Проверяет наличие блока кнопок-счетчиков событий."""

View File

@ -1,13 +1,13 @@
"""Модуль компонента контейнера с перечнем событий. Содержит класс для работы с контейнерами, """Модуль компонента контейнера с перечнем событий. Содержит класс для работы с контейнерами,
их элементами и проверками.""" их элементами и проверками."""
from playwright.sync_api import Page, Locator from playwright.sync_api import Page, Locator, expect
from tools.logger import get_logger from tools.logger import get_logger
from locators.toolbar_locators import ToolbarLocators from locators.event_panel_locators import EventPanelLocators
from elements.tooltip_button_element import TooltipButton from elements.tooltip_button_element import TooltipButton
from elements.tab_button_element import TabButton from elements.tab_button_element import TabButton
from elements.button_element import Button from elements.button_element import Button
from components_derived.sidebar_filter_component import SidebarFilterComponent from components_derived.events_filter_panel import EventsFilterPanel
from components.toolbar_component import ToolbarComponent from components.toolbar_component import ToolbarComponent
from components.table_component import TableComponent from components.table_component import TableComponent
from components.base_component import BaseComponent from components.base_component import BaseComponent
@ -32,18 +32,11 @@ class EventsContainerComponent(BaseComponent):
# тулбар # тулбар
self.toolbar = ToolbarComponent(page, "") self.toolbar = ToolbarComponent(page, "")
filter_button_locator = self.container_locator.locator(ToolbarLocators.TITLE).\ self.toolbar_locator = EventPanelLocators.TOOLBAR
get_by_role("button")
self.toolbar.add_button(filter_button_locator, "filter_button")
export_buttons = self.container_locator.locator(ToolbarLocators.ITEMS).\
get_by_role("button").all()
self.toolbar.add_tooltip_button(export_buttons[1], "export_to_csv_button")
self.toolbar.add_tooltip_button(export_buttons[0], "export_to_pdf_button")
# Таблица событий # Таблица событий
self.events_table = TableComponent(page) self.events_table = TableComponent(page)
self.table_locator = "//div[@class='scrolltable']/div/table" self.table_locator = EventPanelLocators.TABLE
# Кнопки пагинации в нижней части контейнера # Кнопки пагинации в нижней части контейнера
self.chevron_left = Button(page, self.chevron_left = Button(page,
@ -64,16 +57,21 @@ class EventsContainerComponent(BaseComponent):
locator("xpath=..").get_by_role("button").nth(2) locator("xpath=..").get_by_role("button").nth(2)
self.data_set_number = Button(page, loc, "data_set_number") self.data_set_number = Button(page, loc, "data_set_number")
self.sidebar_filter_locator = self.container_locator.locator("//aside//div[@class='scrollarea__container']") self.events_filter = EventsFilterPanel(self.page)
self.sidebar_filter = SidebarFilterComponent(self.page,
self.sidebar_filter_locator)
# Действия: # Действия:
def add_tab_to_toolbar(self, locator: str | Locator, name: str) -> None: def add_tab_to_toolbar(self, locator: str | Locator, name: str) -> None:
"""Добавление кнопки типа v-tabs к тулбару""" """Добавление кнопки типа v-tabs к тулбару"""
tabs_locator = self.get_locator(locator) tab_locator = self.get_locator(locator)
self.toolbar.add_tab_button(self.container_locator.locator(tabs_locator), name) self.toolbar.add_tab_button(tab_locator, name)
def click_tab_button(self, name: str) -> None:
"""Нажатие tab кнопки на тулбаре"""
tab_button = self.toolbar.get_button_by_name(name)
assert tab_button, f"Try to click unexisted button {name}"
tab_button.click()
def click_chevron_left(self) -> None: def click_chevron_left(self) -> None:
"""Нажатие кнопки получения предыдущего набора данных""" """Нажатие кнопки получения предыдущего набора данных"""
@ -95,13 +93,13 @@ class EventsContainerComponent(BaseComponent):
self.last_page.click() self.last_page.click()
def click_filter_button(self) -> SidebarFilterComponent: def click_filter_button(self) -> EventsFilterPanel:
"""Нажатие кнопки перехода на первую сраницу""" """Нажатие кнопки перехода на первую сраницу"""
self.toolbar.click_button("filter_button") self.toolbar.click_button("filter_button")
self.sidebar_filter.check_visibility(self.sidebar_filter_locator, expect(self.page.locator("div.menuable__content__active")).to_be_visible(), "Events filter is missing"
"Filter sidebar is missing")
return self.sidebar_filter return self.events_filter
def click_event_table_header_arrow(self, index: int) -> None: def click_event_table_header_arrow(self, index: int) -> None:
""" Нажатие кнопки-стрелочки вверх/вниз в ячейке заголовка таблицы """ Нажатие кнопки-стрелочки вверх/вниз в ячейке заголовка таблицы
@ -157,10 +155,10 @@ class EventsContainerComponent(BaseComponent):
loc = self.container_locator.locator(self.table_locator) loc = self.container_locator.locator(self.table_locator)
return self.events_table.get_rows_count(loc) return self.events_table.get_rows_count(loc)
def get_sidebar_filter(self) -> SidebarFilterComponent: def get_events_filter(self) -> EventsFilterPanel:
"""Возвращает боковую панель фильтрации.""" """Возвращает панель фильтрации."""
return self.sidebar_filter return self.events_filter
def get_toolbar_filter_button(self) -> Button: def get_toolbar_filter_button(self) -> Button:
"""Возвращает кнопку фильтрации.""" """Возвращает кнопку фильтрации."""
@ -279,6 +277,21 @@ class EventsContainerComponent(BaseComponent):
return self.last_page.is_disabled() return self.last_page.is_disabled()
def is_tab_active(self, name: str) -> bool:
"""Проверка является ли tab-button активным"""
tab_button = self.toolbar.get_button_by_name(name)
assert tab_button, f"Try to find unexisted button {name}"
tab_button_locator = tab_button.get_locator()
is_active = True
attr = tab_button_locator.locator("../..").get_attribute("class")
if attr.find("active") == -1:
is_active = False
return is_active
def should_be_all_disabled(self) -> None: def should_be_all_disabled(self) -> None:
"""Проверка видимости кнопок пагинации: все кнопки disabled""" """Проверка видимости кнопок пагинации: все кнопки disabled"""
@ -355,19 +368,9 @@ class EventsContainerComponent(BaseComponent):
def should_be_toolbar(self) -> None: def should_be_toolbar(self) -> None:
"""Проверка наличия тулбара""" """Проверка наличия тулбара"""
loc = self.container_locator.locator("//nav[contains(@class, 'v-toolbar')]").nth(0) loc = self.container_locator.locator(self.toolbar_locator)
self.toolbar.check_toolbar_presence_by_locator(loc, "Toolbar is missing") self.toolbar.check_toolbar_presence_by_locator(loc, "Toolbar is missing")
def should_be_base_toolbar_buttons(self) -> None:
"""Проверяет наличие и видимость базовых кнопок тулбара."""
self.toolbar.check_button_visibility("filter_button")
self.toolbar.check_button_visibility("export_to_pdf_button")
self.toolbar.check_button_tooltip("export_to_pdf_button", "Скачать в формате PDF")
self.toolbar.check_button_visibility("export_to_csv_button")
self.toolbar.check_button_tooltip("export_to_csv_button", "Скачать в формате CSV")
def should_be_pagination_buttons(self) -> None: def should_be_pagination_buttons(self) -> None:
"""Проверяет наличие и видимость кнопок пагинации.""" """Проверяет наличие и видимость кнопок пагинации."""

View File

@ -6,7 +6,7 @@
from playwright.sync_api import Page, Locator from playwright.sync_api import Page, Locator
from tools.logger import get_logger from tools.logger import get_logger
from locators.toolbar_locators import ToolbarLocators from locators.event_panel_locators import EventPanelLocators
from components.events_container_component import EventsContainerComponent from components.events_container_component import EventsContainerComponent
logger = get_logger("SYSTEM_LOG_EVENTS_CONTAINER") logger = get_logger("SYSTEM_LOG_EVENTS_CONTAINER")
@ -28,12 +28,17 @@ class SystemLogEventsContainer(EventsContainerComponent):
super().__init__(page, locator) super().__init__(page, locator)
self.add_tab_to_toolbar(ToolbarLocators.TABS, "events") toolbar_locator = self.get_locator(locator).locator(EventPanelLocators.TOOLBAR)
sidebar_filter = self.get_sidebar_filter() self.add_tab_to_toolbar(toolbar_locator.locator(EventPanelLocators.FILTER_TOOLBAR_BUTTON), "filter_button")
sidebar_filter.add_filtering_parameter("filter_type", "Тип") self.add_tab_to_toolbar(toolbar_locator.locator(EventPanelLocators.EVENTS_TOOLBAR_BUTTON), "view_events_button")
sidebar_filter.add_filtering_parameter("filter_strictness", "Критичность") self.add_tab_to_toolbar(toolbar_locator.locator(EventPanelLocators.PDF_TOOLBAR_BUTTON), "export_to_pdf_button")
sidebar_filter.add_filtering_parameter("filter_host", "Объект") 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", "Объект")
# Действия: # Действия:
# Проверки: # Проверки:
@ -43,11 +48,11 @@ class SystemLogEventsContainer(EventsContainerComponent):
expected_headers = ['ТИП', 'ВРЕМЯ', 'КРИТИЧНОСТЬ', 'ОБЪЕКТ', 'ОПИСАНИЕ'] expected_headers = ['ТИП', 'ВРЕМЯ', 'КРИТИЧНОСТЬ', 'ОБЪЕКТ', 'ОПИСАНИЕ']
self.should_be_toolbar() self.should_be_toolbar()
self.should_be_base_toolbar_buttons() self.should_be_toolbar_buttons()
events_tab = self.get_toolbar_tab_button("events") if not self.is_tab_active("view_events_button"):
events_tab_text = events_tab.get_text(0) self.click_tab_button("view_events_button")
assert events_tab_text.find("События") != -1, "Tab button with text События is missing on toolbar" self.wait_for_timeout(1000)
self.should_be_events_table() self.should_be_events_table()
events_table = self.get_events_table_content() events_table = self.get_events_table_content()
@ -62,17 +67,25 @@ class SystemLogEventsContainer(EventsContainerComponent):
self.should_be_pagination_buttons() self.should_be_pagination_buttons()
sidebar_filter = self.click_filter_button() events_filter = self.click_filter_button()
sidebar_filter.check_content() events_filter.check_content()
filter_type_bar = sidebar_filter.get_filtering_parameter("filter_type") filter_type_bar = events_filter.get_filtering_parameter("filter_type")
filter_type_title = filter_type_bar.get_selection_bar_title() filter_type_title = filter_type_bar.get_selection_bar_title()
assert filter_type_title == "Тип", "Filtering parameter bar 'Тип' is missing" assert filter_type_title == "Тип", "Filtering parameter bar 'Тип' is missing"
filter_strictness_bar = sidebar_filter.get_filtering_parameter("filter_strictness") filter_strictness_bar = events_filter.get_filtering_parameter("filter_strictness")
filter_strictness_title = filter_strictness_bar.get_selection_bar_title() filter_strictness_title = filter_strictness_bar.get_selection_bar_title()
assert filter_strictness_title == "Критичность", "Filtering parameter bar 'Критичность' is missing" assert filter_strictness_title == "Критичность", "Filtering parameter bar 'Критичность' is missing"
filter_host_bar = sidebar_filter.get_filtering_parameter("filter_host") filter_object_bar = events_filter.get_filtering_parameter("filter_object")
filter_host_title = filter_host_bar.get_selection_bar_title() filter_object_title = filter_object_bar.get_selection_bar_title()
assert filter_host_title == "Объект", "Filtering parameter bar 'Объект' is missing" 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")

View File

@ -1,59 +1,52 @@
"""Модуль компонента боковой панели формы ввода полей фильтрации отображения данных в панели событий. Содержит класс """Модуль панели формы ввода полей фильтрации отображения данных в панели событий. Содержит класс
для работы с формами ввода, их элементами и проверками.""" для работы с формами ввода, их элементами и проверками."""
from playwright.sync_api import Page, Locator from playwright.sync_api import Page, Locator
from tools.logger import get_logger from tools.logger import get_logger
from elements.button_element import Button from elements.button_element import Button
from components.toolbar_component import ToolbarComponent
from components.base_component import BaseComponent from components.base_component import BaseComponent
from components_derived.selection_bar_component import SelectionBarComponent from components_derived.selection_bar_component import SelectionBarComponent
from components_derived.date_input_component import DateInput from components_derived.date_input_component import DateInput
logger = get_logger("SIDEBAR_FILTER") logger = get_logger("EVENTS_FILTER_PANEL")
class SidebarFilterComponent(BaseComponent): class EventsFilterPanel(BaseComponent):
"""Компонент боковой панели формы ввода полей фильтрации отображения данных в панели событий. Предоставляет методы """Панель формы ввода полей фильтрации отображения данных в панели событий. Предоставляет методы
для взаимодействия с формой, ее содержимым и проверок.""" для взаимодействия с формой, ее содержимым и проверок."""
def __init__(self, page: Page, locator: str | Locator): def __init__(self, page: Page):
"""Инициализирует компонент боковой панели формы ввода параметров фильтрации. """Инициализирует компонент модального окна формы ввода параметров фильтрации.
Args: Args:
page: Экземпляр страницы Playwright page: Экземпляр страницы Playwright
locator: Локатор контейнера (строка или объект Locator) для которого вызывается панель
""" """
super().__init__(page) super().__init__(page)
self.sidebar_locator = self.get_locator(locator) self.events_filter_locator = self.page.locator("div.menuable__content__active div.scrollarea__body")
self.toolbar = ToolbarComponent(page, "Настройки и параметры")
# Поля ввода даты начала и даты окончания события # Поля ввода даты начала и даты окончания события
self.start_time_filter = DateInput(page, loc = self.page.locator("div.menuable__content__active div.scrollarea__body").locator("//div/div").nth(0)
self.sidebar_locator.locator( self.start_time_filter = DateInput(page, loc)
"//div[contains(@class, 'scrollarea__body')]/div").nth(0)) loc = self.page.locator("div.menuable__content__active div.scrollarea__body > div > div:nth-child(3)")
self.finish_time_filter = DateInput(page, self.finish_time_filter = DateInput(page, loc)
self.sidebar_locator.locator(
"//div[contains(@class, 'scrollarea__body')]/div").nth(1))
# Поля задания параметров фильтрации (произвольное количество) # Поля задания параметров фильтрации (произвольное количество)
self.filtering_parameters = {} self.filtering_parameters = {}
# Кнопки задания/сброса параметров фильтрации # Кнопки задания/сброса параметров фильтрации
self.apply_button = Button(page, self.apply_button = Button(page,
self.sidebar_locator.get_by_role("button").filter(has_text='Применить Фильтры'), self.page.get_by_role("button").filter(has_text='Применить Фильтры'),
"apply_button") "apply_button")
self.reset_button = Button(page, self.reset_button = Button(page,
self.sidebar_locator.get_by_role("button").filter(has_text='Сбросить Фильтры'), self.page.get_by_role("button").filter(has_text='Сбросить Фильтры'),
"reset_button") "reset_button")
# Действия: # Действия:
def add_filtering_parameter(self, name: str, title: str) -> None: def add_filtering_parameter(self, name: str, title: str) -> None:
"""Добавляет поле задания параметров фильтрации по заданному имени.""" """Добавляет поле задания параметров фильтрации по заданному имени."""
loc = self.sidebar_locator.locator("//div[contains(@class, 'scrollarea__body')]").\ loc = self.events_filter_locator.get_by_role("combobox").filter(has_text=title)
get_by_role("combobox").filter(has_text=title)
self.filtering_parameters[name] = SelectionBarComponent(self.page, loc) self.filtering_parameters[name] = SelectionBarComponent(self.page, loc)
def get_filtering_parameter(self, name: str) -> SelectionBarComponent | None: def get_filtering_parameter(self, name: str) -> SelectionBarComponent | None:
@ -85,7 +78,6 @@ class SidebarFilterComponent(BaseComponent):
def check_content(self) -> None: def check_content(self) -> None:
"""Проверяет наличие постоянных полей панели параметров фильтрации.""" """Проверяет наличие постоянных полей панели параметров фильтрации."""
self.should_be_toolbar()
self.start_time_filter.check_content("Дата начала") self.start_time_filter.check_content("Дата начала")
self.finish_time_filter.check_content("Дата окончания") self.finish_time_filter.check_content("Дата окончания")
@ -107,13 +99,3 @@ class SidebarFilterComponent(BaseComponent):
"""Проверяет наличие кнопки сброса фильтра.""" """Проверяет наличие кнопки сброса фильтра."""
self.reset_button.check_visibility("Reset Filter Button is missing") self.reset_button.check_visibility("Reset Filter Button is missing")
def should_be_toolbar(self) -> None:
"""Проверяет наличие тулбара.
Raises:
AssertionError: Если тулбар отсутствует.
"""
self.toolbar.check_toolbar_presence_by_locator_and_title(self.sidebar_locator,
"Sidebar Filter form toolbar is missing")

View File

@ -58,6 +58,11 @@ class BaseElement:
logger.info(f"Get text for {self.type_of} '{self.name}'") logger.info(f"Get text for {self.type_of} '{self.name}'")
return self.locator.nth(index).text_content() return self.locator.nth(index).text_content()
def get_locator(self) -> Locator:
"""Возвращает локатор элемента."""
return self.locator
def update_locator(self, new_locator: Locator) -> None: def update_locator(self, new_locator: Locator) -> None:
"""Меняет значение локатора для элемента""" """Меняет значение локатора для элемента"""

View File

@ -8,31 +8,42 @@ class EventPanelLocators:
"""Локаторы элементов панели событий. """Локаторы элементов панели событий.
Содержит XPath локаторы для: Содержит XPath локаторы для:
TABS_BLOCK (str): блока кнопок в панели событий. AREA_EVENTS (str): рабочей области страницы.
TAB_EXPAND_BUTTONS (str): блока кнопок расширения панели событий. BUTTON_EXPAND_LESS (str): кнопки сжатия рабочей области отображения содержимого панели событий.
BUTTON_EXPAND_MORE (str): кнопки расширения рабочей области отображения содержимого панели событий.
TAB_STATES (str): кнопки Состояния. TAB_STATES (str): кнопки Состояния.
TAB_ACTIONS (str): кнопки Действия. TAB_ACTIONS (str): кнопки Действия.
TAB_EVENTS (str): кнопки События. TAB_EVENTS (str): кнопки События.
TAB_MAINTENANCE (str): кнопки Обслуживания. TAB_MAINTENANCE (str): кнопки Обслуживания.
TAB_SYSTEM_LOG (str): кнопки Системный журнал. TAB_SYSTEM_LOG (str): кнопки Системный журнал.
CONTAINER_SYSTEM_LOG_EVENTS (str): контейнера с событиями Системного журнала. TAB_AUDIT (str): кнопки Аудит.
BUTTONS_EVENT (str): блока кнопок-счетчиков событий. BUTTONS_EVENT (str): блока кнопок-счетчиков событий.
BUTTONS_SERVICE (str): блока кнопок, содержащего кнопки Поиска и Текущего пользователя. BUTTON_USER (str): кнопки текущего пользователя.
AREA_EVENTS (str): рабочей области страницы. CONTAINER_SYSTEM_LOG_EVENTS (str): контейнера с событиями Системного журнала.
""" """
TABS_BLOCK = "//nav/div[@class='v-toolbar__content']/div[@class='v-toolbar__items'][1]" AREA_EVENTS = "#app > div.application--wrap > div > div:nth-child(3)"
TAB_EXPAND_BUTTONS = f"{TABS_BLOCK}/div[1]/div[1]/div"
TAB_STATES = f"{TABS_BLOCK}//div[@class='v-tabs']//div[@class='v-tabs__container']/div[2]"
TAB_ACTIONS = f"{TABS_BLOCK}//div[@class='v-tabs']//div[@class='v-tabs__container']/div[3]"
TAB_EVENTS = f"{TABS_BLOCK}//div[@class='v-tabs']//div[@class='v-tabs__container']/div[4]"
TAB_MAINTENANCE = f"{TABS_BLOCK}//div[@class='v-tabs']//div[@class='v-tabs__container']/div[5]"
TAB_SYSTEM_LOG = f"{TABS_BLOCK}//div[@class='v-tabs']//div[@class='v-tabs__container']/div[6]"
CONTAINER_SYSTEM_LOG_EVENTS = "#app > div.application--wrap > div > div:nth-child(3) > div:nth-child(5)" BUTTON_EXPAND_LESS = "//button[contains(@data-testid, 'BASELINE__btn__toolbar_close')]"
BUTTON_EXPAND_MORE = "//button[contains(@data-testid, 'BASELINE__btn__toolbar_open')]"
TAB_STATES = "//div[@data-testid='BASELINE__states_tab__toolbar']"
TAB_ACTIONS = "//div[@data-testid='BASELINE__actions_tab__toolbar']"
TAB_EVENTS = "//div[@data-testid='BASELINE__events_tab__toolbar']"
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']"
BUTTONS_EVENT = "//nav/div[@class='v-toolbar__content']/div[@class='v-toolbar__items'][2]//span[contains(@class, 'v-tooltip')]" BUTTONS_EVENT = "//nav/div[@class='v-toolbar__content']/div[@class='v-toolbar__items'][2]//span[contains(@class, 'v-tooltip')]"
BUTTONS_SERVICE = "//nav/div[@class='v-toolbar__content']/div[@class='v-toolbar__items'][2]"
AREA_EVENTS = "#app > div.application--wrap > div > div:nth-child(3)" BUTTON_USER = "//button[@data-testid='BASELINE__btn__user']"
TOOLBAR = "//nav[contains(@class, 'v-toolbar')]"
TABLE = "//div[@class='scrolltable']/div/table"
FILTER_TOOLBAR_BUTTON = "//div[contains(@class, 'journal-tab-button')]//span[text()='Фильтр']"
EVENTS_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_SYSTEM_LOG_EVENTS = "#app > div.application--wrap > div > div:nth-child(3) > div:nth-child(5)"

View File

@ -4,7 +4,7 @@
панели событий в приложении. панели событий в приложении.
""" """
# import pytest import pytest
from playwright.sync_api import Page from playwright.sync_api import Page
from pages.main_page import MainPage from pages.main_page import MainPage
from pages.login_page import LoginPage from pages.login_page import LoginPage
@ -16,7 +16,8 @@ class TestEventPanel:
Тесты покрывают следующие сценарии: Тесты покрывают следующие сценарии:
1. test_event_panel_content: Проверяет содержимое панели событий 1. test_event_panel_content: Проверяет содержимое панели событий
2. test_event_panel_expand_buttons: Проверяет состояние и количество кнопок расширения рабочей области панели событий 2. test_event_panel_expand_buttons: Проверяет состояние и количество кнопок расширения рабочей области панели
событий
Атрибуты: Атрибуты:
browser: Фикстура для работы с браузером. browser: Фикстура для работы с браузером.
@ -48,6 +49,7 @@ class TestEventPanel:
if button_counter != counter: if button_counter != counter:
assert False, f"Expected tooltip value {counter} is not equal button value {button_counter} for event button {event}" assert False, f"Expected tooltip value {counter} is not equal button value {button_counter} for event button {event}"
@pytest.mark.develop
def test_event_panel_expand_buttons(self, browser: Page) -> None: def test_event_panel_expand_buttons(self, browser: Page) -> None:
"""Проверяет состояние и количество кнопок расширения рабочей области панели событий. """Проверяет состояние и количество кнопок расширения рабочей области панели событий.
@ -60,16 +62,16 @@ class TestEventPanel:
mp = MainPage(browser) mp = MainPage(browser)
# Проверяем начальное состояние - панель событий внизу, видна одна кнопка expand less # Проверяем начальное состояние - панель событий внизу, видна одна кнопка expand more
current_position = mp.get_events_panel_position() current_position = mp.get_events_panel_position()
assert current_position == "bottom", \ assert current_position == "bottom", \
"Events panel should be located on main page bottom" "Events panel should be located on main page bottom"
assert mp.check_expand_less_button(), \
"Expand less button should be present"
assert mp.check_expand_more_button(), \ assert mp.check_expand_more_button(), \
"Expand more button should be absent" "Expand more button should be present"
assert mp.check_expand_less_button(), \
"Expand less button should be absent"
mp.click_events_panel_expand_less_button() mp.click_events_panel_expand_more_button()
mp.wait_for_timeout(500) mp.wait_for_timeout(500)
# Проверяем, что панель событий переместилась в середину экрана, # Проверяем, что панель событий переместилась в середину экрана,
@ -82,21 +84,21 @@ class TestEventPanel:
assert mp.check_expand_more_button(), \ assert mp.check_expand_more_button(), \
"Expand more button should be present" "Expand more button should be present"
mp.click_events_panel_expand_less_button() mp.click_events_panel_expand_more_button()
mp.wait_for_timeout(500) mp.wait_for_timeout(500)
# Проверяем, что панель событий находится вверху экрана, # Проверяем, что панель событий находится вверху экрана,
# видна кнопки expand more и отсутствует expand less # видна кнопки expand less и отсутствует expand more
current_position = mp.get_events_panel_position() current_position = mp.get_events_panel_position()
assert current_position == "top", \ assert current_position == "top", \
"Events panel should be located on main page top" "Events panel should be located on main page top"
assert mp.check_expand_less_button(), \
"Expand less button should be absent"
assert mp.check_expand_more_button(), \ assert mp.check_expand_more_button(), \
"Expand more button should be present" "Expand more button should be absent"
assert mp.check_expand_less_button(), \
"Expand less button should be present"
# перемещение в отратном напрвлении сверху вниз # перемещение в отратном направлении сверху вниз
mp.click_events_panel_expand_more_button() mp.click_events_panel_expand_less_button()
mp.wait_for_timeout(500) mp.wait_for_timeout(500)
current_position = mp.get_events_panel_position() current_position = mp.get_events_panel_position()
@ -107,13 +109,13 @@ class TestEventPanel:
assert mp.check_expand_more_button(), \ assert mp.check_expand_more_button(), \
"Expand more button should be present" "Expand more button should be present"
mp.click_events_panel_expand_more_button() mp.click_events_panel_expand_less_button()
mp.wait_for_timeout(500) mp.wait_for_timeout(500)
current_position = mp.get_events_panel_position() current_position = mp.get_events_panel_position()
assert current_position == "bottom", \ assert current_position == "bottom", \
"Events panel should be located on main page bottom" "Events panel should be located on main page bottom"
assert mp.check_expand_less_button(), \
"Expand less button should be present"
assert mp.check_expand_more_button(), \ assert mp.check_expand_more_button(), \
"Expand more button should be absent" "Expand more button should be present"
assert mp.check_expand_more_button(), \
"Expand less button should be absent"

View File

@ -4,7 +4,7 @@
контейнера для отображения событий системного журнала. контейнера для отображения событий системного журнала.
""" """
import pytest # import pytest
from playwright.sync_api import Page from playwright.sync_api import Page
from pages.main_page import MainPage from pages.main_page import MainPage
from pages.login_page import LoginPage from pages.login_page import LoginPage
@ -102,9 +102,9 @@ class TestSystemLogEventsContainer:
system_log_events_container.check_events_table_first_row_visibility() system_log_events_container.check_events_table_first_row_visibility()
# Раскрываем панель полностью и проверяем скроллинг # Раскрываем панель полностью и проверяем скроллинг
assert mp.check_expand_less_button(), \ assert mp.check_expand_more_button(), \
"Expand less button should be present" "Expand more button should be present"
mp.click_events_panel_expand_less_button() mp.click_events_panel_expand_more_button()
mp.wait_for_timeout(500) mp.wait_for_timeout(500)
events_panel_position = mp.get_events_panel_position() events_panel_position = mp.get_events_panel_position()
@ -144,7 +144,7 @@ class TestSystemLogEventsContainer:
system_log_events_container = mp.click_events_panel_system_log_tab() system_log_events_container = mp.click_events_panel_system_log_tab()
index = 1 index = 0
state = system_log_events_container.get_arrow_button_state(index) state = system_log_events_container.get_arrow_button_state(index)
assert state == "down", "Arrow button should be down" assert state == "down", "Arrow button should be down"