В компонент таблица добавлена функция поиска кнопки в ячейке заголовка таблицы

pull/1/head
nsubbot 2025-10-14 10:37:30 +03:00
parent 1dcfa548da
commit aac422e2b2
3 changed files with 51 additions and 101 deletions

View File

@ -29,11 +29,7 @@ class TableComponent(BaseComponent):
index: Индекс ячейки в заголовке. index: Индекс ячейки в заголовке.
""" """
table = self.get_locator(table_locator) arrow_button = self.get_header_cell_button(table_locator, index)
header_cells_count = table.locator("//thead/tr/th").count()
assert index in range(header_cells_count), "Header cell index is out of range"
arrow_button = table.locator("//thead/tr/th").nth(index).get_by_role("button")
assert arrow_button.is_enabled(), f"Arrow button is missing in {index} header cell" assert arrow_button.is_enabled(), f"Arrow button is missing in {index} header cell"
arrow_button.click() arrow_button.click()
@ -48,11 +44,7 @@ class TableComponent(BaseComponent):
up, если это стрелочка вверх. down, если это стрелочка вниз. up, если это стрелочка вверх. down, если это стрелочка вниз.
""" """
table = self.get_locator(table_locator) arrow_button = self.get_header_cell_button(table_locator, index)
header_cells_count = table.locator("//thead/tr/th").count()
assert index in range(header_cells_count), "Header cell index is out of range"
arrow_button = table.locator("//thead/tr/th").nth(index).get_by_role("button")
assert arrow_button.is_enabled(), f"Arrow button is missing in {index} header cell" assert arrow_button.is_enabled(), f"Arrow button is missing in {index} header cell"
state = arrow_button.inner_text() state = arrow_button.inner_text()
@ -63,6 +55,25 @@ class TableComponent(BaseComponent):
else: else:
assert False, f"Got unsupported arrow state: {state}" assert False, f"Got unsupported arrow state: {state}"
def get_header_cell_button(self, table_locator: str | Locator, index: int) -> Locator:
""" Поиск кнопки в ячейке заголовка таблицы
Args:
table_locator: Локатор таблицы.
index: Индекс ячейки в заголовке.
Returns:
Локатор строки кнопки.
Raises:
AssertionError: Если индекс вне диапазона.
"""
table = self.get_locator(table_locator)
header_cells_count = table.locator("//thead/tr/th").count()
assert index in range(header_cells_count), "Header cell index is out of range"
return table.locator("//thead/tr/th").nth(index).get_by_role("button")
def get_row_locator(self, table_locator: str | Locator, row_index: int) -> Locator | None: def get_row_locator(self, table_locator: str | Locator, row_index: int) -> Locator | None:
"""Возвращает локатор строки по индексу. """Возвращает локатор строки по индексу.

View File

