Skip to content

TableComponent

Модуль компонента таблицы. Содержит класс для работы с табличными данными.

TableComponent

Bases: BaseComponent

Компонент таблицы. Предоставляет методы для работы с табличными данными.

Source code in components\table_component.py
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
class TableComponent(BaseComponent):
    """Компонент таблицы. Предоставляет методы для работы с табличными данными."""

    def __init__(self, page: Page):
        """Инициализирует компонент таблицы.

        Args:
            page: Экземпляр страницы Playwright.
        """

        super().__init__(page)

    # Действия:
    def get_row_locator(self, table_locator: str | Locator, row_index: int) -> Locator | None:
        """Возвращает локатор строки по индексу.

        Args:
            table_locator: Локатор таблицы.
            row_index: Индекс строки.

        Returns:
            Локатор строки или None, если индекс вне диапазона.
        """

        table = self.get_locator(table_locator)

        rows = table.locator("//tbody/tr")

        if row_index in range(rows.count()):
            return rows.nth(row_index)
        else:
            return None

    def read(self, locator: str | Locator) -> list[list[str]]:
        """Читает данные таблицы, включая заголовки.

        Args:
            locator: Локатор таблицы.

        Returns:
            Двумерный список с данными таблицы.
        """

        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: str | Locator) -> None:
        """Проверяет видимость первой строки таблицы.

        Args:
            locator: Локатор таблицы.
        """

        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: str | Locator) -> None:
        """Проверяет видимость последней строки таблицы.

        Args:
            locator: Локатор таблицы.
        """

        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: str | Locator, row_index: int) -> None:
        """Проверяет изменение цвета строки при наведении.

        Args:
            locator: Локатор таблицы.
            row_index: Индекс проверяемой строки.
        """

        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)

        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"

__init__(page)

Инициализирует компонент таблицы.

Parameters:

Name Type Description Default
page Page

Экземпляр страницы Playwright.

required
Source code in components\table_component.py
14
15
16
17
18
19
20
21
def __init__(self, page: Page):
    """Инициализирует компонент таблицы.

    Args:
        page: Экземпляр страницы Playwright.
    """

    super().__init__(page)

check_first_row_visibility(locator)

Проверяет видимость первой строки таблицы.

Parameters:

Name Type Description Default
locator str | Locator

Локатор таблицы.

required
Source code in components\table_component.py
77
78
79
80
81
82
83
84
85
86
def check_first_row_visibility(self, locator: str | Locator) -> None:
    """Проверяет видимость первой строки таблицы.

    Args:
        locator: Локатор таблицы.
    """

    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"

check_last_row_visibility(locator)

Проверяет видимость последней строки таблицы.

Parameters:

Name Type Description Default
locator str | Locator

Локатор таблицы.

required
Source code in components\table_component.py
88
89
90
91
92
93
94
95
96
97
def check_last_row_visibility(self, locator: str | Locator) -> None:
    """Проверяет видимость последней строки таблицы.

    Args:
        locator: Локатор таблицы.
    """

    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"

check_row_highlighting(locator, row_index)

Проверяет изменение цвета строки при наведении.

Parameters:

Name Type Description Default
locator str | Locator

Локатор таблицы.

required
row_index int

Индекс проверяемой строки.

required
Source code in components\table_component.py
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
def check_row_highlighting(self, locator: str | Locator, row_index: int) -> None:
    """Проверяет изменение цвета строки при наведении.

    Args:
        locator: Локатор таблицы.
        row_index: Индекс проверяемой строки.
    """

    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)

    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"

get_row_locator(table_locator, row_index)

Возвращает локатор строки по индексу.

Parameters:

Name Type Description Default
table_locator str | Locator

Локатор таблицы.

required
row_index int

Индекс строки.

required

Returns:

Type Description
Locator | None

Локатор строки или None, если индекс вне диапазона.

Source code in components\table_component.py
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
def get_row_locator(self, table_locator: str | Locator, row_index: int) -> Locator | None:
    """Возвращает локатор строки по индексу.

    Args:
        table_locator: Локатор таблицы.
        row_index: Индекс строки.

    Returns:
        Локатор строки или None, если индекс вне диапазона.
    """

    table = self.get_locator(table_locator)

    rows = table.locator("//tbody/tr")

    if row_index in range(rows.count()):
        return rows.nth(row_index)
    else:
        return None

read(locator)

Читает данные таблицы, включая заголовки.

Parameters:

Name Type Description Default
locator str | Locator

Локатор таблицы.

required

Returns:

Type Description
list[list[str]]

Двумерный список с данными таблицы.

Source code in components\table_component.py
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
def read(self, locator: str | Locator) -> list[list[str]]:
    """Читает данные таблицы, включая заголовки.

    Args:
        locator: Локатор таблицы.

    Returns:
        Двумерный список с данными таблицы.
    """

    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