"""Модуль компонента контейнера с перечнем событий. Содержит класс для работы с контейнерами,
их элементами и проверками."""
from playwright.sync_api import Page, Locator
from tools.logger import get_logger
from locators.toolbar_locators import ToolbarLocators
from elements.tooltip_button_element import TooltipButton
from elements.tab_button_element import TabButton
from elements.button_element import Button
from components_derived.sidebar_filter_component import SidebarFilterComponent
from components.toolbar_component import ToolbarComponent
from components.table_component import TableComponent
from components.base_component import BaseComponent
logger = get_logger("EVENTS_CONTANER")
[документация]
class EventsContainerComponent(BaseComponent):
"""Компонент контейнера с перечнем событий. Предоставляет методы для взаимодействия с контейнером,
его содержимым и проверок."""
[документация]
def __init__(self, page: Page, locator: str | Locator):
"""Инициализирует базовый контейнер.
Args:
page: Экземпляр страницы Playwright
locator: Локатор контейнера (строка или объект Locator)
"""
super().__init__(page)
self.container_locator = self.get_locator(locator)
# тулбар
self.toolbar = ToolbarComponent(page, "")
filter_button_locator = self.container_locator.locator(ToolbarLocators.TITLE).\
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.table_locator = "//div[@class='scrolltable']/div/table"
# Кнопки пагинации в нижней части контейнера
self.chevron_left = Button(page,
self.container_locator.get_by_role("button").filter(has_text='chevron_left'),
"chevron_left")
self.chevron_right = Button(page,
self.container_locator.get_by_role("button").filter(has_text='chevron_right'),
"chevron_right")
self.first_page = Button(page,
self.container_locator.get_by_role("button").filter(has_text='first_page'),
"first_page")
self.last_page = Button(page,
self.container_locator.get_by_role("button").filter(has_text='last_page'),
"last_page")
loc = self.container_locator.get_by_role("button").filter(has_text='chevron_left').\
locator("xpath=..").get_by_role("button").nth(2)
self.data_set_number = Button(page, loc, "data_set_number")
self.sidebar_filter_locator = self.container_locator.locator("//aside//div[@class='scrollarea__container']")
self.sidebar_filter = SidebarFilterComponent(self.page,
self.sidebar_filter_locator)
# Действия:
[документация]
def click_chevron_left(self) -> None:
"""Нажатие кнопки получения предыдущего набора данных"""
self.chevron_left.click()
[документация]
def click_chevron_right(self) -> None:
"""Нажатие кнопки получения следующего набора данных"""
self.chevron_right.click()
[документация]
def click_first_page(self) -> None:
"""Нажатие кнопки перехода на первую сраницу"""
self.first_page.click()
[документация]
def click_last_page(self) -> None:
"""Нажатие кнопки перехода на последнюю страницу"""
self.last_page.click()
[документация]
def get_current_data_set_number(self) -> int:
"""Получение номера текущего набора данных"""
try:
data_set_number = int(self.data_set_number.get_text(0))
except ValueError as e:
assert False, f"Value Error: {e}"
return data_set_number
[документация]
def get_events_table_content(self) -> list[list[str]]:
"""Возвращает содержимое таблицы, включая заголовки.
Returns:
Двумерный список с содержимым таблицы.
"""
loc = self.container_locator.locator(self.table_locator)
return self.events_table.read(loc)
[документация]
def get_events_table_rows_count(self) -> int:
"""Возвращает количество строк в таблице (без заголовка).
Returns:
int: Количество строк с данными.
Raises:
AssertionError: Если таблица пуста.
"""
loc = self.container_locator.locator(self.table_locator)
return self.events_table.get_rows_count(loc)
# Проверки:
[документация]
def check_events_table_column_descending_order(self,
index: int,
convert2timestamp=False) -> bool:
"""Проверка, что заданный столбец таблицы упорядочен по убыванию.
Args:
index: Индекс столбца.
convert2timestamp: Конвертировать строковое представление даты и времени в Unix timestamp.
Returns:
True, если столбец таблицы упорядочен по убыванию. Иначе: False
"""
loc = self.container_locator.locator(self.table_locator)
return self.events_table.check_column_descending_order(loc, index, convert2timestamp)
[документация]
def check_events_table_row_highlighting(self, row_index: int) -> None:
"""Проверяет выделение указанной строки таблицы.
Args:
row_index: Индекс проверяемой строки.
Raises:
AssertionError: Если строка не выделена.
"""
loc = self.container_locator.locator(self.table_locator)
self.events_table.check_row_highlighting(loc, row_index)
[документация]
def check_events_table_first_row_visibility(self) -> None:
"""Проверяет видимость первой строки таблицы.
Raises:
AssertionError: Если строка не видна.
"""
loc = self.container_locator.locator(self.table_locator)
self.events_table.check_first_row_visibility(loc)
[документация]
def check_events_table_last_row_visibility(self) -> None:
"""Проверяет видимость последней строки таблицы.
Raises:
AssertionError: Если строка не видна.
"""
loc = self.container_locator.locator(self.table_locator)
self.events_table.check_last_row_visibility(loc)
[документация]
def is_chevron_left_disabled(self) -> bool:
"""Проверка видимости кнопки получения предыдущего набора данных"""
return self.chevron_left.is_disabled()
[документация]
def is_chevron_right_disabled(self) -> bool:
"""Проверка видимости кнопки получения следующего набора данных"""
return self.chevron_right.is_disabled()
[документация]
def is_first_page_disabled(self) -> bool:
"""Проверка видимости кнопки получения первой страницы с набором данных"""
return self.first_page.is_disabled()
[документация]
def is_last_page_disabled(self) -> bool:
"""Проверка видимости кнопки получения последней страницы с набором данных"""
return self.last_page.is_disabled()
[документация]
def should_be_all_disabled(self) -> None:
"""Проверка видимости кнопок пагинации: все кнопки disabled"""
is_first_page_disabled = self.is_first_page_disabled()
assert is_first_page_disabled, "First Page button should be disabled"
is_chevron_left_disabled = self.is_chevron_left_disabled()
assert is_chevron_left_disabled, "Arrow Left button should be disabled"
is_chevron_right_disabled = self.is_chevron_right_disabled()
assert is_chevron_right_disabled, "Arrow Right button should be disabled"
is_last_page_disabled = self.is_last_page_disabled()
assert is_last_page_disabled, "Last Page button should be disabled"
[документация]
def should_be_all_enabled(self) -> None:
"""Проверка видимости кнопок пагинации: все кнопки enabled"""
is_first_page_disabled = self.is_first_page_disabled()
assert not is_first_page_disabled, "First Page button should be enabled"
is_chevron_left_disabled = self.is_chevron_left_disabled()
assert not is_chevron_left_disabled, "Arrow Left button should be enabled"
is_chevron_right_disabled = self.is_chevron_right_disabled()
assert not is_chevron_right_disabled, "Arrow Right button should be enabled"
is_last_page_disabled = self.is_last_page_disabled()
assert not is_last_page_disabled, "Last Page button should be enabled"
[документация]
def should_be_initial_state(self) -> None:
"""Проверка видимости кнопок для первой страницы"""
is_first_page_disabled = self.is_first_page_disabled()
assert is_first_page_disabled, "First Page button should be disabled"
is_chevron_left_disabled = self.is_chevron_left_disabled()
assert is_chevron_left_disabled, "Arrow Left button should be disabled"
is_chevron_right_disabled = self.is_chevron_right_disabled()
assert not is_chevron_right_disabled, "Arrow Right button should be enabled"
is_last_page_disabled = self.is_last_page_disabled()
assert not is_last_page_disabled, "Last Page button should be enabled"
[документация]
def should_be_final_state(self) -> None:
"""Проверка видимости кнопок для последней страницы"""
is_first_page_disabled = self.is_first_page_disabled()
assert not is_first_page_disabled, "First Page button should be enabled"
is_chevron_left_disabled = self.is_chevron_left_disabled()
assert not is_chevron_left_disabled, "Arrow Left button should be enabled"
is_chevron_right_disabled = self.is_chevron_right_disabled()
assert is_chevron_right_disabled, "Arrow Right button should be disabled"
is_last_page_disabled = self.is_last_page_disabled()
assert is_last_page_disabled, "Last Page button should be disabled"
[документация]
def should_be_events_table(self) -> None:
"""Проверяет наличие таблицы событий.
Raises:
AssertionError: Если таблица отсутствует.
"""
loc = self.container_locator.locator(self.table_locator)
self.events_table.check_visibility(loc,
"Events table is missing"
)