Skip to content

EventsContainerComponent

Модуль компонента контейнера с перечнем событий. Содержит класс для работы с контейнерами, их элементами и проверками.

EventsContainerComponent

Bases: BaseComponent

Компонент контейнера с перечнем событий. Предоставляет методы для взаимодействия с контейнером, его содержимым и проверок.

Source code in components\events_container_component.py
 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
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
class EventsContainerComponent(BaseComponent):
    """Компонент контейнера с перечнем событий. Предоставляет методы для взаимодействия с контейнером,
    его содержимым и проверок."""

    def __init__(self, page: Page, locator: str | Locator):
        """Инициализирует базовый контейнер.

        Args:
            page: Экземпляр страницы Playwright
            locator: Локатор контейнера (строка или объект Locator)
        """
        super().__init__(page)

        self.container_locator = self.get_locator(locator)

        # тулбар
        self.toolbar = ToolbarComponent(page, "")
        filter_button_locator = self.container_locator.locator(ToolbarLocators.TITLE).\
                                get_by_role("button")
        self.toolbar.add_button(filter_button_locator, "filter_button")

        export_buttons = self.container_locator.locator(ToolbarLocators.ITEMS).\
                                get_by_role("button").all()
        self.toolbar.add_tooltip_button(export_buttons[1], "export_to_csv_button")
        self.toolbar.add_tooltip_button(export_buttons[0], "export_to_pdf_button")

        # Таблица событий
        self.events_table = TableComponent(page)
        self.table_locator = "//div[@class='scrolltable']/div/table"

        # Кнопки пагинации в нижней части контейнера
        self.chevron_left = Button(page,
                                   self.container_locator.get_by_role("button").filter(has_text='chevron_left'),
                                   "chevron_left")
        self.chevron_right = Button(page,
                                   self.container_locator.get_by_role("button").filter(has_text='chevron_right'),
                                   "chevron_right")

        loc = self.container_locator.get_by_role("button").filter(has_text='chevron_left').\
              locator("xpath=..").get_by_role("button").nth(1)
        self.data_set_number = Button(page, loc, "data_set_number")

    # Действия:
    def add_tab_to_toolbar(self, locator: str | Locator, name: str) -> None:
        """Добавление кнопки типа v-tabs к тулбару"""

        tabs_locator = self.get_locator(locator)
        self.toolbar.add_tab_button(self.container_locator.locator(tabs_locator), name)

    def click_chevron_left(self) -> None:
        """Нажатие кнопки получения предыдущего набора данных"""

        self.chevron_left.click()

    def click_chevron_right(self) -> None:
        """Нажатие кнопки получения следующего набора данных"""

        self.chevron_right.click()

    def click_event_table_header_arrow(self, index: int) -> None:
        """ Нажатие кнопки-стрелочки вверх/вниз в ячейке заголовка таблицы

        Args:
            index: Индекс ячейки в заголовке.
        """
        loc = self.container_locator.locator(self.table_locator)
        self.events_table.click_arrow_button(loc, index)

    def get_current_data_set_number(self) -> int:
        """Получение номера текущего набора данных"""

        try:
            data_set_number = int(self.data_set_number.get_text(0))
        except ValueError as e:
            assert False, f"Value Error: {e}"

        return data_set_number

    def get_arrow_button_state(self, index: int) -> str:
        """ Получение состояния кнопки-стрелочки вверх/вниз в ячейке заголовка таблицы

        Args:
            index: Индекс ячейки в заголовке.

        Returns:
            up, если это стрелочка вверх. down, если это стрелочка вниз.
        """
        loc = self.container_locator.locator(self.table_locator)
        return self.events_table.get_arrow_button_state(loc, index)

    def get_events_table_content(self) -> list[list[str]]:
        """Возвращает содержимое таблицы, включая заголовки.

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

        loc = self.container_locator.locator(self.table_locator)
        return self.events_table.read(loc)

    def get_events_table_rows_count(self) -> int:
        """Возвращает количество строк в таблице (без заголовка).

        Returns:
            int: Количество строк с данными.

        Raises:
            AssertionError: Если таблица пуста.
        """

        loc = self.container_locator.locator(self.table_locator)
        return self.events_table.get_rows_count(loc)

    def get_toolbar_filter_button(self) -> Button:
        """Возвращает кнопку фильтрации."""

        return self.toolbar.get_button_by_name("filter_button")

    def get_toolbar_export_to_csv_button(self) -> TooltipButton:
        """Возвращает кнопку экспорта в csv."""

        return self.toolbar.get_button_by_name("export_to_csv_button")

    def get_toolbar_export_to_pdf_button(self) -> TooltipButton:
        """Возвращает кнопку экспорта в pdf."""

        return self.toolbar.get_button_by_name("export_to_pdf_button")

    def get_toolbar_tab_button(self, name: str) -> TabButton:
        """Возвращает кнопку типа v-tabs по имени."""

        return self.toolbar.get_button_by_name(name)

    def scroll_events_table_up(self) -> None:
        """Прокручивает таблицу событий вверх."""

        loc = self.container_locator.locator("//div[@class='scrolltable']//table/tbody")
        self.events_table.scroll_up(loc)

    def scroll_events_table_down(self) -> None:
        """Прокручивает таблицу событий вниз."""

        loc = self.container_locator.locator("//div[@class='scrolltable']//table/tbody")
        self.events_table.scroll_down(loc)

    # Проверки:
    def check_events_table_headers(self, actual_headers, expected_headers) -> None:
        """ Проверка соответствия заголовка таблицы ожидаемому"""

        self.events_table.check_table_headers(actual_headers, expected_headers)

    def check_events_table_column_descending_order(self,
                                                       index: int,
                                                       convert2timestamp=False) -> bool:
        """Проверка, что заданный столбец таблицы упорядочен по убыванию.

        Args:
            index: Индекс столбца.
            convert2timestamp: Конвертировать строковое представление даты и времени в Unix timestamp.

        Returns:
            True, если столбец таблицы упорядочен по убыванию. Иначе: False
        """

        loc = self.container_locator.locator(self.table_locator)
        return self.events_table.check_column_descending_order(loc, index, convert2timestamp)

    def check_events_table_row_highlighting(self, row_index: int) -> None:
        """Проверяет выделение указанной строки таблицы.

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

        Raises:
            AssertionError: Если строка не выделена.
        """

        loc = self.container_locator.locator(self.table_locator)
        self.events_table.check_row_highlighting(loc, row_index)

    def check_events_table_first_row_visibility(self) -> None:
        """Проверяет видимость первой строки таблицы.

        Raises:
            AssertionError: Если строка не видна.
        """

        loc = self.container_locator.locator(self.table_locator)
        self.events_table.check_first_row_visibility(loc)

    def check_events_table_last_row_visibility(self) -> None:
        """Проверяет видимость последней строки таблицы.

        Raises:
            AssertionError: Если строка не видна.
        """

        loc = self.container_locator.locator(self.table_locator)
        self.events_table.check_last_row_visibility(loc)

    def check_events_table_verticall_scrolling(self) -> bool:
        """Проверяет возможность вертикальной прокрутки таблицы.

        Returns:
            bool: True если прокрутка возможна, иначе False.
        """

        loc = self.container_locator.locator("//div[@class='scrolltable']//table/tbody")
        return self.events_table.is_scrollable_vertically(loc)

    def is_chevron_left_disabled(self) -> bool:
        """Проверка видимости кнопки получения предыдущего набора данных"""

        return self.chevron_left.is_disabled()

    def is_chevron_right_disabled(self) -> bool:
        """Проверка видимости кнопки получения следующего набора данных"""

        return self.chevron_right.is_disabled()

    def should_be_events_table(self) -> None:
        """Проверяет наличие таблицы событий.

        Raises:
            AssertionError: Если таблица отсутствует.
        """

        loc = self.container_locator.locator(self.table_locator)
        self.events_table.check_visibility(loc,
            "Events table is missing"
        )

    def should_be_toolbar(self) -> None:
        """Проверка наличия тулбара"""

        loc = self.container_locator.locator("//nav[contains(@class, 'v-toolbar')]").nth(0)
        self.toolbar.check_toolbar_presence_by_locator(loc, "Toolbar is missing")

    def should_be_base_toolbar_buttons(self) -> None:
        """Проверяет наличие и видимость базовых кнопок тулбара."""

        self.toolbar.check_button_visibility("filter_button")
        self.toolbar.check_button_visibility("export_to_pdf_button")
        self.toolbar.check_button_tooltip("export_to_pdf_button", "Скачать в формате PDF")
        self.toolbar.check_button_visibility("export_to_csv_button")
        self.toolbar.check_button_tooltip("export_to_csv_button", "Скачать в формате CSV")


    def should_be_pagination_buttons(self) -> None:
        """Проверяет наличие и видимость кнопок пагинации."""

        self.chevron_left.check_visibility("Pagination button 'chevron left' is missing")
        self.data_set_number.check_visibility("Pagination button 'data set number' is missing")
        self.chevron_right.check_visibility("Pagination button 'chevron right' is missing")

__init__(page, locator)

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

Parameters:

Name Type Description Default
page Page

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

required
locator str | Locator

Локатор контейнера (строка или объект Locator)

required
Source code in components\events_container_component.py
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
def __init__(self, page: Page, locator: str | Locator):
    """Инициализирует базовый контейнер.

    Args:
        page: Экземпляр страницы Playwright
        locator: Локатор контейнера (строка или объект Locator)
    """
    super().__init__(page)

    self.container_locator = self.get_locator(locator)

    # тулбар
    self.toolbar = ToolbarComponent(page, "")
    filter_button_locator = self.container_locator.locator(ToolbarLocators.TITLE).\
                            get_by_role("button")
    self.toolbar.add_button(filter_button_locator, "filter_button")

    export_buttons = self.container_locator.locator(ToolbarLocators.ITEMS).\
                            get_by_role("button").all()
    self.toolbar.add_tooltip_button(export_buttons[1], "export_to_csv_button")
    self.toolbar.add_tooltip_button(export_buttons[0], "export_to_pdf_button")

    # Таблица событий
    self.events_table = TableComponent(page)
    self.table_locator = "//div[@class='scrolltable']/div/table"

    # Кнопки пагинации в нижней части контейнера
    self.chevron_left = Button(page,
                               self.container_locator.get_by_role("button").filter(has_text='chevron_left'),
                               "chevron_left")
    self.chevron_right = Button(page,
                               self.container_locator.get_by_role("button").filter(has_text='chevron_right'),
                               "chevron_right")

    loc = self.container_locator.get_by_role("button").filter(has_text='chevron_left').\
          locator("xpath=..").get_by_role("button").nth(1)
    self.data_set_number = Button(page, loc, "data_set_number")

add_tab_to_toolbar(locator, name)

Добавление кнопки типа v-tabs к тулбару

Source code in components\events_container_component.py
60
61
62
63
64
def add_tab_to_toolbar(self, locator: str | Locator, name: str) -> None:
    """Добавление кнопки типа v-tabs к тулбару"""

    tabs_locator = self.get_locator(locator)
    self.toolbar.add_tab_button(self.container_locator.locator(tabs_locator), name)

check_events_table_column_descending_order(index, convert2timestamp=False)

Проверка, что заданный столбец таблицы упорядочен по убыванию.

Parameters:

Name Type Description Default
index int

Индекс столбца.

required
convert2timestamp

Конвертировать строковое представление даты и времени в Unix timestamp.

False

Returns:

Type Description
bool

True, если столбец таблицы упорядочен по убыванию. Иначе: False

Source code in components\events_container_component.py
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
def check_events_table_column_descending_order(self,
                                                   index: int,
                                                   convert2timestamp=False) -> bool:
    """Проверка, что заданный столбец таблицы упорядочен по убыванию.

    Args:
        index: Индекс столбца.
        convert2timestamp: Конвертировать строковое представление даты и времени в Unix timestamp.

    Returns:
        True, если столбец таблицы упорядочен по убыванию. Иначе: False
    """

    loc = self.container_locator.locator(self.table_locator)
    return self.events_table.check_column_descending_order(loc, index, convert2timestamp)

check_events_table_first_row_visibility()

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

Raises:

Type Description
AssertionError

Если строка не видна.

Source code in components\events_container_component.py
197
198
199
200
201
202
203
204
205
def check_events_table_first_row_visibility(self) -> None:
    """Проверяет видимость первой строки таблицы.

    Raises:
        AssertionError: Если строка не видна.
    """

    loc = self.container_locator.locator(self.table_locator)
    self.events_table.check_first_row_visibility(loc)

check_events_table_headers(actual_headers, expected_headers)

Проверка соответствия заголовка таблицы ожидаемому

Source code in components\events_container_component.py
163
164
165
166
def check_events_table_headers(self, actual_headers, expected_headers) -> None:
    """ Проверка соответствия заголовка таблицы ожидаемому"""

    self.events_table.check_table_headers(actual_headers, expected_headers)

check_events_table_last_row_visibility()

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

Raises:

Type Description
AssertionError

Если строка не видна.

Source code in components\events_container_component.py
207
208
209
210
211
212
213
214
215
def check_events_table_last_row_visibility(self) -> None:
    """Проверяет видимость последней строки таблицы.

    Raises:
        AssertionError: Если строка не видна.
    """

    loc = self.container_locator.locator(self.table_locator)
    self.events_table.check_last_row_visibility(loc)

check_events_table_row_highlighting(row_index)

Проверяет выделение указанной строки таблицы.

Parameters:

Name Type Description Default
row_index int

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

required

Raises:

Type Description
AssertionError

Если строка не выделена.

Source code in components\events_container_component.py
184
185
186
187
188
189
190
191
192
193
194
195
def check_events_table_row_highlighting(self, row_index: int) -> None:
    """Проверяет выделение указанной строки таблицы.

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

    Raises:
        AssertionError: Если строка не выделена.
    """

    loc = self.container_locator.locator(self.table_locator)
    self.events_table.check_row_highlighting(loc, row_index)

check_events_table_verticall_scrolling()

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

Returns:

Name Type Description
bool bool

True если прокрутка возможна, иначе False.

Source code in components\events_container_component.py
217
218
219
220
221
222
223
224
225
def check_events_table_verticall_scrolling(self) -> bool:
    """Проверяет возможность вертикальной прокрутки таблицы.

    Returns:
        bool: True если прокрутка возможна, иначе False.
    """

    loc = self.container_locator.locator("//div[@class='scrolltable']//table/tbody")
    return self.events_table.is_scrollable_vertically(loc)

click_chevron_left()

Нажатие кнопки получения предыдущего набора данных

Source code in components\events_container_component.py
66
67
68
69
def click_chevron_left(self) -> None:
    """Нажатие кнопки получения предыдущего набора данных"""

    self.chevron_left.click()

click_chevron_right()

Нажатие кнопки получения следующего набора данных

Source code in components\events_container_component.py
71
72
73
74
def click_chevron_right(self) -> None:
    """Нажатие кнопки получения следующего набора данных"""

    self.chevron_right.click()

click_event_table_header_arrow(index)

Нажатие кнопки-стрелочки вверх/вниз в ячейке заголовка таблицы

Parameters:

Name Type Description Default
index int

Индекс ячейки в заголовке.

required
Source code in components\events_container_component.py
76
77
78
79
80
81
82
83
def click_event_table_header_arrow(self, index: int) -> None:
    """ Нажатие кнопки-стрелочки вверх/вниз в ячейке заголовка таблицы

    Args:
        index: Индекс ячейки в заголовке.
    """
    loc = self.container_locator.locator(self.table_locator)
    self.events_table.click_arrow_button(loc, index)

get_arrow_button_state(index)

Получение состояния кнопки-стрелочки вверх/вниз в ячейке заголовка таблицы

Parameters:

Name Type Description Default
index int

Индекс ячейки в заголовке.

required

Returns:

Type Description
str

up, если это стрелочка вверх. down, если это стрелочка вниз.

Source code in components\events_container_component.py
 95
 96
 97
 98
 99
100
101
102
103
104
105
def get_arrow_button_state(self, index: int) -> str:
    """ Получение состояния кнопки-стрелочки вверх/вниз в ячейке заголовка таблицы

    Args:
        index: Индекс ячейки в заголовке.

    Returns:
        up, если это стрелочка вверх. down, если это стрелочка вниз.
    """
    loc = self.container_locator.locator(self.table_locator)
    return self.events_table.get_arrow_button_state(loc, index)

get_current_data_set_number()

Получение номера текущего набора данных

Source code in components\events_container_component.py
85
86
87
88
89
90
91
92
93
def get_current_data_set_number(self) -> int:
    """Получение номера текущего набора данных"""

    try:
        data_set_number = int(self.data_set_number.get_text(0))
    except ValueError as e:
        assert False, f"Value Error: {e}"

    return data_set_number

get_events_table_content()

Возвращает содержимое таблицы, включая заголовки.

Returns:

Type Description
list[list[str]]

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

Source code in components\events_container_component.py
107
108
109
110
111
112
113
114
115
def get_events_table_content(self) -> list[list[str]]:
    """Возвращает содержимое таблицы, включая заголовки.

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

    loc = self.container_locator.locator(self.table_locator)
    return self.events_table.read(loc)

