e-nms_qa_automation/pages/session_tab.py

231 lines
8.9 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

from pages.base_page import BasePage
from elements.tooltip_button_element import TooltipButton
from components.toolbar_component import ToolbarComponent
from components.table_component import TableComponent
from locators.button_locators import ButtonLocators
from locators.table_locators import TableLocators
from playwright.sync_api import Page, Locator
from data.roles_dict import roles_dict
class SessionsTab(BasePage):
"""Класс для работы с вкладкой 'Сессия'.
Предоставляет методы для взаимодействия с таблицей сессий и проверки её состояния.
Args:
page (Page): Экземпляр страницы Playwright.
"""
def __init__(self, page: Page) -> None:
"""Инициализация компонентов вкладки 'Сессия'."""
super().__init__(page)
self.toolbar = ToolbarComponent(page, "Сессия")
self.sessions_table = TableComponent(page)
def get_rows_count(self) -> int:
"""Возвращает количество строк в таблице сессий (без учёта заголовка).
Returns:
int: Количество строк с данными.
Raises:
AssertionError: Если таблица пуста.
"""
table_content = self.sessions_table.read(TableLocators.TABLE_WORK_AREA)
rows_count = len(table_content)
if rows_count == 0:
assert False, "The contents of the table are missing"
return rows_count - 1
def get_delete_session_button_from_row(self, row_index: int) -> TooltipButton:
"""Возвращает кнопку удаления сессии для указанной строки.
Args:
row_index (int): Индекс строки в таблице
Returns:
TooltipButton: Экземпляр кнопки с подсказкой
Raises:
AssertionError: Если строка не найдена.
"""
row_locator = self.sessions_table.get_row_locator(
TableLocators.TABLE_WORK_AREA,
row_index
)
assert isinstance(row_locator, Locator), f"Row with index {row_index} is missing"
button_locator = row_locator.locator(ButtonLocators.BUTTON_DELETE_SESSION)
return TooltipButton(self.page, button_locator, "delete_session_button")
def scroll_sessions_table_up(self) -> None:
"""Прокручивает таблицу сессий вверх."""
self.sessions_table.scroll_up(TableLocators.TABLE_SCROLL_CONTAINER)
def scroll_sessions_table_down(self) -> None:
"""Прокручивает таблицу сессий вниз."""
self.sessions_table.scroll_down(TableLocators.TABLE_SCROLL_CONTAINER)
def check_sessions_table_content(self, verify: bool = False) -> None:
"""Проверяет содержимое таблицы сессий.
Args:
verify (bool, optional): Проверять соответствие данных из БД. По умолчанию False.
Raises:
AssertionError: Если таблица пуста или заголовки не соответствуют.
"""
expected_headers = [
'ID сессии',
'ID пользователя',
'Время жизни',
'Роль',
'Адрес'
]
table_content = self.sessions_table.read(TableLocators.TABLE_WORK_AREA)
len_table_content = len(table_content)
if len_table_content == 0:
assert False, "The contents of the table are missing"
actual_headers = table_content[0]
self.check_equals(
actual_headers,
expected_headers,
f"Expected table headers {expected_headers} are not equal {actual_headers}"
)
if len_table_content == 1:
assert False, "Table body is missing"
if verify:
self.verify_sessions_table_content(table_content)
for index in range(len_table_content - 1):
self.should_be_delete_button_on_sessions_table_row(index, "Удалить")
def check_sessions_table_verticall_scrolling(self) -> bool:
"""Проверяет возможность вертикальной прокрутки таблицы.
Returns:
bool: True если прокрутка возможна, иначе False.
"""
return self.sessions_table.is_scrollable_vertically(
TableLocators.TABLE_SCROLL_CONTAINER
)
def check_sessions_table_first_row_visibility(self) -> None:
"""Проверяет видимость первой строки таблицы.
Raises:
AssertionError: Если первая строка не видна.
"""
self.sessions_table.check_first_row_visibility(TableLocators.TABLE_WORK_AREA)
def check_sessions_table_last_row_visibility(self) -> None:
"""Проверяет видимость последней строки таблицы.
Raises:
AssertionError: Если последняя строка не видна.
"""
self.sessions_table.check_last_row_visibility(TableLocators.TABLE_WORK_AREA)
def check_sessions_table_row_highlighting(self, row_index: int) -> None:
"""Проверяет выделение указанной строки таблицы.
Args:
row_index (int): Индекс проверяемой строки.
Raises:
AssertionError: Если строка не выделена.
"""
self.sessions_table.check_row_highlighting(
TableLocators.TABLE_WORK_AREA,
row_index
)
def should_be_toolbar(self) -> None:
"""Проверяет наличие тулбара на вкладке.
Raises:
AssertionError: Если тулбар отсутствует.
"""
self.toolbar.check_presence("Toolbar is missing")
def should_be_sessions_table(self) -> None:
"""Проверяет наличие таблицы сессий.
Raises:
AssertionError: Если таблица отсутствует.
"""
self.sessions_table.check_presence(
TableLocators.TABLE_WORK_AREA,
"Sessions table is missing"
)
def should_be_delete_button_on_sessions_table_row(
self,
row_index: int,
tooltip: str
) -> None:
"""Проверяет наличие кнопки удаления в строке таблицы.
Args:
row_index (int): Индекс проверяемой строки
tooltip (str): Ожидаемый текст подсказки
Raises:
AssertionError: Если кнопка отсутствует или подсказка не соответствует.
"""
delete_button = self.get_delete_session_button_from_row(row_index)
delete_button.check_presence(
f"Delete session button is missing on {row_index} row"
)
delete_button.check_tooltip_with_text(ButtonLocators.TOOLTIP, tooltip)
def verify_sessions_table_content(self, sessions_table: list) -> None:
"""Сверяет данные таблицы с данными из БД.
Args:
sessions_table (list): Данные из таблицы на странице
Raises:
AssertionError: Если данные не соответствуют.
"""
expected_sessions_list = []
# Отправка запроса к бэкенду для получения информации о сессиях
response = self.send_get_api_request("e-nms/auth/sessions")
response_body = self.get_response_body(response)
for item in response_body:
session_info = []
session_info.append(item["id"])
session_info.append(item["userId"])
# Временно неподдерживаемое поле: время жизни сессии
session_info.append("")
roles = []
for role in item["roles"]:
if role in roles_dict.keys():
roles.append(roles_dict[role])
session_info.append(",".join(roles))
session_info.append(item["ip"])
expected_sessions_list.append(session_info)
del sessions_table[0] # Удаляем заголовок
self.check_lists_equals(
sessions_table,
expected_sessions_list,
"Actual sessions list is not equal expected users list on base db"
)