diff --git a/components/table_component.py b/components/table_component.py index f6e04ba..38f2a72 100644 --- a/components/table_component.py +++ b/components/table_component.py @@ -29,11 +29,7 @@ class TableComponent(BaseComponent): index: Индекс ячейки в заголовке. """ - 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" - - arrow_button = table.locator("//thead/tr/th").nth(index).get_by_role("button") + arrow_button = self.get_header_cell_button(table_locator, index) assert arrow_button.is_enabled(), f"Arrow button is missing in {index} header cell" arrow_button.click() @@ -48,11 +44,7 @@ class TableComponent(BaseComponent): up, если это стрелочка вверх. down, если это стрелочка вниз. """ - 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" - - arrow_button = table.locator("//thead/tr/th").nth(index).get_by_role("button") + arrow_button = self.get_header_cell_button(table_locator, index) assert arrow_button.is_enabled(), f"Arrow button is missing in {index} header cell" state = arrow_button.inner_text() @@ -63,6 +55,25 @@ class TableComponent(BaseComponent): else: 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: """Возвращает локатор строки по индексу. diff --git a/pages/ztp_config_tab.py b/pages/ztp_config_tab.py index 01e1cea..efa57d8 100644 --- a/pages/ztp_config_tab.py +++ b/pages/ztp_config_tab.py @@ -4,9 +4,10 @@ Позволяет проверять состояние и взаимодействовать с элементами вкладки. """ -from playwright.sync_api import Page, Locator +from playwright.sync_api import Page from tools.logger import get_logger from locators.table_locators import TableLocators +from elements.tooltip_button_element import TooltipButton from components.toolbar_component import ToolbarComponent from components.table_component import TableComponent from pages.base_page import BasePage @@ -43,8 +44,26 @@ class ZTPConfigTab(BasePage): # Компонент таблицы конфигурации ZTP 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: """Возвращает количество строк в таблице конфигурации (без заголовка). @@ -65,6 +84,7 @@ class ZTPConfigTab(BasePage): """Прокручивает таблицу конфигурации вниз до конца.""" self.ztp_config_table.scroll_down(TableLocators.TABLE_SCROLL_CONTAINER) + # Проверки: def check_config_table_content(self) -> None: """Проверяет содержимое таблицы конфигурации ZTP. @@ -92,64 +112,6 @@ class ZTPConfigTab(BasePage): 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: """Проверяет видимость кнопки синхронизации (Reload) в указанной ячейке заголовка. @@ -159,7 +121,8 @@ class ZTPConfigTab(BasePage): Raises: 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() @@ -181,14 +144,14 @@ class ZTPConfigTab(BasePage): Raises: AssertionError: Если подсказка не соответствует ожидаемой или отсутствует. """ - # Убеждаемся, что кнопка зарегистрирована в тулбаре - if index not in self.sync_buttons: - self.add_sync_button_to_toolbar(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" - 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( "Подсказка кнопки синхронизации (Reload) в ячейке %d: '%s'", @@ -196,26 +159,6 @@ class ZTPConfigTab(BasePage): 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: """Проверяет возможность вертикальной прокрутки таблицы конфигурации. diff --git a/tests/e2e/test_ztp_config_tab.py b/tests/e2e/test_ztp_config_tab.py index 3b4fe3e..9cc9fcc 100644 --- a/tests/e2e/test_ztp_config_tab.py +++ b/tests/e2e/test_ztp_config_tab.py @@ -96,10 +96,6 @@ class TestZTPConfigTab: browser.wait_for_timeout(3000) # Тестирование кнопки синхронизации в первой ячейке заголовка (индекс 0) - - # Регистрация кнопки в системе управления тулбаром - config_tab.add_sync_button_to_toolbar(0) - # Проверка видимости кнопки config_tab.check_sync_button_visibility(0)