get_events_table_rows_count()

Возвращает количество строк в таблице (без заголовка).

Returns:

Name Type Description
int int

Количество строк с данными.

Raises:

Type Description
AssertionError

Если таблица пуста.

Source code in components\events_container_component.py
117
118
119
120
121
122
123
124
125
126
127
128
def get_events_table_rows_count(self) -> int:
    """Возвращает количество строк в таблице (без заголовка).

    Returns:
        int: Количество строк с данными.

    Raises:
        AssertionError: Если таблица пуста.
    """

    loc = self.container_locator.locator(self.table_locator)
    return self.events_table.get_rows_count(loc)

get_toolbar_export_to_csv_button()

Возвращает кнопку экспорта в csv.

Source code in components\events_container_component.py
135
136
137
138
def get_toolbar_export_to_csv_button(self) -> TooltipButton:
    """Возвращает кнопку экспорта в csv."""

    return self.toolbar.get_button_by_name("export_to_csv_button")

get_toolbar_export_to_pdf_button()

Возвращает кнопку экспорта в pdf.

Source code in components\events_container_component.py
140
141
142
143
def get_toolbar_export_to_pdf_button(self) -> TooltipButton:
    """Возвращает кнопку экспорта в pdf."""

    return self.toolbar.get_button_by_name("export_to_pdf_button")

