from playwright.sync_api import Page, expect from components.base_component import BaseComponent from tools.logger import get_logger logger = get_logger("TABLE") class TableComponent(BaseComponent): """Компонент таблицы. Предоставляет методы для взаимодействия с таблицами и проверки их состояния. Наследуется от BaseComponent. Атрибуты: page: Page - экземпляр страницы Playwright """ def __init__(self, page: Page): """Инициализация компонента таблицы. Args: page: Page - экземпляр страницы Playwright """ super().__init__(page) # Действия: def read(self, locator) -> []: """Читает данные из таблицы, включая заголовки и содержимое ячеек. Args: locator: Локатор таблицы Returns: list: Двумерный список с данными таблицы (первый элемент - заголовки) """ table_data = [] table = self.get_locator(locator) # Чтение заголовка таблицы header_cells = table.locator("//thead/tr") header_cell_text = header_cells.nth(0).inner_text() header_data = header_cell_text.split('\n') table_data.append(header_data) # Чтение ячеек таблицы по строкам rows = table.locator("//tbody/tr") for i in range(rows.count()): row = rows.nth(i) cells = row.locator("td") row_data = [] for j in range(cells.count()): cell_text = cells.nth(j).inner_text() row_data.append(cell_text) table_data.append(row_data) return table_data # Проверки: def check_first_row_visibility(self, locator): """Проверяет видимость первой строки таблицы. Args: locator: Локатор таблицы Raises: AssertionError: Если первая строка не видима """ table = self.get_locator(locator) first_row = table.locator("//tbody/tr").first expect(first_row).to_be_visible(), "The first table row is not visible" def check_last_row_visibility(self, locator): """Проверяет видимость последней строки таблицы. Args: locator: Локатор таблицы Raises: AssertionError: Если последняя строка не видима """ table = self.get_locator(locator) last_row = table.locator("//tbody/tr").last expect(last_row).to_be_visible(), "The last table row is not visible" def check_row_highlighting(self, locator, row_index): """Проверяет изменение цвета строки при наведении курсора. Args: locator: Локатор таблицы row_index: Индекс проверяемой строки Raises: AssertionError: Если цвет строки не изменился при наведении """ table = self.get_locator(locator) row = table.locator("//tbody/tr").nth(row_index) row.scroll_into_view_if_needed() # Получение элемента с подсветкой и его цвета hover_element = row.locator(".body-row-hover") initial_color = hover_element.evaluate("el => window.getComputedStyle(el).backgroundColor") # Наведение на строку row.hover() self.page.wait_for_timeout(300) # 0.3 секунды # Получение нового цвета new_color = hover_element.evaluate("el => window.getComputedStyle(el).backgroundColor") assert initial_color == new_color, "Color of row did not change when hovering the cursor"