@ -4,9 +4,10 @@
Позволяет проверять состояние и взаимодействовать с элементами вкладки. Позволяет проверять состояние и взаимодействовать с элементами вкладки.
""" """
from playwright.sync_api import Page, Locator from playwright.sync_api import Page
from tools.logger import get_logger from tools.logger import get_logger
from locators.table_locators import TableLocators from locators.table_locators import TableLocators
from elements.tooltip_button_element import TooltipButton
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 pages.base_page import BasePage from pages.base_page import BasePage
@ -43,8 +44,26 @@ class ZTPConfigTab(BasePage):
# Компонент таблицы конфигурации ZTP # Компонент таблицы конфигурации ZTP
self.ztp_config_table = TableComponent(page) self.ztp_config_table = TableComponent(page)
# Словарь для хранения кнопок синхронизации по индексам # Действия:
self.sync_buttons = {} def click_sync_button(self, index: int) -> None:
"""Нажимает кнопку 'Reload' в указанной ячейке заголовка таблицы.
Перед кликом проверяет наличие кнопки.
Args:
index: Индекс ячейки в заголовке таблицы.
Raises:
AssertionError: Если индекс выходит за пределы или кнопка не найдена.
"""
# Проверяем наличие кнопки перед кликом
sync_button = self.ztp_config_table.get_header_cell_button(TableLocators.TABLE_WORK_AREA, index)
assert sync_button.is_enabled(), f"Sync button is missing in {index} header cell"
# Выполняем клик по кнопке
sync_button.click()
logger.info("Нажата кнопка синхронизации (Reload)")
def get_rows_count(self) -> int: def get_rows_count(self) -> int:
"""Возвращает количество строк в таблице конфигурации (без заголовка). """Возвращает количество строк в таблице конфигурации (без заголовка).
@ -65,6 +84,7 @@ class ZTPConfigTab(BasePage):
"""Прокручивает таблицу конфигурации вниз до конца.""" """Прокручивает таблицу конфигурации вниз до конца."""
self.ztp_config_table.scroll_down(TableLocators.TABLE_SCROLL_CONTAINER) self.ztp_config_table.scroll_down(TableLocators.TABLE_SCROLL_CONTAINER)
# Проверки:
def check_config_table_content(self) -> None: def check_config_table_content(self) -> None:
"""Проверяет содержимое таблицы конфигурации ZTP. """Проверяет содержимое таблицы конфигурации ZTP.
@ -92,64 +112,6 @@ class ZTPConfigTab(BasePage):
False False
) )
def should_be_config_table(self) -> None:
"""Проверяет наличие и видимость таблицы конфигурации ZTP.
Raises:
AssertionError: Если таблица конфигурации отсутствует на странице.
"""
self.ztp_config_table.check_visibility(
TableLocators.TABLE_WORK_AREA, "Configuration table is missing"
)
def get_sync_button(self, index: int) -> Locator:
"""Получает кнопку синхронизации (Reload) по индексу ячейки заголовка таблицы.
Args:
index: Индекс ячейки в заголовке таблицы (0-based).
Returns:
Locator: Локатор кнопки синхронизации (Reload) для взаимодействия.
Raises:
AssertionError: Если индекс выходит за пределы диапазона ячеек
или кнопка не найдена в указанной ячейке.
"""
table_locator = TableLocators.TABLE_WORK_AREA
# Получаем локатор таблицы через компонент таблицы
table = self.ztp_config_table.get_locator(table_locator)
# Проверяем количество ячеек в заголовке таблицы
header_cells_count = table.locator("//thead/tr/th").count()
assert index in range(header_cells_count), "Header cell index is out of range"
# Ищем кнопку в указанной ячейке заголовка
sync_button = table.locator("//thead/tr/th").nth(index).get_by_role("button")
assert sync_button.is_enabled(), f"Sync button is missing in {index} header cell"
return sync_button
def add_sync_button_to_toolbar(self, index: int) -> None:
"""Добавляет кнопку синхронизации (Reload) в тулбар для управления подсказками.
Регистрирует кнопку в компоненте тулбара, что позволяет использовать
стандартные методы проверки подсказок.
Args:
index: Индекс ячейки в заголовке таблицы.
"""
sync_button = self.get_sync_button(index)
button_name = f"sync_button_{index}"
# Добавляем кнопку в тулбар компонент как кнопку с подсказкой
self.toolbar.add_tooltip_button(sync_button, button_name)
# Сохраняем связь между индексом и именем кнопки для последующего доступа
self.sync_buttons[index] = button_name
logger.info("Кнопка синхронизации (Reload) добавлена в тулбар как '%s'", button_name)
def check_sync_button_visibility(self, index: int) -> None: def check_sync_button_visibility(self, index: int) -> None:
"""Проверяет видимость кнопки синхронизации (Reload) в указанной ячейке заголовка. """Проверяет видимость кнопки синхронизации (Reload) в указанной ячейке заголовка.
@ -159,7 +121,8 @@ class ZTPConfigTab(BasePage):
Raises: Raises:
AssertionError: Если кнопка не видна на странице. AssertionError: Если кнопка не видна на странице.
""" """
sync_button = self.get_sync_button(index) sync_button = self.ztp_config_table.get_header_cell_button(TableLocators.TABLE_WORK_AREA, index)
assert sync_button.is_enabled(), f"Sync button is missing in {index} header cell"
# Прокручиваем к элементу для гарантии видимости # Прокручиваем к элементу для гарантии видимости
sync_button.scroll_into_view_if_needed() sync_button.scroll_into_view_if_needed()
@ -181,14 +144,14 @@ class ZTPConfigTab(BasePage):
Raises: Raises:
AssertionError: Если подсказка не соответствует ожидаемой или отсутствует. AssertionError: Если подсказка не соответствует ожидаемой или отсутствует.
""" """
# Убеждаемся, что кнопка зарегистрирована в тулбаре # Убеждаемся, что кнопка существует
if index not in self.sync_buttons: sync_button = self.ztp_config_table.get_header_cell_button(TableLocators.TABLE_WORK_AREA, index)
self.add_sync_button_to_toolbar(index) assert sync_button.is_enabled(), f"Sync button is missing in {index} header cell"
button_name = self.sync_buttons[index] sync_tooltip_button = TooltipButton(self.page, sync_button, "sync_button")
# Проверка подсказки # Проверка подсказки
self.toolbar.check_button_tooltip(button_name, expected_tooltip) sync_tooltip_button.check_tooltip_with_text(expected_tooltip)
logger.info( logger.info(
"Подсказка кнопки синхронизации (Reload) в ячейке %d: '%s'", "Подсказка кнопки синхронизации (Reload) в ячейке %d: '%s'",
@ -196,26 +159,6 @@ class ZTPConfigTab(BasePage):
expected_tooltip expected_tooltip
) )
def click_sync_button(self, index: int) -> None:
"""Нажимает кнопку 'Reload' в указанной ячейке заголовка таблицы.
Перед кликом проверяет видимость кнопки.
Args:
index: Индекс ячейки в заголовке таблицы.
Raises:
AssertionError: Если индекс выходит за пределы или кнопка не найдена.
"""
sync_button = self.get_sync_button(index)
# Проверяем видимость перед кликом
self.check_sync_button_visibility(index)
# Выполняем клик по кнопке
sync_button.click()
logger.info("Нажата кнопка синхронизации (Reload)")
def check_config_table_vertical_scrolling(self) -> bool: def check_config_table_vertical_scrolling(self) -> bool:
"""Проверяет возможность вертикальной прокрутки таблицы конфигурации. """Проверяет возможность вертикальной прокрутки таблицы конфигурации.

View File

@ -96,10 +96,6 @@ class TestZTPConfigTab:
browser.wait_for_timeout(3000) browser.wait_for_timeout(3000)
# Тестирование кнопки синхронизации в первой ячейке заголовка (индекс 0) # Тестирование кнопки синхронизации в первой ячейке заголовка (индекс 0)
# Регистрация кнопки в системе управления тулбаром
config_tab.add_sync_button_to_toolbar(0)
# Проверка видимости кнопки # Проверка видимости кнопки
config_tab.check_sync_button_visibility(0) config_tab.check_sync_button_visibility(0)