get_toolbar_filter_button()

Возвращает кнопку фильтрации.

Source code in components\events_container_component.py
130
131
132
133
def get_toolbar_filter_button(self) -> Button:
    """Возвращает кнопку фильтрации."""

    return self.toolbar.get_button_by_name("filter_button")

get_toolbar_tab_button(name)

Возвращает кнопку типа v-tabs по имени.

Source code in components\events_container_component.py
145
146
147
148
def get_toolbar_tab_button(self, name: str) -> TabButton:
    """Возвращает кнопку типа v-tabs по имени."""

    return self.toolbar.get_button_by_name(name)

is_chevron_left_disabled()

Проверка видимости кнопки получения предыдущего набора данных

Source code in components\events_container_component.py
227
228
229
230
def is_chevron_left_disabled(self) -> bool:
    """Проверка видимости кнопки получения предыдущего набора данных"""

    return self.chevron_left.is_disabled()

is_chevron_right_disabled()

Проверка видимости кнопки получения следующего набора данных

Source code in components\events_container_component.py
232
233
234
235
def is_chevron_right_disabled(self) -> bool:
    """Проверка видимости кнопки получения следующего набора данных"""

    return self.chevron_right.is_disabled()

scroll_events_table_down()

Прокручивает таблицу событий вниз.

Source code in components\events_container_component.py
156
157
158
159
160
def scroll_events_table_down(self) -> None:
    """Прокручивает таблицу событий вниз."""

    loc = self.container_locator.locator("//div[@class='scrolltable']//table/tbody")
    self.events_table.scroll_down(loc)

scroll_events_table_up()

Прокручивает таблицу событий вверх.

Source code in components\events_container_component.py
150
151
152
153
154
def scroll_events_table_up(self) -> None:
    """Прокручивает таблицу событий вверх."""

    loc = self.container_locator.locator("//div[@class='scrolltable']//table/tbody")
    self.events_table.scroll_up(loc)

should_be_base_toolbar_buttons()

Проверяет наличие и видимость базовых кнопок тулбара.

Source code in components\events_container_component.py
255
256
257
258
259
260
261
262
def should_be_base_toolbar_buttons(self) -> None:
    """Проверяет наличие и видимость базовых кнопок тулбара."""

    self.toolbar.check_button_visibility("filter_button")
    self.toolbar.check_button_visibility("export_to_pdf_button")
    self.toolbar.check_button_tooltip("export_to_pdf_button", "Скачать в формате PDF")
    self.toolbar.check_button_visibility("export_to_csv_button")
    self.toolbar.check_button_tooltip("export_to_csv_button", "Скачать в формате CSV")

should_be_events_table()

Проверяет наличие таблицы событий.

Raises:

Type Description
AssertionError

Если таблица отсутствует.

Source code in components\events_container_component.py
237
238
239
240
241
242
243
244
245
246
247
def should_be_events_table(self) -> None:
    """Проверяет наличие таблицы событий.

    Raises:
        AssertionError: Если таблица отсутствует.
    """

    loc = self.container_locator.locator(self.table_locator)
    self.events_table.check_visibility(loc,
        "Events table is missing"
    )

should_be_pagination_buttons()

Проверяет наличие и видимость кнопок пагинации.

Source code in components\events_container_component.py
265
266
267
268
269
270
def should_be_pagination_buttons(self) -> None:
    """Проверяет наличие и видимость кнопок пагинации."""

    self.chevron_left.check_visibility("Pagination button 'chevron left' is missing")
    self.data_set_number.check_visibility("Pagination button 'data set number' is missing")
    self.chevron_right.check_visibility("Pagination button 'chevron right' is missing")

should_be_toolbar()

Проверка наличия тулбара

Source code in components\events_container_component.py
249
250
251
252
253
def should_be_toolbar(self) -> None:
    """Проверка наличия тулбара"""

    loc = self.container_locator.locator("//nav[contains(@class, 'v-toolbar')]").nth(0)
    self.toolbar.check_toolbar_presence_by_locator(loc, "Toolbar is missing")