From be28ffceaa53bd3d1a0172d962f4693327f08506 Mon Sep 17 00:00:00 2001 From: Radislav Date: Fri, 26 Sep 2025 14:28:59 +0300 Subject: [PATCH] =?UTF-8?q?=D0=90=D0=BA=D1=82=D1=83=D0=B0=D0=BB=D0=B8?= =?UTF-8?q?=D0=B7=D0=B0=D1=86=D0=B8=D1=8F=20=D0=B4=D0=BE=D0=BA=D1=83=D0=BC?= =?UTF-8?q?=D0=B5=D0=BD=D1=82=D0=B0=D1=86=D0=B8=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- components/events_container_component.py | 3 - docs/components/events_container_component.md | 6 + .../container_system_log_events.md | 6 + docs/pages/ztp_templates_tab.md | 6 + .../e2e/test_system_log_events_container.md | 6 + docs/tests/e2e/test_ztp_templates_tab.md | 6 + mkdocs.yml | 25 +- pages/templates_tab.py | 6 +- site/404.html | 105 + site/components/alert_component/index.html | 105 + site/components/base_component/index.html | 105 + site/components/card_component/index.html | 105 + site/components/confirm_component/index.html | 105 + .../dropdown_list_component/index.html | 105 + site/components/eventbar_component/index.html | 435 +- .../events_container_component/index.html | 4988 ++++++++++++++++ .../json_container_component/index.html | 451 +- .../modal_window_component/index.html | 313 +- site/components/navbar_component/index.html | 205 +- site/components/table_component/index.html | 1280 +++- site/components/toolbar_component/index.html | 759 ++- .../container_system_log_events/index.html | 2788 +++++++++ .../dialog_user_settings/index.html | 107 +- .../modal_add_AD_user/index.html | 105 + .../modal_add_local_user/index.html | 105 + .../modal_change_password/index.html | 105 + .../modal_edit_user/index.html | 105 + .../modal_view_template/index.html | 742 ++- site/components_derived/user_card/index.html | 105 + site/config/add_docstring/index.html | 105 + .../code_development_process/index.html | 105 + site/config/mkdocs_guide/index.html | 105 + site/data/constants/index.html | 105 + site/data/environment/index.html | 105 + site/data/roles_dict/index.html | 105 + site/elements/base_element/index.html | 105 + site/elements/button_element/index.html | 105 + site/elements/checkbox_element/index.html | 105 + site/elements/icon_element/index.html | 105 + site/elements/tab_button_element/index.html | 105 + site/elements/text_element/index.html | 105 + site/elements/text_input_element/index.html | 105 + .../tooltip_button_element/index.html | 105 + site/fixtures/pages/index.html | 105 + site/index.html | 105 + site/locators/button_locators/index.html | 105 + site/locators/confirm_locators/index.html | 105 + site/locators/event_panel_locators/index.html | 116 +- site/locators/input_locators/index.html | 105 + .../json_container_locators/index.html | 105 + .../locators/modal_window_locators/index.html | 119 +- .../navigation_panel_locators/index.html | 105 + site/locators/table_locators/index.html | 105 + site/locators/text_input_locators/index.html | 105 + site/locators/text_locators/index.html | 105 + site/locators/toolbar_locators/index.html | 111 +- site/locators/user_card_locators/index.html | 105 + site/objects.inv | Bin 4533 -> 5211 bytes site/pages/base_page/index.html | 105 + site/pages/license_tab/index.html | 105 + site/pages/login_page/index.html | 105 + site/pages/main_page/index.html | 372 +- site/pages/service_status_tab/index.html | 359 +- site/pages/session_tab/index.html | 405 +- site/pages/templates_tab/index.html | 1651 +++--- site/pages/users_tab/index.html | 107 +- site/pages/ztp_templates_tab/index.html | 5199 +++++++++++++++++ site/search/search_index.json | 2 +- site/sitemap.xml.gz | Bin 127 -> 127 bytes .../components/test_json_container/index.html | 107 +- .../test_navigation_panel/index.html | 105 + .../components/test_services_table/index.html | 105 + .../test_user_modal_window/index.html | 105 + site/tests/e2e/test_event_panel/index.html | 107 +- .../test_expand_navigation_panel/index.html | 171 +- site/tests/e2e/test_license_tab/index.html | 105 + site/tests/e2e/test_login/index.html | 105 + .../e2e/test_service_status_tab/index.html | 105 + site/tests/e2e/test_sessions_tab/index.html | 107 +- .../index.html | 3716 ++++++++++++ site/tests/e2e/test_templates_tab/index.html | 256 +- site/tests/e2e/test_user_card/index.html | 105 + site/tests/e2e/test_users_tab/index.html | 107 +- .../e2e/test_ztp_templates_tab/index.html | 3837 ++++++++++++ site/tools/fix_python_project/index.html | 105 + site/tools/logger/index.html | 105 + 86 files changed, 31623 insertions(+), 2398 deletions(-) create mode 100644 docs/components/events_container_component.md create mode 100644 docs/components_derived/container_system_log_events.md create mode 100644 docs/pages/ztp_templates_tab.md create mode 100644 docs/tests/e2e/test_system_log_events_container.md create mode 100644 docs/tests/e2e/test_ztp_templates_tab.md create mode 100644 site/components/events_container_component/index.html create mode 100644 site/components_derived/container_system_log_events/index.html create mode 100644 site/pages/ztp_templates_tab/index.html create mode 100644 site/tests/e2e/test_system_log_events_container/index.html create mode 100644 site/tests/e2e/test_ztp_templates_tab/index.html diff --git a/components/events_container_component.py b/components/events_container_component.py index 76fbaf7..3bf2d4b 100644 --- a/components/events_container_component.py +++ b/components/events_container_component.py @@ -117,9 +117,6 @@ class EventsContainerComponent(BaseComponent): def get_events_table_content(self) -> list[list[str]]: """Возвращает содержимое таблицы, включая заголовки. - Args: - locator: Локатор таблицы. - Returns: Двумерный список с содержимым таблицы. """ diff --git a/docs/components/events_container_component.md b/docs/components/events_container_component.md new file mode 100644 index 0000000..0319579 --- /dev/null +++ b/docs/components/events_container_component.md @@ -0,0 +1,6 @@ +# EventsContainerComponent + +::: components.events_container_component + handler: python + options: + show_source: true \ No newline at end of file diff --git a/docs/components_derived/container_system_log_events.md b/docs/components_derived/container_system_log_events.md new file mode 100644 index 0000000..2d3f148 --- /dev/null +++ b/docs/components_derived/container_system_log_events.md @@ -0,0 +1,6 @@ +# SystemLogEventsContainer + +::: components_derived.container_system_log_events + handler: python + options: + show_source: true \ No newline at end of file diff --git a/docs/pages/ztp_templates_tab.md b/docs/pages/ztp_templates_tab.md new file mode 100644 index 0000000..d2f33c1 --- /dev/null +++ b/docs/pages/ztp_templates_tab.md @@ -0,0 +1,6 @@ +# ZTPTemplatesTab + +::: pages.ztp_templates_tab + handler: python + options: + show_source: true \ No newline at end of file diff --git a/docs/tests/e2e/test_system_log_events_container.md b/docs/tests/e2e/test_system_log_events_container.md new file mode 100644 index 0000000..0c98604 --- /dev/null +++ b/docs/tests/e2e/test_system_log_events_container.md @@ -0,0 +1,6 @@ +# TestSystemLogEventsContainer + +::: tests.e2e.test_system_log_events_container + handler: python + options: + show_source: true \ No newline at end of file diff --git a/docs/tests/e2e/test_ztp_templates_tab.md b/docs/tests/e2e/test_ztp_templates_tab.md new file mode 100644 index 0000000..41abbf7 --- /dev/null +++ b/docs/tests/e2e/test_ztp_templates_tab.md @@ -0,0 +1,6 @@ +# TestZTPTemplatesTab + +::: tests.e2e.test_ztp_templates_tab + handler: python + options: + show_source: true \ No newline at end of file diff --git a/mkdocs.yml b/mkdocs.yml index 51ca3e4..1b9ca24 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -24,7 +24,7 @@ nav: - BaseElement: elements/base_element.md - Button: elements/button_element.md - Checkbox: elements/checkbox_element.md - - Icon: elements/icon_element.md #new + - Icon: elements/icon_element.md - TabButton: elements/tab_button_element.md - Text: elements/text_element.md - TextInput: elements/text_input_element.md @@ -36,19 +36,21 @@ nav: - ConfirmComponent: components/confirm_component.md - DropdownList: components/dropdown_list_component.md - EventPanelComponent: components/eventbar_component.md + - EventsContainerComponent: components/events_container_component.md #new - JsonContainerComponent: components/json_container_component.md - ModalWindowComponent: components/modal_window_component.md - NavigationPanelComponent: components/navbar_component.md - TableComponent: components/table_component.md - ToolbarComponent: components/toolbar_component.md - Компоненты производные UI: - - UserSettingsDialogWindow: components_derived/dialog_user_settings.md #new + - SystemLogEventsContainer: components_derived/container_system_log_events.md #new + - UserSettingsDialogWindow: components_derived/dialog_user_settings.md - AddADUserModalWindow: components_derived/modal_add_AD_user.md - AddLocalUserModalWindow: components_derived/modal_add_local_user.md - - ChangePasswordModalWindow: components_derived/modal_change_password.md #new + - ChangePasswordModalWindow: components_derived/modal_change_password.md - EditUserModalWindow: components_derived/modal_edit_user.md - - ViewTemplateModalWindow: components_derived/modal_view_template.md #new - - UserCard: components_derived/user_card.md #new + - ViewTemplateModalWindow: components_derived/modal_view_template.md + - UserCard: components_derived/user_card.md - Локаторы: - ButtonLocators: locators/button_locators.md - ConfirmLocators: locators/confirm_locators.md @@ -58,10 +60,10 @@ nav: - ModalWindowLocators: locators/modal_window_locators.md - NavigationPanelLocators: locators/navigation_panel_locators.md - TableLocators: locators/table_locators.md - - TextInputLocators: locators/text_input_locators.md #new + - TextInputLocators: locators/text_input_locators.md - TextLocators: locators/text_locators.md - ToolbarLocators: locators/toolbar_locators.md - - UserCardLocators: locators/user_card_locators.md #new + - UserCardLocators: locators/user_card_locators.md - Страницы приложения: - BasePage: pages/base_page.md - LicenseTab: pages/license_tab.md @@ -69,8 +71,9 @@ nav: - MainPage: pages/main_page.md - ServiceStatusTab: pages/service_status_tab.md - SessionTab: pages/session_tab.md - - TemplatesTab: pages/templates_tab.md #new + - TemplatesTab: pages/templates_tab.md - UsersTab: pages/users_tab.md + - ZTPTemplatesTab: pages/ztp_templates_tab.md #new - Тесты: - End-to-End: - TestEventPanel: tests/e2e/test_event_panel.md @@ -79,9 +82,11 @@ nav: - TestLogin: tests/e2e/test_login.md - TestServiceStatusTab: tests/e2e/test_service_status_tab.md - TestSessionTab: tests/e2e/test_sessions_tab.md - - TestTemplatesTab: tests/e2e/test_templates_tab.md #new - - TestUserCard: tests/e2e/test_user_card.md #new + - TestSystemLogEventsContainer: tests/e2e/test_system_log_events_container.md #new + - TestTemplatesTab: tests/e2e/test_templates_tab.md + - TestUserCard: tests/e2e/test_user_card.md - TestUsersTab: tests/e2e/test_users_tab.md + - TestZTPTemplatesTab: tests/e2e/test_ztp_templates_tab.md #new - Компоненты: - TestJsonContainer: tests/components/test_json_container.md - TestNavigationPanel: tests/components/test_navigation_panel.md diff --git a/pages/templates_tab.py b/pages/templates_tab.py index 08351e1..05b10c9 100644 --- a/pages/templates_tab.py +++ b/pages/templates_tab.py @@ -53,14 +53,14 @@ class TemplatesTab(BasePage): self.modal_windows[title] = ViewTemplateModalWindow(self.page, title) - def get_modal_window(self, title: str): + def get_modal_window(self, title: str) -> ViewTemplateModalWindow: """Возвращает модальное окно по заголовку. Args: title: Заголовок окна. Returns: - ModalWindowComponent: Экземпляр модального окна. + ViewTemplateModalWindow: Экземпляр модального окна. Raises: AssertionError: Если окно не найдено. @@ -168,7 +168,7 @@ class TemplatesTab(BasePage): Raises: AssertionError: Если шаблон с указанным именем не найден - или структура ответа некорректна. + или структура ответа некорректна. """ # Проверяем, что ответ является списком шаблонов assert isinstance(response_data, list), "API response is not a list of templates" diff --git a/site/404.html b/site/404.html index fa3922c..fc536b8 100644 --- a/site/404.html +++ b/site/404.html @@ -742,6 +742,27 @@ +
  • + + + + + EventsContainerComponent + + + + +
  • + + + + + + + + + +
  • @@ -889,6 +910,27 @@ +
  • + + + + + SystemLogEventsContainer + + + + +
  • + + + + + + + + + +
  • @@ -1534,6 +1576,27 @@ + + + + + + +
  • + + + + + ZTPTemplatesTab + + + + +
  • + + + + @@ -1743,6 +1806,27 @@ +
  • + + + + + TestSystemLogEventsContainer + + + + +
  • + + + + + + + + + +
  • @@ -1800,6 +1884,27 @@ + + + + + + +
  • + + + + + TestZTPTemplatesTab + + + + +
  • + + + + diff --git a/site/components/alert_component/index.html b/site/components/alert_component/index.html index b1363f8..f80400d 100644 --- a/site/components/alert_component/index.html +++ b/site/components/alert_component/index.html @@ -871,6 +871,27 @@ +
  • + + + + + EventsContainerComponent + + + + +
  • + + + + + + + + + +
  • @@ -1018,6 +1039,27 @@ +
  • + + + + + SystemLogEventsContainer + + + + +
  • + + + + + + + + + +
  • @@ -1663,6 +1705,27 @@ + + + + + + +
  • + + + + + ZTPTemplatesTab + + + + +
  • + + + + @@ -1872,6 +1935,27 @@ +
  • + + + + + TestSystemLogEventsContainer + + + + +
  • + + + + + + + + + +
  • @@ -1929,6 +2013,27 @@ + + + + + + +
  • + + + + + TestZTPTemplatesTab + + + + +
  • + + + + diff --git a/site/components/base_component/index.html b/site/components/base_component/index.html index b8a99a1..3fa66c3 100644 --- a/site/components/base_component/index.html +++ b/site/components/base_component/index.html @@ -907,6 +907,27 @@ +
  • + + + + + EventsContainerComponent + + + + +
  • + + + + + + + + + +
  • @@ -1054,6 +1075,27 @@ +
  • + + + + + SystemLogEventsContainer + + + + +
  • + + + + + + + + + +
  • @@ -1699,6 +1741,27 @@ + + + + + + +
  • + + + + + ZTPTemplatesTab + + + + +
  • + + + + @@ -1908,6 +1971,27 @@ +
  • + + + + + TestSystemLogEventsContainer + + + + +
  • + + + + + + + + + +
  • @@ -1965,6 +2049,27 @@ + + + + + + +
  • + + + + + TestZTPTemplatesTab + + + + +
  • + + + + diff --git a/site/components/card_component/index.html b/site/components/card_component/index.html index 8ff6636..531f65c 100644 --- a/site/components/card_component/index.html +++ b/site/components/card_component/index.html @@ -835,6 +835,27 @@ +
  • + + + + + EventsContainerComponent + + + + +
  • + + + + + + + + + +
  • @@ -982,6 +1003,27 @@ +
  • + + + + + SystemLogEventsContainer + + + + +
  • + + + + + + + + + +
  • @@ -1627,6 +1669,27 @@ + + + + + + +
  • + + + + + ZTPTemplatesTab + + + + +
  • + + + + @@ -1836,6 +1899,27 @@ +
  • + + + + + TestSystemLogEventsContainer + + + + +
  • + + + + + + + + + +
  • @@ -1893,6 +1977,27 @@ + + + + + + +
  • + + + + + TestZTPTemplatesTab + + + + +
  • + + + + diff --git a/site/components/confirm_component/index.html b/site/components/confirm_component/index.html index acb11e1..65afdc0 100644 --- a/site/components/confirm_component/index.html +++ b/site/components/confirm_component/index.html @@ -934,6 +934,27 @@ +
  • + + + + + EventsContainerComponent + + + + +
  • + + + + + + + + + +
  • @@ -1081,6 +1102,27 @@ +
  • + + + + + SystemLogEventsContainer + + + + +
  • + + + + + + + + + +
  • @@ -1726,6 +1768,27 @@ + + + + + + +
  • + + + + + ZTPTemplatesTab + + + + +
  • + + + + @@ -1935,6 +1998,27 @@ +
  • + + + + + TestSystemLogEventsContainer + + + + +
  • + + + + + + + + + +
  • @@ -1992,6 +2076,27 @@ + + + + + + +
  • + + + + + TestZTPTemplatesTab + + + + +
  • + + + + diff --git a/site/components/dropdown_list_component/index.html b/site/components/dropdown_list_component/index.html index 41e9d12..621a340 100644 --- a/site/components/dropdown_list_component/index.html +++ b/site/components/dropdown_list_component/index.html @@ -871,6 +871,27 @@ +
  • + + + + + EventsContainerComponent + + + + +
  • + + + + + + + + + +
  • @@ -1018,6 +1039,27 @@ +
  • + + + + + SystemLogEventsContainer + + + + +
  • + + + + + + + + + +
  • @@ -1663,6 +1705,27 @@ + + + + + + +
  • + + + + + ZTPTemplatesTab + + + + +
  • + + + + @@ -1872,6 +1935,27 @@ +
  • + + + + + TestSystemLogEventsContainer + + + + +
  • + + + + + + + + + +
  • @@ -1929,6 +2013,27 @@ + + + + + + +
  • + + + + + TestZTPTemplatesTab + + + + +
  • + + + + diff --git a/site/components/eventbar_component/index.html b/site/components/eventbar_component/index.html index 957a9d5..37b5c18 100644 --- a/site/components/eventbar_component/index.html +++ b/site/components/eventbar_component/index.html @@ -12,7 +12,7 @@ - + @@ -822,15 +822,6 @@ - - -
  • - - - check_user_card_content - - -
  • @@ -849,6 +840,15 @@ +
  • + +
  • + + + click_system_log_tab + + +
  • @@ -952,6 +952,27 @@ +
  • + + + + + EventsContainerComponent + + + + +
  • + + + + + + + + + +
  • @@ -1099,6 +1120,27 @@ +
  • + + + + + SystemLogEventsContainer + + + + +
  • + + + + + + + + + +
  • @@ -1744,6 +1786,27 @@ + + + + + + +
  • + + + + + ZTPTemplatesTab + + + + +
  • + + + + @@ -1953,6 +2016,27 @@ +
  • + + + + + TestSystemLogEventsContainer + + + + +
  • + + + + + + + + + +
  • @@ -2010,6 +2094,27 @@ + + + + + + +
  • + + + + + TestZTPTemplatesTab + + + + +
  • + + + + @@ -2411,15 +2516,6 @@ - - -
  • - - - check_user_card_content - - -
  • @@ -2438,6 +2534,15 @@ +
  • + +
  • + + + click_system_log_tab + + +
  • @@ -2596,8 +2701,7 @@
    Source code in components\eventbar_component.py -
     15
    - 16
    +                
     16
      17
      18
      19
    @@ -2743,7 +2847,12 @@
     159
     160
     161
    -162
    class EventPanelComponent(BaseComponent):
    +162
    +163
    +164
    +165
    +166
    +167
    class EventPanelComponent(BaseComponent):
         """Компонент панели событий. Предоставляет методы для взаимодействия с ней."""
     
         def __init__(self, page: Page):
    @@ -2770,8 +2879,6 @@
             self.search_button = Button(page, buttons_service_locators[0], "search_button")
             self.user_button = Button(page, buttons_service_locators[1], "user_button")
     
    -        self.user_card = UserCard(page)
    -
         # Действия:
         def click_expand_less_button(self) -> None:
             """Выполняет нажатие кнопки галочка вверх."""
    @@ -2787,12 +2894,23 @@
                              get_by_role("button").filter(has_text='expand_more')
             button_locator.click()
     
    +    def click_system_log_tab(self) -> SystemLogEventsContainer:
    +        """Выполняет нажатие tab-кнопки Системный журнал."""
    +
    +        self.system_log_tab.check_visibility("System log tab button is missing on event panel")
    +        self.system_log_tab.click()
    +
    +        system_log_events = SystemLogEventsContainer(self.page, EventPanelLocators.CONTAINER_SYSTEM_LOG_EVENTS)
    +        return system_log_events
    +
         def click_user_button(self) -> UserCard:
             """Выполняет нажатие кнопки пользователя."""
     
             self.should_be_user_button()
             self.user_button.click()
    -        return self.user_card
    +
    +        user_card = UserCard(self.page)
    +        return user_card
     
         def do_logout(self) -> None:
             """Выполняет выход из системы."""
    @@ -2860,11 +2978,6 @@
                 return False
             return True
     
    -    def check_user_card_content(self):
    -        """Проверяет наличие и корректность элементов карточки пользователя."""
    -
    -        self.user_card.check_content()
    -
         def should_be_user_button(self) -> None:
             """Проверяет наличие кнопки пользователя."""
     
    @@ -2953,8 +3066,7 @@
     
                 
    Source code in components\eventbar_component.py -
    18
    -19
    +              
    19
     20
     21
     22
    @@ -2976,8 +3088,7 @@
     38
     39
     40
    -41
    -42
    def __init__(self, page: Page):
    +41
    def __init__(self, page: Page):
         """Инициализирует компонент панели событий.
     
         Args:
    @@ -3000,8 +3111,6 @@
         buttons_service_locators = self.page.locator(EventPanelLocators.BUTTONS_SERVICE).get_by_role("button").all()
         self.search_button = Button(page, buttons_service_locators[0], "search_button")
         self.user_button = Button(page, buttons_service_locators[1], "user_button")
    -
    -    self.user_card = UserCard(page)
     
    @@ -3024,15 +3133,15 @@
    Source code in components\eventbar_component.py -
    112
    -113
    -114
    -115
    -116
    -117
    -118
    -119
    -120
    def check_expand_less_button(self) -> bool:
    +              
    122
    +123
    +124
    +125
    +126
    +127
    +128
    +129
    +130
    def check_expand_less_button(self) -> bool:
         """Проверяет наличие кнопки галочка вверх."""
     
         try:
    @@ -3063,15 +3172,15 @@
     
                 
    Source code in components\eventbar_component.py -
    122
    -123
    -124
    -125
    -126
    -127
    -128
    -129
    -130
    def check_expand_more_button(self) -> bool:
    +              
    132
    +133
    +134
    +135
    +136
    +137
    +138
    +139
    +140
    def check_expand_more_button(self) -> bool:
         """Проверяет наличие кнопки галочка вниз"""
     
         try:
    @@ -3089,35 +3198,6 @@
     
    -

    - check_user_card_content() - -

    - - -
    - -

    Проверяет наличие и корректность элементов карточки пользователя.

    - - -
    - Source code in components\eventbar_component.py -
    132
    -133
    -134
    -135
    def check_user_card_content(self):
    -    """Проверяет наличие и корректность элементов карточки пользователя."""
    -
    -    self.user_card.check_content()
    -
    -
    -
    - -
    - -
    - -

    click_expand_less_button() @@ -3131,12 +3211,12 @@
    Source code in components\eventbar_component.py -
    45
    +              
    44
    +45
     46
     47
     48
    -49
    -50
    def click_expand_less_button(self) -> None:
    +49
    def click_expand_less_button(self) -> None:
         """Выполняет нажатие кнопки галочка вверх."""
     
         button_locator = self.page.locator(EventPanelLocators.TAB_EXPAND_BUTTONS).\
    @@ -3164,12 +3244,12 @@
     
                 
    Source code in components\eventbar_component.py -
    52
    +              
    51
    +52
     53
     54
     55
    -56
    -57
    def click_expand_more_button(self) -> None:
    +56
    def click_expand_more_button(self) -> None:
         """Выполняет нажатие кнопки галочка вниз."""
     
         button_locator = self.page.locator(EventPanelLocators.TAB_EXPAND_BUTTONS).\
    @@ -3184,6 +3264,43 @@
     
    +

    + click_system_log_tab() + +

    + + +
    + +

    Выполняет нажатие tab-кнопки Системный журнал.

    + + +
    + Source code in components\eventbar_component.py +
    58
    +59
    +60
    +61
    +62
    +63
    +64
    +65
    def click_system_log_tab(self) -> SystemLogEventsContainer:
    +    """Выполняет нажатие tab-кнопки Системный журнал."""
    +
    +    self.system_log_tab.check_visibility("System log tab button is missing on event panel")
    +    self.system_log_tab.click()
    +
    +    system_log_events = SystemLogEventsContainer(self.page, EventPanelLocators.CONTAINER_SYSTEM_LOG_EVENTS)
    +    return system_log_events
    +
    +
    +
    + +
    + +
    + +

    click_user_button() @@ -3197,17 +3314,21 @@
    Source code in components\eventbar_component.py -
    59
    -60
    -61
    -62
    -63
    -64
    def click_user_button(self) -> UserCard:
    +              
    67
    +68
    +69
    +70
    +71
    +72
    +73
    +74
    def click_user_button(self) -> UserCard:
         """Выполняет нажатие кнопки пользователя."""
     
         self.should_be_user_button()
         self.user_button.click()
    -    return self.user_card
    +
    +    user_card = UserCard(self.page)
    +    return user_card
     
    @@ -3230,11 +3351,11 @@
    Source code in components\eventbar_component.py -
    66
    -67
    -68
    -69
    -70
    def do_logout(self) -> None:
    +              
    76
    +77
    +78
    +79
    +80
    def do_logout(self) -> None:
         """Выполняет выход из системы."""
     
         user_card = self.click_user_button()
    @@ -3261,17 +3382,17 @@
     
                 
    Source code in components\eventbar_component.py -
    84
    -85
    -86
    -87
    -88
    -89
    -90
    -91
    -92
    -93
    -94
    def get_event_button_values(self) -> {}:
    +              
     94
    + 95
    + 96
    + 97
    + 98
    + 99
    +100
    +101
    +102
    +103
    +104
    def get_event_button_values(self) -> {}:
         """Возвращает набор значений кнопок счетчиков событий."""
     
         event_buttons_texts = {}
    @@ -3304,17 +3425,17 @@
     
                 
    Source code in components\eventbar_component.py -
    72
    -73
    -74
    -75
    -76
    -77
    -78
    -79
    -80
    -81
    -82
    def get_event_tooltip_texts(self) -> []:
    +              
    82
    +83
    +84
    +85
    +86
    +87
    +88
    +89
    +90
    +91
    +92
    def get_event_tooltip_texts(self) -> []:
         """Возвращает список текстов всплывающих подсказок кнопок счетчиков событий."""
     
         tooltip_texts = []
    @@ -3347,20 +3468,20 @@
     
                 
    Source code in components\eventbar_component.py -
     96
    - 97
    - 98
    - 99
    -100
    -101
    -102
    -103
    -104
    -105
    -106
    +              
    106
     107
     108
    -109
    def get_panel_position(self) -> str:
    +109
    +110
    +111
    +112
    +113
    +114
    +115
    +116
    +117
    +118
    +119
    def get_panel_position(self) -> str:
         """Возвращает текущее положение панели событий относительно страницы: "top", "center","bottom"."""
     
         style_attr = self.page.locator(EventPanelLocators.AREA_EVENTS).get_attribute("style")
    @@ -3396,13 +3517,13 @@
     
                 
    Source code in components\eventbar_component.py -
    156
    -157
    -158
    -159
    -160
    -161
    -162
    def should_be_event_buttons(self) -> None:
    +              
    161
    +162
    +163
    +164
    +165
    +166
    +167
    def should_be_event_buttons(self) -> None:
         """Проверяет наличие блока кнопок-счетчиков событий."""
     
         self.unknown_reason_button.check_visibility("Unknown reason event button is missing on event panel")
    @@ -3431,10 +3552,10 @@
     
                 
    Source code in components\eventbar_component.py -
    142
    -143
    -144
    -145
    def should_be_search_button(self) -> None:
    +              
    147
    +148
    +149
    +150
    def should_be_search_button(self) -> None:
         """Проверяет наличие кнопки поиска."""
     
         self.search_button.check_visibility("Search button is missing on event panel")
    @@ -3460,14 +3581,14 @@
     
                 
    Source code in components\eventbar_component.py -
    147
    -148
    -149
    -150
    -151
    -152
    +              
    152
     153
    -154
    def should_be_tab_buttons(self) -> None:
    +154
    +155
    +156
    +157
    +158
    +159
    def should_be_tab_buttons(self) -> None:
         """Проверяет наличие блока tab-кнопок Состояния, Действия, События, Обслуживание, Системный журнал."""
     
         self.states_tab.check_have_text('Состояния', "Tab button with text Состояния is missing on event panel")
    @@ -3497,10 +3618,10 @@
     
                 
    Source code in components\eventbar_component.py -
    137
    -138
    -139
    -140
    def should_be_user_button(self) -> None:
    +              
    142
    +143
    +144
    +145
    def should_be_user_button(self) -> None:
         """Проверяет наличие кнопки пользователя."""
     
         self.user_button.check_visibility("User button is missing on event panel")
    diff --git a/site/components/events_container_component/index.html b/site/components/events_container_component/index.html
    new file mode 100644
    index 0000000..e63d3f7
    --- /dev/null
    +++ b/site/components/events_container_component/index.html
    @@ -0,0 +1,4988 @@
    +
    +
    +
    +  
    +    
    +      
    +      
    +      
    +      
    +      
    +      
    +        
    +      
    +      
    +        
    +      
    +      
    +      
    +      
    +    
    +    
    +      
    +        EventsContainerComponent - Документация тестов eNODE-Мониторинг
    +      
    +    
    +    
    +      
    +      
    +      
    +
    +
    +    
    +    
    +      
    +    
    +    
    +      
    +        
    +        
    +        
    +        
    +        
    +      
    +    
    +    
    +      
    +    
    +    
    +    
    +      
    +
    +    
    +    
    +    
    +  
    +  
    +  
    +    
    +  
    +    
    +    
    +    
    +    
    +    
    +    
    + +
    + + + + + + +
    + + +
    + +
    + + + + + + +
    +
    + + + +
    +
    +
    + + + + + +
    +
    +
    + + + + + + + +
    +
    + + + + +

    EventsContainerComponent

    + + +
    + + + + +
    + +

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

    + + + + + + + + + +
    + + + + + + + + +
    + + + +

    + EventsContainerComponent + + +

    + + +
    +

    + Bases: BaseComponent

    + + +

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

    + + + + + + + +
    + Source code in components\events_container_component.py +
     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
    +271
    +272
    +273
    +274
    +275
    +276
    +277
    +278
    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 datetime2timestamp(self, date_string: str) -> float:
    +        """ Конвертация строкового представления даты и времени в Unix timestamp """
    +
    +        # Формат, соответствующий строке с датой и временем
    +        format_string = "%d.%m.%Y %H:%M:%S"
    +
    +        date_object = datetime.strptime(date_string, format_string)
    +        return date_object.timestamp()
    +
    +    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) -> bool:
    +        """Проверка, что заданный столбец таблицы упорядочен по убыванию.
    +
    +        Args:
    +            index: Индекс столбца.
    +
    +        Returns:
    +            True, если столбец таблицы упорядочен по убыванию. Иначе: False
    +        """
    +
    +        loc = self.container_locator.locator(self.table_locator)
    +        return self.events_table.check_column_descending_order(loc, index)
    +
    +    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:

    + + + + + + + + + + + + + + + + + + + + + + + +
    NameTypeDescriptionDefault
    + page + + Page + +
    +

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

    +
    +
    + required +
    + locator + + str | Locator + +
    +

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

    +
    +
    + required +
    + + +
    + Source code in components\events_container_component.py +
    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
    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 +
    61
    +62
    +63
    +64
    +65
    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) + +

    + + +
    + +

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

    + + +

    Parameters:

    + + + + + + + + + + + + + + + + + +
    NameTypeDescriptionDefault
    + index + + int + +
    +

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

    +
    +
    + required +
    + + +

    Returns:

    + + + + + + + + + + + + + +
    TypeDescription
    + bool + +
    +

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

    +
    +
    + + +
    + Source code in components\events_container_component.py +
    178
    +179
    +180
    +181
    +182
    +183
    +184
    +185
    +186
    +187
    +188
    +189
    +190
    def check_events_table_column_descending_order(self,
    +                                                   index: int) -> bool:
    +    """Проверка, что заданный столбец таблицы упорядочен по убыванию.
    +
    +    Args:
    +        index: Индекс столбца.
    +
    +    Returns:
    +        True, если столбец таблицы упорядочен по убыванию. Иначе: False
    +    """
    +
    +    loc = self.container_locator.locator(self.table_locator)
    +    return self.events_table.check_column_descending_order(loc, index)
    +
    +
    +
    + +
    + +
    + + +

    + check_events_table_first_row_visibility() + +

    + + +
    + +

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

    + + +

    Raises:

    + + + + + + + + + + + + + +
    TypeDescription
    + AssertionError + +
    +

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

    +
    +
    + + +
    + Source code in components\events_container_component.py +
    205
    +206
    +207
    +208
    +209
    +210
    +211
    +212
    +213
    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 +
    173
    +174
    +175
    +176
    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:

    + + + + + + + + + + + + + +
    TypeDescription
    + AssertionError + +
    +

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

    +
    +
    + + +
    + Source code in components\events_container_component.py +
    215
    +216
    +217
    +218
    +219
    +220
    +221
    +222
    +223
    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:

    + + + + + + + + + + + + + + + + + +
    NameTypeDescriptionDefault
    + row_index + + int + +
    +

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

    +
    +
    + required +
    + + +

    Raises:

    + + + + + + + + + + + + + +
    TypeDescription
    + AssertionError + +
    +

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

    +
    +
    + + +
    + Source code in components\events_container_component.py +
    192
    +193
    +194
    +195
    +196
    +197
    +198
    +199
    +200
    +201
    +202
    +203
    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 TypeDescription
    bool + bool + +
    +

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

    +
    +
    + + +
    + Source code in components\events_container_component.py +
    225
    +226
    +227
    +228
    +229
    +230
    +231
    +232
    +233
    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 +
    67
    +68
    +69
    +70
    def click_chevron_left(self) -> None:
    +    """Нажатие кнопки получения предыдущего набора данных"""
    +
    +    self.chevron_left.click()
    +
    +
    +
    + +
    + +
    + + +

    + click_chevron_right() + +

    + + +
    + +

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

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

    + click_event_table_header_arrow(index) + +

    + + +
    + +

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

    + + +

    Parameters:

    + + + + + + + + + + + + + + + + + +
    NameTypeDescriptionDefault
    + index + + int + +
    +

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

    +
    +
    + required +
    + + +
    + Source code in components\events_container_component.py +
    77
    +78
    +79
    +80
    +81
    +82
    +83
    +84
    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)
    +
    +
    +
    + +
    + +
    + + +

    + datetime2timestamp(date_string) + +

    + + +
    + +

    Конвертация строкового представления даты и времени в Unix timestamp

    + + +
    + Source code in components\events_container_component.py +
    86
    +87
    +88
    +89
    +90
    +91
    +92
    +93
    def datetime2timestamp(self, date_string: str) -> float:
    +    """ Конвертация строкового представления даты и времени в Unix timestamp """
    +
    +    # Формат, соответствующий строке с датой и временем
    +    format_string = "%d.%m.%Y %H:%M:%S"
    +
    +    date_object = datetime.strptime(date_string, format_string)
    +    return date_object.timestamp()
    +
    +
    +
    + +
    + +
    + + +

    + get_arrow_button_state(index) + +

    + + +
    + +

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

    + + +

    Parameters:

    + + + + + + + + + + + + + + + + + +
    NameTypeDescriptionDefault
    + index + + int + +
    +

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

    +
    +
    + required +
    + + +

    Returns:

    + + + + + + + + + + + + + +
    TypeDescription
    + str + +
    +

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

    +
    +
    + + +
    + Source code in components\events_container_component.py +
    105
    +106
    +107
    +108
    +109
    +110
    +111
    +112
    +113
    +114
    +115
    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 +
     95
    + 96
    + 97
    + 98
    + 99
    +100
    +101
    +102
    +103
    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:

    + + + + + + + + + + + + + +
    TypeDescription
    + list[list[str]] + +
    +

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

    +
    +
    + + +
    + Source code in components\events_container_component.py +
    117
    +118
    +119
    +120
    +121
    +122
    +123
    +124
    +125
    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 TypeDescription
    int + int + +
    +

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

    +
    +
    + + +

    Raises:

    + + + + + + + + + + + + + +
    TypeDescription
    + AssertionError + +
    +

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

    +
    +
    + + +
    + Source code in components\events_container_component.py +
    127
    +128
    +129
    +130
    +131
    +132
    +133
    +134
    +135
    +136
    +137
    +138
    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 +
    145
    +146
    +147
    +148
    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 +
    150
    +151
    +152
    +153
    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 +
    140
    +141
    +142
    +143
    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 +
    155
    +156
    +157
    +158
    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 +
    235
    +236
    +237
    +238
    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 +
    240
    +241
    +242
    +243
    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 +
    166
    +167
    +168
    +169
    +170
    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 +
    160
    +161
    +162
    +163
    +164
    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 +
    263
    +264
    +265
    +266
    +267
    +268
    +269
    +270
    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:

    + + + + + + + + + + + + + +
    TypeDescription
    + AssertionError + +
    +

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

    +
    +
    + + +
    + Source code in components\events_container_component.py +
    245
    +246
    +247
    +248
    +249
    +250
    +251
    +252
    +253
    +254
    +255
    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 +
    273
    +274
    +275
    +276
    +277
    +278
    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 +
    257
    +258
    +259
    +260
    +261
    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")
    +
    +
    +
    + +
    + + + +
    + +
    + +
    + + + + +
    + +
    + +
    + + + + + + + + + + + + + +
    +
    + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + + \ No newline at end of file diff --git a/site/components/json_container_component/index.html b/site/components/json_container_component/index.html index 45bed76..900a2e0 100644 --- a/site/components/json_container_component/index.html +++ b/site/components/json_container_component/index.html @@ -9,7 +9,7 @@ - + @@ -751,6 +751,27 @@ + + +
  • + + + + + EventsContainerComponent + + + + +
  • + + + + + + + + @@ -1000,6 +1021,27 @@ +
  • + + + + + SystemLogEventsContainer + + + + +
  • + + + + + + + + + +
  • @@ -1645,6 +1687,27 @@ + + + + + + +
  • + + + + + ZTPTemplatesTab + + + + +
  • + + + + @@ -1854,6 +1917,27 @@ +
  • + + + + + TestSystemLogEventsContainer + + + + +
  • + + + + + + + + + +
  • @@ -1911,6 +1995,27 @@ + + + + + + +
  • + + + + + TestZTPTemplatesTab + + + + +
  • + + + + @@ -2550,53 +2655,10 @@ 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
    class JsonContainerComponent(BaseComponent):
    +167
    class JsonContainerComponent(BaseComponent):
         """Компонент для работы с JSON-данными на странице.
     
         Предоставляет методы чтения и проверки JSON-данных в контейнерах.
    -
         """
     
         def __init__(self, page: Page) -> None:
    @@ -2605,11 +2667,8 @@
             Args:
                 page: Экземпляр страницы Playwright.
             """
    +        self.page = page
     
    -        super().__init__(page)
    -
    -
    -    # Действия:
         def format_json_string(self, json_string: str) -> str:
             """Форматирует строку JSON для корректного парсинга.
     
    @@ -2619,7 +2678,6 @@
             Returns:
                 str: Отформатированная строка JSON.
             """
    -
             lines = json_string.splitlines()
             formatted_lines = []
             stack = []  # Стек для отслеживания вложенности
    @@ -2632,52 +2690,40 @@
     
                 # Определяем тип текущей строки
                 if line in ['{', '[']:
    -                # Начало объекта или массива
                     formatted_lines.append('  ' * current_indent + line)
                     stack.append(line)
                     current_indent += 1
                 elif line in ['}', ']']:
    -                # Конец объекта или массива
                     current_indent -= 1
                     if stack and stack[-1] in ['{', '[']:
                         stack.pop()
                     formatted_lines.append('  ' * current_indent + line)
                 elif re.match(r'^\d+:\{', line):
    -                # Элемент массива с индексом (0:{, 1:{, etc.)
    -                # Убираем индекс и оставляем только {
                     formatted_lines.append('  ' * current_indent + '{')
                     stack.append('{')
                     current_indent += 1
                 elif ':' in line:
    -                # Пара ключ:значение
                     key, value = line.split(':', 1)
                     key = key.strip()
                     value = value.strip()
     
    -                # Добавляем кавычки к ключу если их нет (включая $)
                     if not (key.startswith('"') and key.endswith('"')):
                         key = f'"{key}"'
     
    -                # Обработка значений
                     if value in ['{', '[']:
    -                    # Значение - начало объекта или массива
                         formatted_line = f'{key}: {value}'
                         formatted_lines.append('  ' * current_indent + formatted_line)
                         stack.append(value)
                         current_indent += 1
                     elif value in ['}', ']']:
    -                    # Не должно происходить, но на всякий случай
                         current_indent -= 1
                         formatted_line = f'{key}: {value}'
                         formatted_lines.append('  ' * current_indent + formatted_line)
                         if stack:
                             stack.pop()
                     else:
    -                    # Простое значение
    -                    # Добавляем кавычки к строковым значениям если их нет
    -                    if (value and
    -                        not value.isdigit() and
    -                        not value.replace('.', '', 1).isdigit() and  # Для чисел с точкой
    +                    if (value and not value.isdigit() and
    +                        not value.replace('.', '', 1).isdigit() and
                             value not in ['true', 'false', 'null'] and
                             not value.startswith('"') and not value.endswith('"') and
                             not value.startswith('{') and not value.startswith('[')):
    @@ -2686,41 +2732,29 @@
                         formatted_line = f'{key}: {value}'
                         formatted_lines.append('  ' * current_indent + formatted_line)
                 else:
    -                # Простая строка (скорее всего значение в массиве)
                     formatted_lines.append('  ' * current_indent + line)
     
             # Добавляем запятые где необходимо
             result = []
    +        total_lines = len(formatted_lines)
    +
             for i, current_line in enumerate(formatted_lines):
    -
    -            # Проверяем, нужно ли добавить запятую
    -            if i < len(formatted_lines) - 1:
    +            if i < total_lines - 1:
                     next_line = formatted_lines[i + 1]
    -
    -                # Определяем, находимся ли мы внутри массива
                     in_array = any(bracket == '[' for bracket in stack)
     
    -                # Не добавляем запятую если:
    -                # - текущая строка это { или [
    -                # - следующая строка это } или ]
    -                # - текущая строка уже заканчивается запятой
    -                # - следующая строка начинается с } или ] (для элементов массива)
    -                should_add_comma = (
    -                    not current_line.endswith('{') and
    -                    not current_line.endswith('[') and
    -                    not current_line.endswith(',') and
    -                    not next_line.strip().endswith('}') and
    -                    not next_line.strip().endswith(']') and
    -                    not next_line.strip().startswith('}') and
    -                    not next_line.strip().startswith(']') and
    -                    not (in_array and next_line.strip() == ']')  # Не добавлять запятую перед закрытием массива
    -                )
    +                # Упрощенная проверка условий для запятой
    +                no_comma_condition1 = current_line.endswith(('{', '[', ','))
    +                no_comma_condition2 = next_line.strip().endswith(('}', ']'))
    +                no_comma_condition3 = next_line.strip().startswith(('}', ']'))
    +                no_comma_condition4 = in_array and next_line.strip() == ']'
     
    -                # Для элементов массива (объектов) добавляем запятую после }
    -                if (in_array and
    -                    current_line.strip() == '}' and
    -                    next_line.strip() != ']' and
    -                    not next_line.strip().startswith('}')):
    +                should_add_comma = not (no_comma_condition1 or no_comma_condition2 or
    +                                      no_comma_condition3 or no_comma_condition4)
    +
    +                # Специальный случай для элементов массива
    +                if (in_array and current_line.strip() == '}' and
    +                    next_line.strip() != ']' and not next_line.strip().startswith('}')):
                         should_add_comma = True
     
                     if should_add_comma:
    @@ -2742,34 +2776,22 @@
             Raises:
                 json.JSONDecodeError: Если данные не могут быть преобразованы в JSON.
             """
    -
    -        # Чтение JSON-содержимого из рабочей области
             loc = self.get_locator(locator)
             json_string = loc.inner_text()
    -
    -        # Сохранение исходной JSON строки в файл
    -        with open('json_string.txt', 'w', encoding='utf-8') as f:
    -            f.write(json_string)
    -        logger.info("Исходная JSON строка сохранена в файл: json_string.txt")
    +        print(json_string)
     
             formatted_json_string = self.format_json_string(json_string)
    -
    -        # Сохранение отформатированной JSON строки в файл
    -        with open('formatted_json_string.txt', 'w', encoding='utf-8') as f:
    -            f.write(formatted_json_string)
    -        logger.info("Отформатированная JSON строка сохранена в файл: formatted_json_string.txt")
    +        print(formatted_json_string)
     
             try:
                 data = json.loads(formatted_json_string)
             except json.JSONDecodeError as e:
    -            # Дополнительная отладка
    -            logger.error(f"JSON decode error: {e}")
    -            logger.error(f"Formatted JSON: {formatted_json_string}")
    +            logger.error("JSON decode error: %s", e)
    +            logger.error("Formatted JSON: %s", formatted_json_string)
                 assert False, f"Invalid json content. Error: {e}"
     
             return data
     
    -    # Проверки:
         def check_json_equals(self, actual: Any, expected: Any, msg: str) -> None:
             """Сравнивает JSON-объекты на идентичность.
     
    @@ -2781,7 +2803,6 @@
             Raises:
                 AssertionError: Если объекты не идентичны.
             """
    -
             diff = jsondiff.diff(expected, actual, syntax='symmetric')
             assert len(diff) == 0, f"{msg}. DIFF is {diff}"
     
    @@ -2846,21 +2867,19 @@
    Source code in components\json_container_component.py -
    25
    +              
    24
    +25
     26
     27
     28
     29
    -30
    -31
    -32
    def __init__(self, page: Page) -> None:
    +30
    def __init__(self, page: Page) -> None:
         """Инициализирует JSON-контейнер.
     
         Args:
             page: Экземпляр страницы Playwright.
         """
    -
    -    super().__init__(page)
    +    self.page = page
     
    @@ -2969,20 +2988,19 @@
    Source code in components\json_container_component.py -
    196
    -197
    -198
    -199
    -200
    -201
    -202
    -203
    -204
    -205
    -206
    -207
    -208
    -209
    def check_json_equals(self, actual: Any, expected: Any, msg: str) -> None:
    +              
    155
    +156
    +157
    +158
    +159
    +160
    +161
    +162
    +163
    +164
    +165
    +166
    +167
    def check_json_equals(self, actual: Any, expected: Any, msg: str) -> None:
         """Сравнивает JSON-объекты на идентичность.
     
         Args:
    @@ -2993,7 +3011,6 @@
         Raises:
             AssertionError: Если объекты не идентичны.
         """
    -
         diff = jsondiff.diff(expected, actual, syntax='symmetric')
         assert len(diff) == 0, f"{msg}. DIFF is {diff}"
     
    @@ -3072,7 +3089,11 @@
    Source code in components\json_container_component.py -
     36
    +              
     32
    + 33
    + 34
    + 35
    + 36
      37
      38
      39
    @@ -3161,36 +3182,7 @@
     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
    def format_json_string(self, json_string: str) -> str:
    +125
    def format_json_string(self, json_string: str) -> str:
         """Форматирует строку JSON для корректного парсинга.
     
         Args:
    @@ -3199,7 +3191,6 @@
         Returns:
             str: Отформатированная строка JSON.
         """
    -
         lines = json_string.splitlines()
         formatted_lines = []
         stack = []  # Стек для отслеживания вложенности
    @@ -3212,52 +3203,40 @@
     
             # Определяем тип текущей строки
             if line in ['{', '[']:
    -            # Начало объекта или массива
                 formatted_lines.append('  ' * current_indent + line)
                 stack.append(line)
                 current_indent += 1
             elif line in ['}', ']']:
    -            # Конец объекта или массива
                 current_indent -= 1
                 if stack and stack[-1] in ['{', '[']:
                     stack.pop()
                 formatted_lines.append('  ' * current_indent + line)
             elif re.match(r'^\d+:\{', line):
    -            # Элемент массива с индексом (0:{, 1:{, etc.)
    -            # Убираем индекс и оставляем только {
                 formatted_lines.append('  ' * current_indent + '{')
                 stack.append('{')
                 current_indent += 1
             elif ':' in line:
    -            # Пара ключ:значение
                 key, value = line.split(':', 1)
                 key = key.strip()
                 value = value.strip()
     
    -            # Добавляем кавычки к ключу если их нет (включая $)
                 if not (key.startswith('"') and key.endswith('"')):
                     key = f'"{key}"'
     
    -            # Обработка значений
                 if value in ['{', '[']:
    -                # Значение - начало объекта или массива
                     formatted_line = f'{key}: {value}'
                     formatted_lines.append('  ' * current_indent + formatted_line)
                     stack.append(value)
                     current_indent += 1
                 elif value in ['}', ']']:
    -                # Не должно происходить, но на всякий случай
                     current_indent -= 1
                     formatted_line = f'{key}: {value}'
                     formatted_lines.append('  ' * current_indent + formatted_line)
                     if stack:
                         stack.pop()
                 else:
    -                # Простое значение
    -                # Добавляем кавычки к строковым значениям если их нет
    -                if (value and
    -                    not value.isdigit() and
    -                    not value.replace('.', '', 1).isdigit() and  # Для чисел с точкой
    +                if (value and not value.isdigit() and
    +                    not value.replace('.', '', 1).isdigit() and
                         value not in ['true', 'false', 'null'] and
                         not value.startswith('"') and not value.endswith('"') and
                         not value.startswith('{') and not value.startswith('[')):
    @@ -3266,41 +3245,29 @@
                     formatted_line = f'{key}: {value}'
                     formatted_lines.append('  ' * current_indent + formatted_line)
             else:
    -            # Простая строка (скорее всего значение в массиве)
                 formatted_lines.append('  ' * current_indent + line)
     
         # Добавляем запятые где необходимо
         result = []
    +    total_lines = len(formatted_lines)
    +
         for i, current_line in enumerate(formatted_lines):
    -
    -        # Проверяем, нужно ли добавить запятую
    -        if i < len(formatted_lines) - 1:
    +        if i < total_lines - 1:
                 next_line = formatted_lines[i + 1]
    -
    -            # Определяем, находимся ли мы внутри массива
                 in_array = any(bracket == '[' for bracket in stack)
     
    -            # Не добавляем запятую если:
    -            # - текущая строка это { или [
    -            # - следующая строка это } или ]
    -            # - текущая строка уже заканчивается запятой
    -            # - следующая строка начинается с } или ] (для элементов массива)
    -            should_add_comma = (
    -                not current_line.endswith('{') and
    -                not current_line.endswith('[') and
    -                not current_line.endswith(',') and
    -                not next_line.strip().endswith('}') and
    -                not next_line.strip().endswith(']') and
    -                not next_line.strip().startswith('}') and
    -                not next_line.strip().startswith(']') and
    -                not (in_array and next_line.strip() == ']')  # Не добавлять запятую перед закрытием массива
    -            )
    +            # Упрощенная проверка условий для запятой
    +            no_comma_condition1 = current_line.endswith(('{', '[', ','))
    +            no_comma_condition2 = next_line.strip().endswith(('}', ']'))
    +            no_comma_condition3 = next_line.strip().startswith(('}', ']'))
    +            no_comma_condition4 = in_array and next_line.strip() == ']'
     
    -            # Для элементов массива (объектов) добавляем запятую после }
    -            if (in_array and
    -                current_line.strip() == '}' and
    -                next_line.strip() != ']' and
    -                not next_line.strip().startswith('}')):
    +            should_add_comma = not (no_comma_condition1 or no_comma_condition2 or
    +                                  no_comma_condition3 or no_comma_condition4)
    +
    +            # Специальный случай для элементов массива
    +            if (in_array and current_line.strip() == '}' and
    +                next_line.strip() != ']' and not next_line.strip().startswith('}')):
                     should_add_comma = True
     
                 if should_add_comma:
    @@ -3408,44 +3375,33 @@
     
                 
    Source code in components\json_container_component.py -
    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
    def read_data(self, locator: Any) -> Dict:
    +              
    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
    def read_data(self, locator: Any) -> Dict:
         """Читает и форматирует JSON-данные из указанного локатора.
     
         Args:
    @@ -3457,29 +3413,18 @@
         Raises:
             json.JSONDecodeError: Если данные не могут быть преобразованы в JSON.
         """
    -
    -    # Чтение JSON-содержимого из рабочей области
         loc = self.get_locator(locator)
         json_string = loc.inner_text()
    -
    -    # Сохранение исходной JSON строки в файл
    -    with open('json_string.txt', 'w', encoding='utf-8') as f:
    -        f.write(json_string)
    -    logger.info("Исходная JSON строка сохранена в файл: json_string.txt")
    +    print(json_string)
     
         formatted_json_string = self.format_json_string(json_string)
    -
    -    # Сохранение отформатированной JSON строки в файл
    -    with open('formatted_json_string.txt', 'w', encoding='utf-8') as f:
    -        f.write(formatted_json_string)
    -    logger.info("Отформатированная JSON строка сохранена в файл: formatted_json_string.txt")
    +    print(formatted_json_string)
     
         try:
             data = json.loads(formatted_json_string)
         except json.JSONDecodeError as e:
    -        # Дополнительная отладка
    -        logger.error(f"JSON decode error: {e}")
    -        logger.error(f"Formatted JSON: {formatted_json_string}")
    +        logger.error("JSON decode error: %s", e)
    +        logger.error("Formatted JSON: %s", formatted_json_string)
             assert False, f"Invalid json content. Error: {e}"
     
         return data
    diff --git a/site/components/modal_window_component/index.html b/site/components/modal_window_component/index.html
    index a5743bf..ce1a28a 100644
    --- a/site/components/modal_window_component/index.html
    +++ b/site/components/modal_window_component/index.html
    @@ -753,6 +753,27 @@
       
       
       
    +    
  • + + + + + EventsContainerComponent + + + + +
  • + + + + + + + + + +
  • @@ -1126,6 +1147,27 @@ +
  • + + + + + SystemLogEventsContainer + + + + +
  • + + + + + + + + + +
  • @@ -1771,6 +1813,27 @@ + + + + + + +
  • + + + + + ZTPTemplatesTab + + + + +
  • + + + + @@ -1980,6 +2043,27 @@ +
  • + + + + + TestSystemLogEventsContainer + + + + +
  • + + + + + + + + + +
  • @@ -2037,6 +2121,27 @@ + + + + + + +
  • + + + + + TestZTPTemplatesTab + + + + +
  • + + + + @@ -2642,7 +2747,7 @@

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

    +его содержимым и проверками.

    @@ -2745,25 +2850,9 @@ 104 105 106 -107 -108 -109 -110 -111 -112 -113 -114 -115 -116 -117 -118 -119 -120 -121 -122 -123
    class ModalWindowComponent(BaseComponent):
    +107
    class ModalWindowComponent(BaseComponent):
         """Компонент модального окна. Предоставляет методы для взаимодействия с окном,
    -    его содержимым и проверок."""
    +    его содержимым и проверками."""
     
         def __init__(self, page: Page):
             super().__init__(page)
    @@ -2774,32 +2863,26 @@
         # Действия:
         def add_content_item(self, name: str, item: object) -> None:
             """Добавляет элемент содержимого в окно по заданному имени."""
    -
             self.content_items[name] = item
     
         def get_content_item(self, name: str) -> object | None:
             """Возвращает элемент содержимого по имени или None, если не найден."""
    -
             return self.content_items.get(name)
     
         def add_toolbar_title(self, title: str) -> None:
             """Добавляет заголовок в панель инструментов модального окна."""
    -
             self.toolbar.add_title(title)
     
         def add_toolbar_button(self, locator: str, name: str) -> None:
             """Добавляет кнопку в панель инструментов модального окна."""
    -
             self.toolbar.add_tooltip_button(locator, name)
     
         def add_button(self, locator: str, name: str) -> None:
             """Добавляет кнопку в модальное окно."""
    -
             self.buttons.append(Button(self.page, locator, name))
     
         def get_button_by_name(self, name: str) -> Button | None:
             """Ищет и возвращает кнопку по имени или None, если не найдена."""
    -
             for button in self.buttons:
                 if button.name == name:
                     return button
    @@ -2807,7 +2890,6 @@
     
         def click_button(self, name: str) -> None:
             """Кликает по кнопке с заданным именем. Вызывает ошибку, если не найдена."""
    -
             button = self.get_button_by_name(name)
             if button is None:
                 assert False, f"Button with name '{name}' not found"
    @@ -2815,48 +2897,41 @@
     
         def click_toolbar_close_button(self) -> None:
             """Кликает по кнопке закрытия в панели инструментов."""
    -
             self.toolbar.click_button("close")
     
         def scroll_window_down(self) -> None:
             """Прокручивает содержимое окна вниз."""
    -
             self.scroll_down(ModalWindowLocators.MODAL_WINDOW)
     
         def scroll_window_up(self) -> None:
             """Прокручивает содержимое окна вверх."""
    -
             self.scroll_up(ModalWindowLocators.MODAL_WINDOW)
     
         def scroll_window_left(self) -> None:
             """Прокручивает содержимое окна влево."""
    -
             self.scroll_left(ModalWindowLocators.MODAL_WINDOW)
     
         def scroll_window_right(self) -> None:
             """Прокручивает содержимое окна вправо."""
    -
             self.scroll_right(ModalWindowLocators.MODAL_WINDOW)
     
         # Проверки:
         def check_window_vertical_scrolling(self) -> bool:
             """Проверяет возможность вертикальной прокрутки окна."""
    -
             return self.is_scrollable_vertically(ModalWindowLocators.MODAL_WINDOW)
     
         def check_window_horizontal_scrolling(self) -> bool:
             """Проверяет возможность горизонтальной прокрутки окна."""
    -
             return self.is_scrollable_horizontally(ModalWindowLocators.MODAL_WINDOW)
     
         def check_by_window_title(self) -> None:
             """Проверяет наличие окна по заголовку."""
    -
    -        self.toolbar.check_toolbar_presence(f"Modal window with '{self.toolbar.title}' is missing")
    +        self.toolbar.check_toolbar_presence(
    +            f"Modal window with '{self.toolbar.title}' is missing"
    +        )
     
         def check_button_visibility(self, name: str) -> None:
             """Проверяет наличие кнопки по имени. Вызывает ошибку, если не найдена."""
    -
             button = self.get_button_by_name(name)
             if button is None:
                 assert False, f"Button with name '{name}' not found"
    @@ -2864,12 +2939,10 @@
     
         def check_toolbar_button_visibility(self, name: str) -> None:
             """Проверяет наличие кнопки в панели инструментов."""
    -
             self.toolbar.check_button_visibility(name)
     
         def check_toolbar_button_tooltip(self, name: str, tooltip: str) -> None:
             """Проверяет подсказку у кнопки в панели инструментов."""
    -
             self.toolbar.check_button_tooltip(name, tooltip)
     
    @@ -2902,12 +2975,10 @@
    Source code in components\modal_window_component.py -
    45
    -46
    -47
    -48
    def add_button(self, locator: str, name: str) -> None:
    +              
    41
    +42
    +43
    def add_button(self, locator: str, name: str) -> None:
         """Добавляет кнопку в модальное окно."""
    -
         self.buttons.append(Button(self.page, locator, name))
     
    @@ -2933,10 +3004,8 @@ Source code in components\modal_window_component.py
    25
     26
    -27
    -28
    def add_content_item(self, name: str, item: object) -> None:
    +27
    def add_content_item(self, name: str, item: object) -> None:
         """Добавляет элемент содержимого в окно по заданному имени."""
    -
         self.content_items[name] = item
     
    @@ -2960,12 +3029,10 @@
    Source code in components\modal_window_component.py -
    40
    -41
    -42
    -43
    def add_toolbar_button(self, locator: str, name: str) -> None:
    +              
    37
    +38
    +39
    def add_toolbar_button(self, locator: str, name: str) -> None:
         """Добавляет кнопку в панель инструментов модального окна."""
    -
         self.toolbar.add_tooltip_button(locator, name)
     
    @@ -2989,12 +3056,10 @@
    Source code in components\modal_window_component.py -
    35
    -36
    -37
    -38
    def add_toolbar_title(self, title: str) -> None:
    +              
    33
    +34
    +35
    def add_toolbar_title(self, title: str) -> None:
         """Добавляет заголовок в панель инструментов модального окна."""
    -
         self.toolbar.add_title(title)
     
    @@ -3018,15 +3083,13 @@
    Source code in components\modal_window_component.py -
    107
    -108
    -109
    -110
    -111
    -112
    -113
    def check_button_visibility(self, name: str) -> None:
    +              
    94
    +95
    +96
    +97
    +98
    +99
    def check_button_visibility(self, name: str) -> None:
         """Проверяет наличие кнопки по имени. Вызывает ошибку, если не найдена."""
    -
         button = self.get_button_by_name(name)
         if button is None:
             assert False, f"Button with name '{name}' not found"
    @@ -3053,13 +3116,15 @@
     
                 
    Source code in components\modal_window_component.py -
    102
    -103
    -104
    -105
    def check_by_window_title(self) -> None:
    +              
    88
    +89
    +90
    +91
    +92
    def check_by_window_title(self) -> None:
         """Проверяет наличие окна по заголовку."""
    -
    -    self.toolbar.check_toolbar_presence(f"Modal window with '{self.toolbar.title}' is missing")
    +    self.toolbar.check_toolbar_presence(
    +        f"Modal window with '{self.toolbar.title}' is missing"
    +    )
     
    @@ -3082,12 +3147,10 @@
    Source code in components\modal_window_component.py -
    120
    -121
    -122
    -123
    def check_toolbar_button_tooltip(self, name: str, tooltip: str) -> None:
    +              
    105
    +106
    +107
    def check_toolbar_button_tooltip(self, name: str, tooltip: str) -> None:
         """Проверяет подсказку у кнопки в панели инструментов."""
    -
         self.toolbar.check_button_tooltip(name, tooltip)
     
    @@ -3111,12 +3174,10 @@
    Source code in components\modal_window_component.py -
    115
    -116
    -117
    -118
    def check_toolbar_button_visibility(self, name: str) -> None:
    +              
    101
    +102
    +103
    def check_toolbar_button_visibility(self, name: str) -> None:
         """Проверяет наличие кнопки в панели инструментов."""
    -
         self.toolbar.check_button_visibility(name)
     
    @@ -3140,12 +3201,10 @@
    Source code in components\modal_window_component.py -
     97
    - 98
    - 99
    -100
    def check_window_horizontal_scrolling(self) -> bool:
    +              
    84
    +85
    +86
    def check_window_horizontal_scrolling(self) -> bool:
         """Проверяет возможность горизонтальной прокрутки окна."""
    -
         return self.is_scrollable_horizontally(ModalWindowLocators.MODAL_WINDOW)
     
    @@ -3169,12 +3228,10 @@
    Source code in components\modal_window_component.py -
    92
    -93
    -94
    -95
    def check_window_vertical_scrolling(self) -> bool:
    +              
    80
    +81
    +82
    def check_window_vertical_scrolling(self) -> bool:
         """Проверяет возможность вертикальной прокрутки окна."""
    -
         return self.is_scrollable_vertically(ModalWindowLocators.MODAL_WINDOW)
     
    @@ -3198,15 +3255,13 @@
    Source code in components\modal_window_component.py -
    58
    -59
    -60
    -61
    -62
    -63
    -64
    def click_button(self, name: str) -> None:
    +              
    52
    +53
    +54
    +55
    +56
    +57
    def click_button(self, name: str) -> None:
         """Кликает по кнопке с заданным именем. Вызывает ошибку, если не найдена."""
    -
         button = self.get_button_by_name(name)
         if button is None:
             assert False, f"Button with name '{name}' not found"
    @@ -3233,12 +3288,10 @@
     
                 
    Source code in components\modal_window_component.py -
    66
    -67
    -68
    -69
    def click_toolbar_close_button(self) -> None:
    +              
    59
    +60
    +61
    def click_toolbar_close_button(self) -> None:
         """Кликает по кнопке закрытия в панели инструментов."""
    -
         self.toolbar.click_button("close")
     
    @@ -3262,15 +3315,13 @@
    Source code in components\modal_window_component.py -
    50
    -51
    -52
    -53
    -54
    -55
    -56
    def get_button_by_name(self, name: str) -> Button | None:
    +              
    45
    +46
    +47
    +48
    +49
    +50
    def get_button_by_name(self, name: str) -> Button | None:
         """Ищет и возвращает кнопку по имени или None, если не найдена."""
    -
         for button in self.buttons:
             if button.name == name:
                 return button
    @@ -3297,12 +3348,10 @@
     
                 
    Source code in components\modal_window_component.py -
    30
    -31
    -32
    -33
    def get_content_item(self, name: str) -> object | None:
    +              
    29
    +30
    +31
    def get_content_item(self, name: str) -> object | None:
         """Возвращает элемент содержимого по имени или None, если не найден."""
    -
         return self.content_items.get(name)
     
    @@ -3326,12 +3375,10 @@
    Source code in components\modal_window_component.py -
    71
    -72
    -73
    -74
    def scroll_window_down(self) -> None:
    +              
    63
    +64
    +65
    def scroll_window_down(self) -> None:
         """Прокручивает содержимое окна вниз."""
    -
         self.scroll_down(ModalWindowLocators.MODAL_WINDOW)
     
    @@ -3355,12 +3402,10 @@
    Source code in components\modal_window_component.py -
    81
    -82
    -83
    -84
    def scroll_window_left(self) -> None:
    +              
    71
    +72
    +73
    def scroll_window_left(self) -> None:
         """Прокручивает содержимое окна влево."""
    -
         self.scroll_left(ModalWindowLocators.MODAL_WINDOW)
     
    @@ -3384,12 +3429,10 @@
    Source code in components\modal_window_component.py -
    86
    -87
    -88
    -89
    def scroll_window_right(self) -> None:
    +              
    75
    +76
    +77
    def scroll_window_right(self) -> None:
         """Прокручивает содержимое окна вправо."""
    -
         self.scroll_right(ModalWindowLocators.MODAL_WINDOW)
     
    @@ -3413,12 +3456,10 @@
    Source code in components\modal_window_component.py -
    76
    -77
    -78
    -79
    def scroll_window_up(self) -> None:
    +              
    67
    +68
    +69
    def scroll_window_up(self) -> None:
         """Прокручивает содержимое окна вверх."""
    -
         self.scroll_up(ModalWindowLocators.MODAL_WINDOW)
     
    diff --git a/site/components/navbar_component/index.html b/site/components/navbar_component/index.html index 857ad33..d1ec5f4 100644 --- a/site/components/navbar_component/index.html +++ b/site/components/navbar_component/index.html @@ -753,6 +753,27 @@ +
  • + + + + + EventsContainerComponent + + + + +
  • + + + + + + + + + +
  • @@ -1018,6 +1039,27 @@ +
  • + + + + + SystemLogEventsContainer + + + + +
  • + + + + + + + + + +
  • @@ -1663,6 +1705,27 @@ + + + + + + +
  • + + + + + ZTPTemplatesTab + + + + +
  • + + + + @@ -1872,6 +1935,27 @@ +
  • + + + + + TestSystemLogEventsContainer + + + + +
  • + + + + + + + + + +
  • @@ -1929,6 +2013,27 @@ + + + + + + +
  • + + + + + TestZTPTemplatesTab + + + + +
  • + + + + @@ -2633,7 +2738,13 @@ 207 208 209 -210
    class NavigationPanelComponent(BaseComponent):
    +210
    +211
    +212
    +213
    +214
    +215
    +216
    class NavigationPanelComponent(BaseComponent):
         """Компонент панели навигации. Предоставляет методы для взаимодействия с ней."""
     
         def __init__(self, page: Page):
    @@ -2671,7 +2782,7 @@
             loc = self.get_locator(locator)
             loc.get_by_text(item_name).click()
     
    -    def click_sub_item(self, node_root_locator: str | Locator, item_name: str) -> None:
    +    def click_sub_item(self, node_root_locator: str | Locator, item_name: str, parent: None|str) -> None:
             """Кликает по вложенному элементу с указанным текстом.
     
             Args:
    @@ -2679,18 +2790,19 @@
                 item_name: Текст элемента для клика.
             """
     
    -        def find_and_click_item(page, root_locator, item_name: str) -> bool:
    +        def find_and_click_item(page, root_locator, item_name: str, parent: None|str) -> bool:
                 # Находим все локаторы корневых узлов на текущем уровне
                 root_node = root_locator.locator('>div.v-treeview-node')
                 # Получаем список текстов
                 root_node_texts = root_node.all_inner_texts()
     
                 # Если искомый элемент находится на данном уровне, вычисляем локатор и делаем клик
    -            for index, node_text in enumerate(root_node_texts):
    -                node_text = node_text.replace("expand_more\n", "")
    -                if item_name == node_text:
    -                   root_node.nth(index).click()
    -                   return True
    +            if parent is None:
    +                for index, node_text in enumerate(root_node_texts):
    +                    node_text = node_text.replace("expand_more\n", "")
    +                    if item_name == node_text:
    +                        root_node.nth(index).click()
    +                        return True
     
                 # Если элемента нет, рекурсивно ищем дальше
                 nodes_count = root_locator.locator('>div.v-treeview-node').count()
    @@ -2729,9 +2841,14 @@
                         # Ищем дочерние элементы *внутри* текущего узла
                         if has_children and is_expanded:
                             child_nodes_locator = root_locator.locator(f">div:nth-child({index + 1})").locator('>div.v-treeview-node__children')
    -                        is_found = find_and_click_item(page, child_nodes_locator, item_name)
    +                        is_found = find_and_click_item(page, child_nodes_locator, item_name, parent=None)
                             if is_found:
    -                            return True
    +                            if parent is None:
    +                                return True
    +                            else:
    +                                root_texts = root_locator.locator(f">div:nth-child({index + 1})").inner_text().splitlines()
    +                                if parent in root_texts:
    +                                    return True
     
                         # закрываем узел, если в нем ничего не нашли
                         if is_expanded:
    @@ -2742,7 +2859,7 @@
                 return False
     
             root_locator = self.get_locator(node_root_locator)
    -        found = find_and_click_item(self.page, root_locator, item_name)
    +        found = find_and_click_item(self.page, root_locator, item_name, parent)
             assert found, f"Navigation panel item {item_name} is missing"
     
         def traverse_panel_tree(self, node_root_locator: str | Locator, level=0, debug=False):
    @@ -2984,13 +3101,7 @@
     
                 
    Source code in components\navbar_component.py -
    187
    -188
    -189
    -190
    -191
    -192
    -193
    +              
    193
     194
     195
     196
    @@ -3007,7 +3118,13 @@
     207
     208
     209
    -210
    def check_item_visibility(self, locator: str | Locator, item_name: str) -> None:
    +210
    +211
    +212
    +213
    +214
    +215
    +216
    def check_item_visibility(self, locator: str | Locator, item_name: str) -> None:
         """Проверяет видимость элемента с указанным текстом.
     
         Args:
    @@ -3129,7 +3246,7 @@
     
     
     

    - click_sub_item(node_root_locator, item_name) + click_sub_item(node_root_locator, item_name, parent)

    @@ -3260,7 +3377,13 @@ 118 119 120 -121
    def click_sub_item(self, node_root_locator: str | Locator, item_name: str) -> None:
    +121
    +122
    +123
    +124
    +125
    +126
    +127
    def click_sub_item(self, node_root_locator: str | Locator, item_name: str, parent: None|str) -> None:
         """Кликает по вложенному элементу с указанным текстом.
     
         Args:
    @@ -3268,18 +3391,19 @@
             item_name: Текст элемента для клика.
         """
     
    -    def find_and_click_item(page, root_locator, item_name: str) -> bool:
    +    def find_and_click_item(page, root_locator, item_name: str, parent: None|str) -> bool:
             # Находим все локаторы корневых узлов на текущем уровне
             root_node = root_locator.locator('>div.v-treeview-node')
             # Получаем список текстов
             root_node_texts = root_node.all_inner_texts()
     
             # Если искомый элемент находится на данном уровне, вычисляем локатор и делаем клик
    -        for index, node_text in enumerate(root_node_texts):
    -            node_text = node_text.replace("expand_more\n", "")
    -            if item_name == node_text:
    -               root_node.nth(index).click()
    -               return True
    +        if parent is None:
    +            for index, node_text in enumerate(root_node_texts):
    +                node_text = node_text.replace("expand_more\n", "")
    +                if item_name == node_text:
    +                    root_node.nth(index).click()
    +                    return True
     
             # Если элемента нет, рекурсивно ищем дальше
             nodes_count = root_locator.locator('>div.v-treeview-node').count()
    @@ -3318,9 +3442,14 @@
                     # Ищем дочерние элементы *внутри* текущего узла
                     if has_children and is_expanded:
                         child_nodes_locator = root_locator.locator(f">div:nth-child({index + 1})").locator('>div.v-treeview-node__children')
    -                    is_found = find_and_click_item(page, child_nodes_locator, item_name)
    +                    is_found = find_and_click_item(page, child_nodes_locator, item_name, parent=None)
                         if is_found:
    -                        return True
    +                        if parent is None:
    +                            return True
    +                        else:
    +                            root_texts = root_locator.locator(f">div:nth-child({index + 1})").inner_text().splitlines()
    +                            if parent in root_texts:
    +                                return True
     
                     # закрываем узел, если в нем ничего не нашли
                     if is_expanded:
    @@ -3331,7 +3460,7 @@
             return False
     
         root_locator = self.get_locator(node_root_locator)
    -    found = find_and_click_item(self.page, root_locator, item_name)
    +    found = find_and_click_item(self.page, root_locator, item_name, parent)
         assert found, f"Navigation panel item {item_name} is missing"
     
    @@ -3485,13 +3614,7 @@
    Source code in components\navbar_component.py -
    123
    -124
    -125
    -126
    -127
    -128
    -129
    +              
    129
     130
     131
     132
    @@ -3546,7 +3669,13 @@
     181
     182
     183
    -184
    def traverse_panel_tree(self, node_root_locator: str | Locator, level=0, debug=False):
    +184
    +185
    +186
    +187
    +188
    +189
    +190
    def traverse_panel_tree(self, node_root_locator: str | Locator, level=0, debug=False):
         """
         Рекурсивно обходит дерево v-treeview и выводит информацию об элементах в режиме отладки (debug=True).
     
    diff --git a/site/components/table_component/index.html b/site/components/table_component/index.html
    index ea413a5..938ed1e 100644
    --- a/site/components/table_component/index.html
    +++ b/site/components/table_component/index.html
    @@ -753,6 +753,27 @@
       
       
       
    +    
  • + + + + + EventsContainerComponent + + + + +
  • + + + + + + + + + +
  • @@ -888,6 +909,24 @@ +
  • + +
  • + + + check_column_descending_order + + + +
  • + +
  • + + + check_content + + +
  • @@ -915,6 +954,33 @@ +
  • + +
  • + + + check_table_headers + + + +
  • + +
  • + + + click_arrow_button + + + +
  • + +
  • + + + get_arrow_button_state + + +
  • @@ -924,6 +990,15 @@ +
  • + +
  • + + + get_rows_count + + +
  • @@ -1018,6 +1093,27 @@ +
  • + + + + + SystemLogEventsContainer + + + + +
  • + + + + + + + + + +
  • @@ -1663,6 +1759,27 @@ + + + + + + +
  • + + + + + ZTPTemplatesTab + + + + +
  • + + + + @@ -1872,6 +1989,27 @@ +
  • + + + + + TestSystemLogEventsContainer + + + + +
  • + + + + + + + + + +
  • @@ -1929,6 +2067,27 @@ + + + + + + +
  • + + + + + TestZTPTemplatesTab + + + + +
  • + + + + @@ -2312,6 +2471,24 @@ + + +
  • + + + check_column_descending_order + + + +
  • + +
  • + + + check_content + + +
  • @@ -2339,6 +2516,33 @@ +
  • + +
  • + + + check_table_headers + + + +
  • + +
  • + + + click_arrow_button + + + +
  • + +
  • + + + get_arrow_button_state + + +
  • @@ -2348,6 +2552,15 @@ +
  • + +
  • + + + get_rows_count + + +
  • @@ -2541,7 +2754,136 @@ 115 116 117 -118
  • class TableComponent(BaseComponent):
    +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
    class TableComponent(BaseComponent):
         """Компонент таблицы. Предоставляет методы для работы с табличными данными."""
     
         def __init__(self, page: Page):
    @@ -2554,6 +2896,48 @@
             super().__init__(page)
     
         # Действия:
    +    def click_arrow_button(self, table_locator: str | Locator, index: int) -> None:
    +        """ Нажатие кнопки-стрелочки вверх/вниз в ячейке заголовка таблицы
    +
    +        Args:
    +            table_locator: Локатор таблицы.
    +            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")
    +        assert arrow_button.is_enabled(), f"Arrow button is missing in {index} header cell"
    +        arrow_button.click()
    +
    +    def get_arrow_button_state(self, table_locator: str | Locator, index: int) -> str:
    +        """ Получение состояния кнопки-стрелочки вверх/вниз в ячейке заголовка таблицы
    +
    +        Args:
    +            table_locator: Локатор таблицы.
    +            index: Индекс ячейки в заголовке.
    +
    +        Returns:
    +            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")
    +        assert arrow_button.is_enabled(), f"Arrow button is missing in {index} header cell"
    +
    +        state = arrow_button.inner_text()
    +        if state == "keyboard_arrow_up":
    +            return "up"
    +        elif state == "keyboard_arrow_down":
    +            return "down"
    +        else:
    +            assert False, f"Got unsupported arrow state: {state}"
    +
         def get_row_locator(self, table_locator: str | Locator, row_index: int) -> Locator | None:
             """Возвращает локатор строки по индексу.
     
    @@ -2574,6 +2958,25 @@
             else:
                 return None
     
    +    def get_rows_count(self, locator: str | Locator) -> int:
    +        """Возвращает количество строк в таблице (без заголовка).
    +
    +        Returns:
    +            int: Количество строк с данными.
    +
    +        Raises:
    +            AssertionError: Если таблица пуста.
    +        """
    +
    +        table_content = self.read(locator)
    +        rows_count = len(table_content)
    +
    +        if rows_count == 0:
    +            assert False, "The contents of the table are missing"
    +
    +        return rows_count - 1
    +
    +
         def read(self, locator: str | Locator) -> list[list[str]]:
             """Читает данные таблицы, включая заголовки.
     
    @@ -2607,6 +3010,74 @@
             return table_data
     
         # Проверки:
    +    def check_table_headers(self, actual_headers, expected_headers) -> None:
    +        """ Проверка соответствия заголовка таблицы ожидаемому"""
    +
    +        is_equals = True
    +
    +        arrow_state = ["keyboard_arrow_down", "keyboard_arrow_up"]
    +
    +        for item in actual_headers:
    +            item = item.strip()
    +
    +            if item in arrow_state:
    +                continue
    +
    +            if item not in expected_headers:
    +                is_equals = False
    +
    +        assert is_equals, \
    +            f"Expected events table headers {expected_headers} are not equal {actual_headers}"
    +
    +    def check_content(self,
    +                      locator: str | Locator,
    +                      expected_headers: list[str]) -> None:
    +        """Проверяет содержимое таблицы.
    +
    +        Проверяет заголовки и наличие данных в таблице.
    +
    +        Raises:
    +            AssertionError: Если таблица пуста или заголовки неверны.
    +        """
    +
    +        table_content = self.read(locator)
    +
    +        if len(table_content) == 0:
    +            assert False, "The contents of the table are missing"
    +
    +        self.check_table_headers(table_content[0], expected_headers)
    +
    +        if len(table_content) == 1:
    +            assert False, "Table body is missing"
    +
    +    def check_column_descending_order(self,
    +                                         locator: str | Locator,
    +                                         index: int) -> bool:
    +        """Проверка, что заданный столбец таблицы упорядочен по убыванию.
    +
    +        Args:
    +            locator: Локатор таблицы.
    +            index: Индекс столбца.
    +
    +        Returns:
    +            True, если столбец таблицы упорядочен по убыванию. Иначе: False
    +        """
    +
    +        table_content = self.read(locator)
    +
    +        if len(table_content) == 0:
    +            assert False, "The contents of the table are missing"
    +
    +        del table_content[0]
    +
    +        assert index in range(len(table_content[0])), \
    +                            "Column index is out of range"
    +        column = []
    +        for i in range(len(table_content)):
    +            column.append(table_content[i][index])
    +
    +        return all([x > y for x, y in zip(column, column[1:])])
    +
         def check_first_row_visibility(self, locator: str | Locator) -> None:
             """Проверяет видимость первой строки таблицы.
     
    @@ -2735,6 +3206,236 @@
     
    +

    + check_column_descending_order(locator, index) + +

    + + +
    + +

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

    + + +

    Parameters:

    + + + + + + + + + + + + + + + + + + + + + + + +
    NameTypeDescriptionDefault
    + locator + + str | Locator + +
    +

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

    +
    +
    + required +
    + index + + int + +
    +

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

    +
    +
    + required +
    + + +

    Returns:

    + + + + + + + + + + + + + +
    TypeDescription
    + bool + +
    +

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

    +
    +
    + + +
    + Source code in components\table_component.py +
    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
    def check_column_descending_order(self,
    +                                     locator: str | Locator,
    +                                     index: int) -> bool:
    +    """Проверка, что заданный столбец таблицы упорядочен по убыванию.
    +
    +    Args:
    +        locator: Локатор таблицы.
    +        index: Индекс столбца.
    +
    +    Returns:
    +        True, если столбец таблицы упорядочен по убыванию. Иначе: False
    +    """
    +
    +    table_content = self.read(locator)
    +
    +    if len(table_content) == 0:
    +        assert False, "The contents of the table are missing"
    +
    +    del table_content[0]
    +
    +    assert index in range(len(table_content[0])), \
    +                        "Column index is out of range"
    +    column = []
    +    for i in range(len(table_content)):
    +        column.append(table_content[i][index])
    +
    +    return all([x > y for x, y in zip(column, column[1:])])
    +
    +
    +
    + +
    + +
    + + +

    + check_content(locator, expected_headers) + +

    + + +
    + +

    Проверяет содержимое таблицы.

    +

    Проверяет заголовки и наличие данных в таблице.

    + + +

    Raises:

    + + + + + + + + + + + + + +
    TypeDescription
    + AssertionError + +
    +

    Если таблица пуста или заголовки неверны.

    +
    +
    + + +
    + Source code in components\table_component.py +
    157
    +158
    +159
    +160
    +161
    +162
    +163
    +164
    +165
    +166
    +167
    +168
    +169
    +170
    +171
    +172
    +173
    +174
    +175
    +176
    def check_content(self,
    +                  locator: str | Locator,
    +                  expected_headers: list[str]) -> None:
    +    """Проверяет содержимое таблицы.
    +
    +    Проверяет заголовки и наличие данных в таблице.
    +
    +    Raises:
    +        AssertionError: Если таблица пуста или заголовки неверны.
    +    """
    +
    +    table_content = self.read(locator)
    +
    +    if len(table_content) == 0:
    +        assert False, "The contents of the table are missing"
    +
    +    self.check_table_headers(table_content[0], expected_headers)
    +
    +    if len(table_content) == 1:
    +        assert False, "Table body is missing"
    +
    +
    +
    + +
    + +
    + +

    check_first_row_visibility(locator) @@ -2779,16 +3480,16 @@
    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:
    +              
    206
    +207
    +208
    +209
    +210
    +211
    +212
    +213
    +214
    +215
    def check_first_row_visibility(self, locator: str | Locator) -> None:
         """Проверяет видимость первой строки таблицы.
     
         Args:
    @@ -2851,16 +3552,16 @@
     
                 
    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:
    +              
    217
    +218
    +219
    +220
    +221
    +222
    +223
    +224
    +225
    +226
    def check_last_row_visibility(self, locator: str | Locator) -> None:
         """Проверяет видимость последней строки таблицы.
     
         Args:
    @@ -2939,26 +3640,26 @@
     
                 
    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:
    +              
    228
    +229
    +230
    +231
    +232
    +233
    +234
    +235
    +236
    +237
    +238
    +239
    +240
    +241
    +242
    +243
    +244
    +245
    +246
    +247
    def check_row_highlighting(self, locator: str | Locator, row_index: int) -> None:
         """Проверяет изменение цвета строки при наведении.
     
         Args:
    @@ -2987,6 +3688,302 @@
     
    +

    + check_table_headers(actual_headers, expected_headers) + +

    + + +
    + +

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

    + + +
    + Source code in components\table_component.py +
    138
    +139
    +140
    +141
    +142
    +143
    +144
    +145
    +146
    +147
    +148
    +149
    +150
    +151
    +152
    +153
    +154
    +155
    def check_table_headers(self, actual_headers, expected_headers) -> None:
    +    """ Проверка соответствия заголовка таблицы ожидаемому"""
    +
    +    is_equals = True
    +
    +    arrow_state = ["keyboard_arrow_down", "keyboard_arrow_up"]
    +
    +    for item in actual_headers:
    +        item = item.strip()
    +
    +        if item in arrow_state:
    +            continue
    +
    +        if item not in expected_headers:
    +            is_equals = False
    +
    +    assert is_equals, \
    +        f"Expected events table headers {expected_headers} are not equal {actual_headers}"
    +
    +
    +
    + +
    + +
    + + +

    + click_arrow_button(table_locator, index) + +

    + + +
    + +

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

    + + +

    Parameters:

    + + + + + + + + + + + + + + + + + + + + + + + +
    NameTypeDescriptionDefault
    + table_locator + + str | Locator + +
    +

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

    +
    +
    + required +
    + index + + int + +
    +

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

    +
    +
    + required +
    + + +
    + Source code in components\table_component.py +
    24
    +25
    +26
    +27
    +28
    +29
    +30
    +31
    +32
    +33
    +34
    +35
    +36
    +37
    +38
    def click_arrow_button(self, table_locator: str | Locator, index: int) -> None:
    +    """ Нажатие кнопки-стрелочки вверх/вниз в ячейке заголовка таблицы
    +
    +    Args:
    +        table_locator: Локатор таблицы.
    +        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")
    +    assert arrow_button.is_enabled(), f"Arrow button is missing in {index} header cell"
    +    arrow_button.click()
    +
    +
    +
    + +
    + +
    + + +

    + get_arrow_button_state(table_locator, index) + +

    + + +
    + +

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

    + + +

    Parameters:

    + + + + + + + + + + + + + + + + + + + + + + + +
    NameTypeDescriptionDefault
    + table_locator + + str | Locator + +
    +

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

    +
    +
    + required +
    + index + + int + +
    +

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

    +
    +
    + required +
    + + +

    Returns:

    + + + + + + + + + + + + + +
    TypeDescription
    + str + +
    +

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

    +
    +
    + + +
    + Source code in components\table_component.py +
    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
    def get_arrow_button_state(self, table_locator: str | Locator, index: int) -> str:
    +    """ Получение состояния кнопки-стрелочки вверх/вниз в ячейке заголовка таблицы
    +
    +    Args:
    +        table_locator: Локатор таблицы.
    +        index: Индекс ячейки в заголовке.
    +
    +    Returns:
    +        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")
    +    assert arrow_button.is_enabled(), f"Arrow button is missing in {index} header cell"
    +
    +    state = arrow_button.inner_text()
    +    if state == "keyboard_arrow_up":
    +        return "up"
    +    elif state == "keyboard_arrow_down":
    +        return "down"
    +    else:
    +        assert False, f"Got unsupported arrow state: {state}"
    +
    +
    +
    + +
    + +
    + +

    get_row_locator(table_locator, row_index) @@ -3070,25 +4067,25 @@
    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:
    +              
    66
    +67
    +68
    +69
    +70
    +71
    +72
    +73
    +74
    +75
    +76
    +77
    +78
    +79
    +80
    +81
    +82
    +83
    +84
    def get_row_locator(self, table_locator: str | Locator, row_index: int) -> Locator | None:
         """Возвращает локатор строки по индексу.
     
         Args:
    @@ -3116,6 +4113,107 @@
     
    +

    + get_rows_count(locator) + +

    + + +
    + +

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

    + + +

    Returns:

    + + + + + + + + + + + + + +
    Name TypeDescription
    int + int + +
    +

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

    +
    +
    + + +

    Raises:

    + + + + + + + + + + + + + +
    TypeDescription
    + AssertionError + +
    +

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

    +
    +
    + + +
    + Source code in components\table_component.py +
     86
    + 87
    + 88
    + 89
    + 90
    + 91
    + 92
    + 93
    + 94
    + 95
    + 96
    + 97
    + 98
    + 99
    +100
    +101
    +102
    def get_rows_count(self, locator: str | Locator) -> int:
    +    """Возвращает количество строк в таблице (без заголовка).
    +
    +    Returns:
    +        int: Количество строк с данными.
    +
    +    Raises:
    +        AssertionError: Если таблица пуста.
    +    """
    +
    +    table_content = self.read(locator)
    +    rows_count = len(table_content)
    +
    +    if rows_count == 0:
    +        assert False, "The contents of the table are missing"
    +
    +    return rows_count - 1
    +
    +
    +
    + +
    + +
    + +

    read(locator) @@ -3183,37 +4281,37 @@
    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]]:
    +              
    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
    def read(self, locator: str | Locator) -> list[list[str]]:
         """Читает данные таблицы, включая заголовки.
     
         Args:
    diff --git a/site/components/toolbar_component/index.html b/site/components/toolbar_component/index.html
    index 6ea22d3..29325f4 100644
    --- a/site/components/toolbar_component/index.html
    +++ b/site/components/toolbar_component/index.html
    @@ -12,7 +12,7 @@
             
           
           
    -        
    +        
           
           
           
    @@ -753,6 +753,27 @@
       
       
       
    +    
  • + + + + + EventsContainerComponent + + + + +
  • + + + + + + + + + +
  • @@ -972,6 +993,15 @@ +
  • + +
  • + + + check_toolbar_presence_by_locator + + +
  • @@ -990,6 +1020,15 @@ +
  • + +
  • + + + get_toolbar_title_text + + +
  • @@ -1072,6 +1111,27 @@ +
  • + + + + + SystemLogEventsContainer + + + + +
  • + + + + + + + + + +
  • @@ -1717,6 +1777,27 @@ + + + + + + +
  • + + + + + ZTPTemplatesTab + + + + +
  • + + + + @@ -1926,6 +2007,27 @@ +
  • + + + + + TestSystemLogEventsContainer + + + + +
  • + + + + + + + + + +
  • @@ -1983,6 +2085,27 @@ + + + + + + +
  • + + + + + TestZTPTemplatesTab + + + + +
  • + + + + @@ -2429,6 +2552,15 @@ + + +
  • + + + check_toolbar_presence_by_locator + + +
  • @@ -2447,6 +2579,15 @@ +
  • + +
  • + + + get_toolbar_title_text + + +
  • @@ -2755,7 +2896,37 @@ 179 180 181 -182
  • class ToolbarComponent(BaseComponent):
    +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
    class ToolbarComponent(BaseComponent):
         """Компонент тулбара. Предоставляет методы для работы с панелью инструментов.
     
         Args:
    @@ -2765,7 +2936,6 @@
     
         def __init__(self, page: Page, title: str):
             """Инициализирует компонент тулбара с указанным заголовком."""
    -
             super().__init__(page)
             self.title = title
             self.buttons = []
    @@ -2776,7 +2946,6 @@
             Args:
                 title (str): Новый заголовок
             """
    -
             self.title = title
     
         def add_tooltip_button(self, locator: Locator, name: str) -> None:
    @@ -2786,7 +2955,6 @@
                 locator (Locator): Локатор кнопки
                 name (str): Уникальное имя кнопки
             """
    -
             self.buttons.append(TooltipButton(self.page, locator, name))
     
         def add_tab_button(self, locator: Locator, name: str) -> None:
    @@ -2796,7 +2964,6 @@
                 locator (Locator): Локатор кнопки
                 name (str): Уникальное имя кнопки
             """
    -
             self.buttons.append(TabButton(self.page, locator, name))
     
         def add_button(self, locator: Locator, name: str) -> None:
    @@ -2806,19 +2973,17 @@
                 locator (Locator): Локатор кнопки
                 name (str): Уникальное имя кнопки
             """
    -
             self.buttons.append(Button(self.page, locator, name))
     
    -    def get_button_by_name(self, name: str) -> TooltipButton | None:
    +    def get_button_by_name(self, name: str) -> TooltipButton | TabButton | Button | None:
             """Возвращает кнопку по имени.
     
             Args:
                 name (str): Имя кнопки
     
             Returns:
    -            TooltipButton | None: Найденная кнопка или None
    +            TooltipButton | TabButton | Button | None: Найденная кнопка или None
             """
    -
             for button in self.buttons:
                 if button.name == name:
                     return button
    @@ -2833,12 +2998,42 @@
             Raises:
                 AssertionError: Если кнопка не найдена
             """
    -
             button = self.get_button_by_name(name)
             if button is None:
                 raise AssertionError(f"Unsupported button name {name}")
             button.click()
     
    +    def get_toolbar_title_text(self, locator: str = 'ToolbarLocators.TITLE',
    +                              filter_text: str = None, timeout: int = 5000) -> str:
    +        """Получает заголовок тулбара модального окна.
    +
    +        Args:
    +            locator: Локатор для заголовка тулбара (по умолчанию 'ToolbarLocators.TITLE')
    +            filter_text: Текст для фильтрации заголовка (опционально)
    +            timeout: Таймаут ожидания в миллисекундах
    +
    +        Returns:
    +            str: Текст заголовка тулбара
    +
    +        Raises:
    +            Exception: Если не удалось получить заголовок
    +        """
    +        # Получаем локатор заголовка
    +        title_locator = self.get_locator(locator)
    +
    +        # Фильтруем по тексту если указан
    +        if filter_text:
    +            title_locator = title_locator.filter(has_text=filter_text)
    +
    +        # Ждем появления заголовка с помощью expect
    +        expect(title_locator).to_be_visible(timeout=timeout)
    +
    +        # Получаем текст заголовка
    +        title_text = title_locator.text_content().strip()
    +        logger.info("Заголовок тулбара: '%s'", title_text)
    +
    +        return title_text
    +
         def is_button_present(self, name: str) -> bool:
             """Проверяет наличие кнопки.
     
    @@ -2851,7 +3046,6 @@
             Raises:
                 AssertionError: Если имя кнопки не поддерживается
             """
    -
             button = self.get_button_by_name(name)
             if button is None:
                 raise AssertionError(f"Unsupported button name {name}")
    @@ -2869,7 +3063,6 @@
             Raises:
                 AssertionError: Если имя кнопки не поддерживается
             """
    -
             button = self.get_button_by_name(name)
             if button is None:
                 raise AssertionError(f"Unsupported button name {name}")
    @@ -2885,16 +3078,25 @@
             locator = self.get_locator(ToolbarLocators.TITLE).filter(has_text=self.title)
             expect(locator).to_be_visible(), message
     
    +    def check_toolbar_presence_by_locator(self, locator: str|Locator, message: str) -> None:
    +        """Проверяет видимость тулбара.
    +
    +        Args:
    +            message (str): Сообщение об ошибке если тулбар не виден
    +        """
    +
    +        locator = self.get_locator(locator)
    +        expect(locator).to_be_visible(), message
    +
         def check_button_visibility(self, name: str) -> None:
             """Проверяет наличие и видимость кнопки с предварительной прокруткой к элементу.
     
    -            Args:
    -                name (str): Имя кнопки
    -
    -            Raises:
    -                AssertionError: Если кнопка не найдена или не видна
    -            """
    +        Args:
    +            name (str): Имя кнопки
     
    +        Raises:
    +            AssertionError: Если кнопка не найдена или не видна
    +        """
             button = self.get_button_by_name(name)
     
             if button is None:
    @@ -2913,7 +3115,6 @@
             Raises:
                 AssertionError: Если текст подсказки не совпадает
             """
    -
             button = self.get_button_by_name(name)
             if button is None:
                 raise AssertionError(f"Unsupported button name {name}")
    @@ -2953,10 +3154,8 @@
     29
     30
     31
    -32
    -33
    def __init__(self, page: Page, title: str):
    +32
    def __init__(self, page: Page, title: str):
         """Инициализирует компонент тулбара с указанным заголовком."""
    -
         super().__init__(page)
         self.title = title
         self.buttons = []
    @@ -3029,22 +3228,20 @@
     
                 
    Source code in components\toolbar_component.py -
    64
    +              
    60
    +61
    +62
    +63
    +64
     65
     66
    -67
    -68
    -69
    -70
    -71
    -72
    def add_button(self, locator: Locator, name: str) -> None:
    +67
    def add_button(self, locator: Locator, name: str) -> None:
         """Добавляет кнопку в тулбар.
     
         Args:
             locator (Locator): Локатор кнопки
             name (str): Уникальное имя кнопки
         """
    -
         self.buttons.append(Button(self.page, locator, name))
     
    @@ -3115,22 +3312,20 @@
    Source code in components\toolbar_component.py -
    54
    +              
    51
    +52
    +53
    +54
     55
     56
     57
    -58
    -59
    -60
    -61
    -62
    def add_tab_button(self, locator: Locator, name: str) -> None:
    +58
    def add_tab_button(self, locator: Locator, name: str) -> None:
         """Добавляет кнопку типа v-tab в тулбар.
     
         Args:
             locator (Locator): Локатор кнопки
             name (str): Уникальное имя кнопки
         """
    -
         self.buttons.append(TabButton(self.page, locator, name))
     
    @@ -3185,20 +3380,18 @@
    Source code in components\toolbar_component.py -
    35
    +              
    34
    +35
     36
     37
     38
     39
    -40
    -41
    -42
    def add_title(self, title: str) -> None:
    +40
    def add_title(self, title: str) -> None:
         """Устанавливает новый заголовок тулбара.
     
         Args:
             title (str): Новый заголовок
         """
    -
         self.title = title
     
    @@ -3269,22 +3462,20 @@
    Source code in components\toolbar_component.py -
    44
    +              
    42
    +43
    +44
     45
     46
     47
     48
    -49
    -50
    -51
    -52
    def add_tooltip_button(self, locator: Locator, name: str) -> None:
    +49
    def add_tooltip_button(self, locator: Locator, name: str) -> None:
         """Добавляет кнопку с подсказкой в тулбар.
     
         Args:
             locator (Locator): Локатор кнопки
             name (str): Уникальное имя кнопки
         """
    -
         self.buttons.append(TooltipButton(self.page, locator, name))
     
    @@ -3378,21 +3569,20 @@
    Source code in components\toolbar_component.py -
    168
    -169
    -170
    -171
    -172
    -173
    -174
    -175
    -176
    -177
    -178
    -179
    -180
    -181
    -182
    def check_button_tooltip(self, name: str, tooltip: str) -> None:
    +              
    199
    +200
    +201
    +202
    +203
    +204
    +205
    +206
    +207
    +208
    +209
    +210
    +211
    +212
    def check_button_tooltip(self, name: str, tooltip: str) -> None:
         """Проверяет текст подсказки кнопки.
     
         Args:
    @@ -3402,7 +3592,6 @@
         Raises:
             AssertionError: Если текст подсказки не совпадает
         """
    -
         button = self.get_button_by_name(name)
         if button is None:
             raise AssertionError(f"Unsupported button name {name}")
    @@ -3483,32 +3672,30 @@
     
                 
    Source code in components\toolbar_component.py -
    150
    -151
    -152
    -153
    -154
    -155
    -156
    -157
    -158
    -159
    -160
    -161
    -162
    -163
    -164
    -165
    -166
    def check_button_visibility(self, name: str) -> None:
    +              
    182
    +183
    +184
    +185
    +186
    +187
    +188
    +189
    +190
    +191
    +192
    +193
    +194
    +195
    +196
    +197
    def check_button_visibility(self, name: str) -> None:
         """Проверяет наличие и видимость кнопки с предварительной прокруткой к элементу.
     
    -        Args:
    -            name (str): Имя кнопки
    -
    -        Raises:
    -            AssertionError: Если кнопка не найдена или не видна
    -        """
    +    Args:
    +        name (str): Имя кнопки
     
    +    Raises:
    +        AssertionError: Если кнопка не найдена или не видна
    +    """
         button = self.get_button_by_name(name)
     
         if button is None:
    @@ -3569,15 +3756,15 @@
     
                 
    Source code in components\toolbar_component.py -
    140
    -141
    -142
    -143
    -144
    -145
    -146
    -147
    -148
    def check_toolbar_presence(self, message: str) -> None:
    +              
    162
    +163
    +164
    +165
    +166
    +167
    +168
    +169
    +170
    def check_toolbar_presence(self, message: str) -> None:
         """Проверяет видимость тулбара.
     
         Args:
    @@ -3595,6 +3782,76 @@
     
    +

    + check_toolbar_presence_by_locator(locator, message) + +

    + + +
    + +

    Проверяет видимость тулбара.

    + + +

    Parameters:

    + + + + + + + + + + + + + + + + + +
    NameTypeDescriptionDefault
    + message + + str + +
    +

    Сообщение об ошибке если тулбар не виден

    +
    +
    + required +
    + + +
    + Source code in components\toolbar_component.py +
    172
    +173
    +174
    +175
    +176
    +177
    +178
    +179
    +180
    def check_toolbar_presence_by_locator(self, locator: str|Locator, message: str) -> None:
    +    """Проверяет видимость тулбара.
    +
    +    Args:
    +        message (str): Сообщение об ошибке если тулбар не виден
    +    """
    +
    +    locator = self.get_locator(locator)
    +    expect(locator).to_be_visible(), message
    +
    +
    +
    + +
    + +
    + +

    click_button(name) @@ -3662,20 +3919,19 @@
    Source code in components\toolbar_component.py -
     89
    - 90
    - 91
    - 92
    - 93
    - 94
    - 95
    - 96
    - 97
    - 98
    - 99
    -100
    -101
    -102
    def click_button(self, name: str) -> None:
    +              
    @@ -3765,29 +4020,27 @@
    Source code in components\toolbar_component.py -
    83
    +84
    +85
    +86
    +87
    +88
    +89
    +90
    +91
    +92
    +93
    +94
    +95
    def click_button(self, name: str) -> None:
         """Кликает по кнопке тулбара.
     
         Args:
    @@ -3684,7 +3940,6 @@
         Raises:
             AssertionError: Если кнопка не найдена
         """
    -
         button = self.get_button_by_name(name)
         if button is None:
             raise AssertionError(f"Unsupported button name {name}")
    @@ -3751,11 +4006,11 @@
           
    - TooltipButton | None + TooltipButton | TabButton | Button | None
    -

    TooltipButton | None: Найденная кнопка или None

    +

    TooltipButton | TabButton | Button | None: Найденная кнопка или None

    74
    +              
    69
    +70
    +71
    +72
    +73
    +74
     75
     76
     77
     78
     79
     80
    -81
    -82
    -83
    -84
    -85
    -86
    -87
    def get_button_by_name(self, name: str) -> TooltipButton | None:
    +81
    def get_button_by_name(self, name: str) -> TooltipButton | TabButton | Button | None:
         """Возвращает кнопку по имени.
     
         Args:
             name (str): Имя кнопки
     
         Returns:
    -        TooltipButton | None: Найденная кнопка или None
    +        TooltipButton | TabButton | Button | None: Найденная кнопка или None
         """
    -
         for button in self.buttons:
             if button.name == name:
                 return button
    @@ -3801,6 +4054,196 @@
     
    +

    + get_toolbar_title_text(locator='ToolbarLocators.TITLE', filter_text=None, timeout=5000) + +

    + + +
    + +

    Получает заголовок тулбара модального окна.

    + + +

    Parameters:

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    NameTypeDescriptionDefault
    + locator + + str + +
    +

    Локатор для заголовка тулбара (по умолчанию 'ToolbarLocators.TITLE')

    +
    +
    + 'ToolbarLocators.TITLE' +
    + filter_text + + str + +
    +

    Текст для фильтрации заголовка (опционально)

    +
    +
    + None +
    + timeout + + int + +
    +

    Таймаут ожидания в миллисекундах

    +
    +
    + 5000 +
    + + +

    Returns:

    + + + + + + + + + + + + + +
    Name TypeDescription
    str + str + +
    +

    Текст заголовка тулбара

    +
    +
    + + +

    Raises:

    + + + + + + + + + + + + + +
    TypeDescription
    + Exception + +
    +

    Если не удалось получить заголовок

    +
    +
    + + +
    + Source code in components\toolbar_component.py +
     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
    def get_toolbar_title_text(self, locator: str = 'ToolbarLocators.TITLE',
    +                          filter_text: str = None, timeout: int = 5000) -> str:
    +    """Получает заголовок тулбара модального окна.
    +
    +    Args:
    +        locator: Локатор для заголовка тулбара (по умолчанию 'ToolbarLocators.TITLE')
    +        filter_text: Текст для фильтрации заголовка (опционально)
    +        timeout: Таймаут ожидания в миллисекундах
    +
    +    Returns:
    +        str: Текст заголовка тулбара
    +
    +    Raises:
    +        Exception: Если не удалось получить заголовок
    +    """
    +    # Получаем локатор заголовка
    +    title_locator = self.get_locator(locator)
    +
    +    # Фильтруем по тексту если указан
    +    if filter_text:
    +        title_locator = title_locator.filter(has_text=filter_text)
    +
    +    # Ждем появления заголовка с помощью expect
    +    expect(title_locator).to_be_visible(timeout=timeout)
    +
    +    # Получаем текст заголовка
    +    title_text = title_locator.text_content().strip()
    +    logger.info("Заголовок тулбара: '%s'", title_text)
    +
    +    return title_text
    +
    +
    +
    + +
    + +
    + +

    is_button_not_present(name) @@ -3891,23 +4334,22 @@
    Source code in components\toolbar_component.py -
    122
    -123
    -124
    -125
    -126
    -127
    -128
    -129
    -130
    -131
    -132
    -133
    -134
    -135
    -136
    -137
    -138
    def is_button_not_present(self, name: str) -> bool:
    +              
    145
    +146
    +147
    +148
    +149
    +150
    +151
    +152
    +153
    +154
    +155
    +156
    +157
    +158
    +159
    +160
    def is_button_not_present(self, name: str) -> bool:
         """Проверяет отсутствие кнопки.
     
         Args:
    @@ -3919,7 +4361,6 @@
         Raises:
             AssertionError: Если имя кнопки не поддерживается
         """
    -
         button = self.get_button_by_name(name)
         if button is None:
             raise AssertionError(f"Unsupported button name {name}")
    @@ -4023,23 +4464,22 @@
     
                 
    Source code in components\toolbar_component.py -
    104
    -105
    -106
    -107
    -108
    -109
    -110
    -111
    -112
    -113
    -114
    -115
    -116
    -117
    -118
    -119
    -120
    def is_button_present(self, name: str) -> bool:
    +              
    128
    +129
    +130
    +131
    +132
    +133
    +134
    +135
    +136
    +137
    +138
    +139
    +140
    +141
    +142
    +143
    def is_button_present(self, name: str) -> bool:
         """Проверяет наличие кнопки.
     
         Args:
    @@ -4051,7 +4491,6 @@
         Raises:
             AssertionError: Если имя кнопки не поддерживается
         """
    -
         button = self.get_button_by_name(name)
         if button is None:
             raise AssertionError(f"Unsupported button name {name}")
    diff --git a/site/components_derived/container_system_log_events/index.html b/site/components_derived/container_system_log_events/index.html
    new file mode 100644
    index 0000000..9b2c45e
    --- /dev/null
    +++ b/site/components_derived/container_system_log_events/index.html
    @@ -0,0 +1,2788 @@
    +
    +
    +
    +  
    +    
    +      
    +      
    +      
    +      
    +      
    +      
    +        
    +      
    +      
    +        
    +      
    +      
    +      
    +      
    +    
    +    
    +      
    +        SystemLogEventsContainer - Документация тестов eNODE-Мониторинг
    +      
    +    
    +    
    +      
    +      
    +      
    +
    +
    +    
    +    
    +      
    +    
    +    
    +      
    +        
    +        
    +        
    +        
    +        
    +      
    +    
    +    
    +      
    +    
    +    
    +    
    +      
    +
    +    
    +    
    +    
    +  
    +  
    +  
    +    
    +  
    +    
    +    
    +    
    +    
    +    
    +    
    + +
    + + + + + + +
    + + +
    + +
    + + + + + + +
    +
    + + + +
    +
    +
    + + + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    +
    + + + +
    +
    + + + + +

    SystemLogEventsContainer

    + + +
    + + + + +
    + +

    Модуль контейнера для отображения событий системного журнала.

    +

    Содержит класс для работы с контейнером для отображения событий +системного журнала через Playwright.

    + + + + + + + + + +
    + + + + + + + + +
    + + + +

    + SystemLogEventsContainer + + +

    + + +
    +

    + Bases: EventsContainerComponent

    + + +

    Компонент контейнера для отображения событий системного журнала.

    +

    Предоставляет методы для взаимодействия с элементами +контейнера для отображения событий системного журнала.

    + + + + + + + +
    + Source code in components_derived\container_system_log_events.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
    class SystemLogEventsContainer(EventsContainerComponent):
    +    """Компонент контейнера для отображения событий системного журнала.
    +
    +    Предоставляет методы для взаимодействия с элементами
    +    контейнера для отображения событий системного журнала.
    +    """
    +
    +    def __init__(self, page: Page, locator: str | Locator):
    +        """Инициализирует компонент контейнера для отображения событий системного журнала.
    +
    +        Args:
    +            page: Экземпляр страницы Playwright.
    +        """
    +
    +        super().__init__(page, locator)
    +
    +        self.add_tab_to_toolbar(ToolbarLocators.TABS, "events")
    +    # Действия:
    +    # Проверки:
    +    def check_content(self) -> None:
    +        """Проверяет содержимое контейнера для отображения событий системного журнала."""
    +
    +        expected_headers = ['ТИП', 'ВРЕМЯ', 'СТРОГОСТЬ', 'ХОСТ', 'ОПИСАНИЕ']
    +
    +        self.should_be_toolbar()
    +        self.should_be_base_toolbar_buttons()
    +
    +        events_tab = self.get_toolbar_tab_button("events")
    +        events_tab_text = events_tab.get_text(0)
    +        assert events_tab_text.find("chevron_right") != -1, "Should be icon 'chevron_right'"
    +        assert events_tab_text.find("События") != -1, "Tab button with text События is missing on toolbar"
    +
    +        self.should_be_events_table()
    +        events_table = self.get_events_table_content()
    +
    +        if len(events_table) == 0:
    +            assert False, "The contents of the events table are missing"
    +
    +        self.check_events_table_headers(events_table[0], expected_headers)
    +
    +        if len(events_table) == 1:
    +            assert False, "Table body is missing"
    +
    +        self.should_be_pagination_buttons()
    +
    +
    + + + +
    + + + + + + + + + +
    + + +

    + __init__(page, locator) + +

    + + +
    + +

    Инициализирует компонент контейнера для отображения событий системного журнала.

    + + +

    Parameters:

    + + + + + + + + + + + + + + + + + +
    NameTypeDescriptionDefault
    + page + + Page + +
    +

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

    +
    +
    + required +
    + + +
    + Source code in components_derived\container_system_log_events.py +
    24
    +25
    +26
    +27
    +28
    +29
    +30
    +31
    +32
    +33
    def __init__(self, page: Page, locator: str | Locator):
    +    """Инициализирует компонент контейнера для отображения событий системного журнала.
    +
    +    Args:
    +        page: Экземпляр страницы Playwright.
    +    """
    +
    +    super().__init__(page, locator)
    +
    +    self.add_tab_to_toolbar(ToolbarLocators.TABS, "events")
    +
    +
    +
    + +
    + +
    + + +

    + check_content() + +

    + + +
    + +

    Проверяет содержимое контейнера для отображения событий системного журнала.

    + + +
    + Source code in components_derived\container_system_log_events.py +
    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
    def check_content(self) -> None:
    +    """Проверяет содержимое контейнера для отображения событий системного журнала."""
    +
    +    expected_headers = ['ТИП', 'ВРЕМЯ', 'СТРОГОСТЬ', 'ХОСТ', 'ОПИСАНИЕ']
    +
    +    self.should_be_toolbar()
    +    self.should_be_base_toolbar_buttons()
    +
    +    events_tab = self.get_toolbar_tab_button("events")
    +    events_tab_text = events_tab.get_text(0)
    +    assert events_tab_text.find("chevron_right") != -1, "Should be icon 'chevron_right'"
    +    assert events_tab_text.find("События") != -1, "Tab button with text События is missing on toolbar"
    +
    +    self.should_be_events_table()
    +    events_table = self.get_events_table_content()
    +
    +    if len(events_table) == 0:
    +        assert False, "The contents of the events table are missing"
    +
    +    self.check_events_table_headers(events_table[0], expected_headers)
    +
    +    if len(events_table) == 1:
    +        assert False, "Table body is missing"
    +
    +    self.should_be_pagination_buttons()
    +
    +
    +
    + +
    + + + +
    + +
    + +
    + + + + +
    + +
    + +
    + + + + + + + + + + + + + +
    +
    + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + + \ No newline at end of file diff --git a/site/components_derived/dialog_user_settings/index.html b/site/components_derived/dialog_user_settings/index.html index f005ed2..08f0489 100644 --- a/site/components_derived/dialog_user_settings/index.html +++ b/site/components_derived/dialog_user_settings/index.html @@ -9,7 +9,7 @@ - + @@ -751,6 +751,27 @@ +
  • + + + + + EventsContainerComponent + + + + +
  • + + + + + + + + + +
  • @@ -898,6 +919,27 @@ + + +
  • + + + + + SystemLogEventsContainer + + + + +
  • + + + + + + + + @@ -1690,6 +1732,27 @@ + + + + + + +
  • + + + + + ZTPTemplatesTab + + + + +
  • + + + + @@ -1899,6 +1962,27 @@ +
  • + + + + + TestSystemLogEventsContainer + + + + +
  • + + + + + + + + + +
  • @@ -1956,6 +2040,27 @@ + + + + + + +
  • + + + + + TestZTPTemplatesTab + + + + +
  • + + + + diff --git a/site/components_derived/modal_add_AD_user/index.html b/site/components_derived/modal_add_AD_user/index.html index 524b4b1..5d90caf 100644 --- a/site/components_derived/modal_add_AD_user/index.html +++ b/site/components_derived/modal_add_AD_user/index.html @@ -751,6 +751,27 @@ +
  • + + + + + EventsContainerComponent + + + + +
  • + + + + + + + + + +
  • @@ -900,6 +921,27 @@ +
  • + + + + + SystemLogEventsContainer + + + + +
  • + + + + + + + + + +
  • @@ -1681,6 +1723,27 @@ + + + + + + +
  • + + + + + ZTPTemplatesTab + + + + +
  • + + + + @@ -1890,6 +1953,27 @@ +
  • + + + + + TestSystemLogEventsContainer + + + + +
  • + + + + + + + + + +
  • @@ -1947,6 +2031,27 @@ + + + + + + +
  • + + + + + TestZTPTemplatesTab + + + + +
  • + + + + diff --git a/site/components_derived/modal_add_local_user/index.html b/site/components_derived/modal_add_local_user/index.html index 4bfa172..1042c13 100644 --- a/site/components_derived/modal_add_local_user/index.html +++ b/site/components_derived/modal_add_local_user/index.html @@ -751,6 +751,27 @@ +
  • + + + + + EventsContainerComponent + + + + +
  • + + + + + + + + + +
  • @@ -900,6 +921,27 @@ +
  • + + + + + SystemLogEventsContainer + + + + +
  • + + + + + + + + + +
  • @@ -1672,6 +1714,27 @@ + + + + + + +
  • + + + + + ZTPTemplatesTab + + + + +
  • + + + + @@ -1881,6 +1944,27 @@ +
  • + + + + + TestSystemLogEventsContainer + + + + +
  • + + + + + + + + + +
  • @@ -1938,6 +2022,27 @@ + + + + + + +
  • + + + + + TestZTPTemplatesTab + + + + +
  • + + + + diff --git a/site/components_derived/modal_change_password/index.html b/site/components_derived/modal_change_password/index.html index c3e9392..b586775 100644 --- a/site/components_derived/modal_change_password/index.html +++ b/site/components_derived/modal_change_password/index.html @@ -751,6 +751,27 @@ +
  • + + + + + EventsContainerComponent + + + + +
  • + + + + + + + + + +
  • @@ -900,6 +921,27 @@ +
  • + + + + + SystemLogEventsContainer + + + + +
  • + + + + + + + + + +
  • @@ -1690,6 +1732,27 @@ + + + + + + +
  • + + + + + ZTPTemplatesTab + + + + +
  • + + + + @@ -1899,6 +1962,27 @@ +
  • + + + + + TestSystemLogEventsContainer + + + + +
  • + + + + + + + + + +
  • @@ -1956,6 +2040,27 @@ + + + + + + +
  • + + + + + TestZTPTemplatesTab + + + + +
  • + + + + diff --git a/site/components_derived/modal_edit_user/index.html b/site/components_derived/modal_edit_user/index.html index 6970f68..8e11d19 100644 --- a/site/components_derived/modal_edit_user/index.html +++ b/site/components_derived/modal_edit_user/index.html @@ -751,6 +751,27 @@ +
  • + + + + + EventsContainerComponent + + + + +
  • + + + + + + + + + +
  • @@ -900,6 +921,27 @@ +
  • + + + + + SystemLogEventsContainer + + + + +
  • + + + + + + + + + +
  • @@ -1672,6 +1714,27 @@ + + + + + + +
  • + + + + + ZTPTemplatesTab + + + + +
  • + + + + @@ -1881,6 +1944,27 @@ +
  • + + + + + TestSystemLogEventsContainer + + + + +
  • + + + + + + + + + +
  • @@ -1938,6 +2022,27 @@ + + + + + + +
  • + + + + + TestZTPTemplatesTab + + + + +
  • + + + + diff --git a/site/components_derived/modal_view_template/index.html b/site/components_derived/modal_view_template/index.html index 891ca3e..16efb3f 100644 --- a/site/components_derived/modal_view_template/index.html +++ b/site/components_derived/modal_view_template/index.html @@ -751,6 +751,27 @@ +
  • + + + + + EventsContainerComponent + + + + +
  • + + + + + + + + + +
  • @@ -900,6 +921,27 @@ +
  • + + + + + SystemLogEventsContainer + + + + +
  • + + + + + + + + + +
  • @@ -1095,6 +1137,24 @@ +
  • + +
  • + + + compare_modal_with_api_data + + + +
  • + +
  • + + + get_modal_window_data + + +
  • @@ -1636,6 +1696,27 @@ + + + + + + +
  • + + + + + ZTPTemplatesTab + + + + +
  • + + + + @@ -1845,6 +1926,27 @@ +
  • + + + + + TestSystemLogEventsContainer + + + + +
  • + + + + + + + + + +
  • @@ -1902,6 +2004,27 @@ + + + + + + +
  • + + + + + TestZTPTemplatesTab + + + + +
  • + + + + @@ -2303,6 +2426,24 @@ + + +
  • + + + compare_modal_with_api_data + + + +
  • + +
  • + + + get_modal_window_data + + +
  • @@ -2387,64 +2528,150 @@
    Source code in components_derived\modal_view_template.py -
    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
    class ViewTemplateModalWindow(ModalWindowComponent):
    +                
     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
    class ViewTemplateModalWindow(ModalWindowComponent):
         """Модальное окно шаблона.
     
         Наследует ModalWindowComponent и добавляет функционал для:
    @@ -2456,7 +2683,6 @@
     
         def __init__(self, page: Page, template_name: str):
             """Инициализирует элементы формы модального окна шаблона."""
    -
             super().__init__(page)
     
             # Настройка заголовка и кнопки закрытия
    @@ -2470,7 +2696,6 @@
     
         def close_window(self) -> None:
             """Закрывает окно через кнопку 'Закрыть'."""
    -
             close_button = self.get_button_by_name("close")
             close_button.click()
     
    @@ -2482,26 +2707,114 @@
             2. Видимость кнопки закрытия
             3. Подсказку кнопки закрытия
             """
    -
             self.check_by_window_title()
             self.check_toolbar_button_visibility("close")
             self.check_toolbar_button_tooltip("close", "Закрыть")
     
    -    # Разрабатывается =========================================================
    -    def _get_config_data(self) -> dict:
    -        """Получает конфигурационные данные из модального окна.
    +    def get_modal_window_data(self) -> dict:
    +        """Извлекает данные из модального окна шаблона и структурирует по кодам и значениям.
     
             Returns:
    -            dict: Словарь с конфигурационными данными или пустой словарь
    +            dict: Данные в формате {'код': 'значение'} как в API
             """
    -        config_data = {}
    +        modal_data = {}
     
    -        # Ищем контейнер с конфигурационными данными
    -        config_container = self.page.locator(
    -            "//*[@id='app']/div[2]/div/div/div/div/div/div/div/div/div[2]/div/div/div"
    -        )
    +        # Получаем все значения из input полей
    +        input_locator = self.get_locator(ModalWindowLocators.MODAL_WINDOW_TEXT_FIELD_INPUT)
     
    -        return config_data
    +        # Проверка наличия элементов
    +        input_count = input_locator.count()
    +        if input_count == 0:
    +            logger.warning("Поля ввода не найдены в модальном окне")
    +            return modal_data
    +
    +        all_values = []
    +
    +        # Обрабатываем каждое поле с обработкой возможных ошибок
    +        for i in range(input_count):
    +            input_field = input_locator.nth(i)
    +
    +            # Проверяем, что элемент видим и доступен
    +            if not input_field.is_visible():
    +                logger.debug("Поле %s не видимо, пропускаем", i)
    +                continue
    +
    +            # Получаем значение с обработкой возможных ошибок состояния элемента
    +            if input_field.is_visible():
    +                value = input_field.input_value().strip()
    +                if value:  # Игнорируем пустые значения
    +                    all_values.append(value)
    +            else:
    +                logger.debug("Поле %s стало невидимым после проверки, пропускаем", i)
    +
    +        logger.info("Все значения из полей: %s", all_values)
    +
    +        # Анализируем пары код-значение
    +        i = 0
    +        while i < len(all_values) - 1:
    +            current_value = all_values[i]
    +            next_value = all_values[i + 1]
    +
    +            # Определяем, является ли текущее значение кодом (число)
    +            if current_value.isdigit():
    +                # Текущее значение - код, следующее - значение
    +                modal_data[current_value] = next_value
    +                i += 2  # Перескакиваем через пару
    +            else:
    +                # Если текущее значение не число, ищем следующую пару
    +                i += 1
    +
    +        # Добавляем имя шаблона с ключом 'Шаблон' вместо 'template'
    +        if all_values:
    +            modal_data['Шаблон'] = all_values[-1]
    +
    +        logger.info("Структурированные данные из модального окна: %s", modal_data)
    +        return modal_data
    +
    +    def compare_modal_with_api_data(self, modal_data: dict, api_data: dict,
    +                                   template_name: str) -> None:
    +        """Сравнивает данные из модального окна с данными из API."""
    +        errors = []
    +
    +        # Создаем копию API данных с заменой 'template' на 'Шаблон'
    +        api_data_adapted = api_data.copy()
    +        if 'template' in api_data_adapted:
    +            api_data_adapted['Шаблон'] = api_data_adapted.pop('template')
    +
    +        # Сравниваем все поля
    +        for code, expected_value in api_data_adapted.items():
    +            if code in modal_data:
    +                actual_value = modal_data[code]
    +                if actual_value != expected_value:
    +                    error_msg = (
    +                        f"Расхождение для кода {code}: "
    +                        f"модальное окно='{actual_value}', API='{expected_value}'"
    +                    )
    +                    logger.error(error_msg)
    +                    errors.append(error_msg)
    +            else:
    +                error_msg = f"Код {code} не найден в модальном окне"
    +                logger.error(error_msg)
    +                errors.append(error_msg)
    +
    +        # Дополнительная проверка имени шаблона
    +        modal_template = modal_data.get('Шаблон', '')
    +        if modal_template != template_name:
    +            error_msg = (
    +                f"Расхождение в имени шаблона: "
    +                f"модальное окно='{modal_template}', ожидается='{template_name}'"
    +            )
    +            logger.error(error_msg)
    +            errors.append(error_msg)
    +
    +        # Если есть расхождения, выбрасываем ошибку
    +        if errors:
    +            error_details = "\n".join(errors)
    +            assert False, (
    +                f"Обнаружены расхождения для шаблона '{template_name}':\n{error_details}"
    +            )
    +
    +        logger.info("Данные модального окна соответствуют API для шаблона '%s'", template_name)
     
    @@ -2533,8 +2846,7 @@
    Source code in components_derived\modal_view_template.py -
    26
    -27
    +              
    27
     28
     29
     30
    @@ -2547,7 +2859,6 @@
     37
     38
    def __init__(self, page: Page, template_name: str):
         """Инициализирует элементы формы модального окна шаблона."""
    -
         super().__init__(page)
     
         # Настройка заголовка и кнопки закрытия
    @@ -2584,7 +2895,8 @@
     
                 
    Source code in components_derived\modal_view_template.py -
    46
    +              
    45
    +46
     47
     48
     49
    @@ -2593,9 +2905,7 @@
     52
     53
     54
    -55
    -56
    -57
    def check_content(self) -> None:
    +55
    def check_content(self) -> None:
         """Проверяет наличие и корректность элементов окна.
     
         Проверяет:
    @@ -2603,7 +2913,6 @@
         2. Видимость кнопки закрытия
         3. Подсказку кнопки закрытия
         """
    -
         self.check_by_window_title()
         self.check_toolbar_button_visibility("close")
         self.check_toolbar_button_tooltip("close", "Закрыть")
    @@ -2632,10 +2941,8 @@
                   
    40
     41
     42
    -43
    -44
    def close_window(self) -> None:
    +43
    def close_window(self) -> None:
         """Закрывает окно через кнопку 'Закрыть'."""
    -
         close_button = self.get_button_by_name("close")
         close_button.click()
     
    @@ -2644,6 +2951,277 @@
    +
    + + +

    + compare_modal_with_api_data(modal_data, api_data, template_name) + +

    + + +
    + +

    Сравнивает данные из модального окна с данными из API.

    + + +
    + Source code in components_derived\modal_view_template.py +
    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
    def compare_modal_with_api_data(self, modal_data: dict, api_data: dict,
    +                               template_name: str) -> None:
    +    """Сравнивает данные из модального окна с данными из API."""
    +    errors = []
    +
    +    # Создаем копию API данных с заменой 'template' на 'Шаблон'
    +    api_data_adapted = api_data.copy()
    +    if 'template' in api_data_adapted:
    +        api_data_adapted['Шаблон'] = api_data_adapted.pop('template')
    +
    +    # Сравниваем все поля
    +    for code, expected_value in api_data_adapted.items():
    +        if code in modal_data:
    +            actual_value = modal_data[code]
    +            if actual_value != expected_value:
    +                error_msg = (
    +                    f"Расхождение для кода {code}: "
    +                    f"модальное окно='{actual_value}', API='{expected_value}'"
    +                )
    +                logger.error(error_msg)
    +                errors.append(error_msg)
    +        else:
    +            error_msg = f"Код {code} не найден в модальном окне"
    +            logger.error(error_msg)
    +            errors.append(error_msg)
    +
    +    # Дополнительная проверка имени шаблона
    +    modal_template = modal_data.get('Шаблон', '')
    +    if modal_template != template_name:
    +        error_msg = (
    +            f"Расхождение в имени шаблона: "
    +            f"модальное окно='{modal_template}', ожидается='{template_name}'"
    +        )
    +        logger.error(error_msg)
    +        errors.append(error_msg)
    +
    +    # Если есть расхождения, выбрасываем ошибку
    +    if errors:
    +        error_details = "\n".join(errors)
    +        assert False, (
    +            f"Обнаружены расхождения для шаблона '{template_name}':\n{error_details}"
    +        )
    +
    +    logger.info("Данные модального окна соответствуют API для шаблона '%s'", template_name)
    +
    +
    +
    + +
    + +
    + + +

    + get_modal_window_data() + +

    + + +
    + +

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

    + + +

    Returns:

    + + + + + + + + + + + + + +
    Name TypeDescription
    dict + dict + +
    +

    Данные в формате {'код': 'значение'} как в API

    +
    +
    + + +
    + Source code in components_derived\modal_view_template.py +
     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
    def get_modal_window_data(self) -> dict:
    +    """Извлекает данные из модального окна шаблона и структурирует по кодам и значениям.
    +
    +    Returns:
    +        dict: Данные в формате {'код': 'значение'} как в API
    +    """
    +    modal_data = {}
    +
    +    # Получаем все значения из input полей
    +    input_locator = self.get_locator(ModalWindowLocators.MODAL_WINDOW_TEXT_FIELD_INPUT)
    +
    +    # Проверка наличия элементов
    +    input_count = input_locator.count()
    +    if input_count == 0:
    +        logger.warning("Поля ввода не найдены в модальном окне")
    +        return modal_data
    +
    +    all_values = []
    +
    +    # Обрабатываем каждое поле с обработкой возможных ошибок
    +    for i in range(input_count):
    +        input_field = input_locator.nth(i)
    +
    +        # Проверяем, что элемент видим и доступен
    +        if not input_field.is_visible():
    +            logger.debug("Поле %s не видимо, пропускаем", i)
    +            continue
    +
    +        # Получаем значение с обработкой возможных ошибок состояния элемента
    +        if input_field.is_visible():
    +            value = input_field.input_value().strip()
    +            if value:  # Игнорируем пустые значения
    +                all_values.append(value)
    +        else:
    +            logger.debug("Поле %s стало невидимым после проверки, пропускаем", i)
    +
    +    logger.info("Все значения из полей: %s", all_values)
    +
    +    # Анализируем пары код-значение
    +    i = 0
    +    while i < len(all_values) - 1:
    +        current_value = all_values[i]
    +        next_value = all_values[i + 1]
    +
    +        # Определяем, является ли текущее значение кодом (число)
    +        if current_value.isdigit():
    +            # Текущее значение - код, следующее - значение
    +            modal_data[current_value] = next_value
    +            i += 2  # Перескакиваем через пару
    +        else:
    +            # Если текущее значение не число, ищем следующую пару
    +            i += 1
    +
    +    # Добавляем имя шаблона с ключом 'Шаблон' вместо 'template'
    +    if all_values:
    +        modal_data['Шаблон'] = all_values[-1]
    +
    +    logger.info("Структурированные данные из модального окна: %s", modal_data)
    +    return modal_data
    +
    +
    +
    + +
    + diff --git a/site/components_derived/user_card/index.html b/site/components_derived/user_card/index.html index af78b44..15210c3 100644 --- a/site/components_derived/user_card/index.html +++ b/site/components_derived/user_card/index.html @@ -751,6 +751,27 @@ +
  • + + + + + EventsContainerComponent + + + + +
  • + + + + + + + + + +
  • @@ -900,6 +921,27 @@ +
  • + + + + + SystemLogEventsContainer + + + + +
  • + + + + + + + + + +
  • @@ -1654,6 +1696,27 @@ + + + + + + +
  • + + + + + ZTPTemplatesTab + + + + +
  • + + + + @@ -1863,6 +1926,27 @@ +
  • + + + + + TestSystemLogEventsContainer + + + + +
  • + + + + + + + + + +
  • @@ -1920,6 +2004,27 @@ + + + + + + +
  • + + + + + TestZTPTemplatesTab + + + + +
  • + + + + diff --git a/site/config/add_docstring/index.html b/site/config/add_docstring/index.html index e602ced..63e5e16 100644 --- a/site/config/add_docstring/index.html +++ b/site/config/add_docstring/index.html @@ -751,6 +751,27 @@ +
  • + + + + + EventsContainerComponent + + + + +
  • + + + + + + + + + +
  • @@ -898,6 +919,27 @@ +
  • + + + + + SystemLogEventsContainer + + + + +
  • + + + + + + + + + +
  • @@ -1543,6 +1585,27 @@ + + + + + + +
  • + + + + + ZTPTemplatesTab + + + + +
  • + + + + @@ -1752,6 +1815,27 @@ +
  • + + + + + TestSystemLogEventsContainer + + + + +
  • + + + + + + + + + +
  • @@ -1809,6 +1893,27 @@ + + + + + + +
  • + + + + + TestZTPTemplatesTab + + + + +
  • + + + + diff --git a/site/config/code_development_process/index.html b/site/config/code_development_process/index.html index 51554f8..518c0b7 100644 --- a/site/config/code_development_process/index.html +++ b/site/config/code_development_process/index.html @@ -744,6 +744,27 @@ +
  • + + + + + EventsContainerComponent + + + + +
  • + + + + + + + + + +
  • @@ -891,6 +912,27 @@ +
  • + + + + + SystemLogEventsContainer + + + + +
  • + + + + + + + + + +
  • @@ -1536,6 +1578,27 @@ + + + + + + +
  • + + + + + ZTPTemplatesTab + + + + +
  • + + + + @@ -1745,6 +1808,27 @@ +
  • + + + + + TestSystemLogEventsContainer + + + + +
  • + + + + + + + + + +
  • @@ -1802,6 +1886,27 @@ + + + + + + +
  • + + + + + TestZTPTemplatesTab + + + + +
  • + + + + diff --git a/site/config/mkdocs_guide/index.html b/site/config/mkdocs_guide/index.html index d3647ad..7ab6ea0 100644 --- a/site/config/mkdocs_guide/index.html +++ b/site/config/mkdocs_guide/index.html @@ -751,6 +751,27 @@ +
  • + + + + + EventsContainerComponent + + + + +
  • + + + + + + + + + +
  • @@ -898,6 +919,27 @@ +
  • + + + + + SystemLogEventsContainer + + + + +
  • + + + + + + + + + +
  • @@ -1543,6 +1585,27 @@ + + + + + + +
  • + + + + + ZTPTemplatesTab + + + + +
  • + + + + @@ -1752,6 +1815,27 @@ +
  • + + + + + TestSystemLogEventsContainer + + + + +
  • + + + + + + + + + +
  • @@ -1809,6 +1893,27 @@ + + + + + + +
  • + + + + + TestZTPTemplatesTab + + + + +
  • + + + + diff --git a/site/data/constants/index.html b/site/data/constants/index.html index fc1a15b..a4ef0bd 100644 --- a/site/data/constants/index.html +++ b/site/data/constants/index.html @@ -811,6 +811,27 @@ +
  • + + + + + EventsContainerComponent + + + + +
  • + + + + + + + + + +
  • @@ -958,6 +979,27 @@ +
  • + + + + + SystemLogEventsContainer + + + + +
  • + + + + + + + + + +
  • @@ -1603,6 +1645,27 @@ + + + + + + +
  • + + + + + ZTPTemplatesTab + + + + +
  • + + + + @@ -1812,6 +1875,27 @@ +
  • + + + + + TestSystemLogEventsContainer + + + + +
  • + + + + + + + + + +
  • @@ -1869,6 +1953,27 @@ + + + + + + +
  • + + + + + TestZTPTemplatesTab + + + + +
  • + + + + diff --git a/site/data/environment/index.html b/site/data/environment/index.html index bd824c5..1ce3518 100644 --- a/site/data/environment/index.html +++ b/site/data/environment/index.html @@ -907,6 +907,27 @@ +
  • + + + + + EventsContainerComponent + + + + +
  • + + + + + + + + + +
  • @@ -1054,6 +1075,27 @@ +
  • + + + + + SystemLogEventsContainer + + + + +
  • + + + + + + + + + +
  • @@ -1699,6 +1741,27 @@ + + + + + + +
  • + + + + + ZTPTemplatesTab + + + + +
  • + + + + @@ -1908,6 +1971,27 @@ +
  • + + + + + TestSystemLogEventsContainer + + + + +
  • + + + + + + + + + +
  • @@ -1965,6 +2049,27 @@ + + + + + + +
  • + + + + + TestZTPTemplatesTab + + + + +
  • + + + + diff --git a/site/data/roles_dict/index.html b/site/data/roles_dict/index.html index d0ba2cb..80bcb78 100644 --- a/site/data/roles_dict/index.html +++ b/site/data/roles_dict/index.html @@ -802,6 +802,27 @@ +
  • + + + + + EventsContainerComponent + + + + +
  • + + + + + + + + + +
  • @@ -949,6 +970,27 @@ +
  • + + + + + SystemLogEventsContainer + + + + +
  • + + + + + + + + + +
  • @@ -1594,6 +1636,27 @@ + + + + + + +
  • + + + + + ZTPTemplatesTab + + + + +
  • + + + + @@ -1803,6 +1866,27 @@ +
  • + + + + + TestSystemLogEventsContainer + + + + +
  • + + + + + + + + + +
  • @@ -1860,6 +1944,27 @@ + + + + + + +
  • + + + + + TestZTPTemplatesTab + + + + +
  • + + + + diff --git a/site/elements/base_element/index.html b/site/elements/base_element/index.html index 1f933af..20bb0c4 100644 --- a/site/elements/base_element/index.html +++ b/site/elements/base_element/index.html @@ -907,6 +907,27 @@ +
  • + + + + + EventsContainerComponent + + + + +
  • + + + + + + + + + +
  • @@ -1054,6 +1075,27 @@ +
  • + + + + + SystemLogEventsContainer + + + + +
  • + + + + + + + + + +
  • @@ -1699,6 +1741,27 @@ + + + + + + +
  • + + + + + ZTPTemplatesTab + + + + +
  • + + + + @@ -1908,6 +1971,27 @@ +
  • + + + + + TestSystemLogEventsContainer + + + + +
  • + + + + + + + + + +
  • @@ -1965,6 +2049,27 @@ + + + + + + +
  • + + + + + TestZTPTemplatesTab + + + + +
  • + + + + diff --git a/site/elements/button_element/index.html b/site/elements/button_element/index.html index b7d2d91..2e8f85c 100644 --- a/site/elements/button_element/index.html +++ b/site/elements/button_element/index.html @@ -835,6 +835,27 @@ +
  • + + + + + EventsContainerComponent + + + + +
  • + + + + + + + + + +
  • @@ -982,6 +1003,27 @@ +
  • + + + + + SystemLogEventsContainer + + + + +
  • + + + + + + + + + +
  • @@ -1627,6 +1669,27 @@ + + + + + + +
  • + + + + + ZTPTemplatesTab + + + + +
  • + + + + @@ -1836,6 +1899,27 @@ +
  • + + + + + TestSystemLogEventsContainer + + + + +
  • + + + + + + + + + +
  • @@ -1893,6 +1977,27 @@ + + + + + + +
  • + + + + + TestZTPTemplatesTab + + + + +
  • + + + + diff --git a/site/elements/checkbox_element/index.html b/site/elements/checkbox_element/index.html index c8ba1be..e933441 100644 --- a/site/elements/checkbox_element/index.html +++ b/site/elements/checkbox_element/index.html @@ -853,6 +853,27 @@ +
  • + + + + + EventsContainerComponent + + + + +
  • + + + + + + + + + +
  • @@ -1000,6 +1021,27 @@ +
  • + + + + + SystemLogEventsContainer + + + + +
  • + + + + + + + + + +
  • @@ -1645,6 +1687,27 @@ + + + + + + +
  • + + + + + ZTPTemplatesTab + + + + +
  • + + + + @@ -1854,6 +1917,27 @@ +
  • + + + + + TestSystemLogEventsContainer + + + + +
  • + + + + + + + + + +
  • @@ -1911,6 +1995,27 @@ + + + + + + +
  • + + + + + TestZTPTemplatesTab + + + + +
  • + + + + diff --git a/site/elements/icon_element/index.html b/site/elements/icon_element/index.html index 325f663..b5c0636 100644 --- a/site/elements/icon_element/index.html +++ b/site/elements/icon_element/index.html @@ -835,6 +835,27 @@ +
  • + + + + + EventsContainerComponent + + + + +
  • + + + + + + + + + +
  • @@ -982,6 +1003,27 @@ +
  • + + + + + SystemLogEventsContainer + + + + +
  • + + + + + + + + + +
  • @@ -1627,6 +1669,27 @@ + + + + + + +
  • + + + + + ZTPTemplatesTab + + + + +
  • + + + + @@ -1836,6 +1899,27 @@ +
  • + + + + + TestSystemLogEventsContainer + + + + +
  • + + + + + + + + + +
  • @@ -1893,6 +1977,27 @@ + + + + + + +
  • + + + + + TestZTPTemplatesTab + + + + +
  • + + + + diff --git a/site/elements/tab_button_element/index.html b/site/elements/tab_button_element/index.html index 0fa1c0a..5bfe59e 100644 --- a/site/elements/tab_button_element/index.html +++ b/site/elements/tab_button_element/index.html @@ -826,6 +826,27 @@ +
  • + + + + + EventsContainerComponent + + + + +
  • + + + + + + + + + +
  • @@ -973,6 +994,27 @@ +
  • + + + + + SystemLogEventsContainer + + + + +
  • + + + + + + + + + +
  • @@ -1618,6 +1660,27 @@ + + + + + + +
  • + + + + + ZTPTemplatesTab + + + + +
  • + + + + @@ -1827,6 +1890,27 @@ +
  • + + + + + TestSystemLogEventsContainer + + + + +
  • + + + + + + + + + +
  • @@ -1884,6 +1968,27 @@ + + + + + + +
  • + + + + + TestZTPTemplatesTab + + + + +
  • + + + + diff --git a/site/elements/text_element/index.html b/site/elements/text_element/index.html index 9f1c170..4ebe667 100644 --- a/site/elements/text_element/index.html +++ b/site/elements/text_element/index.html @@ -826,6 +826,27 @@ +
  • + + + + + EventsContainerComponent + + + + +
  • + + + + + + + + + +
  • @@ -973,6 +994,27 @@ +
  • + + + + + SystemLogEventsContainer + + + + +
  • + + + + + + + + + +
  • @@ -1618,6 +1660,27 @@ + + + + + + +
  • + + + + + ZTPTemplatesTab + + + + +
  • + + + + @@ -1827,6 +1890,27 @@ +
  • + + + + + TestSystemLogEventsContainer + + + + +
  • + + + + + + + + + +
  • @@ -1884,6 +1968,27 @@ + + + + + + +
  • + + + + + TestZTPTemplatesTab + + + + +
  • + + + + diff --git a/site/elements/text_input_element/index.html b/site/elements/text_input_element/index.html index bd59a59..76f0a3e 100644 --- a/site/elements/text_input_element/index.html +++ b/site/elements/text_input_element/index.html @@ -871,6 +871,27 @@ +
  • + + + + + EventsContainerComponent + + + + +
  • + + + + + + + + + +
  • @@ -1018,6 +1039,27 @@ +
  • + + + + + SystemLogEventsContainer + + + + +
  • + + + + + + + + + +
  • @@ -1663,6 +1705,27 @@ + + + + + + +
  • + + + + + ZTPTemplatesTab + + + + +
  • + + + + @@ -1872,6 +1935,27 @@ +
  • + + + + + TestSystemLogEventsContainer + + + + +
  • + + + + + + + + + +
  • @@ -1929,6 +2013,27 @@ + + + + + + +
  • + + + + + TestZTPTemplatesTab + + + + +
  • + + + + diff --git a/site/elements/tooltip_button_element/index.html b/site/elements/tooltip_button_element/index.html index da0902e..7fc1b1d 100644 --- a/site/elements/tooltip_button_element/index.html +++ b/site/elements/tooltip_button_element/index.html @@ -853,6 +853,27 @@ +
  • + + + + + EventsContainerComponent + + + + +
  • + + + + + + + + + +
  • @@ -1000,6 +1021,27 @@ +
  • + + + + + SystemLogEventsContainer + + + + +
  • + + + + + + + + + +
  • @@ -1645,6 +1687,27 @@ + + + + + + +
  • + + + + + ZTPTemplatesTab + + + + +
  • + + + + @@ -1854,6 +1917,27 @@ +
  • + + + + + TestSystemLogEventsContainer + + + + +
  • + + + + + + + + + +
  • @@ -1911,6 +1995,27 @@ + + + + + + +
  • + + + + + TestZTPTemplatesTab + + + + +
  • + + + + diff --git a/site/fixtures/pages/index.html b/site/fixtures/pages/index.html index 6741dd4..56a84be 100644 --- a/site/fixtures/pages/index.html +++ b/site/fixtures/pages/index.html @@ -865,6 +865,27 @@ +
  • + + + + + EventsContainerComponent + + + + +
  • + + + + + + + + + +
  • @@ -1012,6 +1033,27 @@ +
  • + + + + + SystemLogEventsContainer + + + + +
  • + + + + + + + + + +
  • @@ -1657,6 +1699,27 @@ + + + + + + +
  • + + + + + ZTPTemplatesTab + + + + +
  • + + + + @@ -1866,6 +1929,27 @@ +
  • + + + + + TestSystemLogEventsContainer + + + + +
  • + + + + + + + + + +
  • @@ -1923,6 +2007,27 @@ + + + + + + +
  • + + + + + TestZTPTemplatesTab + + + + +
  • + + + + diff --git a/site/index.html b/site/index.html index f33b8c9..3fddfce 100644 --- a/site/index.html +++ b/site/index.html @@ -1005,6 +1005,27 @@ +
  • + + + + + EventsContainerComponent + + + + +
  • + + + + + + + + + +
  • @@ -1152,6 +1173,27 @@ +
  • + + + + + SystemLogEventsContainer + + + + +
  • + + + + + + + + + +
  • @@ -1797,6 +1839,27 @@ + + + + + + +
  • + + + + + ZTPTemplatesTab + + + + +
  • + + + + @@ -2006,6 +2069,27 @@ +
  • + + + + + TestSystemLogEventsContainer + + + + +
  • + + + + + + + + + +
  • @@ -2063,6 +2147,27 @@ + + + + + + +
  • + + + + + TestZTPTemplatesTab + + + + +
  • + + + + diff --git a/site/locators/button_locators/index.html b/site/locators/button_locators/index.html index c585958..ad051ad 100644 --- a/site/locators/button_locators/index.html +++ b/site/locators/button_locators/index.html @@ -751,6 +751,27 @@ +
  • + + + + + EventsContainerComponent + + + + +
  • + + + + + + + + + +
  • @@ -898,6 +919,27 @@ +
  • + + + + + SystemLogEventsContainer + + + + +
  • + + + + + + + + + +
  • @@ -1603,6 +1645,27 @@ + + + + + + +
  • + + + + + ZTPTemplatesTab + + + + +
  • + + + + @@ -1812,6 +1875,27 @@ +
  • + + + + + TestSystemLogEventsContainer + + + + +
  • + + + + + + + + + +
  • @@ -1869,6 +1953,27 @@ + + + + + + +
  • + + + + + TestZTPTemplatesTab + + + + +
  • + + + + diff --git a/site/locators/confirm_locators/index.html b/site/locators/confirm_locators/index.html index 80f4742..d1ca63a 100644 --- a/site/locators/confirm_locators/index.html +++ b/site/locators/confirm_locators/index.html @@ -751,6 +751,27 @@ +
  • + + + + + EventsContainerComponent + + + + +
  • + + + + + + + + + +
  • @@ -898,6 +919,27 @@ +
  • + + + + + SystemLogEventsContainer + + + + +
  • + + + + + + + + + +
  • @@ -1603,6 +1645,27 @@ + + + + + + +
  • + + + + + ZTPTemplatesTab + + + + +
  • + + + + @@ -1812,6 +1875,27 @@ +
  • + + + + + TestSystemLogEventsContainer + + + + +
  • + + + + + + + + + +
  • @@ -1869,6 +1953,27 @@ + + + + + + +
  • + + + + + TestZTPTemplatesTab + + + + +
  • + + + + diff --git a/site/locators/event_panel_locators/index.html b/site/locators/event_panel_locators/index.html index e052147..6367efb 100644 --- a/site/locators/event_panel_locators/index.html +++ b/site/locators/event_panel_locators/index.html @@ -751,6 +751,27 @@ +
  • + + + + + EventsContainerComponent + + + + +
  • + + + + + + + + + +
  • @@ -898,6 +919,27 @@ +
  • + + + + + SystemLogEventsContainer + + + + +
  • + + + + + + + + + +
  • @@ -1603,6 +1645,27 @@ + + + + + + +
  • + + + + + ZTPTemplatesTab + + + + +
  • + + + + @@ -1812,6 +1875,27 @@ +
  • + + + + + TestSystemLogEventsContainer + + + + +
  • + + + + + + + + + +
  • @@ -1869,6 +1953,27 @@ + + + + + + +
  • + + + + + TestZTPTemplatesTab + + + + +
  • + + + + @@ -2313,6 +2418,7 @@ TAB_ACTIONS (str): кнопки Действия. TAB_EVENTS (str): кнопки События. TAB_MAINTENANCE (str): кнопки Обслуживания. TAB_SYSTEM_LOG (str): кнопки Системный журнал. +CONTAINER_SYSTEM_LOG_EVENTS (str): контейнера с событиями Системного журнала. BUTTONS_EVENT (str): блока кнопок-счетчиков событий. BUTTONS_SERVICE (str): блока кнопок, содержащего кнопки Поиска и Текущего пользователя. AREA_EVENTS (str): рабочей области страницы.

    @@ -2352,7 +2458,11 @@ AREA_EVENTS (str): рабочей области страницы.

    31 32 33 -34
    class EventPanelLocators:
    +34
    +35
    +36
    +37
    +38
    class EventPanelLocators:
         """Локаторы элементов панели событий.
     
         Содержит XPath локаторы для:
    @@ -2363,6 +2473,7 @@ AREA_EVENTS (str): рабочей области страницы.

    TAB_EVENTS (str): кнопки События. TAB_MAINTENANCE (str): кнопки Обслуживания. TAB_SYSTEM_LOG (str): кнопки Системный журнал. + CONTAINER_SYSTEM_LOG_EVENTS (str): контейнера с событиями Системного журнала. BUTTONS_EVENT (str): блока кнопок-счетчиков событий. BUTTONS_SERVICE (str): блока кнопок, содержащего кнопки Поиска и Текущего пользователя. AREA_EVENTS (str): рабочей области страницы. @@ -2376,6 +2487,9 @@ AREA_EVENTS (str): рабочей области страницы.

    TAB_MAINTENANCE = f"{TABS_BLOCK}//div[@class='v-tabs']//div[@class='v-tabs__container']/div[5]" TAB_SYSTEM_LOG = f"{TABS_BLOCK}//div[@class='v-tabs']//div[@class='v-tabs__container']/div[6]" + CONTAINER_SYSTEM_LOG_EVENTS = "#app > div.application--wrap > div > div:nth-child(3) > div:nth-child(5)" + + BUTTONS_EVENT = "//nav/div[@class='v-toolbar__content']/div[@class='v-toolbar__items'][2]//span[contains(@class, 'v-tooltip')]" BUTTONS_SERVICE = "//nav/div[@class='v-toolbar__content']/div[@class='v-toolbar__items'][2]" diff --git a/site/locators/input_locators/index.html b/site/locators/input_locators/index.html index 1067486..af4599f 100644 --- a/site/locators/input_locators/index.html +++ b/site/locators/input_locators/index.html @@ -751,6 +751,27 @@ +
  • + + + + + EventsContainerComponent + + + + +
  • + + + + + + + + + +
  • @@ -898,6 +919,27 @@ +
  • + + + + + SystemLogEventsContainer + + + + +
  • + + + + + + + + + +
  • @@ -1603,6 +1645,27 @@ + + + + + + +
  • + + + + + ZTPTemplatesTab + + + + +
  • + + + + @@ -1812,6 +1875,27 @@ +
  • + + + + + TestSystemLogEventsContainer + + + + +
  • + + + + + + + + + +
  • @@ -1869,6 +1953,27 @@ + + + + + + +
  • + + + + + TestZTPTemplatesTab + + + + +
  • + + + + diff --git a/site/locators/json_container_locators/index.html b/site/locators/json_container_locators/index.html index 15451ee..d21ecef 100644 --- a/site/locators/json_container_locators/index.html +++ b/site/locators/json_container_locators/index.html @@ -751,6 +751,27 @@ +
  • + + + + + EventsContainerComponent + + + + +
  • + + + + + + + + + +
  • @@ -898,6 +919,27 @@ +
  • + + + + + SystemLogEventsContainer + + + + +
  • + + + + + + + + + +
  • @@ -1603,6 +1645,27 @@ + + + + + + +
  • + + + + + ZTPTemplatesTab + + + + +
  • + + + + @@ -1812,6 +1875,27 @@ +
  • + + + + + TestSystemLogEventsContainer + + + + +
  • + + + + + + + + + +
  • @@ -1869,6 +1953,27 @@ + + + + + + +
  • + + + + + TestZTPTemplatesTab + + + + +
  • + + + + diff --git a/site/locators/modal_window_locators/index.html b/site/locators/modal_window_locators/index.html index 7d7005b..f438fef 100644 --- a/site/locators/modal_window_locators/index.html +++ b/site/locators/modal_window_locators/index.html @@ -751,6 +751,27 @@ +
  • + + + + + EventsContainerComponent + + + + +
  • + + + + + + + + + +
  • @@ -898,6 +919,27 @@ +
  • + + + + + SystemLogEventsContainer + + + + +
  • + + + + + + + + + +
  • @@ -1603,6 +1645,27 @@ + + + + + + +
  • + + + + + ZTPTemplatesTab + + + + +
  • + + + + @@ -1812,6 +1875,27 @@ +
  • + + + + + TestSystemLogEventsContainer + + + + +
  • + + + + + + + + + +
  • @@ -1869,6 +1953,27 @@ + + + + + + +
  • + + + + + TestZTPTemplatesTab + + + + +
  • + + + + @@ -2311,7 +2416,9 @@ INPUT_FORM_USER_DATA (str): формы ввода пользовательски TEXT_FIELD_INPUT_FORM_USER_DATA (str): текстового поля ввода MENU_INPUT_FORM_USER_DATA (str): меню выбора ролей LABEL_INPUT_FORM_USER_DATA (str): метки поля ввода -MODAL_WINDOW_SCROLL_CONTAINER (str): контейнера с прокруткой модального окна

    +MODAL_WINDOW_SCROLL_CONTAINER (str): контейнера с прокруткой модального окна +MODAL_WINDOW_TITLE (str): заголовка тулбара +MODAL_WINDOW_TEXT_FIELD_INPUT (str): текстового поля ввода

    @@ -2340,7 +2447,10 @@ MODAL_WINDOW_SCROLL_CONTAINER (str): контейнера с прокрутко 23 24 25 -26
    class ModalWindowLocators:
    +26
    +27
    +28
    +29
    class ModalWindowLocators:
         """Локаторы для элементов модальных окон.
     
         Содержит XPath локаторы для:
    @@ -2350,11 +2460,14 @@ MODAL_WINDOW_SCROLL_CONTAINER (str): контейнера с прокрутко
         MENU_INPUT_FORM_USER_DATA (str): меню выбора ролей
         LABEL_INPUT_FORM_USER_DATA (str): метки поля ввода
         MODAL_WINDOW_SCROLL_CONTAINER (str): контейнера с прокруткой модального окна
    +    MODAL_WINDOW_TITLE (str): заголовка тулбара
    +    MODAL_WINDOW_TEXT_FIELD_INPUT (str): текстового поля ввода
         """
     
         MODAL_WINDOW = "//div[contains(@class, 'v-dialog--active')]"
         MODAL_WINDOW_SCROLL_CONTAINER = f"{MODAL_WINDOW}//div[contains(@class, 'scrollarea__body')]"
    -
    +    MODAL_WINDOW_TITLE = f"{MODAL_WINDOW}//div[contains(@class, 'v-toolbar__title')]"
    +    MODAL_WINDOW_TEXT_FIELD_INPUT = f"{MODAL_WINDOW}//input"
     
         INPUT_FORM_USER_DATA = "//form[@class='v-form']"
         TEXT_FIELD_INPUT_FORM_USER_DATA = "xpath=div[2]/div/div/div/div/input"
    diff --git a/site/locators/navigation_panel_locators/index.html b/site/locators/navigation_panel_locators/index.html
    index de16997..5f83405 100644
    --- a/site/locators/navigation_panel_locators/index.html
    +++ b/site/locators/navigation_panel_locators/index.html
    @@ -751,6 +751,27 @@
       
       
       
    +    
  • + + + + + EventsContainerComponent + + + + +
  • + + + + + + + + + +
  • @@ -898,6 +919,27 @@ +
  • + + + + + SystemLogEventsContainer + + + + +
  • + + + + + + + + + +
  • @@ -1603,6 +1645,27 @@ + + + + + + +
  • + + + + + ZTPTemplatesTab + + + + +
  • + + + + @@ -1812,6 +1875,27 @@ +
  • + + + + + TestSystemLogEventsContainer + + + + +
  • + + + + + + + + + +
  • @@ -1869,6 +1953,27 @@ + + + + + + +
  • + + + + + TestZTPTemplatesTab + + + + +
  • + + + + diff --git a/site/locators/table_locators/index.html b/site/locators/table_locators/index.html index 1cee36c..77f3d35 100644 --- a/site/locators/table_locators/index.html +++ b/site/locators/table_locators/index.html @@ -751,6 +751,27 @@ +
  • + + + + + EventsContainerComponent + + + + +
  • + + + + + + + + + +
  • @@ -898,6 +919,27 @@ +
  • + + + + + SystemLogEventsContainer + + + + +
  • + + + + + + + + + +
  • @@ -1603,6 +1645,27 @@ + + + + + + +
  • + + + + + ZTPTemplatesTab + + + + +
  • + + + + @@ -1812,6 +1875,27 @@ +
  • + + + + + TestSystemLogEventsContainer + + + + +
  • + + + + + + + + + +
  • @@ -1869,6 +1953,27 @@ + + + + + + +
  • + + + + + TestZTPTemplatesTab + + + + +
  • + + + + diff --git a/site/locators/text_input_locators/index.html b/site/locators/text_input_locators/index.html index c4d7d31..b601470 100644 --- a/site/locators/text_input_locators/index.html +++ b/site/locators/text_input_locators/index.html @@ -751,6 +751,27 @@ +
  • + + + + + EventsContainerComponent + + + + +
  • + + + + + + + + + +
  • @@ -898,6 +919,27 @@ +
  • + + + + + SystemLogEventsContainer + + + + +
  • + + + + + + + + + +
  • @@ -1603,6 +1645,27 @@ + + + + + + +
  • + + + + + ZTPTemplatesTab + + + + +
  • + + + + @@ -1812,6 +1875,27 @@ +
  • + + + + + TestSystemLogEventsContainer + + + + +
  • + + + + + + + + + +
  • @@ -1869,6 +1953,27 @@ + + + + + + +
  • + + + + + TestZTPTemplatesTab + + + + +
  • + + + + diff --git a/site/locators/text_locators/index.html b/site/locators/text_locators/index.html index 94573dd..9689a3f 100644 --- a/site/locators/text_locators/index.html +++ b/site/locators/text_locators/index.html @@ -751,6 +751,27 @@ +
  • + + + + + EventsContainerComponent + + + + +
  • + + + + + + + + + +
  • @@ -898,6 +919,27 @@ +
  • + + + + + SystemLogEventsContainer + + + + +
  • + + + + + + + + + +
  • @@ -1603,6 +1645,27 @@ + + + + + + +
  • + + + + + ZTPTemplatesTab + + + + +
  • + + + + @@ -1812,6 +1875,27 @@ +
  • + + + + + TestSystemLogEventsContainer + + + + +
  • + + + + + + + + + +
  • @@ -1869,6 +1953,27 @@ + + + + + + +
  • + + + + + TestZTPTemplatesTab + + + + +
  • + + + + diff --git a/site/locators/toolbar_locators/index.html b/site/locators/toolbar_locators/index.html index 473af32..039889f 100644 --- a/site/locators/toolbar_locators/index.html +++ b/site/locators/toolbar_locators/index.html @@ -751,6 +751,27 @@ +
  • + + + + + EventsContainerComponent + + + + +
  • + + + + + + + + + +
  • @@ -898,6 +919,27 @@ +
  • + + + + + SystemLogEventsContainer + + + + +
  • + + + + + + + + + +
  • @@ -1603,6 +1645,27 @@ + + + + + + +
  • + + + + + ZTPTemplatesTab + + + + +
  • + + + + @@ -1812,6 +1875,27 @@ +
  • + + + + + TestSystemLogEventsContainer + + + + +
  • + + + + + + + + + +
  • @@ -1869,6 +1953,27 @@ + + + + + + +
  • + + + + + TestZTPTemplatesTab + + + + +
  • + + + + @@ -2326,7 +2431,9 @@ TITLE (str): заголовка тулбара 13 14 15 -16
    class ToolbarLocators:
    +16
    +17
    +18
    class ToolbarLocators:
         """Локаторы элементов панели инструментов (тулбара).
     
         Содержит XPath локаторы для:
    @@ -2335,6 +2442,8 @@ TITLE (str): заголовка тулбара
         """
     
         TITLE = "//nav//div[contains(@class, 'v-toolbar__title')]"
    +    ITEMS = "//nav//div[@class='v-toolbar__items']"
    +    TABS = "//nav//div[contains(@class, 'v-toolbar__title')]//a[contains(@class, 'v-tabs__item')]"
         TOOLTIP = "//div[contains(@class,'v-tooltip__content menuable__content__active')]"
     
    diff --git a/site/locators/user_card_locators/index.html b/site/locators/user_card_locators/index.html index 3d6a7ec..e16f7dc 100644 --- a/site/locators/user_card_locators/index.html +++ b/site/locators/user_card_locators/index.html @@ -751,6 +751,27 @@ +
  • + + + + + EventsContainerComponent + + + + +
  • + + + + + + + + + +
  • @@ -898,6 +919,27 @@ +
  • + + + + + SystemLogEventsContainer + + + + +
  • + + + + + + + + + +
  • @@ -1603,6 +1645,27 @@ + + + + + + +
  • + + + + + ZTPTemplatesTab + + + + +
  • + + + + @@ -1812,6 +1875,27 @@ +
  • + + + + + TestSystemLogEventsContainer + + + + +
  • + + + + + + + + + +
  • @@ -1869,6 +1953,27 @@ + + + + + + +
  • + + + + + TestZTPTemplatesTab + + + + +
  • + + + + diff --git a/site/objects.inv b/site/objects.inv index 5ece4b00159dcb499f61a762af1d0b8e5cba2068..59bf27fdf420f2eaa19ea23bffb1629c0ef96124 100644 GIT binary patch delta 5076 zcmV;_6D#bsBiksDwSUX5-L@5-_bUuE)9NAtI_b=@T_A;17`4*^od`M-&pnKFBt?|& zqhDW=qTV98DQ-#^2;zGra;+skHaFjCd9TWX6b*}#oYYO6_7C1wuYbFjS(}r0KfW8D zvWG>mhd=-D?k|5zwJ_0p@%zIRHO&*oFhQd@rUh-{SfF3qB7bdYS)dZ6H3!1!4lcuck6JQGNDk^B+Qx>zdF7rIO%G)bNZC0=OJ~T&ywl~6NpYc79zms@j=%+JjfK9<`<1c*Sw(-09%qke41tejZJ68 zu?bcd8Jl2jU9lM!hSCK-P3p{Uf99bqAkhc@(`J7>5Pt#o#|J&lDK`#z`B=71d}*7e zEcO$X#g*1~KmsoV+M%Kk-4km{BS1rv9D}Cs=jG+IN_vYgj>wuOyuHZ}r#+5{HaR(j z>6sSXYEK#@)ojq>F*LudyVLS>2;r>g9K)EG+^io$sM;8nspi%)0HLMz#9_RZZJxy! za%9mNNq^CbPga+e@R#D8GQfDMCO8x}`lz0N=8rXv4<-em5kjTwj2UgnotMStX0g-( zsCy3^Vm@){rHwh|%SES25*Nvxu!Bf@H@awO9+M*TrzKDPpG#8PE8#jM04(|>9(_p) zlH1%rG<-ny!{h2I0C}mBBI9iiV^-@Ji2GjFv-_2f`sQSF`6*tM{ zINp|#`oNFPO4YqQf=n1x8MN=&JSBN+vaBJfo3hLsTFHjwFzQM?imQ@Q$#ekg=+aG7 zoE=NeNK&V_1B>%W%`5FW-;7#;84tjFt+XJ}=6f@S19_h(s)TRd`g*Noz1SDA| z%YRZ+O3T6X>@+FL8R%j*a^O2H^Y&iE8DS~+6}eX)mvu(oltkW75Mxj9cx}T>5Tv6TT3$Cib|X(U_jSypRfkHkjAI?5 zMLA=WDi|j`14~+STxE@c^iUw_6dmgWKGIx5q;@WETSvpls&=x)1!q|+4U_6yVAUY zy7I>;8v8V-$)Rl4pv4(wqO@mkL6B_L&R3*HaA(HAymI6OLG5|1+t^i>>p}X$4S(yb zA0ca+P;Wp^l|0fS5dz*&8XeRZ{wDIkw)nAk0Jc^?F5WEx!8*FnwJK3%S)*n7b`3kz z^E=~N?lAtN3%^QmUBKuc`~`UAClnoE%qJLi*Q1oN$RBNzvlBF2%le))oe0*{#vW`i z5jF3UNoOB{o0rvOSVLhg#oM8QpnuV?;_-jvQ(O7PCz6AOHU}*bt?K{C3G2hj=WY0D z^p<610oXfx(a&Z9M(e_9cKPiJR!8m0l*V%MMpfi zVW4%30c40Sy(*i$){4bNhtr?dTFe(zn!Clp>CHp(!Ral-@WJ`pV8;2B?tfB|Jb_lZ zEyJxoY8fE zq81-DH6b3ni-8nf$dVfx-x1 z*MLF?Tz=xq)onwX%q9n;a(|t+MxYa9)_u)5Jl4rvPZ}}e<^jHRmb3Ub;U7F6wT}9b51Wm%Sx1)eDM4)z9%~=ae!f&dQZYDTx2-7r zpaCHiDwnYrG{V{Vv}Fey3MuXP>cmCapHg-lr#~NeqHFp@vS^%Mnt$xa>E>xQ4O}1f z!4P#1UG!Bx`CL9OX2-W1!^36R8_we;!FniOx-y!GP;%1+BaLv|ttDeCjuS!j8~^oH z{rD&YbR%t+vJj5gA@>7{aLn)EN@jt9>qL)Jr$$X}r%N3!2;l1+q6vPu#1V2tJD!o8 zG`*VmT9^0Ov|{}TS%2e-thqS;-&W~=J90PFAuH?VCPY`|{YM$a)-J3fz@ek}S@!;; z`0UBNi={QdrgLZm(5cm7Nu2VDmqc2Vl=m85WBK?}zMQ5AZ0+&+rQv!W3c`u>qNf8~ zp%YF}L7s<7crZ0*dvnFJt;BvKUSX@YiN%V)_)1Bhu`p6ZH-A2Nw1HzBCj#-gpT)1e z#t@lzmsP~pfLQ**NZVm2(S__Zm?3reSx#(adrT;{22@)L7MI?V;!#XwGxl888O(?+ zBDqmSALQ>Z>ZhwA3&ibg%tGnd$dGg8>@Z?s#gMu#>-bI>OCHJTk{phPJXVrAN3f3& z-)NSRBBtqEQGY0m?%P#Y^3L>IRM(w(q;yFqmxYl;GHwpxj_nW}3LAamf9-K)QJ9?V zJr3(GbBaX0!wbY`-tYI}Xi;N%F3uhf@vJ%>M=K@_8)t6<%Kb#S4R6T3%GGityPcRt zae$BS!J{WNiGTZL^UWqIv9f_R$#Ox7c=a&6+6pdCQ6D4r1yCE06i>7+i~DkEri?Ioxg90?G><-`bBe7i z+B=ZsdVk+E6(<8X<#$rxAj(5Q+B(NU>(8y~a=s?KgVfL@1UStCfNm^M!+@>J90``c zLljw)KU%^Xoa|>9*)LLx+Yg#<)Y|b~7lAwN_wk-2^=lTb5AiS!VTdfRSo$;q_0`@7 zM`r-MFuMlrmOO1PZ$yCBE=uvk7R?AIpytL-FMmwR468VOkprNLds^f2Dj<`lseR$p zOzHMYWH03Bgvz-sE=5g__`aAek1-5EyYujVu~A5>HRn$Y?gB6Dgj zLs>wg50iPPRhsPu>)z~9l6b=QamAnrGR_4mz$XEbF! z8p+@|58qZwN3*I-mES;rr7um(dm>SlJd*i9T>t7pzS;^NUBvF})sz(=q8t~w)#aVU zei&jPca^)q$X8mEEBB(j6x8Hi@=j9sG42r6Ya@nTk}NB$jSGqZ2sPoqiujVO{C~x* z$f`3p^f3D0vz+fAJ}d&6AyhBr^8~TCEI`11O^R96GL!|RzjM>5%YxZmnb4i)Viva* z5&$;2*~q990N*t+W|i|WMu12*Y(`N=w8dGaW?h=VFv$6Vsz${yp4rr#S@>p92;B6v zFr#D$Lopmk1S+fA;857*2}s5dfPb>7i+GI6=V6Qh-C-X_WoER|ZL?@v2edzR25?zY2>(N1})jJk3i%=Gje$%^Il^JuGg0x6mhqD3=)1yXxI$-5XCGx7=PJ43Fj8dkBE9?ptCHa%jvX?3 zC+o{x4PZG$L*rVPu^-GMW4IBzjg8F_1-DEx%Rt3nbz0r$6NSo_N(UhP+chp z?B9*s0}+tb;jfFY*f@e04}W}h!t5^S@nV*7^b##mMsT@dBguKL_71LYq{xqGvgdQ_ ztS&$Bc?O_DZ(sT1hp8raH`j0NLFRRmUSH$Y)fDcApnRl-&Jh}4Zbykei$Ax0A$VMi zL4@OUi{${@M4XYk+rudaPFt{6t|hy+IS#0G!p{p)PVPCw-V=SP8h_qxMu>h*bVUjn z(OjOOAj&a*;k{?xgAi-~43&2m=)J579_XsWZ$94|g#zjsfN91XQ<HUN6|;R@CnBTv9W!wQBns zI}Bts$%F*m7gXL?qkkLIB5tV4LtYh6tpn~0tZ}}1E}+J8E;JG|9I;;Q7|IveW} z-)2yqu)6xBwq5su`sw)1U85c}>MhJj`{O%UWPdWa`Ss@l+FE}ixM6kTS`@d77~0Ip zOBm>_9eTTzV$7%cXJg~tN+lJF>@z7ifI$Ya8zgZfRo z80CR3v-OC!L!0)Ksg^8A4JI#5ouu4_s7Ok$G@YGPgnz=YJm3Wt*y2m=ffXx%hE(X3 zqhYgdi@L%V+xW%ig)7bRl3O`fU5aZxHg9B&x8{MntiB<%FF7#3V(_Md6!wX;HvfhY z3!x-UVBLW;c`o^El zPDz=%q@lUQvCylU6r5CsvQLNl>eyOWZ^^}F6c>2;p^MX3?0JdJ=$E)IYS!y?Er~mi z0Ed>Jxm>}U6MNbs6FO8DZ00VgQ&z$y$bTOH(q3EgauvskKz^niDbQRBbQq~ao`zuW z51N~es=MWLFj=e7eneg5Csn2wyQvnXjt6^K2D8D)FB*?-TbC*X(A9g*=s`e2wMB7z zaMhJ}wcXL4A=^=0;9>1$XvSHDt?hS5%3$qfx-Wa{LIw{xy3=hIkgGEw^f2;EwtvsO zK?5~dXbkk_`{{usB4yP~zBmXav<60sw9^2xCRW1!*a&S#ivaqloys0Wm#$xsAJ0@!9XKI8Y<+mkjg~g7XeZ-HOBIMG}k&|KnfdJ1yFV94A8@ zu>Qmg-1ChTT}Q9Wmh316PUhB|R2>pqh@ov&{>tY9tGbQn{-|SCOvBD2u75t7D^2&& z@;&!LWT%rEMxzgxFzNh`ll6If=Q&W;fQIcnnN`9)v!t;XlJg`wItk|qHIF`>q;Na7 z-6lDT)USbB0Bh&BwxQ$~>Xt(xLql95Z;nNn*$RyQZgG*;OgKzM`g)=qP(cZ*09d22 zHGo_00L0D)FN_AXl;6Heet!Y8xaV63F-!$4uaQT9n{~X*AH5I0Cdu~Fc?@*>2N!7M=1l9 z+oQw)I~W1wfU9y?4bC0D;Bq{(h8rywUFl0)y*4+o+@mgkC+Yl3Vj1XR9mot3ed+%F zJAGLU`})J_w#8vUt4+S2#IIfh5EO)DEFeCAD0+2qMr;18tV3{gGdA(1yaxc6#|Y)+ qV+iPOQvv%O1kLgs*SODfhJG39bAOMU8kFFCMdv^A;zUq= zMk|&dmMo`&pe4zIVErolk^a=d2MER!sl-cA2|Q8Tp(Dt8^x7w;xMPA(xWfHgs&-v4 z_=xw6dRf{1Tbr(;8BNuki@xdLD_{xkD^$|9$0R4`uBocxRH6LZbohTw-4|7rpcfdp z!bQH*cldmSz<&!SA8`djUN$c^yo5{e0HG>$>5~b?!2^Wq@bfjDR02Iftf5UN6NNSk zw8}JF4iF-&iPtH0md}>zI}?abcql{%nSd+iF%uu+sg@aLi{?fPe($^w#opg(Q;Cw~IbLI1>{pDRq2L)APtL!Y09 zzHjPqqNcv!?&eUz+k|$g?1Ok>t!V&gmnwP|DL^CGL>Vv7T^o(nqPREN_ZM}+$d z9m4d2YpS&u6Ox=ZaQ&Q`pO4*T|2c$k)pd?xtQxA;4UYnsR z^AkF<>wnCoVBM$enwHs1d4-9?eyS$9D{S^rKL1P~YbGB^3WrGulujr!+@l-qi~ZH2 zsS{9-7PgD}gr(;?<{>3#izZH77dJ!>A|1`>y2n+H>N1`d-RXa)qO%XeeM$$g>=S$R zrKnM5GylNw9fltqmly!(wJqwB&N+lwwPPagTYuA`!?_27XhN~HsC(JA$*K9Ee^8Y# zxsR@L&dsa*IMT9_E6gLvm`>$M$HmRPs0NdAO+no^P1WO;&n1UZx9m~gHUx8~16XIP zZdv2xSZacb?tDG4JI~a8ae7Rdp$72pgbomLF=4H_r0Nk{%7Skfy+Kbhx9YM2S z*yI25r?&nJPm~p9X&v~9Xr+0^S1gB%YH56Sb5h8{mw!1A&=rDs>>h3#*9pX6%K_Op>8NG9ONY}x zY_?eMsGCpJlhd0|5R%hd&J&XJ56P7CS24tFZcEchRC+G$-tJ*nved=hX`6GKZda&n zg6v<#9X}VWlAQKA;Rqa-LV#q8QwEng6Owt_)_fXv%zFv*>Br`iUV~RM3Dqy;9PJ=`n+TImBZ)(p`=xHFe4+o(s`?5 zbC=O@jHF`&hLKs_79)AsMn?qrc8=1Hi~Uq*gEGvb;Lt8(1cJt8g9MCd-T*#=%)IJ` zIv9k?XUPddh{rSAyl%#ea{XbP@qBrS zI($cER^p;+p2e9CK|P!Eh(^hed7e~xya=-2=&xVpkB>ZoSjwrVfCGr_6T}fhNcUKa zC&F=(tPiyr2xC-fjB@>%p%qV;Rk!P{Z3%d;N(AoR4eE*RZd$F-+nGK-nJmvs!YIz-l zQr>A##2q@*Md4e{AD^1nhe_nD?cw>k;(D1n!UO40{mf2E2zhC`(oKnNGWk(tANcPt@~5vNOT_K1 z%u>mrXpqN>6QIP>3WK_?>GB&Qq9Hcon~GzG{EEvG)qgoYe=8C)rTgtl z*U-iEw0_o8wg5W(HJd8sak84Z8SyM+) zx&?cJV499b0=d}bFcw^d^hMpTkHp!lr|Fd{Ig3FuXB<1AHXo|*xNGX$*1?KrSiDqc z$v&;KujssT>$-LT5)W*9KC{d1ee(yZVGwzUwV|tE(9T2Gv42|vqUAe8jsG4ODZp`= z094`T0s-4K6%Z_a2PkBR{u~hLVVa*nG(W2;sz2~qF>2>`A_Fx@Z*!DE`D>MJO!2f# zVaUt_6n>h4#$g|Wqf-D;m|{Y^7I&lyZvz0Wb-0MbX442HpeEjR6ecDH2eeq^1gI>^ zdEQ(YWYPCsEPtFl1ynmxMyhpI2O@FX#h^;H@pK=$Kg$n1x@Hw2L>gW1kEE$k z(WQar_Ye6y#dlP|Ie1jBG$hFhY(3iuytEp_@PJsOC1AT1LR8Z)Pt1&F8E(m7= zV!j+$gnw#F&uD6TFp|k|p32s6L$hs7gWo`Z!LR*5S0Y(kJfrnS-1zE=zfvX7PF?e| zKaO$8$oECAU2{Wu90uFS-L2sknz5*St>K;9F5v6+CH5XXgVG> z%BKUCwp78Rtvs)NK*ZENy;El3TdQAW&XLtCqwZwF4@4OIzy13&0E#kzY6uVua8E$s z#sjV037H=bKf7)5bmFEqVf`_wq1QGwyMK<_ly6aJO}pEn^8;YNs617(i;m)lLr`7j zoBE0eY#RcHI4{WX4ejHg8^9`jMy$E$?4ua*i?^Cg*=ONR7Kp0179})D6}+eKr!XvuF`)i1euOWe0j@valQQ&LGz4jogp;8 zRALUhLw&TAoIvsPA3^a$(|w-E4@I`eqVmS_M#0YC6goEpohCcNF7~KDIs<_$ zkAZ-oiTR^MeyGxh-E~i`i5v^8F^`>LH(y7J?+i2IR#tadI%w|HrpifQ^nU}l%9zvMX)~Vg;ttJzdivO+Cu|D~23e^is zj3;^NcT6-Mm@DrrM$pK&ZhuNT9^XSF$CJ6M-*_%ZT^mp2u2{XeHr?&SHXlp$ng&{R zhb{>ELWP`wac$IDUcig^o|D|hIG@2R)~U-Iae4<;%hO!6>WGHP4**>|)A?cR1io(RC zZ3;%g9E@fTUO8ac(tmstHLkS@qmecCU& zBCf2^5lYlx}Z~ip!f`6x$dfP=3KqiqJOj88g z_O1l3wzel;v}V%<|MWxQJG3Hdm}%F?70$`HcLn2SG32o1fOGfeZu!QY^hn_7)-gs} z^@DOV=Yr9UemefBa6NL3N#GEr`3fg#-xW0x&e#p~OuEB{0+uFlpgF{aGzI$@Xk@k4@oVQ~V(r#ofPZqKA7r22`08$Y9ZmMMO=g4P zC7MHb?0Xde=MTC+Zu4bo##IKDbN7*Akm0nvm!k^E z8zGMFcJl^ucLz`p!%L#R^9%-R(9jU*+xN>0sjOz@{wli&n_33`Rc|hXlQyvuj@JgY z4b2khvwsRHM-W}Rx?+fj(}h8;3qc&d<<=xDIPV|IyG(IB*2|yH@Rr*r8yuZ4wG~up zwHi7NERlWR|7%`qpy8%> zD&8O|{5DKbyeK+XV_;|(br;RCNwYd`9laY_mmo|T*5|heisRHVlS*LTt4St<^QcTf z?0;?Xq>%xv=GC7G+`w$U;iiL_w)wW72n2vz8CB*&hrxHKP&+F?p!0Xz?*h*2ucH{3 zYrdm6eUw!=EB8wf9x^=H^qE2zlP#Qf4(yq@e5yi0aawHxZ837=vYu^u}n~$Xw-)&65a%5FHI@^Nr z8GXCJSf+QWi!&3MJ;E%6G%v|6_%(0e`YSt8>6+is=98B^(bGPW86x{4{{IQTZv1@W z;dCDK5YW;DMQk=9U1Qu#bsW&2tK9;UY^& j{=hA7fdC3B*z?v)j%O1u_DQ*u?wo5!x6Jo{Ogq+zsGXE7 diff --git a/site/pages/base_page/index.html b/site/pages/base_page/index.html index e99b07e..615008d 100644 --- a/site/pages/base_page/index.html +++ b/site/pages/base_page/index.html @@ -751,6 +751,27 @@ +
  • + + + + + EventsContainerComponent + + + + +
  • + + + + + + + + + +
  • @@ -898,6 +919,27 @@ +
  • + + + + + SystemLogEventsContainer + + + + +
  • + + + + + + + + + +
  • @@ -1717,6 +1759,27 @@ + + + + + + +
  • + + + + + ZTPTemplatesTab + + + + +
  • + + + + @@ -1926,6 +1989,27 @@ +
  • + + + + + TestSystemLogEventsContainer + + + + +
  • + + + + + + + + + +
  • @@ -1983,6 +2067,27 @@ + + + + + + +
  • + + + + + TestZTPTemplatesTab + + + + +
  • + + + + diff --git a/site/pages/license_tab/index.html b/site/pages/license_tab/index.html index e09beae..df0fd31 100644 --- a/site/pages/license_tab/index.html +++ b/site/pages/license_tab/index.html @@ -751,6 +751,27 @@ +
  • + + + + + EventsContainerComponent + + + + +
  • + + + + + + + + + +
  • @@ -898,6 +919,27 @@ +
  • + + + + + SystemLogEventsContainer + + + + +
  • + + + + + + + + + +
  • @@ -1726,6 +1768,27 @@ + + + + + + +
  • + + + + + ZTPTemplatesTab + + + + +
  • + + + + @@ -1935,6 +1998,27 @@ +
  • + + + + + TestSystemLogEventsContainer + + + + +
  • + + + + + + + + + +
  • @@ -1992,6 +2076,27 @@ + + + + + + +
  • + + + + + TestZTPTemplatesTab + + + + +
  • + + + + diff --git a/site/pages/login_page/index.html b/site/pages/login_page/index.html index 5b9dcea..3f74a28 100644 --- a/site/pages/login_page/index.html +++ b/site/pages/login_page/index.html @@ -751,6 +751,27 @@ +
  • + + + + + EventsContainerComponent + + + + +
  • + + + + + + + + + +
  • @@ -898,6 +919,27 @@ +
  • + + + + + SystemLogEventsContainer + + + + +
  • + + + + + + + + + +
  • @@ -1663,6 +1705,27 @@ + + + + + + +
  • + + + + + ZTPTemplatesTab + + + + +
  • + + + + @@ -1872,6 +1935,27 @@ +
  • + + + + + TestSystemLogEventsContainer + + + + +
  • + + + + + + + + + +
  • @@ -1929,6 +2013,27 @@ + + + + + + +
  • + + + + + TestZTPTemplatesTab + + + + +
  • + + + + diff --git a/site/pages/main_page/index.html b/site/pages/main_page/index.html index 6211d8f..ae3d9a2 100644 --- a/site/pages/main_page/index.html +++ b/site/pages/main_page/index.html @@ -751,6 +751,27 @@ +
  • + + + + + EventsContainerComponent + + + + +
  • + + + + + + + + + +
  • @@ -898,6 +919,27 @@ +
  • + + + + + SystemLogEventsContainer + + + + +
  • + + + + + + + + + +
  • @@ -1572,6 +1614,15 @@ +
  • + +
  • + + + click_events_panel_system_log_tab + + +
  • @@ -1780,6 +1831,27 @@ + + + + + + +
  • + + + + + ZTPTemplatesTab + + + + +
  • + + + + @@ -1989,6 +2061,27 @@ +
  • + + + + + TestSystemLogEventsContainer + + + + +
  • + + + + + + + + + +
  • @@ -2046,6 +2139,27 @@ + + + + + + +
  • + + + + + TestZTPTemplatesTab + + + + +
  • + + + + @@ -2483,6 +2597,15 @@ + + +
  • + + + click_events_panel_system_log_tab + + +
  • @@ -2678,8 +2801,7 @@ user_card: Карточка пользователя.

    Source code in pages\main_page.py -
     14
    - 15
    +                
     15
      16
      17
      18
    @@ -2830,7 +2952,13 @@ user_card: Карточка пользователя.

    163 164 165 -166
    class MainPage(BasePage):
    +166
    +167
    +168
    +169
    +170
    +171
    +172
    class MainPage(BasePage):
         """Класс для работы с главной страницей приложения.
     
         Атрибуты:
    @@ -2862,14 +2990,14 @@ user_card: Карточка пользователя.

    self.navigation_panel.click_item(NavigationPanelLocators.PANEL_MAIN, item_name) - def click_subpanel_item(self, item_name: str) -> None: + def click_subpanel_item(self, item_name: str, parent=None) -> None: """Выполняет рекурсивный поиск по панели навигации заданного элемента и делает клик по нему.""" active_item_locator = self.page.locator(NavigationPanelLocators.PANEL_MAIN).locator(NavigationPanelLocators.ACTIVE_CONTAINER) node_locator = active_item_locator.locator(NavigationPanelLocators.SUB_PANEL_MAIN).locator(NavigationPanelLocators.TREEVIEW).first # Рекурсивный поиск в дереве v-treeview заданного элемента и клик по нему - self.navigation_panel.click_sub_item(node_locator, item_name) + self.navigation_panel.click_sub_item(node_locator, item_name, parent) def click_events_panel_expand_less_button(self) -> None: """Выполняет нажатие кнопки галочка вверх.""" @@ -2881,6 +3009,11 @@ user_card: Карточка пользователя.

    self.event_panel.click_expand_more_button() + def click_events_panel_system_log_tab(self) -> SystemLogEventsContainer: + """Выполняет нажатие tab-кнопки Системный журнал.""" + + return self.event_panel.click_system_log_tab() + def click_user_button(self) -> UserCard: """Выполняет нажатие кнопки пользователя.""" @@ -3045,8 +3178,7 @@ user_card: Карточка пользователя.

    Source code in pages\main_page.py -
    24
    -25
    +              
    25
     26
     27
     28
    @@ -3055,7 +3187,8 @@ user_card: Карточка пользователя.

    31 32 33 -34
    def __init__(self, page: Page) -> None:
    +34
    +35
    def __init__(self, page: Page) -> None:
         """Инициализирует элементы главной страницы.
     
         Args:
    @@ -3088,10 +3221,10 @@ user_card: Карточка пользователя.

    Source code in pages\main_page.py -
    135
    -136
    -137
    -138
    def check_expand_less_button(self) -> bool:
    +              
    141
    +142
    +143
    +144
    def check_expand_less_button(self) -> bool:
         """Проверяет наличие кнопки галочка вверх."""
     
         return self.event_panel.check_expand_less_button()
    @@ -3117,10 +3250,10 @@ user_card: Карточка пользователя.

    Source code in pages\main_page.py -
    140
    -141
    -142
    -143
    def check_expand_more_button(self) -> bool:
    +              
    146
    +147
    +148
    +149
    def check_expand_more_button(self) -> bool:
         """Проверяет наличие кнопки галочка вниз."""
     
         return self.event_panel.check_expand_more_button()
    @@ -3177,17 +3310,17 @@ user_card: Карточка пользователя.

    Source code in pages\main_page.py -
    156
    -157
    -158
    -159
    -160
    -161
    -162
    +              
    162
     163
     164
     165
    -166
    def check_navigation_panel_item_visibility(self, item_name: str) -> None:
    +166
    +167
    +168
    +169
    +170
    +171
    +172
    def check_navigation_panel_item_visibility(self, item_name: str) -> None:
         """Проверяет видимость элемента в панели навигации.
     
         Args:
    @@ -3243,16 +3376,16 @@ user_card: Карточка пользователя.

    Source code in pages\main_page.py -
    145
    -146
    -147
    -148
    -149
    -150
    -151
    +              
    151
     152
     153
    -154
    def check_navigation_panel_verticall_scrolling(self) -> bool:
    +154
    +155
    +156
    +157
    +158
    +159
    +160
    def check_navigation_panel_verticall_scrolling(self) -> bool:
         """Проверяет возможность вертикальной прокрутки панели.
     
         Returns:
    @@ -3284,10 +3417,10 @@ user_card: Карточка пользователя.

    Source code in pages\main_page.py -
    55
    -56
    +              
    56
     57
    -58
    def click_events_panel_expand_less_button(self) -> None:
    +58
    +59
    def click_events_panel_expand_less_button(self) -> None:
         """Выполняет нажатие кнопки галочка вверх."""
     
         self.event_panel.click_expand_less_button()
    @@ -3313,10 +3446,10 @@ user_card: Карточка пользователя.

    Source code in pages\main_page.py -
    60
    -61
    +              
    61
     62
    -63
    def click_events_panel_expand_more_button(self) -> None:
    +63
    +64
    def click_events_panel_expand_more_button(self) -> None:
         """Выполняет нажатие кнопки галочка вниз."""
     
         self.event_panel.click_expand_more_button()
    @@ -3329,6 +3462,35 @@ user_card: Карточка пользователя.

    +

    + click_events_panel_system_log_tab() + +

    + + +
    + +

    Выполняет нажатие tab-кнопки Системный журнал.

    + + +
    + Source code in pages\main_page.py +
    66
    +67
    +68
    +69
    def click_events_panel_system_log_tab(self) -> SystemLogEventsContainer:
    +    """Выполняет нажатие tab-кнопки Системный журнал."""
    +
    +    return self.event_panel.click_system_log_tab()
    +
    +
    +
    + +
    + +
    + +

    click_main_navigation_panel_item(item_name) @@ -3373,14 +3535,14 @@ user_card: Карточка пользователя.

    Source code in pages\main_page.py -
    37
    -38
    +              
    38
     39
     40
     41
     42
     43
    -44
    def click_main_navigation_panel_item(self, item_name: str) -> None:
    +44
    +45
    def click_main_navigation_panel_item(self, item_name: str) -> None:
         """Кликает по элементу основной панели навигации.
     
         Args:
    @@ -3398,7 +3560,7 @@ user_card: Карточка пользователя.

    - click_subpanel_item(item_name) + click_subpanel_item(item_name, parent=None)

    @@ -3410,21 +3572,21 @@ user_card: Карточка пользователя.

    Source code in pages\main_page.py -
    46
    -47
    +              
    47
     48
     49
     50
     51
     52
    -53
    def click_subpanel_item(self, item_name: str) -> None:
    +53
    +54
    def click_subpanel_item(self, item_name: str, parent=None) -> None:
         """Выполняет рекурсивный поиск по панели навигации заданного элемента и делает клик по нему."""
     
         active_item_locator = self.page.locator(NavigationPanelLocators.PANEL_MAIN).locator(NavigationPanelLocators.ACTIVE_CONTAINER)
         node_locator = active_item_locator.locator(NavigationPanelLocators.SUB_PANEL_MAIN).locator(NavigationPanelLocators.TREEVIEW).first
     
         # Рекурсивный поиск в дереве v-treeview заданного элемента и клик по нему
    -    self.navigation_panel.click_sub_item(node_locator, item_name)
    +    self.navigation_panel.click_sub_item(node_locator, item_name, parent)
     
    @@ -3447,10 +3609,10 @@ user_card: Карточка пользователя.

    Source code in pages\main_page.py -
    65
    -66
    -67
    -68
    def click_user_button(self) -> UserCard:
    +              
    71
    +72
    +73
    +74
    def click_user_button(self) -> UserCard:
         """Выполняет нажатие кнопки пользователя."""
     
         return self.event_panel.click_user_button()
    @@ -3476,10 +3638,10 @@ user_card: Карточка пользователя.

    Source code in pages\main_page.py -
    70
    -71
    -72
    -73
    def do_logout(self) -> None:
    +              
    76
    +77
    +78
    +79
    def do_logout(self) -> None:
         """Выполняет выход из системы."""
     
         self.event_panel.do_logout()
    @@ -3505,14 +3667,14 @@ user_card: Карточка пользователя.

    Source code in pages\main_page.py -
    75
    -76
    -77
    -78
    -79
    -80
    -81
    -82
    def expand_navigation_subpanel(self):
    +              
    81
    +82
    +83
    +84
    +85
    +86
    +87
    +88
    def expand_navigation_subpanel(self):
         """Выполняет полное открытие активной главной навигационной подпанели."""
     
         active_item_locator = self.page.locator(NavigationPanelLocators.PANEL_MAIN).locator(NavigationPanelLocators.ACTIVE_CONTAINER)
    @@ -3542,10 +3704,10 @@ user_card: Карточка пользователя.

    Source code in pages\main_page.py -
     97
    - 98
    - 99
    -100
    def get_event_counters_by_buttons(self) -> {}:
    +              
    103
    +104
    +105
    +106
    def get_event_counters_by_buttons(self) -> {}:
         """Возвращает набор значений кнопок счетчиков событий."""
     
         return self.event_panel.get_event_button_values()
    @@ -3571,18 +3733,18 @@ user_card: Карточка пользователя.

    Source code in pages\main_page.py -
    84
    -85
    -86
    -87
    -88
    -89
    -90
    -91
    -92
    -93
    -94
    -95
    def get_event_counters_by_tooltips(self) -> {}:
    +              
     90
    + 91
    + 92
    + 93
    + 94
    + 95
    + 96
    + 97
    + 98
    + 99
    +100
    +101
    def get_event_counters_by_tooltips(self) -> {}:
         """Возвращает набор текстов всплывающих подсказок кнопок счетчиков событий."""
     
         events = self.event_panel.get_event_tooltip_texts()
    @@ -3616,10 +3778,10 @@ user_card: Карточка пользователя.

    Source code in pages\main_page.py -
    102
    -103
    -104
    -105
    def get_events_panel_position(self) -> str:
    +              
    108
    +109
    +110
    +111
    def get_events_panel_position(self) -> str:
         """Возвращает текущее положение панели событий относительно страницы: "top", "center","bottom"."""
     
         return self.event_panel.get_panel_position()
    @@ -3645,10 +3807,10 @@ user_card: Карточка пользователя.

    Source code in pages\main_page.py -
    112
    -113
    -114
    -115
    def scroll_navigation_panel_down(self) -> None:
    +              
    118
    +119
    +120
    +121
    def scroll_navigation_panel_down(self) -> None:
         """Прокручивает панель навигации вниз."""
     
         self.navigation_panel.scroll_down(NavigationPanelLocators.PANEL_SCROLL_CONTAINER)
    @@ -3674,10 +3836,10 @@ user_card: Карточка пользователя.

    Source code in pages\main_page.py -
    107
    -108
    -109
    -110
    def scroll_navigation_panel_up(self) -> None:
    +              
    113
    +114
    +115
    +116
    def scroll_navigation_panel_up(self) -> None:
         """Прокручивает панель навигации вверх."""
     
         self.navigation_panel.scroll_up(NavigationPanelLocators.PANEL_SCROLL_CONTAINER)
    @@ -3703,14 +3865,14 @@ user_card: Карточка пользователя.

    Source code in pages\main_page.py -
    126
    -127
    -128
    -129
    -130
    -131
    -132
    -133
    def should_be_event_panel(self) -> None:
    +              
    132
    +133
    +134
    +135
    +136
    +137
    +138
    +139
    def should_be_event_panel(self) -> None:
         """Проверяет наличие элементов панели событий."""
     
         ## to-do: кнопки галочки???
    @@ -3740,13 +3902,13 @@ user_card: Карточка пользователя.

    Source code in pages\main_page.py -
    118
    -119
    -120
    -121
    -122
    -123
    -124
    def should_be_navigation_panel(self) -> None:
    +              
    124
    +125
    +126
    +127
    +128
    +129
    +130
    def should_be_navigation_panel(self) -> None:
         """Проверяет наличие панели навигации."""
     
         self.navigation_panel.check_visibility(
    diff --git a/site/pages/service_status_tab/index.html b/site/pages/service_status_tab/index.html
    index 13bcc7c..dbcd463 100644
    --- a/site/pages/service_status_tab/index.html
    +++ b/site/pages/service_status_tab/index.html
    @@ -751,6 +751,27 @@
       
       
       
    +    
  • + + + + + EventsContainerComponent + + + + +
  • + + + + + + + + + +
  • @@ -898,6 +919,27 @@ +
  • + + + + + SystemLogEventsContainer + + + + +
  • + + + + + + + + + +
  • @@ -1708,6 +1750,27 @@ + + + + + + +
  • + + + + + ZTPTemplatesTab + + + + +
  • + + + + @@ -1917,6 +1980,27 @@ +
  • + + + + + TestSystemLogEventsContainer + + + + +
  • + + + + + + + + + +
  • @@ -1974,6 +2058,27 @@ + + + + + + +
  • + + + + + TestZTPTemplatesTab + + + + +
  • + + + + @@ -2682,30 +2787,7 @@ 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
    class ServiceStatusTab(BasePage):
    +137
    class ServiceStatusTab(BasePage):
         """Класс для работы с вкладкой 'Статус обслуживания'.
     
         Предоставляет методы для взаимодействия с таблицей сервисов и проверки
    @@ -2733,13 +2815,7 @@
                 AssertionError: Если таблица пуста.
             """
     
    -        table_content = self.services_table.read(TableLocators.TABLE_WORK_AREA)
    -        rows_count = len(table_content)
    -
    -        if rows_count == 0:
    -            assert False, "The contents of the table are missing"
    -
    -        return rows_count - 1
    +        return self.services_table.get_rows_count(TableLocators.TABLE_WORK_AREA)
     
         def scroll_services_table_up(self) -> None:
             """Прокручивает таблицу сервисов вверх."""
    @@ -2756,9 +2832,6 @@
     
             Проверяет заголовки и наличие данных в таблице.
     
    -
    -
    -
             Raises:
                 AssertionError: Если таблица пуста или заголовки неверны.
             """
    @@ -2772,21 +2845,7 @@
                 'Image ТЭГ'
             ]
     
    -        table_content = self.services_table.read(TableLocators.TABLE_WORK_AREA)
    -
    -        if len(table_content) == 0:
    -            assert False, "The contents of the table are missing"
    -
    -        actual_headers = table_content[0]
    -
    -        self.check_equals(
    -            actual_headers,
    -            expected_headers,
    -            f"Expected table headers {expected_headers} are not equal {actual_headers}"
    -        )
    -
    -        if len(table_content) == 1:
    -            assert False, "Table body is missing"
    +        self.services_table.check_content(TableLocators.TABLE_WORK_AREA, expected_headers)
     
         def check_services_table_verticall_scrolling(self) -> bool:
             """Проверяет возможность вертикальной прокрутки таблицы.
    @@ -2942,7 +3001,13 @@
     
                 
    Source code in pages\service_status_tab.py -
    60
    +              
    54
    +55
    +56
    +57
    +58
    +59
    +60
     61
     62
     63
    @@ -2954,37 +3019,11 @@
     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
    def check_services_table_content(self) -> None:
    +72
    def check_services_table_content(self) -> None:
         """Проверяет содержимое таблицы сервисов.
     
         Проверяет заголовки и наличие данных в таблице.
     
    -
    -
    -
         Raises:
             AssertionError: Если таблица пуста или заголовки неверны.
         """
    @@ -2998,21 +3037,7 @@
             'Image ТЭГ'
         ]
     
    -    table_content = self.services_table.read(TableLocators.TABLE_WORK_AREA)
    -
    -    if len(table_content) == 0:
    -        assert False, "The contents of the table are missing"
    -
    -    actual_headers = table_content[0]
    -
    -    self.check_equals(
    -        actual_headers,
    -        expected_headers,
    -        f"Expected table headers {expected_headers} are not equal {actual_headers}"
    -    )
    -
    -    if len(table_content) == 1:
    -        assert False, "Table body is missing"
    +    self.services_table.check_content(TableLocators.TABLE_WORK_AREA, expected_headers)
     
    @@ -3058,14 +3083,14 @@
    Source code in pages\service_status_tab.py -
    108
    -109
    -110
    -111
    -112
    -113
    -114
    -115
    def check_services_table_first_row_visibility(self) -> None:
    +              
    85
    +86
    +87
    +88
    +89
    +90
    +91
    +92
    def check_services_table_first_row_visibility(self) -> None:
         """Проверяет видимость первой строки таблицы.
     
         Raises:
    @@ -3118,14 +3143,14 @@
     
                 
    Source code in pages\service_status_tab.py -
    117
    -118
    -119
    -120
    -121
    -122
    -123
    -124
    def check_services_table_last_row_visibility(self) -> None:
    +              
     94
    + 95
    + 96
    + 97
    + 98
    + 99
    +100
    +101
    def check_services_table_last_row_visibility(self) -> None:
         """Проверяет видимость последней строки таблицы.
     
         Raises:
    @@ -3209,20 +3234,20 @@
     
                 
    Source code in pages\service_status_tab.py -
    126
    -127
    -128
    -129
    -130
    -131
    -132
    -133
    -134
    -135
    -136
    -137
    -138
    -139
    def check_services_table_row_highlighting(self, row_index: int) -> None:
    +              
    103
    +104
    +105
    +106
    +107
    +108
    +109
    +110
    +111
    +112
    +113
    +114
    +115
    +116
    def check_services_table_row_highlighting(self, row_index: int) -> None:
         """Проверяет выделение указанной строки таблицы.
     
         Args:
    @@ -3281,16 +3306,16 @@
     
                 
    Source code in pages\service_status_tab.py -
     97
    - 98
    - 99
    -100
    -101
    -102
    -103
    -104
    -105
    -106
    def check_services_table_verticall_scrolling(self) -> bool:
    +              
    74
    +75
    +76
    +77
    +78
    +79
    +80
    +81
    +82
    +83
    def check_services_table_verticall_scrolling(self) -> bool:
         """Проверяет возможность вертикальной прокрутки таблицы.
     
         Returns:
    @@ -3378,13 +3403,7 @@
     39
     40
     41
    -42
    -43
    -44
    -45
    -46
    -47
    -48
    def get_rows_count(self) -> int:
    +42
    def get_rows_count(self) -> int:
         """Возвращает количество строк в таблице (без заголовка).
     
         Returns:
    @@ -3394,13 +3413,7 @@
             AssertionError: Если таблица пуста.
         """
     
    -    table_content = self.services_table.read(TableLocators.TABLE_WORK_AREA)
    -    rows_count = len(table_content)
    -
    -    if rows_count == 0:
    -        assert False, "The contents of the table are missing"
    -
    -    return rows_count - 1
    +    return self.services_table.get_rows_count(TableLocators.TABLE_WORK_AREA)
     
    @@ -3423,10 +3436,10 @@
    Source code in pages\service_status_tab.py -
    55
    -56
    -57
    -58
    def scroll_services_table_down(self) -> None:
    +              
    49
    +50
    +51
    +52
    def scroll_services_table_down(self) -> None:
         """Прокручивает таблицу сервисов вниз."""
     
         self.services_table.scroll_down(TableLocators.TABLE_SCROLL_CONTAINER)
    @@ -3452,10 +3465,10 @@
     
                 
    Source code in pages\service_status_tab.py -
    50
    -51
    -52
    -53
    def scroll_services_table_up(self) -> None:
    +              
    44
    +45
    +46
    +47
    def scroll_services_table_up(self) -> None:
         """Прокручивает таблицу сервисов вверх."""
     
         self.services_table.scroll_up(TableLocators.TABLE_SCROLL_CONTAINER)
    @@ -3504,17 +3517,17 @@
     
                 
    Source code in pages\service_status_tab.py -
    150
    -151
    -152
    -153
    -154
    -155
    -156
    -157
    -158
    -159
    -160
    def should_be_services_table(self) -> None:
    +              
    127
    +128
    +129
    +130
    +131
    +132
    +133
    +134
    +135
    +136
    +137
    def should_be_services_table(self) -> None:
         """Проверяет наличие таблицы сервисов.
     
         Raises:
    @@ -3570,14 +3583,14 @@
     
                 
    Source code in pages\service_status_tab.py -
    141
    -142
    -143
    -144
    -145
    -146
    -147
    -148
    def should_be_toolbar(self) -> None:
    +              
    118
    +119
    +120
    +121
    +122
    +123
    +124
    +125
    def should_be_toolbar(self) -> None:
         """Проверяет наличие тулбара на вкладке.
     
         Raises:
    diff --git a/site/pages/session_tab/index.html b/site/pages/session_tab/index.html
    index 15f236e..fa66cae 100644
    --- a/site/pages/session_tab/index.html
    +++ b/site/pages/session_tab/index.html
    @@ -751,6 +751,27 @@
       
       
       
    +    
  • + + + + + EventsContainerComponent + + + + +
  • + + + + + + + + + +
  • @@ -898,6 +919,27 @@ +
  • + + + + + SystemLogEventsContainer + + + + +
  • + + + + + + + + + +
  • @@ -1798,6 +1840,27 @@ + + + + + + +
  • + + + + + ZTPTemplatesTab + + + + +
  • + + + + @@ -2007,6 +2070,27 @@ +
  • + + + + + TestSystemLogEventsContainer + + + + +
  • + + + + + + + + + +
  • @@ -2064,6 +2148,27 @@ + + + + + + +
  • + + + + + TestZTPTemplatesTab + + + + +
  • + + + + @@ -3131,12 +3236,7 @@ 407 408 409 -410 -411 -412 -413 -414 -415
    class SessionsTab(BasePage):
    +410
    class SessionsTab(BasePage):
         """Класс для работы с вкладкой 'Сеанс'.
     
         Предоставляет методы для взаимодействия с таблицей сеансов и проверки
    @@ -3167,13 +3267,7 @@
                 AssertionError: Если таблица пуста.
             """
     
    -        table_content = self.sessions_table.read(TableLocators.TABLE_WORK_AREA)
    -        rows_count = len(table_content)
    -
    -        if rows_count == 0:
    -            assert False, "The contents of the table are missing"
    -
    -        return rows_count - 1
    +        return self.sessions_table.get_rows_count(TableLocators.TABLE_WORK_AREA)
     
         def get_delete_session_button_from_row(self, row_index: int) -> TooltipButton:
             """Возвращает кнопку удаления сеанса для указанной строки.
    @@ -3350,6 +3444,7 @@
                 'Адрес'
             ]
     
    +
             table_content = self.sessions_table.read(TableLocators.TABLE_WORK_AREA)
             len_table_content = len(table_content)
     
    @@ -3604,7 +3699,13 @@
     
                 
    Source code in pages\session_tab.py -
    165
    +              
    159
    +160
    +161
    +162
    +163
    +164
    +165
     166
     167
     168
    @@ -3645,13 +3746,7 @@
     203
     204
     205
    -206
    -207
    -208
    -209
    -210
    -211
    -212
    def check_delete_session_confirm_window(self):
    +206
    def check_delete_session_confirm_window(self):
         """ Проверяет контент и возможность горизонтального скроллинга окна подтверждения удаления сеанс. """
     
         # Поиск в таблице сеанс сроки для текущего пользователя
    @@ -3775,7 +3870,13 @@
     
                 
    Source code in pages\session_tab.py -
    214
    +              
    208
    +209
    +210
    +211
    +212
    +213
    +214
     215
     216
     217
    @@ -3809,12 +3910,7 @@
     245
     246
     247
    -248
    -249
    -250
    -251
    -252
    -253
    def check_sessions_table_content(self, verify: bool = False) -> None:
    +248
    def check_sessions_table_content(self, verify: bool = False) -> None:
         """Проверяет содержимое таблицы сеансов.
     
         Args:
    @@ -3832,6 +3928,7 @@
             'Адрес'
         ]
     
    +
         table_content = self.sessions_table.read(TableLocators.TABLE_WORK_AREA)
         len_table_content = len(table_content)
     
    @@ -3899,14 +3996,14 @@
     
                 
    Source code in pages\session_tab.py -
    266
    +              
    261
    +262
    +263
    +264
    +265
    +266
     267
    -268
    -269
    -270
    -271
    -272
    -273
    def check_sessions_table_first_row_visibility(self) -> None:
    +268
    def check_sessions_table_first_row_visibility(self) -> None:
         """Проверяет видимость первой строки таблицы.
     
         Raises:
    @@ -3959,14 +4056,14 @@
     
                 
    Source code in pages\session_tab.py -
    275
    +              
    270
    +271
    +272
    +273
    +274
    +275
     276
    -277
    -278
    -279
    -280
    -281
    -282
    def check_sessions_table_last_row_visibility(self) -> None:
    +277
    def check_sessions_table_last_row_visibility(self) -> None:
         """Проверяет видимость последней строки таблицы.
     
         Raises:
    @@ -4050,7 +4147,12 @@
     
                 
    Source code in pages\session_tab.py -
    284
    +              
    279
    +280
    +281
    +282
    +283
    +284
     285
     286
     287
    @@ -4058,12 +4160,7 @@
     289
     290
     291
    -292
    -293
    -294
    -295
    -296
    -297
    def check_sessions_table_row_highlighting(self, row_index: int) -> None:
    +292
    def check_sessions_table_row_highlighting(self, row_index: int) -> None:
         """Проверяет выделение указанной строки таблицы.
     
         Args:
    @@ -4122,16 +4219,16 @@
     
                 
    Source code in pages\session_tab.py -
    255
    +              
    250
    +251
    +252
    +253
    +254
    +255
     256
     257
     258
    -259
    -260
    -261
    -262
    -263
    -264
    def check_sessions_table_verticall_scrolling(self) -> bool:
    +259
    def check_sessions_table_verticall_scrolling(self) -> bool:
         """Проверяет возможность вертикальной прокрутки таблицы.
     
         Returns:
    @@ -4217,7 +4314,13 @@
     
                 
    Source code in pages\session_tab.py -
    129
    +              
    123
    +124
    +125
    +126
    +127
    +128
    +129
     130
     131
     132
    @@ -4233,13 +4336,7 @@
     142
     143
     144
    -145
    -146
    -147
    -148
    -149
    -150
    -151
    def delete_session_by_index(self, row_index: int) -> None:
    +145
    def delete_session_by_index(self, row_index: int) -> None:
         """Удаляет сеанс по индексу строки.
     
         Args:
    @@ -4338,20 +4435,20 @@
     
                 
    Source code in pages\session_tab.py -
    114
    +              
    108
    +109
    +110
    +111
    +112
    +113
    +114
     115
     116
     117
     118
     119
     120
    -121
    -122
    -123
    -124
    -125
    -126
    -127
    def delete_session_by_token(self, token: str) -> None:
    +121
    def delete_session_by_token(self, token: str) -> None:
         """Удаляет сеанс по токену.
     
         Args:
    @@ -4464,7 +4561,13 @@
     
                 
    Source code in pages\session_tab.py -
     91
    +              
     85
    + 86
    + 87
    + 88
    + 89
    + 90
    + 91
      92
      93
      94
    @@ -4479,13 +4582,7 @@
     103
     104
     105
    -106
    -107
    -108
    -109
    -110
    -111
    -112
    def find_session_in_table(self, token: str) -> int:
    +106
    def find_session_in_table(self, token: str) -> int:
         """Ищет сеанс пользователя в таблице по выданному ему токену.
     
         Args:
    @@ -4606,7 +4703,13 @@
     
                 
    Source code in pages\session_tab.py -
    57
    +              
    51
    +52
    +53
    +54
    +55
    +56
    +57
     58
     59
     60
    @@ -4620,13 +4723,7 @@
     68
     69
     70
    -71
    -72
    -73
    -74
    -75
    -76
    -77
    def get_delete_session_button_from_row(self, row_index: int) -> TooltipButton:
    +71
    def get_delete_session_button_from_row(self, row_index: int) -> TooltipButton:
         """Возвращает кнопку удаления сеанса для указанной строки.
     
         Args:
    @@ -4725,13 +4822,7 @@
     46
     47
     48
    -49
    -50
    -51
    -52
    -53
    -54
    -55
    def get_rows_count(self) -> int:
    +49
    def get_rows_count(self) -> int:
         """Возвращает количество строк в таблице (без заголовка).
     
         Returns:
    @@ -4741,13 +4832,7 @@
             AssertionError: Если таблица пуста.
         """
     
    -    table_content = self.sessions_table.read(TableLocators.TABLE_WORK_AREA)
    -    rows_count = len(table_content)
    -
    -    if rows_count == 0:
    -        assert False, "The contents of the table are missing"
    -
    -    return rows_count - 1
    +    return self.sessions_table.get_rows_count(TableLocators.TABLE_WORK_AREA)
     
    @@ -4795,17 +4880,17 @@
    Source code in pages\session_tab.py -
    79
    +              
    73
    +74
    +75
    +76
    +77
    +78
    +79
     80
     81
     82
    -83
    -84
    -85
    -86
    -87
    -88
    -89
    def get_session_token(self) -> str:
    +83
    def get_session_token(self) -> str:
         """Возвращает токен текущего пользователя.
     
         Args:
    @@ -4838,10 +4923,10 @@
     
                 
    Source code in pages\session_tab.py -
    159
    -160
    -161
    -162
    def scroll_sessions_table_down(self) -> None:
    +              
    153
    +154
    +155
    +156
    def scroll_sessions_table_down(self) -> None:
         """Прокручивает таблицу сеансов вниз."""
     
         self.sessions_table.scroll_down(TableLocators.TABLE_SCROLL_CONTAINER)
    @@ -4867,10 +4952,10 @@
     
                 
    Source code in pages\session_tab.py -
    154
    -155
    -156
    -157
    def scroll_sessions_table_up(self) -> None:
    +              
    148
    +149
    +150
    +151
    def scroll_sessions_table_up(self) -> None:
         """Прокручивает таблицу сеансов вверх."""
     
         self.sessions_table.scroll_up(TableLocators.TABLE_SCROLL_CONTAINER)
    @@ -4966,7 +5051,12 @@
     
                 
    Source code in pages\session_tab.py -
    320
    +              
    315
    +316
    +317
    +318
    +319
    +320
     321
     322
     323
    @@ -4986,12 +5076,7 @@
     337
     338
     339
    -340
    -341
    -342
    -343
    -344
    -345
    def should_be_delete_button_on_sessions_table_row(
    +340
    def should_be_delete_button_on_sessions_table_row(
         self,
         row_index: int,
         tooltip: str
    @@ -5093,18 +5178,18 @@
     
                 
    Source code in pages\session_tab.py -
    348
    +              
    343
    +344
    +345
    +346
    +347
    +348
     349
     350
     351
     352
     353
    -354
    -355
    -356
    -357
    -358
    -359
    def should_be_session_in_table(self, token: str) -> None:
    +354
    def should_be_session_in_table(self, token: str) -> None:
         """Проверяет наличие сеанса пользователя в таблице.
     
         Args:
    @@ -5161,17 +5246,17 @@
     
                 
    Source code in pages\session_tab.py -
    308
    +              
    303
    +304
    +305
    +306
    +307
    +308
     309
     310
     311
     312
    -313
    -314
    -315
    -316
    -317
    -318
    def should_be_sessions_table(self) -> None:
    +313
    def should_be_sessions_table(self) -> None:
         """Проверяет наличие таблицы сеансов.
     
         Raises:
    @@ -5227,14 +5312,14 @@
     
                 
    Source code in pages\session_tab.py -
    299
    +              
    294
    +295
    +296
    +297
    +298
    +299
     300
    -301
    -302
    -303
    -304
    -305
    -306
    def should_be_toolbar(self) -> None:
    +301
    def should_be_toolbar(self) -> None:
         """Проверяет наличие тулбара на вкладке.
     
         Raises:
    @@ -5318,18 +5403,18 @@
     
                 
    Source code in pages\session_tab.py -
    361
    +              
    356
    +357
    +358
    +359
    +360
    +361
     362
     363
     364
     365
     366
    -367
    -368
    -369
    -370
    -371
    -372
    def should_not_be_session_in_table(self, token: str) -> None:
    +367
    def should_not_be_session_in_table(self, token: str) -> None:
         """Проверяет отсутствие сеанса пользователя в таблице.
     
         Args:
    @@ -5417,7 +5502,12 @@
     
                 
    Source code in pages\session_tab.py -
    375
    +              
    370
    +371
    +372
    +373
    +374
    +375
     376
     377
     378
    @@ -5452,12 +5542,7 @@
     407
     408
     409
    -410
    -411
    -412
    -413
    -414
    -415
    def verify_sessions_table_content(self, sessions_table: list) -> None:
    +410
    def verify_sessions_table_content(self, sessions_table: list) -> None:
         """Сверяет данные таблицы с данными из БД.
     
         Args:
    diff --git a/site/pages/templates_tab/index.html b/site/pages/templates_tab/index.html
    index b42a635..f9ff5b1 100644
    --- a/site/pages/templates_tab/index.html
    +++ b/site/pages/templates_tab/index.html
    @@ -751,6 +751,27 @@
       
       
       
    +    
  • + + + + + EventsContainerComponent + + + + +
  • + + + + + + + + + +
  • @@ -898,6 +919,27 @@ +
  • + + + + + SystemLogEventsContainer + + + + +
  • + + + + + + + + + +
  • @@ -1662,15 +1704,6 @@ -
  • - -
  • - - - compare_modal_with_api_data - - -
  • @@ -1683,9 +1716,9 @@
  • - + - get_first_template_name + extract_specific_template @@ -1710,18 +1743,18 @@
  • - + - get_template_data_from_api + open_template_modal
  • - + - open_template_modal + save_template_data_to_file @@ -1806,15 +1839,6 @@ -
  • - -
  • - - - verify_modal_content_with_api - - -
  • @@ -1852,6 +1876,27 @@ + + + + + + +
  • + + + + + ZTPTemplatesTab + + + + +
  • + + + + @@ -2061,6 +2106,27 @@ +
  • + + + + + TestSystemLogEventsContainer + + + + +
  • + + + + + + + + + +
  • @@ -2118,6 +2184,27 @@ + + + + + + +
  • + + + + + TestZTPTemplatesTab + + + + +
  • + + + + @@ -2582,15 +2669,6 @@ - - -
  • - - - compare_modal_with_api_data - - -
  • @@ -2603,9 +2681,9 @@
  • - + - get_first_template_name + extract_specific_template @@ -2630,18 +2708,18 @@
  • - + - get_template_data_from_api + open_template_modal
  • - + - open_template_modal + save_template_data_to_file @@ -2726,15 +2804,6 @@ -
  • - -
  • - - - verify_modal_content_with_api - - -
  • @@ -2847,10 +2916,7 @@
    Source code in pages\templates_tab.py -
     21
    - 22
    - 23
    - 24
    +                
     24
      25
      26
      27
    @@ -3200,53 +3266,7 @@
     371
     372
     373
    -374
    -375
    -376
    -377
    -378
    -379
    -380
    -381
    -382
    -383
    -384
    -385
    -386
    -387
    -388
    -389
    -390
    -391
    -392
    -393
    -394
    -395
    -396
    -397
    -398
    -399
    -400
    -401
    -402
    -403
    -404
    -405
    -406
    -407
    -408
    -409
    -410
    -411
    -412
    -413
    -414
    -415
    -416
    -417
    -418
    -419
    -420
    class TemplatesTab(BasePage):
    +374
    class TemplatesTab(BasePage):
         """Класс для работы с вкладкой 'Шаблоны'.
     
         Предоставляет методы для взаимодействия с таблицей шаблонов и проверки
    @@ -3278,14 +3298,14 @@
     
             self.modal_windows[title] = ViewTemplateModalWindow(self.page, title)
     
    -    def get_modal_window(self, title: str):
    +    def get_modal_window(self, title: str) -> ViewTemplateModalWindow:
             """Возвращает модальное окно по заголовку.
     
             Args:
                 title: Заголовок окна.
     
             Returns:
    -            ModalWindowComponent: Экземпляр модального окна.
    +            ViewTemplateModalWindow: Экземпляр модального окна.
     
             Raises:
                 AssertionError: Если окно не найдено.
    @@ -3311,11 +3331,14 @@
                 assert False, f"Modal window with title '{title}' not found"
             self.modal_windows[title] = None
     
    -    def open_template_modal(self, row_index: int = 0) -> None:
    +    def open_template_modal(self, row_index: int = 0) -> str:
             """Открывает модальное окно шаблона по клику на строку таблицы.
     
             Args:
                 row_index: Индекс строки для клика (по умолчанию 0 - первая строка).
    +
    +        Returns:
    +            str: Имя шаблона.
             """
             row_locator = self.templates_table.get_row_locator(
                 TableLocators.TABLE_WORK_AREA,
    @@ -3325,7 +3348,8 @@
     
             # Получаем имя шаблона из выбранной строки
             table_content = self.templates_table.read(TableLocators.TABLE_WORK_AREA)
    -        template_name = table_content[row_index + 1][0]  # +1 потому что первая строка - заголовки
    +        # +1 потому что первая строка - заголовки
    +        template_name = table_content[row_index + 1][0]
     
             # Добавляем модальное окно в коллекцию после открытия
             self.add_modal_window(template_name)
    @@ -3353,36 +3377,7 @@
                 AssertionError: Если таблица пуста.
             """
     
    -        table_content = self.templates_table.read(TableLocators.TABLE_WORK_AREA)
    -        rows_count = len(table_content)
    -
    -        if rows_count == 0:
    -            assert False, "The contents of the table are missing"
    -
    -        return rows_count - 1
    -
    -    def get_first_template_name(self) -> str:
    -        """Получает имя шаблона из первой строки таблицы.
    -
    -        Returns:
    -            str: Имя шаблона из первого столбца первой строки.
    -
    -        Raises:
    -            AssertionError: Если таблица пуста или имя не найдено.
    -        """
    -        table_content = self.templates_table.read(TableLocators.TABLE_WORK_AREA)
    -
    -        if len(table_content) < 2:  # Заголовок + хотя бы одна строка
    -            assert False, "Table is empty or missing data rows"
    -
    -        # Первая строка с данными (индекс 1, так как индекс 0 - заголовки)
    -        first_row = table_content[1]
    -
    -        if len(first_row) == 0:
    -            assert False, "First row is empty"
    -
    -        template_name = first_row[0]  # Первый столбец - имя шаблона
    -        return template_name
    +        return self.templates_table.get_rows_count(TableLocators.TABLE_WORK_AREA)
     
         def scroll_templates_table_up(self) -> None:
             """Прокручивает таблицу шаблонов вверх."""
    @@ -3396,11 +3391,74 @@
     
         def scroll_modal_up(self) -> None:
             """Прокручивает содержимое модального окна вверх."""
    -        self.templates_table.scroll_up(ModalWindowLocators.MODAL_WINDOW_SCROLL_CONTAINER)
    +        self.templates_table.scroll_up(
    +            ModalWindowLocators.MODAL_WINDOW_SCROLL_CONTAINER
    +        )
     
         def scroll_modal_down(self) -> None:
             """Прокручивает содержимое модального окна вниз."""
    -        self.templates_table.scroll_down(ModalWindowLocators.MODAL_WINDOW_SCROLL_CONTAINER)
    +        self.templates_table.scroll_down(
    +            ModalWindowLocators.MODAL_WINDOW_SCROLL_CONTAINER
    +        )
    +
    +    def extract_specific_template(self, template_name: str, response_data: dict) -> dict:
    +        """Извлекает структуру конкретного шаблона по template_name из данных API.
    +
    +        Args:
    +            template_name: Имя шаблона для извлечения.
    +            response_data: Данные ответа от API.
    +
    +        Returns:
    +            dict: Структура конкретного шаблона.
    +
    +        Raises:
    +            AssertionError: Если шаблон с указанным именем не найден
    +                или структура ответа некорректна.
    +        """
    +        # Проверяем, что ответ является списком шаблонов
    +        assert isinstance(response_data, list), "API response is not a list of templates"
    +
    +        # Ищем шаблон с указанным именем
    +        for template in response_data:
    +            if template.get('id') == template_name:
    +                logger.info("Found template: %s", template_name)
    +                return template
    +
    +        # Если шаблон не найден
    +        available_templates = [t.get('id', 'Unknown') for t in response_data]
    +
    +        # Генерируем понятное сообщение об ошибке
    +        error_msg = (
    +            f"Template '{template_name}' not found. "
    +            f"Available templates: {available_templates}"
    +        )
    +        logger.error(error_msg)
    +        assert False, error_msg
    +
    +    def save_template_data_to_file(self, template_data: dict, filename: str = None) -> str:
    +        """Инструмент отладки. Сохраняет данные шаблона в JSON файл в текущей директории.
    +
    +        Args:
    +            template_data: Данные шаблона для сохранения.
    +            filename: Имя файла (если None, генерируется автоматически).
    +
    +        Returns:
    +            str: Путь к сохраненному файлу.
    +        """
    +        # Генерируем имя файла если не указано
    +        if filename is None:
    +            template_name = template_data.get('id', 'unknown_template')
    +            filename = f"{template_name}_data.json"
    +
    +        # Сохраняем файл в текущей директории
    +        file_path = Path(filename)
    +
    +        # Сохраняем данные в файл с форматированием
    +        with open(file_path, 'w', encoding='utf-8') as file:
    +            json.dump(template_data, file, ensure_ascii=False, indent=2)
    +
    +        logger.info("Template data saved to: %s", file_path)
    +        return str(file_path)
     
         def check_templates_modal_content(self, template_name: str) -> None:
             """Проверяет наличие и корректность элементов модального окна шаблона.
    @@ -3430,21 +3488,7 @@
                 'Производитель'
             ]
     
    -        table_content = self.templates_table.read(TableLocators.TABLE_WORK_AREA)
    -
    -        if len(table_content) == 0:
    -            assert False, "The contents of the table are missing"
    -
    -        actual_headers = table_content[0]
    -
    -        self.check_equals(
    -            actual_headers,
    -            expected_headers,
    -            f"Expected table headers {expected_headers} are not equal {actual_headers}"
    -        )
    -
    -        if len(table_content) == 1:
    -            assert False, "Table body is missing"
    +        self.templates_table.check_content(TableLocators.TABLE_WORK_AREA, expected_headers)
     
         def check_templates_table_verticall_scrolling(self) -> bool:
             """Проверяет возможность вертикальной прокрутки таблицы.
    @@ -3528,7 +3572,9 @@
             Raises:
                 AssertionError: Если модальное окно все еще видно.
             """
    -        is_visible = self.page.locator(ModalWindowLocators.MODAL_WINDOW).is_visible(timeout=1000)
    +        is_visible = self.page.locator(
    +            ModalWindowLocators.MODAL_WINDOW
    +        ).is_visible(timeout=1000)
             if is_visible:
                 assert False, "Modal window should not be visible"
     
    @@ -3542,110 +3588,35 @@
                 ModalWindowLocators.MODAL_WINDOW_SCROLL_CONTAINER
             )
     
    -    # Разрабатывается =========================================================
    -    def get_template_data_from_api(self, template_name: str) -> dict:
    -        """Получает JSON данные конкретного шаблона из API.
    -
    -        Args:
    -            template_name: Имя шаблона.
    -
    -        Returns:
    -            dict: JSON данные шаблона из API.
    -
    -        Raises:
    -            AssertionError: Если не удалось получить данные из API.
    -        """
    -
    -        # Отправляем запрос к API для получения данных конкретного шаблона
    -        response = self.send_get_api_request("e-cmdb/api/device/template")
    -        response_data = self.get_response_body(response)
    -        print(response_data)
    -
    -        if response.status_code != 200:
    -            assert False, f"API request failed with status {response.status_code}"
    -
    -        # Проверяем, что ответ содержит данные нужного шаблона
    -        if 'name' in response_data and response_data['name'] != template_name:
    -            assert False, f"API returned data for wrong template: expected '{template_name}', got '{response_data['name']}'"
    -
    -        return response_data
    -
    -    def verify_modal_content_with_api(self, template_name: str) -> None:
    -        """Проверяет соответствие данных модального окна данным из API.
    +    def verify_json_container_content(self, template_name: str, save_to_file: bool = False) -> None:
    +        """Проверяет соответствие данных контейнера данным из API.
     
             Args:
                 template_name: Имя шаблона для проверки.
    -
    -        Raises:
    -            AssertionError: Если данные не соответствуют API.
    +            save_to_file: Флаг для сохранения данных в файл.
             """
    -        # Получаем данные из модального окна
    -        modal_window = self.get_modal_window(template_name)
    -        modal_data = modal_window.get_modal_content_data()
    -
    -        # Получаем данные из API
    -        api_data = self.get_template_data_from_api(template_name)
    -
    -        # Сравниваем данные
    -        self.compare_modal_with_api_data(modal_data, api_data, template_name)
    -
    -
    -    def compare_modal_with_api_data(self, modal_data: dict, api_data: dict, template_name: str) -> None:
    -        """Сравнивает JSON конфигурационные данные модального окна с данными из API.
    -
    -        Args:
    -            modal_data: JSON данные из модального окна.
    -            api_data: JSON данные из API.
    -            template_name: Имя шаблона для сообщений об ошибках.
    -
    -        Raises:
    -            AssertionError: Если JSON конфигурационные данные не совпадают.
    -        """
    -        # Проверяем, что modal_data содержит данные
    -        if not modal_data:
    -            assert False, f"No modal data found for template '{template_name}'"
    -
    -        # Проверяем, что api_data содержит данные
    -        if not api_data:
    -            assert False, f"No API data found for template '{template_name}'"
    -
    -        # Получаем конфигурационные данные из обоих источников
    -        modal_config = modal_data.get('config', {})
    -        api_config = api_data.get('config', {})
    -
    -        # Проверяем, что оба источника содержат конфигурацию
    -        if not modal_config:
    -            assert False, f"No config data found in modal for template '{template_name}'"
    -
    -        if not api_config:
    -            assert False, f"No config data found in API for template '{template_name}'"
    -
    -        # Сравниваем JSON конфигурации
    -        self.check_equals(
    -            modal_config,
    -            api_config,
    -            f"JSON config data mismatch for template '{template_name}'"
    -        )
    -
    -    def verify_json_container_content(self) -> None:
    -        """Проверяет соответствие данных контейнера данным из API."""
     
             # Читаем данные из контейнера
             actual_data = self.json_container.read_data(JsonContainerLocators.CONTAINER)
    -        print(actual_data)
     
    -        """
    -        # send request to backend to get template info
    -        response = self.send_get_api_request("e-cmdb/api/device/template")
    -        response_body = self.get_response_body(response)
    +        # Отправляем запрос к backend для получения информации о шаблоне
    +        response = self.send_get_api_request("e-cmdb/api/device/template")
    +        response_body = self.get_response_body(response)
     
    -        # compare actual and response from cmdb
    -        self.json_container.check_json_equals(
    -            actual_data,
    -            response_body,
    -            "Expected json content is not equal actual:"
    -        )
    -        """
    +        # Извлекаем конкретный шаблон по имени из ответа API
    +        template_data = self.extract_specific_template(template_name, response_body)
    +
    +        # Сохраняем данные в файл если требуется
    +        if save_to_file:
    +            file_path = self.save_template_data_to_file(template_data)
    +            logger.info("Template data saved to: %s", file_path)
    +
    +        # Сравниваем actual_data с данными конкретного шаблона
    +        self.json_container.check_json_equals(
    +            actual_data,
    +            template_data,
    +            "Expected json content is not equal actual:"
    +        )
     
    @@ -3677,10 +3648,7 @@
    Source code in pages\templates_tab.py -
    31
    -32
    -33
    -34
    +              
    34
     35
     36
     37
    @@ -3688,7 +3656,10 @@
     39
     40
     41
    -42
    def __init__(self, page: Page) -> None:
    +42
    +43
    +44
    +45
    def __init__(self, page: Page) -> None:
         """Инициализирует компоненты вкладки 'Шаблоны'."""
     
         super().__init__(page)
    @@ -3753,14 +3724,14 @@
     
                 
    Source code in pages\templates_tab.py -
    44
    -45
    -46
    -47
    +              
    47
     48
     49
     50
    -51
    def add_modal_window(self, title: str) -> None:
    +51
    +52
    +53
    +54
    def add_modal_window(self, title: str) -> None:
         """Добавляет модальное окно в коллекцию.
     
         Args:
    @@ -3813,15 +3784,15 @@
     
                 
    Source code in pages\templates_tab.py -
    307
    -308
    -309
    -310
    -311
    -312
    -313
    -314
    -315
    def check_modal_vertical_scrolling(self) -> bool:
    +              
    336
    +337
    +338
    +339
    +340
    +341
    +342
    +343
    +344
    def check_modal_vertical_scrolling(self) -> bool:
         """Проверяет возможность вертикального скроллинга в модальном окне.
     
         Returns:
    @@ -3906,17 +3877,17 @@
     
                 
    Source code in pages\templates_tab.py -
    177
    -178
    -179
    -180
    -181
    -182
    -183
    -184
    -185
    -186
    -187
    def check_templates_modal_content(self, template_name: str) -> None:
    +              
    218
    +219
    +220
    +221
    +222
    +223
    +224
    +225
    +226
    +227
    +228
    def check_templates_modal_content(self, template_name: str) -> None:
         """Проверяет наличие и корректность элементов модального окна шаблона.
     
         Args:
    @@ -3973,37 +3944,23 @@
     
                 
    Source code in pages\templates_tab.py -
    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
    def check_templates_table_content(self) -> None:
    +              
    230
    +231
    +232
    +233
    +234
    +235
    +236
    +237
    +238
    +239
    +240
    +241
    +242
    +243
    +244
    +245
    +246
    def check_templates_table_content(self) -> None:
         """Проверяет содержимое таблицы шаблонов.
     
         Проверяет заголовки и наличие данных в таблице.
    @@ -4019,21 +3976,7 @@
             'Производитель'
         ]
     
    -    table_content = self.templates_table.read(TableLocators.TABLE_WORK_AREA)
    -
    -    if len(table_content) == 0:
    -        assert False, "The contents of the table are missing"
    -
    -    actual_headers = table_content[0]
    -
    -    self.check_equals(
    -        actual_headers,
    -        expected_headers,
    -        f"Expected table headers {expected_headers} are not equal {actual_headers}"
    -    )
    -
    -    if len(table_content) == 1:
    -        assert False, "Table body is missing"
    +    self.templates_table.check_content(TableLocators.TABLE_WORK_AREA, expected_headers)
     
    @@ -4079,14 +4022,14 @@
    Source code in pages\templates_tab.py -
    232
    -233
    -234
    -235
    -236
    -237
    -238
    -239
    def check_templates_table_first_row_visibility(self) -> None:
    +              
    259
    +260
    +261
    +262
    +263
    +264
    +265
    +266
    def check_templates_table_first_row_visibility(self) -> None:
         """Проверяет видимость первой строки таблицы.
     
         Raises:
    @@ -4139,14 +4082,14 @@
     
                 
    Source code in pages\templates_tab.py -
    241
    -242
    -243
    -244
    -245
    -246
    -247
    -248
    def check_templates_table_last_row_visibility(self) -> None:
    +              
    268
    +269
    +270
    +271
    +272
    +273
    +274
    +275
    def check_templates_table_last_row_visibility(self) -> None:
         """Проверяет видимость последней строки таблицы.
     
         Raises:
    @@ -4230,20 +4173,20 @@
     
                 
    Source code in pages\templates_tab.py -
    250
    -251
    -252
    -253
    -254
    -255
    -256
    -257
    -258
    -259
    -260
    -261
    -262
    -263
    def check_templates_table_row_highlighting(self, row_index: int) -> None:
    +              
    277
    +278
    +279
    +280
    +281
    +282
    +283
    +284
    +285
    +286
    +287
    +288
    +289
    +290
    def check_templates_table_row_highlighting(self, row_index: int) -> None:
         """Проверяет выделение указанной строки таблицы.
     
         Args:
    @@ -4302,16 +4245,16 @@
     
                 
    Source code in pages\templates_tab.py -
    221
    -222
    -223
    -224
    -225
    -226
    -227
    -228
    -229
    -230
    def check_templates_table_verticall_scrolling(self) -> bool:
    +              
    248
    +249
    +250
    +251
    +252
    +253
    +254
    +255
    +256
    +257
    def check_templates_table_verticall_scrolling(self) -> bool:
         """Проверяет возможность вертикальной прокрутки таблицы.
     
         Returns:
    @@ -4374,16 +4317,16 @@
     
                 
    Source code in pages\templates_tab.py -
    107
    -108
    -109
    -110
    -111
    -112
    -113
    -114
    +              
    114
     115
    -116
    def close_modal_window_by_toolbar_button(self, title: str) -> None:
    +116
    +117
    +118
    +119
    +120
    +121
    +122
    +123
    def close_modal_window_by_toolbar_button(self, title: str) -> None:
         """Закрывает модальное окно через кнопку в тулбаре.
     
         Args:
    @@ -4402,185 +4345,6 @@
     
    -

    - compare_modal_with_api_data(modal_data, api_data, template_name) - -

    - - -
    - -

    Сравнивает JSON конфигурационные данные модального окна с данными из API.

    - - -

    Parameters:

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameTypeDescriptionDefault
    - modal_data - - dict - -
    -

    JSON данные из модального окна.

    -
    -
    - required -
    - api_data - - dict - -
    -

    JSON данные из API.

    -
    -
    - required -
    - template_name - - str - -
    -

    Имя шаблона для сообщений об ошибках.

    -
    -
    - required -
    - - -

    Raises:

    - - - - - - - - - - - - - -
    TypeDescription
    - AssertionError - -
    -

    Если JSON конфигурационные данные не совпадают.

    -
    -
    - - -
    - Source code in pages\templates_tab.py -
    365
    -366
    -367
    -368
    -369
    -370
    -371
    -372
    -373
    -374
    -375
    -376
    -377
    -378
    -379
    -380
    -381
    -382
    -383
    -384
    -385
    -386
    -387
    -388
    -389
    -390
    -391
    -392
    -393
    -394
    -395
    -396
    -397
    -398
    -399
    -400
    def compare_modal_with_api_data(self, modal_data: dict, api_data: dict, template_name: str) -> None:
    -    """Сравнивает JSON конфигурационные данные модального окна с данными из API.
    -
    -    Args:
    -        modal_data: JSON данные из модального окна.
    -        api_data: JSON данные из API.
    -        template_name: Имя шаблона для сообщений об ошибках.
    -
    -    Raises:
    -        AssertionError: Если JSON конфигурационные данные не совпадают.
    -    """
    -    # Проверяем, что modal_data содержит данные
    -    if not modal_data:
    -        assert False, f"No modal data found for template '{template_name}'"
    -
    -    # Проверяем, что api_data содержит данные
    -    if not api_data:
    -        assert False, f"No API data found for template '{template_name}'"
    -
    -    # Получаем конфигурационные данные из обоих источников
    -    modal_config = modal_data.get('config', {})
    -    api_config = api_data.get('config', {})
    -
    -    # Проверяем, что оба источника содержат конфигурацию
    -    if not modal_config:
    -        assert False, f"No config data found in modal for template '{template_name}'"
    -
    -    if not api_config:
    -        assert False, f"No config data found in API for template '{template_name}'"
    -
    -    # Сравниваем JSON конфигурации
    -    self.check_equals(
    -        modal_config,
    -        api_config,
    -        f"JSON config data mismatch for template '{template_name}'"
    -    )
    -
    -
    -
    - -
    - -
    - -

    delete_modal_window(title) @@ -4648,10 +4412,7 @@
    Source code in pages\templates_tab.py -
    72
    -73
    -74
    -75
    +              
    - @@ -4731,7 +4542,8 @@ @@ -4741,49 +4553,71 @@
    Source code in pages\templates_tab.py -
    75
     76
     77
     78
    @@ -4660,7 +4421,10 @@
     81
     82
     83
    -84
    def delete_modal_window(self, title: str) -> None:
    +84
    +85
    +86
    +87
    def delete_modal_window(self, title: str) -> None:
         """Удаляет модальное окно из коллекции.
     
         Args:
    @@ -4682,15 +4446,62 @@
     
    -

    - get_first_template_name() +

    + extract_specific_template(template_name, response_data)

    -

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

    +

    Извлекает структуру конкретного шаблона по template_name из данных API.

    + + +

    Parameters:

    + + + + + + + + + + + + + + + + + + + + + + + +
    NameTypeDescriptionDefault
    + template_name + + str + +
    +

    Имя шаблона для извлечения.

    +
    +
    + required +
    + response_data + + dict + +
    +

    Данные ответа от API.

    +
    +
    + required +

    Returns:

    @@ -4703,12 +4514,12 @@
    str - str +dict + dict
    -

    Имя шаблона из первого столбца первой строки.

    +

    Структура конкретного шаблона.

    -

    Если таблица пуста или имя не найдено.

    +

    Если шаблон с указанным именем не найден +или структура ответа некорректна.

    -
    136
    -137
    -138
    -139
    -140
    -141
    -142
    -143
    -144
    -145
    -146
    -147
    -148
    -149
    -150
    -151
    -152
    -153
    -154
    -155
    -156
    -157
    def get_first_template_name(self) -> str:
    -    """Получает имя шаблона из первой строки таблицы.
    +              
    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
    def extract_specific_template(self, template_name: str, response_data: dict) -> dict:
    +    """Извлекает структуру конкретного шаблона по template_name из данных API.
    +
    +    Args:
    +        template_name: Имя шаблона для извлечения.
    +        response_data: Данные ответа от API.
     
         Returns:
    -        str: Имя шаблона из первого столбца первой строки.
    +        dict: Структура конкретного шаблона.
     
         Raises:
    -        AssertionError: Если таблица пуста или имя не найдено.
    +        AssertionError: Если шаблон с указанным именем не найден
    +            или структура ответа некорректна.
         """
    -    table_content = self.templates_table.read(TableLocators.TABLE_WORK_AREA)
    +    # Проверяем, что ответ является списком шаблонов
    +    assert isinstance(response_data, list), "API response is not a list of templates"
     
    -    if len(table_content) < 2:  # Заголовок + хотя бы одна строка
    -        assert False, "Table is empty or missing data rows"
    +    # Ищем шаблон с указанным именем
    +    for template in response_data:
    +        if template.get('id') == template_name:
    +            logger.info("Found template: %s", template_name)
    +            return template
     
    -    # Первая строка с данными (индекс 1, так как индекс 0 - заголовки)
    -    first_row = table_content[1]
    +    # Если шаблон не найден
    +    available_templates = [t.get('id', 'Unknown') for t in response_data]
     
    -    if len(first_row) == 0:
    -        assert False, "First row is empty"
    -
    -    template_name = first_row[0]  # Первый столбец - имя шаблона
    -    return template_name
    +    # Генерируем понятное сообщение об ошибке
    +    error_msg = (
    +        f"Template '{template_name}' not found. "
    +        f"Available templates: {available_templates}"
    +    )
    +    logger.error(error_msg)
    +    assert False, error_msg
     
    @@ -4845,7 +4679,8 @@
    ModalWindowComponent +ViewTemplateModalWindow + ViewTemplateModalWindow
    @@ -4882,10 +4717,7 @@
    Source code in pages\templates_tab.py -
    53
    -54
    -55
    -56
    +              
    56
     57
     58
     59
    @@ -4899,14 +4731,17 @@
     67
     68
     69
    -70
    def get_modal_window(self, title: str):
    +70
    +71
    +72
    +73
    def get_modal_window(self, title: str) -> ViewTemplateModalWindow:
         """Возвращает модальное окно по заголовку.
     
         Args:
             title: Заголовок окна.
     
         Returns:
    -        ModalWindowComponent: Экземпляр модального окна.
    +        ViewTemplateModalWindow: Экземпляр модального окна.
     
         Raises:
             AssertionError: Если окно не найдено.
    @@ -4985,14 +4820,7 @@
     
                 
    Source code in pages\templates_tab.py -
    118
    -119
    -120
    -121
    -122
    -123
    -124
    -125
    +              
    125
     126
     127
     128
    @@ -5001,7 +4829,8 @@
     131
     132
     133
    -134
    def get_rows_count(self) -> int:
    +134
    +135
    def get_rows_count(self) -> int:
         """Возвращает количество строк в таблице (без заголовка).
     
         Returns:
    @@ -5011,163 +4840,7 @@
             AssertionError: Если таблица пуста.
         """
     
    -    table_content = self.templates_table.read(TableLocators.TABLE_WORK_AREA)
    -    rows_count = len(table_content)
    -
    -    if rows_count == 0:
    -        assert False, "The contents of the table are missing"
    -
    -    return rows_count - 1
    -
    - -
    - - - -
    - - -

    - get_template_data_from_api(template_name) - -

    - - -
    - -

    Получает JSON данные конкретного шаблона из API.

    - - -

    Parameters:

    - - - - - - - - - - - - - - - - - -
    NameTypeDescriptionDefault
    - template_name - - str - -
    -

    Имя шаблона.

    -
    -
    - required -
    - - -

    Returns:

    - - - - - - - - - - - - - -
    Name TypeDescription
    dict - dict - -
    -

    JSON данные шаблона из API.

    -
    -
    - - -

    Raises:

    - - - - - - - - - - - - - -
    TypeDescription
    - AssertionError - -
    -

    Если не удалось получить данные из API.

    -
    -
    - - -
    - Source code in pages\templates_tab.py -
    318
    -319
    -320
    -321
    -322
    -323
    -324
    -325
    -326
    -327
    -328
    -329
    -330
    -331
    -332
    -333
    -334
    -335
    -336
    -337
    -338
    -339
    -340
    -341
    -342
    -343
    def get_template_data_from_api(self, template_name: str) -> dict:
    -    """Получает JSON данные конкретного шаблона из API.
    -
    -    Args:
    -        template_name: Имя шаблона.
    -
    -    Returns:
    -        dict: JSON данные шаблона из API.
    -
    -    Raises:
    -        AssertionError: Если не удалось получить данные из API.
    -    """
    -
    -    # Отправляем запрос к API для получения данных конкретного шаблона
    -    response = self.send_get_api_request("e-cmdb/api/device/template")
    -    response_data = self.get_response_body(response)
    -    print(response_data)
    -
    -    if response.status_code != 200:
    -        assert False, f"API request failed with status {response.status_code}"
    -
    -    # Проверяем, что ответ содержит данные нужного шаблона
    -    if 'name' in response_data and response_data['name'] != template_name:
    -        assert False, f"API returned data for wrong template: expected '{template_name}', got '{response_data['name']}'"
    -
    -    return response_data
    +    return self.templates_table.get_rows_count(TableLocators.TABLE_WORK_AREA)
     
    @@ -5219,12 +4892,32 @@
    +

    Returns:

    + + + + + + + + + + + + + +
    Name TypeDescription
    str + str + +
    +

    Имя шаблона.

    +
    +
    + +
    Source code in pages\templates_tab.py -
     86
    - 87
    - 88
    - 89
    +              
     89
      90
      91
      92
    @@ -5240,11 +4933,21 @@
     102
     103
     104
    -105
    def open_template_modal(self, row_index: int = 0) -> None:
    +105
    +106
    +107
    +108
    +109
    +110
    +111
    +112
    def open_template_modal(self, row_index: int = 0) -> str:
         """Открывает модальное окно шаблона по клику на строку таблицы.
     
         Args:
             row_index: Индекс строки для клика (по умолчанию 0 - первая строка).
    +
    +    Returns:
    +        str: Имя шаблона.
         """
         row_locator = self.templates_table.get_row_locator(
             TableLocators.TABLE_WORK_AREA,
    @@ -5254,7 +4957,8 @@
     
         # Получаем имя шаблона из выбранной строки
         table_content = self.templates_table.read(TableLocators.TABLE_WORK_AREA)
    -    template_name = table_content[row_index + 1][0]  # +1 потому что первая строка - заголовки
    +    # +1 потому что первая строка - заголовки
    +    template_name = table_content[row_index + 1][0]
     
         # Добавляем модальное окно в коллекцию после открытия
         self.add_modal_window(template_name)
    @@ -5269,6 +4973,145 @@
     
    +

    + save_template_data_to_file(template_data, filename=None) + +

    + + +
    + +

    Инструмент отладки. Сохраняет данные шаблона в JSON файл в текущей директории.

    + + +

    Parameters:

    + + + + + + + + + + + + + + + + + + + + + + + +
    NameTypeDescriptionDefault
    + template_data + + dict + +
    +

    Данные шаблона для сохранения.

    +
    +
    + required +
    + filename + + str + +
    +

    Имя файла (если None, генерируется автоматически).

    +
    +
    + None +
    + + +

    Returns:

    + + + + + + + + + + + + + +
    Name TypeDescription
    str + str + +
    +

    Путь к сохраненному файлу.

    +
    +
    + + +
    + Source code in pages\templates_tab.py +
    193
    +194
    +195
    +196
    +197
    +198
    +199
    +200
    +201
    +202
    +203
    +204
    +205
    +206
    +207
    +208
    +209
    +210
    +211
    +212
    +213
    +214
    +215
    +216
    def save_template_data_to_file(self, template_data: dict, filename: str = None) -> str:
    +    """Инструмент отладки. Сохраняет данные шаблона в JSON файл в текущей директории.
    +
    +    Args:
    +        template_data: Данные шаблона для сохранения.
    +        filename: Имя файла (если None, генерируется автоматически).
    +
    +    Returns:
    +        str: Путь к сохраненному файлу.
    +    """
    +    # Генерируем имя файла если не указано
    +    if filename is None:
    +        template_name = template_data.get('id', 'unknown_template')
    +        filename = f"{template_name}_data.json"
    +
    +    # Сохраняем файл в текущей директории
    +    file_path = Path(filename)
    +
    +    # Сохраняем данные в файл с форматированием
    +    with open(file_path, 'w', encoding='utf-8') as file:
    +        json.dump(template_data, file, ensure_ascii=False, indent=2)
    +
    +    logger.info("Template data saved to: %s", file_path)
    +    return str(file_path)
    +
    +
    +
    + +
    + +
    + +

    scroll_modal_down() @@ -5282,11 +5125,15 @@
    Source code in pages\templates_tab.py -
    173
    -174
    -175
    def scroll_modal_down(self) -> None:
    +              
    153
    +154
    +155
    +156
    +157
    def scroll_modal_down(self) -> None:
         """Прокручивает содержимое модального окна вниз."""
    -    self.templates_table.scroll_down(ModalWindowLocators.MODAL_WINDOW_SCROLL_CONTAINER)
    +    self.templates_table.scroll_down(
    +        ModalWindowLocators.MODAL_WINDOW_SCROLL_CONTAINER
    +    )
     
    @@ -5309,11 +5156,15 @@
    Source code in pages\templates_tab.py -
    169
    -170
    -171
    def scroll_modal_up(self) -> None:
    +              
    147
    +148
    +149
    +150
    +151
    def scroll_modal_up(self) -> None:
         """Прокручивает содержимое модального окна вверх."""
    -    self.templates_table.scroll_up(ModalWindowLocators.MODAL_WINDOW_SCROLL_CONTAINER)
    +    self.templates_table.scroll_up(
    +        ModalWindowLocators.MODAL_WINDOW_SCROLL_CONTAINER
    +    )
     
    @@ -5336,10 +5187,10 @@
    Source code in pages\templates_tab.py -
    164
    -165
    -166
    -167
    def scroll_templates_table_down(self) -> None:
    +              
    142
    +143
    +144
    +145
    def scroll_templates_table_down(self) -> None:
         """Прокручивает таблицу шаблонов вниз."""
     
         self.templates_table.scroll_down(TableLocators.TABLE_SCROLL_CONTAINER)
    @@ -5365,10 +5216,10 @@
     
                 
    Source code in pages\templates_tab.py -
    159
    -160
    -161
    -162
    def scroll_templates_table_up(self) -> None:
    +              
    137
    +138
    +139
    +140
    def scroll_templates_table_up(self) -> None:
         """Прокручивает таблицу шаблонов вверх."""
     
         self.templates_table.scroll_up(TableLocators.TABLE_SCROLL_CONTAINER)
    @@ -5417,16 +5268,16 @@
     
                 
    Source code in pages\templates_tab.py -
    286
    -287
    -288
    -289
    -290
    -291
    -292
    -293
    -294
    -295
    def should_be_modal_window(self) -> None:
    +              
    313
    +314
    +315
    +316
    +317
    +318
    +319
    +320
    +321
    +322
    def should_be_modal_window(self) -> None:
         """Проверяет наличие модального окна.
     
         Raises:
    @@ -5481,17 +5332,17 @@
     
                 
    Source code in pages\templates_tab.py -
    274
    -275
    -276
    -277
    -278
    -279
    -280
    -281
    -282
    -283
    -284
    def should_be_templates_table(self) -> None:
    +              
    301
    +302
    +303
    +304
    +305
    +306
    +307
    +308
    +309
    +310
    +311
    def should_be_templates_table(self) -> None:
         """Проверяет наличие таблицы шаблонов.
     
         Raises:
    @@ -5547,14 +5398,14 @@
     
                 
    Source code in pages\templates_tab.py -
    265
    -266
    -267
    -268
    -269
    -270
    -271
    -272
    def should_be_toolbar(self) -> None:
    +              
    292
    +293
    +294
    +295
    +296
    +297
    +298
    +299
    def should_be_toolbar(self) -> None:
         """Проверяет наличие тулбара на вкладке.
     
         Raises:
    @@ -5607,21 +5458,25 @@
     
                 
    Source code in pages\templates_tab.py -
    297
    -298
    -299
    -300
    -301
    -302
    -303
    -304
    -305
    def should_not_be_modal_window(self) -> None:
    +              
    324
    +325
    +326
    +327
    +328
    +329
    +330
    +331
    +332
    +333
    +334
    def should_not_be_modal_window(self) -> None:
         """Проверяет, что модальное окно отсутствует.
     
         Raises:
             AssertionError: Если модальное окно все еще видно.
         """
    -    is_visible = self.page.locator(ModalWindowLocators.MODAL_WINDOW).is_visible(timeout=1000)
    +    is_visible = self.page.locator(
    +        ModalWindowLocators.MODAL_WINDOW
    +    ).is_visible(timeout=1000)
         if is_visible:
             assert False, "Modal window should not be visible"
     
    @@ -5634,7 +5489,7 @@

    - verify_json_container_content() + verify_json_container_content(template_name, save_to_file=False)

    @@ -5644,65 +5499,6 @@

    Проверяет соответствие данных контейнера данным из API.

    -
    - Source code in pages\templates_tab.py -
    402
    -403
    -404
    -405
    -406
    -407
    -408
    -409
    -410
    -411
    -412
    -413
    -414
    -415
    -416
    -417
    -418
    -419
    -420
    def verify_json_container_content(self) -> None:
    -    """Проверяет соответствие данных контейнера данным из API."""
    -
    -    # Читаем данные из контейнера
    -    actual_data = self.json_container.read_data(JsonContainerLocators.CONTAINER)
    -    print(actual_data)
    -
    -    """
    -    # send request to backend to get template info
    -    response = self.send_get_api_request("e-cmdb/api/device/template")
    -    response_body = self.get_response_body(response)
    -
    -    # compare actual and response from cmdb
    -    self.json_container.check_json_equals(
    -        actual_data,
    -        response_body,
    -        "Expected json content is not equal actual:"
    -    )
    -    """
    -
    -
    -
    - - - -
    - - -

    - verify_modal_content_with_api(template_name) - -

    - - -
    - -

    Проверяет соответствие данных модального окна данным из API.

    - -

    Parameters:

    @@ -5730,28 +5526,21 @@ required - -
    - - -

    Raises:

    - - - - - - - - + +
    TypeDescription
    - AssertionError + save_to_file + + bool
    -

    Если данные не соответствуют API.

    +

    Флаг для сохранения данных в файл.

    + False +
    @@ -5759,8 +5548,7 @@
    Source code in pages\templates_tab.py -
    345
    -346
    +              
    346
     347
     348
     349
    @@ -5776,24 +5564,47 @@
     359
     360
     361
    -362
    def verify_modal_content_with_api(self, template_name: str) -> None:
    -    """Проверяет соответствие данных модального окна данным из API.
    +362
    +363
    +364
    +365
    +366
    +367
    +368
    +369
    +370
    +371
    +372
    +373
    +374
    def verify_json_container_content(self, template_name: str, save_to_file: bool = False) -> None:
    +    """Проверяет соответствие данных контейнера данным из API.
     
         Args:
             template_name: Имя шаблона для проверки.
    -
    -    Raises:
    -        AssertionError: Если данные не соответствуют API.
    +        save_to_file: Флаг для сохранения данных в файл.
         """
    -    # Получаем данные из модального окна
    -    modal_window = self.get_modal_window(template_name)
    -    modal_data = modal_window.get_modal_content_data()
     
    -    # Получаем данные из API
    -    api_data = self.get_template_data_from_api(template_name)
    +    # Читаем данные из контейнера
    +    actual_data = self.json_container.read_data(JsonContainerLocators.CONTAINER)
     
    -    # Сравниваем данные
    -    self.compare_modal_with_api_data(modal_data, api_data, template_name)
    +    # Отправляем запрос к backend для получения информации о шаблоне
    +    response = self.send_get_api_request("e-cmdb/api/device/template")
    +    response_body = self.get_response_body(response)
    +
    +    # Извлекаем конкретный шаблон по имени из ответа API
    +    template_data = self.extract_specific_template(template_name, response_body)
    +
    +    # Сохраняем данные в файл если требуется
    +    if save_to_file:
    +        file_path = self.save_template_data_to_file(template_data)
    +        logger.info("Template data saved to: %s", file_path)
    +
    +    # Сравниваем actual_data с данными конкретного шаблона
    +    self.json_container.check_json_equals(
    +        actual_data,
    +        template_data,
    +        "Expected json content is not equal actual:"
    +    )
     
    diff --git a/site/pages/users_tab/index.html b/site/pages/users_tab/index.html index 59560b1..e70878f 100644 --- a/site/pages/users_tab/index.html +++ b/site/pages/users_tab/index.html @@ -12,7 +12,7 @@ - + @@ -751,6 +751,27 @@ +
  • + + + + + EventsContainerComponent + + + + +
  • + + + + + + + + + +
  • @@ -898,6 +919,27 @@ +
  • + + + + + SystemLogEventsContainer + + + + +
  • + + + + + + + + + +
  • @@ -1897,6 +1939,27 @@ + + + + + + +
  • + + + + + ZTPTemplatesTab + + + + +
  • + + + + @@ -2106,6 +2169,27 @@ +
  • + + + + + TestSystemLogEventsContainer + + + + +
  • + + + + + + + + + +
  • @@ -2163,6 +2247,27 @@ + + + + + + +
  • + + + + + TestZTPTemplatesTab + + + + +
  • + + + + diff --git a/site/pages/ztp_templates_tab/index.html b/site/pages/ztp_templates_tab/index.html new file mode 100644 index 0000000..eb19f3f --- /dev/null +++ b/site/pages/ztp_templates_tab/index.html @@ -0,0 +1,5199 @@ + + + + + + + + + + + + + + + + + + + + + + + ZTPTemplatesTab - Документация тестов eNODE-Мониторинг + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + +
    + + +
    + +
    + + + + + + +
    +
    + + + +
    +
    +
    + + + + + +
    +
    +
    + + + + + + + +
    +
    + + + + +

    ZTPTemplatesTab

    + + +
    + + + + +
    + +

    Модуль вкладки 'Шаблоны' в модуле Zero Touch Provisioning.

    +

    Содержит класс ZTPTemplatesTab для работы с таблицей шаблонов. +Позволяет проверять состояние и взаимодействовать с элементами вкладки.

    + + + + + + + + + +
    + + + + + + + + +
    + + + +

    + ZTPTemplatesTab + + +

    + + +
    +

    + Bases: BasePage

    + + +

    Класс для работы с вкладкой 'Шаблоны' в модуле Zero Touch Provisioning.

    +

    Предоставляет методы для взаимодействия с таблицей шаблонов, модальными окнами +и проверки состояния элементов интерфейса. Включает функциональность для: +- Работы с таблицей шаблонов (прокрутка, проверка строк, выделение) +- Управления модальными окнами просмотра шаблонов +- Сравнения данных UI с API ответами

    + + +

    Parameters:

    + + + + + + + + + + + + + + + + + +
    NameTypeDescriptionDefault
    + page + + Page + +
    +

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

    +
    +
    + required +
    + + + + + + + +
    + Source code in pages\ztp_templates_tab.py +
     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
    +271
    +272
    +273
    +274
    +275
    +276
    +277
    +278
    +279
    +280
    +281
    +282
    +283
    +284
    +285
    +286
    +287
    +288
    +289
    +290
    +291
    +292
    +293
    +294
    +295
    +296
    +297
    +298
    +299
    +300
    +301
    +302
    +303
    +304
    class ZTPTemplatesTab(BasePage):
    +    """Класс для работы с вкладкой 'Шаблоны' в модуле Zero Touch Provisioning.
    +
    +    Предоставляет методы для взаимодействия с таблицей шаблонов, модальными окнами
    +    и проверки состояния элементов интерфейса. Включает функциональность для:
    +    - Работы с таблицей шаблонов (прокрутка, проверка строк, выделение)
    +    - Управления модальными окнами просмотра шаблонов
    +    - Сравнения данных UI с API ответами
    +
    +    Args:
    +        page (Page): Экземпляр страницы Playwright.
    +    """
    +
    +    def __init__(self, page: Page) -> None:
    +        """Инициализирует компоненты вкладки 'Шаблоны'."""
    +        super().__init__(page)
    +
    +        self.toolbar = ToolbarComponent(page, "Шаблоны")
    +        self.ztp_templates_table = TableComponent(page)
    +        self.modal_windows = {}
    +
    +    def add_modal_window(self, title: str) -> None:
    +        """Добавляет модальное окно в коллекцию.
    +
    +        Args:
    +            title: Заголовок окна.
    +        """
    +        self.modal_windows[title] = ViewTemplateModalWindow(self.page, title)
    +
    +    def get_modal_window(self, title: str) -> ViewTemplateModalWindow:
    +        """Возвращает модальное окно по заголовку.
    +
    +        Args:
    +            title: Заголовок окна.
    +
    +        Returns:
    +            ViewTemplateModalWindow: Экземпляр модального окна шаблона.
    +
    +        Raises:
    +            AssertionError: Если окно не найдено.
    +        """
    +        modal_window = self.modal_windows.get(title)
    +
    +        if modal_window is None:
    +            assert False, f"Modal window with title '{title}' not found"
    +        return modal_window
    +
    +    def delete_modal_window(self, title: str) -> None:
    +        """Удаляет модальное окно из коллекции.
    +
    +        Args:
    +            title: Заголовок окна.
    +
    +        Raises:
    +            AssertionError: Если окно не найдено.
    +        """
    +        if self.modal_windows.get(title) is None:
    +            assert False, f"Modal window with title '{title}' not found"
    +        self.modal_windows[title] = None
    +
    +    def open_template_modal_by_index(self, row_index: int = 0) -> str:
    +        """Открывает модальное окно шаблона по клику на строку таблицы.
    +
    +        Args:
    +            row_index: Индекс строки для клика (по умолчанию 0 - первая строка).
    +
    +        Returns:
    +            str: Имя шаблона.
    +        """
    +        row_locator = self.ztp_templates_table.get_row_locator(
    +            TableLocators.TABLE_WORK_AREA, row_index
    +        )
    +        row_locator.click()
    +
    +        # Создаем временный экземпляр модального окна для получения заголовка
    +        temp_modal = ViewTemplateModalWindow(self.page, "")
    +        template_name = temp_modal.toolbar.get_toolbar_title_text(
    +            ModalWindowLocators.MODAL_WINDOW_TITLE
    +        )
    +
    +        # Добавляем модальное окно в коллекцию после открытия
    +        self.add_modal_window(template_name)
    +        return template_name
    +
    +    def close_modal_window_by_toolbar_button(self, title: str) -> None:
    +        """Закрывает модальное окно через кнопку в тулбаре.
    +
    +        Args:
    +            title: Заголовок окна.
    +        """
    +        modal_window = self.get_modal_window(title)
    +        modal_window.click_toolbar_close_button()
    +        self.delete_modal_window(title)
    +
    +    def get_rows_count(self) -> int:
    +        """Возвращает количество строк в таблице (без заголовка).
    +
    +        Returns:
    +            int: Количество строк с данными.
    +
    +        Raises:
    +            AssertionError: Если таблица пуста.
    +        """
    +        return self.ztp_templates_table.get_rows_count(TableLocators.TABLE_WORK_AREA)
    +
    +    def scroll_templates_table_up(self) -> None:
    +        """Прокручивает таблицу шаблонов вверх."""
    +        self.ztp_templates_table.scroll_up(TableLocators.TABLE_SCROLL_CONTAINER)
    +
    +    def scroll_templates_table_down(self) -> None:
    +        """Прокручивает таблицу шаблонов вниз."""
    +        self.ztp_templates_table.scroll_down(TableLocators.TABLE_SCROLL_CONTAINER)
    +
    +    def scroll_modal_up(self) -> None:
    +        """Прокручивает содержимое модального окна вверх."""
    +        self.ztp_templates_table.scroll_up(
    +            ModalWindowLocators.MODAL_WINDOW_SCROLL_CONTAINER
    +        )
    +
    +    def scroll_modal_down(self) -> None:
    +        """Прокручивает содержимое модального окна вниз."""
    +        self.ztp_templates_table.scroll_down(
    +            ModalWindowLocators.MODAL_WINDOW_SCROLL_CONTAINER
    +        )
    +
    +    def check_templates_modal_content(self, template_name: str) -> None:
    +        """Проверяет наличие и корректность элементов модального окна шаблона.
    +
    +        Args:
    +            template_name: Имя шаблона для проверки заголовка окна.
    +
    +        Raises:
    +            AssertionError: Если элементы окна некорректны.
    +        """
    +        modal_window = self.get_modal_window(template_name)
    +        modal_window.check_content()
    +
    +    def check_templates_table_content(self) -> None:
    +        """Проверяет содержимое таблицы шаблонов.
    +
    +        Проверяет заголовки и наличие данных в таблице.
    +
    +        Raises:
    +            AssertionError: Если таблица пуста или заголовки неверны.
    +        """
    +        expected_headers = [
    +            'Производитель',
    +            'vendorCode',
    +            'authentication',
    +            'deviceType',
    +            'authenticationOption'
    +        ]
    +
    +        self.ztp_templates_table.check_content(TableLocators.TABLE_WORK_AREA, expected_headers)
    +
    +    def check_templates_table_vertical_scrolling(self) -> bool:
    +        """Проверяет возможность вертикальной прокрутки таблицы.
    +
    +        Returns:
    +            bool: True если прокрутка возможна, иначе False.
    +        """
    +        return self.ztp_templates_table.is_scrollable_vertically(
    +            TableLocators.TABLE_SCROLL_CONTAINER
    +        )
    +
    +    def check_templates_table_first_row_visibility(self) -> None:
    +        """Проверяет видимость первой строки таблицы.
    +
    +        Raises:
    +            AssertionError: Если строка не видна.
    +        """
    +        self.ztp_templates_table.check_first_row_visibility(TableLocators.TABLE_WORK_AREA)
    +
    +    def check_templates_table_last_row_visibility(self) -> None:
    +        """Проверяет видимость последней строки таблицы.
    +
    +        Raises:
    +            AssertionError: Если строка не видна.
    +        """
    +        self.ztp_templates_table.check_last_row_visibility(TableLocators.TABLE_WORK_AREA)
    +
    +    def check_templates_table_row_highlighting(self, row_index: int) -> None:
    +        """Проверяет выделение указанной строки таблицы.
    +
    +        Args:
    +            row_index: Индекс проверяемой строки.
    +
    +        Raises:
    +            AssertionError: Если строка не выделена.
    +        """
    +        self.ztp_templates_table.check_row_highlighting(
    +            TableLocators.TABLE_WORK_AREA, row_index
    +        )
    +
    +    def should_be_toolbar(self) -> None:
    +        """Проверяет наличие тулбара на вкладке.
    +
    +        Raises:
    +            AssertionError: Если тулбар отсутствует.
    +        """
    +        self.toolbar.check_toolbar_presence("Toolbar is missing")
    +
    +    def should_be_templates_table(self) -> None:
    +        """Проверяет наличие таблицы шаблонов.
    +
    +        Raises:
    +            AssertionError: Если таблица отсутствует.
    +        """
    +        self.ztp_templates_table.check_visibility(
    +            TableLocators.TABLE_WORK_AREA, "Templates table is missing"
    +        )
    +
    +    def should_be_modal_window(self) -> None:
    +        """Проверяет наличие модального окна.
    +
    +        Raises:
    +            AssertionError: Если модальное окно отсутствует.
    +        """
    +        self.ztp_templates_table.check_visibility(
    +            ModalWindowLocators.MODAL_WINDOW, "Modal window is not visible"
    +        )
    +
    +    def should_not_be_modal_window(self) -> None:
    +        """Проверяет, что модальное окно отсутствует.
    +
    +        Raises:
    +            AssertionError: Если модальное окно все еще видно.
    +        """
    +        is_visible = self.page.locator(
    +            ModalWindowLocators.MODAL_WINDOW
    +        ).is_visible(timeout=1000)
    +        if is_visible:
    +            assert False, "Modal window should not be visible"
    +
    +    def check_modal_vertical_scrolling(self) -> bool:
    +        """Проверяет возможность вертикального скроллинга в модальном окне.
    +
    +        Returns:
    +            bool: True если скроллинг возможен, иначе False.
    +        """
    +        return self.ztp_templates_table.is_scrollable_vertically(
    +            ModalWindowLocators.MODAL_WINDOW_SCROLL_CONTAINER
    +        )
    +
    +    def verify_template_data_with_api(self, template_name: str) -> None:
    +        """Проверяет соответствие данных модального окна данным из API.
    +
    +        Процесс проверки:
    +        1. Получает модальное окно по имени шаблона
    +        2. Извлекает данные из полей ввода модального окна
    +        3. Отправляет API запрос для получения эталонных данных шаблона
    +        4. Сравнивает данные из UI с данными из API
    +        5. Выбрасывает assertion при обнаружении расхождений
    +
    +        Args:
    +            template_name: Имя шаблона для проверки (должно совпадать с id в API).
    +
    +        Raises:
    +            AssertionError: Если:
    +                - Модальное окно не найдено
    +                - API запрос завершился с ошибкой (status != 200)
    +                - Обнаружены расхождения между данными UI и API
    +                - Имя шаблона в модальном окне не соответствует ожидаемому
    +        """
    +        # Получаем модальное окно
    +        modal_window = self.get_modal_window(template_name)
    +
    +        # Читаем данные модального окна (метод теперь в ViewTemplateModalWindow)
    +        actual_data = modal_window.get_modal_window_data()
    +
    +        # Читаем данные из API
    +        encoded_template_name = template_name.replace(" ", "%20")
    +        url = f"e-nms/DHCP/showOptPattern?template={encoded_template_name}"
    +        response = self.send_get_api_request(url)
    +
    +        # Проверяем статус ответа
    +        if response.status != 200:
    +            logger.error("API request failed with status: %s", response.status)
    +            assert False, f"API request failed with status: {response.status}"
    +
    +        # Извлекаем данные из ответа
    +        response_data = response.json()
    +        template_data = response_data['data']
    +
    +        # Сравниваем actual_data с данными конкретного шаблона (метод теперь в ViewTemplateModalWindow)
    +        modal_window.compare_modal_with_api_data(actual_data, template_data, template_name)
    +
    +
    + + + +
    + + + + + + + + + +
    + + +

    + __init__(page) + +

    + + +
    + +

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

    + + +
    + Source code in pages\ztp_templates_tab.py +
    32
    +33
    +34
    +35
    +36
    +37
    +38
    def __init__(self, page: Page) -> None:
    +    """Инициализирует компоненты вкладки 'Шаблоны'."""
    +    super().__init__(page)
    +
    +    self.toolbar = ToolbarComponent(page, "Шаблоны")
    +    self.ztp_templates_table = TableComponent(page)
    +    self.modal_windows = {}
    +
    +
    +
    + +
    + +
    + + +

    + add_modal_window(title) + +

    + + +
    + +

    Добавляет модальное окно в коллекцию.

    + + +

    Parameters:

    + + + + + + + + + + + + + + + + + +
    NameTypeDescriptionDefault
    + title + + str + +
    +

    Заголовок окна.

    +
    +
    + required +
    + + +
    + Source code in pages\ztp_templates_tab.py +
    40
    +41
    +42
    +43
    +44
    +45
    +46
    def add_modal_window(self, title: str) -> None:
    +    """Добавляет модальное окно в коллекцию.
    +
    +    Args:
    +        title: Заголовок окна.
    +    """
    +    self.modal_windows[title] = ViewTemplateModalWindow(self.page, title)
    +
    +
    +
    + +
    + +
    + + +

    + check_modal_vertical_scrolling() + +

    + + +
    + +

    Проверяет возможность вертикального скроллинга в модальном окне.

    + + +

    Returns:

    + + + + + + + + + + + + + +
    Name TypeDescription
    bool + bool + +
    +

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

    +
    +
    + + +
    + Source code in pages\ztp_templates_tab.py +
    253
    +254
    +255
    +256
    +257
    +258
    +259
    +260
    +261
    def check_modal_vertical_scrolling(self) -> bool:
    +    """Проверяет возможность вертикального скроллинга в модальном окне.
    +
    +    Returns:
    +        bool: True если скроллинг возможен, иначе False.
    +    """
    +    return self.ztp_templates_table.is_scrollable_vertically(
    +        ModalWindowLocators.MODAL_WINDOW_SCROLL_CONTAINER
    +    )
    +
    +
    +
    + +
    + +
    + + +

    + check_templates_modal_content(template_name) + +

    + + +
    + +

    Проверяет наличие и корректность элементов модального окна шаблона.

    + + +

    Parameters:

    + + + + + + + + + + + + + + + + + +
    NameTypeDescriptionDefault
    + template_name + + str + +
    +

    Имя шаблона для проверки заголовка окна.

    +
    +
    + required +
    + + +

    Raises:

    + + + + + + + + + + + + + +
    TypeDescription
    + AssertionError + +
    +

    Если элементы окна некорректны.

    +
    +
    + + +
    + Source code in pages\ztp_templates_tab.py +
    144
    +145
    +146
    +147
    +148
    +149
    +150
    +151
    +152
    +153
    +154
    def check_templates_modal_content(self, template_name: str) -> None:
    +    """Проверяет наличие и корректность элементов модального окна шаблона.
    +
    +    Args:
    +        template_name: Имя шаблона для проверки заголовка окна.
    +
    +    Raises:
    +        AssertionError: Если элементы окна некорректны.
    +    """
    +    modal_window = self.get_modal_window(template_name)
    +    modal_window.check_content()
    +
    +
    +
    + +
    + +
    + + +

    + check_templates_table_content() + +

    + + +
    + +

    Проверяет содержимое таблицы шаблонов.

    +

    Проверяет заголовки и наличие данных в таблице.

    + + +

    Raises:

    + + + + + + + + + + + + + +
    TypeDescription
    + AssertionError + +
    +

    Если таблица пуста или заголовки неверны.

    +
    +
    + + +
    + Source code in pages\ztp_templates_tab.py +
    156
    +157
    +158
    +159
    +160
    +161
    +162
    +163
    +164
    +165
    +166
    +167
    +168
    +169
    +170
    +171
    +172
    def check_templates_table_content(self) -> None:
    +    """Проверяет содержимое таблицы шаблонов.
    +
    +    Проверяет заголовки и наличие данных в таблице.
    +
    +    Raises:
    +        AssertionError: Если таблица пуста или заголовки неверны.
    +    """
    +    expected_headers = [
    +        'Производитель',
    +        'vendorCode',
    +        'authentication',
    +        'deviceType',
    +        'authenticationOption'
    +    ]
    +
    +    self.ztp_templates_table.check_content(TableLocators.TABLE_WORK_AREA, expected_headers)
    +
    +
    +
    + +
    + +
    + + +

    + check_templates_table_first_row_visibility() + +

    + + +
    + +

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

    + + +

    Raises:

    + + + + + + + + + + + + + +
    TypeDescription
    + AssertionError + +
    +

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

    +
    +
    + + +
    + Source code in pages\ztp_templates_tab.py +
    184
    +185
    +186
    +187
    +188
    +189
    +190
    def check_templates_table_first_row_visibility(self) -> None:
    +    """Проверяет видимость первой строки таблицы.
    +
    +    Raises:
    +        AssertionError: Если строка не видна.
    +    """
    +    self.ztp_templates_table.check_first_row_visibility(TableLocators.TABLE_WORK_AREA)
    +
    +
    +
    + +
    + +
    + + +

    + check_templates_table_last_row_visibility() + +

    + + +
    + +

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

    + + +

    Raises:

    + + + + + + + + + + + + + +
    TypeDescription
    + AssertionError + +
    +

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

    +
    +
    + + +
    + Source code in pages\ztp_templates_tab.py +
    192
    +193
    +194
    +195
    +196
    +197
    +198
    def check_templates_table_last_row_visibility(self) -> None:
    +    """Проверяет видимость последней строки таблицы.
    +
    +    Raises:
    +        AssertionError: Если строка не видна.
    +    """
    +    self.ztp_templates_table.check_last_row_visibility(TableLocators.TABLE_WORK_AREA)
    +
    +
    +
    + +
    + +
    + + +

    + check_templates_table_row_highlighting(row_index) + +

    + + +
    + +

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

    + + +

    Parameters:

    + + + + + + + + + + + + + + + + + +
    NameTypeDescriptionDefault
    + row_index + + int + +
    +

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

    +
    +
    + required +
    + + +

    Raises:

    + + + + + + + + + + + + + +
    TypeDescription
    + AssertionError + +
    +

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

    +
    +
    + + +
    + Source code in pages\ztp_templates_tab.py +
    200
    +201
    +202
    +203
    +204
    +205
    +206
    +207
    +208
    +209
    +210
    +211
    def check_templates_table_row_highlighting(self, row_index: int) -> None:
    +    """Проверяет выделение указанной строки таблицы.
    +
    +    Args:
    +        row_index: Индекс проверяемой строки.
    +
    +    Raises:
    +        AssertionError: Если строка не выделена.
    +    """
    +    self.ztp_templates_table.check_row_highlighting(
    +        TableLocators.TABLE_WORK_AREA, row_index
    +    )
    +
    +
    +
    + +
    + +
    + + +

    + check_templates_table_vertical_scrolling() + +

    + + +
    + +

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

    + + +

    Returns:

    + + + + + + + + + + + + + +
    Name TypeDescription
    bool + bool + +
    +

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

    +
    +
    + + +
    + Source code in pages\ztp_templates_tab.py +
    174
    +175
    +176
    +177
    +178
    +179
    +180
    +181
    +182
    def check_templates_table_vertical_scrolling(self) -> bool:
    +    """Проверяет возможность вертикальной прокрутки таблицы.
    +
    +    Returns:
    +        bool: True если прокрутка возможна, иначе False.
    +    """
    +    return self.ztp_templates_table.is_scrollable_vertically(
    +        TableLocators.TABLE_SCROLL_CONTAINER
    +    )
    +
    +
    +
    + +
    + +
    + + +

    + close_modal_window_by_toolbar_button(title) + +

    + + +
    + +

    Закрывает модальное окно через кнопку в тулбаре.

    + + +

    Parameters:

    + + + + + + + + + + + + + + + + + +
    NameTypeDescriptionDefault
    + title + + str + +
    +

    Заголовок окна.

    +
    +
    + required +
    + + +
    + Source code in pages\ztp_templates_tab.py +
    103
    +104
    +105
    +106
    +107
    +108
    +109
    +110
    +111
    def close_modal_window_by_toolbar_button(self, title: str) -> None:
    +    """Закрывает модальное окно через кнопку в тулбаре.
    +
    +    Args:
    +        title: Заголовок окна.
    +    """
    +    modal_window = self.get_modal_window(title)
    +    modal_window.click_toolbar_close_button()
    +    self.delete_modal_window(title)
    +
    +
    +
    + +
    + +
    + + +

    + delete_modal_window(title) + +

    + + +
    + +

    Удаляет модальное окно из коллекции.

    + + +

    Parameters:

    + + + + + + + + + + + + + + + + + +
    NameTypeDescriptionDefault
    + title + + str + +
    +

    Заголовок окна.

    +
    +
    + required +
    + + +

    Raises:

    + + + + + + + + + + + + + +
    TypeDescription
    + AssertionError + +
    +

    Если окно не найдено.

    +
    +
    + + +
    + Source code in pages\ztp_templates_tab.py +
    66
    +67
    +68
    +69
    +70
    +71
    +72
    +73
    +74
    +75
    +76
    +77
    def delete_modal_window(self, title: str) -> None:
    +    """Удаляет модальное окно из коллекции.
    +
    +    Args:
    +        title: Заголовок окна.
    +
    +    Raises:
    +        AssertionError: Если окно не найдено.
    +    """
    +    if self.modal_windows.get(title) is None:
    +        assert False, f"Modal window with title '{title}' not found"
    +    self.modal_windows[title] = None
    +
    +
    +
    + +
    + +
    + + +

    + get_modal_window(title) + +

    + + +
    + +

    Возвращает модальное окно по заголовку.

    + + +

    Parameters:

    + + + + + + + + + + + + + + + + + +
    NameTypeDescriptionDefault
    + title + + str + +
    +

    Заголовок окна.

    +
    +
    + required +
    + + +

    Returns:

    + + + + + + + + + + + + + +
    Name TypeDescription
    ViewTemplateModalWindow + ViewTemplateModalWindow + +
    +

    Экземпляр модального окна шаблона.

    +
    +
    + + +

    Raises:

    + + + + + + + + + + + + + +
    TypeDescription
    + AssertionError + +
    +

    Если окно не найдено.

    +
    +
    + + +
    + Source code in pages\ztp_templates_tab.py +
    48
    +49
    +50
    +51
    +52
    +53
    +54
    +55
    +56
    +57
    +58
    +59
    +60
    +61
    +62
    +63
    +64
    def get_modal_window(self, title: str) -> ViewTemplateModalWindow:
    +    """Возвращает модальное окно по заголовку.
    +
    +    Args:
    +        title: Заголовок окна.
    +
    +    Returns:
    +        ViewTemplateModalWindow: Экземпляр модального окна шаблона.
    +
    +    Raises:
    +        AssertionError: Если окно не найдено.
    +    """
    +    modal_window = self.modal_windows.get(title)
    +
    +    if modal_window is None:
    +        assert False, f"Modal window with title '{title}' not found"
    +    return modal_window
    +
    +
    +
    + +
    + +
    + + +

    + get_rows_count() + +

    + + +
    + +

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

    + + +

    Returns:

    + + + + + + + + + + + + + +
    Name TypeDescription
    int + int + +
    +

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

    +
    +
    + + +

    Raises:

    + + + + + + + + + + + + + +
    TypeDescription
    + AssertionError + +
    +

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

    +
    +
    + + +
    + Source code in pages\ztp_templates_tab.py +
    113
    +114
    +115
    +116
    +117
    +118
    +119
    +120
    +121
    +122
    def get_rows_count(self) -> int:
    +    """Возвращает количество строк в таблице (без заголовка).
    +
    +    Returns:
    +        int: Количество строк с данными.
    +
    +    Raises:
    +        AssertionError: Если таблица пуста.
    +    """
    +    return self.ztp_templates_table.get_rows_count(TableLocators.TABLE_WORK_AREA)
    +
    +
    +
    + +
    + +
    + + +

    + open_template_modal_by_index(row_index=0) + +

    + + +
    + +

    Открывает модальное окно шаблона по клику на строку таблицы.

    + + +

    Parameters:

    + + + + + + + + + + + + + + + + + +
    NameTypeDescriptionDefault
    + row_index + + int + +
    +

    Индекс строки для клика (по умолчанию 0 - первая строка).

    +
    +
    + 0 +
    + + +

    Returns:

    + + + + + + + + + + + + + +
    Name TypeDescription
    str + str + +
    +

    Имя шаблона.

    +
    +
    + + +
    + Source code in pages\ztp_templates_tab.py +
     79
    + 80
    + 81
    + 82
    + 83
    + 84
    + 85
    + 86
    + 87
    + 88
    + 89
    + 90
    + 91
    + 92
    + 93
    + 94
    + 95
    + 96
    + 97
    + 98
    + 99
    +100
    +101
    def open_template_modal_by_index(self, row_index: int = 0) -> str:
    +    """Открывает модальное окно шаблона по клику на строку таблицы.
    +
    +    Args:
    +        row_index: Индекс строки для клика (по умолчанию 0 - первая строка).
    +
    +    Returns:
    +        str: Имя шаблона.
    +    """
    +    row_locator = self.ztp_templates_table.get_row_locator(
    +        TableLocators.TABLE_WORK_AREA, row_index
    +    )
    +    row_locator.click()
    +
    +    # Создаем временный экземпляр модального окна для получения заголовка
    +    temp_modal = ViewTemplateModalWindow(self.page, "")
    +    template_name = temp_modal.toolbar.get_toolbar_title_text(
    +        ModalWindowLocators.MODAL_WINDOW_TITLE
    +    )
    +
    +    # Добавляем модальное окно в коллекцию после открытия
    +    self.add_modal_window(template_name)
    +    return template_name
    +
    +
    +
    + +
    + +
    + + +

    + scroll_modal_down() + +

    + + +
    + +

    Прокручивает содержимое модального окна вниз.

    + + +
    + Source code in pages\ztp_templates_tab.py +
    138
    +139
    +140
    +141
    +142
    def scroll_modal_down(self) -> None:
    +    """Прокручивает содержимое модального окна вниз."""
    +    self.ztp_templates_table.scroll_down(
    +        ModalWindowLocators.MODAL_WINDOW_SCROLL_CONTAINER
    +    )
    +
    +
    +
    + +
    + +
    + + +

    + scroll_modal_up() + +

    + + +
    + +

    Прокручивает содержимое модального окна вверх.

    + + +
    + Source code in pages\ztp_templates_tab.py +
    132
    +133
    +134
    +135
    +136
    def scroll_modal_up(self) -> None:
    +    """Прокручивает содержимое модального окна вверх."""
    +    self.ztp_templates_table.scroll_up(
    +        ModalWindowLocators.MODAL_WINDOW_SCROLL_CONTAINER
    +    )
    +
    +
    +
    + +
    + +
    + + +

    + scroll_templates_table_down() + +

    + + +
    + +

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

    + + +
    + Source code in pages\ztp_templates_tab.py +
    128
    +129
    +130
    def scroll_templates_table_down(self) -> None:
    +    """Прокручивает таблицу шаблонов вниз."""
    +    self.ztp_templates_table.scroll_down(TableLocators.TABLE_SCROLL_CONTAINER)
    +
    +
    +
    + +
    + +
    + + +

    + scroll_templates_table_up() + +

    + + +
    + +

    Прокручивает таблицу шаблонов вверх.

    + + +
    + Source code in pages\ztp_templates_tab.py +
    124
    +125
    +126
    def scroll_templates_table_up(self) -> None:
    +    """Прокручивает таблицу шаблонов вверх."""
    +    self.ztp_templates_table.scroll_up(TableLocators.TABLE_SCROLL_CONTAINER)
    +
    +
    +
    + +
    + +
    + + +

    + should_be_modal_window() + +

    + + +
    + +

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

    + + +

    Raises:

    + + + + + + + + + + + + + +
    TypeDescription
    + AssertionError + +
    +

    Если модальное окно отсутствует.

    +
    +
    + + +
    + Source code in pages\ztp_templates_tab.py +
    231
    +232
    +233
    +234
    +235
    +236
    +237
    +238
    +239
    def should_be_modal_window(self) -> None:
    +    """Проверяет наличие модального окна.
    +
    +    Raises:
    +        AssertionError: Если модальное окно отсутствует.
    +    """
    +    self.ztp_templates_table.check_visibility(
    +        ModalWindowLocators.MODAL_WINDOW, "Modal window is not visible"
    +    )
    +
    +
    +
    + +
    + +
    + + +

    + should_be_templates_table() + +

    + + +
    + +

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

    + + +

    Raises:

    + + + + + + + + + + + + + +
    TypeDescription
    + AssertionError + +
    +

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

    +
    +
    + + +
    + Source code in pages\ztp_templates_tab.py +
    221
    +222
    +223
    +224
    +225
    +226
    +227
    +228
    +229
    def should_be_templates_table(self) -> None:
    +    """Проверяет наличие таблицы шаблонов.
    +
    +    Raises:
    +        AssertionError: Если таблица отсутствует.
    +    """
    +    self.ztp_templates_table.check_visibility(
    +        TableLocators.TABLE_WORK_AREA, "Templates table is missing"
    +    )
    +
    +
    +
    + +
    + +
    + + +

    + should_be_toolbar() + +

    + + +
    + +

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

    + + +

    Raises:

    + + + + + + + + + + + + + +
    TypeDescription
    + AssertionError + +
    +

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

    +
    +
    + + +
    + Source code in pages\ztp_templates_tab.py +
    213
    +214
    +215
    +216
    +217
    +218
    +219
    def should_be_toolbar(self) -> None:
    +    """Проверяет наличие тулбара на вкладке.
    +
    +    Raises:
    +        AssertionError: Если тулбар отсутствует.
    +    """
    +    self.toolbar.check_toolbar_presence("Toolbar is missing")
    +
    +
    +
    + +
    + +
    + + +

    + should_not_be_modal_window() + +

    + + +
    + +

    Проверяет, что модальное окно отсутствует.

    + + +

    Raises:

    + + + + + + + + + + + + + +
    TypeDescription
    + AssertionError + +
    +

    Если модальное окно все еще видно.

    +
    +
    + + +
    + Source code in pages\ztp_templates_tab.py +
    241
    +242
    +243
    +244
    +245
    +246
    +247
    +248
    +249
    +250
    +251
    def should_not_be_modal_window(self) -> None:
    +    """Проверяет, что модальное окно отсутствует.
    +
    +    Raises:
    +        AssertionError: Если модальное окно все еще видно.
    +    """
    +    is_visible = self.page.locator(
    +        ModalWindowLocators.MODAL_WINDOW
    +    ).is_visible(timeout=1000)
    +    if is_visible:
    +        assert False, "Modal window should not be visible"
    +
    +
    +
    + +
    + +
    + + +

    + verify_template_data_with_api(template_name) + +

    + + +
    + +

    Проверяет соответствие данных модального окна данным из API.

    +

    Процесс проверки: +1. Получает модальное окно по имени шаблона +2. Извлекает данные из полей ввода модального окна +3. Отправляет API запрос для получения эталонных данных шаблона +4. Сравнивает данные из UI с данными из API +5. Выбрасывает assertion при обнаружении расхождений

    + + +

    Parameters:

    + + + + + + + + + + + + + + + + + +
    NameTypeDescriptionDefault
    + template_name + + str + +
    +

    Имя шаблона для проверки (должно совпадать с id в API).

    +
    +
    + required +
    + + +

    Raises:

    + + + + + + + + + + + + + +
    TypeDescription
    + AssertionError + +
    +

    Если: +- Модальное окно не найдено +- API запрос завершился с ошибкой (status != 200) +- Обнаружены расхождения между данными UI и API +- Имя шаблона в модальном окне не соответствует ожидаемому

    +
    +
    + + +
    + Source code in pages\ztp_templates_tab.py +
    263
    +264
    +265
    +266
    +267
    +268
    +269
    +270
    +271
    +272
    +273
    +274
    +275
    +276
    +277
    +278
    +279
    +280
    +281
    +282
    +283
    +284
    +285
    +286
    +287
    +288
    +289
    +290
    +291
    +292
    +293
    +294
    +295
    +296
    +297
    +298
    +299
    +300
    +301
    +302
    +303
    +304
    def verify_template_data_with_api(self, template_name: str) -> None:
    +    """Проверяет соответствие данных модального окна данным из API.
    +
    +    Процесс проверки:
    +    1. Получает модальное окно по имени шаблона
    +    2. Извлекает данные из полей ввода модального окна
    +    3. Отправляет API запрос для получения эталонных данных шаблона
    +    4. Сравнивает данные из UI с данными из API
    +    5. Выбрасывает assertion при обнаружении расхождений
    +
    +    Args:
    +        template_name: Имя шаблона для проверки (должно совпадать с id в API).
    +
    +    Raises:
    +        AssertionError: Если:
    +            - Модальное окно не найдено
    +            - API запрос завершился с ошибкой (status != 200)
    +            - Обнаружены расхождения между данными UI и API
    +            - Имя шаблона в модальном окне не соответствует ожидаемому
    +    """
    +    # Получаем модальное окно
    +    modal_window = self.get_modal_window(template_name)
    +
    +    # Читаем данные модального окна (метод теперь в ViewTemplateModalWindow)
    +    actual_data = modal_window.get_modal_window_data()
    +
    +    # Читаем данные из API
    +    encoded_template_name = template_name.replace(" ", "%20")
    +    url = f"e-nms/DHCP/showOptPattern?template={encoded_template_name}"
    +    response = self.send_get_api_request(url)
    +
    +    # Проверяем статус ответа
    +    if response.status != 200:
    +        logger.error("API request failed with status: %s", response.status)
    +        assert False, f"API request failed with status: {response.status}"
    +
    +    # Извлекаем данные из ответа
    +    response_data = response.json()
    +    template_data = response_data['data']
    +
    +    # Сравниваем actual_data с данными конкретного шаблона (метод теперь в ViewTemplateModalWindow)
    +    modal_window.compare_modal_with_api_data(actual_data, template_data, template_name)
    +
    +
    +
    + +
    + + + +
    + +
    + +
    + + + + +
    + +
    + +
    + + + + + + + + + + + + + +
    +
    + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + + \ No newline at end of file diff --git a/site/search/search_index.json b/site/search/search_index.json index 4857985..c87ab15 100644 --- a/site/search/search_index.json +++ b/site/search/search_index.json @@ -1 +1 @@ -{"config":{"lang":["en"],"separator":"[\\s\\-]+","pipeline":["stopWordFilter"]},"docs":[{"location":"","title":"\u0414\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f \u0442\u0435\u0441\u0442\u043e\u0432\u043e\u0433\u043e \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u0430 eNODE-\u041c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043d\u0433","text":"

    \u0410\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u0430\u044f \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f \u0434\u043b\u044f \u0442\u0435\u0441\u0442\u043e\u0432\u043e\u0433\u043e \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u0430, \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0430\u043d\u043d\u043e\u0433\u043e \u0434\u043b\u044f \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f eNODE-\u043c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043d\u0433.

    "},{"location":"#_1","title":"\u041e\u0431\u0437\u043e\u0440 \u043f\u0440\u043e\u0435\u043a\u0442\u0430","text":"

    \u0424\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0430\u043d \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c:

    • Playwright - \u0434\u043b\u044f \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0430\u0446\u0438\u0438 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0430

    • Pytest - \u043a\u0430\u043a \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u0442\u0435\u0441\u0442\u043e\u0432\u044b\u0439 \u0434\u0432\u0438\u0436\u043e\u043a

    • Page Object Model - \u043f\u0430\u0442\u0442\u0435\u0440\u043d \u0434\u043b\u044f \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u0430\u0446\u0438\u0438 \u0442\u0435\u0441\u0442\u043e\u0432\u043e\u0433\u043e \u043a\u043e\u0434\u0430

    • MkDocs - \u0434\u043b\u044f \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438

    • Python 3.8+ - \u044f\u0437\u044b\u043a \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438

    "},{"location":"#_2","title":"\u0414\u0435\u0442\u0430\u043b\u044c\u043d\u0430\u044f \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u043f\u0440\u043e\u0435\u043a\u0442\u0430","text":""},{"location":"#_3","title":"\u041a\u043e\u0440\u043d\u0435\u0432\u0430\u044f \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044f","text":"
    • .env - \u0444\u0430\u0439\u043b \u0441 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u043c\u0438 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f
    • conftest.py - \u0444\u0438\u043a\u0441\u0442\u0443\u0440\u044b Pytest, \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438
    • mkdocs.yml - \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438
    • pytest.ini - \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f \u0442\u0435\u0441\u0442\u043e\u0432 (\u043c\u0430\u0440\u043a\u0435\u0440\u044b, \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b)
    • requirements.txt - \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 Python
    • setup.py - \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f \u043f\u0430\u043a\u0435\u0442\u0430
    "},{"location":"#_4","title":"\u041e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u043c\u043e\u0434\u0443\u043b\u0438","text":""},{"location":"#1-components","title":"1. components/","text":"

    \u0411\u0430\u0437\u043e\u0432\u044b\u0435 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u044b UI: - alert_component.py - \u0440\u0430\u0431\u043e\u0442\u0430 \u0441 alert-\u043e\u043a\u043d\u0430\u043c\u0438 (\u043e\u0448\u0438\u0431\u043a\u0438, \u0443\u0441\u043f\u0435\u0445, \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f) -

    "},{"location":"#2-data","title":"2. data/","text":"

    \u0414\u0430\u043d\u043d\u044b\u0435 \u0438 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438: - constants.py - \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u044b (\u043b\u043e\u0433\u0438\u043d\u044b, \u043f\u0430\u0440\u043e\u043b\u0438) - environment.py - \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f (test/develop) - roles_dict.py - \u0441\u043b\u043e\u0432\u0430\u0440\u044c \u0440\u043e\u043b\u0435\u0439 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 -

    "},{"location":"#3-docs","title":"3. docs/","text":"

    \u0414\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f: - tests/ - \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f \u0442\u0435\u0441\u0442\u043e\u0432 - config/ - \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 \u043f\u043e \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0435 - index.md

    "},{"location":"#4-elements","title":"4. elements/","text":"

    UI-\u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b: - base_element.py - \u0431\u0430\u0437\u043e\u0432\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 - button_element.py - \u043a\u043d\u043e\u043f\u043a\u0438 - checkbox_element.py - \u0447\u0435\u043a\u0431\u043e\u043a\u0441\u044b - text_element.py - \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u044b\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b - text_input_element.py - \u043f\u043e\u043b\u044f \u0432\u0432\u043e\u0434\u0430 - toolbar_button_element.py - \u043a\u043d\u043e\u043f\u043a\u0438 \u0442\u0443\u043b\u0431\u0430\u0440\u0430

    "},{"location":"#5-fixtures","title":"5. fixtures/","text":"

    \u0424\u0438\u043a\u0441\u0442\u0443\u0440\u044b Pytest: - pages.py - \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u043e\u0432, \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u043e\u0432

    "},{"location":"#6-locators","title":"6. locators/","text":"

    \u041b\u043e\u043a\u0430\u0442\u043e\u0440\u044b \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432: - \u041b\u043e\u043a\u0430\u0442\u043e\u0440\u044b \u0434\u043b\u044f \u0432\u0441\u0435\u0445 \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0445 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043e\u0432 (confirm, modal windows, tables \u0438 \u0442.\u0434.)

    "},{"location":"#7-modal_windows","title":"7. modal_windows/","text":"

    \u0421\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u044b\u0435 \u043e\u043a\u043d\u0430: - modal_add_user.py - \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f - modal_edit_user.py - \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f

    "},{"location":"#8-pages","title":"8. pages/","text":"

    \u0421\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f: - base_page.py - \u0431\u0430\u0437\u043e\u0432\u044b\u0439 \u043a\u043b\u0430\u0441\u0441 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b - login_page.py - \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0430 \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u0438 - main_page.py - \u0433\u043b\u0430\u0432\u043d\u0430\u044f \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0430 - \u0422\u0430\u0431\u044b: service_status_tab.py, session_tab.py, users_tab.py

    "},{"location":"#9-tests","title":"9. tests/","text":"

    \u0422\u0435\u0441\u0442\u044b: - \u041e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u0442\u0435\u0441\u0442\u044b (test_login.py, test_session_tab.py \u0438 \u0434\u0440.) - \u041f\u043e\u0434\u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438: - components/ - \u0442\u0435\u0441\u0442\u044b \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043e\u0432 - e2e/ - end-to-end \u0442\u0435\u0441\u0442\u044b

    "},{"location":"#10-tools","title":"10. tools/","text":"

    \u0423\u0442\u0438\u043b\u0438\u0442\u044b: - logger.py - \u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u043b\u043e\u0433\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f

    "},{"location":"#_5","title":"\u0412\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043e\u0432","text":"
    1. \u0422\u0435\u0441\u0442\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b (pages)
    2. \u0421\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u0441\u043e\u0441\u0442\u043e\u044f\u0442 \u0438\u0437 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043e\u0432 (components)
    3. \u041a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u044b \u0441\u043e\u0441\u0442\u043e\u044f\u0442 \u0438\u0437 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 (elements)
    4. \u042d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442 \u043b\u043e\u043a\u0430\u0442\u043e\u0440\u044b \u0438\u0437 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0445 \u0444\u0430\u0439\u043b\u043e\u0432
    5. \u0412\u0441\u0435 \u043c\u043e\u0434\u0443\u043b\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442:
    6. \u041e\u0431\u0449\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0438\u0437 data/
    7. \u041b\u043e\u0433\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0447\u0435\u0440\u0435\u0437 tools/logger.py
    8. \u0424\u0438\u043a\u0441\u0442\u0443\u0440\u044b \u0438\u0437 fixtures/
    "},{"location":"#_6","title":"\u041a\u0430\u043a \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c","text":""},{"location":"#_7","title":"\u0423\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438:","text":"

    bash pip install -e . \u0417\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u0435 \u0442\u0435\u0441\u0442\u044b:

    bash

    "},{"location":"#_8","title":"\u0412\u0441\u0435 \u0442\u0435\u0441\u0442\u044b","text":"

    pytest tests/ -v

    "},{"location":"#smoke-","title":"\u0422\u043e\u043b\u044c\u043a\u043e smoke-\u0442\u0435\u0441\u0442\u044b","text":"

    pytest tests/ -m smoke -v

    "},{"location":"#_9","title":"\u0421\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0439\u0442\u0435 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044e:","text":"

    bash

    mkdocs serve

    "},{"location":"#_10","title":"\u041f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u043c\u044b\u0435 \u0442\u0435\u0441\u0442\u044b","text":"

    \u0410\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u044f (\u0443\u0441\u043f\u0435\u0448\u043d\u0430\u044f/\u043d\u0435\u0443\u0434\u0430\u0447\u043d\u0430\u044f)

    \u0423\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0441\u0435\u0441\u0441\u0438\u044f\u043c\u0438:

    • \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0442\u0430\u0431\u043b\u0438\u0446\u044b

    • \u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u0441\u0435\u0441\u0441\u0438\u0439

    • \u041c\u043e\u0434\u0430\u043b\u044c\u043d\u044b\u0435 \u043e\u043a\u043d\u0430

    \u0423\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\u043c\u0438:

    • \u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435/\u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0435

    • \u0418\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u0440\u043e\u043b\u0435\u0439

    • \u0421\u0431\u0440\u043e\u0441 \u043f\u0430\u0440\u043e\u043b\u0435\u0439

    "},{"location":"#_11","title":"\u0421\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0435 \u0442\u0435\u0441\u0442\u044b:","text":"
    • \u0421\u0442\u0430\u0442\u0443\u0441 \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432

    • \u041b\u0438\u0446\u0435\u043d\u0437\u0438\u0438

    "},{"location":"components/alert_component/","title":"AlertComponent","text":"

    \u041c\u043e\u0434\u0443\u043b\u044c \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043e\u043c alert-\u043e\u043a\u043d\u0430 \u0432 Playwright.

    \u0421\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043a\u043b\u0430\u0441\u0441 AlertComponent \u0434\u043b\u044f \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0441 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u043c\u0438 \u0442\u0438\u043f\u0430\u043c\u0438 alert-\u043e\u043a\u043e\u043d (error, success, info, warning) \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0438\u0445 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f.

    "},{"location":"components/alert_component/#components.alert_component.AlertComponent","title":"AlertComponent","text":"

    Bases: BaseComponent

    \u041a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 alert-\u043e\u043a\u043d\u0430\u043c\u0438 Playwright.

    \u041f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u0442\u0438\u043f\u044b: error, success, info, warning. \u041f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0442\u044c \u043d\u0430\u043b\u0438\u0447\u0438\u0435, \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u0435 \u0438 \u0442\u0435\u043a\u0441\u0442 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439.

    Source code in components\\alert_component.py
    class AlertComponent(BaseComponent):\n    \"\"\"\u041a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 alert-\u043e\u043a\u043d\u0430\u043c\u0438 Playwright.\n\n    \u041f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u0442\u0438\u043f\u044b: error, success, info, warning.\n    \u041f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0442\u044c \u043d\u0430\u043b\u0438\u0447\u0438\u0435, \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u0435 \u0438 \u0442\u0435\u043a\u0441\u0442 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439.\n    \"\"\"\n\n    def __init__(self, page: Page):\n        \"\"\"\u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 alert-\u043e\u043a\u043d\u0430.\n\n        Args:\n            page: \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.\n        \"\"\"\n\n        super().__init__(page)\n\n        self.text = Text(page, \"//div[contains(@class,'v-alert')]/div\", \"Alert message\")\n\n    # \u0414\u0435\u0439\u0441\u0442\u0432\u0438\u044f:\n    def get_alert_type(self) -> str:\n        \"\"\"\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0442\u0438\u043f alert-\u043e\u043a\u043d\u0430.\n\n        Returns:\n            str: \u0422\u0438\u043f alert-\u043e\u043a\u043d\u0430.\n\n        Raises:\n            ValueError: \u0415\u0441\u043b\u0438 \u043f\u043e\u043b\u0443\u0447\u0435\u043d \u043d\u0435\u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u043c\u044b\u0439 \u0442\u0438\u043f alert-\u043e\u043a\u043d\u0430.\n        \"\"\"\n\n        class_attr = self.page.get_by_role(\"alert\").locator('>div').get_attribute('class')\n\n        alert_type = None\n        if 'v-alert' in class_attr:\n            alert_type = class_attr.replace(\"v-alert \", \"\")\n\n        alert_types = [\"error\", \"success\", \"info\", \"warning\"]\n        if alert_type not in alert_types:\n            raise ValueError(\"Unsupported type of alert window\")\n\n        return alert_type\n\n    def get_text(self) -> str:\n        \"\"\"\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0442\u0435\u043a\u0441\u0442 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0438\u0437 alert-\u043e\u043a\u043d\u0430.\n\n        Returns:\n            str: \u0422\u0435\u043a\u0441\u0442 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f.\n        \"\"\"\n\n        return self.text.get_text(0)\n\n    # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0438:\n    def check_alert_presence(self, text: str):\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 alert-\u043e\u043a\u043d\u0430 \u0441 \u0437\u0430\u0434\u0430\u043d\u043d\u044b\u043c \u0442\u0435\u043a\u0441\u0442\u043e\u043c.\n\n        Args:\n            text: \u0422\u0435\u043a\u0441\u0442 \u0434\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438. \u0415\u0441\u043b\u0438 \u043f\u0443\u0441\u0442\u0430\u044f \u0441\u0442\u0440\u043e\u043a\u0430 - \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e\n                  \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u043e\u043a\u043d\u0430.\n\n        Raises:\n            AssertionError: \u0415\u0441\u043b\u0438 alert-\u043e\u043a\u043d\u043e \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u043e.\n        \"\"\"\n\n        msg = \"Alert window is missing\"\n        if text == \"\":\n            expect(self.page.get_by_role(\"alert\")).to_be_visible(), msg\n        else:\n            expect(self.page.get_by_role(\"alert\").filter(has_text=text)).to_be_visible(), msg\n\n    def check_alert_absence(self, text: str, timeout: int = 30000):\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u0435 alert-\u043e\u043a\u043d\u0430 \u0441 \u0437\u0430\u0434\u0430\u043d\u043d\u044b\u043c \u0442\u0435\u043a\u0441\u0442\u043e\u043c.\n\n        Args:\n            text: \u0422\u0435\u043a\u0441\u0442 \u0434\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438.\n            timeout: \u0412\u0440\u0435\u043c\u044f \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u044f \u0438\u0441\u0447\u0435\u0437\u043d\u043e\u0432\u0435\u043d\u0438\u044f (\u043c\u0441).\n\n        Raises:\n            AssertionError: \u0415\u0441\u043b\u0438 \u043e\u043a\u043d\u043e \u043d\u0435 \u0438\u0441\u0447\u0435\u0437\u0430\u0435\u0442 \u0432 \u0442\u0435\u0447\u0435\u043d\u0438\u0435 \u0437\u0430\u0434\u0430\u043d\u043d\u043e\u0433\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438.\n        \"\"\"\n\n        seconds = int(timeout/1000)\n        msg = f\"Alert window should disappear after {seconds} seconds\"\n        expect(self.page.get_by_role(\"alert\").filter(has_text=text)).to_be_hidden(timeout=timeout), msg\n\n    def check_text(self, alert_text: str):\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0442\u043e\u0447\u043d\u043e\u0435 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0435 \u0442\u0435\u043a\u0441\u0442\u0430 \u0432 alert-\u043e\u043a\u043d\u0435.\n\n        Args:\n            alert_text: \u041e\u0436\u0438\u0434\u0430\u0435\u043c\u044b\u0439 \u0442\u0435\u043a\u0441\u0442 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f.\n\n        Raises:\n            AssertionError: \u0415\u0441\u043b\u0438 \u0442\u0435\u043a\u0441\u0442 \u043d\u0435 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u043e\u0436\u0438\u0434\u0430\u0435\u043c\u043e\u043c\u0443.\n        \"\"\"\n\n        self.text.check_have_text(alert_text,\n                                  \"Unexpected message in alert window\")\n
    "},{"location":"components/alert_component/#components.alert_component.AlertComponent.__init__","title":"__init__(page)","text":"

    \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 alert-\u043e\u043a\u043d\u0430.

    Parameters:

    Name Type Description Default page Page

    \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.

    required Source code in components\\alert_component.py
    def __init__(self, page: Page):\n    \"\"\"\u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 alert-\u043e\u043a\u043d\u0430.\n\n    Args:\n        page: \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.\n    \"\"\"\n\n    super().__init__(page)\n\n    self.text = Text(page, \"//div[contains(@class,'v-alert')]/div\", \"Alert message\")\n
    "},{"location":"components/alert_component/#components.alert_component.AlertComponent.check_alert_absence","title":"check_alert_absence(text, timeout=30000)","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u0435 alert-\u043e\u043a\u043d\u0430 \u0441 \u0437\u0430\u0434\u0430\u043d\u043d\u044b\u043c \u0442\u0435\u043a\u0441\u0442\u043e\u043c.

    Parameters:

    Name Type Description Default text str

    \u0422\u0435\u043a\u0441\u0442 \u0434\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438.

    required timeout int

    \u0412\u0440\u0435\u043c\u044f \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u044f \u0438\u0441\u0447\u0435\u0437\u043d\u043e\u0432\u0435\u043d\u0438\u044f (\u043c\u0441).

    30000

    Raises:

    Type Description AssertionError

    \u0415\u0441\u043b\u0438 \u043e\u043a\u043d\u043e \u043d\u0435 \u0438\u0441\u0447\u0435\u0437\u0430\u0435\u0442 \u0432 \u0442\u0435\u0447\u0435\u043d\u0438\u0435 \u0437\u0430\u0434\u0430\u043d\u043d\u043e\u0433\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438.

    Source code in components\\alert_component.py
    def check_alert_absence(self, text: str, timeout: int = 30000):\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u0435 alert-\u043e\u043a\u043d\u0430 \u0441 \u0437\u0430\u0434\u0430\u043d\u043d\u044b\u043c \u0442\u0435\u043a\u0441\u0442\u043e\u043c.\n\n    Args:\n        text: \u0422\u0435\u043a\u0441\u0442 \u0434\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438.\n        timeout: \u0412\u0440\u0435\u043c\u044f \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u044f \u0438\u0441\u0447\u0435\u0437\u043d\u043e\u0432\u0435\u043d\u0438\u044f (\u043c\u0441).\n\n    Raises:\n        AssertionError: \u0415\u0441\u043b\u0438 \u043e\u043a\u043d\u043e \u043d\u0435 \u0438\u0441\u0447\u0435\u0437\u0430\u0435\u0442 \u0432 \u0442\u0435\u0447\u0435\u043d\u0438\u0435 \u0437\u0430\u0434\u0430\u043d\u043d\u043e\u0433\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438.\n    \"\"\"\n\n    seconds = int(timeout/1000)\n    msg = f\"Alert window should disappear after {seconds} seconds\"\n    expect(self.page.get_by_role(\"alert\").filter(has_text=text)).to_be_hidden(timeout=timeout), msg\n
    "},{"location":"components/alert_component/#components.alert_component.AlertComponent.check_alert_presence","title":"check_alert_presence(text)","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 alert-\u043e\u043a\u043d\u0430 \u0441 \u0437\u0430\u0434\u0430\u043d\u043d\u044b\u043c \u0442\u0435\u043a\u0441\u0442\u043e\u043c.

    Parameters:

    Name Type Description Default text str

    \u0422\u0435\u043a\u0441\u0442 \u0434\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438. \u0415\u0441\u043b\u0438 \u043f\u0443\u0441\u0442\u0430\u044f \u0441\u0442\u0440\u043e\u043a\u0430 - \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u043e\u043a\u043d\u0430.

    required

    Raises:

    Type Description AssertionError

    \u0415\u0441\u043b\u0438 alert-\u043e\u043a\u043d\u043e \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u043e.

    Source code in components\\alert_component.py
    def check_alert_presence(self, text: str):\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 alert-\u043e\u043a\u043d\u0430 \u0441 \u0437\u0430\u0434\u0430\u043d\u043d\u044b\u043c \u0442\u0435\u043a\u0441\u0442\u043e\u043c.\n\n    Args:\n        text: \u0422\u0435\u043a\u0441\u0442 \u0434\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438. \u0415\u0441\u043b\u0438 \u043f\u0443\u0441\u0442\u0430\u044f \u0441\u0442\u0440\u043e\u043a\u0430 - \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e\n              \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u043e\u043a\u043d\u0430.\n\n    Raises:\n        AssertionError: \u0415\u0441\u043b\u0438 alert-\u043e\u043a\u043d\u043e \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u043e.\n    \"\"\"\n\n    msg = \"Alert window is missing\"\n    if text == \"\":\n        expect(self.page.get_by_role(\"alert\")).to_be_visible(), msg\n    else:\n        expect(self.page.get_by_role(\"alert\").filter(has_text=text)).to_be_visible(), msg\n
    "},{"location":"components/alert_component/#components.alert_component.AlertComponent.check_text","title":"check_text(alert_text)","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0442\u043e\u0447\u043d\u043e\u0435 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0435 \u0442\u0435\u043a\u0441\u0442\u0430 \u0432 alert-\u043e\u043a\u043d\u0435.

    Parameters:

    Name Type Description Default alert_text str

    \u041e\u0436\u0438\u0434\u0430\u0435\u043c\u044b\u0439 \u0442\u0435\u043a\u0441\u0442 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f.

    required

    Raises:

    Type Description AssertionError

    \u0415\u0441\u043b\u0438 \u0442\u0435\u043a\u0441\u0442 \u043d\u0435 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u043e\u0436\u0438\u0434\u0430\u0435\u043c\u043e\u043c\u0443.

    Source code in components\\alert_component.py
    def check_text(self, alert_text: str):\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0442\u043e\u0447\u043d\u043e\u0435 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0435 \u0442\u0435\u043a\u0441\u0442\u0430 \u0432 alert-\u043e\u043a\u043d\u0435.\n\n    Args:\n        alert_text: \u041e\u0436\u0438\u0434\u0430\u0435\u043c\u044b\u0439 \u0442\u0435\u043a\u0441\u0442 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f.\n\n    Raises:\n        AssertionError: \u0415\u0441\u043b\u0438 \u0442\u0435\u043a\u0441\u0442 \u043d\u0435 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u043e\u0436\u0438\u0434\u0430\u0435\u043c\u043e\u043c\u0443.\n    \"\"\"\n\n    self.text.check_have_text(alert_text,\n                              \"Unexpected message in alert window\")\n
    "},{"location":"components/alert_component/#components.alert_component.AlertComponent.get_alert_type","title":"get_alert_type()","text":"

    \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0442\u0438\u043f alert-\u043e\u043a\u043d\u0430.

    Returns:

    Name Type Description str str

    \u0422\u0438\u043f alert-\u043e\u043a\u043d\u0430.

    Raises:

    Type Description ValueError

    \u0415\u0441\u043b\u0438 \u043f\u043e\u043b\u0443\u0447\u0435\u043d \u043d\u0435\u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u043c\u044b\u0439 \u0442\u0438\u043f alert-\u043e\u043a\u043d\u0430.

    Source code in components\\alert_component.py
    def get_alert_type(self) -> str:\n    \"\"\"\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0442\u0438\u043f alert-\u043e\u043a\u043d\u0430.\n\n    Returns:\n        str: \u0422\u0438\u043f alert-\u043e\u043a\u043d\u0430.\n\n    Raises:\n        ValueError: \u0415\u0441\u043b\u0438 \u043f\u043e\u043b\u0443\u0447\u0435\u043d \u043d\u0435\u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u043c\u044b\u0439 \u0442\u0438\u043f alert-\u043e\u043a\u043d\u0430.\n    \"\"\"\n\n    class_attr = self.page.get_by_role(\"alert\").locator('>div').get_attribute('class')\n\n    alert_type = None\n    if 'v-alert' in class_attr:\n        alert_type = class_attr.replace(\"v-alert \", \"\")\n\n    alert_types = [\"error\", \"success\", \"info\", \"warning\"]\n    if alert_type not in alert_types:\n        raise ValueError(\"Unsupported type of alert window\")\n\n    return alert_type\n
    "},{"location":"components/alert_component/#components.alert_component.AlertComponent.get_text","title":"get_text()","text":"

    \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0442\u0435\u043a\u0441\u0442 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0438\u0437 alert-\u043e\u043a\u043d\u0430.

    Returns:

    Name Type Description str str

    \u0422\u0435\u043a\u0441\u0442 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f.

    Source code in components\\alert_component.py
    def get_text(self) -> str:\n    \"\"\"\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0442\u0435\u043a\u0441\u0442 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0438\u0437 alert-\u043e\u043a\u043d\u0430.\n\n    Returns:\n        str: \u0422\u0435\u043a\u0441\u0442 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f.\n    \"\"\"\n\n    return self.text.get_text(0)\n
    "},{"location":"components/base_component/","title":"BaseComponent","text":"

    \u0411\u0430\u0437\u043e\u0432\u044b\u0439 \u043c\u043e\u0434\u0443\u043b\u044c \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430\u043c\u0438 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b.

    \u0421\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0431\u0430\u0437\u043e\u0432\u044b\u0439 \u043a\u043b\u0430\u0441\u0441 \u0434\u043b\u044f \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0441 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u043c\u0438 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u0447\u0435\u0440\u0435\u0437 Playwright.

    "},{"location":"components/base_component/#components.base_component.BaseComponent","title":"BaseComponent","text":"

    \u0411\u0430\u0437\u043e\u0432\u044b\u0439 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u043c\u0438 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b.

    \u041f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u043e\u0431\u0449\u0438\u0435 \u043c\u0435\u0442\u043e\u0434\u044b \u0434\u043b\u044f \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0441 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u043c\u0438: - \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u043b\u043e\u043a\u0430\u0442\u043e\u0440\u043e\u0432 - \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 - \u0440\u0430\u0431\u043e\u0442\u0430 \u0441 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u043e\u0439

    Source code in components\\base_component.py
    class BaseComponent:\n    \"\"\"\u0411\u0430\u0437\u043e\u0432\u044b\u0439 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u043c\u0438 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b.\n\n    \u041f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u043e\u0431\u0449\u0438\u0435 \u043c\u0435\u0442\u043e\u0434\u044b \u0434\u043b\u044f \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0441 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u043c\u0438:\n    - \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u043b\u043e\u043a\u0430\u0442\u043e\u0440\u043e\u0432\n    - \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432\n    - \u0440\u0430\u0431\u043e\u0442\u0430 \u0441 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u043e\u0439\n    \"\"\"\n\n    def __init__(self, page: Page):\n        \"\"\"\u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0431\u0430\u0437\u043e\u0432\u043e\u0433\u043e \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430.\n\n        Args:\n            page: \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.\n        \"\"\"\n\n        self.page = page\n\n    # \u0414\u0435\u0439\u0441\u0442\u0432\u0438\u044f:\n    def get_locator(self, locator: str | Locator) -> Locator:\n        \"\"\"\u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u0430 Locator \u0438\u0437 \u0441\u0442\u0440\u043e\u043a\u0438 \u0438\u043b\u0438 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0433\u043e Locator.\n\n        Args:\n            locator: \u0441\u0442\u0440\u043e\u043a\u0430 \u0441 CSS/XPath \u0441\u0435\u043b\u0435\u043a\u0442\u043e\u0440\u043e\u043c \u0438\u043b\u0438 \u043e\u0431\u044a\u0435\u043a\u0442 Locator.\n\n        Returns:\n            Locator: \u043e\u0431\u044a\u0435\u043a\u0442 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u043c.\n\n        Raises:\n            TypeError: \u0435\u0441\u043b\u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u043d \u043d\u0435\u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u044b\u0439 \u0442\u0438\u043f \u043b\u043e\u043a\u0430\u0442\u043e\u0440\u0430.\n        \"\"\"\n\n        if isinstance(locator, Locator):\n            return locator\n        elif isinstance(locator, str):\n            return self.page.locator(locator)\n        else:\n            raise TypeError(\"locator value should be string type or Locator type\")\n\n    # \u0417\u0430\u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u043a\u043e\u0434 \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d \u0431\u0435\u0437 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439\n    # def wait_for_all_elements(self, locator: Locator, timeout=5000):\n    #     loc = self.get_locator(locator)\n    #     elements = self.page.locator(loc).all()\n    #\n    #     for element in elements:\n    #         self.page.locator(loc).wait_for(timeout=timeout)\n    #\n    #     return elements\n\n    # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0438:\n    def check_absence(self, locator: str | Locator, msg: str) -> None:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u044f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u043d\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435.\n\n        Args:\n            locator: \u043b\u043e\u043a\u0430\u0442\u043e\u0440 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 (\u0441\u0442\u0440\u043e\u043a\u0430 \u0438\u043b\u0438 \u043e\u0431\u044a\u0435\u043a\u0442 Locator).\n            msg: \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u043e\u0431 \u043e\u0448\u0438\u0431\u043a\u0435 \u043f\u0440\u0438 \u043d\u0435\u0443\u0434\u0430\u0447\u043d\u043e\u0439 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0435.\n\n        Raises:\n            AssertionError: \u0435\u0441\u043b\u0438 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0432\u0438\u0434\u0435\u043d \u043d\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435.\n        \"\"\"\n\n        loc = self.get_locator(locator)\n        expect(loc).to_be_hidden(timeout=12000), msg\n\n    def check_visibility(self, locator: str | Locator, msg: str) -> None:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u043d\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435.\n\n        Args:\n            locator: \u043b\u043e\u043a\u0430\u0442\u043e\u0440 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 (\u0441\u0442\u0440\u043e\u043a\u0430 \u0438\u043b\u0438 \u043e\u0431\u044a\u0435\u043a\u0442 Locator).\n            msg: \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u043e\u0431 \u043e\u0448\u0438\u0431\u043a\u0435 \u043f\u0440\u0438 \u043d\u0435\u0443\u0434\u0430\u0447\u043d\u043e\u0439 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0435.\n\n        Raises:\n            AssertionError: \u0435\u0441\u043b\u0438 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043d\u0435 \u0432\u0438\u0434\u0435\u043d \u043d\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435.\n        \"\"\"\n\n        loc = self.get_locator(locator)\n        expect(loc).to_be_visible(visible=True, timeout=12000), msg\n\n    def is_scrollable_vertically(self, locator: str | Locator) -> bool:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u0439 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0438 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430.\n\n        Args:\n            locator: \u043b\u043e\u043a\u0430\u0442\u043e\u0440 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430.\n\n        Returns:\n            bool: True \u0435\u0441\u043b\u0438 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u0438\u0442\u044c \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u043e.\n        \"\"\"\n\n        loc = self.get_locator(locator)\n        return loc.evaluate(\"el => el.scrollHeight > el.clientHeight\")\n\n    def is_scrollable_horizontally(self, locator: str | Locator) -> bool:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0433\u043e\u0440\u0438\u0437\u043e\u043d\u0442\u0430\u043b\u044c\u043d\u043e\u0439 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0438 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430.\n\n        Args:\n            locator: \u043b\u043e\u043a\u0430\u0442\u043e\u0440 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430.\n\n        Returns:\n            bool: True \u0435\u0441\u043b\u0438 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u0438\u0442\u044c \u0433\u043e\u0440\u0438\u0437\u043e\u043d\u0442\u0430\u043b\u044c\u043d\u043e.\n        \"\"\"\n\n        loc = self.get_locator(locator)\n        return loc.evaluate(\"el => el.scrollWidth > el.clientWidth\")\n\n    # \u041c\u0435\u0442\u043e\u0434\u044b \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0438:\n    def scroll_up(self, locator: str | Locator) -> None:\n        \"\"\"\u041f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0430 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0432\u0432\u0435\u0440\u0445.\n\n        Args:\n            locator: \u043b\u043e\u043a\u0430\u0442\u043e\u0440 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430.\n\n        Raises:\n            AssertionError: \u0435\u0441\u043b\u0438 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0430 \u043d\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0430 \u0434\u043e \u043a\u043e\u043d\u0446\u0430.\n        \"\"\"\n\n        loc = self.get_locator(locator)\n        loc.evaluate(\"el => el.scrollTo(0, 0)\")\n        loc.wait_for(timeout=2000)\n\n        # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043f\u043e\u0437\u0438\u0446\u0438\u0438 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0438\n        scroll_position = loc.evaluate(\"el => el.scrollTop\")\n        assert scroll_position == 0, \"Invalid postion after scroll up\"\n\n    def scroll_down(self, locator: str | Locator) -> None:\n        \"\"\"\u041f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0430 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0432\u043d\u0438\u0437.\n\n        Args:\n            locator: \u043b\u043e\u043a\u0430\u0442\u043e\u0440 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430.\n\n        Raises:\n            AssertionError: \u0435\u0441\u043b\u0438 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0430 \u043d\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0430 \u0434\u043e \u043a\u043e\u043d\u0446\u0430.\n        \"\"\"\n\n        loc = self.get_locator(locator)\n        loc.evaluate(\"el => el.scrollTo(0, el.scrollHeight)\")\n        loc.wait_for(timeout=2000)\n\n        # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043f\u043e\u0437\u0438\u0446\u0438\u0438 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0438\n        scroll_position = loc.evaluate(\"el => el.scrollTop\")\n        assert scroll_position > 0, \"Invalid postion after scroll down\"\n\n    def scroll_left(self, locator: str | Locator) -> None:\n        \"\"\"\u041f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0430 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0432\u043b\u0435\u0432\u043e.\n\n        Args:\n            locator: \u043b\u043e\u043a\u0430\u0442\u043e\u0440 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430.\n\n        Raises:\n            AssertionError: \u0435\u0441\u043b\u0438 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0430 \u043d\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0430 \u0434\u043e \u043a\u043e\u043d\u0446\u0430.\n        \"\"\"\n\n        loc = self.get_locator(locator)\n\n        loc.evaluate(\"el => el.scrollBy(-el.scrollWidth, 0)\")\n\n        loc.wait_for(timeout=2000)\n\n        # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043f\u043e\u0437\u0438\u0446\u0438\u0438 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0438\n        scroll_position = loc.evaluate(\"el => el.scrollLeft\")\n        assert scroll_position == 0, \"Invalid postion after scroll left\"\n\n    def scroll_right(self, locator: str | Locator) -> None:\n        \"\"\"\u041f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0430 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0432\u043f\u0440\u0430\u0432\u043e.\n\n        Args:\n            locator: \u043b\u043e\u043a\u0430\u0442\u043e\u0440 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430.\n\n        Raises:\n            AssertionError: \u0435\u0441\u043b\u0438 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0430 \u043d\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0430 \u0434\u043e \u043a\u043e\u043d\u0446\u0430.\n        \"\"\"\n\n        loc = self.get_locator(locator)\n\n        loc.evaluate(\"el => el.scrollBy(el.scrollWidth, 0)\")\n\n        loc.wait_for(timeout=2000)\n\n        # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043f\u043e\u0437\u0438\u0446\u0438\u0438 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0438\n        scroll_position = loc.evaluate(\"el => el.scrollLeft\")\n        max_scroll_x = loc.evaluate(\"el => el.scrollWidth - el.clientWidth\")\n        assert scroll_position >= max_scroll_x, \"Invalid postion after scroll right\"\n
    "},{"location":"components/base_component/#components.base_component.BaseComponent.__init__","title":"__init__(page)","text":"

    \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0431\u0430\u0437\u043e\u0432\u043e\u0433\u043e \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430.

    Parameters:

    Name Type Description Default page Page

    \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.

    required Source code in components\\base_component.py
    def __init__(self, page: Page):\n    \"\"\"\u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0431\u0430\u0437\u043e\u0432\u043e\u0433\u043e \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430.\n\n    Args:\n        page: \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.\n    \"\"\"\n\n    self.page = page\n
    "},{"location":"components/base_component/#components.base_component.BaseComponent.check_absence","title":"check_absence(locator, msg)","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u044f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u043d\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435.

    Parameters:

    Name Type Description Default locator str | Locator

    \u043b\u043e\u043a\u0430\u0442\u043e\u0440 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 (\u0441\u0442\u0440\u043e\u043a\u0430 \u0438\u043b\u0438 \u043e\u0431\u044a\u0435\u043a\u0442 Locator).

    required msg str

    \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u043e\u0431 \u043e\u0448\u0438\u0431\u043a\u0435 \u043f\u0440\u0438 \u043d\u0435\u0443\u0434\u0430\u0447\u043d\u043e\u0439 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0435.

    required

    Raises:

    Type Description AssertionError

    \u0435\u0441\u043b\u0438 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0432\u0438\u0434\u0435\u043d \u043d\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435.

    Source code in components\\base_component.py
    def check_absence(self, locator: str | Locator, msg: str) -> None:\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u044f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u043d\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435.\n\n    Args:\n        locator: \u043b\u043e\u043a\u0430\u0442\u043e\u0440 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 (\u0441\u0442\u0440\u043e\u043a\u0430 \u0438\u043b\u0438 \u043e\u0431\u044a\u0435\u043a\u0442 Locator).\n        msg: \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u043e\u0431 \u043e\u0448\u0438\u0431\u043a\u0435 \u043f\u0440\u0438 \u043d\u0435\u0443\u0434\u0430\u0447\u043d\u043e\u0439 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0435.\n\n    Raises:\n        AssertionError: \u0435\u0441\u043b\u0438 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0432\u0438\u0434\u0435\u043d \u043d\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435.\n    \"\"\"\n\n    loc = self.get_locator(locator)\n    expect(loc).to_be_hidden(timeout=12000), msg\n
    "},{"location":"components/base_component/#components.base_component.BaseComponent.check_visibility","title":"check_visibility(locator, msg)","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u043d\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435.

    Parameters:

    Name Type Description Default locator str | Locator

    \u043b\u043e\u043a\u0430\u0442\u043e\u0440 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 (\u0441\u0442\u0440\u043e\u043a\u0430 \u0438\u043b\u0438 \u043e\u0431\u044a\u0435\u043a\u0442 Locator).

    required msg str

    \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u043e\u0431 \u043e\u0448\u0438\u0431\u043a\u0435 \u043f\u0440\u0438 \u043d\u0435\u0443\u0434\u0430\u0447\u043d\u043e\u0439 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0435.

    required

    Raises:

    Type Description AssertionError

    \u0435\u0441\u043b\u0438 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043d\u0435 \u0432\u0438\u0434\u0435\u043d \u043d\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435.

    Source code in components\\base_component.py
    def check_visibility(self, locator: str | Locator, msg: str) -> None:\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u043d\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435.\n\n    Args:\n        locator: \u043b\u043e\u043a\u0430\u0442\u043e\u0440 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 (\u0441\u0442\u0440\u043e\u043a\u0430 \u0438\u043b\u0438 \u043e\u0431\u044a\u0435\u043a\u0442 Locator).\n        msg: \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u043e\u0431 \u043e\u0448\u0438\u0431\u043a\u0435 \u043f\u0440\u0438 \u043d\u0435\u0443\u0434\u0430\u0447\u043d\u043e\u0439 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0435.\n\n    Raises:\n        AssertionError: \u0435\u0441\u043b\u0438 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043d\u0435 \u0432\u0438\u0434\u0435\u043d \u043d\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435.\n    \"\"\"\n\n    loc = self.get_locator(locator)\n    expect(loc).to_be_visible(visible=True, timeout=12000), msg\n
    "},{"location":"components/base_component/#components.base_component.BaseComponent.get_locator","title":"get_locator(locator)","text":"

    \u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u0430 Locator \u0438\u0437 \u0441\u0442\u0440\u043e\u043a\u0438 \u0438\u043b\u0438 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0433\u043e Locator.

    Parameters:

    Name Type Description Default locator str | Locator

    \u0441\u0442\u0440\u043e\u043a\u0430 \u0441 CSS/XPath \u0441\u0435\u043b\u0435\u043a\u0442\u043e\u0440\u043e\u043c \u0438\u043b\u0438 \u043e\u0431\u044a\u0435\u043a\u0442 Locator.

    required

    Returns:

    Name Type Description Locator Locator

    \u043e\u0431\u044a\u0435\u043a\u0442 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u043c.

    Raises:

    Type Description TypeError

    \u0435\u0441\u043b\u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u043d \u043d\u0435\u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u044b\u0439 \u0442\u0438\u043f \u043b\u043e\u043a\u0430\u0442\u043e\u0440\u0430.

    Source code in components\\base_component.py
    def get_locator(self, locator: str | Locator) -> Locator:\n    \"\"\"\u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u0430 Locator \u0438\u0437 \u0441\u0442\u0440\u043e\u043a\u0438 \u0438\u043b\u0438 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0433\u043e Locator.\n\n    Args:\n        locator: \u0441\u0442\u0440\u043e\u043a\u0430 \u0441 CSS/XPath \u0441\u0435\u043b\u0435\u043a\u0442\u043e\u0440\u043e\u043c \u0438\u043b\u0438 \u043e\u0431\u044a\u0435\u043a\u0442 Locator.\n\n    Returns:\n        Locator: \u043e\u0431\u044a\u0435\u043a\u0442 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u043c.\n\n    Raises:\n        TypeError: \u0435\u0441\u043b\u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u043d \u043d\u0435\u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u044b\u0439 \u0442\u0438\u043f \u043b\u043e\u043a\u0430\u0442\u043e\u0440\u0430.\n    \"\"\"\n\n    if isinstance(locator, Locator):\n        return locator\n    elif isinstance(locator, str):\n        return self.page.locator(locator)\n    else:\n        raise TypeError(\"locator value should be string type or Locator type\")\n
    "},{"location":"components/base_component/#components.base_component.BaseComponent.is_scrollable_horizontally","title":"is_scrollable_horizontally(locator)","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0433\u043e\u0440\u0438\u0437\u043e\u043d\u0442\u0430\u043b\u044c\u043d\u043e\u0439 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0438 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430.

    Parameters:

    Name Type Description Default locator str | Locator

    \u043b\u043e\u043a\u0430\u0442\u043e\u0440 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430.

    required

    Returns:

    Name Type Description bool bool

    True \u0435\u0441\u043b\u0438 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u0438\u0442\u044c \u0433\u043e\u0440\u0438\u0437\u043e\u043d\u0442\u0430\u043b\u044c\u043d\u043e.

    Source code in components\\base_component.py
    def is_scrollable_horizontally(self, locator: str | Locator) -> bool:\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0433\u043e\u0440\u0438\u0437\u043e\u043d\u0442\u0430\u043b\u044c\u043d\u043e\u0439 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0438 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430.\n\n    Args:\n        locator: \u043b\u043e\u043a\u0430\u0442\u043e\u0440 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430.\n\n    Returns:\n        bool: True \u0435\u0441\u043b\u0438 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u0438\u0442\u044c \u0433\u043e\u0440\u0438\u0437\u043e\u043d\u0442\u0430\u043b\u044c\u043d\u043e.\n    \"\"\"\n\n    loc = self.get_locator(locator)\n    return loc.evaluate(\"el => el.scrollWidth > el.clientWidth\")\n
    "},{"location":"components/base_component/#components.base_component.BaseComponent.is_scrollable_vertically","title":"is_scrollable_vertically(locator)","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u0439 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0438 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430.

    Parameters:

    Name Type Description Default locator str | Locator

    \u043b\u043e\u043a\u0430\u0442\u043e\u0440 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430.

    required

    Returns:

    Name Type Description bool bool

    True \u0435\u0441\u043b\u0438 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u0438\u0442\u044c \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u043e.

    Source code in components\\base_component.py
    def is_scrollable_vertically(self, locator: str | Locator) -> bool:\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u0439 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0438 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430.\n\n    Args:\n        locator: \u043b\u043e\u043a\u0430\u0442\u043e\u0440 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430.\n\n    Returns:\n        bool: True \u0435\u0441\u043b\u0438 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u0438\u0442\u044c \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u043e.\n    \"\"\"\n\n    loc = self.get_locator(locator)\n    return loc.evaluate(\"el => el.scrollHeight > el.clientHeight\")\n
    "},{"location":"components/base_component/#components.base_component.BaseComponent.scroll_down","title":"scroll_down(locator)","text":"

    \u041f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0430 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0432\u043d\u0438\u0437.

    Parameters:

    Name Type Description Default locator str | Locator

    \u043b\u043e\u043a\u0430\u0442\u043e\u0440 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430.

    required

    Raises:

    Type Description AssertionError

    \u0435\u0441\u043b\u0438 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0430 \u043d\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0430 \u0434\u043e \u043a\u043e\u043d\u0446\u0430.

    Source code in components\\base_component.py
    def scroll_down(self, locator: str | Locator) -> None:\n    \"\"\"\u041f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0430 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0432\u043d\u0438\u0437.\n\n    Args:\n        locator: \u043b\u043e\u043a\u0430\u0442\u043e\u0440 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430.\n\n    Raises:\n        AssertionError: \u0435\u0441\u043b\u0438 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0430 \u043d\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0430 \u0434\u043e \u043a\u043e\u043d\u0446\u0430.\n    \"\"\"\n\n    loc = self.get_locator(locator)\n    loc.evaluate(\"el => el.scrollTo(0, el.scrollHeight)\")\n    loc.wait_for(timeout=2000)\n\n    # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043f\u043e\u0437\u0438\u0446\u0438\u0438 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0438\n    scroll_position = loc.evaluate(\"el => el.scrollTop\")\n    assert scroll_position > 0, \"Invalid postion after scroll down\"\n
    "},{"location":"components/base_component/#components.base_component.BaseComponent.scroll_left","title":"scroll_left(locator)","text":"

    \u041f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0430 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0432\u043b\u0435\u0432\u043e.

    Parameters:

    Name Type Description Default locator str | Locator

    \u043b\u043e\u043a\u0430\u0442\u043e\u0440 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430.

    required

    Raises:

    Type Description AssertionError

    \u0435\u0441\u043b\u0438 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0430 \u043d\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0430 \u0434\u043e \u043a\u043e\u043d\u0446\u0430.

    Source code in components\\base_component.py
    def scroll_left(self, locator: str | Locator) -> None:\n    \"\"\"\u041f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0430 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0432\u043b\u0435\u0432\u043e.\n\n    Args:\n        locator: \u043b\u043e\u043a\u0430\u0442\u043e\u0440 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430.\n\n    Raises:\n        AssertionError: \u0435\u0441\u043b\u0438 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0430 \u043d\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0430 \u0434\u043e \u043a\u043e\u043d\u0446\u0430.\n    \"\"\"\n\n    loc = self.get_locator(locator)\n\n    loc.evaluate(\"el => el.scrollBy(-el.scrollWidth, 0)\")\n\n    loc.wait_for(timeout=2000)\n\n    # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043f\u043e\u0437\u0438\u0446\u0438\u0438 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0438\n    scroll_position = loc.evaluate(\"el => el.scrollLeft\")\n    assert scroll_position == 0, \"Invalid postion after scroll left\"\n
    "},{"location":"components/base_component/#components.base_component.BaseComponent.scroll_right","title":"scroll_right(locator)","text":"

    \u041f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0430 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0432\u043f\u0440\u0430\u0432\u043e.

    Parameters:

    Name Type Description Default locator str | Locator

    \u043b\u043e\u043a\u0430\u0442\u043e\u0440 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430.

    required

    Raises:

    Type Description AssertionError

    \u0435\u0441\u043b\u0438 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0430 \u043d\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0430 \u0434\u043e \u043a\u043e\u043d\u0446\u0430.

    Source code in components\\base_component.py
    def scroll_right(self, locator: str | Locator) -> None:\n    \"\"\"\u041f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0430 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0432\u043f\u0440\u0430\u0432\u043e.\n\n    Args:\n        locator: \u043b\u043e\u043a\u0430\u0442\u043e\u0440 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430.\n\n    Raises:\n        AssertionError: \u0435\u0441\u043b\u0438 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0430 \u043d\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0430 \u0434\u043e \u043a\u043e\u043d\u0446\u0430.\n    \"\"\"\n\n    loc = self.get_locator(locator)\n\n    loc.evaluate(\"el => el.scrollBy(el.scrollWidth, 0)\")\n\n    loc.wait_for(timeout=2000)\n\n    # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043f\u043e\u0437\u0438\u0446\u0438\u0438 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0438\n    scroll_position = loc.evaluate(\"el => el.scrollLeft\")\n    max_scroll_x = loc.evaluate(\"el => el.scrollWidth - el.clientWidth\")\n    assert scroll_position >= max_scroll_x, \"Invalid postion after scroll right\"\n
    "},{"location":"components/base_component/#components.base_component.BaseComponent.scroll_up","title":"scroll_up(locator)","text":"

    \u041f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0430 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0432\u0432\u0435\u0440\u0445.

    Parameters:

    Name Type Description Default locator str | Locator

    \u043b\u043e\u043a\u0430\u0442\u043e\u0440 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430.

    required

    Raises:

    Type Description AssertionError

    \u0435\u0441\u043b\u0438 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0430 \u043d\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0430 \u0434\u043e \u043a\u043e\u043d\u0446\u0430.

    Source code in components\\base_component.py
    def scroll_up(self, locator: str | Locator) -> None:\n    \"\"\"\u041f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0430 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0432\u0432\u0435\u0440\u0445.\n\n    Args:\n        locator: \u043b\u043e\u043a\u0430\u0442\u043e\u0440 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430.\n\n    Raises:\n        AssertionError: \u0435\u0441\u043b\u0438 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0430 \u043d\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0430 \u0434\u043e \u043a\u043e\u043d\u0446\u0430.\n    \"\"\"\n\n    loc = self.get_locator(locator)\n    loc.evaluate(\"el => el.scrollTo(0, 0)\")\n    loc.wait_for(timeout=2000)\n\n    # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043f\u043e\u0437\u0438\u0446\u0438\u0438 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0438\n    scroll_position = loc.evaluate(\"el => el.scrollTop\")\n    assert scroll_position == 0, \"Invalid postion after scroll up\"\n
    "},{"location":"components/card_component/","title":"CardComponent","text":"

    \u041c\u043e\u0434\u0443\u043b\u044c \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430 \u043a\u0430\u0440\u0442\u043e\u0447\u043a\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.

    \u0421\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043a\u043b\u0430\u0441\u0441 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u043a\u0430\u0440\u0442\u043e\u0447\u043a\u043e\u0439 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0447\u0435\u0440\u0435\u0437 Playwright.

    "},{"location":"components/card_component/#components.card_component.CardComponent","title":"CardComponent","text":"

    Bases: BaseComponent

    \u041a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 \u043a\u0430\u0440\u0442\u043e\u0447\u043a\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.

    \u041f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u043c\u0435\u0442\u043e\u0434\u044b \u0434\u043b\u044f \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0441 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u043c\u0438 \u043a\u0430\u0440\u0442\u043e\u0447\u043a\u0438.

    Source code in components\\card_component.py
    class CardComponent(BaseComponent):\n    \"\"\"\u041a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 \u043a\u0430\u0440\u0442\u043e\u0447\u043a\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\n\n    \u041f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u043c\u0435\u0442\u043e\u0434\u044b \u0434\u043b\u044f \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0441 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u043c\u0438 \u043a\u0430\u0440\u0442\u043e\u0447\u043a\u0438.\n    \"\"\"\n\n    def __init__(self, page: Page):\n        \"\"\"\u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 \u043a\u0430\u0440\u0442\u043e\u0447\u043a\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\n\n        Args:\n            page: \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.\n        \"\"\"\n\n        super().__init__(page)\n\n        self.logout_button = Button(\n            page,\n            page.get_by_role(\"button\", name=\"\u0412\u044b\u0439\u0442\u0438\"),\n            \"logout button\"\n        )\n\n    # \u0414\u0435\u0439\u0441\u0442\u0432\u0438\u044f:\n    def click_logout_button(self):\n        \"\"\"\u041d\u0430\u0436\u0438\u043c\u0430\u0435\u0442 \u043a\u043d\u043e\u043f\u043a\u0443 \u0432\u044b\u0445\u043e\u0434\u0430 \u0438\u0437 \u0441\u0438\u0441\u0442\u0435\u043c\u044b.\n\n        \u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u043a\u043b\u0438\u043a \u043f\u043e \u043a\u043d\u043e\u043f\u043a\u0435 '\u0412\u044b\u0439\u0442\u0438' \u0432 \u043a\u0430\u0440\u0442\u043e\u0447\u043a\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\n        \"\"\"\n\n        self.logout_button.click()\n
    "},{"location":"components/card_component/#components.card_component.CardComponent.__init__","title":"__init__(page)","text":"

    \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 \u043a\u0430\u0440\u0442\u043e\u0447\u043a\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.

    Parameters:

    Name Type Description Default page Page

    \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.

    required Source code in components\\card_component.py
    def __init__(self, page: Page):\n    \"\"\"\u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 \u043a\u0430\u0440\u0442\u043e\u0447\u043a\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\n\n    Args:\n        page: \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.\n    \"\"\"\n\n    super().__init__(page)\n\n    self.logout_button = Button(\n        page,\n        page.get_by_role(\"button\", name=\"\u0412\u044b\u0439\u0442\u0438\"),\n        \"logout button\"\n    )\n
    "},{"location":"components/card_component/#components.card_component.CardComponent.click_logout_button","title":"click_logout_button()","text":"

    \u041d\u0430\u0436\u0438\u043c\u0430\u0435\u0442 \u043a\u043d\u043e\u043f\u043a\u0443 \u0432\u044b\u0445\u043e\u0434\u0430 \u0438\u0437 \u0441\u0438\u0441\u0442\u0435\u043c\u044b.

    \u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u043a\u043b\u0438\u043a \u043f\u043e \u043a\u043d\u043e\u043f\u043a\u0435 '\u0412\u044b\u0439\u0442\u0438' \u0432 \u043a\u0430\u0440\u0442\u043e\u0447\u043a\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.

    Source code in components\\card_component.py
    def click_logout_button(self):\n    \"\"\"\u041d\u0430\u0436\u0438\u043c\u0430\u0435\u0442 \u043a\u043d\u043e\u043f\u043a\u0443 \u0432\u044b\u0445\u043e\u0434\u0430 \u0438\u0437 \u0441\u0438\u0441\u0442\u0435\u043c\u044b.\n\n    \u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u043a\u043b\u0438\u043a \u043f\u043e \u043a\u043d\u043e\u043f\u043a\u0435 '\u0412\u044b\u0439\u0442\u0438' \u0432 \u043a\u0430\u0440\u0442\u043e\u0447\u043a\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\n    \"\"\"\n\n    self.logout_button.click()\n
    "},{"location":"components/confirm_component/","title":"ConfirmComponent","text":"

    \u041c\u043e\u0434\u0443\u043b\u044c \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430 \u043e\u043a\u043d\u0430 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u044f \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439.

    \u0421\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043a\u043b\u0430\u0441\u0441 ConfirmComponent \u0434\u043b\u044f \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0441 \u043e\u043a\u043d\u043e\u043c \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u044f, \u0432\u043a\u043b\u044e\u0447\u0430\u044f \u043a\u043d\u043e\u043f\u043a\u0438 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u044f, \u043e\u0442\u043c\u0435\u043d\u044b \u0438 \u0437\u0430\u043a\u0440\u044b\u0442\u0438\u044f, \u0430 \u0442\u0430\u043a\u0436\u0435 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0442\u0435\u043a\u0441\u0442\u0430.

    "},{"location":"components/confirm_component/#components.confirm_component.ConfirmComponent","title":"ConfirmComponent","text":"

    Bases: BaseComponent

    \u041a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 \u043e\u043a\u043d\u0430 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u044f \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439.

    Source code in components\\confirm_component.py
    class ConfirmComponent(BaseComponent):\n    \"\"\"\u041a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 \u043e\u043a\u043d\u0430 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u044f \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439.\"\"\"\n\n    def __init__(self, page: Page, cancel_button_text: str, allow_button_text: str):\n        \"\"\"\u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430.\n\n        Args:\n            page: \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.\n            cancel_button_text: \u0422\u0435\u043a\u0441\u0442 \u043a\u043d\u043e\u043f\u043a\u0438 \u043e\u0442\u043c\u0435\u043d\u044b.\n            allow_button_text: \u0422\u0435\u043a\u0441\u0442 \u043a\u043d\u043e\u043f\u043a\u0438 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u044f.\n        \"\"\"\n\n        super().__init__(page)\n\n        self.title = Text(page, ConfirmLocators.TITLE, \"confirm title\")\n        self.text = Text(page, ConfirmLocators.TEXT, \"confirm text\")\n\n        self.close_button = Button(page, ConfirmLocators.BUTTON_CLOSE, \"confirm close button\")\n        self.cancel_button = Button(\n            page,\n            page.get_by_role(\"button\", name=cancel_button_text).first,\n            \"confirm cancel button\"\n        )\n        self.allow_button = Button(\n            page,\n            page.get_by_role(\"button\", name=allow_button_text).first,\n            \"confirm allow button\"\n        )\n\n    # \u0414\u0435\u0439\u0441\u0442\u0432\u0438\u044f:\n    def click_allow_button(self) -> None:\n        \"\"\"\u041d\u0430\u0436\u0438\u043c\u0430\u0435\u0442 \u043a\u043d\u043e\u043f\u043a\u0443 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u044f \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f.\"\"\"\n\n        self.allow_button.click()\n\n    def click_cancel_button(self) -> None:\n        \"\"\"\u041d\u0430\u0436\u0438\u043c\u0430\u0435\u0442 \u043a\u043d\u043e\u043f\u043a\u0443 \u043e\u0442\u043c\u0435\u043d\u044b \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f.\"\"\"\n\n        self.cancel_button.click()\n\n    def click_close_button(self) -> None:\n        \"\"\"\u041d\u0430\u0436\u0438\u043c\u0430\u0435\u0442 \u043a\u043d\u043e\u043f\u043a\u0443 \u0437\u0430\u043a\u0440\u044b\u0442\u0438\u044f \u043e\u043a\u043d\u0430 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u044f.\"\"\"\n\n        self.close_button.click()\n\n    def scroll_window_left(self) -> None:\n        \"\"\"\u041f\u0440\u043e\u043a\u0440\u0443\u0447\u0438\u0432\u0430\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u043e\u043a\u043d\u0430 \u0432\u043b\u0435\u0432\u043e.\"\"\"\n\n        self.scroll_left(ConfirmLocators.CONFIRM)\n\n    def scroll_window_right(self) -> None:\n        \"\"\"\u041f\u0440\u043e\u043a\u0440\u0443\u0447\u0438\u0432\u0430\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u043e\u043a\u043d\u0430 \u0432\u043f\u0440\u0430\u0432\u043e.\"\"\"\n\n        self.scroll_right(ConfirmLocators.CONFIRM)\n\n    # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0438:\n    def check_title(self, title: str, msg: str) -> None:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0442\u0435\u043a\u0441\u0442 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430 \u043e\u043a\u043d\u0430 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u044f.\n\n        Args:\n            title: \u041e\u0436\u0438\u0434\u0430\u0435\u043c\u044b\u0439 \u0442\u0435\u043a\u0441\u0442 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430.\n            msg: \u0421\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u043f\u0440\u0438 \u043e\u0448\u0438\u0431\u043a\u0435.\n        \"\"\"\n\n        self.title.check_have_text(title, msg)\n\n    def check_text(self, text: str, msg: str) -> None:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0442\u0435\u043a\u0441\u0442 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0432 \u043e\u043a\u043d\u0435 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u044f.\n\n        Args:\n            text: \u041e\u0436\u0438\u0434\u0430\u0435\u043c\u044b\u0439 \u0442\u0435\u043a\u0441\u0442 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f.\n            msg: \u0421\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u043f\u0440\u0438 \u043e\u0448\u0438\u0431\u043a\u0435.\n        \"\"\"\n\n        self.text.check_have_text(text, msg)\n\n    def check_window_horizontal_scrolling(self) -> bool:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0433\u043e\u0440\u0438\u0437\u043e\u043d\u0442\u0430\u043b\u044c\u043d\u043e\u0439 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0438 \u043e\u043a\u043d\u0430.\"\"\"\n\n        return self.is_scrollable_horizontally(ConfirmLocators.CONFIRM)\n\n    def should_be_cancel_button(self) -> None:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0438 \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u043a\u043d\u043e\u043f\u043a\u0438 \u041e\u0442\u043c\u0435\u043d\u044b.\"\"\"\n        self.cancel_button.check_visibility(\"Cancel button is missing\")\n\n    def should_be_allow_button(self) -> None:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0438 \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u043a\u043d\u043e\u043f\u043a\u0438 \u041f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u044f.\"\"\"\n        self.allow_button.check_visibility(\"Allow button is missing\")\n\n    def check_cancel_button_text(self, expected_text: str) -> None:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0442\u0435\u043a\u0441\u0442 \u043a\u043d\u043e\u043f\u043a\u0438 \u041e\u0442\u043c\u0435\u043d\u044b.\"\"\"\n        self.cancel_button.check_have_text(expected_text, \"Cancel button text doesn't match expected\")\n\n    def check_allow_button_text(self, expected_text: str) -> None:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0442\u0435\u043a\u0441\u0442 \u043a\u043d\u043e\u043f\u043a\u0438 \u041f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u044f.\"\"\"\n        self.allow_button.check_have_text(expected_text, \"Allow button text doesn't match expected\")\n
    "},{"location":"components/confirm_component/#components.confirm_component.ConfirmComponent.__init__","title":"__init__(page, cancel_button_text, allow_button_text)","text":"

    \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430.

    Parameters:

    Name Type Description Default page Page

    \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.

    required cancel_button_text str

    \u0422\u0435\u043a\u0441\u0442 \u043a\u043d\u043e\u043f\u043a\u0438 \u043e\u0442\u043c\u0435\u043d\u044b.

    required allow_button_text str

    \u0422\u0435\u043a\u0441\u0442 \u043a\u043d\u043e\u043f\u043a\u0438 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u044f.

    required Source code in components\\confirm_component.py
    def __init__(self, page: Page, cancel_button_text: str, allow_button_text: str):\n    \"\"\"\u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430.\n\n    Args:\n        page: \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.\n        cancel_button_text: \u0422\u0435\u043a\u0441\u0442 \u043a\u043d\u043e\u043f\u043a\u0438 \u043e\u0442\u043c\u0435\u043d\u044b.\n        allow_button_text: \u0422\u0435\u043a\u0441\u0442 \u043a\u043d\u043e\u043f\u043a\u0438 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u044f.\n    \"\"\"\n\n    super().__init__(page)\n\n    self.title = Text(page, ConfirmLocators.TITLE, \"confirm title\")\n    self.text = Text(page, ConfirmLocators.TEXT, \"confirm text\")\n\n    self.close_button = Button(page, ConfirmLocators.BUTTON_CLOSE, \"confirm close button\")\n    self.cancel_button = Button(\n        page,\n        page.get_by_role(\"button\", name=cancel_button_text).first,\n        \"confirm cancel button\"\n    )\n    self.allow_button = Button(\n        page,\n        page.get_by_role(\"button\", name=allow_button_text).first,\n        \"confirm allow button\"\n    )\n
    "},{"location":"components/confirm_component/#components.confirm_component.ConfirmComponent.check_allow_button_text","title":"check_allow_button_text(expected_text)","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0442\u0435\u043a\u0441\u0442 \u043a\u043d\u043e\u043f\u043a\u0438 \u041f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u044f.

    Source code in components\\confirm_component.py
    def check_allow_button_text(self, expected_text: str) -> None:\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0442\u0435\u043a\u0441\u0442 \u043a\u043d\u043e\u043f\u043a\u0438 \u041f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u044f.\"\"\"\n    self.allow_button.check_have_text(expected_text, \"Allow button text doesn't match expected\")\n
    "},{"location":"components/confirm_component/#components.confirm_component.ConfirmComponent.check_cancel_button_text","title":"check_cancel_button_text(expected_text)","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0442\u0435\u043a\u0441\u0442 \u043a\u043d\u043e\u043f\u043a\u0438 \u041e\u0442\u043c\u0435\u043d\u044b.

    Source code in components\\confirm_component.py
    def check_cancel_button_text(self, expected_text: str) -> None:\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0442\u0435\u043a\u0441\u0442 \u043a\u043d\u043e\u043f\u043a\u0438 \u041e\u0442\u043c\u0435\u043d\u044b.\"\"\"\n    self.cancel_button.check_have_text(expected_text, \"Cancel button text doesn't match expected\")\n
    "},{"location":"components/confirm_component/#components.confirm_component.ConfirmComponent.check_text","title":"check_text(text, msg)","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0442\u0435\u043a\u0441\u0442 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0432 \u043e\u043a\u043d\u0435 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u044f.

    Parameters:

    Name Type Description Default text str

    \u041e\u0436\u0438\u0434\u0430\u0435\u043c\u044b\u0439 \u0442\u0435\u043a\u0441\u0442 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f.

    required msg str

    \u0421\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u043f\u0440\u0438 \u043e\u0448\u0438\u0431\u043a\u0435.

    required Source code in components\\confirm_component.py
    def check_text(self, text: str, msg: str) -> None:\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0442\u0435\u043a\u0441\u0442 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0432 \u043e\u043a\u043d\u0435 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u044f.\n\n    Args:\n        text: \u041e\u0436\u0438\u0434\u0430\u0435\u043c\u044b\u0439 \u0442\u0435\u043a\u0441\u0442 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f.\n        msg: \u0421\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u043f\u0440\u0438 \u043e\u0448\u0438\u0431\u043a\u0435.\n    \"\"\"\n\n    self.text.check_have_text(text, msg)\n
    "},{"location":"components/confirm_component/#components.confirm_component.ConfirmComponent.check_title","title":"check_title(title, msg)","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0442\u0435\u043a\u0441\u0442 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430 \u043e\u043a\u043d\u0430 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u044f.

    Parameters:

    Name Type Description Default title str

    \u041e\u0436\u0438\u0434\u0430\u0435\u043c\u044b\u0439 \u0442\u0435\u043a\u0441\u0442 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430.

    required msg str

    \u0421\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u043f\u0440\u0438 \u043e\u0448\u0438\u0431\u043a\u0435.

    required Source code in components\\confirm_component.py
    def check_title(self, title: str, msg: str) -> None:\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0442\u0435\u043a\u0441\u0442 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430 \u043e\u043a\u043d\u0430 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u044f.\n\n    Args:\n        title: \u041e\u0436\u0438\u0434\u0430\u0435\u043c\u044b\u0439 \u0442\u0435\u043a\u0441\u0442 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430.\n        msg: \u0421\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u043f\u0440\u0438 \u043e\u0448\u0438\u0431\u043a\u0435.\n    \"\"\"\n\n    self.title.check_have_text(title, msg)\n
    "},{"location":"components/confirm_component/#components.confirm_component.ConfirmComponent.check_window_horizontal_scrolling","title":"check_window_horizontal_scrolling()","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0433\u043e\u0440\u0438\u0437\u043e\u043d\u0442\u0430\u043b\u044c\u043d\u043e\u0439 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0438 \u043e\u043a\u043d\u0430.

    Source code in components\\confirm_component.py
    def check_window_horizontal_scrolling(self) -> bool:\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0433\u043e\u0440\u0438\u0437\u043e\u043d\u0442\u0430\u043b\u044c\u043d\u043e\u0439 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0438 \u043e\u043a\u043d\u0430.\"\"\"\n\n    return self.is_scrollable_horizontally(ConfirmLocators.CONFIRM)\n
    "},{"location":"components/confirm_component/#components.confirm_component.ConfirmComponent.click_allow_button","title":"click_allow_button()","text":"

    \u041d\u0430\u0436\u0438\u043c\u0430\u0435\u0442 \u043a\u043d\u043e\u043f\u043a\u0443 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u044f \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f.

    Source code in components\\confirm_component.py
    def click_allow_button(self) -> None:\n    \"\"\"\u041d\u0430\u0436\u0438\u043c\u0430\u0435\u0442 \u043a\u043d\u043e\u043f\u043a\u0443 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u044f \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f.\"\"\"\n\n    self.allow_button.click()\n
    "},{"location":"components/confirm_component/#components.confirm_component.ConfirmComponent.click_cancel_button","title":"click_cancel_button()","text":"

    \u041d\u0430\u0436\u0438\u043c\u0430\u0435\u0442 \u043a\u043d\u043e\u043f\u043a\u0443 \u043e\u0442\u043c\u0435\u043d\u044b \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f.

    Source code in components\\confirm_component.py
    def click_cancel_button(self) -> None:\n    \"\"\"\u041d\u0430\u0436\u0438\u043c\u0430\u0435\u0442 \u043a\u043d\u043e\u043f\u043a\u0443 \u043e\u0442\u043c\u0435\u043d\u044b \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f.\"\"\"\n\n    self.cancel_button.click()\n
    "},{"location":"components/confirm_component/#components.confirm_component.ConfirmComponent.click_close_button","title":"click_close_button()","text":"

    \u041d\u0430\u0436\u0438\u043c\u0430\u0435\u0442 \u043a\u043d\u043e\u043f\u043a\u0443 \u0437\u0430\u043a\u0440\u044b\u0442\u0438\u044f \u043e\u043a\u043d\u0430 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u044f.

    Source code in components\\confirm_component.py
    def click_close_button(self) -> None:\n    \"\"\"\u041d\u0430\u0436\u0438\u043c\u0430\u0435\u0442 \u043a\u043d\u043e\u043f\u043a\u0443 \u0437\u0430\u043a\u0440\u044b\u0442\u0438\u044f \u043e\u043a\u043d\u0430 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u044f.\"\"\"\n\n    self.close_button.click()\n
    "},{"location":"components/confirm_component/#components.confirm_component.ConfirmComponent.scroll_window_left","title":"scroll_window_left()","text":"

    \u041f\u0440\u043e\u043a\u0440\u0443\u0447\u0438\u0432\u0430\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u043e\u043a\u043d\u0430 \u0432\u043b\u0435\u0432\u043e.

    Source code in components\\confirm_component.py
    def scroll_window_left(self) -> None:\n    \"\"\"\u041f\u0440\u043e\u043a\u0440\u0443\u0447\u0438\u0432\u0430\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u043e\u043a\u043d\u0430 \u0432\u043b\u0435\u0432\u043e.\"\"\"\n\n    self.scroll_left(ConfirmLocators.CONFIRM)\n
    "},{"location":"components/confirm_component/#components.confirm_component.ConfirmComponent.scroll_window_right","title":"scroll_window_right()","text":"

    \u041f\u0440\u043e\u043a\u0440\u0443\u0447\u0438\u0432\u0430\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u043e\u043a\u043d\u0430 \u0432\u043f\u0440\u0430\u0432\u043e.

    Source code in components\\confirm_component.py
    def scroll_window_right(self) -> None:\n    \"\"\"\u041f\u0440\u043e\u043a\u0440\u0443\u0447\u0438\u0432\u0430\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u043e\u043a\u043d\u0430 \u0432\u043f\u0440\u0430\u0432\u043e.\"\"\"\n\n    self.scroll_right(ConfirmLocators.CONFIRM)\n
    "},{"location":"components/confirm_component/#components.confirm_component.ConfirmComponent.should_be_allow_button","title":"should_be_allow_button()","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0438 \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u043a\u043d\u043e\u043f\u043a\u0438 \u041f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u044f.

    Source code in components\\confirm_component.py
    def should_be_allow_button(self) -> None:\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0438 \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u043a\u043d\u043e\u043f\u043a\u0438 \u041f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u044f.\"\"\"\n    self.allow_button.check_visibility(\"Allow button is missing\")\n
    "},{"location":"components/confirm_component/#components.confirm_component.ConfirmComponent.should_be_cancel_button","title":"should_be_cancel_button()","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0438 \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u043a\u043d\u043e\u043f\u043a\u0438 \u041e\u0442\u043c\u0435\u043d\u044b.

    Source code in components\\confirm_component.py
    def should_be_cancel_button(self) -> None:\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0438 \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u043a\u043d\u043e\u043f\u043a\u0438 \u041e\u0442\u043c\u0435\u043d\u044b.\"\"\"\n    self.cancel_button.check_visibility(\"Cancel button is missing\")\n
    "},{"location":"components/dropdown_list_component/","title":"DropdownList","text":"

    \u041c\u043e\u0434\u0443\u043b\u044c dropdown_list_component \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043a\u043b\u0430\u0441\u0441 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0432\u044b\u043f\u0430\u0434\u0430\u044e\u0449\u0438\u043c\u0438 \u0441\u043f\u0438\u0441\u043a\u0430\u043c\u0438.

    \u041a\u043b\u0430\u0441\u0441 DropdownList \u043d\u0430\u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u0431\u0430\u0437\u043e\u0432\u044b\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b BaseComponent \u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u043c\u0435\u0442\u043e\u0434\u044b \u0434\u043b\u044f \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0441 \u0432\u044b\u043f\u0430\u0434\u0430\u044e\u0449\u0438\u043c\u0438 \u0441\u043f\u0438\u0441\u043a\u0430\u043c\u0438 \u043d\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435.

    "},{"location":"components/dropdown_list_component/#components.dropdown_list_component.DropdownList","title":"DropdownList","text":"

    Bases: BaseComponent

    \u041a\u043b\u0430\u0441\u0441 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0432\u044b\u043f\u0430\u0434\u0430\u044e\u0449\u0438\u043c\u0438 \u0441\u043f\u0438\u0441\u043a\u0430\u043c\u0438.

    \u041d\u0430\u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c BaseElement \u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u0447\u043d\u044b\u0435 \u043c\u0435\u0442\u043e\u0434\u044b \u0434\u043b\u044f \u0432\u044b\u0431\u043e\u0440\u0430 \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0441\u043f\u0438\u0441\u043a\u0430.

    Source code in components\\dropdown_list_component.py
    class DropdownList(BaseComponent):\n    \"\"\"\u041a\u043b\u0430\u0441\u0441 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0432\u044b\u043f\u0430\u0434\u0430\u044e\u0449\u0438\u043c\u0438 \u0441\u043f\u0438\u0441\u043a\u0430\u043c\u0438.\n\n    \u041d\u0430\u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c BaseElement \u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u0447\u043d\u044b\u0435\n    \u043c\u0435\u0442\u043e\u0434\u044b \u0434\u043b\u044f \u0432\u044b\u0431\u043e\u0440\u0430 \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0441\u043f\u0438\u0441\u043a\u0430.\n    \"\"\"\n\n    def __init__(self, page: Page):\n        \"\"\"\u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 \u0432\u044b\u043f\u0430\u0434\u0430\u044e\u0449\u0435\u0433\u043e \u0441\u043f\u0438\u0441\u043a\u0430.\n\n        Args:\n           page: \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.\n        \"\"\"\n\n        super().__init__(page)\n\n    # \u0414\u0435\u0439\u0441\u0442\u0432\u0438\u044f:\n    def click_item_with_text(self, text: str) -> None:\n        \"\"\"\u0412\u044b\u0431\u0438\u0440\u0430\u0435\u0442 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0441\u043f\u0438\u0441\u043a\u0430 \u043f\u043e \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u043e\u043c\u0443 \u0442\u0435\u043a\u0441\u0442\u0443.\n\n        Args:\n            text (str): \u0422\u0435\u043a\u0441\u0442 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0434\u043b\u044f \u0432\u044b\u0431\u043e\u0440\u0430.\n        \"\"\"\n\n        element = self.page.get_by_role(\"listitem\").filter(has_text=text)\n        if element.count() > 1:\n            rtext = f\"^{text}$\"\n            element = self.page.get_by_role(\"listitem\").filter(has_text=re.compile(rtext))\n        element.click()\n\n    def get_item_names(self, locator: str | Locator) -> list[str]:\n        \"\"\"\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0442\u0435\u043a\u0441\u0442\u044b \u0432\u0441\u0435\u0445 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u043f\u043e \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u043e\u043c\u0443 \u043b\u043e\u043a\u0430\u0442\u043e\u0440\u0443.\n\n        Args:\n            locator: \u041b\u043e\u043a\u0430\u0442\u043e\u0440 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0438\u043b\u0438 \u0441\u0442\u0440\u043e\u043a\u0430 \u0441 CSS/XPath.\n\n        Returns:\n            \u0421\u043f\u0438\u0441\u043e\u043a \u0442\u0435\u043a\u0441\u0442\u043e\u0432 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432.\n        \"\"\"\n\n        loc = self.get_locator(locator)\n        texts = loc.all_inner_texts()\n        return texts[0].splitlines()\n\n    def scroll_until_end(self, locator: str | Locator) -> None:\n        \"\"\"\n        \u0421\u043a\u0440\u043e\u043b\u043b\u0438\u0442 \u0441\u043f\u0438\u0441\u043e\u043a \u0434\u043e \u0442\u0435\u0445 \u043f\u043e\u0440, \u043f\u043e\u043a\u0430 \u043d\u0435 \u043f\u0435\u0440\u0435\u0441\u0442\u0430\u043d\u0443\u0442 \u043f\u043e\u0434\u0433\u0440\u0443\u0436\u0430\u0442\u044c\u0441\u044f \u043d\u043e\u0432\u044b\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b.\n\n        Args:\n            locator: \u041b\u043e\u043a\u0430\u0442\u043e\u0440 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0438\u043b\u0438 \u0441\u0442\u0440\u043e\u043a\u0430 \u0441 CSS/XPath.\n        \"\"\"\n\n        loc = self.get_locator(locator)\n\n        items_count = 0\n        attempts = 0\n        max_attempts = 3\n        last_item_name = \"\"\n\n        while attempts < max_attempts:\n            self.page.wait_for_timeout(300)\n\n            item_names = self.get_item_names(loc)\n            current_count = len(item_names)\n\n            if current_count == items_count:\n                attempts += 1\n            else:\n                items_count = current_count\n                attempts = 0\n\n            last_item_name = item_names[current_count-1]\n            element = self.page.get_by_role(\"listitem\").filter(has_text=last_item_name)\n            element.scroll_into_view_if_needed()\n\n        self.page.wait_for_timeout(300)\n        self.check_item_with_text(last_item_name)\n\n    # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0438:\n    def check_item_with_text(self, text: str) -> None:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0438 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u043e\u0441\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0441\u043f\u0438\u0441\u043a\u0430.\n\n        Args:\n            text (str): \u0422\u0435\u043a\u0441\u0442 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0434\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438.\n\n        Raises:\n            AssertionError: \u0415\u0441\u043b\u0438 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u0438\u043b\u0438 \u043d\u0435\u0434\u043e\u0441\u0442\u0443\u043f\u0435\u043d.\n        \"\"\"\n\n        element = self.page.get_by_role(\"listitem\").filter(has_text=text)\n        if element.count() > 1:\n            rtext = f\"^{text}$\"\n            element = self.page.get_by_role(\"listitem\").filter(has_text=re.compile(rtext))\n        enabled = element.is_enabled()\n        if not enabled:\n            assert False, f\"Dropdown list item '{text}' is missing or disabled\"\n\n    def check_vertical_scrolling(self, locator: str | Locator) -> bool:\n        \"\"\"\n        \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0441\u043a\u0440\u043e\u043b\u043b\u0438\u043d\u0433\u0430 \u0441\u043f\u0438\u0441\u043a\u0430.\n\n        Args:\n            locator: \u041b\u043e\u043a\u0430\u0442\u043e\u0440 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0438\u043b\u0438 \u0441\u0442\u0440\u043e\u043a\u0430 \u0441 CSS/XPath.\n\n        Returns:\n            True \u0438\u043b\u0438 False \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0432 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u0441\u043a\u0440\u043e\u043b\u043b\u0438\u0440\u0443\u0435\u043c\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a \u0438\u043b\u0438 \u043d\u0435\u0442.\n        \"\"\"\n\n        loc = self.get_locator(locator)\n\n        is_scrollable_vertically = self.is_scrollable_vertically(loc)\n        if  is_scrollable_vertically:\n            self.scroll_until_end(loc)\n\n            item_names = self.get_item_names(loc)\n            first_item_name = item_names[0]\n\n            self.scroll_up(loc)\n            self.page.wait_for_timeout(300)\n            self.check_item_with_text(first_item_name)\n\n        return is_scrollable_vertically\n
    "},{"location":"components/dropdown_list_component/#components.dropdown_list_component.DropdownList.__init__","title":"__init__(page)","text":"

    \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 \u0432\u044b\u043f\u0430\u0434\u0430\u044e\u0449\u0435\u0433\u043e \u0441\u043f\u0438\u0441\u043a\u0430.

    Parameters:

    Name Type Description Default page Page

    \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.

    required Source code in components\\dropdown_list_component.py
    def __init__(self, page: Page):\n    \"\"\"\u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 \u0432\u044b\u043f\u0430\u0434\u0430\u044e\u0449\u0435\u0433\u043e \u0441\u043f\u0438\u0441\u043a\u0430.\n\n    Args:\n       page: \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.\n    \"\"\"\n\n    super().__init__(page)\n
    "},{"location":"components/dropdown_list_component/#components.dropdown_list_component.DropdownList.check_item_with_text","title":"check_item_with_text(text)","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0438 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u043e\u0441\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0441\u043f\u0438\u0441\u043a\u0430.

    Parameters:

    Name Type Description Default text str

    \u0422\u0435\u043a\u0441\u0442 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0434\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438.

    required

    Raises:

    Type Description AssertionError

    \u0415\u0441\u043b\u0438 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u0438\u043b\u0438 \u043d\u0435\u0434\u043e\u0441\u0442\u0443\u043f\u0435\u043d.

    Source code in components\\dropdown_list_component.py
    def check_item_with_text(self, text: str) -> None:\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0438 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u043e\u0441\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0441\u043f\u0438\u0441\u043a\u0430.\n\n    Args:\n        text (str): \u0422\u0435\u043a\u0441\u0442 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0434\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438.\n\n    Raises:\n        AssertionError: \u0415\u0441\u043b\u0438 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u0438\u043b\u0438 \u043d\u0435\u0434\u043e\u0441\u0442\u0443\u043f\u0435\u043d.\n    \"\"\"\n\n    element = self.page.get_by_role(\"listitem\").filter(has_text=text)\n    if element.count() > 1:\n        rtext = f\"^{text}$\"\n        element = self.page.get_by_role(\"listitem\").filter(has_text=re.compile(rtext))\n    enabled = element.is_enabled()\n    if not enabled:\n        assert False, f\"Dropdown list item '{text}' is missing or disabled\"\n
    "},{"location":"components/dropdown_list_component/#components.dropdown_list_component.DropdownList.check_vertical_scrolling","title":"check_vertical_scrolling(locator)","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0441\u043a\u0440\u043e\u043b\u043b\u0438\u043d\u0433\u0430 \u0441\u043f\u0438\u0441\u043a\u0430.

    Parameters:

    Name Type Description Default locator str | Locator

    \u041b\u043e\u043a\u0430\u0442\u043e\u0440 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0438\u043b\u0438 \u0441\u0442\u0440\u043e\u043a\u0430 \u0441 CSS/XPath.

    required

    Returns:

    Type Description bool

    True \u0438\u043b\u0438 False \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0432 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u0441\u043a\u0440\u043e\u043b\u043b\u0438\u0440\u0443\u0435\u043c\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a \u0438\u043b\u0438 \u043d\u0435\u0442.

    Source code in components\\dropdown_list_component.py
    def check_vertical_scrolling(self, locator: str | Locator) -> bool:\n    \"\"\"\n    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0441\u043a\u0440\u043e\u043b\u043b\u0438\u043d\u0433\u0430 \u0441\u043f\u0438\u0441\u043a\u0430.\n\n    Args:\n        locator: \u041b\u043e\u043a\u0430\u0442\u043e\u0440 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0438\u043b\u0438 \u0441\u0442\u0440\u043e\u043a\u0430 \u0441 CSS/XPath.\n\n    Returns:\n        True \u0438\u043b\u0438 False \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0432 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u0441\u043a\u0440\u043e\u043b\u043b\u0438\u0440\u0443\u0435\u043c\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a \u0438\u043b\u0438 \u043d\u0435\u0442.\n    \"\"\"\n\n    loc = self.get_locator(locator)\n\n    is_scrollable_vertically = self.is_scrollable_vertically(loc)\n    if  is_scrollable_vertically:\n        self.scroll_until_end(loc)\n\n        item_names = self.get_item_names(loc)\n        first_item_name = item_names[0]\n\n        self.scroll_up(loc)\n        self.page.wait_for_timeout(300)\n        self.check_item_with_text(first_item_name)\n\n    return is_scrollable_vertically\n
    "},{"location":"components/dropdown_list_component/#components.dropdown_list_component.DropdownList.click_item_with_text","title":"click_item_with_text(text)","text":"

    \u0412\u044b\u0431\u0438\u0440\u0430\u0435\u0442 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0441\u043f\u0438\u0441\u043a\u0430 \u043f\u043e \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u043e\u043c\u0443 \u0442\u0435\u043a\u0441\u0442\u0443.

    Parameters:

    Name Type Description Default text str

    \u0422\u0435\u043a\u0441\u0442 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0434\u043b\u044f \u0432\u044b\u0431\u043e\u0440\u0430.

    required Source code in components\\dropdown_list_component.py
    def click_item_with_text(self, text: str) -> None:\n    \"\"\"\u0412\u044b\u0431\u0438\u0440\u0430\u0435\u0442 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0441\u043f\u0438\u0441\u043a\u0430 \u043f\u043e \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u043e\u043c\u0443 \u0442\u0435\u043a\u0441\u0442\u0443.\n\n    Args:\n        text (str): \u0422\u0435\u043a\u0441\u0442 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0434\u043b\u044f \u0432\u044b\u0431\u043e\u0440\u0430.\n    \"\"\"\n\n    element = self.page.get_by_role(\"listitem\").filter(has_text=text)\n    if element.count() > 1:\n        rtext = f\"^{text}$\"\n        element = self.page.get_by_role(\"listitem\").filter(has_text=re.compile(rtext))\n    element.click()\n
    "},{"location":"components/dropdown_list_component/#components.dropdown_list_component.DropdownList.get_item_names","title":"get_item_names(locator)","text":"

    \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0442\u0435\u043a\u0441\u0442\u044b \u0432\u0441\u0435\u0445 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u043f\u043e \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u043e\u043c\u0443 \u043b\u043e\u043a\u0430\u0442\u043e\u0440\u0443.

    Parameters:

    Name Type Description Default locator str | Locator

    \u041b\u043e\u043a\u0430\u0442\u043e\u0440 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0438\u043b\u0438 \u0441\u0442\u0440\u043e\u043a\u0430 \u0441 CSS/XPath.

    required

    Returns:

    Type Description list[str]

    \u0421\u043f\u0438\u0441\u043e\u043a \u0442\u0435\u043a\u0441\u0442\u043e\u0432 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432.

    Source code in components\\dropdown_list_component.py
    def get_item_names(self, locator: str | Locator) -> list[str]:\n    \"\"\"\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0442\u0435\u043a\u0441\u0442\u044b \u0432\u0441\u0435\u0445 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u043f\u043e \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u043e\u043c\u0443 \u043b\u043e\u043a\u0430\u0442\u043e\u0440\u0443.\n\n    Args:\n        locator: \u041b\u043e\u043a\u0430\u0442\u043e\u0440 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0438\u043b\u0438 \u0441\u0442\u0440\u043e\u043a\u0430 \u0441 CSS/XPath.\n\n    Returns:\n        \u0421\u043f\u0438\u0441\u043e\u043a \u0442\u0435\u043a\u0441\u0442\u043e\u0432 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432.\n    \"\"\"\n\n    loc = self.get_locator(locator)\n    texts = loc.all_inner_texts()\n    return texts[0].splitlines()\n
    "},{"location":"components/dropdown_list_component/#components.dropdown_list_component.DropdownList.scroll_until_end","title":"scroll_until_end(locator)","text":"

    \u0421\u043a\u0440\u043e\u043b\u043b\u0438\u0442 \u0441\u043f\u0438\u0441\u043e\u043a \u0434\u043e \u0442\u0435\u0445 \u043f\u043e\u0440, \u043f\u043e\u043a\u0430 \u043d\u0435 \u043f\u0435\u0440\u0435\u0441\u0442\u0430\u043d\u0443\u0442 \u043f\u043e\u0434\u0433\u0440\u0443\u0436\u0430\u0442\u044c\u0441\u044f \u043d\u043e\u0432\u044b\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b.

    Parameters:

    Name Type Description Default locator str | Locator

    \u041b\u043e\u043a\u0430\u0442\u043e\u0440 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0438\u043b\u0438 \u0441\u0442\u0440\u043e\u043a\u0430 \u0441 CSS/XPath.

    required Source code in components\\dropdown_list_component.py
    def scroll_until_end(self, locator: str | Locator) -> None:\n    \"\"\"\n    \u0421\u043a\u0440\u043e\u043b\u043b\u0438\u0442 \u0441\u043f\u0438\u0441\u043e\u043a \u0434\u043e \u0442\u0435\u0445 \u043f\u043e\u0440, \u043f\u043e\u043a\u0430 \u043d\u0435 \u043f\u0435\u0440\u0435\u0441\u0442\u0430\u043d\u0443\u0442 \u043f\u043e\u0434\u0433\u0440\u0443\u0436\u0430\u0442\u044c\u0441\u044f \u043d\u043e\u0432\u044b\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b.\n\n    Args:\n        locator: \u041b\u043e\u043a\u0430\u0442\u043e\u0440 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0438\u043b\u0438 \u0441\u0442\u0440\u043e\u043a\u0430 \u0441 CSS/XPath.\n    \"\"\"\n\n    loc = self.get_locator(locator)\n\n    items_count = 0\n    attempts = 0\n    max_attempts = 3\n    last_item_name = \"\"\n\n    while attempts < max_attempts:\n        self.page.wait_for_timeout(300)\n\n        item_names = self.get_item_names(loc)\n        current_count = len(item_names)\n\n        if current_count == items_count:\n            attempts += 1\n        else:\n            items_count = current_count\n            attempts = 0\n\n        last_item_name = item_names[current_count-1]\n        element = self.page.get_by_role(\"listitem\").filter(has_text=last_item_name)\n        element.scroll_into_view_if_needed()\n\n    self.page.wait_for_timeout(300)\n    self.check_item_with_text(last_item_name)\n
    "},{"location":"components/eventbar_component/","title":"EventPanelComponent","text":"

    \u041c\u043e\u0434\u0443\u043b\u044c \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430 \u043f\u0430\u043d\u0435\u043b\u0438 \u0441\u043e\u0431\u044b\u0442\u0438\u0439. \u0421\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043a\u043b\u0430\u0441\u0441 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u043c\u0438 \u043f\u0430\u043d\u0435\u043b\u0438.

    "},{"location":"components/eventbar_component/#components.eventbar_component.EventPanelComponent","title":"EventPanelComponent","text":"

    Bases: BaseComponent

    \u041a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 \u043f\u0430\u043d\u0435\u043b\u0438 \u0441\u043e\u0431\u044b\u0442\u0438\u0439. \u041f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u043c\u0435\u0442\u043e\u0434\u044b \u0434\u043b\u044f \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0441 \u043d\u0435\u0439.

    Source code in components\\eventbar_component.py
    class EventPanelComponent(BaseComponent):\n    \"\"\"\u041a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 \u043f\u0430\u043d\u0435\u043b\u0438 \u0441\u043e\u0431\u044b\u0442\u0438\u0439. \u041f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u043c\u0435\u0442\u043e\u0434\u044b \u0434\u043b\u044f \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0441 \u043d\u0435\u0439.\"\"\"\n\n    def __init__(self, page: Page):\n        \"\"\"\u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 \u043f\u0430\u043d\u0435\u043b\u0438 \u0441\u043e\u0431\u044b\u0442\u0438\u0439.\n\n        Args:\n            page: \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.\n        \"\"\"\n\n        super().__init__(page)\n\n        self.states_tab = TabButton(page, self.page.locator(EventPanelLocators.TAB_STATES), \"states_tab\")\n        self.actions_tab = TabButton(page, self.page.locator(EventPanelLocators.TAB_ACTIONS), \"actions_tab\")\n        self.events_tab = TabButton(page, self.page.locator(EventPanelLocators.TAB_EVENTS), \"events_tab\")\n        self.maintenance_tab = TabButton(page, self.page.locator(EventPanelLocators.TAB_MAINTENANCE), \"maintenance_tab\")\n        self.system_log_tab = TabButton(page, self.page.locator(EventPanelLocators.TAB_SYSTEM_LOG), \"system_log_tab\")\n\n        self.unknown_reason_button = TooltipButton(page, self.page.locator(EventPanelLocators.BUTTONS_EVENT).nth(0), \"unknown_reason_button\")\n        self.warning_button = TooltipButton(page, self.page.locator(EventPanelLocators.BUTTONS_EVENT).nth(1), \"warning_button\")\n        self.damage_button = TooltipButton(page, self.page.locator(EventPanelLocators.BUTTONS_EVENT).nth(2), \"damage_button\")\n        self.failure_button = TooltipButton(page, self.page.locator(EventPanelLocators.BUTTONS_EVENT).nth(3), \"failure_button\")\n\n        buttons_service_locators = self.page.locator(EventPanelLocators.BUTTONS_SERVICE).get_by_role(\"button\").all()\n        self.search_button = Button(page, buttons_service_locators[0], \"search_button\")\n        self.user_button = Button(page, buttons_service_locators[1], \"user_button\")\n\n        self.user_card = UserCard(page)\n\n    # \u0414\u0435\u0439\u0441\u0442\u0432\u0438\u044f:\n    def click_expand_less_button(self) -> None:\n        \"\"\"\u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u043d\u0430\u0436\u0430\u0442\u0438\u0435 \u043a\u043d\u043e\u043f\u043a\u0438 \u0433\u0430\u043b\u043e\u0447\u043a\u0430 \u0432\u0432\u0435\u0440\u0445.\"\"\"\n\n        button_locator = self.page.locator(EventPanelLocators.TAB_EXPAND_BUTTONS).\\\n                         get_by_role(\"button\").filter(has_text='expand_less')\n        button_locator.click()\n\n    def click_expand_more_button(self) -> None:\n        \"\"\"\u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u043d\u0430\u0436\u0430\u0442\u0438\u0435 \u043a\u043d\u043e\u043f\u043a\u0438 \u0433\u0430\u043b\u043e\u0447\u043a\u0430 \u0432\u043d\u0438\u0437.\"\"\"\n\n        button_locator = self.page.locator(EventPanelLocators.TAB_EXPAND_BUTTONS).\\\n                         get_by_role(\"button\").filter(has_text='expand_more')\n        button_locator.click()\n\n    def click_user_button(self) -> UserCard:\n        \"\"\"\u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u043d\u0430\u0436\u0430\u0442\u0438\u0435 \u043a\u043d\u043e\u043f\u043a\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\"\"\"\n\n        self.should_be_user_button()\n        self.user_button.click()\n        return self.user_card\n\n    def do_logout(self) -> None:\n        \"\"\"\u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u0432\u044b\u0445\u043e\u0434 \u0438\u0437 \u0441\u0438\u0441\u0442\u0435\u043c\u044b.\"\"\"\n\n        user_card = self.click_user_button()\n        user_card.click_logout_button()\n\n    def get_event_tooltip_texts(self) -> []:\n        \"\"\"\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0441\u043f\u0438\u0441\u043e\u043a \u0442\u0435\u043a\u0441\u0442\u043e\u0432 \u0432\u0441\u043f\u043b\u044b\u0432\u0430\u044e\u0449\u0438\u0445 \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043e\u043a \u043a\u043d\u043e\u043f\u043e\u043a \u0441\u0447\u0435\u0442\u0447\u0438\u043a\u043e\u0432 \u0441\u043e\u0431\u044b\u0442\u0438\u0439.\"\"\"\n\n        tooltip_texts = []\n\n        tooltip_texts.append(self.unknown_reason_button.get_tooltip_text())\n        tooltip_texts.append(self.warning_button.get_tooltip_text())\n        tooltip_texts.append(self.damage_button.get_tooltip_text())\n        tooltip_texts.append(self.failure_button.get_tooltip_text())\n\n        return tooltip_texts\n\n    def get_event_button_values(self) -> {}:\n        \"\"\"\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043d\u0430\u0431\u043e\u0440 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u043a\u043d\u043e\u043f\u043e\u043a \u0441\u0447\u0435\u0442\u0447\u0438\u043a\u043e\u0432 \u0441\u043e\u0431\u044b\u0442\u0438\u0439.\"\"\"\n\n        event_buttons_texts = {}\n\n        event_buttons_texts['\u041d\u0435\u0438\u0437\u0432\u0435\u0441\u0442\u043d\u043e'] = self.unknown_reason_button.get_text(0)\n        event_buttons_texts['\u041f\u0440\u0435\u0434\u0443\u043f\u0440\u0435\u0436\u0434\u0435\u043d\u0438\u0435'] = self.warning_button.get_text(0)\n        event_buttons_texts['\u041f\u043e\u0432\u0440\u0435\u0436\u0434\u0435\u043d\u0438\u0435'] = self.damage_button.get_text(0)\n        event_buttons_texts['\u0410\u0432\u0430\u0440\u0438\u044f'] = self.failure_button.get_text(0)\n\n        return event_buttons_texts\n\n    def get_panel_position(self) -> str:\n        \"\"\"\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0442\u0435\u043a\u0443\u0449\u0435\u0435 \u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043f\u0430\u043d\u0435\u043b\u0438 \u0441\u043e\u0431\u044b\u0442\u0438\u0439 \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b: \"top\", \"center\",\"bottom\".\"\"\"\n\n        style_attr = self.page.locator(EventPanelLocators.AREA_EVENTS).get_attribute(\"style\")\n        position = \"bottom\"\n\n        if style_attr.find(\"display: none;\") == -1:\n            height = style_attr.replace(\"height: \",\"\").replace(\";\", \"\")\n            if height == \"100%\":\n                position = \"top\"\n            else:\n                position = \"center\"\n\n        return position\n\n    # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0438:\n    def check_expand_less_button(self) -> bool:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u043a\u043d\u043e\u043f\u043a\u0438 \u0433\u0430\u043b\u043e\u0447\u043a\u0430 \u0432\u0432\u0435\u0440\u0445.\"\"\"\n\n        try:\n            _ = self.page.locator(EventPanelLocators.TAB_EXPAND_BUTTONS).\\\n                          get_by_role(\"button\").filter(has_text='expand_less')\n        except TimeoutError:\n            return False\n        return True\n\n    def check_expand_more_button(self) -> bool:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u043a\u043d\u043e\u043f\u043a\u0438 \u0433\u0430\u043b\u043e\u0447\u043a\u0430 \u0432\u043d\u0438\u0437\"\"\"\n\n        try:\n            _ = self.page.locator(EventPanelLocators.TAB_EXPAND_BUTTONS).\\\n                          get_by_role(\"button\").filter(has_text='expand_more')\n        except TimeoutError:\n            return False\n        return True\n\n    def check_user_card_content(self):\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0438 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0441\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u043a\u0430\u0440\u0442\u043e\u0447\u043a\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\"\"\"\n\n        self.user_card.check_content()\n\n    def should_be_user_button(self) -> None:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u043a\u043d\u043e\u043f\u043a\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\"\"\"\n\n        self.user_button.check_visibility(\"User button is missing on event panel\")\n\n    def should_be_search_button(self) -> None:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u043a\u043d\u043e\u043f\u043a\u0438 \u043f\u043e\u0438\u0441\u043a\u0430.\"\"\"\n\n        self.search_button.check_visibility(\"Search button is missing on event panel\")\n\n    def should_be_tab_buttons(self) -> None:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0431\u043b\u043e\u043a\u0430 tab-\u043a\u043d\u043e\u043f\u043e\u043a \u0421\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f, \u0414\u0435\u0439\u0441\u0442\u0432\u0438\u044f, \u0421\u043e\u0431\u044b\u0442\u0438\u044f, \u041e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u043d\u0438\u0435, \u0421\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0439 \u0436\u0443\u0440\u043d\u0430\u043b.\"\"\"\n\n        self.states_tab.check_have_text('\u0421\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f', \"Tab button with text \u0421\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f is missing on event panel\")\n        self.actions_tab.check_have_text('\u0414\u0435\u0439\u0441\u0442\u0432\u0438\u044f',\"Tab button with text \u0414\u0435\u0439\u0441\u0442\u0432\u0438\u044f is missing on event panel\")\n        self.events_tab.check_have_text('\u0421\u043e\u0431\u044b\u0442\u0438\u044f', \"Tab button with text \u0421\u043e\u0431\u044b\u0442\u0438\u044f is missing on event panel\")\n        self.maintenance_tab.check_have_text('\u041e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u043d\u0438\u0435', \"Tab button with text \u041e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u043d\u0438\u0435 is missing on event panel\")\n        self.system_log_tab.check_have_text('\u0421\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0439 \u0436\u0443\u0440\u043d\u0430\u043b', \"Tab button with text \u0421\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0439 \u0436\u0443\u0440\u043d\u0430\u043b is missing on event panel\")\n\n    def should_be_event_buttons(self) -> None:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0431\u043b\u043e\u043a\u0430 \u043a\u043d\u043e\u043f\u043e\u043a-\u0441\u0447\u0435\u0442\u0447\u0438\u043a\u043e\u0432 \u0441\u043e\u0431\u044b\u0442\u0438\u0439.\"\"\"\n\n        self.unknown_reason_button.check_visibility(\"Unknown reason event button is missing on event panel\")\n        self.warning_button.check_visibility(\"Warning event button is missing on event panel\")\n        self.damage_button.check_visibility(\"Damage event button is missing on event panel\")\n        self.failure_button.check_visibility(\"Failure event button is missing on event panel\")\n
    "},{"location":"components/eventbar_component/#components.eventbar_component.EventPanelComponent.__init__","title":"__init__(page)","text":"

    \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 \u043f\u0430\u043d\u0435\u043b\u0438 \u0441\u043e\u0431\u044b\u0442\u0438\u0439.

    Parameters:

    Name Type Description Default page Page

    \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.

    required Source code in components\\eventbar_component.py
    def __init__(self, page: Page):\n    \"\"\"\u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 \u043f\u0430\u043d\u0435\u043b\u0438 \u0441\u043e\u0431\u044b\u0442\u0438\u0439.\n\n    Args:\n        page: \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.\n    \"\"\"\n\n    super().__init__(page)\n\n    self.states_tab = TabButton(page, self.page.locator(EventPanelLocators.TAB_STATES), \"states_tab\")\n    self.actions_tab = TabButton(page, self.page.locator(EventPanelLocators.TAB_ACTIONS), \"actions_tab\")\n    self.events_tab = TabButton(page, self.page.locator(EventPanelLocators.TAB_EVENTS), \"events_tab\")\n    self.maintenance_tab = TabButton(page, self.page.locator(EventPanelLocators.TAB_MAINTENANCE), \"maintenance_tab\")\n    self.system_log_tab = TabButton(page, self.page.locator(EventPanelLocators.TAB_SYSTEM_LOG), \"system_log_tab\")\n\n    self.unknown_reason_button = TooltipButton(page, self.page.locator(EventPanelLocators.BUTTONS_EVENT).nth(0), \"unknown_reason_button\")\n    self.warning_button = TooltipButton(page, self.page.locator(EventPanelLocators.BUTTONS_EVENT).nth(1), \"warning_button\")\n    self.damage_button = TooltipButton(page, self.page.locator(EventPanelLocators.BUTTONS_EVENT).nth(2), \"damage_button\")\n    self.failure_button = TooltipButton(page, self.page.locator(EventPanelLocators.BUTTONS_EVENT).nth(3), \"failure_button\")\n\n    buttons_service_locators = self.page.locator(EventPanelLocators.BUTTONS_SERVICE).get_by_role(\"button\").all()\n    self.search_button = Button(page, buttons_service_locators[0], \"search_button\")\n    self.user_button = Button(page, buttons_service_locators[1], \"user_button\")\n\n    self.user_card = UserCard(page)\n
    "},{"location":"components/eventbar_component/#components.eventbar_component.EventPanelComponent.check_expand_less_button","title":"check_expand_less_button()","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u043a\u043d\u043e\u043f\u043a\u0438 \u0433\u0430\u043b\u043e\u0447\u043a\u0430 \u0432\u0432\u0435\u0440\u0445.

    Source code in components\\eventbar_component.py
    def check_expand_less_button(self) -> bool:\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u043a\u043d\u043e\u043f\u043a\u0438 \u0433\u0430\u043b\u043e\u0447\u043a\u0430 \u0432\u0432\u0435\u0440\u0445.\"\"\"\n\n    try:\n        _ = self.page.locator(EventPanelLocators.TAB_EXPAND_BUTTONS).\\\n                      get_by_role(\"button\").filter(has_text='expand_less')\n    except TimeoutError:\n        return False\n    return True\n
    "},{"location":"components/eventbar_component/#components.eventbar_component.EventPanelComponent.check_expand_more_button","title":"check_expand_more_button()","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u043a\u043d\u043e\u043f\u043a\u0438 \u0433\u0430\u043b\u043e\u0447\u043a\u0430 \u0432\u043d\u0438\u0437

    Source code in components\\eventbar_component.py
    def check_expand_more_button(self) -> bool:\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u043a\u043d\u043e\u043f\u043a\u0438 \u0433\u0430\u043b\u043e\u0447\u043a\u0430 \u0432\u043d\u0438\u0437\"\"\"\n\n    try:\n        _ = self.page.locator(EventPanelLocators.TAB_EXPAND_BUTTONS).\\\n                      get_by_role(\"button\").filter(has_text='expand_more')\n    except TimeoutError:\n        return False\n    return True\n
    "},{"location":"components/eventbar_component/#components.eventbar_component.EventPanelComponent.check_user_card_content","title":"check_user_card_content()","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0438 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0441\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u043a\u0430\u0440\u0442\u043e\u0447\u043a\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.

    Source code in components\\eventbar_component.py
    def check_user_card_content(self):\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0438 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0441\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u043a\u0430\u0440\u0442\u043e\u0447\u043a\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\"\"\"\n\n    self.user_card.check_content()\n
    "},{"location":"components/eventbar_component/#components.eventbar_component.EventPanelComponent.click_expand_less_button","title":"click_expand_less_button()","text":"

    \u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u043d\u0430\u0436\u0430\u0442\u0438\u0435 \u043a\u043d\u043e\u043f\u043a\u0438 \u0433\u0430\u043b\u043e\u0447\u043a\u0430 \u0432\u0432\u0435\u0440\u0445.

    Source code in components\\eventbar_component.py
    def click_expand_less_button(self) -> None:\n    \"\"\"\u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u043d\u0430\u0436\u0430\u0442\u0438\u0435 \u043a\u043d\u043e\u043f\u043a\u0438 \u0433\u0430\u043b\u043e\u0447\u043a\u0430 \u0432\u0432\u0435\u0440\u0445.\"\"\"\n\n    button_locator = self.page.locator(EventPanelLocators.TAB_EXPAND_BUTTONS).\\\n                     get_by_role(\"button\").filter(has_text='expand_less')\n    button_locator.click()\n
    "},{"location":"components/eventbar_component/#components.eventbar_component.EventPanelComponent.click_expand_more_button","title":"click_expand_more_button()","text":"

    \u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u043d\u0430\u0436\u0430\u0442\u0438\u0435 \u043a\u043d\u043e\u043f\u043a\u0438 \u0433\u0430\u043b\u043e\u0447\u043a\u0430 \u0432\u043d\u0438\u0437.

    Source code in components\\eventbar_component.py
    def click_expand_more_button(self) -> None:\n    \"\"\"\u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u043d\u0430\u0436\u0430\u0442\u0438\u0435 \u043a\u043d\u043e\u043f\u043a\u0438 \u0433\u0430\u043b\u043e\u0447\u043a\u0430 \u0432\u043d\u0438\u0437.\"\"\"\n\n    button_locator = self.page.locator(EventPanelLocators.TAB_EXPAND_BUTTONS).\\\n                     get_by_role(\"button\").filter(has_text='expand_more')\n    button_locator.click()\n
    "},{"location":"components/eventbar_component/#components.eventbar_component.EventPanelComponent.click_user_button","title":"click_user_button()","text":"

    \u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u043d\u0430\u0436\u0430\u0442\u0438\u0435 \u043a\u043d\u043e\u043f\u043a\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.

    Source code in components\\eventbar_component.py
    def click_user_button(self) -> UserCard:\n    \"\"\"\u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u043d\u0430\u0436\u0430\u0442\u0438\u0435 \u043a\u043d\u043e\u043f\u043a\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\"\"\"\n\n    self.should_be_user_button()\n    self.user_button.click()\n    return self.user_card\n
    "},{"location":"components/eventbar_component/#components.eventbar_component.EventPanelComponent.do_logout","title":"do_logout()","text":"

    \u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u0432\u044b\u0445\u043e\u0434 \u0438\u0437 \u0441\u0438\u0441\u0442\u0435\u043c\u044b.

    Source code in components\\eventbar_component.py
    def do_logout(self) -> None:\n    \"\"\"\u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u0432\u044b\u0445\u043e\u0434 \u0438\u0437 \u0441\u0438\u0441\u0442\u0435\u043c\u044b.\"\"\"\n\n    user_card = self.click_user_button()\n    user_card.click_logout_button()\n
    "},{"location":"components/eventbar_component/#components.eventbar_component.EventPanelComponent.get_event_button_values","title":"get_event_button_values()","text":"

    \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043d\u0430\u0431\u043e\u0440 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u043a\u043d\u043e\u043f\u043e\u043a \u0441\u0447\u0435\u0442\u0447\u0438\u043a\u043e\u0432 \u0441\u043e\u0431\u044b\u0442\u0438\u0439.

    Source code in components\\eventbar_component.py
    def get_event_button_values(self) -> {}:\n    \"\"\"\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043d\u0430\u0431\u043e\u0440 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u043a\u043d\u043e\u043f\u043e\u043a \u0441\u0447\u0435\u0442\u0447\u0438\u043a\u043e\u0432 \u0441\u043e\u0431\u044b\u0442\u0438\u0439.\"\"\"\n\n    event_buttons_texts = {}\n\n    event_buttons_texts['\u041d\u0435\u0438\u0437\u0432\u0435\u0441\u0442\u043d\u043e'] = self.unknown_reason_button.get_text(0)\n    event_buttons_texts['\u041f\u0440\u0435\u0434\u0443\u043f\u0440\u0435\u0436\u0434\u0435\u043d\u0438\u0435'] = self.warning_button.get_text(0)\n    event_buttons_texts['\u041f\u043e\u0432\u0440\u0435\u0436\u0434\u0435\u043d\u0438\u0435'] = self.damage_button.get_text(0)\n    event_buttons_texts['\u0410\u0432\u0430\u0440\u0438\u044f'] = self.failure_button.get_text(0)\n\n    return event_buttons_texts\n
    "},{"location":"components/eventbar_component/#components.eventbar_component.EventPanelComponent.get_event_tooltip_texts","title":"get_event_tooltip_texts()","text":"

    \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0441\u043f\u0438\u0441\u043e\u043a \u0442\u0435\u043a\u0441\u0442\u043e\u0432 \u0432\u0441\u043f\u043b\u044b\u0432\u0430\u044e\u0449\u0438\u0445 \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043e\u043a \u043a\u043d\u043e\u043f\u043e\u043a \u0441\u0447\u0435\u0442\u0447\u0438\u043a\u043e\u0432 \u0441\u043e\u0431\u044b\u0442\u0438\u0439.

    Source code in components\\eventbar_component.py
    def get_event_tooltip_texts(self) -> []:\n    \"\"\"\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0441\u043f\u0438\u0441\u043e\u043a \u0442\u0435\u043a\u0441\u0442\u043e\u0432 \u0432\u0441\u043f\u043b\u044b\u0432\u0430\u044e\u0449\u0438\u0445 \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043e\u043a \u043a\u043d\u043e\u043f\u043e\u043a \u0441\u0447\u0435\u0442\u0447\u0438\u043a\u043e\u0432 \u0441\u043e\u0431\u044b\u0442\u0438\u0439.\"\"\"\n\n    tooltip_texts = []\n\n    tooltip_texts.append(self.unknown_reason_button.get_tooltip_text())\n    tooltip_texts.append(self.warning_button.get_tooltip_text())\n    tooltip_texts.append(self.damage_button.get_tooltip_text())\n    tooltip_texts.append(self.failure_button.get_tooltip_text())\n\n    return tooltip_texts\n
    "},{"location":"components/eventbar_component/#components.eventbar_component.EventPanelComponent.get_panel_position","title":"get_panel_position()","text":"

    \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0442\u0435\u043a\u0443\u0449\u0435\u0435 \u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043f\u0430\u043d\u0435\u043b\u0438 \u0441\u043e\u0431\u044b\u0442\u0438\u0439 \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b: \"top\", \"center\",\"bottom\".

    Source code in components\\eventbar_component.py
    def get_panel_position(self) -> str:\n    \"\"\"\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0442\u0435\u043a\u0443\u0449\u0435\u0435 \u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043f\u0430\u043d\u0435\u043b\u0438 \u0441\u043e\u0431\u044b\u0442\u0438\u0439 \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b: \"top\", \"center\",\"bottom\".\"\"\"\n\n    style_attr = self.page.locator(EventPanelLocators.AREA_EVENTS).get_attribute(\"style\")\n    position = \"bottom\"\n\n    if style_attr.find(\"display: none;\") == -1:\n        height = style_attr.replace(\"height: \",\"\").replace(\";\", \"\")\n        if height == \"100%\":\n            position = \"top\"\n        else:\n            position = \"center\"\n\n    return position\n
    "},{"location":"components/eventbar_component/#components.eventbar_component.EventPanelComponent.should_be_event_buttons","title":"should_be_event_buttons()","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0431\u043b\u043e\u043a\u0430 \u043a\u043d\u043e\u043f\u043e\u043a-\u0441\u0447\u0435\u0442\u0447\u0438\u043a\u043e\u0432 \u0441\u043e\u0431\u044b\u0442\u0438\u0439.

    Source code in components\\eventbar_component.py
    def should_be_event_buttons(self) -> None:\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0431\u043b\u043e\u043a\u0430 \u043a\u043d\u043e\u043f\u043e\u043a-\u0441\u0447\u0435\u0442\u0447\u0438\u043a\u043e\u0432 \u0441\u043e\u0431\u044b\u0442\u0438\u0439.\"\"\"\n\n    self.unknown_reason_button.check_visibility(\"Unknown reason event button is missing on event panel\")\n    self.warning_button.check_visibility(\"Warning event button is missing on event panel\")\n    self.damage_button.check_visibility(\"Damage event button is missing on event panel\")\n    self.failure_button.check_visibility(\"Failure event button is missing on event panel\")\n
    "},{"location":"components/eventbar_component/#components.eventbar_component.EventPanelComponent.should_be_search_button","title":"should_be_search_button()","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u043a\u043d\u043e\u043f\u043a\u0438 \u043f\u043e\u0438\u0441\u043a\u0430.

    Source code in components\\eventbar_component.py
    def should_be_search_button(self) -> None:\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u043a\u043d\u043e\u043f\u043a\u0438 \u043f\u043e\u0438\u0441\u043a\u0430.\"\"\"\n\n    self.search_button.check_visibility(\"Search button is missing on event panel\")\n
    "},{"location":"components/eventbar_component/#components.eventbar_component.EventPanelComponent.should_be_tab_buttons","title":"should_be_tab_buttons()","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0431\u043b\u043e\u043a\u0430 tab-\u043a\u043d\u043e\u043f\u043e\u043a \u0421\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f, \u0414\u0435\u0439\u0441\u0442\u0432\u0438\u044f, \u0421\u043e\u0431\u044b\u0442\u0438\u044f, \u041e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u043d\u0438\u0435, \u0421\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0439 \u0436\u0443\u0440\u043d\u0430\u043b.

    Source code in components\\eventbar_component.py
    def should_be_tab_buttons(self) -> None:\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0431\u043b\u043e\u043a\u0430 tab-\u043a\u043d\u043e\u043f\u043e\u043a \u0421\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f, \u0414\u0435\u0439\u0441\u0442\u0432\u0438\u044f, \u0421\u043e\u0431\u044b\u0442\u0438\u044f, \u041e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u043d\u0438\u0435, \u0421\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0439 \u0436\u0443\u0440\u043d\u0430\u043b.\"\"\"\n\n    self.states_tab.check_have_text('\u0421\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f', \"Tab button with text \u0421\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f is missing on event panel\")\n    self.actions_tab.check_have_text('\u0414\u0435\u0439\u0441\u0442\u0432\u0438\u044f',\"Tab button with text \u0414\u0435\u0439\u0441\u0442\u0432\u0438\u044f is missing on event panel\")\n    self.events_tab.check_have_text('\u0421\u043e\u0431\u044b\u0442\u0438\u044f', \"Tab button with text \u0421\u043e\u0431\u044b\u0442\u0438\u044f is missing on event panel\")\n    self.maintenance_tab.check_have_text('\u041e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u043d\u0438\u0435', \"Tab button with text \u041e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u043d\u0438\u0435 is missing on event panel\")\n    self.system_log_tab.check_have_text('\u0421\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0439 \u0436\u0443\u0440\u043d\u0430\u043b', \"Tab button with text \u0421\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0439 \u0436\u0443\u0440\u043d\u0430\u043b is missing on event panel\")\n
    "},{"location":"components/eventbar_component/#components.eventbar_component.EventPanelComponent.should_be_user_button","title":"should_be_user_button()","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u043a\u043d\u043e\u043f\u043a\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.

    Source code in components\\eventbar_component.py
    def should_be_user_button(self) -> None:\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u043a\u043d\u043e\u043f\u043a\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\"\"\"\n\n    self.user_button.check_visibility(\"User button is missing on event panel\")\n
    "},{"location":"components/json_container_component/","title":"JsonContainerComponent","text":"

    \u041c\u043e\u0434\u0443\u043b\u044c \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 JSON-\u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430\u043c\u0438 \u043d\u0430 \u0432\u0435\u0431-\u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0430\u0445.

    \u0421\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 \u0434\u043b\u044f \u0447\u0442\u0435\u043d\u0438\u044f \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 JSON-\u0434\u0430\u043d\u043d\u044b\u0445 \u0432 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430\u0445. \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 playwright \u0434\u043b\u044f \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0441 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u043c\u0438 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b.

    "},{"location":"components/json_container_component/#components.json_container_component.JsonContainerComponent","title":"JsonContainerComponent","text":"

    Bases: BaseComponent

    \u041a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 JSON-\u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u043d\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435.

    \u041f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u043c\u0435\u0442\u043e\u0434\u044b \u0447\u0442\u0435\u043d\u0438\u044f \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 JSON-\u0434\u0430\u043d\u043d\u044b\u0445 \u0432 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430\u0445.

    Source code in components\\json_container_component.py
    class JsonContainerComponent(BaseComponent):\n    \"\"\"\u041a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 JSON-\u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u043d\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435.\n\n    \u041f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u043c\u0435\u0442\u043e\u0434\u044b \u0447\u0442\u0435\u043d\u0438\u044f \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 JSON-\u0434\u0430\u043d\u043d\u044b\u0445 \u0432 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430\u0445.\n\n    \"\"\"\n\n    def __init__(self, page: Page) -> None:\n        \"\"\"\u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442 JSON-\u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440.\n\n        Args:\n            page: \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.\n        \"\"\"\n\n        super().__init__(page)\n\n\n    # \u0414\u0435\u0439\u0441\u0442\u0432\u0438\u044f:\n    def format_json_string(self, json_string: str) -> str:\n        \"\"\"\u0424\u043e\u0440\u043c\u0430\u0442\u0438\u0440\u0443\u0435\u0442 \u0441\u0442\u0440\u043e\u043a\u0443 JSON \u0434\u043b\u044f \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0433\u043e \u043f\u0430\u0440\u0441\u0438\u043d\u0433\u0430.\n\n        Args:\n            json_string: \u0421\u044b\u0440\u0430\u044f \u0441\u0442\u0440\u043e\u043a\u0430 \u0441 JSON-\u0434\u0430\u043d\u043d\u044b\u043c\u0438.\n\n        Returns:\n            str: \u041e\u0442\u0444\u043e\u0440\u043c\u0430\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u0430\u044f \u0441\u0442\u0440\u043e\u043a\u0430 JSON.\n        \"\"\"\n\n        lines = json_string.splitlines()\n        formatted_lines = []\n        stack = []  # \u0421\u0442\u0435\u043a \u0434\u043b\u044f \u043e\u0442\u0441\u043b\u0435\u0436\u0438\u0432\u0430\u043d\u0438\u044f \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u043e\u0441\u0442\u0438\n        current_indent = 0\n\n        for line in lines:\n            line = line.strip()\n            if not line:\n                continue\n\n            # \u041e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u043c \u0442\u0438\u043f \u0442\u0435\u043a\u0443\u0449\u0435\u0439 \u0441\u0442\u0440\u043e\u043a\u0438\n            if line in ['{', '[']:\n                # \u041d\u0430\u0447\u0430\u043b\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u0438\u043b\u0438 \u043c\u0430\u0441\u0441\u0438\u0432\u0430\n                formatted_lines.append('  ' * current_indent + line)\n                stack.append(line)\n                current_indent += 1\n            elif line in ['}', ']']:\n                # \u041a\u043e\u043d\u0435\u0446 \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u0438\u043b\u0438 \u043c\u0430\u0441\u0441\u0438\u0432\u0430\n                current_indent -= 1\n                if stack and stack[-1] in ['{', '[']:\n                    stack.pop()\n                formatted_lines.append('  ' * current_indent + line)\n            elif re.match(r'^\\d+:\\{', line):\n                # \u042d\u043b\u0435\u043c\u0435\u043d\u0442 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u0441 \u0438\u043d\u0434\u0435\u043a\u0441\u043e\u043c (0:{, 1:{, etc.)\n                # \u0423\u0431\u0438\u0440\u0430\u0435\u043c \u0438\u043d\u0434\u0435\u043a\u0441 \u0438 \u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u043c \u0442\u043e\u043b\u044c\u043a\u043e {\n                formatted_lines.append('  ' * current_indent + '{')\n                stack.append('{')\n                current_indent += 1\n            elif ':' in line:\n                # \u041f\u0430\u0440\u0430 \u043a\u043b\u044e\u0447:\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\n                key, value = line.split(':', 1)\n                key = key.strip()\n                value = value.strip()\n\n                # \u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u043a\u0430\u0432\u044b\u0447\u043a\u0438 \u043a \u043a\u043b\u044e\u0447\u0443 \u0435\u0441\u043b\u0438 \u0438\u0445 \u043d\u0435\u0442 (\u0432\u043a\u043b\u044e\u0447\u0430\u044f $)\n                if not (key.startswith('\"') and key.endswith('\"')):\n                    key = f'\"{key}\"'\n\n                # \u041e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439\n                if value in ['{', '[']:\n                    # \u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 - \u043d\u0430\u0447\u0430\u043b\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u0438\u043b\u0438 \u043c\u0430\u0441\u0441\u0438\u0432\u0430\n                    formatted_line = f'{key}: {value}'\n                    formatted_lines.append('  ' * current_indent + formatted_line)\n                    stack.append(value)\n                    current_indent += 1\n                elif value in ['}', ']']:\n                    # \u041d\u0435 \u0434\u043e\u043b\u0436\u043d\u043e \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442\u044c, \u043d\u043e \u043d\u0430 \u0432\u0441\u044f\u043a\u0438\u0439 \u0441\u043b\u0443\u0447\u0430\u0439\n                    current_indent -= 1\n                    formatted_line = f'{key}: {value}'\n                    formatted_lines.append('  ' * current_indent + formatted_line)\n                    if stack:\n                        stack.pop()\n                else:\n                    # \u041f\u0440\u043e\u0441\u0442\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\n                    # \u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u043a\u0430\u0432\u044b\u0447\u043a\u0438 \u043a \u0441\u0442\u0440\u043e\u043a\u043e\u0432\u044b\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f\u043c \u0435\u0441\u043b\u0438 \u0438\u0445 \u043d\u0435\u0442\n                    if (value and\n                        not value.isdigit() and\n                        not value.replace('.', '', 1).isdigit() and  # \u0414\u043b\u044f \u0447\u0438\u0441\u0435\u043b \u0441 \u0442\u043e\u0447\u043a\u043e\u0439\n                        value not in ['true', 'false', 'null'] and\n                        not value.startswith('\"') and not value.endswith('\"') and\n                        not value.startswith('{') and not value.startswith('[')):\n                        value = f'\"{value}\"'\n\n                    formatted_line = f'{key}: {value}'\n                    formatted_lines.append('  ' * current_indent + formatted_line)\n            else:\n                # \u041f\u0440\u043e\u0441\u0442\u0430\u044f \u0441\u0442\u0440\u043e\u043a\u0430 (\u0441\u043a\u043e\u0440\u0435\u0435 \u0432\u0441\u0435\u0433\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0432 \u043c\u0430\u0441\u0441\u0438\u0432\u0435)\n                formatted_lines.append('  ' * current_indent + line)\n\n        # \u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0437\u0430\u043f\u044f\u0442\u044b\u0435 \u0433\u0434\u0435 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\n        result = []\n        for i, current_line in enumerate(formatted_lines):\n\n            # \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c, \u043d\u0443\u0436\u043d\u043e \u043b\u0438 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0437\u0430\u043f\u044f\u0442\u0443\u044e\n            if i < len(formatted_lines) - 1:\n                next_line = formatted_lines[i + 1]\n\n                # \u041e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u043c, \u043d\u0430\u0445\u043e\u0434\u0438\u043c\u0441\u044f \u043b\u0438 \u043c\u044b \u0432\u043d\u0443\u0442\u0440\u0438 \u043c\u0430\u0441\u0441\u0438\u0432\u0430\n                in_array = any(bracket == '[' for bracket in stack)\n\n                # \u041d\u0435 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0437\u0430\u043f\u044f\u0442\u0443\u044e \u0435\u0441\u043b\u0438:\n                # - \u0442\u0435\u043a\u0443\u0449\u0430\u044f \u0441\u0442\u0440\u043e\u043a\u0430 \u044d\u0442\u043e { \u0438\u043b\u0438 [\n                # - \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0430\u044f \u0441\u0442\u0440\u043e\u043a\u0430 \u044d\u0442\u043e } \u0438\u043b\u0438 ]\n                # - \u0442\u0435\u043a\u0443\u0449\u0430\u044f \u0441\u0442\u0440\u043e\u043a\u0430 \u0443\u0436\u0435 \u0437\u0430\u043a\u0430\u043d\u0447\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0437\u0430\u043f\u044f\u0442\u043e\u0439\n                # - \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0430\u044f \u0441\u0442\u0440\u043e\u043a\u0430 \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442\u0441\u044f \u0441 } \u0438\u043b\u0438 ] (\u0434\u043b\u044f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u043c\u0430\u0441\u0441\u0438\u0432\u0430)\n                should_add_comma = (\n                    not current_line.endswith('{') and\n                    not current_line.endswith('[') and\n                    not current_line.endswith(',') and\n                    not next_line.strip().endswith('}') and\n                    not next_line.strip().endswith(']') and\n                    not next_line.strip().startswith('}') and\n                    not next_line.strip().startswith(']') and\n                    not (in_array and next_line.strip() == ']')  # \u041d\u0435 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0442\u044c \u0437\u0430\u043f\u044f\u0442\u0443\u044e \u043f\u0435\u0440\u0435\u0434 \u0437\u0430\u043a\u0440\u044b\u0442\u0438\u0435\u043c \u043c\u0430\u0441\u0441\u0438\u0432\u0430\n                )\n\n                # \u0414\u043b\u044f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 (\u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432) \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0437\u0430\u043f\u044f\u0442\u0443\u044e \u043f\u043e\u0441\u043b\u0435 }\n                if (in_array and\n                    current_line.strip() == '}' and\n                    next_line.strip() != ']' and\n                    not next_line.strip().startswith('}')):\n                    should_add_comma = True\n\n                if should_add_comma:\n                    current_line += ','\n\n            result.append(current_line)\n\n        return '\\n'.join(result)\n\n    def read_data(self, locator: Any) -> Dict:\n        \"\"\"\u0427\u0438\u0442\u0430\u0435\u0442 \u0438 \u0444\u043e\u0440\u043c\u0430\u0442\u0438\u0440\u0443\u0435\u0442 JSON-\u0434\u0430\u043d\u043d\u044b\u0435 \u0438\u0437 \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u043e\u0433\u043e \u043b\u043e\u043a\u0430\u0442\u043e\u0440\u0430.\n\n        Args:\n            locator: \u041b\u043e\u043a\u0430\u0442\u043e\u0440 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0441 JSON-\u0434\u0430\u043d\u043d\u044b\u043c\u0438.\n\n        Returns:\n            dict: \u0420\u0430\u0441\u043f\u0430\u0440\u0441\u0435\u043d\u043d\u044b\u0439 JSON-\u043e\u0431\u044a\u0435\u043a\u0442.\n\n        Raises:\n            json.JSONDecodeError: \u0415\u0441\u043b\u0438 \u0434\u0430\u043d\u043d\u044b\u0435 \u043d\u0435 \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u044b \u0432 JSON.\n        \"\"\"\n\n        # \u0427\u0442\u0435\u043d\u0438\u0435 JSON-\u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0433\u043e \u0438\u0437 \u0440\u0430\u0431\u043e\u0447\u0435\u0439 \u043e\u0431\u043b\u0430\u0441\u0442\u0438\n        loc = self.get_locator(locator)\n        json_string = loc.inner_text()\n\n        # \u0421\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435 \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0439 JSON \u0441\u0442\u0440\u043e\u043a\u0438 \u0432 \u0444\u0430\u0439\u043b\n        with open('json_string.txt', 'w', encoding='utf-8') as f:\n            f.write(json_string)\n        logger.info(\"\u0418\u0441\u0445\u043e\u0434\u043d\u0430\u044f JSON \u0441\u0442\u0440\u043e\u043a\u0430 \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0430 \u0432 \u0444\u0430\u0439\u043b: json_string.txt\")\n\n        formatted_json_string = self.format_json_string(json_string)\n\n        # \u0421\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435 \u043e\u0442\u0444\u043e\u0440\u043c\u0430\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0439 JSON \u0441\u0442\u0440\u043e\u043a\u0438 \u0432 \u0444\u0430\u0439\u043b\n        with open('formatted_json_string.txt', 'w', encoding='utf-8') as f:\n            f.write(formatted_json_string)\n        logger.info(\"\u041e\u0442\u0444\u043e\u0440\u043c\u0430\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u0430\u044f JSON \u0441\u0442\u0440\u043e\u043a\u0430 \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0430 \u0432 \u0444\u0430\u0439\u043b: formatted_json_string.txt\")\n\n        try:\n            data = json.loads(formatted_json_string)\n        except json.JSONDecodeError as e:\n            # \u0414\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u043e\u0442\u043b\u0430\u0434\u043a\u0430\n            logger.error(f\"JSON decode error: {e}\")\n            logger.error(f\"Formatted JSON: {formatted_json_string}\")\n            assert False, f\"Invalid json content. Error: {e}\"\n\n        return data\n\n    # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0438:\n    def check_json_equals(self, actual: Any, expected: Any, msg: str) -> None:\n        \"\"\"\u0421\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u0435\u0442 JSON-\u043e\u0431\u044a\u0435\u043a\u0442\u044b \u043d\u0430 \u0438\u0434\u0435\u043d\u0442\u0438\u0447\u043d\u043e\u0441\u0442\u044c.\n\n        Args:\n            actual: \u0424\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 JSON-\u043e\u0431\u044a\u0435\u043a\u0442.\n            expected: \u041e\u0436\u0438\u0434\u0430\u0435\u043c\u044b\u0439 JSON-\u043e\u0431\u044a\u0435\u043a\u0442.\n            msg: \u0421\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u043e\u0431 \u043e\u0448\u0438\u0431\u043a\u0435.\n\n        Raises:\n            AssertionError: \u0415\u0441\u043b\u0438 \u043e\u0431\u044a\u0435\u043a\u0442\u044b \u043d\u0435 \u0438\u0434\u0435\u043d\u0442\u0438\u0447\u043d\u044b.\n        \"\"\"\n\n        diff = jsondiff.diff(expected, actual, syntax='symmetric')\n        assert len(diff) == 0, f\"{msg}. DIFF is {diff}\"\n
    "},{"location":"components/json_container_component/#components.json_container_component.JsonContainerComponent.__init__","title":"__init__(page)","text":"

    \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442 JSON-\u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440.

    Parameters:

    Name Type Description Default page Page

    \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.

    required Source code in components\\json_container_component.py
    def __init__(self, page: Page) -> None:\n    \"\"\"\u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442 JSON-\u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440.\n\n    Args:\n        page: \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.\n    \"\"\"\n\n    super().__init__(page)\n
    "},{"location":"components/json_container_component/#components.json_container_component.JsonContainerComponent.check_json_equals","title":"check_json_equals(actual, expected, msg)","text":"

    \u0421\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u0435\u0442 JSON-\u043e\u0431\u044a\u0435\u043a\u0442\u044b \u043d\u0430 \u0438\u0434\u0435\u043d\u0442\u0438\u0447\u043d\u043e\u0441\u0442\u044c.

    Parameters:

    Name Type Description Default actual Any

    \u0424\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 JSON-\u043e\u0431\u044a\u0435\u043a\u0442.

    required expected Any

    \u041e\u0436\u0438\u0434\u0430\u0435\u043c\u044b\u0439 JSON-\u043e\u0431\u044a\u0435\u043a\u0442.

    required msg str

    \u0421\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u043e\u0431 \u043e\u0448\u0438\u0431\u043a\u0435.

    required

    Raises:

    Type Description AssertionError

    \u0415\u0441\u043b\u0438 \u043e\u0431\u044a\u0435\u043a\u0442\u044b \u043d\u0435 \u0438\u0434\u0435\u043d\u0442\u0438\u0447\u043d\u044b.

    Source code in components\\json_container_component.py
    def check_json_equals(self, actual: Any, expected: Any, msg: str) -> None:\n    \"\"\"\u0421\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u0435\u0442 JSON-\u043e\u0431\u044a\u0435\u043a\u0442\u044b \u043d\u0430 \u0438\u0434\u0435\u043d\u0442\u0438\u0447\u043d\u043e\u0441\u0442\u044c.\n\n    Args:\n        actual: \u0424\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 JSON-\u043e\u0431\u044a\u0435\u043a\u0442.\n        expected: \u041e\u0436\u0438\u0434\u0430\u0435\u043c\u044b\u0439 JSON-\u043e\u0431\u044a\u0435\u043a\u0442.\n        msg: \u0421\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u043e\u0431 \u043e\u0448\u0438\u0431\u043a\u0435.\n\n    Raises:\n        AssertionError: \u0415\u0441\u043b\u0438 \u043e\u0431\u044a\u0435\u043a\u0442\u044b \u043d\u0435 \u0438\u0434\u0435\u043d\u0442\u0438\u0447\u043d\u044b.\n    \"\"\"\n\n    diff = jsondiff.diff(expected, actual, syntax='symmetric')\n    assert len(diff) == 0, f\"{msg}. DIFF is {diff}\"\n
    "},{"location":"components/json_container_component/#components.json_container_component.JsonContainerComponent.format_json_string","title":"format_json_string(json_string)","text":"

    \u0424\u043e\u0440\u043c\u0430\u0442\u0438\u0440\u0443\u0435\u0442 \u0441\u0442\u0440\u043e\u043a\u0443 JSON \u0434\u043b\u044f \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0433\u043e \u043f\u0430\u0440\u0441\u0438\u043d\u0433\u0430.

    Parameters:

    Name Type Description Default json_string str

    \u0421\u044b\u0440\u0430\u044f \u0441\u0442\u0440\u043e\u043a\u0430 \u0441 JSON-\u0434\u0430\u043d\u043d\u044b\u043c\u0438.

    required

    Returns:

    Name Type Description str str

    \u041e\u0442\u0444\u043e\u0440\u043c\u0430\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u0430\u044f \u0441\u0442\u0440\u043e\u043a\u0430 JSON.

    Source code in components\\json_container_component.py
    def format_json_string(self, json_string: str) -> str:\n    \"\"\"\u0424\u043e\u0440\u043c\u0430\u0442\u0438\u0440\u0443\u0435\u0442 \u0441\u0442\u0440\u043e\u043a\u0443 JSON \u0434\u043b\u044f \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0433\u043e \u043f\u0430\u0440\u0441\u0438\u043d\u0433\u0430.\n\n    Args:\n        json_string: \u0421\u044b\u0440\u0430\u044f \u0441\u0442\u0440\u043e\u043a\u0430 \u0441 JSON-\u0434\u0430\u043d\u043d\u044b\u043c\u0438.\n\n    Returns:\n        str: \u041e\u0442\u0444\u043e\u0440\u043c\u0430\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u0430\u044f \u0441\u0442\u0440\u043e\u043a\u0430 JSON.\n    \"\"\"\n\n    lines = json_string.splitlines()\n    formatted_lines = []\n    stack = []  # \u0421\u0442\u0435\u043a \u0434\u043b\u044f \u043e\u0442\u0441\u043b\u0435\u0436\u0438\u0432\u0430\u043d\u0438\u044f \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u043e\u0441\u0442\u0438\n    current_indent = 0\n\n    for line in lines:\n        line = line.strip()\n        if not line:\n            continue\n\n        # \u041e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u043c \u0442\u0438\u043f \u0442\u0435\u043a\u0443\u0449\u0435\u0439 \u0441\u0442\u0440\u043e\u043a\u0438\n        if line in ['{', '[']:\n            # \u041d\u0430\u0447\u0430\u043b\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u0438\u043b\u0438 \u043c\u0430\u0441\u0441\u0438\u0432\u0430\n            formatted_lines.append('  ' * current_indent + line)\n            stack.append(line)\n            current_indent += 1\n        elif line in ['}', ']']:\n            # \u041a\u043e\u043d\u0435\u0446 \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u0438\u043b\u0438 \u043c\u0430\u0441\u0441\u0438\u0432\u0430\n            current_indent -= 1\n            if stack and stack[-1] in ['{', '[']:\n                stack.pop()\n            formatted_lines.append('  ' * current_indent + line)\n        elif re.match(r'^\\d+:\\{', line):\n            # \u042d\u043b\u0435\u043c\u0435\u043d\u0442 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u0441 \u0438\u043d\u0434\u0435\u043a\u0441\u043e\u043c (0:{, 1:{, etc.)\n            # \u0423\u0431\u0438\u0440\u0430\u0435\u043c \u0438\u043d\u0434\u0435\u043a\u0441 \u0438 \u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u043c \u0442\u043e\u043b\u044c\u043a\u043e {\n            formatted_lines.append('  ' * current_indent + '{')\n            stack.append('{')\n            current_indent += 1\n        elif ':' in line:\n            # \u041f\u0430\u0440\u0430 \u043a\u043b\u044e\u0447:\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\n            key, value = line.split(':', 1)\n            key = key.strip()\n            value = value.strip()\n\n            # \u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u043a\u0430\u0432\u044b\u0447\u043a\u0438 \u043a \u043a\u043b\u044e\u0447\u0443 \u0435\u0441\u043b\u0438 \u0438\u0445 \u043d\u0435\u0442 (\u0432\u043a\u043b\u044e\u0447\u0430\u044f $)\n            if not (key.startswith('\"') and key.endswith('\"')):\n                key = f'\"{key}\"'\n\n            # \u041e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439\n            if value in ['{', '[']:\n                # \u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 - \u043d\u0430\u0447\u0430\u043b\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u0438\u043b\u0438 \u043c\u0430\u0441\u0441\u0438\u0432\u0430\n                formatted_line = f'{key}: {value}'\n                formatted_lines.append('  ' * current_indent + formatted_line)\n                stack.append(value)\n                current_indent += 1\n            elif value in ['}', ']']:\n                # \u041d\u0435 \u0434\u043e\u043b\u0436\u043d\u043e \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442\u044c, \u043d\u043e \u043d\u0430 \u0432\u0441\u044f\u043a\u0438\u0439 \u0441\u043b\u0443\u0447\u0430\u0439\n                current_indent -= 1\n                formatted_line = f'{key}: {value}'\n                formatted_lines.append('  ' * current_indent + formatted_line)\n                if stack:\n                    stack.pop()\n            else:\n                # \u041f\u0440\u043e\u0441\u0442\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\n                # \u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u043a\u0430\u0432\u044b\u0447\u043a\u0438 \u043a \u0441\u0442\u0440\u043e\u043a\u043e\u0432\u044b\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f\u043c \u0435\u0441\u043b\u0438 \u0438\u0445 \u043d\u0435\u0442\n                if (value and\n                    not value.isdigit() and\n                    not value.replace('.', '', 1).isdigit() and  # \u0414\u043b\u044f \u0447\u0438\u0441\u0435\u043b \u0441 \u0442\u043e\u0447\u043a\u043e\u0439\n                    value not in ['true', 'false', 'null'] and\n                    not value.startswith('\"') and not value.endswith('\"') and\n                    not value.startswith('{') and not value.startswith('[')):\n                    value = f'\"{value}\"'\n\n                formatted_line = f'{key}: {value}'\n                formatted_lines.append('  ' * current_indent + formatted_line)\n        else:\n            # \u041f\u0440\u043e\u0441\u0442\u0430\u044f \u0441\u0442\u0440\u043e\u043a\u0430 (\u0441\u043a\u043e\u0440\u0435\u0435 \u0432\u0441\u0435\u0433\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0432 \u043c\u0430\u0441\u0441\u0438\u0432\u0435)\n            formatted_lines.append('  ' * current_indent + line)\n\n    # \u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0437\u0430\u043f\u044f\u0442\u044b\u0435 \u0433\u0434\u0435 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\n    result = []\n    for i, current_line in enumerate(formatted_lines):\n\n        # \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c, \u043d\u0443\u0436\u043d\u043e \u043b\u0438 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0437\u0430\u043f\u044f\u0442\u0443\u044e\n        if i < len(formatted_lines) - 1:\n            next_line = formatted_lines[i + 1]\n\n            # \u041e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u043c, \u043d\u0430\u0445\u043e\u0434\u0438\u043c\u0441\u044f \u043b\u0438 \u043c\u044b \u0432\u043d\u0443\u0442\u0440\u0438 \u043c\u0430\u0441\u0441\u0438\u0432\u0430\n            in_array = any(bracket == '[' for bracket in stack)\n\n            # \u041d\u0435 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0437\u0430\u043f\u044f\u0442\u0443\u044e \u0435\u0441\u043b\u0438:\n            # - \u0442\u0435\u043a\u0443\u0449\u0430\u044f \u0441\u0442\u0440\u043e\u043a\u0430 \u044d\u0442\u043e { \u0438\u043b\u0438 [\n            # - \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0430\u044f \u0441\u0442\u0440\u043e\u043a\u0430 \u044d\u0442\u043e } \u0438\u043b\u0438 ]\n            # - \u0442\u0435\u043a\u0443\u0449\u0430\u044f \u0441\u0442\u0440\u043e\u043a\u0430 \u0443\u0436\u0435 \u0437\u0430\u043a\u0430\u043d\u0447\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0437\u0430\u043f\u044f\u0442\u043e\u0439\n            # - \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0430\u044f \u0441\u0442\u0440\u043e\u043a\u0430 \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442\u0441\u044f \u0441 } \u0438\u043b\u0438 ] (\u0434\u043b\u044f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u043c\u0430\u0441\u0441\u0438\u0432\u0430)\n            should_add_comma = (\n                not current_line.endswith('{') and\n                not current_line.endswith('[') and\n                not current_line.endswith(',') and\n                not next_line.strip().endswith('}') and\n                not next_line.strip().endswith(']') and\n                not next_line.strip().startswith('}') and\n                not next_line.strip().startswith(']') and\n                not (in_array and next_line.strip() == ']')  # \u041d\u0435 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0442\u044c \u0437\u0430\u043f\u044f\u0442\u0443\u044e \u043f\u0435\u0440\u0435\u0434 \u0437\u0430\u043a\u0440\u044b\u0442\u0438\u0435\u043c \u043c\u0430\u0441\u0441\u0438\u0432\u0430\n            )\n\n            # \u0414\u043b\u044f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u043c\u0430\u0441\u0441\u0438\u0432\u0430 (\u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432) \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0437\u0430\u043f\u044f\u0442\u0443\u044e \u043f\u043e\u0441\u043b\u0435 }\n            if (in_array and\n                current_line.strip() == '}' and\n                next_line.strip() != ']' and\n                not next_line.strip().startswith('}')):\n                should_add_comma = True\n\n            if should_add_comma:\n                current_line += ','\n\n        result.append(current_line)\n\n    return '\\n'.join(result)\n
    "},{"location":"components/json_container_component/#components.json_container_component.JsonContainerComponent.read_data","title":"read_data(locator)","text":"

    \u0427\u0438\u0442\u0430\u0435\u0442 \u0438 \u0444\u043e\u0440\u043c\u0430\u0442\u0438\u0440\u0443\u0435\u0442 JSON-\u0434\u0430\u043d\u043d\u044b\u0435 \u0438\u0437 \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u043e\u0433\u043e \u043b\u043e\u043a\u0430\u0442\u043e\u0440\u0430.

    Parameters:

    Name Type Description Default locator Any

    \u041b\u043e\u043a\u0430\u0442\u043e\u0440 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0441 JSON-\u0434\u0430\u043d\u043d\u044b\u043c\u0438.

    required

    Returns:

    Name Type Description dict Dict

    \u0420\u0430\u0441\u043f\u0430\u0440\u0441\u0435\u043d\u043d\u044b\u0439 JSON-\u043e\u0431\u044a\u0435\u043a\u0442.

    Raises:

    Type Description JSONDecodeError

    \u0415\u0441\u043b\u0438 \u0434\u0430\u043d\u043d\u044b\u0435 \u043d\u0435 \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u044b \u0432 JSON.

    Source code in components\\json_container_component.py
    def read_data(self, locator: Any) -> Dict:\n    \"\"\"\u0427\u0438\u0442\u0430\u0435\u0442 \u0438 \u0444\u043e\u0440\u043c\u0430\u0442\u0438\u0440\u0443\u0435\u0442 JSON-\u0434\u0430\u043d\u043d\u044b\u0435 \u0438\u0437 \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u043e\u0433\u043e \u043b\u043e\u043a\u0430\u0442\u043e\u0440\u0430.\n\n    Args:\n        locator: \u041b\u043e\u043a\u0430\u0442\u043e\u0440 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0441 JSON-\u0434\u0430\u043d\u043d\u044b\u043c\u0438.\n\n    Returns:\n        dict: \u0420\u0430\u0441\u043f\u0430\u0440\u0441\u0435\u043d\u043d\u044b\u0439 JSON-\u043e\u0431\u044a\u0435\u043a\u0442.\n\n    Raises:\n        json.JSONDecodeError: \u0415\u0441\u043b\u0438 \u0434\u0430\u043d\u043d\u044b\u0435 \u043d\u0435 \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u044b \u0432 JSON.\n    \"\"\"\n\n    # \u0427\u0442\u0435\u043d\u0438\u0435 JSON-\u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0433\u043e \u0438\u0437 \u0440\u0430\u0431\u043e\u0447\u0435\u0439 \u043e\u0431\u043b\u0430\u0441\u0442\u0438\n    loc = self.get_locator(locator)\n    json_string = loc.inner_text()\n\n    # \u0421\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435 \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0439 JSON \u0441\u0442\u0440\u043e\u043a\u0438 \u0432 \u0444\u0430\u0439\u043b\n    with open('json_string.txt', 'w', encoding='utf-8') as f:\n        f.write(json_string)\n    logger.info(\"\u0418\u0441\u0445\u043e\u0434\u043d\u0430\u044f JSON \u0441\u0442\u0440\u043e\u043a\u0430 \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0430 \u0432 \u0444\u0430\u0439\u043b: json_string.txt\")\n\n    formatted_json_string = self.format_json_string(json_string)\n\n    # \u0421\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435 \u043e\u0442\u0444\u043e\u0440\u043c\u0430\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0439 JSON \u0441\u0442\u0440\u043e\u043a\u0438 \u0432 \u0444\u0430\u0439\u043b\n    with open('formatted_json_string.txt', 'w', encoding='utf-8') as f:\n        f.write(formatted_json_string)\n    logger.info(\"\u041e\u0442\u0444\u043e\u0440\u043c\u0430\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u0430\u044f JSON \u0441\u0442\u0440\u043e\u043a\u0430 \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0430 \u0432 \u0444\u0430\u0439\u043b: formatted_json_string.txt\")\n\n    try:\n        data = json.loads(formatted_json_string)\n    except json.JSONDecodeError as e:\n        # \u0414\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u043e\u0442\u043b\u0430\u0434\u043a\u0430\n        logger.error(f\"JSON decode error: {e}\")\n        logger.error(f\"Formatted JSON: {formatted_json_string}\")\n        assert False, f\"Invalid json content. Error: {e}\"\n\n    return data\n
    "},{"location":"components/modal_window_component/","title":"ModalWindowComponent","text":"

    \u041c\u043e\u0434\u0443\u043b\u044c \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430. \u0421\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043a\u043b\u0430\u0441\u0441 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u044b\u043c\u0438 \u043e\u043a\u043d\u0430\u043c\u0438, \u0438\u0445 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u043c\u0438 \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430\u043c\u0438.

    "},{"location":"components/modal_window_component/#components.modal_window_component.ModalWindowComponent","title":"ModalWindowComponent","text":"

    Bases: BaseComponent

    \u041a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430. \u041f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u043c\u0435\u0442\u043e\u0434\u044b \u0434\u043b\u044f \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0441 \u043e\u043a\u043d\u043e\u043c, \u0435\u0433\u043e \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u044b\u043c \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u043e\u043a.

    Source code in components\\modal_window_component.py
    class ModalWindowComponent(BaseComponent):\n    \"\"\"\u041a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430. \u041f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u043c\u0435\u0442\u043e\u0434\u044b \u0434\u043b\u044f \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0441 \u043e\u043a\u043d\u043e\u043c,\n    \u0435\u0433\u043e \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u044b\u043c \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u043e\u043a.\"\"\"\n\n    def __init__(self, page: Page):\n        super().__init__(page)\n        self.toolbar = ToolbarComponent(page, \"\")\n        self.content_items = {}\n        self.buttons = []\n\n    # \u0414\u0435\u0439\u0441\u0442\u0432\u0438\u044f:\n    def add_content_item(self, name: str, item: object) -> None:\n        \"\"\"\u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0433\u043e \u0432 \u043e\u043a\u043d\u043e \u043f\u043e \u0437\u0430\u0434\u0430\u043d\u043d\u043e\u043c\u0443 \u0438\u043c\u0435\u043d\u0438.\"\"\"\n\n        self.content_items[name] = item\n\n    def get_content_item(self, name: str) -> object | None:\n        \"\"\"\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0433\u043e \u043f\u043e \u0438\u043c\u0435\u043d\u0438 \u0438\u043b\u0438 None, \u0435\u0441\u043b\u0438 \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d.\"\"\"\n\n        return self.content_items.get(name)\n\n    def add_toolbar_title(self, title: str) -> None:\n        \"\"\"\u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a \u0432 \u043f\u0430\u043d\u0435\u043b\u044c \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430.\"\"\"\n\n        self.toolbar.add_title(title)\n\n    def add_toolbar_button(self, locator: str, name: str) -> None:\n        \"\"\"\u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u043a\u043d\u043e\u043f\u043a\u0443 \u0432 \u043f\u0430\u043d\u0435\u043b\u044c \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430.\"\"\"\n\n        self.toolbar.add_tooltip_button(locator, name)\n\n    def add_button(self, locator: str, name: str) -> None:\n        \"\"\"\u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u043a\u043d\u043e\u043f\u043a\u0443 \u0432 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043a\u043d\u043e.\"\"\"\n\n        self.buttons.append(Button(self.page, locator, name))\n\n    def get_button_by_name(self, name: str) -> Button | None:\n        \"\"\"\u0418\u0449\u0435\u0442 \u0438 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043a\u043d\u043e\u043f\u043a\u0443 \u043f\u043e \u0438\u043c\u0435\u043d\u0438 \u0438\u043b\u0438 None, \u0435\u0441\u043b\u0438 \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u0430.\"\"\"\n\n        for button in self.buttons:\n            if button.name == name:\n                return button\n        return None\n\n    def click_button(self, name: str) -> None:\n        \"\"\"\u041a\u043b\u0438\u043a\u0430\u0435\u0442 \u043f\u043e \u043a\u043d\u043e\u043f\u043a\u0435 \u0441 \u0437\u0430\u0434\u0430\u043d\u043d\u044b\u043c \u0438\u043c\u0435\u043d\u0435\u043c. \u0412\u044b\u0437\u044b\u0432\u0430\u0435\u0442 \u043e\u0448\u0438\u0431\u043a\u0443, \u0435\u0441\u043b\u0438 \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u0430.\"\"\"\n\n        button = self.get_button_by_name(name)\n        if button is None:\n            assert False, f\"Button with name '{name}' not found\"\n        button.click()\n\n    def click_toolbar_close_button(self) -> None:\n        \"\"\"\u041a\u043b\u0438\u043a\u0430\u0435\u0442 \u043f\u043e \u043a\u043d\u043e\u043f\u043a\u0435 \u0437\u0430\u043a\u0440\u044b\u0442\u0438\u044f \u0432 \u043f\u0430\u043d\u0435\u043b\u0438 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432.\"\"\"\n\n        self.toolbar.click_button(\"close\")\n\n    def scroll_window_down(self) -> None:\n        \"\"\"\u041f\u0440\u043e\u043a\u0440\u0443\u0447\u0438\u0432\u0430\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u043e\u043a\u043d\u0430 \u0432\u043d\u0438\u0437.\"\"\"\n\n        self.scroll_down(ModalWindowLocators.MODAL_WINDOW)\n\n    def scroll_window_up(self) -> None:\n        \"\"\"\u041f\u0440\u043e\u043a\u0440\u0443\u0447\u0438\u0432\u0430\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u043e\u043a\u043d\u0430 \u0432\u0432\u0435\u0440\u0445.\"\"\"\n\n        self.scroll_up(ModalWindowLocators.MODAL_WINDOW)\n\n    def scroll_window_left(self) -> None:\n        \"\"\"\u041f\u0440\u043e\u043a\u0440\u0443\u0447\u0438\u0432\u0430\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u043e\u043a\u043d\u0430 \u0432\u043b\u0435\u0432\u043e.\"\"\"\n\n        self.scroll_left(ModalWindowLocators.MODAL_WINDOW)\n\n    def scroll_window_right(self) -> None:\n        \"\"\"\u041f\u0440\u043e\u043a\u0440\u0443\u0447\u0438\u0432\u0430\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u043e\u043a\u043d\u0430 \u0432\u043f\u0440\u0430\u0432\u043e.\"\"\"\n\n        self.scroll_right(ModalWindowLocators.MODAL_WINDOW)\n\n    # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0438:\n    def check_window_vertical_scrolling(self) -> bool:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u0439 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0438 \u043e\u043a\u043d\u0430.\"\"\"\n\n        return self.is_scrollable_vertically(ModalWindowLocators.MODAL_WINDOW)\n\n    def check_window_horizontal_scrolling(self) -> bool:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0433\u043e\u0440\u0438\u0437\u043e\u043d\u0442\u0430\u043b\u044c\u043d\u043e\u0439 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0438 \u043e\u043a\u043d\u0430.\"\"\"\n\n        return self.is_scrollable_horizontally(ModalWindowLocators.MODAL_WINDOW)\n\n    def check_by_window_title(self) -> None:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u043e\u043a\u043d\u0430 \u043f\u043e \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0443.\"\"\"\n\n        self.toolbar.check_toolbar_presence(f\"Modal window with '{self.toolbar.title}' is missing\")\n\n    def check_button_visibility(self, name: str) -> None:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u043a\u043d\u043e\u043f\u043a\u0438 \u043f\u043e \u0438\u043c\u0435\u043d\u0438. \u0412\u044b\u0437\u044b\u0432\u0430\u0435\u0442 \u043e\u0448\u0438\u0431\u043a\u0443, \u0435\u0441\u043b\u0438 \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u0430.\"\"\"\n\n        button = self.get_button_by_name(name)\n        if button is None:\n            assert False, f\"Button with name '{name}' not found\"\n        button.check_visibility(f\"Button with name '{name}' is missing\")\n\n    def check_toolbar_button_visibility(self, name: str) -> None:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u043a\u043d\u043e\u043f\u043a\u0438 \u0432 \u043f\u0430\u043d\u0435\u043b\u0438 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432.\"\"\"\n\n        self.toolbar.check_button_visibility(name)\n\n    def check_toolbar_button_tooltip(self, name: str, tooltip: str) -> None:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0443 \u0443 \u043a\u043d\u043e\u043f\u043a\u0438 \u0432 \u043f\u0430\u043d\u0435\u043b\u0438 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432.\"\"\"\n\n        self.toolbar.check_button_tooltip(name, tooltip)\n
    "},{"location":"components/modal_window_component/#components.modal_window_component.ModalWindowComponent.add_button","title":"add_button(locator, name)","text":"

    \u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u043a\u043d\u043e\u043f\u043a\u0443 \u0432 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043a\u043d\u043e.

    Source code in components\\modal_window_component.py
    def add_button(self, locator: str, name: str) -> None:\n    \"\"\"\u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u043a\u043d\u043e\u043f\u043a\u0443 \u0432 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043a\u043d\u043e.\"\"\"\n\n    self.buttons.append(Button(self.page, locator, name))\n
    "},{"location":"components/modal_window_component/#components.modal_window_component.ModalWindowComponent.add_content_item","title":"add_content_item(name, item)","text":"

    \u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0433\u043e \u0432 \u043e\u043a\u043d\u043e \u043f\u043e \u0437\u0430\u0434\u0430\u043d\u043d\u043e\u043c\u0443 \u0438\u043c\u0435\u043d\u0438.

    Source code in components\\modal_window_component.py
    def add_content_item(self, name: str, item: object) -> None:\n    \"\"\"\u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0433\u043e \u0432 \u043e\u043a\u043d\u043e \u043f\u043e \u0437\u0430\u0434\u0430\u043d\u043d\u043e\u043c\u0443 \u0438\u043c\u0435\u043d\u0438.\"\"\"\n\n    self.content_items[name] = item\n
    "},{"location":"components/modal_window_component/#components.modal_window_component.ModalWindowComponent.add_toolbar_button","title":"add_toolbar_button(locator, name)","text":"

    \u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u043a\u043d\u043e\u043f\u043a\u0443 \u0432 \u043f\u0430\u043d\u0435\u043b\u044c \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430.

    Source code in components\\modal_window_component.py
    def add_toolbar_button(self, locator: str, name: str) -> None:\n    \"\"\"\u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u043a\u043d\u043e\u043f\u043a\u0443 \u0432 \u043f\u0430\u043d\u0435\u043b\u044c \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430.\"\"\"\n\n    self.toolbar.add_tooltip_button(locator, name)\n
    "},{"location":"components/modal_window_component/#components.modal_window_component.ModalWindowComponent.add_toolbar_title","title":"add_toolbar_title(title)","text":"

    \u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a \u0432 \u043f\u0430\u043d\u0435\u043b\u044c \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430.

    Source code in components\\modal_window_component.py
    def add_toolbar_title(self, title: str) -> None:\n    \"\"\"\u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a \u0432 \u043f\u0430\u043d\u0435\u043b\u044c \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430.\"\"\"\n\n    self.toolbar.add_title(title)\n
    "},{"location":"components/modal_window_component/#components.modal_window_component.ModalWindowComponent.check_button_visibility","title":"check_button_visibility(name)","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u043a\u043d\u043e\u043f\u043a\u0438 \u043f\u043e \u0438\u043c\u0435\u043d\u0438. \u0412\u044b\u0437\u044b\u0432\u0430\u0435\u0442 \u043e\u0448\u0438\u0431\u043a\u0443, \u0435\u0441\u043b\u0438 \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u0430.

    Source code in components\\modal_window_component.py
    def check_button_visibility(self, name: str) -> None:\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u043a\u043d\u043e\u043f\u043a\u0438 \u043f\u043e \u0438\u043c\u0435\u043d\u0438. \u0412\u044b\u0437\u044b\u0432\u0430\u0435\u0442 \u043e\u0448\u0438\u0431\u043a\u0443, \u0435\u0441\u043b\u0438 \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u0430.\"\"\"\n\n    button = self.get_button_by_name(name)\n    if button is None:\n        assert False, f\"Button with name '{name}' not found\"\n    button.check_visibility(f\"Button with name '{name}' is missing\")\n
    "},{"location":"components/modal_window_component/#components.modal_window_component.ModalWindowComponent.check_by_window_title","title":"check_by_window_title()","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u043e\u043a\u043d\u0430 \u043f\u043e \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0443.

    Source code in components\\modal_window_component.py
    def check_by_window_title(self) -> None:\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u043e\u043a\u043d\u0430 \u043f\u043e \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0443.\"\"\"\n\n    self.toolbar.check_toolbar_presence(f\"Modal window with '{self.toolbar.title}' is missing\")\n
    "},{"location":"components/modal_window_component/#components.modal_window_component.ModalWindowComponent.check_toolbar_button_tooltip","title":"check_toolbar_button_tooltip(name, tooltip)","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0443 \u0443 \u043a\u043d\u043e\u043f\u043a\u0438 \u0432 \u043f\u0430\u043d\u0435\u043b\u0438 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432.

    Source code in components\\modal_window_component.py
    def check_toolbar_button_tooltip(self, name: str, tooltip: str) -> None:\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0443 \u0443 \u043a\u043d\u043e\u043f\u043a\u0438 \u0432 \u043f\u0430\u043d\u0435\u043b\u0438 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432.\"\"\"\n\n    self.toolbar.check_button_tooltip(name, tooltip)\n
    "},{"location":"components/modal_window_component/#components.modal_window_component.ModalWindowComponent.check_toolbar_button_visibility","title":"check_toolbar_button_visibility(name)","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u043a\u043d\u043e\u043f\u043a\u0438 \u0432 \u043f\u0430\u043d\u0435\u043b\u0438 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432.

    Source code in components\\modal_window_component.py
    def check_toolbar_button_visibility(self, name: str) -> None:\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u043a\u043d\u043e\u043f\u043a\u0438 \u0432 \u043f\u0430\u043d\u0435\u043b\u0438 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432.\"\"\"\n\n    self.toolbar.check_button_visibility(name)\n
    "},{"location":"components/modal_window_component/#components.modal_window_component.ModalWindowComponent.check_window_horizontal_scrolling","title":"check_window_horizontal_scrolling()","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0433\u043e\u0440\u0438\u0437\u043e\u043d\u0442\u0430\u043b\u044c\u043d\u043e\u0439 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0438 \u043e\u043a\u043d\u0430.

    Source code in components\\modal_window_component.py
    def check_window_horizontal_scrolling(self) -> bool:\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0433\u043e\u0440\u0438\u0437\u043e\u043d\u0442\u0430\u043b\u044c\u043d\u043e\u0439 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0438 \u043e\u043a\u043d\u0430.\"\"\"\n\n    return self.is_scrollable_horizontally(ModalWindowLocators.MODAL_WINDOW)\n
    "},{"location":"components/modal_window_component/#components.modal_window_component.ModalWindowComponent.check_window_vertical_scrolling","title":"check_window_vertical_scrolling()","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u0439 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0438 \u043e\u043a\u043d\u0430.

    Source code in components\\modal_window_component.py
    def check_window_vertical_scrolling(self) -> bool:\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u0439 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0438 \u043e\u043a\u043d\u0430.\"\"\"\n\n    return self.is_scrollable_vertically(ModalWindowLocators.MODAL_WINDOW)\n
    "},{"location":"components/modal_window_component/#components.modal_window_component.ModalWindowComponent.click_button","title":"click_button(name)","text":"

    \u041a\u043b\u0438\u043a\u0430\u0435\u0442 \u043f\u043e \u043a\u043d\u043e\u043f\u043a\u0435 \u0441 \u0437\u0430\u0434\u0430\u043d\u043d\u044b\u043c \u0438\u043c\u0435\u043d\u0435\u043c. \u0412\u044b\u0437\u044b\u0432\u0430\u0435\u0442 \u043e\u0448\u0438\u0431\u043a\u0443, \u0435\u0441\u043b\u0438 \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u0430.

    Source code in components\\modal_window_component.py
    def click_button(self, name: str) -> None:\n    \"\"\"\u041a\u043b\u0438\u043a\u0430\u0435\u0442 \u043f\u043e \u043a\u043d\u043e\u043f\u043a\u0435 \u0441 \u0437\u0430\u0434\u0430\u043d\u043d\u044b\u043c \u0438\u043c\u0435\u043d\u0435\u043c. \u0412\u044b\u0437\u044b\u0432\u0430\u0435\u0442 \u043e\u0448\u0438\u0431\u043a\u0443, \u0435\u0441\u043b\u0438 \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u0430.\"\"\"\n\n    button = self.get_button_by_name(name)\n    if button is None:\n        assert False, f\"Button with name '{name}' not found\"\n    button.click()\n
    "},{"location":"components/modal_window_component/#components.modal_window_component.ModalWindowComponent.click_toolbar_close_button","title":"click_toolbar_close_button()","text":"

    \u041a\u043b\u0438\u043a\u0430\u0435\u0442 \u043f\u043e \u043a\u043d\u043e\u043f\u043a\u0435 \u0437\u0430\u043a\u0440\u044b\u0442\u0438\u044f \u0432 \u043f\u0430\u043d\u0435\u043b\u0438 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432.

    Source code in components\\modal_window_component.py
    def click_toolbar_close_button(self) -> None:\n    \"\"\"\u041a\u043b\u0438\u043a\u0430\u0435\u0442 \u043f\u043e \u043a\u043d\u043e\u043f\u043a\u0435 \u0437\u0430\u043a\u0440\u044b\u0442\u0438\u044f \u0432 \u043f\u0430\u043d\u0435\u043b\u0438 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432.\"\"\"\n\n    self.toolbar.click_button(\"close\")\n
    "},{"location":"components/modal_window_component/#components.modal_window_component.ModalWindowComponent.get_button_by_name","title":"get_button_by_name(name)","text":"

    \u0418\u0449\u0435\u0442 \u0438 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043a\u043d\u043e\u043f\u043a\u0443 \u043f\u043e \u0438\u043c\u0435\u043d\u0438 \u0438\u043b\u0438 None, \u0435\u0441\u043b\u0438 \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u0430.

    Source code in components\\modal_window_component.py
    def get_button_by_name(self, name: str) -> Button | None:\n    \"\"\"\u0418\u0449\u0435\u0442 \u0438 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043a\u043d\u043e\u043f\u043a\u0443 \u043f\u043e \u0438\u043c\u0435\u043d\u0438 \u0438\u043b\u0438 None, \u0435\u0441\u043b\u0438 \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u0430.\"\"\"\n\n    for button in self.buttons:\n        if button.name == name:\n            return button\n    return None\n
    "},{"location":"components/modal_window_component/#components.modal_window_component.ModalWindowComponent.get_content_item","title":"get_content_item(name)","text":"

    \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0433\u043e \u043f\u043e \u0438\u043c\u0435\u043d\u0438 \u0438\u043b\u0438 None, \u0435\u0441\u043b\u0438 \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d.

    Source code in components\\modal_window_component.py
    def get_content_item(self, name: str) -> object | None:\n    \"\"\"\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0433\u043e \u043f\u043e \u0438\u043c\u0435\u043d\u0438 \u0438\u043b\u0438 None, \u0435\u0441\u043b\u0438 \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d.\"\"\"\n\n    return self.content_items.get(name)\n
    "},{"location":"components/modal_window_component/#components.modal_window_component.ModalWindowComponent.scroll_window_down","title":"scroll_window_down()","text":"

    \u041f\u0440\u043e\u043a\u0440\u0443\u0447\u0438\u0432\u0430\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u043e\u043a\u043d\u0430 \u0432\u043d\u0438\u0437.

    Source code in components\\modal_window_component.py
    def scroll_window_down(self) -> None:\n    \"\"\"\u041f\u0440\u043e\u043a\u0440\u0443\u0447\u0438\u0432\u0430\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u043e\u043a\u043d\u0430 \u0432\u043d\u0438\u0437.\"\"\"\n\n    self.scroll_down(ModalWindowLocators.MODAL_WINDOW)\n
    "},{"location":"components/modal_window_component/#components.modal_window_component.ModalWindowComponent.scroll_window_left","title":"scroll_window_left()","text":"

    \u041f\u0440\u043e\u043a\u0440\u0443\u0447\u0438\u0432\u0430\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u043e\u043a\u043d\u0430 \u0432\u043b\u0435\u0432\u043e.

    Source code in components\\modal_window_component.py
    def scroll_window_left(self) -> None:\n    \"\"\"\u041f\u0440\u043e\u043a\u0440\u0443\u0447\u0438\u0432\u0430\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u043e\u043a\u043d\u0430 \u0432\u043b\u0435\u0432\u043e.\"\"\"\n\n    self.scroll_left(ModalWindowLocators.MODAL_WINDOW)\n
    "},{"location":"components/modal_window_component/#components.modal_window_component.ModalWindowComponent.scroll_window_right","title":"scroll_window_right()","text":"

    \u041f\u0440\u043e\u043a\u0440\u0443\u0447\u0438\u0432\u0430\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u043e\u043a\u043d\u0430 \u0432\u043f\u0440\u0430\u0432\u043e.

    Source code in components\\modal_window_component.py
    def scroll_window_right(self) -> None:\n    \"\"\"\u041f\u0440\u043e\u043a\u0440\u0443\u0447\u0438\u0432\u0430\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u043e\u043a\u043d\u0430 \u0432\u043f\u0440\u0430\u0432\u043e.\"\"\"\n\n    self.scroll_right(ModalWindowLocators.MODAL_WINDOW)\n
    "},{"location":"components/modal_window_component/#components.modal_window_component.ModalWindowComponent.scroll_window_up","title":"scroll_window_up()","text":"

    \u041f\u0440\u043e\u043a\u0440\u0443\u0447\u0438\u0432\u0430\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u043e\u043a\u043d\u0430 \u0432\u0432\u0435\u0440\u0445.

    Source code in components\\modal_window_component.py
    def scroll_window_up(self) -> None:\n    \"\"\"\u041f\u0440\u043e\u043a\u0440\u0443\u0447\u0438\u0432\u0430\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u043e\u043a\u043d\u0430 \u0432\u0432\u0435\u0440\u0445.\"\"\"\n\n    self.scroll_up(ModalWindowLocators.MODAL_WINDOW)\n
    "},{"location":"components/navbar_component/","title":"NavigationPanelComponent","text":"

    \u041c\u043e\u0434\u0443\u043b\u044c \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430 \u043f\u0430\u043d\u0435\u043b\u0438 \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438. \u0421\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043a\u043b\u0430\u0441\u0441 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u043c\u0438 \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438.

    "},{"location":"components/navbar_component/#components.navbar_component.NavigationPanelComponent","title":"NavigationPanelComponent","text":"

    Bases: BaseComponent

    \u041a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 \u043f\u0430\u043d\u0435\u043b\u0438 \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438. \u041f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u043c\u0435\u0442\u043e\u0434\u044b \u0434\u043b\u044f \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0441 \u043d\u0435\u0439.

    Source code in components\\navbar_component.py
    class NavigationPanelComponent(BaseComponent):\n    \"\"\"\u041a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 \u043f\u0430\u043d\u0435\u043b\u0438 \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438. \u041f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u043c\u0435\u0442\u043e\u0434\u044b \u0434\u043b\u044f \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0441 \u043d\u0435\u0439.\"\"\"\n\n    def __init__(self, page: Page):\n        \"\"\"\u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 \u043f\u0430\u043d\u0435\u043b\u0438 \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438.\n\n        Args:\n            page: \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.\n        \"\"\"\n\n        super().__init__(page)\n\n    # \u0414\u0435\u0439\u0441\u0442\u0432\u0438\u044f:\n    def get_item_names(self, locator: str | Locator) -> list[str]:\n        \"\"\"\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0442\u0435\u043a\u0441\u0442\u044b \u0432\u0441\u0435\u0445 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u043f\u043e \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u043e\u043c\u0443 \u043b\u043e\u043a\u0430\u0442\u043e\u0440\u0443.\n\n        Args:\n            locator: \u041b\u043e\u043a\u0430\u0442\u043e\u0440 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0438\u043b\u0438 \u0441\u0442\u0440\u043e\u043a\u0430 \u0441 CSS/XPath.\n\n        Returns:\n            \u0421\u043f\u0438\u0441\u043e\u043a \u0442\u0435\u043a\u0441\u0442\u043e\u0432 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432.\n        \"\"\"\n\n        loc = self.get_locator(locator)\n        return loc.all_inner_texts()\n\n\n    def click_item(self, locator: str | Locator, item_name: str) -> None:\n        \"\"\"\u041a\u043b\u0438\u043a\u0430\u0435\u0442 \u043f\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0443 \u0441 \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u044b\u043c \u0442\u0435\u043a\u0441\u0442\u043e\u043c.\n\n        Args:\n            locator: \u041b\u043e\u043a\u0430\u0442\u043e\u0440 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0438\u043b\u0438 \u0441\u0442\u0440\u043e\u043a\u0430 \u0441 CSS/XPath.\n            item_name: \u0422\u0435\u043a\u0441\u0442 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0434\u043b\u044f \u043a\u043b\u0438\u043a\u0430.\n        \"\"\"\n\n        loc = self.get_locator(locator)\n        loc.get_by_text(item_name).click()\n\n    def click_sub_item(self, node_root_locator: str | Locator, item_name: str) -> None:\n        \"\"\"\u041a\u043b\u0438\u043a\u0430\u0435\u0442 \u043f\u043e \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u043e\u043c\u0443 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0443 \u0441 \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u044b\u043c \u0442\u0435\u043a\u0441\u0442\u043e\u043c.\n\n        Args:\n            node_root_locator: \u041b\u043e\u043a\u0430\u0442\u043e\u0440 \u0434\u043b\u044f \u043f\u043e\u0438\u0441\u043a\u0430 \u043a\u043e\u0440\u043d\u0435\u0432\u044b\u0445 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0434\u0435\u0440\u0435\u0432\u0430 (\u041b\u043e\u043a\u0430\u0442\u043e\u0440 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0438\u043b\u0438 \u0441\u0442\u0440\u043e\u043a\u0430 \u0441 CSS/XPath).\n            item_name: \u0422\u0435\u043a\u0441\u0442 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0434\u043b\u044f \u043a\u043b\u0438\u043a\u0430.\n        \"\"\"\n\n        def find_and_click_item(page, root_locator, item_name: str) -> bool:\n            # \u041d\u0430\u0445\u043e\u0434\u0438\u043c \u0432\u0441\u0435 \u043b\u043e\u043a\u0430\u0442\u043e\u0440\u044b \u043a\u043e\u0440\u043d\u0435\u0432\u044b\u0445 \u0443\u0437\u043b\u043e\u0432 \u043d\u0430 \u0442\u0435\u043a\u0443\u0449\u0435\u043c \u0443\u0440\u043e\u0432\u043d\u0435\n            root_node = root_locator.locator('>div.v-treeview-node')\n            # \u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0441\u043f\u0438\u0441\u043e\u043a \u0442\u0435\u043a\u0441\u0442\u043e\u0432\n            root_node_texts = root_node.all_inner_texts()\n\n            # \u0415\u0441\u043b\u0438 \u0438\u0441\u043a\u043e\u043c\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u043d\u0430 \u0434\u0430\u043d\u043d\u043e\u043c \u0443\u0440\u043e\u0432\u043d\u0435, \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u0435\u043c \u043b\u043e\u043a\u0430\u0442\u043e\u0440 \u0438 \u0434\u0435\u043b\u0430\u0435\u043c \u043a\u043b\u0438\u043a\n            for index, node_text in enumerate(root_node_texts):\n                node_text = node_text.replace(\"expand_more\\n\", \"\")\n                if item_name == node_text:\n                   root_node.nth(index).click()\n                   return True\n\n            # \u0415\u0441\u043b\u0438 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u043d\u0435\u0442, \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u043e \u0438\u0449\u0435\u043c \u0434\u0430\u043b\u044c\u0448\u0435\n            nodes_count = root_locator.locator('>div.v-treeview-node').count()\n\n            for index in range(nodes_count):\n                node = root_locator.locator(f\">div:nth-child({index + 1})\").first\n\n                # \u0418\u0437\u0432\u043b\u0435\u043a\u0430\u0435\u043c \u0430\u0442\u0442\u0440\u0438\u0431\u0443\u0442\u044b \u0438\u0437 \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0433\u043e \u0443\u0437\u043b\u0430\n                node_class_attr = node.get_attribute('class')\n\n                is_expanded = False\n                has_children = False\n\n                # \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u043b\u0438\u0441\u0442 \u044d\u0442\u043e \u0438\u043b\u0438 \u043d\u0430\u0447\u0430\u043b\u043e \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u0430\n                if \"v-treeview-node--leaf\" not in node_class_attr:\n                    # \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c, \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043b\u0438 \u0443\u0437\u0435\u043b \u0440\u0430\u0441\u043a\u0440\u044b\u0442\u044b\u043c\n                    class_attr = node.locator(NavigationPanelLocators.TOGGLE_BUTTON).get_attribute('class')\n                    if \"v-treeview-node__toggle--open\" in class_attr:\n                        is_expanded = True\n\n                    # \u0415\u0441\u043b\u0438 \u0443\u0437\u0435\u043b \u0437\u0430\u043a\u0440\u044b\u0442 \u043c\u043e\u0436\u0435\u043c \u0435\u0433\u043e \u0440\u0430\u0441\u043a\u0440\u044b\u0442\u044c\n                    if is_expanded is False:\n                        toggle_button = node.locator(NavigationPanelLocators.TOGGLE_BUTTON)\n                        toggle_button.click()\n                        # \u0416\u0434\u0435\u043c, \u043f\u043e\u043a\u0430 \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u043f\u0440\u043e\u0433\u0440\u0443\u0437\u044f\u0442\u0441\u044f/\u043f\u043e\u044f\u0432\u044f\u0442\u0441\u044f\n                        page.wait_for_timeout(300)\n                        is_expanded = True\n\n                    # \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c, \u0438\u043c\u0435\u0435\u0442 \u043b\u0438 \u0443\u0437\u0435\u043b  \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b\n                    children_count = node.locator('>div.v-treeview-node__children').count()\n                    content = node.locator('>div.v-treeview-node__children').inner_html()\n                    if children_count > 0 and len(content) != 0:\n                        has_children = True\n\n                    # \u0420\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u044b\u0439 \u0432\u044b\u0437\u043e\u0432 \u0434\u043b\u044f \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0445 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432\n                    # \u0418\u0449\u0435\u043c \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b *\u0432\u043d\u0443\u0442\u0440\u0438* \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u0443\u0437\u043b\u0430\n                    if has_children and is_expanded:\n                        child_nodes_locator = root_locator.locator(f\">div:nth-child({index + 1})\").locator('>div.v-treeview-node__children')\n                        is_found = find_and_click_item(page, child_nodes_locator, item_name)\n                        if is_found:\n                            return True\n\n                    # \u0437\u0430\u043a\u0440\u044b\u0432\u0430\u0435\u043c \u0443\u0437\u0435\u043b, \u0435\u0441\u043b\u0438 \u0432 \u043d\u0435\u043c \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u043d\u0430\u0448\u043b\u0438\n                    if is_expanded:\n                        toggle_button = node.locator(NavigationPanelLocators.TOGGLE_BUTTON)\n                        toggle_button.click()\n\n            # \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0441 \u0437\u0430\u0434\u0430\u043d\u043d\u044b\u043c \u0438\u043c\u0435\u043d\u0435\u043c \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\n            return False\n\n        root_locator = self.get_locator(node_root_locator)\n        found = find_and_click_item(self.page, root_locator, item_name)\n        assert found, f\"Navigation panel item {item_name} is missing\"\n\n    def traverse_panel_tree(self, node_root_locator: str | Locator, level=0, debug=False):\n        \"\"\"\n        \u0420\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u043e \u043e\u0431\u0445\u043e\u0434\u0438\u0442 \u0434\u0435\u0440\u0435\u0432\u043e v-treeview \u0438 \u0432\u044b\u0432\u043e\u0434\u0438\u0442 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e\u0431 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u0445 \u0432 \u0440\u0435\u0436\u0438\u043c\u0435 \u043e\u0442\u043b\u0430\u0434\u043a\u0438 (debug=True).\n\n        Args:\n            node_root_locator: \u041b\u043e\u043a\u0430\u0442\u043e\u0440 \u0434\u043b\u044f \u043f\u043e\u0438\u0441\u043a\u0430 \u043a\u043e\u0440\u043d\u0435\u0432\u044b\u0445 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0434\u0435\u0440\u0435\u0432\u0430 (\u041b\u043e\u043a\u0430\u0442\u043e\u0440 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0438\u043b\u0438 \u0441\u0442\u0440\u043e\u043a\u0430 \u0441 CSS/XPath).\n        \"\"\"\n        def traverse_tree(page, root_locator, level=0, debug=False):\n            # \u041d\u0430\u0445\u043e\u0434\u0438\u043c \u0432\u0441\u0435 \u043b\u043e\u043a\u0430\u0442\u043e\u0440\u044b \u043a\u043e\u0440\u043d\u0435\u0432\u044b\u0445 \u0443\u0437\u043b\u043e\u0432 \u043d\u0430 \u0442\u0435\u043a\u0443\u0449\u0435\u043c \u0443\u0440\u043e\u0432\u043d\u0435\n            nodes_count = root_locator.locator('>div.v-treeview-node').count()\n\n            for index in range(nodes_count):\n                node = root_locator.locator(f\">div:nth-child({index + 1})\").first\n\n                # \u0418\u0437\u0432\u043b\u0435\u043a\u0430\u0435\u043c \u0442\u0435\u043a\u0441\u0442 \u0438 \u0430\u0442\u0442\u0440\u0438\u0431\u0443\u0442\u044b \u0438\u0437 \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0433\u043e \u0443\u0437\u043b\u0430\n                node_text = node.inner_text()\n                node_class_attr = node.get_attribute('class')\n\n                is_expanded = False\n                has_children = False\n\n                # \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u043b\u0438\u0441\u0442 \u044d\u0442\u043e \u0438\u043b\u0438 \u043d\u0430\u0447\u0430\u043b\u043e \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u0430\n                if \"v-treeview-node--leaf\" in node_class_attr:\n                    if debug:\n                        print(f'[{level}][{index}] {node_text} (LEAF, Expanded: {is_expanded}, Has Children: {has_children})')\n                        print(\"-----------------------------------------\")\n                else:\n                    # \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c, \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043b\u0438 \u0443\u0437\u0435\u043b \u0440\u0430\u0441\u043a\u0440\u044b\u0442\u044b\u043c\n                    class_attr = node.locator(NavigationPanelLocators.TOGGLE_BUTTON).get_attribute('class')\n\n                    if \"v-treeview-node__toggle--open\" in class_attr:\n                        is_expanded = True\n\n                    # \u0415\u0441\u043b\u0438 \u0443\u0437\u0435\u043b \u0437\u0430\u043a\u0440\u044b\u0442 \u043c\u043e\u0436\u0435\u043c \u0435\u0433\u043e \u0440\u0430\u0441\u043a\u0440\u044b\u0442\u044c\n                    if is_expanded is False:\n                        toggle_button = node.locator(NavigationPanelLocators.TOGGLE_BUTTON)\n                        toggle_button.click()\n                        # \u0416\u0434\u0435\u043c, \u043f\u043e\u043a\u0430 \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u043f\u0440\u043e\u0433\u0440\u0443\u0437\u044f\u0442\u0441\u044f/\u043f\u043e\u044f\u0432\u044f\u0442\u0441\u044f\n                        page.wait_for_timeout(300)\n                        is_expanded = True\n\n                    # \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c, \u0438\u043c\u0435\u0435\u0442 \u043b\u0438 \u0443\u0437\u0435\u043b  \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b\n                    children_count = node.locator('>div.v-treeview-node__children').count()\n                    content = node.locator('>div.v-treeview-node__children').inner_html()\n                    if children_count > 0 and len(content) != 0:\n                        has_children = True\n\n                    edited_node_text = node_text.replace(\"expand_more\\n\", \"\")\n\n                    if debug:\n                        # \u0412\u044b\u0432\u043e\u0434\u0438\u043c \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e\u0431 \u0443\u0437\u043b\u0435\n                        print(f'[{level}][{index}] {edited_node_text} (NODE, Expanded: {is_expanded}, Has Children: {has_children})')\n                        print(\"-----------------------------------------\")\n\n                    # \u0420\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u044b\u0439 \u0432\u044b\u0437\u043e\u0432 \u0434\u043b\u044f \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0445 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432\n                    # \u0418\u0449\u0435\u043c \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b *\u0432\u043d\u0443\u0442\u0440\u0438* \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u0443\u0437\u043b\u0430\n                    if has_children and is_expanded:\n                        child_nodes_locator = root_locator.locator(f\">div:nth-child({index + 1})\").locator('>div.v-treeview-node__children')\n                        traverse_tree(page, child_nodes_locator, level+1, debug)\n\n        root_locator = self.get_locator(node_root_locator)\n        traverse_tree(self.page, root_locator, level=level, debug=debug)\n\n    # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0438:\n    def check_item_visibility(self, locator: str | Locator, item_name: str) -> None:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0441 \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u044b\u043c \u0442\u0435\u043a\u0441\u0442\u043e\u043c.\n\n        Args:\n            locator: \u041b\u043e\u043a\u0430\u0442\u043e\u0440 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0438\u043b\u0438 \u0441\u0442\u0440\u043e\u043a\u0430 \u0441 CSS/XPath.\n            item_name: \u0422\u0435\u043a\u0441\u0442 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0434\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438.\n\n        Note:\n            \u0412\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0434\u043b\u044f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0441 \u0442\u0435\u043a\u0441\u0442\u043e\u043c '\u0428\u0430\u0431\u043b\u043e\u043d\u044b'.\n        \"\"\"\n\n        msg = f\"Navigation panel item '{item_name}' is not visible\"\n\n        ## \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e: \u0432 \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u043e\u043d\u043d\u043e\u0439 \u043f\u0430\u043d\u0435\u043b\u0438 \u0435\u0441\u0442\u044c \u0434\u0432\u0435 \u043f\u0430\u043d\u0435\u043b\u0438 \u0441 \u0438\u043c\u0435\u043d\u0435\u043c \u0428\u0430\u0431\u043b\u043e\u043d\u044b\n        ## \u0434\u043b\u044f \u0438\u0445 \u0440\u0430\u0437\u043b\u0438\u0447\u0438\u044f \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u044b \u0438\u043d\u0434\u0435\u043a\u0441\u044b \u0428\u0430\u0431\u043b\u043e\u043d\u044b_1 \u0434\u043b\u044f \u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438/\u0428\u0430\u0431\u043b\u043e\u043d\u044b\n        ## \u0428\u0430\u0431\u043b\u043e\u043d\u044b_2 \u0434\u043b\u044f \u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438/ZTP/\u0428\u0430\u0431\u043b\u043e\u043d\u044b\n        loc = self.get_locator(locator)\n        if item_name == \"\u0428\u0430\u0431\u043b\u043e\u043d\u044b_1\":\n            loc = loc.get_by_text(\"\u0428\u0430\u0431\u043b\u043e\u043d\u044b\").first\n        elif item_name == \"\u0428\u0430\u0431\u043b\u043e\u043d\u044b_2\":\n            loc = loc.get_by_text(\"\u0428\u0430\u0431\u043b\u043e\u043d\u044b\").nth(1)\n        else:\n            loc = loc.get_by_text(item_name)\n        self.check_visibility(loc, msg)\n
    "},{"location":"components/navbar_component/#components.navbar_component.NavigationPanelComponent.__init__","title":"__init__(page)","text":"

    \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 \u043f\u0430\u043d\u0435\u043b\u0438 \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438.

    Parameters:

    Name Type Description Default page Page

    \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.

    required Source code in components\\navbar_component.py
    def __init__(self, page: Page):\n    \"\"\"\u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 \u043f\u0430\u043d\u0435\u043b\u0438 \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438.\n\n    Args:\n        page: \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.\n    \"\"\"\n\n    super().__init__(page)\n
    "},{"location":"components/navbar_component/#components.navbar_component.NavigationPanelComponent.check_item_visibility","title":"check_item_visibility(locator, item_name)","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0441 \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u044b\u043c \u0442\u0435\u043a\u0441\u0442\u043e\u043c.

    Parameters:

    Name Type Description Default locator str | Locator

    \u041b\u043e\u043a\u0430\u0442\u043e\u0440 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0438\u043b\u0438 \u0441\u0442\u0440\u043e\u043a\u0430 \u0441 CSS/XPath.

    required item_name str

    \u0422\u0435\u043a\u0441\u0442 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0434\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438.

    required Note

    \u0412\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0434\u043b\u044f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0441 \u0442\u0435\u043a\u0441\u0442\u043e\u043c '\u0428\u0430\u0431\u043b\u043e\u043d\u044b'.

    Source code in components\\navbar_component.py
    def check_item_visibility(self, locator: str | Locator, item_name: str) -> None:\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0441 \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u044b\u043c \u0442\u0435\u043a\u0441\u0442\u043e\u043c.\n\n    Args:\n        locator: \u041b\u043e\u043a\u0430\u0442\u043e\u0440 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0438\u043b\u0438 \u0441\u0442\u0440\u043e\u043a\u0430 \u0441 CSS/XPath.\n        item_name: \u0422\u0435\u043a\u0441\u0442 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0434\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438.\n\n    Note:\n        \u0412\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0434\u043b\u044f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0441 \u0442\u0435\u043a\u0441\u0442\u043e\u043c '\u0428\u0430\u0431\u043b\u043e\u043d\u044b'.\n    \"\"\"\n\n    msg = f\"Navigation panel item '{item_name}' is not visible\"\n\n    ## \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e: \u0432 \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u043e\u043d\u043d\u043e\u0439 \u043f\u0430\u043d\u0435\u043b\u0438 \u0435\u0441\u0442\u044c \u0434\u0432\u0435 \u043f\u0430\u043d\u0435\u043b\u0438 \u0441 \u0438\u043c\u0435\u043d\u0435\u043c \u0428\u0430\u0431\u043b\u043e\u043d\u044b\n    ## \u0434\u043b\u044f \u0438\u0445 \u0440\u0430\u0437\u043b\u0438\u0447\u0438\u044f \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u044b \u0438\u043d\u0434\u0435\u043a\u0441\u044b \u0428\u0430\u0431\u043b\u043e\u043d\u044b_1 \u0434\u043b\u044f \u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438/\u0428\u0430\u0431\u043b\u043e\u043d\u044b\n    ## \u0428\u0430\u0431\u043b\u043e\u043d\u044b_2 \u0434\u043b\u044f \u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438/ZTP/\u0428\u0430\u0431\u043b\u043e\u043d\u044b\n    loc = self.get_locator(locator)\n    if item_name == \"\u0428\u0430\u0431\u043b\u043e\u043d\u044b_1\":\n        loc = loc.get_by_text(\"\u0428\u0430\u0431\u043b\u043e\u043d\u044b\").first\n    elif item_name == \"\u0428\u0430\u0431\u043b\u043e\u043d\u044b_2\":\n        loc = loc.get_by_text(\"\u0428\u0430\u0431\u043b\u043e\u043d\u044b\").nth(1)\n    else:\n        loc = loc.get_by_text(item_name)\n    self.check_visibility(loc, msg)\n
    "},{"location":"components/navbar_component/#components.navbar_component.NavigationPanelComponent.click_item","title":"click_item(locator, item_name)","text":"

    \u041a\u043b\u0438\u043a\u0430\u0435\u0442 \u043f\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0443 \u0441 \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u044b\u043c \u0442\u0435\u043a\u0441\u0442\u043e\u043c.

    Parameters:

    Name Type Description Default locator str | Locator

    \u041b\u043e\u043a\u0430\u0442\u043e\u0440 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0438\u043b\u0438 \u0441\u0442\u0440\u043e\u043a\u0430 \u0441 CSS/XPath.

    required item_name str

    \u0422\u0435\u043a\u0441\u0442 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0434\u043b\u044f \u043a\u043b\u0438\u043a\u0430.

    required Source code in components\\navbar_component.py
    def click_item(self, locator: str | Locator, item_name: str) -> None:\n    \"\"\"\u041a\u043b\u0438\u043a\u0430\u0435\u0442 \u043f\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0443 \u0441 \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u044b\u043c \u0442\u0435\u043a\u0441\u0442\u043e\u043c.\n\n    Args:\n        locator: \u041b\u043e\u043a\u0430\u0442\u043e\u0440 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0438\u043b\u0438 \u0441\u0442\u0440\u043e\u043a\u0430 \u0441 CSS/XPath.\n        item_name: \u0422\u0435\u043a\u0441\u0442 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0434\u043b\u044f \u043a\u043b\u0438\u043a\u0430.\n    \"\"\"\n\n    loc = self.get_locator(locator)\n    loc.get_by_text(item_name).click()\n
    "},{"location":"components/navbar_component/#components.navbar_component.NavigationPanelComponent.click_sub_item","title":"click_sub_item(node_root_locator, item_name)","text":"

    \u041a\u043b\u0438\u043a\u0430\u0435\u0442 \u043f\u043e \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u043e\u043c\u0443 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0443 \u0441 \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u044b\u043c \u0442\u0435\u043a\u0441\u0442\u043e\u043c.

    Parameters:

    Name Type Description Default node_root_locator str | Locator

    \u041b\u043e\u043a\u0430\u0442\u043e\u0440 \u0434\u043b\u044f \u043f\u043e\u0438\u0441\u043a\u0430 \u043a\u043e\u0440\u043d\u0435\u0432\u044b\u0445 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0434\u0435\u0440\u0435\u0432\u0430 (\u041b\u043e\u043a\u0430\u0442\u043e\u0440 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0438\u043b\u0438 \u0441\u0442\u0440\u043e\u043a\u0430 \u0441 CSS/XPath).

    required item_name str

    \u0422\u0435\u043a\u0441\u0442 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0434\u043b\u044f \u043a\u043b\u0438\u043a\u0430.

    required Source code in components\\navbar_component.py
    def click_sub_item(self, node_root_locator: str | Locator, item_name: str) -> None:\n    \"\"\"\u041a\u043b\u0438\u043a\u0430\u0435\u0442 \u043f\u043e \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u043e\u043c\u0443 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0443 \u0441 \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u044b\u043c \u0442\u0435\u043a\u0441\u0442\u043e\u043c.\n\n    Args:\n        node_root_locator: \u041b\u043e\u043a\u0430\u0442\u043e\u0440 \u0434\u043b\u044f \u043f\u043e\u0438\u0441\u043a\u0430 \u043a\u043e\u0440\u043d\u0435\u0432\u044b\u0445 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0434\u0435\u0440\u0435\u0432\u0430 (\u041b\u043e\u043a\u0430\u0442\u043e\u0440 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0438\u043b\u0438 \u0441\u0442\u0440\u043e\u043a\u0430 \u0441 CSS/XPath).\n        item_name: \u0422\u0435\u043a\u0441\u0442 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0434\u043b\u044f \u043a\u043b\u0438\u043a\u0430.\n    \"\"\"\n\n    def find_and_click_item(page, root_locator, item_name: str) -> bool:\n        # \u041d\u0430\u0445\u043e\u0434\u0438\u043c \u0432\u0441\u0435 \u043b\u043e\u043a\u0430\u0442\u043e\u0440\u044b \u043a\u043e\u0440\u043d\u0435\u0432\u044b\u0445 \u0443\u0437\u043b\u043e\u0432 \u043d\u0430 \u0442\u0435\u043a\u0443\u0449\u0435\u043c \u0443\u0440\u043e\u0432\u043d\u0435\n        root_node = root_locator.locator('>div.v-treeview-node')\n        # \u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0441\u043f\u0438\u0441\u043e\u043a \u0442\u0435\u043a\u0441\u0442\u043e\u0432\n        root_node_texts = root_node.all_inner_texts()\n\n        # \u0415\u0441\u043b\u0438 \u0438\u0441\u043a\u043e\u043c\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u043d\u0430 \u0434\u0430\u043d\u043d\u043e\u043c \u0443\u0440\u043e\u0432\u043d\u0435, \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u0435\u043c \u043b\u043e\u043a\u0430\u0442\u043e\u0440 \u0438 \u0434\u0435\u043b\u0430\u0435\u043c \u043a\u043b\u0438\u043a\n        for index, node_text in enumerate(root_node_texts):\n            node_text = node_text.replace(\"expand_more\\n\", \"\")\n            if item_name == node_text:\n               root_node.nth(index).click()\n               return True\n\n        # \u0415\u0441\u043b\u0438 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u043d\u0435\u0442, \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u043e \u0438\u0449\u0435\u043c \u0434\u0430\u043b\u044c\u0448\u0435\n        nodes_count = root_locator.locator('>div.v-treeview-node').count()\n\n        for index in range(nodes_count):\n            node = root_locator.locator(f\">div:nth-child({index + 1})\").first\n\n            # \u0418\u0437\u0432\u043b\u0435\u043a\u0430\u0435\u043c \u0430\u0442\u0442\u0440\u0438\u0431\u0443\u0442\u044b \u0438\u0437 \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0433\u043e \u0443\u0437\u043b\u0430\n            node_class_attr = node.get_attribute('class')\n\n            is_expanded = False\n            has_children = False\n\n            # \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u043b\u0438\u0441\u0442 \u044d\u0442\u043e \u0438\u043b\u0438 \u043d\u0430\u0447\u0430\u043b\u043e \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u0430\n            if \"v-treeview-node--leaf\" not in node_class_attr:\n                # \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c, \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043b\u0438 \u0443\u0437\u0435\u043b \u0440\u0430\u0441\u043a\u0440\u044b\u0442\u044b\u043c\n                class_attr = node.locator(NavigationPanelLocators.TOGGLE_BUTTON).get_attribute('class')\n                if \"v-treeview-node__toggle--open\" in class_attr:\n                    is_expanded = True\n\n                # \u0415\u0441\u043b\u0438 \u0443\u0437\u0435\u043b \u0437\u0430\u043a\u0440\u044b\u0442 \u043c\u043e\u0436\u0435\u043c \u0435\u0433\u043e \u0440\u0430\u0441\u043a\u0440\u044b\u0442\u044c\n                if is_expanded is False:\n                    toggle_button = node.locator(NavigationPanelLocators.TOGGLE_BUTTON)\n                    toggle_button.click()\n                    # \u0416\u0434\u0435\u043c, \u043f\u043e\u043a\u0430 \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u043f\u0440\u043e\u0433\u0440\u0443\u0437\u044f\u0442\u0441\u044f/\u043f\u043e\u044f\u0432\u044f\u0442\u0441\u044f\n                    page.wait_for_timeout(300)\n                    is_expanded = True\n\n                # \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c, \u0438\u043c\u0435\u0435\u0442 \u043b\u0438 \u0443\u0437\u0435\u043b  \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b\n                children_count = node.locator('>div.v-treeview-node__children').count()\n                content = node.locator('>div.v-treeview-node__children').inner_html()\n                if children_count > 0 and len(content) != 0:\n                    has_children = True\n\n                # \u0420\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u044b\u0439 \u0432\u044b\u0437\u043e\u0432 \u0434\u043b\u044f \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0445 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432\n                # \u0418\u0449\u0435\u043c \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b *\u0432\u043d\u0443\u0442\u0440\u0438* \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u0443\u0437\u043b\u0430\n                if has_children and is_expanded:\n                    child_nodes_locator = root_locator.locator(f\">div:nth-child({index + 1})\").locator('>div.v-treeview-node__children')\n                    is_found = find_and_click_item(page, child_nodes_locator, item_name)\n                    if is_found:\n                        return True\n\n                # \u0437\u0430\u043a\u0440\u044b\u0432\u0430\u0435\u043c \u0443\u0437\u0435\u043b, \u0435\u0441\u043b\u0438 \u0432 \u043d\u0435\u043c \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u043d\u0430\u0448\u043b\u0438\n                if is_expanded:\n                    toggle_button = node.locator(NavigationPanelLocators.TOGGLE_BUTTON)\n                    toggle_button.click()\n\n        # \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0441 \u0437\u0430\u0434\u0430\u043d\u043d\u044b\u043c \u0438\u043c\u0435\u043d\u0435\u043c \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\n        return False\n\n    root_locator = self.get_locator(node_root_locator)\n    found = find_and_click_item(self.page, root_locator, item_name)\n    assert found, f\"Navigation panel item {item_name} is missing\"\n
    "},{"location":"components/navbar_component/#components.navbar_component.NavigationPanelComponent.get_item_names","title":"get_item_names(locator)","text":"

    \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0442\u0435\u043a\u0441\u0442\u044b \u0432\u0441\u0435\u0445 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u043f\u043e \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u043e\u043c\u0443 \u043b\u043e\u043a\u0430\u0442\u043e\u0440\u0443.

    Parameters:

    Name Type Description Default locator str | Locator

    \u041b\u043e\u043a\u0430\u0442\u043e\u0440 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0438\u043b\u0438 \u0441\u0442\u0440\u043e\u043a\u0430 \u0441 CSS/XPath.

    required

    Returns:

    Type Description list[str]

    \u0421\u043f\u0438\u0441\u043e\u043a \u0442\u0435\u043a\u0441\u0442\u043e\u0432 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432.

    Source code in components\\navbar_component.py
    def get_item_names(self, locator: str | Locator) -> list[str]:\n    \"\"\"\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0442\u0435\u043a\u0441\u0442\u044b \u0432\u0441\u0435\u0445 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u043f\u043e \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u043e\u043c\u0443 \u043b\u043e\u043a\u0430\u0442\u043e\u0440\u0443.\n\n    Args:\n        locator: \u041b\u043e\u043a\u0430\u0442\u043e\u0440 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0438\u043b\u0438 \u0441\u0442\u0440\u043e\u043a\u0430 \u0441 CSS/XPath.\n\n    Returns:\n        \u0421\u043f\u0438\u0441\u043e\u043a \u0442\u0435\u043a\u0441\u0442\u043e\u0432 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432.\n    \"\"\"\n\n    loc = self.get_locator(locator)\n    return loc.all_inner_texts()\n
    "},{"location":"components/navbar_component/#components.navbar_component.NavigationPanelComponent.traverse_panel_tree","title":"traverse_panel_tree(node_root_locator, level=0, debug=False)","text":"

    \u0420\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u043e \u043e\u0431\u0445\u043e\u0434\u0438\u0442 \u0434\u0435\u0440\u0435\u0432\u043e v-treeview \u0438 \u0432\u044b\u0432\u043e\u0434\u0438\u0442 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e\u0431 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u0445 \u0432 \u0440\u0435\u0436\u0438\u043c\u0435 \u043e\u0442\u043b\u0430\u0434\u043a\u0438 (debug=True).

    Parameters:

    Name Type Description Default node_root_locator str | Locator

    \u041b\u043e\u043a\u0430\u0442\u043e\u0440 \u0434\u043b\u044f \u043f\u043e\u0438\u0441\u043a\u0430 \u043a\u043e\u0440\u043d\u0435\u0432\u044b\u0445 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0434\u0435\u0440\u0435\u0432\u0430 (\u041b\u043e\u043a\u0430\u0442\u043e\u0440 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0438\u043b\u0438 \u0441\u0442\u0440\u043e\u043a\u0430 \u0441 CSS/XPath).

    required Source code in components\\navbar_component.py
    def traverse_panel_tree(self, node_root_locator: str | Locator, level=0, debug=False):\n    \"\"\"\n    \u0420\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u043e \u043e\u0431\u0445\u043e\u0434\u0438\u0442 \u0434\u0435\u0440\u0435\u0432\u043e v-treeview \u0438 \u0432\u044b\u0432\u043e\u0434\u0438\u0442 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e\u0431 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u0445 \u0432 \u0440\u0435\u0436\u0438\u043c\u0435 \u043e\u0442\u043b\u0430\u0434\u043a\u0438 (debug=True).\n\n    Args:\n        node_root_locator: \u041b\u043e\u043a\u0430\u0442\u043e\u0440 \u0434\u043b\u044f \u043f\u043e\u0438\u0441\u043a\u0430 \u043a\u043e\u0440\u043d\u0435\u0432\u044b\u0445 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0434\u0435\u0440\u0435\u0432\u0430 (\u041b\u043e\u043a\u0430\u0442\u043e\u0440 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0438\u043b\u0438 \u0441\u0442\u0440\u043e\u043a\u0430 \u0441 CSS/XPath).\n    \"\"\"\n    def traverse_tree(page, root_locator, level=0, debug=False):\n        # \u041d\u0430\u0445\u043e\u0434\u0438\u043c \u0432\u0441\u0435 \u043b\u043e\u043a\u0430\u0442\u043e\u0440\u044b \u043a\u043e\u0440\u043d\u0435\u0432\u044b\u0445 \u0443\u0437\u043b\u043e\u0432 \u043d\u0430 \u0442\u0435\u043a\u0443\u0449\u0435\u043c \u0443\u0440\u043e\u0432\u043d\u0435\n        nodes_count = root_locator.locator('>div.v-treeview-node').count()\n\n        for index in range(nodes_count):\n            node = root_locator.locator(f\">div:nth-child({index + 1})\").first\n\n            # \u0418\u0437\u0432\u043b\u0435\u043a\u0430\u0435\u043c \u0442\u0435\u043a\u0441\u0442 \u0438 \u0430\u0442\u0442\u0440\u0438\u0431\u0443\u0442\u044b \u0438\u0437 \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0433\u043e \u0443\u0437\u043b\u0430\n            node_text = node.inner_text()\n            node_class_attr = node.get_attribute('class')\n\n            is_expanded = False\n            has_children = False\n\n            # \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u043b\u0438\u0441\u0442 \u044d\u0442\u043e \u0438\u043b\u0438 \u043d\u0430\u0447\u0430\u043b\u043e \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u0430\n            if \"v-treeview-node--leaf\" in node_class_attr:\n                if debug:\n                    print(f'[{level}][{index}] {node_text} (LEAF, Expanded: {is_expanded}, Has Children: {has_children})')\n                    print(\"-----------------------------------------\")\n            else:\n                # \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c, \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043b\u0438 \u0443\u0437\u0435\u043b \u0440\u0430\u0441\u043a\u0440\u044b\u0442\u044b\u043c\n                class_attr = node.locator(NavigationPanelLocators.TOGGLE_BUTTON).get_attribute('class')\n\n                if \"v-treeview-node__toggle--open\" in class_attr:\n                    is_expanded = True\n\n                # \u0415\u0441\u043b\u0438 \u0443\u0437\u0435\u043b \u0437\u0430\u043a\u0440\u044b\u0442 \u043c\u043e\u0436\u0435\u043c \u0435\u0433\u043e \u0440\u0430\u0441\u043a\u0440\u044b\u0442\u044c\n                if is_expanded is False:\n                    toggle_button = node.locator(NavigationPanelLocators.TOGGLE_BUTTON)\n                    toggle_button.click()\n                    # \u0416\u0434\u0435\u043c, \u043f\u043e\u043a\u0430 \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u043f\u0440\u043e\u0433\u0440\u0443\u0437\u044f\u0442\u0441\u044f/\u043f\u043e\u044f\u0432\u044f\u0442\u0441\u044f\n                    page.wait_for_timeout(300)\n                    is_expanded = True\n\n                # \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c, \u0438\u043c\u0435\u0435\u0442 \u043b\u0438 \u0443\u0437\u0435\u043b  \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b\n                children_count = node.locator('>div.v-treeview-node__children').count()\n                content = node.locator('>div.v-treeview-node__children').inner_html()\n                if children_count > 0 and len(content) != 0:\n                    has_children = True\n\n                edited_node_text = node_text.replace(\"expand_more\\n\", \"\")\n\n                if debug:\n                    # \u0412\u044b\u0432\u043e\u0434\u0438\u043c \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e\u0431 \u0443\u0437\u043b\u0435\n                    print(f'[{level}][{index}] {edited_node_text} (NODE, Expanded: {is_expanded}, Has Children: {has_children})')\n                    print(\"-----------------------------------------\")\n\n                # \u0420\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u044b\u0439 \u0432\u044b\u0437\u043e\u0432 \u0434\u043b\u044f \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0445 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432\n                # \u0418\u0449\u0435\u043c \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b *\u0432\u043d\u0443\u0442\u0440\u0438* \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u0443\u0437\u043b\u0430\n                if has_children and is_expanded:\n                    child_nodes_locator = root_locator.locator(f\">div:nth-child({index + 1})\").locator('>div.v-treeview-node__children')\n                    traverse_tree(page, child_nodes_locator, level+1, debug)\n\n    root_locator = self.get_locator(node_root_locator)\n    traverse_tree(self.page, root_locator, level=level, debug=debug)\n
    "},{"location":"components/table_component/","title":"TableComponent","text":"

    \u041c\u043e\u0434\u0443\u043b\u044c \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430 \u0442\u0430\u0431\u043b\u0438\u0446\u044b. \u0421\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043a\u043b\u0430\u0441\u0441 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0442\u0430\u0431\u043b\u0438\u0447\u043d\u044b\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u043c\u0438.

    "},{"location":"components/table_component/#components.table_component.TableComponent","title":"TableComponent","text":"

    Bases: BaseComponent

    \u041a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 \u0442\u0430\u0431\u043b\u0438\u0446\u044b. \u041f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u043c\u0435\u0442\u043e\u0434\u044b \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0442\u0430\u0431\u043b\u0438\u0447\u043d\u044b\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u043c\u0438.

    Source code in components\\table_component.py
    class TableComponent(BaseComponent):\n    \"\"\"\u041a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 \u0442\u0430\u0431\u043b\u0438\u0446\u044b. \u041f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u043c\u0435\u0442\u043e\u0434\u044b \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0442\u0430\u0431\u043b\u0438\u0447\u043d\u044b\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u043c\u0438.\"\"\"\n\n    def __init__(self, page: Page):\n        \"\"\"\u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 \u0442\u0430\u0431\u043b\u0438\u0446\u044b.\n\n        Args:\n            page: \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.\n        \"\"\"\n\n        super().__init__(page)\n\n    # \u0414\u0435\u0439\u0441\u0442\u0432\u0438\u044f:\n    def get_row_locator(self, table_locator: str | Locator, row_index: int) -> Locator | None:\n        \"\"\"\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043b\u043e\u043a\u0430\u0442\u043e\u0440 \u0441\u0442\u0440\u043e\u043a\u0438 \u043f\u043e \u0438\u043d\u0434\u0435\u043a\u0441\u0443.\n\n        Args:\n            table_locator: \u041b\u043e\u043a\u0430\u0442\u043e\u0440 \u0442\u0430\u0431\u043b\u0438\u0446\u044b.\n            row_index: \u0418\u043d\u0434\u0435\u043a\u0441 \u0441\u0442\u0440\u043e\u043a\u0438.\n\n        Returns:\n            \u041b\u043e\u043a\u0430\u0442\u043e\u0440 \u0441\u0442\u0440\u043e\u043a\u0438 \u0438\u043b\u0438 None, \u0435\u0441\u043b\u0438 \u0438\u043d\u0434\u0435\u043a\u0441 \u0432\u043d\u0435 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0430.\n        \"\"\"\n\n        table = self.get_locator(table_locator)\n\n        rows = table.locator(\"//tbody/tr\")\n\n        if row_index in range(rows.count()):\n            return rows.nth(row_index)\n        else:\n            return None\n\n    def read(self, locator: str | Locator) -> list[list[str]]:\n        \"\"\"\u0427\u0438\u0442\u0430\u0435\u0442 \u0434\u0430\u043d\u043d\u044b\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u044b, \u0432\u043a\u043b\u044e\u0447\u0430\u044f \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0438.\n\n        Args:\n            locator: \u041b\u043e\u043a\u0430\u0442\u043e\u0440 \u0442\u0430\u0431\u043b\u0438\u0446\u044b.\n\n        Returns:\n            \u0414\u0432\u0443\u043c\u0435\u0440\u043d\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a \u0441 \u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u044b.\n        \"\"\"\n\n        table_data = []\n        table = self.get_locator(locator)\n\n        # \u0427\u0442\u0435\u043d\u0438\u0435 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430 \u0442\u0430\u0431\u043b\u0438\u0446\u044b\n        header_cells = table.locator(\"//thead/tr\")\n        header_cell_text = header_cells.nth(0).inner_text()\n        header_data = header_cell_text.split('\\n')\n        table_data.append(header_data)\n\n        # \u0427\u0442\u0435\u043d\u0438\u0435 \u044f\u0447\u0435\u0435\u043a \u0442\u0430\u0431\u043b\u0438\u0446\u044b\n        rows = table.locator(\"//tbody/tr\")\n        for i in range(rows.count()):\n            row = rows.nth(i)\n            cells = row.locator(\"td\")\n            row_data = []\n            for j in range(cells.count()):\n                cell_text = cells.nth(j).inner_text()\n                row_data.append(cell_text)\n            table_data.append(row_data)\n\n        return table_data\n\n    # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0438:\n    def check_first_row_visibility(self, locator: str | Locator) -> None:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u043f\u0435\u0440\u0432\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u044b.\n\n        Args:\n            locator: \u041b\u043e\u043a\u0430\u0442\u043e\u0440 \u0442\u0430\u0431\u043b\u0438\u0446\u044b.\n        \"\"\"\n\n        table = self.get_locator(locator)\n        first_row = table.locator(\"//tbody/tr\").first\n        expect(first_row).to_be_visible(), \"The first table row is not visible\"\n\n    def check_last_row_visibility(self, locator: str | Locator) -> None:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0439 \u0441\u0442\u0440\u043e\u043a\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u044b.\n\n        Args:\n            locator: \u041b\u043e\u043a\u0430\u0442\u043e\u0440 \u0442\u0430\u0431\u043b\u0438\u0446\u044b.\n        \"\"\"\n\n        table = self.get_locator(locator)\n        last_row = table.locator(\"//tbody/tr\").last\n        expect(last_row).to_be_visible(), \"The last table row is not visible\"\n\n    def check_row_highlighting(self, locator: str | Locator, row_index: int) -> None:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u0446\u0432\u0435\u0442\u0430 \u0441\u0442\u0440\u043e\u043a\u0438 \u043f\u0440\u0438 \u043d\u0430\u0432\u0435\u0434\u0435\u043d\u0438\u0438.\n\n        Args:\n            locator: \u041b\u043e\u043a\u0430\u0442\u043e\u0440 \u0442\u0430\u0431\u043b\u0438\u0446\u044b.\n            row_index: \u0418\u043d\u0434\u0435\u043a\u0441 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438.\n        \"\"\"\n\n        table = self.get_locator(locator)\n        row = table.locator(\"//tbody/tr\").nth(row_index)\n\n        row.scroll_into_view_if_needed()\n        hover_element = row.locator(\".body-row-hover\")\n        initial_color = hover_element.evaluate(\"el => window.getComputedStyle(el).backgroundColor\")\n\n        row.hover()\n        self.page.wait_for_timeout(300)\n\n        new_color = hover_element.evaluate(\"el => window.getComputedStyle(el).backgroundColor\")\n        assert initial_color != new_color, \"Color of row did not change when hovering the cursor\"\n
    "},{"location":"components/table_component/#components.table_component.TableComponent.__init__","title":"__init__(page)","text":"

    \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 \u0442\u0430\u0431\u043b\u0438\u0446\u044b.

    Parameters:

    Name Type Description Default page Page

    \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.

    required Source code in components\\table_component.py
    def __init__(self, page: Page):\n    \"\"\"\u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 \u0442\u0430\u0431\u043b\u0438\u0446\u044b.\n\n    Args:\n        page: \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.\n    \"\"\"\n\n    super().__init__(page)\n
    "},{"location":"components/table_component/#components.table_component.TableComponent.check_first_row_visibility","title":"check_first_row_visibility(locator)","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u043f\u0435\u0440\u0432\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u044b.

    Parameters:

    Name Type Description Default locator str | Locator

    \u041b\u043e\u043a\u0430\u0442\u043e\u0440 \u0442\u0430\u0431\u043b\u0438\u0446\u044b.

    required Source code in components\\table_component.py
    def check_first_row_visibility(self, locator: str | Locator) -> None:\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u043f\u0435\u0440\u0432\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u044b.\n\n    Args:\n        locator: \u041b\u043e\u043a\u0430\u0442\u043e\u0440 \u0442\u0430\u0431\u043b\u0438\u0446\u044b.\n    \"\"\"\n\n    table = self.get_locator(locator)\n    first_row = table.locator(\"//tbody/tr\").first\n    expect(first_row).to_be_visible(), \"The first table row is not visible\"\n
    "},{"location":"components/table_component/#components.table_component.TableComponent.check_last_row_visibility","title":"check_last_row_visibility(locator)","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0439 \u0441\u0442\u0440\u043e\u043a\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u044b.

    Parameters:

    Name Type Description Default locator str | Locator

    \u041b\u043e\u043a\u0430\u0442\u043e\u0440 \u0442\u0430\u0431\u043b\u0438\u0446\u044b.

    required Source code in components\\table_component.py
    def check_last_row_visibility(self, locator: str | Locator) -> None:\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0439 \u0441\u0442\u0440\u043e\u043a\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u044b.\n\n    Args:\n        locator: \u041b\u043e\u043a\u0430\u0442\u043e\u0440 \u0442\u0430\u0431\u043b\u0438\u0446\u044b.\n    \"\"\"\n\n    table = self.get_locator(locator)\n    last_row = table.locator(\"//tbody/tr\").last\n    expect(last_row).to_be_visible(), \"The last table row is not visible\"\n
    "},{"location":"components/table_component/#components.table_component.TableComponent.check_row_highlighting","title":"check_row_highlighting(locator, row_index)","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u0446\u0432\u0435\u0442\u0430 \u0441\u0442\u0440\u043e\u043a\u0438 \u043f\u0440\u0438 \u043d\u0430\u0432\u0435\u0434\u0435\u043d\u0438\u0438.

    Parameters:

    Name Type Description Default locator str | Locator

    \u041b\u043e\u043a\u0430\u0442\u043e\u0440 \u0442\u0430\u0431\u043b\u0438\u0446\u044b.

    required row_index int

    \u0418\u043d\u0434\u0435\u043a\u0441 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438.

    required Source code in components\\table_component.py
    def check_row_highlighting(self, locator: str | Locator, row_index: int) -> None:\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u0446\u0432\u0435\u0442\u0430 \u0441\u0442\u0440\u043e\u043a\u0438 \u043f\u0440\u0438 \u043d\u0430\u0432\u0435\u0434\u0435\u043d\u0438\u0438.\n\n    Args:\n        locator: \u041b\u043e\u043a\u0430\u0442\u043e\u0440 \u0442\u0430\u0431\u043b\u0438\u0446\u044b.\n        row_index: \u0418\u043d\u0434\u0435\u043a\u0441 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438.\n    \"\"\"\n\n    table = self.get_locator(locator)\n    row = table.locator(\"//tbody/tr\").nth(row_index)\n\n    row.scroll_into_view_if_needed()\n    hover_element = row.locator(\".body-row-hover\")\n    initial_color = hover_element.evaluate(\"el => window.getComputedStyle(el).backgroundColor\")\n\n    row.hover()\n    self.page.wait_for_timeout(300)\n\n    new_color = hover_element.evaluate(\"el => window.getComputedStyle(el).backgroundColor\")\n    assert initial_color != new_color, \"Color of row did not change when hovering the cursor\"\n
    "},{"location":"components/table_component/#components.table_component.TableComponent.get_row_locator","title":"get_row_locator(table_locator, row_index)","text":"

    \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043b\u043e\u043a\u0430\u0442\u043e\u0440 \u0441\u0442\u0440\u043e\u043a\u0438 \u043f\u043e \u0438\u043d\u0434\u0435\u043a\u0441\u0443.

    Parameters:

    Name Type Description Default table_locator str | Locator

    \u041b\u043e\u043a\u0430\u0442\u043e\u0440 \u0442\u0430\u0431\u043b\u0438\u0446\u044b.

    required row_index int

    \u0418\u043d\u0434\u0435\u043a\u0441 \u0441\u0442\u0440\u043e\u043a\u0438.

    required

    Returns:

    Type Description Locator | None

    \u041b\u043e\u043a\u0430\u0442\u043e\u0440 \u0441\u0442\u0440\u043e\u043a\u0438 \u0438\u043b\u0438 None, \u0435\u0441\u043b\u0438 \u0438\u043d\u0434\u0435\u043a\u0441 \u0432\u043d\u0435 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0430.

    Source code in components\\table_component.py
    def get_row_locator(self, table_locator: str | Locator, row_index: int) -> Locator | None:\n    \"\"\"\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043b\u043e\u043a\u0430\u0442\u043e\u0440 \u0441\u0442\u0440\u043e\u043a\u0438 \u043f\u043e \u0438\u043d\u0434\u0435\u043a\u0441\u0443.\n\n    Args:\n        table_locator: \u041b\u043e\u043a\u0430\u0442\u043e\u0440 \u0442\u0430\u0431\u043b\u0438\u0446\u044b.\n        row_index: \u0418\u043d\u0434\u0435\u043a\u0441 \u0441\u0442\u0440\u043e\u043a\u0438.\n\n    Returns:\n        \u041b\u043e\u043a\u0430\u0442\u043e\u0440 \u0441\u0442\u0440\u043e\u043a\u0438 \u0438\u043b\u0438 None, \u0435\u0441\u043b\u0438 \u0438\u043d\u0434\u0435\u043a\u0441 \u0432\u043d\u0435 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0430.\n    \"\"\"\n\n    table = self.get_locator(table_locator)\n\n    rows = table.locator(\"//tbody/tr\")\n\n    if row_index in range(rows.count()):\n        return rows.nth(row_index)\n    else:\n        return None\n
    "},{"location":"components/table_component/#components.table_component.TableComponent.read","title":"read(locator)","text":"

    \u0427\u0438\u0442\u0430\u0435\u0442 \u0434\u0430\u043d\u043d\u044b\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u044b, \u0432\u043a\u043b\u044e\u0447\u0430\u044f \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0438.

    Parameters:

    Name Type Description Default locator str | Locator

    \u041b\u043e\u043a\u0430\u0442\u043e\u0440 \u0442\u0430\u0431\u043b\u0438\u0446\u044b.

    required

    Returns:

    Type Description list[list[str]]

    \u0414\u0432\u0443\u043c\u0435\u0440\u043d\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a \u0441 \u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u044b.

    Source code in components\\table_component.py
    def read(self, locator: str | Locator) -> list[list[str]]:\n    \"\"\"\u0427\u0438\u0442\u0430\u0435\u0442 \u0434\u0430\u043d\u043d\u044b\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u044b, \u0432\u043a\u043b\u044e\u0447\u0430\u044f \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0438.\n\n    Args:\n        locator: \u041b\u043e\u043a\u0430\u0442\u043e\u0440 \u0442\u0430\u0431\u043b\u0438\u0446\u044b.\n\n    Returns:\n        \u0414\u0432\u0443\u043c\u0435\u0440\u043d\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a \u0441 \u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u044b.\n    \"\"\"\n\n    table_data = []\n    table = self.get_locator(locator)\n\n    # \u0427\u0442\u0435\u043d\u0438\u0435 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430 \u0442\u0430\u0431\u043b\u0438\u0446\u044b\n    header_cells = table.locator(\"//thead/tr\")\n    header_cell_text = header_cells.nth(0).inner_text()\n    header_data = header_cell_text.split('\\n')\n    table_data.append(header_data)\n\n    # \u0427\u0442\u0435\u043d\u0438\u0435 \u044f\u0447\u0435\u0435\u043a \u0442\u0430\u0431\u043b\u0438\u0446\u044b\n    rows = table.locator(\"//tbody/tr\")\n    for i in range(rows.count()):\n        row = rows.nth(i)\n        cells = row.locator(\"td\")\n        row_data = []\n        for j in range(cells.count()):\n            cell_text = cells.nth(j).inner_text()\n            row_data.append(cell_text)\n        table_data.append(row_data)\n\n    return table_data\n
    "},{"location":"components/toolbar_component/","title":"ToolbarComponent","text":"

    \u041c\u043e\u0434\u0443\u043b\u044c \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430 \u0442\u0443\u043b\u0431\u0430\u0440\u0430 (\u043f\u0430\u043d\u0435\u043b\u0438 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432).

    \u0421\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043a\u043b\u0430\u0441\u0441 ToolbarComponent \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u043c\u0438 \u0442\u0443\u043b\u0431\u0430\u0440\u0430: - \u0423\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043a\u043d\u043e\u043f\u043a\u0430\u043c\u0438 \u0438 \u0438\u0445 \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0430\u043c\u0438 - \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 - \u0412\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u0441 \u043f\u0430\u043d\u0435\u043b\u044c\u044e \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432

    "},{"location":"components/toolbar_component/#components.toolbar_component.ToolbarComponent","title":"ToolbarComponent","text":"

    Bases: BaseComponent

    \u041a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 \u0442\u0443\u043b\u0431\u0430\u0440\u0430. \u041f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u043c\u0435\u0442\u043e\u0434\u044b \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u043f\u0430\u043d\u0435\u043b\u044c\u044e \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432.

    Parameters:

    Name Type Description Default page Page

    \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright

    required title str

    \u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a \u0442\u0443\u043b\u0431\u0430\u0440\u0430

    required Source code in components\\toolbar_component.py
    class ToolbarComponent(BaseComponent):\n    \"\"\"\u041a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 \u0442\u0443\u043b\u0431\u0430\u0440\u0430. \u041f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u043c\u0435\u0442\u043e\u0434\u044b \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u043f\u0430\u043d\u0435\u043b\u044c\u044e \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432.\n\n    Args:\n        page (Page): \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright\n        title (str): \u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a \u0442\u0443\u043b\u0431\u0430\u0440\u0430\n    \"\"\"\n\n    def __init__(self, page: Page, title: str):\n        \"\"\"\u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 \u0442\u0443\u043b\u0431\u0430\u0440\u0430 \u0441 \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u044b\u043c \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u043e\u043c.\"\"\"\n\n        super().__init__(page)\n        self.title = title\n        self.buttons = []\n\n    def add_title(self, title: str) -> None:\n        \"\"\"\u0423\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442 \u043d\u043e\u0432\u044b\u0439 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a \u0442\u0443\u043b\u0431\u0430\u0440\u0430.\n\n        Args:\n            title (str): \u041d\u043e\u0432\u044b\u0439 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a\n        \"\"\"\n\n        self.title = title\n\n    def add_tooltip_button(self, locator: Locator, name: str) -> None:\n        \"\"\"\u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u043a\u043d\u043e\u043f\u043a\u0443 \u0441 \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u043e\u0439 \u0432 \u0442\u0443\u043b\u0431\u0430\u0440.\n\n        Args:\n            locator (Locator): \u041b\u043e\u043a\u0430\u0442\u043e\u0440 \u043a\u043d\u043e\u043f\u043a\u0438\n            name (str): \u0423\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u0435 \u0438\u043c\u044f \u043a\u043d\u043e\u043f\u043a\u0438\n        \"\"\"\n\n        self.buttons.append(TooltipButton(self.page, locator, name))\n\n    def add_tab_button(self, locator: Locator, name: str) -> None:\n        \"\"\"\u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u043a\u043d\u043e\u043f\u043a\u0443 \u0442\u0438\u043f\u0430 v-tab \u0432 \u0442\u0443\u043b\u0431\u0430\u0440.\n\n        Args:\n            locator (Locator): \u041b\u043e\u043a\u0430\u0442\u043e\u0440 \u043a\u043d\u043e\u043f\u043a\u0438\n            name (str): \u0423\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u0435 \u0438\u043c\u044f \u043a\u043d\u043e\u043f\u043a\u0438\n        \"\"\"\n\n        self.buttons.append(TabButton(self.page, locator, name))\n\n    def add_button(self, locator: Locator, name: str) -> None:\n        \"\"\"\u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u043a\u043d\u043e\u043f\u043a\u0443 \u0432 \u0442\u0443\u043b\u0431\u0430\u0440.\n\n        Args:\n            locator (Locator): \u041b\u043e\u043a\u0430\u0442\u043e\u0440 \u043a\u043d\u043e\u043f\u043a\u0438\n            name (str): \u0423\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u0435 \u0438\u043c\u044f \u043a\u043d\u043e\u043f\u043a\u0438\n        \"\"\"\n\n        self.buttons.append(Button(self.page, locator, name))\n\n    def get_button_by_name(self, name: str) -> TooltipButton | None:\n        \"\"\"\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043a\u043d\u043e\u043f\u043a\u0443 \u043f\u043e \u0438\u043c\u0435\u043d\u0438.\n\n        Args:\n            name (str): \u0418\u043c\u044f \u043a\u043d\u043e\u043f\u043a\u0438\n\n        Returns:\n            TooltipButton | None: \u041d\u0430\u0439\u0434\u0435\u043d\u043d\u0430\u044f \u043a\u043d\u043e\u043f\u043a\u0430 \u0438\u043b\u0438 None\n        \"\"\"\n\n        for button in self.buttons:\n            if button.name == name:\n                return button\n        return None\n\n    def click_button(self, name: str) -> None:\n        \"\"\"\u041a\u043b\u0438\u043a\u0430\u0435\u0442 \u043f\u043e \u043a\u043d\u043e\u043f\u043a\u0435 \u0442\u0443\u043b\u0431\u0430\u0440\u0430.\n\n        Args:\n            name (str): \u0418\u043c\u044f \u043a\u043d\u043e\u043f\u043a\u0438\n\n        Raises:\n            AssertionError: \u0415\u0441\u043b\u0438 \u043a\u043d\u043e\u043f\u043a\u0430 \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u0430\n        \"\"\"\n\n        button = self.get_button_by_name(name)\n        if button is None:\n            raise AssertionError(f\"Unsupported button name {name}\")\n        button.click()\n\n    def is_button_present(self, name: str) -> bool:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u043a\u043d\u043e\u043f\u043a\u0438.\n\n        Args:\n            name (str): \u0418\u043c\u044f \u043a\u043d\u043e\u043f\u043a\u0438\n\n        Returns:\n            bool: True \u0435\u0441\u043b\u0438 \u043a\u043d\u043e\u043f\u043a\u0430 \u043f\u0440\u0438\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442\n\n        Raises:\n            AssertionError: \u0415\u0441\u043b\u0438 \u0438\u043c\u044f \u043a\u043d\u043e\u043f\u043a\u0438 \u043d\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442\u0441\u044f\n        \"\"\"\n\n        button = self.get_button_by_name(name)\n        if button is None:\n            raise AssertionError(f\"Unsupported button name {name}\")\n        return button.is_present(timeout=1000)  # \u041e\u0436\u0438\u0434\u0430\u043d\u0438\u0435 1 \u0441\u0435\u043a\u0443\u043d\u0434\u0430\n\n    def is_button_not_present(self, name: str) -> bool:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u0435 \u043a\u043d\u043e\u043f\u043a\u0438.\n\n        Args:\n            name (str): \u0418\u043c\u044f \u043a\u043d\u043e\u043f\u043a\u0438\n\n        Returns:\n            bool: True \u0435\u0441\u043b\u0438 \u043a\u043d\u043e\u043f\u043a\u0430 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442\n\n        Raises:\n            AssertionError: \u0415\u0441\u043b\u0438 \u0438\u043c\u044f \u043a\u043d\u043e\u043f\u043a\u0438 \u043d\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442\u0441\u044f\n        \"\"\"\n\n        button = self.get_button_by_name(name)\n        if button is None:\n            raise AssertionError(f\"Unsupported button name {name}\")\n        return button.is_not_present(timeout=1000)  # \u041e\u0436\u0438\u0434\u0430\u043d\u0438\u0435 1 \u0441\u0435\u043a\u0443\u043d\u0434\u0430\n\n    def check_toolbar_presence(self, message: str) -> None:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u0442\u0443\u043b\u0431\u0430\u0440\u0430.\n\n        Args:\n            message (str): \u0421\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u043e\u0431 \u043e\u0448\u0438\u0431\u043a\u0435 \u0435\u0441\u043b\u0438 \u0442\u0443\u043b\u0431\u0430\u0440 \u043d\u0435 \u0432\u0438\u0434\u0435\u043d\n        \"\"\"\n\n        locator = self.get_locator(ToolbarLocators.TITLE).filter(has_text=self.title)\n        expect(locator).to_be_visible(), message\n\n    def check_button_visibility(self, name: str) -> None:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0438 \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u043a\u043d\u043e\u043f\u043a\u0438 \u0441 \u043f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0439 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u043e\u0439 \u043a \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0443.\n\n            Args:\n                name (str): \u0418\u043c\u044f \u043a\u043d\u043e\u043f\u043a\u0438\n\n            Raises:\n                AssertionError: \u0415\u0441\u043b\u0438 \u043a\u043d\u043e\u043f\u043a\u0430 \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u0430 \u0438\u043b\u0438 \u043d\u0435 \u0432\u0438\u0434\u043d\u0430\n            \"\"\"\n\n        button = self.get_button_by_name(name)\n\n        if button is None:\n            raise AssertionError(f\"Unsupported button name {name}\")\n\n        button.locator.scroll_into_view_if_needed()\n        button.check_visibility(f\"Button with name {name} is missing\")\n\n    def check_button_tooltip(self, name: str, tooltip: str) -> None:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0442\u0435\u043a\u0441\u0442 \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0438 \u043a\u043d\u043e\u043f\u043a\u0438.\n\n        Args:\n            name (str): \u0418\u043c\u044f \u043a\u043d\u043e\u043f\u043a\u0438\n            tooltip (str): \u041e\u0436\u0438\u0434\u0430\u0435\u043c\u044b\u0439 \u0442\u0435\u043a\u0441\u0442 \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0438\n\n        Raises:\n            AssertionError: \u0415\u0441\u043b\u0438 \u0442\u0435\u043a\u0441\u0442 \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0438 \u043d\u0435 \u0441\u043e\u0432\u043f\u0430\u0434\u0430\u0435\u0442\n        \"\"\"\n\n        button = self.get_button_by_name(name)\n        if button is None:\n            raise AssertionError(f\"Unsupported button name {name}\")\n        button.check_tooltip_with_text(tooltip)\n
    "},{"location":"components/toolbar_component/#components.toolbar_component.ToolbarComponent.__init__","title":"__init__(page, title)","text":"

    \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 \u0442\u0443\u043b\u0431\u0430\u0440\u0430 \u0441 \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u044b\u043c \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u043e\u043c.

    Source code in components\\toolbar_component.py
    def __init__(self, page: Page, title: str):\n    \"\"\"\u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 \u0442\u0443\u043b\u0431\u0430\u0440\u0430 \u0441 \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u044b\u043c \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u043e\u043c.\"\"\"\n\n    super().__init__(page)\n    self.title = title\n    self.buttons = []\n
    "},{"location":"components/toolbar_component/#components.toolbar_component.ToolbarComponent.add_button","title":"add_button(locator, name)","text":"

    \u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u043a\u043d\u043e\u043f\u043a\u0443 \u0432 \u0442\u0443\u043b\u0431\u0430\u0440.

    Parameters:

    Name Type Description Default locator Locator

    \u041b\u043e\u043a\u0430\u0442\u043e\u0440 \u043a\u043d\u043e\u043f\u043a\u0438

    required name str

    \u0423\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u0435 \u0438\u043c\u044f \u043a\u043d\u043e\u043f\u043a\u0438

    required Source code in components\\toolbar_component.py
    def add_button(self, locator: Locator, name: str) -> None:\n    \"\"\"\u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u043a\u043d\u043e\u043f\u043a\u0443 \u0432 \u0442\u0443\u043b\u0431\u0430\u0440.\n\n    Args:\n        locator (Locator): \u041b\u043e\u043a\u0430\u0442\u043e\u0440 \u043a\u043d\u043e\u043f\u043a\u0438\n        name (str): \u0423\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u0435 \u0438\u043c\u044f \u043a\u043d\u043e\u043f\u043a\u0438\n    \"\"\"\n\n    self.buttons.append(Button(self.page, locator, name))\n
    "},{"location":"components/toolbar_component/#components.toolbar_component.ToolbarComponent.add_tab_button","title":"add_tab_button(locator, name)","text":"

    \u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u043a\u043d\u043e\u043f\u043a\u0443 \u0442\u0438\u043f\u0430 v-tab \u0432 \u0442\u0443\u043b\u0431\u0430\u0440.

    Parameters:

    Name Type Description Default locator Locator

    \u041b\u043e\u043a\u0430\u0442\u043e\u0440 \u043a\u043d\u043e\u043f\u043a\u0438

    required name str

    \u0423\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u0435 \u0438\u043c\u044f \u043a\u043d\u043e\u043f\u043a\u0438

    required Source code in components\\toolbar_component.py
    def add_tab_button(self, locator: Locator, name: str) -> None:\n    \"\"\"\u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u043a\u043d\u043e\u043f\u043a\u0443 \u0442\u0438\u043f\u0430 v-tab \u0432 \u0442\u0443\u043b\u0431\u0430\u0440.\n\n    Args:\n        locator (Locator): \u041b\u043e\u043a\u0430\u0442\u043e\u0440 \u043a\u043d\u043e\u043f\u043a\u0438\n        name (str): \u0423\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u0435 \u0438\u043c\u044f \u043a\u043d\u043e\u043f\u043a\u0438\n    \"\"\"\n\n    self.buttons.append(TabButton(self.page, locator, name))\n
    "},{"location":"components/toolbar_component/#components.toolbar_component.ToolbarComponent.add_title","title":"add_title(title)","text":"

    \u0423\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442 \u043d\u043e\u0432\u044b\u0439 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a \u0442\u0443\u043b\u0431\u0430\u0440\u0430.

    Parameters:

    Name Type Description Default title str

    \u041d\u043e\u0432\u044b\u0439 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a

    required Source code in components\\toolbar_component.py
    def add_title(self, title: str) -> None:\n    \"\"\"\u0423\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442 \u043d\u043e\u0432\u044b\u0439 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a \u0442\u0443\u043b\u0431\u0430\u0440\u0430.\n\n    Args:\n        title (str): \u041d\u043e\u0432\u044b\u0439 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a\n    \"\"\"\n\n    self.title = title\n
    "},{"location":"components/toolbar_component/#components.toolbar_component.ToolbarComponent.add_tooltip_button","title":"add_tooltip_button(locator, name)","text":"

    \u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u043a\u043d\u043e\u043f\u043a\u0443 \u0441 \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u043e\u0439 \u0432 \u0442\u0443\u043b\u0431\u0430\u0440.

    Parameters:

    Name Type Description Default locator Locator

    \u041b\u043e\u043a\u0430\u0442\u043e\u0440 \u043a\u043d\u043e\u043f\u043a\u0438

    required name str

    \u0423\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u0435 \u0438\u043c\u044f \u043a\u043d\u043e\u043f\u043a\u0438

    required Source code in components\\toolbar_component.py
    def add_tooltip_button(self, locator: Locator, name: str) -> None:\n    \"\"\"\u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u043a\u043d\u043e\u043f\u043a\u0443 \u0441 \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u043e\u0439 \u0432 \u0442\u0443\u043b\u0431\u0430\u0440.\n\n    Args:\n        locator (Locator): \u041b\u043e\u043a\u0430\u0442\u043e\u0440 \u043a\u043d\u043e\u043f\u043a\u0438\n        name (str): \u0423\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u0435 \u0438\u043c\u044f \u043a\u043d\u043e\u043f\u043a\u0438\n    \"\"\"\n\n    self.buttons.append(TooltipButton(self.page, locator, name))\n
    "},{"location":"components/toolbar_component/#components.toolbar_component.ToolbarComponent.check_button_tooltip","title":"check_button_tooltip(name, tooltip)","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0442\u0435\u043a\u0441\u0442 \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0438 \u043a\u043d\u043e\u043f\u043a\u0438.

    Parameters:

    Name Type Description Default name str

    \u0418\u043c\u044f \u043a\u043d\u043e\u043f\u043a\u0438

    required tooltip str

    \u041e\u0436\u0438\u0434\u0430\u0435\u043c\u044b\u0439 \u0442\u0435\u043a\u0441\u0442 \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0438

    required

    Raises:

    Type Description AssertionError

    \u0415\u0441\u043b\u0438 \u0442\u0435\u043a\u0441\u0442 \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0438 \u043d\u0435 \u0441\u043e\u0432\u043f\u0430\u0434\u0430\u0435\u0442

    Source code in components\\toolbar_component.py
    def check_button_tooltip(self, name: str, tooltip: str) -> None:\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0442\u0435\u043a\u0441\u0442 \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0438 \u043a\u043d\u043e\u043f\u043a\u0438.\n\n    Args:\n        name (str): \u0418\u043c\u044f \u043a\u043d\u043e\u043f\u043a\u0438\n        tooltip (str): \u041e\u0436\u0438\u0434\u0430\u0435\u043c\u044b\u0439 \u0442\u0435\u043a\u0441\u0442 \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0438\n\n    Raises:\n        AssertionError: \u0415\u0441\u043b\u0438 \u0442\u0435\u043a\u0441\u0442 \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0438 \u043d\u0435 \u0441\u043e\u0432\u043f\u0430\u0434\u0430\u0435\u0442\n    \"\"\"\n\n    button = self.get_button_by_name(name)\n    if button is None:\n        raise AssertionError(f\"Unsupported button name {name}\")\n    button.check_tooltip_with_text(tooltip)\n
    "},{"location":"components/toolbar_component/#components.toolbar_component.ToolbarComponent.check_button_visibility","title":"check_button_visibility(name)","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0438 \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u043a\u043d\u043e\u043f\u043a\u0438 \u0441 \u043f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0439 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u043e\u0439 \u043a \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0443.

    Parameters:

    Name Type Description Default name str

    \u0418\u043c\u044f \u043a\u043d\u043e\u043f\u043a\u0438

    required

    Raises:

    Type Description AssertionError

    \u0415\u0441\u043b\u0438 \u043a\u043d\u043e\u043f\u043a\u0430 \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u0430 \u0438\u043b\u0438 \u043d\u0435 \u0432\u0438\u0434\u043d\u0430

    Source code in components\\toolbar_component.py
    def check_button_visibility(self, name: str) -> None:\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0438 \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u043a\u043d\u043e\u043f\u043a\u0438 \u0441 \u043f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0439 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u043e\u0439 \u043a \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0443.\n\n        Args:\n            name (str): \u0418\u043c\u044f \u043a\u043d\u043e\u043f\u043a\u0438\n\n        Raises:\n            AssertionError: \u0415\u0441\u043b\u0438 \u043a\u043d\u043e\u043f\u043a\u0430 \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u0430 \u0438\u043b\u0438 \u043d\u0435 \u0432\u0438\u0434\u043d\u0430\n        \"\"\"\n\n    button = self.get_button_by_name(name)\n\n    if button is None:\n        raise AssertionError(f\"Unsupported button name {name}\")\n\n    button.locator.scroll_into_view_if_needed()\n    button.check_visibility(f\"Button with name {name} is missing\")\n
    "},{"location":"components/toolbar_component/#components.toolbar_component.ToolbarComponent.check_toolbar_presence","title":"check_toolbar_presence(message)","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u0442\u0443\u043b\u0431\u0430\u0440\u0430.

    Parameters:

    Name Type Description Default message str

    \u0421\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u043e\u0431 \u043e\u0448\u0438\u0431\u043a\u0435 \u0435\u0441\u043b\u0438 \u0442\u0443\u043b\u0431\u0430\u0440 \u043d\u0435 \u0432\u0438\u0434\u0435\u043d

    required Source code in components\\toolbar_component.py
    def check_toolbar_presence(self, message: str) -> None:\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u0442\u0443\u043b\u0431\u0430\u0440\u0430.\n\n    Args:\n        message (str): \u0421\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u043e\u0431 \u043e\u0448\u0438\u0431\u043a\u0435 \u0435\u0441\u043b\u0438 \u0442\u0443\u043b\u0431\u0430\u0440 \u043d\u0435 \u0432\u0438\u0434\u0435\u043d\n    \"\"\"\n\n    locator = self.get_locator(ToolbarLocators.TITLE).filter(has_text=self.title)\n    expect(locator).to_be_visible(), message\n
    "},{"location":"components/toolbar_component/#components.toolbar_component.ToolbarComponent.click_button","title":"click_button(name)","text":"

    \u041a\u043b\u0438\u043a\u0430\u0435\u0442 \u043f\u043e \u043a\u043d\u043e\u043f\u043a\u0435 \u0442\u0443\u043b\u0431\u0430\u0440\u0430.

    Parameters:

    Name Type Description Default name str

    \u0418\u043c\u044f \u043a\u043d\u043e\u043f\u043a\u0438

    required

    Raises:

    Type Description AssertionError

    \u0415\u0441\u043b\u0438 \u043a\u043d\u043e\u043f\u043a\u0430 \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u0430

    Source code in components\\toolbar_component.py
    def click_button(self, name: str) -> None:\n    \"\"\"\u041a\u043b\u0438\u043a\u0430\u0435\u0442 \u043f\u043e \u043a\u043d\u043e\u043f\u043a\u0435 \u0442\u0443\u043b\u0431\u0430\u0440\u0430.\n\n    Args:\n        name (str): \u0418\u043c\u044f \u043a\u043d\u043e\u043f\u043a\u0438\n\n    Raises:\n        AssertionError: \u0415\u0441\u043b\u0438 \u043a\u043d\u043e\u043f\u043a\u0430 \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u0430\n    \"\"\"\n\n    button = self.get_button_by_name(name)\n    if button is None:\n        raise AssertionError(f\"Unsupported button name {name}\")\n    button.click()\n
    "},{"location":"components/toolbar_component/#components.toolbar_component.ToolbarComponent.get_button_by_name","title":"get_button_by_name(name)","text":"

    \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043a\u043d\u043e\u043f\u043a\u0443 \u043f\u043e \u0438\u043c\u0435\u043d\u0438.

    Parameters:

    Name Type Description Default name str

    \u0418\u043c\u044f \u043a\u043d\u043e\u043f\u043a\u0438

    required

    Returns:

    Type Description TooltipButton | None

    TooltipButton | None: \u041d\u0430\u0439\u0434\u0435\u043d\u043d\u0430\u044f \u043a\u043d\u043e\u043f\u043a\u0430 \u0438\u043b\u0438 None

    Source code in components\\toolbar_component.py
    def get_button_by_name(self, name: str) -> TooltipButton | None:\n    \"\"\"\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043a\u043d\u043e\u043f\u043a\u0443 \u043f\u043e \u0438\u043c\u0435\u043d\u0438.\n\n    Args:\n        name (str): \u0418\u043c\u044f \u043a\u043d\u043e\u043f\u043a\u0438\n\n    Returns:\n        TooltipButton | None: \u041d\u0430\u0439\u0434\u0435\u043d\u043d\u0430\u044f \u043a\u043d\u043e\u043f\u043a\u0430 \u0438\u043b\u0438 None\n    \"\"\"\n\n    for button in self.buttons:\n        if button.name == name:\n            return button\n    return None\n
    "},{"location":"components/toolbar_component/#components.toolbar_component.ToolbarComponent.is_button_not_present","title":"is_button_not_present(name)","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u0435 \u043a\u043d\u043e\u043f\u043a\u0438.

    Parameters:

    Name Type Description Default name str

    \u0418\u043c\u044f \u043a\u043d\u043e\u043f\u043a\u0438

    required

    Returns:

    Name Type Description bool bool

    True \u0435\u0441\u043b\u0438 \u043a\u043d\u043e\u043f\u043a\u0430 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442

    Raises:

    Type Description AssertionError

    \u0415\u0441\u043b\u0438 \u0438\u043c\u044f \u043a\u043d\u043e\u043f\u043a\u0438 \u043d\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442\u0441\u044f

    Source code in components\\toolbar_component.py
    def is_button_not_present(self, name: str) -> bool:\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u0435 \u043a\u043d\u043e\u043f\u043a\u0438.\n\n    Args:\n        name (str): \u0418\u043c\u044f \u043a\u043d\u043e\u043f\u043a\u0438\n\n    Returns:\n        bool: True \u0435\u0441\u043b\u0438 \u043a\u043d\u043e\u043f\u043a\u0430 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442\n\n    Raises:\n        AssertionError: \u0415\u0441\u043b\u0438 \u0438\u043c\u044f \u043a\u043d\u043e\u043f\u043a\u0438 \u043d\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442\u0441\u044f\n    \"\"\"\n\n    button = self.get_button_by_name(name)\n    if button is None:\n        raise AssertionError(f\"Unsupported button name {name}\")\n    return button.is_not_present(timeout=1000)  # \u041e\u0436\u0438\u0434\u0430\u043d\u0438\u0435 1 \u0441\u0435\u043a\u0443\u043d\u0434\u0430\n
    "},{"location":"components/toolbar_component/#components.toolbar_component.ToolbarComponent.is_button_present","title":"is_button_present(name)","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u043a\u043d\u043e\u043f\u043a\u0438.

    Parameters:

    Name Type Description Default name str

    \u0418\u043c\u044f \u043a\u043d\u043e\u043f\u043a\u0438

    required

    Returns:

    Name Type Description bool bool

    True \u0435\u0441\u043b\u0438 \u043a\u043d\u043e\u043f\u043a\u0430 \u043f\u0440\u0438\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442

    Raises:

    Type Description AssertionError

    \u0415\u0441\u043b\u0438 \u0438\u043c\u044f \u043a\u043d\u043e\u043f\u043a\u0438 \u043d\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442\u0441\u044f

    Source code in components\\toolbar_component.py
    def is_button_present(self, name: str) -> bool:\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u043a\u043d\u043e\u043f\u043a\u0438.\n\n    Args:\n        name (str): \u0418\u043c\u044f \u043a\u043d\u043e\u043f\u043a\u0438\n\n    Returns:\n        bool: True \u0435\u0441\u043b\u0438 \u043a\u043d\u043e\u043f\u043a\u0430 \u043f\u0440\u0438\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442\n\n    Raises:\n        AssertionError: \u0415\u0441\u043b\u0438 \u0438\u043c\u044f \u043a\u043d\u043e\u043f\u043a\u0438 \u043d\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442\u0441\u044f\n    \"\"\"\n\n    button = self.get_button_by_name(name)\n    if button is None:\n        raise AssertionError(f\"Unsupported button name {name}\")\n    return button.is_present(timeout=1000)  # \u041e\u0436\u0438\u0434\u0430\u043d\u0438\u0435 1 \u0441\u0435\u043a\u0443\u043d\u0434\u0430\n
    "},{"location":"components_derived/dialog_user_settings/","title":"UserSettingsDialogWindow","text":"

    \u041c\u043e\u0434\u0443\u043b\u044c \u0434\u0438\u0430\u043b\u043e\u0433\u043e\u0432\u043e\u0433\u043e \u043e\u043a\u043d\u0430 \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0430 \u0441\u0435\u0441\u0441\u0438\u043e\u043d\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.

    \u0421\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043a\u043b\u0430\u0441\u0441 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0434\u0438\u0430\u043b\u043e\u0433\u043e\u0432\u044b\u043c \u043e\u043a\u043d\u043e\u043c \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0430 \u0441\u0435\u0441\u0441\u0438\u043e\u043d\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0447\u0435\u0440\u0435\u0437 Playwright.

    "},{"location":"components_derived/dialog_user_settings/#components_derived.dialog_user_settings.UserSettingsDialogWindow","title":"UserSettingsDialogWindow","text":"

    Bases: BaseComponent

    \u041a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 \u0434\u0438\u0430\u043b\u043e\u0433\u043e\u0432\u043e\u0435 \u043e\u043a\u043d\u043e \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0430 \u0441\u0435\u0441\u0441\u0438\u043e\u043d\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.

    \u041f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u043c\u0435\u0442\u043e\u0434\u044b \u0434\u043b\u044f \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0441 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u043c\u0438 \u0434\u0438\u0430\u043b\u043e\u0433\u043e\u0432\u043e\u0433\u043e \u043e\u043a\u043d\u0430 \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0430 \u0441\u0435\u0441\u0441\u0438\u043e\u043d\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b.

    Source code in components_derived\\dialog_user_settings.py
    class UserSettingsDialogWindow(BaseComponent):\n    \"\"\"\u041a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 \u0434\u0438\u0430\u043b\u043e\u0433\u043e\u0432\u043e\u0435 \u043e\u043a\u043d\u043e \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0430 \u0441\u0435\u0441\u0441\u0438\u043e\u043d\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\n\n    \u041f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u043c\u0435\u0442\u043e\u0434\u044b \u0434\u043b\u044f \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0441 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u043c\u0438\n    \u0434\u0438\u0430\u043b\u043e\u0433\u043e\u0432\u043e\u0433\u043e \u043e\u043a\u043d\u0430 \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0430 \u0441\u0435\u0441\u0441\u0438\u043e\u043d\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b.\n    \"\"\"\n\n    def __init__(self, page: Page):\n        \"\"\"\u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 \u0434\u0438\u0430\u043b\u043e\u0433\u043e\u0432\u043e\u0435 \u043e\u043a\u043d\u043e \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0430 \u0441\u0435\u0441\u0441\u0438\u043e\u043d\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b.\n\n        Args:\n            page: \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.\n        \"\"\"\n\n        super().__init__(page)\n\n        dialog_window_locator = page.locator(UserCardLocators.DIALOG_USER_SETTINGS)\n\n        self.dialog_window_title = Text(page,\n                                        dialog_window_locator.\\\n                                        locator(UserCardLocators.TITLE_DIALOG_USER_SETTINGS),\n                                        \"dialog window title\")\n        self.close_button = Button(page,\n                                   dialog_window_locator.\\\n                                   locator(UserCardLocators.HEADER_DIALOG_USER_SETTINGS). \\\n                                   get_by_role(\"button\"),\n                                   \"close button\")\n\n        self.user_settings_table = TableComponent(page)\n\n    # \u0414\u0435\u0439\u0441\u0442\u0432\u0438\u044f:\n    def click_close_button(self):\n        \"\"\"\u041d\u0430\u0436\u0438\u043c\u0430\u0435\u0442 \u043a\u043d\u043e\u043f\u043a\u0443 \u0437\u0430\u043a\u0440\u044b\u0442\u0438\u044f \u043e\u043a\u043d\u0430.\n\n        \u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u043a\u043b\u0438\u043a \u043f\u043e \u043a\u043d\u043e\u043f\u043a\u0435 '\u0417\u0430\u043a\u0440\u044b\u0442\u044c' \u043d\u0430 \u0441\u0442\u0440\u043e\u043a\u0435 \u0441 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u043e\u043c \u043e\u043a\u043d\u0430.\n        \"\"\"\n\n        self.close_button.click()\n\n    def get_delete_button_from_row(self, row_index: int) -> TooltipButton:\n        \"\"\"\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043a\u043d\u043e\u043f\u043a\u0443 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u0441\u0435\u0430\u043d\u0441\u0430 \u0434\u043b\u044f \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438.\n\n        Args:\n            row_index: \u0418\u043d\u0434\u0435\u043a\u0441 \u0441\u0442\u0440\u043e\u043a\u0438 \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435.\n\n        Returns:\n            TooltipButton: \u041a\u043d\u043e\u043f\u043a\u0430 \u0441 \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u043e\u0439.\n\n        Raises:\n            AssertionError: \u0415\u0441\u043b\u0438 \u0441\u0442\u0440\u043e\u043a\u0430 \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u0430.\n        \"\"\"\n\n        row_locator = self.user_settings_table.get_row_locator(\n            UserCardLocators.TABLE_WORK_AREA,\n            row_index\n        )\n        assert isinstance(row_locator, Locator), f\"Row with index {row_index} is missing\"\n\n        button_locator = row_locator.get_by_role(\"button\")\n        return TooltipButton(self.page, button_locator, \"delete_button\")\n\n    # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0438:\n    def check_content(self) -> None:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u043e\u043a\u043d\u043e \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0430 \u0441\u0435\u0441\u0441\u0438\u043e\u043d\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\"\"\"\n\n        self.dialog_window_title.check_have_text(\"\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438\", \\\n                                                 \"Title '\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438' is missing on user settings window top\")\n        self.close_button.check_visibility(\"Close button is missing on user settings window top\")\n\n        self.should_be_user_settings_table()\n        self.check_user_settings_table_content()\n\n    def check_window_absence(self) -> None:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u044f \u043e\u043a\u043d\u0430 \u043d\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435.\n\n        Raises:\n            AssertionError: \u0435\u0441\u043b\u0438 \u043e\u043a\u043do \u043f\u0440\u0438\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u043d\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435.\n        \"\"\"\n\n        self.check_absence(UserCardLocators.DIALOG_USER_SETTINGS, \\\n                           \"User settings dialog window is present\")\n\n    def check_window_visibility(self) -> None:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u043a\u043d\u0430 \u043d\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435.\n\n        Raises:\n            AssertionError: \u0435\u0441\u043b\u0438 \u043e\u043a\u043do \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u043d\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435.\n        \"\"\"\n\n        self.check_visibility(UserCardLocators.DIALOG_USER_SETTINGS, \\\n                              \"User settings dialog window is missing\")\n\n\n    def check_user_settings_table_content(self) -> None:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0441\u0435\u0441\u0441\u0438\u043e\u043d\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\n\n\n        Raises:\n            AssertionError: \u0415\u0441\u043b\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u043f\u0443\u0441\u0442\u0430 \u0438\u043b\u0438 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0438 \u043d\u0435\u0432\u0435\u0440\u043d\u044b.\n        \"\"\"\n\n        expected_headers = [\n            '\u041f\u041e\u041b\u042c\u0417\u041e\u0412\u0410\u0422\u0415\u041b\u042c',\n            'IP \u0410\u0414\u0420\u0415\u0421',\n            '\u0412\u0420\u0415\u041c\u042f \u041d\u0410\u0427\u0410\u041b\u0410 \u0421\u0415\u0421\u0421\u0418\u0418',\n            '\u0414\u0415\u0419\u0421\u0422\u0412\u0418\u042f'\n        ]\n\n        table_content = self.user_settings_table.read(UserCardLocators.TABLE_WORK_AREA)\n        len_table_content = len(table_content)\n\n        if len_table_content == 0:\n            assert False, \"The contents of the table are missing\"\n\n        actual_headers = table_content[0]\n\n        assert actual_headers == expected_headers,\\\n               f\"Expected table headers {expected_headers} are not equal {actual_headers}\"\n\n        if len_table_content == 1:\n            assert False, \"Table body is missing\"\n\n        for index in range(len_table_content - 1):\n            self.should_be_delete_button_on_user_settings_table_row(index, \"\u0423\u0434\u0430\u043b\u0438\u0442\u044c\")\n\n    def should_be_user_settings_table(self) -> None:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0441\u0435\u0441\u0441\u0438\u043e\u043d\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\n\n        Raises:\n            AssertionError: \u0415\u0441\u043b\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442.\n        \"\"\"\n\n        self.user_settings_table.check_visibility(\n                            UserCardLocators.TABLE_WORK_AREA,\n                            \"User settings table is missing\")\n\n    def should_be_delete_button_on_user_settings_table_row(self,\n                                                                row_index: int,\n                                                                tooltip: str\n                                                               ) -> None:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u043a\u043d\u043e\u043f\u043a\u0438 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u0432 \u0441\u0442\u0440\u043e\u043a\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u044b.\n\n        Args:\n            row_index: \u0418\u043d\u0434\u0435\u043a\u0441 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438.\n            tooltip: \u041e\u0436\u0438\u0434\u0430\u0435\u043c\u044b\u0439 \u0442\u0435\u043a\u0441\u0442 \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0438.\n\n        Raises:\n            AssertionError: \u0415\u0441\u043b\u0438 \u043a\u043d\u043e\u043f\u043a\u0430 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u0438\u043b\u0438 \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0430 \u043d\u0435\u0432\u0435\u0440\u043d\u0430.\n        \"\"\"\n\n        delete_button = self.get_delete_button_from_row(row_index)\n\n        # \u041e\u0436\u0438\u0434\u0430\u0435\u043c \u0438\u0441\u0447\u0435\u0437\u043d\u043e\u0432\u0435\u043d\u0438\u044f \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0445 \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043e\u043a \u043f\u0435\u0440\u0435\u0434 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u043e\u0439\n        delete_button.wait_for_tooltip_to_disappear()\n\n        delete_button.check_visibility(\n            f\"Delete session button is missing on {row_index} row\"\n        )\n        delete_button.check_tooltip_with_text(tooltip)\n\n        # \u041e\u0436\u0438\u0434\u0430\u0435\u043c \u0438\u0441\u0447\u0435\u0437\u043d\u043e\u0432\u0435\u043d\u0438\u044f \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0438 \u043f\u043e\u0441\u043b\u0435 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438\n        delete_button.wait_for_tooltip_to_disappear()\n
    "},{"location":"components_derived/dialog_user_settings/#components_derived.dialog_user_settings.UserSettingsDialogWindow.__init__","title":"__init__(page)","text":"

    \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 \u0434\u0438\u0430\u043b\u043e\u0433\u043e\u0432\u043e\u0435 \u043e\u043a\u043d\u043e \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0430 \u0441\u0435\u0441\u0441\u0438\u043e\u043d\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b.

    Parameters:

    Name Type Description Default page Page

    \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.

    required Source code in components_derived\\dialog_user_settings.py
    def __init__(self, page: Page):\n    \"\"\"\u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 \u0434\u0438\u0430\u043b\u043e\u0433\u043e\u0432\u043e\u0435 \u043e\u043a\u043d\u043e \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0430 \u0441\u0435\u0441\u0441\u0438\u043e\u043d\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b.\n\n    Args:\n        page: \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.\n    \"\"\"\n\n    super().__init__(page)\n\n    dialog_window_locator = page.locator(UserCardLocators.DIALOG_USER_SETTINGS)\n\n    self.dialog_window_title = Text(page,\n                                    dialog_window_locator.\\\n                                    locator(UserCardLocators.TITLE_DIALOG_USER_SETTINGS),\n                                    \"dialog window title\")\n    self.close_button = Button(page,\n                               dialog_window_locator.\\\n                               locator(UserCardLocators.HEADER_DIALOG_USER_SETTINGS). \\\n                               get_by_role(\"button\"),\n                               \"close button\")\n\n    self.user_settings_table = TableComponent(page)\n
    "},{"location":"components_derived/dialog_user_settings/#components_derived.dialog_user_settings.UserSettingsDialogWindow.check_content","title":"check_content()","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u043e\u043a\u043d\u043e \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0430 \u0441\u0435\u0441\u0441\u0438\u043e\u043d\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.

    Source code in components_derived\\dialog_user_settings.py
    def check_content(self) -> None:\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u043e\u043a\u043d\u043e \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0430 \u0441\u0435\u0441\u0441\u0438\u043e\u043d\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\"\"\"\n\n    self.dialog_window_title.check_have_text(\"\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438\", \\\n                                             \"Title '\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438' is missing on user settings window top\")\n    self.close_button.check_visibility(\"Close button is missing on user settings window top\")\n\n    self.should_be_user_settings_table()\n    self.check_user_settings_table_content()\n
    "},{"location":"components_derived/dialog_user_settings/#components_derived.dialog_user_settings.UserSettingsDialogWindow.check_user_settings_table_content","title":"check_user_settings_table_content()","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0441\u0435\u0441\u0441\u0438\u043e\u043d\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.

    Raises:

    Type Description AssertionError

    \u0415\u0441\u043b\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u043f\u0443\u0441\u0442\u0430 \u0438\u043b\u0438 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0438 \u043d\u0435\u0432\u0435\u0440\u043d\u044b.

    Source code in components_derived\\dialog_user_settings.py
    def check_user_settings_table_content(self) -> None:\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0441\u0435\u0441\u0441\u0438\u043e\u043d\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\n\n\n    Raises:\n        AssertionError: \u0415\u0441\u043b\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u043f\u0443\u0441\u0442\u0430 \u0438\u043b\u0438 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0438 \u043d\u0435\u0432\u0435\u0440\u043d\u044b.\n    \"\"\"\n\n    expected_headers = [\n        '\u041f\u041e\u041b\u042c\u0417\u041e\u0412\u0410\u0422\u0415\u041b\u042c',\n        'IP \u0410\u0414\u0420\u0415\u0421',\n        '\u0412\u0420\u0415\u041c\u042f \u041d\u0410\u0427\u0410\u041b\u0410 \u0421\u0415\u0421\u0421\u0418\u0418',\n        '\u0414\u0415\u0419\u0421\u0422\u0412\u0418\u042f'\n    ]\n\n    table_content = self.user_settings_table.read(UserCardLocators.TABLE_WORK_AREA)\n    len_table_content = len(table_content)\n\n    if len_table_content == 0:\n        assert False, \"The contents of the table are missing\"\n\n    actual_headers = table_content[0]\n\n    assert actual_headers == expected_headers,\\\n           f\"Expected table headers {expected_headers} are not equal {actual_headers}\"\n\n    if len_table_content == 1:\n        assert False, \"Table body is missing\"\n\n    for index in range(len_table_content - 1):\n        self.should_be_delete_button_on_user_settings_table_row(index, \"\u0423\u0434\u0430\u043b\u0438\u0442\u044c\")\n
    "},{"location":"components_derived/dialog_user_settings/#components_derived.dialog_user_settings.UserSettingsDialogWindow.check_window_absence","title":"check_window_absence()","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u044f \u043e\u043a\u043d\u0430 \u043d\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435.

    Raises:

    Type Description AssertionError

    \u0435\u0441\u043b\u0438 \u043e\u043a\u043do \u043f\u0440\u0438\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u043d\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435.

    Source code in components_derived\\dialog_user_settings.py
    def check_window_absence(self) -> None:\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u044f \u043e\u043a\u043d\u0430 \u043d\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435.\n\n    Raises:\n        AssertionError: \u0435\u0441\u043b\u0438 \u043e\u043a\u043do \u043f\u0440\u0438\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u043d\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435.\n    \"\"\"\n\n    self.check_absence(UserCardLocators.DIALOG_USER_SETTINGS, \\\n                       \"User settings dialog window is present\")\n
    "},{"location":"components_derived/dialog_user_settings/#components_derived.dialog_user_settings.UserSettingsDialogWindow.check_window_visibility","title":"check_window_visibility()","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u043a\u043d\u0430 \u043d\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435.

    Raises:

    Type Description AssertionError

    \u0435\u0441\u043b\u0438 \u043e\u043a\u043do \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u043d\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435.

    Source code in components_derived\\dialog_user_settings.py
    def check_window_visibility(self) -> None:\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u043a\u043d\u0430 \u043d\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435.\n\n    Raises:\n        AssertionError: \u0435\u0441\u043b\u0438 \u043e\u043a\u043do \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u043d\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435.\n    \"\"\"\n\n    self.check_visibility(UserCardLocators.DIALOG_USER_SETTINGS, \\\n                          \"User settings dialog window is missing\")\n
    "},{"location":"components_derived/dialog_user_settings/#components_derived.dialog_user_settings.UserSettingsDialogWindow.click_close_button","title":"click_close_button()","text":"

    \u041d\u0430\u0436\u0438\u043c\u0430\u0435\u0442 \u043a\u043d\u043e\u043f\u043a\u0443 \u0437\u0430\u043a\u0440\u044b\u0442\u0438\u044f \u043e\u043a\u043d\u0430.

    \u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u043a\u043b\u0438\u043a \u043f\u043e \u043a\u043d\u043e\u043f\u043a\u0435 '\u0417\u0430\u043a\u0440\u044b\u0442\u044c' \u043d\u0430 \u0441\u0442\u0440\u043e\u043a\u0435 \u0441 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u043e\u043c \u043e\u043a\u043d\u0430.

    Source code in components_derived\\dialog_user_settings.py
    def click_close_button(self):\n    \"\"\"\u041d\u0430\u0436\u0438\u043c\u0430\u0435\u0442 \u043a\u043d\u043e\u043f\u043a\u0443 \u0437\u0430\u043a\u0440\u044b\u0442\u0438\u044f \u043e\u043a\u043d\u0430.\n\n    \u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u043a\u043b\u0438\u043a \u043f\u043e \u043a\u043d\u043e\u043f\u043a\u0435 '\u0417\u0430\u043a\u0440\u044b\u0442\u044c' \u043d\u0430 \u0441\u0442\u0440\u043e\u043a\u0435 \u0441 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u043e\u043c \u043e\u043a\u043d\u0430.\n    \"\"\"\n\n    self.close_button.click()\n
    "},{"location":"components_derived/dialog_user_settings/#components_derived.dialog_user_settings.UserSettingsDialogWindow.get_delete_button_from_row","title":"get_delete_button_from_row(row_index)","text":"

    \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043a\u043d\u043e\u043f\u043a\u0443 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u0441\u0435\u0430\u043d\u0441\u0430 \u0434\u043b\u044f \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438.

    Parameters:

    Name Type Description Default row_index int

    \u0418\u043d\u0434\u0435\u043a\u0441 \u0441\u0442\u0440\u043e\u043a\u0438 \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435.

    required

    Returns:

    Name Type Description TooltipButton TooltipButton

    \u041a\u043d\u043e\u043f\u043a\u0430 \u0441 \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u043e\u0439.

    Raises:

    Type Description AssertionError

    \u0415\u0441\u043b\u0438 \u0441\u0442\u0440\u043e\u043a\u0430 \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u0430.

    Source code in components_derived\\dialog_user_settings.py
    def get_delete_button_from_row(self, row_index: int) -> TooltipButton:\n    \"\"\"\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043a\u043d\u043e\u043f\u043a\u0443 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u0441\u0435\u0430\u043d\u0441\u0430 \u0434\u043b\u044f \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438.\n\n    Args:\n        row_index: \u0418\u043d\u0434\u0435\u043a\u0441 \u0441\u0442\u0440\u043e\u043a\u0438 \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435.\n\n    Returns:\n        TooltipButton: \u041a\u043d\u043e\u043f\u043a\u0430 \u0441 \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u043e\u0439.\n\n    Raises:\n        AssertionError: \u0415\u0441\u043b\u0438 \u0441\u0442\u0440\u043e\u043a\u0430 \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u0430.\n    \"\"\"\n\n    row_locator = self.user_settings_table.get_row_locator(\n        UserCardLocators.TABLE_WORK_AREA,\n        row_index\n    )\n    assert isinstance(row_locator, Locator), f\"Row with index {row_index} is missing\"\n\n    button_locator = row_locator.get_by_role(\"button\")\n    return TooltipButton(self.page, button_locator, \"delete_button\")\n
    "},{"location":"components_derived/dialog_user_settings/#components_derived.dialog_user_settings.UserSettingsDialogWindow.should_be_delete_button_on_user_settings_table_row","title":"should_be_delete_button_on_user_settings_table_row(row_index, tooltip)","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u043a\u043d\u043e\u043f\u043a\u0438 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u0432 \u0441\u0442\u0440\u043e\u043a\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u044b.

    Parameters:

    Name Type Description Default row_index int

    \u0418\u043d\u0434\u0435\u043a\u0441 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438.

    required tooltip str

    \u041e\u0436\u0438\u0434\u0430\u0435\u043c\u044b\u0439 \u0442\u0435\u043a\u0441\u0442 \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0438.

    required

    Raises:

    Type Description AssertionError

    \u0415\u0441\u043b\u0438 \u043a\u043d\u043e\u043f\u043a\u0430 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u0438\u043b\u0438 \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0430 \u043d\u0435\u0432\u0435\u0440\u043d\u0430.

    Source code in components_derived\\dialog_user_settings.py
    def should_be_delete_button_on_user_settings_table_row(self,\n                                                            row_index: int,\n                                                            tooltip: str\n                                                           ) -> None:\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u043a\u043d\u043e\u043f\u043a\u0438 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u0432 \u0441\u0442\u0440\u043e\u043a\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u044b.\n\n    Args:\n        row_index: \u0418\u043d\u0434\u0435\u043a\u0441 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438.\n        tooltip: \u041e\u0436\u0438\u0434\u0430\u0435\u043c\u044b\u0439 \u0442\u0435\u043a\u0441\u0442 \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0438.\n\n    Raises:\n        AssertionError: \u0415\u0441\u043b\u0438 \u043a\u043d\u043e\u043f\u043a\u0430 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u0438\u043b\u0438 \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0430 \u043d\u0435\u0432\u0435\u0440\u043d\u0430.\n    \"\"\"\n\n    delete_button = self.get_delete_button_from_row(row_index)\n\n    # \u041e\u0436\u0438\u0434\u0430\u0435\u043c \u0438\u0441\u0447\u0435\u0437\u043d\u043e\u0432\u0435\u043d\u0438\u044f \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0445 \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043e\u043a \u043f\u0435\u0440\u0435\u0434 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u043e\u0439\n    delete_button.wait_for_tooltip_to_disappear()\n\n    delete_button.check_visibility(\n        f\"Delete session button is missing on {row_index} row\"\n    )\n    delete_button.check_tooltip_with_text(tooltip)\n\n    # \u041e\u0436\u0438\u0434\u0430\u0435\u043c \u0438\u0441\u0447\u0435\u0437\u043d\u043e\u0432\u0435\u043d\u0438\u044f \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0438 \u043f\u043e\u0441\u043b\u0435 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438\n    delete_button.wait_for_tooltip_to_disappear()\n
    "},{"location":"components_derived/dialog_user_settings/#components_derived.dialog_user_settings.UserSettingsDialogWindow.should_be_user_settings_table","title":"should_be_user_settings_table()","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0441\u0435\u0441\u0441\u0438\u043e\u043d\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.

    Raises:

    Type Description AssertionError

    \u0415\u0441\u043b\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442.

    Source code in components_derived\\dialog_user_settings.py
    def should_be_user_settings_table(self) -> None:\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0441\u0435\u0441\u0441\u0438\u043e\u043d\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\n\n    Raises:\n        AssertionError: \u0415\u0441\u043b\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442.\n    \"\"\"\n\n    self.user_settings_table.check_visibility(\n                        UserCardLocators.TABLE_WORK_AREA,\n                        \"User settings table is missing\")\n
    "},{"location":"components_derived/modal_add_AD_user/","title":"AddADUserModalWindow","text":"

    \u041c\u043e\u0434\u0443\u043b\u044c modal_add_user \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043a\u043b\u0430\u0441\u0441 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u044b\u043c \u043e\u043a\u043d\u043e\u043c \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.

    \u041a\u043b\u0430\u0441\u0441 AddUserModalWindow \u043d\u0430\u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u0431\u0430\u0437\u043e\u0432\u044b\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b ModalWindowComponent \u0438 \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u0442 \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u0447\u043d\u044b\u0435 \u043c\u0435\u0442\u043e\u0434\u044b \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0444\u043e\u0440\u043c\u0430\u043c\u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439.

    "},{"location":"components_derived/modal_add_AD_user/#components_derived.modal_add_AD_user.AddADUserModalWindow","title":"AddADUserModalWindow","text":"

    Bases: ModalWindowComponent

    \u041c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043a\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043d\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.

    \u041d\u0430\u0441\u043b\u0435\u0434\u0443\u0435\u0442 ModalWindowComponent \u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0444\u043e\u0440\u043c\u044b: - \u041f\u043e\u043b\u044f \u0432\u0432\u043e\u0434\u0430 (\u0438\u043c\u044f, \u043f\u0430\u0440\u043e\u043b\u044c, email \u0438 \u0434\u0440.) - \u0427\u0435\u043a\u0431\u043e\u043a\u0441\u044b (Active Directory, Push-\u0443\u0432\u0435\u0434\u043e\u043c\u043b\u0435\u043d\u0438\u044f) - \u0412\u044b\u043f\u0430\u0434\u0430\u044e\u0449\u0438\u0435 \u0441\u043f\u0438\u0441\u043a\u0438 \u0433\u0440\u0443\u043f\u043f, \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 AD, \u0440\u043e\u043b\u0435\u0439 - \u041a\u043d\u043e\u043f\u043a\u0438 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439

    Source code in components_derived\\modal_add_AD_user.py
    class AddADUserModalWindow(ModalWindowComponent):\n    \"\"\"\u041c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043a\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043d\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\n\n    \u041d\u0430\u0441\u043b\u0435\u0434\u0443\u0435\u0442 ModalWindowComponent \u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0444\u043e\u0440\u043c\u044b:\n    - \u041f\u043e\u043b\u044f \u0432\u0432\u043e\u0434\u0430 (\u0438\u043c\u044f, \u043f\u0430\u0440\u043e\u043b\u044c, email \u0438 \u0434\u0440.)\n    - \u0427\u0435\u043a\u0431\u043e\u043a\u0441\u044b (Active Directory, Push-\u0443\u0432\u0435\u0434\u043e\u043c\u043b\u0435\u043d\u0438\u044f)\n    - \u0412\u044b\u043f\u0430\u0434\u0430\u044e\u0449\u0438\u0435 \u0441\u043f\u0438\u0441\u043a\u0438 \u0433\u0440\u0443\u043f\u043f, \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 AD, \u0440\u043e\u043b\u0435\u0439\n    - \u041a\u043d\u043e\u043f\u043a\u0438 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439\n    \"\"\"\n\n    def __init__(self, page: Page):\n        \"\"\"\u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0444\u043e\u0440\u043c\u044b \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\"\"\"\n\n        super().__init__(page)\n\n        # \u041b\u043e\u043a\u0430\u0442\u043e\u0440\u044b \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0444\u043e\u0440\u043c\u044b\n        input_form_locator = page.locator(ModalWindowLocators.INPUT_FORM_USER_DATA)\n        text_field_locator = ModalWindowLocators.TEXT_FIELD_INPUT_FORM_USER_DATA\n        label_locator = ModalWindowLocators.LABEL_INPUT_FORM_USER_DATA\n\n        # \u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430 \u0438 \u043a\u043d\u043e\u043f\u043a\u0438 \u0437\u0430\u043a\u0440\u044b\u0442\u0438\u044f \u0442\u0443\u043b\u0431\u0430\u0440\u0430\n        self.window_title = \"\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043d\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\"\n        locator_button_toolbar_close = self.page.get_by_role(\"navigation\").filter(\n            has_text=re.compile(self.window_title)\n        ).get_by_role(\"button\")\n\n        self.add_toolbar_title(self.window_title)\n        self.add_toolbar_button(locator_button_toolbar_close, \"close\")\n\n        # \u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0444\u043e\u0440\u043c\u044b\n        checkbox_1 = Checkbox(\n            page,\n            self.page.get_by_role(\"checkbox\").nth(0),\n            \"active_directory\"\n        )\n        self.add_content_item(\"active_directory_checkbox\", checkbox_1)\n\n        label_1 = Text(\n            page,\n            self.page.locator(label_locator).nth(0),\n            \"active_directory_checkbox_label\"\n        )\n        self.add_content_item(\"active_directory_checkbox_label\", label_1)\n\n        # \u041d\u0430\u0447\u0430\u043b\u044c\u043d\u044b\u0439 \u043d\u0430\u0431\u043e\u0440 \u043f\u043e\u043b\u0435\u0439 \u0444\u043e\u0440\u043c\u044b\n        group_loc = input_form_locator.get_by_role(\"combobox\").nth(0)\n        group_input = TextInput(page, group_loc, \"group_input\")\n        self.add_content_item(\"group_input\", group_input)\n        self.add_content_item(\n            \"group_list\",\n            DropdownList(page)\n        )\n\n        locator_button_search = self.page.get_by_role(\"button\", name=\"\u041f\u043e\u0438\u0441\u043a\")\n        self.add_button(locator_button_search, \"search\")\n\n        loc = input_form_locator.locator(\"xpath=div[3]\").locator(text_field_locator)\n        name_input = TextInput(page, loc, \"name_input\")\n        self.add_content_item(\"name_input\", name_input)\n\n        role_loc = input_form_locator.get_by_role(\"combobox\").nth(1)\n        role_input = TextInput(page, role_loc, \"role_input\")\n        self.add_content_item(\"role_input\", role_input)\n        self.add_content_item(\n            \"roles_list\",\n            DropdownList(page)\n        )\n\n        loc = input_form_locator.locator(\"xpath=div[6]\").locator(text_field_locator)\n        commentary_input = TextInput(page, loc, \"commentary_input\")\n        self.add_content_item(\"commentary_input\", commentary_input)\n\n        loc = input_form_locator.locator(\"xpath=div[7]\").locator(text_field_locator)\n        email_input = TextInput(page, loc, \"email_input\")\n        self.add_content_item(\"email_input\", email_input)\n\n        loc = input_form_locator.locator(\"xpath=div[8]\").locator(text_field_locator)\n        phone_input = TextInput(page, loc, \"phone_input\")\n        self.add_content_item(\"phone_input\", phone_input)\n\n        checkbox_2 = Checkbox(\n            page,\n            page.get_by_role(\"checkbox\").nth(1),\n            \"push_notification\"\n        )\n        self.add_content_item(\"push_notification_checkbox\", checkbox_2)\n\n        label_2 = Text(\n            page,\n            self.page.locator(label_locator).nth(1),\n            \"push_notification_checkbox_label\"\n        )\n        self.add_content_item(\"push_notification_checkbox_label\", label_2)\n\n        # \u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043a\u043d\u043e\u043f\u043e\u043a \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439\n        locator_button_add = self.page.get_by_role(\"button\", name=\"\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c\")\n        self.add_button(locator_button_add, \"add\")\n\n        locator_button_close = self.page.get_by_role(\"button\", name=\"\u0417\u0430\u043a\u0440\u044b\u0442\u044c\")\n        self.add_button(locator_button_close, \"close\")\n\n        self.new_user_confirm = ConfirmComponent(page, \" \u041e\u0442\u043c\u0435\u043d\u0430 \", \" \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \")\n\n    # \u0414\u0435\u0439\u0441\u0442\u0432\u0438\u044f:\n    def check_active_directory_checkbox(self):\n        \"\"\"\u0412\u043a\u043b\u044e\u0447\u0430\u0435\u0442 \u0447\u0435\u043a-\u0431\u043e\u043a\u0441 Active Directory. \"\"\"\n\n        self.get_content_item(\"active_directory_checkbox\").check(force=True)\n\n    def uncheck_active_directory_checkbox(self):\n        \"\"\"\u0412\u044b\u043a\u043b\u044e\u0447\u0430\u0435\u0442 \u0447\u0435\u043a-\u0431\u043e\u043a\u0441 Active Directory. \"\"\"\n\n        self.get_content_item(\"active_directory_checkbox\").uncheck(force=True)\n\n    def update_input_form_fields(self, expand):\n        \"\"\"\u041f\u0435\u0440\u0441\u0447\u0438\u0442\u044b\u0432\u0430\u0435\u0442 \u043b\u043e\u043a\u0430\u0442\u043e\u0440\u044b \u043f\u043e\u043b\u0435\u0439 \u0444\u043e\u0440\u043c\u044b \u0432\u0432\u043e\u0434\u0430 \u043f\u0440\u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0438/\u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0438 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u043f\u043e\u043b\u044f. \"\"\"\n\n        input_form_locator = self.page.locator(ModalWindowLocators.INPUT_FORM_USER_DATA)\n        text_field_locator = ModalWindowLocators.TEXT_FIELD_INPUT_FORM_USER_DATA\n\n        if expand:\n            new_loc = input_form_locator.locator(\"xpath=div[4]\").locator(text_field_locator)\n            self.get_content_item(\"name_input\").update_locator(new_loc)\n\n            new_loc = input_form_locator.locator(\"xpath=div[7]\").locator(text_field_locator)\n            self.get_content_item(\"commentary_input\").update_locator(new_loc)\n\n            new_loc = input_form_locator.locator(\"xpath=div[8]\").locator(text_field_locator)\n            self.get_content_item(\"email_input\").update_locator(new_loc)\n\n            new_loc = input_form_locator.locator(\"xpath=div[9]\").locator(text_field_locator)\n            self.get_content_item(\"phone_input\").update_locator(new_loc)\n\n            role_loc = input_form_locator.get_by_role(\"combobox\").nth(2)\n            self.get_content_item(\"role_input\").update_locator(role_loc)\n        else:\n            new_loc = input_form_locator.locator(\"xpath=div[3]\").locator(text_field_locator)\n            self.get_content_item(\"name_input\").update_locator(new_loc)\n\n            new_loc = input_form_locator.locator(\"xpath=div[6]\").locator(text_field_locator)\n            self.get_content_item(\"commentary_input\").update_locator(new_loc)\n\n            new_loc = input_form_locator.locator(\"xpath=div[7]\").locator(text_field_locator)\n            self.get_content_item(\"email_input\").update_locator(new_loc)\n\n            new_loc = input_form_locator.locator(\"xpath=div[8]\").locator(text_field_locator)\n            self.get_content_item(\"phone_input\").update_locator(new_loc)\n\n            role_loc = input_form_locator.get_by_role(\"combobox\").nth(1)\n            self.get_content_item(\"role_input\").update_locator(role_loc)\n\n    def new_user(self, user_data):\n        \"\"\"\u0417\u0430\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u0444\u043e\u0440\u043c\u0443 \u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u043d\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\n\n        Args:\n            user_data (dict): \u0414\u0430\u043d\u043d\u044b\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f (\u0438\u043c\u044f, \u0440\u043e\u043b\u044c, \u043f\u0430\u0440\u043e\u043b\u044c \u0438 \u0434\u0440.)\n        \"\"\"\n\n        menu_locator = self.page.locator(ModalWindowLocators.MENU_INPUT_FORM_USER_DATA)\n        input_form_locator = self.page.locator(ModalWindowLocators.INPUT_FORM_USER_DATA)\n\n        group_name = user_data.get(\"group\")\n        if group_name is None:\n            assert False, \"Value of 'group' is missing\"\n\n        name = user_data.get(\"name\")\n        if name is None:\n            assert False, \"Value of 'name' is missing\"\n\n        role = user_data.get(\"role\")\n        if role is None:\n            assert False, \"Value of 'role' is missing\"\n\n        group_field = self.get_content_item(\"group_input\")\n        group_field.click()\n\n        group_list = self.get_content_item(\"group_list\")\n        group_list.scroll_until_end(menu_locator)\n        group_names = group_list.get_item_names(menu_locator)\n        if group_name not in group_names:\n            assert False, f\"Required group name {group_name} is missing\"\n\n        group_list.check_item_with_text(group_name)\n        group_list.click_item_with_text(group_name)\n\n        search_button = self.get_button_by_name(\"search\")\n        search_button.click()\n\n        count = input_form_locator.get_by_role(\"combobox\").count()\n        if count == 2:\n            assert False, f\"Selected group {group_name} is empty. Use another group.\"\n\n        user_AD_loc = input_form_locator.get_by_role(\"combobox\").nth(1)\n        user_AD_input = TextInput(self.page, user_AD_loc, \"user_AD_input\")\n        self.add_content_item(\"user_AD_input\", user_AD_input)\n        self.add_content_item(\n            \"user_AD_list\",\n            DropdownList(self.page)\n        )\n\n        user_AD_input.click()\n        user_AD_list = self.get_content_item(\"user_AD_list\")\n        user_AD_list.scroll_until_end(menu_locator)\n        user_AD_names = group_list.get_item_names(menu_locator)\n        if name not in user_AD_names:\n            assert False, f\"Required user name {name} is missing\"\n\n        user_AD_list.check_item_with_text(name)\n        user_AD_list.click_item_with_text(name)\n\n        role_field = self.get_content_item(\"role_input\")\n        role_field.click()\n\n        roles_list = self.get_content_item(\"roles_list\")\n        roles_list.check_item_with_text(user_data[\"role\"])\n        roles_list.click_item_with_text(user_data[\"role\"])\n\n        # \u041e\u0442\u043f\u0440\u0430\u0432\u043a\u0430 \u0444\u043e\u0440\u043c\u044b\n        add_button = self.get_button_by_name(\"add\")\n        add_button.click()\n\n        # \u041f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f\n        title = \"\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043d\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\"\n        self.new_user_confirm.check_title(\n            title,\n            f\"Confirmation dialog window with title '{title}' is missing\"\n        )\n\n        # \u041d\u0430 \u043f\u0435\u0440\u0432\u043e\u043c \u044d\u0442\u0430\u043f\u0435 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u043d\u0435 \u0441\u043e\u0437\u0434\u0430\u0435\u043c\n        self.new_user_confirm.click_cancel_button()\n        self.close_window()\n\n    def close_window(self):\n        \"\"\"\u0417\u0430\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043a\u043d\u043e \u0447\u0435\u0440\u0435\u0437 \u043a\u043d\u043e\u043f\u043a\u0443 '\u0417\u0430\u043a\u0440\u044b\u0442\u044c'.\"\"\"\n\n        close_button = self.get_button_by_name(\"close\")\n        close_button.click()\n\n    def close_window_by_toolbar_button(self):\n        \"\"\"\u0417\u0430\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043a\u043d\u043e \u0447\u0435\u0440\u0435\u0437 \u043a\u043d\u043e\u043f\u043a\u0443 \u0432 \u0442\u0443\u043b\u0431\u0430\u0440\u0435.\"\"\"\n\n        self.click_toolbar_close_button()\n\n    # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0438:\n    def check_content(self):\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0438 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0441\u0442\u044c \u0432\u0441\u0435\u0445 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0444\u043e\u0440\u043c\u044b.\"\"\"\n\n        input_form_locator = self.page.locator(ModalWindowLocators.INPUT_FORM_USER_DATA)\n        menu_locator = self.page.locator(ModalWindowLocators.MENU_INPUT_FORM_USER_DATA)\n\n        self.check_by_window_title()\n\n        is_checked = self.get_content_item(\"active_directory_checkbox\").is_checked()\n        if not is_checked:\n            assert False, \\\n            \"The checkbox 'Active Directory'should be checked for the add user from Active Directory window\"\n\n        self.check_toolbar_button_visibility(\"close\")\n        self.check_toolbar_button_tooltip(\"close\", \"\u0417\u0430\u043a\u0440\u044b\u0442\u044c\")\n\n        no_op_names = [\"roles_list\", \"group_list\"]\n\n        for name in self.content_items.keys():\n            item = self.get_content_item(name)\n\n            if name == \"active_directory_checkbox_label\":\n                item.check_have_text(\n                    \"Active Directory\",\n                    \"Label 'Active Directory' is missing\"\n                )\n            elif name == \"push_notification_checkbox_label\":\n                item.check_have_text(\n                    \"\u041f\u043e\u0434\u043f\u0438\u0441\u043a\u0430 \u043d\u0430 Push-\u0443\u0432\u0435\u0434\u043e\u043c\u043b\u0435\u043d\u0438\u044f\",\n                    \"Label '\u041f\u043e\u0434\u043f\u0438\u0441\u043a\u0430 \u043d\u0430 Push-\u0443\u0432\u0435\u0434\u043e\u043c\u043b\u0435\u043d\u0438\u044f' is missing\"\n                )\n            elif name == \"group_input\":\n                item.click()\n                group_list = self.get_content_item(\"group_list\")\n                group_list.check_visibility(menu_locator,\n                                          \"Groups list is missing\")\n\n                is_scrollable_vertically = group_list.check_vertical_scrolling(menu_locator)\n                assert is_scrollable_vertically, \"Groups list should be scrollable_vertically\"\n                self.page.keyboard.press(\"Escape\")\n            elif name == \"role_input\":\n                item.click()\n                roles_list = self.get_content_item(\"roles_list\")\n                roles_list.check_visibility(menu_locator,\n                                          \"Roles list is missing\")\n\n                is_scrollable_vertically = roles_list.check_vertical_scrolling(menu_locator)\n                assert not is_scrollable_vertically, \\\n                            \"Roles list should not be scrollable_vertically\"\n\n                for role in roles_dict.values():\n                    # \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e, \u043f\u043e\u043a\u0430 \u0435\u0441\u0442\u044c \u043d\u0435\u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0435 \u0441\u043e \u0441\u043f\u0438\u0441\u043a\u043e\u043c \u0440\u043e\u043b\u0435\u0439 \u0432 \u0432\u043a\u043b\u0430\u0434\u043a\u0435 \u0421\u0435\u0441\u0441\u0438\u0438\n                    if role == \"\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\":\n                        continue\n                    roles_list.check_item_with_text(role)\n                self.page.keyboard.press(\"Escape\")\n            elif name in no_op_names:\n                continue\n            else:\n                item.check_visibility(\n                    f\"Modal window content item with name '{name}' is missing\"\n                )\n\n        self.check_button_visibility(\"search\")\n        self.check_button_visibility(\"add\")\n        self.check_button_visibility(\"close\")\n\n        search_button = self.get_button_by_name(\"search\")\n        search_button.click()\n\n        user_AD_loc = input_form_locator.get_by_role(\"combobox\").nth(1)\n        user_AD_input = TextInput(self.page, user_AD_loc, \"user_AD_input\")\n        self.add_content_item(\"user_AD_input\", user_AD_input)\n        self.add_content_item(\n            \"user_AD_list\",\n            DropdownList(self.page)\n        )\n\n        user_AD_input.click()\n        user_AD_list = self.get_content_item(\"user_AD_list\")\n        user_AD_list.check_visibility(menu_locator,\n                                  \"Users AD list is missing\")\n        is_scrollable_vertically = user_AD_list.check_vertical_scrolling(menu_locator)\n        assert is_scrollable_vertically, \"Users AD list should be scrollable_vertically\"\n        self.page.keyboard.press(\"Escape\")\n\n        self.update_input_form_fields(expand=True)\n\n        self.get_content_item(\"name_input\").check_visibility(\n                                           \"Modal window content item with name 'name_input' is missing\")\n        self.get_content_item(\"role_input\").check_visibility(\n                                           \"Modal window content item with name 'role_input' is missing\")\n        self.get_content_item(\"commentary_input\").check_visibility(\n                                           \"Modal window content item with name 'commentary_input' is missing\")\n        self.get_content_item(\"email_input\").check_visibility(\n                                           \"Modal window content item with name 'email_input' is missing\")\n        self.get_content_item(\"phone_input\").check_visibility(\n                                           \"Modal window content item with name 'phone_input' is missing\")\n
    "},{"location":"components_derived/modal_add_AD_user/#components_derived.modal_add_AD_user.AddADUserModalWindow.__init__","title":"__init__(page)","text":"

    \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0444\u043e\u0440\u043c\u044b \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.

    Source code in components_derived\\modal_add_AD_user.py
    def __init__(self, page: Page):\n    \"\"\"\u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0444\u043e\u0440\u043c\u044b \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\"\"\"\n\n    super().__init__(page)\n\n    # \u041b\u043e\u043a\u0430\u0442\u043e\u0440\u044b \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0444\u043e\u0440\u043c\u044b\n    input_form_locator = page.locator(ModalWindowLocators.INPUT_FORM_USER_DATA)\n    text_field_locator = ModalWindowLocators.TEXT_FIELD_INPUT_FORM_USER_DATA\n    label_locator = ModalWindowLocators.LABEL_INPUT_FORM_USER_DATA\n\n    # \u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430 \u0438 \u043a\u043d\u043e\u043f\u043a\u0438 \u0437\u0430\u043a\u0440\u044b\u0442\u0438\u044f \u0442\u0443\u043b\u0431\u0430\u0440\u0430\n    self.window_title = \"\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043d\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\"\n    locator_button_toolbar_close = self.page.get_by_role(\"navigation\").filter(\n        has_text=re.compile(self.window_title)\n    ).get_by_role(\"button\")\n\n    self.add_toolbar_title(self.window_title)\n    self.add_toolbar_button(locator_button_toolbar_close, \"close\")\n\n    # \u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0444\u043e\u0440\u043c\u044b\n    checkbox_1 = Checkbox(\n        page,\n        self.page.get_by_role(\"checkbox\").nth(0),\n        \"active_directory\"\n    )\n    self.add_content_item(\"active_directory_checkbox\", checkbox_1)\n\n    label_1 = Text(\n        page,\n        self.page.locator(label_locator).nth(0),\n        \"active_directory_checkbox_label\"\n    )\n    self.add_content_item(\"active_directory_checkbox_label\", label_1)\n\n    # \u041d\u0430\u0447\u0430\u043b\u044c\u043d\u044b\u0439 \u043d\u0430\u0431\u043e\u0440 \u043f\u043e\u043b\u0435\u0439 \u0444\u043e\u0440\u043c\u044b\n    group_loc = input_form_locator.get_by_role(\"combobox\").nth(0)\n    group_input = TextInput(page, group_loc, \"group_input\")\n    self.add_content_item(\"group_input\", group_input)\n    self.add_content_item(\n        \"group_list\",\n        DropdownList(page)\n    )\n\n    locator_button_search = self.page.get_by_role(\"button\", name=\"\u041f\u043e\u0438\u0441\u043a\")\n    self.add_button(locator_button_search, \"search\")\n\n    loc = input_form_locator.locator(\"xpath=div[3]\").locator(text_field_locator)\n    name_input = TextInput(page, loc, \"name_input\")\n    self.add_content_item(\"name_input\", name_input)\n\n    role_loc = input_form_locator.get_by_role(\"combobox\").nth(1)\n    role_input = TextInput(page, role_loc, \"role_input\")\n    self.add_content_item(\"role_input\", role_input)\n    self.add_content_item(\n        \"roles_list\",\n        DropdownList(page)\n    )\n\n    loc = input_form_locator.locator(\"xpath=div[6]\").locator(text_field_locator)\n    commentary_input = TextInput(page, loc, \"commentary_input\")\n    self.add_content_item(\"commentary_input\", commentary_input)\n\n    loc = input_form_locator.locator(\"xpath=div[7]\").locator(text_field_locator)\n    email_input = TextInput(page, loc, \"email_input\")\n    self.add_content_item(\"email_input\", email_input)\n\n    loc = input_form_locator.locator(\"xpath=div[8]\").locator(text_field_locator)\n    phone_input = TextInput(page, loc, \"phone_input\")\n    self.add_content_item(\"phone_input\", phone_input)\n\n    checkbox_2 = Checkbox(\n        page,\n        page.get_by_role(\"checkbox\").nth(1),\n        \"push_notification\"\n    )\n    self.add_content_item(\"push_notification_checkbox\", checkbox_2)\n\n    label_2 = Text(\n        page,\n        self.page.locator(label_locator).nth(1),\n        \"push_notification_checkbox_label\"\n    )\n    self.add_content_item(\"push_notification_checkbox_label\", label_2)\n\n    # \u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043a\u043d\u043e\u043f\u043e\u043a \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439\n    locator_button_add = self.page.get_by_role(\"button\", name=\"\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c\")\n    self.add_button(locator_button_add, \"add\")\n\n    locator_button_close = self.page.get_by_role(\"button\", name=\"\u0417\u0430\u043a\u0440\u044b\u0442\u044c\")\n    self.add_button(locator_button_close, \"close\")\n\n    self.new_user_confirm = ConfirmComponent(page, \" \u041e\u0442\u043c\u0435\u043d\u0430 \", \" \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \")\n
    "},{"location":"components_derived/modal_add_AD_user/#components_derived.modal_add_AD_user.AddADUserModalWindow.check_active_directory_checkbox","title":"check_active_directory_checkbox()","text":"

    \u0412\u043a\u043b\u044e\u0447\u0430\u0435\u0442 \u0447\u0435\u043a-\u0431\u043e\u043a\u0441 Active Directory.

    Source code in components_derived\\modal_add_AD_user.py
    def check_active_directory_checkbox(self):\n    \"\"\"\u0412\u043a\u043b\u044e\u0447\u0430\u0435\u0442 \u0447\u0435\u043a-\u0431\u043e\u043a\u0441 Active Directory. \"\"\"\n\n    self.get_content_item(\"active_directory_checkbox\").check(force=True)\n
    "},{"location":"components_derived/modal_add_AD_user/#components_derived.modal_add_AD_user.AddADUserModalWindow.check_content","title":"check_content()","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0438 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0441\u0442\u044c \u0432\u0441\u0435\u0445 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0444\u043e\u0440\u043c\u044b.

    Source code in components_derived\\modal_add_AD_user.py
    def check_content(self):\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0438 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0441\u0442\u044c \u0432\u0441\u0435\u0445 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0444\u043e\u0440\u043c\u044b.\"\"\"\n\n    input_form_locator = self.page.locator(ModalWindowLocators.INPUT_FORM_USER_DATA)\n    menu_locator = self.page.locator(ModalWindowLocators.MENU_INPUT_FORM_USER_DATA)\n\n    self.check_by_window_title()\n\n    is_checked = self.get_content_item(\"active_directory_checkbox\").is_checked()\n    if not is_checked:\n        assert False, \\\n        \"The checkbox 'Active Directory'should be checked for the add user from Active Directory window\"\n\n    self.check_toolbar_button_visibility(\"close\")\n    self.check_toolbar_button_tooltip(\"close\", \"\u0417\u0430\u043a\u0440\u044b\u0442\u044c\")\n\n    no_op_names = [\"roles_list\", \"group_list\"]\n\n    for name in self.content_items.keys():\n        item = self.get_content_item(name)\n\n        if name == \"active_directory_checkbox_label\":\n            item.check_have_text(\n                \"Active Directory\",\n                \"Label 'Active Directory' is missing\"\n            )\n        elif name == \"push_notification_checkbox_label\":\n            item.check_have_text(\n                \"\u041f\u043e\u0434\u043f\u0438\u0441\u043a\u0430 \u043d\u0430 Push-\u0443\u0432\u0435\u0434\u043e\u043c\u043b\u0435\u043d\u0438\u044f\",\n                \"Label '\u041f\u043e\u0434\u043f\u0438\u0441\u043a\u0430 \u043d\u0430 Push-\u0443\u0432\u0435\u0434\u043e\u043c\u043b\u0435\u043d\u0438\u044f' is missing\"\n            )\n        elif name == \"group_input\":\n            item.click()\n            group_list = self.get_content_item(\"group_list\")\n            group_list.check_visibility(menu_locator,\n                                      \"Groups list is missing\")\n\n            is_scrollable_vertically = group_list.check_vertical_scrolling(menu_locator)\n            assert is_scrollable_vertically, \"Groups list should be scrollable_vertically\"\n            self.page.keyboard.press(\"Escape\")\n        elif name == \"role_input\":\n            item.click()\n            roles_list = self.get_content_item(\"roles_list\")\n            roles_list.check_visibility(menu_locator,\n                                      \"Roles list is missing\")\n\n            is_scrollable_vertically = roles_list.check_vertical_scrolling(menu_locator)\n            assert not is_scrollable_vertically, \\\n                        \"Roles list should not be scrollable_vertically\"\n\n            for role in roles_dict.values():\n                # \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e, \u043f\u043e\u043a\u0430 \u0435\u0441\u0442\u044c \u043d\u0435\u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0435 \u0441\u043e \u0441\u043f\u0438\u0441\u043a\u043e\u043c \u0440\u043e\u043b\u0435\u0439 \u0432 \u0432\u043a\u043b\u0430\u0434\u043a\u0435 \u0421\u0435\u0441\u0441\u0438\u0438\n                if role == \"\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\":\n                    continue\n                roles_list.check_item_with_text(role)\n            self.page.keyboard.press(\"Escape\")\n        elif name in no_op_names:\n            continue\n        else:\n            item.check_visibility(\n                f\"Modal window content item with name '{name}' is missing\"\n            )\n\n    self.check_button_visibility(\"search\")\n    self.check_button_visibility(\"add\")\n    self.check_button_visibility(\"close\")\n\n    search_button = self.get_button_by_name(\"search\")\n    search_button.click()\n\n    user_AD_loc = input_form_locator.get_by_role(\"combobox\").nth(1)\n    user_AD_input = TextInput(self.page, user_AD_loc, \"user_AD_input\")\n    self.add_content_item(\"user_AD_input\", user_AD_input)\n    self.add_content_item(\n        \"user_AD_list\",\n        DropdownList(self.page)\n    )\n\n    user_AD_input.click()\n    user_AD_list = self.get_content_item(\"user_AD_list\")\n    user_AD_list.check_visibility(menu_locator,\n                              \"Users AD list is missing\")\n    is_scrollable_vertically = user_AD_list.check_vertical_scrolling(menu_locator)\n    assert is_scrollable_vertically, \"Users AD list should be scrollable_vertically\"\n    self.page.keyboard.press(\"Escape\")\n\n    self.update_input_form_fields(expand=True)\n\n    self.get_content_item(\"name_input\").check_visibility(\n                                       \"Modal window content item with name 'name_input' is missing\")\n    self.get_content_item(\"role_input\").check_visibility(\n                                       \"Modal window content item with name 'role_input' is missing\")\n    self.get_content_item(\"commentary_input\").check_visibility(\n                                       \"Modal window content item with name 'commentary_input' is missing\")\n    self.get_content_item(\"email_input\").check_visibility(\n                                       \"Modal window content item with name 'email_input' is missing\")\n    self.get_content_item(\"phone_input\").check_visibility(\n                                       \"Modal window content item with name 'phone_input' is missing\")\n
    "},{"location":"components_derived/modal_add_AD_user/#components_derived.modal_add_AD_user.AddADUserModalWindow.close_window","title":"close_window()","text":"

    \u0417\u0430\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043a\u043d\u043e \u0447\u0435\u0440\u0435\u0437 \u043a\u043d\u043e\u043f\u043a\u0443 '\u0417\u0430\u043a\u0440\u044b\u0442\u044c'.

    Source code in components_derived\\modal_add_AD_user.py
    def close_window(self):\n    \"\"\"\u0417\u0430\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043a\u043d\u043e \u0447\u0435\u0440\u0435\u0437 \u043a\u043d\u043e\u043f\u043a\u0443 '\u0417\u0430\u043a\u0440\u044b\u0442\u044c'.\"\"\"\n\n    close_button = self.get_button_by_name(\"close\")\n    close_button.click()\n
    "},{"location":"components_derived/modal_add_AD_user/#components_derived.modal_add_AD_user.AddADUserModalWindow.close_window_by_toolbar_button","title":"close_window_by_toolbar_button()","text":"

    \u0417\u0430\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043a\u043d\u043e \u0447\u0435\u0440\u0435\u0437 \u043a\u043d\u043e\u043f\u043a\u0443 \u0432 \u0442\u0443\u043b\u0431\u0430\u0440\u0435.

    Source code in components_derived\\modal_add_AD_user.py
    def close_window_by_toolbar_button(self):\n    \"\"\"\u0417\u0430\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043a\u043d\u043e \u0447\u0435\u0440\u0435\u0437 \u043a\u043d\u043e\u043f\u043a\u0443 \u0432 \u0442\u0443\u043b\u0431\u0430\u0440\u0435.\"\"\"\n\n    self.click_toolbar_close_button()\n
    "},{"location":"components_derived/modal_add_AD_user/#components_derived.modal_add_AD_user.AddADUserModalWindow.new_user","title":"new_user(user_data)","text":"

    \u0417\u0430\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u0444\u043e\u0440\u043c\u0443 \u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u043d\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.

    Parameters:

    Name Type Description Default user_data dict

    \u0414\u0430\u043d\u043d\u044b\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f (\u0438\u043c\u044f, \u0440\u043e\u043b\u044c, \u043f\u0430\u0440\u043e\u043b\u044c \u0438 \u0434\u0440.)

    required Source code in components_derived\\modal_add_AD_user.py
    def new_user(self, user_data):\n    \"\"\"\u0417\u0430\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u0444\u043e\u0440\u043c\u0443 \u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u043d\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\n\n    Args:\n        user_data (dict): \u0414\u0430\u043d\u043d\u044b\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f (\u0438\u043c\u044f, \u0440\u043e\u043b\u044c, \u043f\u0430\u0440\u043e\u043b\u044c \u0438 \u0434\u0440.)\n    \"\"\"\n\n    menu_locator = self.page.locator(ModalWindowLocators.MENU_INPUT_FORM_USER_DATA)\n    input_form_locator = self.page.locator(ModalWindowLocators.INPUT_FORM_USER_DATA)\n\n    group_name = user_data.get(\"group\")\n    if group_name is None:\n        assert False, \"Value of 'group' is missing\"\n\n    name = user_data.get(\"name\")\n    if name is None:\n        assert False, \"Value of 'name' is missing\"\n\n    role = user_data.get(\"role\")\n    if role is None:\n        assert False, \"Value of 'role' is missing\"\n\n    group_field = self.get_content_item(\"group_input\")\n    group_field.click()\n\n    group_list = self.get_content_item(\"group_list\")\n    group_list.scroll_until_end(menu_locator)\n    group_names = group_list.get_item_names(menu_locator)\n    if group_name not in group_names:\n        assert False, f\"Required group name {group_name} is missing\"\n\n    group_list.check_item_with_text(group_name)\n    group_list.click_item_with_text(group_name)\n\n    search_button = self.get_button_by_name(\"search\")\n    search_button.click()\n\n    count = input_form_locator.get_by_role(\"combobox\").count()\n    if count == 2:\n        assert False, f\"Selected group {group_name} is empty. Use another group.\"\n\n    user_AD_loc = input_form_locator.get_by_role(\"combobox\").nth(1)\n    user_AD_input = TextInput(self.page, user_AD_loc, \"user_AD_input\")\n    self.add_content_item(\"user_AD_input\", user_AD_input)\n    self.add_content_item(\n        \"user_AD_list\",\n        DropdownList(self.page)\n    )\n\n    user_AD_input.click()\n    user_AD_list = self.get_content_item(\"user_AD_list\")\n    user_AD_list.scroll_until_end(menu_locator)\n    user_AD_names = group_list.get_item_names(menu_locator)\n    if name not in user_AD_names:\n        assert False, f\"Required user name {name} is missing\"\n\n    user_AD_list.check_item_with_text(name)\n    user_AD_list.click_item_with_text(name)\n\n    role_field = self.get_content_item(\"role_input\")\n    role_field.click()\n\n    roles_list = self.get_content_item(\"roles_list\")\n    roles_list.check_item_with_text(user_data[\"role\"])\n    roles_list.click_item_with_text(user_data[\"role\"])\n\n    # \u041e\u0442\u043f\u0440\u0430\u0432\u043a\u0430 \u0444\u043e\u0440\u043c\u044b\n    add_button = self.get_button_by_name(\"add\")\n    add_button.click()\n\n    # \u041f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f\n    title = \"\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043d\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\"\n    self.new_user_confirm.check_title(\n        title,\n        f\"Confirmation dialog window with title '{title}' is missing\"\n    )\n\n    # \u041d\u0430 \u043f\u0435\u0440\u0432\u043e\u043c \u044d\u0442\u0430\u043f\u0435 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u043d\u0435 \u0441\u043e\u0437\u0434\u0430\u0435\u043c\n    self.new_user_confirm.click_cancel_button()\n    self.close_window()\n
    "},{"location":"components_derived/modal_add_AD_user/#components_derived.modal_add_AD_user.AddADUserModalWindow.uncheck_active_directory_checkbox","title":"uncheck_active_directory_checkbox()","text":"

    \u0412\u044b\u043a\u043b\u044e\u0447\u0430\u0435\u0442 \u0447\u0435\u043a-\u0431\u043e\u043a\u0441 Active Directory.

    Source code in components_derived\\modal_add_AD_user.py
    def uncheck_active_directory_checkbox(self):\n    \"\"\"\u0412\u044b\u043a\u043b\u044e\u0447\u0430\u0435\u0442 \u0447\u0435\u043a-\u0431\u043e\u043a\u0441 Active Directory. \"\"\"\n\n    self.get_content_item(\"active_directory_checkbox\").uncheck(force=True)\n
    "},{"location":"components_derived/modal_add_AD_user/#components_derived.modal_add_AD_user.AddADUserModalWindow.update_input_form_fields","title":"update_input_form_fields(expand)","text":"

    \u041f\u0435\u0440\u0441\u0447\u0438\u0442\u044b\u0432\u0430\u0435\u0442 \u043b\u043e\u043a\u0430\u0442\u043e\u0440\u044b \u043f\u043e\u043b\u0435\u0439 \u0444\u043e\u0440\u043c\u044b \u0432\u0432\u043e\u0434\u0430 \u043f\u0440\u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0438/\u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0438 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u043f\u043e\u043b\u044f.

    Source code in components_derived\\modal_add_AD_user.py
    def update_input_form_fields(self, expand):\n    \"\"\"\u041f\u0435\u0440\u0441\u0447\u0438\u0442\u044b\u0432\u0430\u0435\u0442 \u043b\u043e\u043a\u0430\u0442\u043e\u0440\u044b \u043f\u043e\u043b\u0435\u0439 \u0444\u043e\u0440\u043c\u044b \u0432\u0432\u043e\u0434\u0430 \u043f\u0440\u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0438/\u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0438 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u043f\u043e\u043b\u044f. \"\"\"\n\n    input_form_locator = self.page.locator(ModalWindowLocators.INPUT_FORM_USER_DATA)\n    text_field_locator = ModalWindowLocators.TEXT_FIELD_INPUT_FORM_USER_DATA\n\n    if expand:\n        new_loc = input_form_locator.locator(\"xpath=div[4]\").locator(text_field_locator)\n        self.get_content_item(\"name_input\").update_locator(new_loc)\n\n        new_loc = input_form_locator.locator(\"xpath=div[7]\").locator(text_field_locator)\n        self.get_content_item(\"commentary_input\").update_locator(new_loc)\n\n        new_loc = input_form_locator.locator(\"xpath=div[8]\").locator(text_field_locator)\n        self.get_content_item(\"email_input\").update_locator(new_loc)\n\n        new_loc = input_form_locator.locator(\"xpath=div[9]\").locator(text_field_locator)\n        self.get_content_item(\"phone_input\").update_locator(new_loc)\n\n        role_loc = input_form_locator.get_by_role(\"combobox\").nth(2)\n        self.get_content_item(\"role_input\").update_locator(role_loc)\n    else:\n        new_loc = input_form_locator.locator(\"xpath=div[3]\").locator(text_field_locator)\n        self.get_content_item(\"name_input\").update_locator(new_loc)\n\n        new_loc = input_form_locator.locator(\"xpath=div[6]\").locator(text_field_locator)\n        self.get_content_item(\"commentary_input\").update_locator(new_loc)\n\n        new_loc = input_form_locator.locator(\"xpath=div[7]\").locator(text_field_locator)\n        self.get_content_item(\"email_input\").update_locator(new_loc)\n\n        new_loc = input_form_locator.locator(\"xpath=div[8]\").locator(text_field_locator)\n        self.get_content_item(\"phone_input\").update_locator(new_loc)\n\n        role_loc = input_form_locator.get_by_role(\"combobox\").nth(1)\n        self.get_content_item(\"role_input\").update_locator(role_loc)\n
    "},{"location":"components_derived/modal_add_local_user/","title":"AddLocalUserModalWindow","text":"

    \u041c\u043e\u0434\u0443\u043b\u044c modal_add_local_user \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043a\u043b\u0430\u0441\u0441 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u044b\u043c \u043e\u043a\u043d\u043e\u043c \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.

    \u041a\u043b\u0430\u0441\u0441 AddLocalUserModalWindow \u043d\u0430\u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u0431\u0430\u0437\u043e\u0432\u044b\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b ModalWindowComponent \u0438 \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u0442 \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u0447\u043d\u044b\u0435 \u043c\u0435\u0442\u043e\u0434\u044b \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0444\u043e\u0440\u043c\u0430\u043c\u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439.

    "},{"location":"components_derived/modal_add_local_user/#components_derived.modal_add_local_user.AddLocalUserModalWindow","title":"AddLocalUserModalWindow","text":"

    Bases: ModalWindowComponent

    \u041c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043a\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043d\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.

    \u041d\u0430\u0441\u043b\u0435\u0434\u0443\u0435\u0442 ModalWindowComponent \u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0444\u043e\u0440\u043c\u044b: - \u041f\u043e\u043b\u044f \u0432\u0432\u043e\u0434\u0430 (\u0438\u043c\u044f, \u043f\u0430\u0440\u043e\u043b\u044c, email \u0438 \u0434\u0440.) - \u0427\u0435\u043a\u0431\u043e\u043a\u0441\u044b (Active Directory, Push-\u0443\u0432\u0435\u0434\u043e\u043c\u043b\u0435\u043d\u0438\u044f) - \u0412\u044b\u043f\u0430\u0434\u0430\u044e\u0449\u0438\u0439 \u0441\u043f\u0438\u0441\u043e\u043a \u0440\u043e\u043b\u0435\u0439 - \u041a\u043d\u043e\u043f\u043a\u0438 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439

    Source code in components_derived\\modal_add_local_user.py
    class AddLocalUserModalWindow(ModalWindowComponent):\n    \"\"\"\u041c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043a\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043d\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\n\n    \u041d\u0430\u0441\u043b\u0435\u0434\u0443\u0435\u0442 ModalWindowComponent \u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0444\u043e\u0440\u043c\u044b:\n    - \u041f\u043e\u043b\u044f \u0432\u0432\u043e\u0434\u0430 (\u0438\u043c\u044f, \u043f\u0430\u0440\u043e\u043b\u044c, email \u0438 \u0434\u0440.)\n    - \u0427\u0435\u043a\u0431\u043e\u043a\u0441\u044b (Active Directory, Push-\u0443\u0432\u0435\u0434\u043e\u043c\u043b\u0435\u043d\u0438\u044f)\n    - \u0412\u044b\u043f\u0430\u0434\u0430\u044e\u0449\u0438\u0439 \u0441\u043f\u0438\u0441\u043e\u043a \u0440\u043e\u043b\u0435\u0439\n    - \u041a\u043d\u043e\u043f\u043a\u0438 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439\n    \"\"\"\n\n    def __init__(self, page: Page):\n        \"\"\"\u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0444\u043e\u0440\u043c\u044b \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\"\"\"\n\n        super().__init__(page)\n\n        # \u041b\u043e\u043a\u0430\u0442\u043e\u0440\u044b \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0444\u043e\u0440\u043c\u044b\n        text_field_locator = ModalWindowLocators.TEXT_FIELD_INPUT_FORM_USER_DATA\n        input_form_locator = ModalWindowLocators.INPUT_FORM_USER_DATA\n        label_locator = ModalWindowLocators.LABEL_INPUT_FORM_USER_DATA\n\n        # \u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430 \u0438 \u043a\u043d\u043e\u043f\u043a\u0438 \u0437\u0430\u043a\u0440\u044b\u0442\u0438\u044f \u0442\u0443\u043b\u0431\u0430\u0440\u0430\n        self.window_title = \"\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043d\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\"\n        locator_button_toolbar_close = self.page.get_by_role(\"navigation\").filter(\n            has_text=re.compile(self.window_title)\n        ).get_by_role(\"button\")\n\n        self.add_toolbar_title(self.window_title)\n        self.add_toolbar_button(locator_button_toolbar_close, \"close\")\n\n        # \u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0444\u043e\u0440\u043c\u044b\n        checkbox_1 = Checkbox(\n            page,\n            self.page.locator(input_form_locator).get_by_role(\"checkbox\").nth(0),\n            \"active_directory\"\n        )\n\n        self.add_content_item(\"active_directory_checkbox\", checkbox_1)\n\n        label_1 = Text(\n            page,\n            self.page.locator(label_locator).nth(0),\n            \"active_directory_checkbox_label\"\n        )\n        self.add_content_item(\"active_directory_checkbox_label\", label_1)\n\n        loc = self.page.locator(input_form_locator).locator(\"xpath=div[2]\").locator(text_field_locator)\n        name_input = TextInput(page, loc, \"name_input\")\n        self.add_content_item(\"name_input\", name_input)\n\n        role_loc = self.page.locator(input_form_locator).get_by_role(\"combobox\").nth(0)\n        role_input = TextInput(page, role_loc, \"role_input\")\n        self.add_content_item(\"role_input\", role_input)\n        self.add_content_item(\n            \"roles_list\",\n            DropdownList(page)\n        )\n\n        loc = self.page.locator(input_form_locator).locator(\"xpath=div[4]\").locator(text_field_locator)\n        password_input = TextInput(page, loc, \"password_input\")\n        self.add_content_item(\"password_input\", password_input)\n\n        loc = self.page.locator(input_form_locator).locator(\"xpath=div[5]\").locator(text_field_locator)\n        commentary_input = TextInput(page, loc, \"commentary_input\")\n        self.add_content_item(\"commentary_input\", commentary_input)\n\n        loc = self.page.locator(input_form_locator).locator(\"xpath=div[6]\").locator(text_field_locator)\n        email_input = TextInput(page, loc, \"email_input\")\n        self.add_content_item(\"email_input\", email_input)\n\n        loc = self.page.locator(input_form_locator).locator(\"xpath=div[7]\").locator(text_field_locator)\n        phone_input = TextInput(page, loc, \"phone_input\")\n        self.add_content_item(\"phone_input\", phone_input)\n\n        checkbox_2 = Checkbox(\n            page,\n            self.page.locator(input_form_locator).get_by_role(\"checkbox\").nth(1),\n            \"push_notification\"\n        )\n        self.add_content_item(\"push_notification_checkbox\", checkbox_2)\n\n        label_2 = Text(\n            page,\n            self.page.locator(label_locator).nth(1),\n            \"push_notification_checkbox_label\"\n        )\n        self.add_content_item(\"push_notification_checkbox_label\", label_2)\n\n        # \u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043a\u043d\u043e\u043f\u043e\u043a \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439\n        locator_button_add = self.page.get_by_role(\"button\", name=\"\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c\")\n        self.add_button(locator_button_add, \"add\")\n\n        locator_button_close = self.page.get_by_role(\"button\", name=\"\u0417\u0430\u043a\u0440\u044b\u0442\u044c\")\n        self.add_button(locator_button_close, \"close\")\n\n        self.new_user_confirm = ConfirmComponent(page, \" \u041e\u0442\u043c\u0435\u043d\u0430 \", \" \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \")\n\n     # \u0414\u0435\u0439\u0441\u0442\u0432\u0438\u044f:\n    def check_active_directory_checkbox(self):\n        \"\"\"\u0412\u043a\u043b\u044e\u0447\u0430\u0435\u0442 \u0447\u0435\u043a-\u0431\u043e\u043a\u0441 Active Directory. \"\"\"\n\n        self.get_content_item(\"active_directory_checkbox\").check(force=True)\n\n    def uncheck_active_directory_checkbox(self):\n        \"\"\"\u0412\u044b\u043a\u043b\u044e\u0447\u0430\u0435\u0442 \u0447\u0435\u043a-\u0431\u043e\u043a\u0441 Active Directory. \"\"\"\n\n        self.get_content_item(\"active_directory_checkbox\").uncheck(force=True)\n\n    def new_user(self, user_data):\n        \"\"\"\u0417\u0430\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u0444\u043e\u0440\u043c\u0443 \u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u043d\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\n\n        Args:\n            user_data (dict): \u0414\u0430\u043d\u043d\u044b\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f (\u0438\u043c\u044f, \u0440\u043e\u043b\u044c, \u043f\u0430\u0440\u043e\u043b\u044c \u0438 \u0434\u0440.)\n        \"\"\"\n\n        fields = user_data.keys()\n\n        if \"name\" in fields:\n            input_field = self.get_content_item(\"name_input\")\n            input_field.input_value(user_data[\"name\"])\n\n        if \"role\" in fields:\n            role_field = self.get_content_item(\"role_input\")\n            role_field.click()\n\n            roles_list = self.get_content_item(\"roles_list\")\n            roles_list.check_item_with_text(user_data[\"role\"])\n            roles_list.click_item_with_text(user_data[\"role\"])\n\n        if \"password\" in fields:\n            input_field = self.get_content_item(\"password_input\")\n            input_field.input_value(user_data[\"password\"])\n\n        if \"commentary\" in fields:\n            input_field = self.get_content_item(\"commentary_input\")\n            input_field.input_value(user_data[\"commentary\"])\n\n        if \"email\" in fields:\n            input_field = self.get_content_item(\"email_input\")\n            input_field.input_value(user_data[\"email\"])\n\n        if \"phone_number\" in fields:\n            input_field = self.get_content_item(\"phone_input\")\n            input_field.input_value(user_data[\"phone_number\"])\n\n        if \"push_notification_checked\" in fields:\n            checkbox = self.get_content_item(\"push_notification_checkbox\")\n            if user_data[\"push_notification_checked\"]:\n                checkbox.check()\n            else:\n                checkbox.uncheck()\n\n        # \u041e\u0442\u043f\u0440\u0430\u0432\u043a\u0430 \u0444\u043e\u0440\u043c\u044b\n        add_button = self.get_button_by_name(\"add\")\n        add_button.click()\n\n        # \u041f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f\n        title = \"\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043d\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\"\n        self.new_user_confirm.check_title(\n            title,\n            f\"Confirmation dialog window with title '{title}' is missing\"\n        )\n        self.new_user_confirm.click_allow_button()\n\n    def close_window(self):\n        \"\"\"\u0417\u0430\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043a\u043d\u043e \u0447\u0435\u0440\u0435\u0437 \u043a\u043d\u043e\u043f\u043a\u0443 '\u0417\u0430\u043a\u0440\u044b\u0442\u044c'.\"\"\"\n\n        close_button = self.get_button_by_name(\"close\")\n        close_button.click()\n\n    def close_window_by_toolbar_button(self):\n        \"\"\"\u0417\u0430\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043a\u043d\u043e \u0447\u0435\u0440\u0435\u0437 \u043a\u043d\u043e\u043f\u043a\u0443 \u0432 \u0442\u0443\u043b\u0431\u0430\u0440\u0435.\"\"\"\n\n        self.click_toolbar_close_button()\n\n    # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0438:\n    def check_content(self):\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0438 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0441\u0442\u044c \u0432\u0441\u0435\u0445 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0444\u043e\u0440\u043c\u044b.\"\"\"\n\n        menu_locator = self.page.locator(ModalWindowLocators.MENU_INPUT_FORM_USER_DATA)\n\n        self.check_by_window_title()\n\n        is_checked = self.get_content_item(\"active_directory_checkbox\").is_checked()\n        if is_checked:\n            assert False, \\\n                \"The checkbox 'Active Directory'should not be checked for the add local user window\"\n\n        self.check_toolbar_button_visibility(\"close\")\n        self.check_toolbar_button_tooltip(\"close\", \"\u0417\u0430\u043a\u0440\u044b\u0442\u044c\")\n\n        for name in self.content_items.keys():\n            item = self.get_content_item(name)\n\n            if name == \"active_directory_checkbox_label\":\n                item.check_have_text(\n                    \"Active Directory\",\n                    \"Label 'Active Directory' is missing\"\n                )\n            elif name == \"push_notification_checkbox_label\":\n                item.check_have_text(\n                    \"\u041f\u043e\u0434\u043f\u0438\u0441\u043a\u0430 \u043d\u0430 Push-\u0443\u0432\u0435\u0434\u043e\u043c\u043b\u0435\u043d\u0438\u044f\",\n                    \"Label '\u041f\u043e\u0434\u043f\u0438\u0441\u043a\u0430 \u043d\u0430 Push-\u0443\u0432\u0435\u0434\u043e\u043c\u043b\u0435\u043d\u0438\u044f' is missing\"\n                )\n            elif name == \"role_input\":\n                item.click()\n                roles_list = self.get_content_item(\"roles_list\")\n                roles_list.check_visibility(menu_locator,\n                                          \"Roles list is missing\")\n\n                is_scrollable_vertically = roles_list.check_vertical_scrolling(menu_locator)\n                assert not is_scrollable_vertically, \\\n                    \"Roles list should not be scrollable_vertically\"\n\n                for role in roles_dict.values():\n                    # \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e, \u043f\u043e\u043a\u0430 \u0435\u0441\u0442\u044c \u043d\u0435\u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0435 \u0441\u043e \u0441\u043f\u0438\u0441\u043a\u043e\u043c \u0440\u043e\u043b\u0435\u0439 \u0432 \u0432\u043a\u043b\u0430\u0434\u043a\u0435 \u0421\u0435\u0441\u0441\u0438\u0438\n                    if role == \"\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\":\n                        continue\n                    roles_list.check_item_with_text(role)\n            elif name == \"roles_list\":\n                continue\n            else:\n                item.check_visibility(\n                    f\"Modal window content item with name '{name}' is missing\"\n                )\n\n        self.check_button_visibility(\"add\")\n        self.check_button_visibility(\"close\")\n
    "},{"location":"components_derived/modal_add_local_user/#components_derived.modal_add_local_user.AddLocalUserModalWindow.__init__","title":"__init__(page)","text":"

    \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0444\u043e\u0440\u043c\u044b \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.

    Source code in components_derived\\modal_add_local_user.py
    def __init__(self, page: Page):\n    \"\"\"\u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0444\u043e\u0440\u043c\u044b \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\"\"\"\n\n    super().__init__(page)\n\n    # \u041b\u043e\u043a\u0430\u0442\u043e\u0440\u044b \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0444\u043e\u0440\u043c\u044b\n    text_field_locator = ModalWindowLocators.TEXT_FIELD_INPUT_FORM_USER_DATA\n    input_form_locator = ModalWindowLocators.INPUT_FORM_USER_DATA\n    label_locator = ModalWindowLocators.LABEL_INPUT_FORM_USER_DATA\n\n    # \u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430 \u0438 \u043a\u043d\u043e\u043f\u043a\u0438 \u0437\u0430\u043a\u0440\u044b\u0442\u0438\u044f \u0442\u0443\u043b\u0431\u0430\u0440\u0430\n    self.window_title = \"\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043d\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\"\n    locator_button_toolbar_close = self.page.get_by_role(\"navigation\").filter(\n        has_text=re.compile(self.window_title)\n    ).get_by_role(\"button\")\n\n    self.add_toolbar_title(self.window_title)\n    self.add_toolbar_button(locator_button_toolbar_close, \"close\")\n\n    # \u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0444\u043e\u0440\u043c\u044b\n    checkbox_1 = Checkbox(\n        page,\n        self.page.locator(input_form_locator).get_by_role(\"checkbox\").nth(0),\n        \"active_directory\"\n    )\n\n    self.add_content_item(\"active_directory_checkbox\", checkbox_1)\n\n    label_1 = Text(\n        page,\n        self.page.locator(label_locator).nth(0),\n        \"active_directory_checkbox_label\"\n    )\n    self.add_content_item(\"active_directory_checkbox_label\", label_1)\n\n    loc = self.page.locator(input_form_locator).locator(\"xpath=div[2]\").locator(text_field_locator)\n    name_input = TextInput(page, loc, \"name_input\")\n    self.add_content_item(\"name_input\", name_input)\n\n    role_loc = self.page.locator(input_form_locator).get_by_role(\"combobox\").nth(0)\n    role_input = TextInput(page, role_loc, \"role_input\")\n    self.add_content_item(\"role_input\", role_input)\n    self.add_content_item(\n        \"roles_list\",\n        DropdownList(page)\n    )\n\n    loc = self.page.locator(input_form_locator).locator(\"xpath=div[4]\").locator(text_field_locator)\n    password_input = TextInput(page, loc, \"password_input\")\n    self.add_content_item(\"password_input\", password_input)\n\n    loc = self.page.locator(input_form_locator).locator(\"xpath=div[5]\").locator(text_field_locator)\n    commentary_input = TextInput(page, loc, \"commentary_input\")\n    self.add_content_item(\"commentary_input\", commentary_input)\n\n    loc = self.page.locator(input_form_locator).locator(\"xpath=div[6]\").locator(text_field_locator)\n    email_input = TextInput(page, loc, \"email_input\")\n    self.add_content_item(\"email_input\", email_input)\n\n    loc = self.page.locator(input_form_locator).locator(\"xpath=div[7]\").locator(text_field_locator)\n    phone_input = TextInput(page, loc, \"phone_input\")\n    self.add_content_item(\"phone_input\", phone_input)\n\n    checkbox_2 = Checkbox(\n        page,\n        self.page.locator(input_form_locator).get_by_role(\"checkbox\").nth(1),\n        \"push_notification\"\n    )\n    self.add_content_item(\"push_notification_checkbox\", checkbox_2)\n\n    label_2 = Text(\n        page,\n        self.page.locator(label_locator).nth(1),\n        \"push_notification_checkbox_label\"\n    )\n    self.add_content_item(\"push_notification_checkbox_label\", label_2)\n\n    # \u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043a\u043d\u043e\u043f\u043e\u043a \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439\n    locator_button_add = self.page.get_by_role(\"button\", name=\"\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c\")\n    self.add_button(locator_button_add, \"add\")\n\n    locator_button_close = self.page.get_by_role(\"button\", name=\"\u0417\u0430\u043a\u0440\u044b\u0442\u044c\")\n    self.add_button(locator_button_close, \"close\")\n\n    self.new_user_confirm = ConfirmComponent(page, \" \u041e\u0442\u043c\u0435\u043d\u0430 \", \" \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \")\n
    "},{"location":"components_derived/modal_add_local_user/#components_derived.modal_add_local_user.AddLocalUserModalWindow.check_active_directory_checkbox","title":"check_active_directory_checkbox()","text":"

    \u0412\u043a\u043b\u044e\u0447\u0430\u0435\u0442 \u0447\u0435\u043a-\u0431\u043e\u043a\u0441 Active Directory.

    Source code in components_derived\\modal_add_local_user.py
    def check_active_directory_checkbox(self):\n    \"\"\"\u0412\u043a\u043b\u044e\u0447\u0430\u0435\u0442 \u0447\u0435\u043a-\u0431\u043e\u043a\u0441 Active Directory. \"\"\"\n\n    self.get_content_item(\"active_directory_checkbox\").check(force=True)\n
    "},{"location":"components_derived/modal_add_local_user/#components_derived.modal_add_local_user.AddLocalUserModalWindow.check_content","title":"check_content()","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0438 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0441\u0442\u044c \u0432\u0441\u0435\u0445 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0444\u043e\u0440\u043c\u044b.

    Source code in components_derived\\modal_add_local_user.py
    def check_content(self):\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0438 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0441\u0442\u044c \u0432\u0441\u0435\u0445 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0444\u043e\u0440\u043c\u044b.\"\"\"\n\n    menu_locator = self.page.locator(ModalWindowLocators.MENU_INPUT_FORM_USER_DATA)\n\n    self.check_by_window_title()\n\n    is_checked = self.get_content_item(\"active_directory_checkbox\").is_checked()\n    if is_checked:\n        assert False, \\\n            \"The checkbox 'Active Directory'should not be checked for the add local user window\"\n\n    self.check_toolbar_button_visibility(\"close\")\n    self.check_toolbar_button_tooltip(\"close\", \"\u0417\u0430\u043a\u0440\u044b\u0442\u044c\")\n\n    for name in self.content_items.keys():\n        item = self.get_content_item(name)\n\n        if name == \"active_directory_checkbox_label\":\n            item.check_have_text(\n                \"Active Directory\",\n                \"Label 'Active Directory' is missing\"\n            )\n        elif name == \"push_notification_checkbox_label\":\n            item.check_have_text(\n                \"\u041f\u043e\u0434\u043f\u0438\u0441\u043a\u0430 \u043d\u0430 Push-\u0443\u0432\u0435\u0434\u043e\u043c\u043b\u0435\u043d\u0438\u044f\",\n                \"Label '\u041f\u043e\u0434\u043f\u0438\u0441\u043a\u0430 \u043d\u0430 Push-\u0443\u0432\u0435\u0434\u043e\u043c\u043b\u0435\u043d\u0438\u044f' is missing\"\n            )\n        elif name == \"role_input\":\n            item.click()\n            roles_list = self.get_content_item(\"roles_list\")\n            roles_list.check_visibility(menu_locator,\n                                      \"Roles list is missing\")\n\n            is_scrollable_vertically = roles_list.check_vertical_scrolling(menu_locator)\n            assert not is_scrollable_vertically, \\\n                \"Roles list should not be scrollable_vertically\"\n\n            for role in roles_dict.values():\n                # \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e, \u043f\u043e\u043a\u0430 \u0435\u0441\u0442\u044c \u043d\u0435\u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0435 \u0441\u043e \u0441\u043f\u0438\u0441\u043a\u043e\u043c \u0440\u043e\u043b\u0435\u0439 \u0432 \u0432\u043a\u043b\u0430\u0434\u043a\u0435 \u0421\u0435\u0441\u0441\u0438\u0438\n                if role == \"\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\":\n                    continue\n                roles_list.check_item_with_text(role)\n        elif name == \"roles_list\":\n            continue\n        else:\n            item.check_visibility(\n                f\"Modal window content item with name '{name}' is missing\"\n            )\n\n    self.check_button_visibility(\"add\")\n    self.check_button_visibility(\"close\")\n
    "},{"location":"components_derived/modal_add_local_user/#components_derived.modal_add_local_user.AddLocalUserModalWindow.close_window","title":"close_window()","text":"

    \u0417\u0430\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043a\u043d\u043e \u0447\u0435\u0440\u0435\u0437 \u043a\u043d\u043e\u043f\u043a\u0443 '\u0417\u0430\u043a\u0440\u044b\u0442\u044c'.

    Source code in components_derived\\modal_add_local_user.py
    def close_window(self):\n    \"\"\"\u0417\u0430\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043a\u043d\u043e \u0447\u0435\u0440\u0435\u0437 \u043a\u043d\u043e\u043f\u043a\u0443 '\u0417\u0430\u043a\u0440\u044b\u0442\u044c'.\"\"\"\n\n    close_button = self.get_button_by_name(\"close\")\n    close_button.click()\n
    "},{"location":"components_derived/modal_add_local_user/#components_derived.modal_add_local_user.AddLocalUserModalWindow.close_window_by_toolbar_button","title":"close_window_by_toolbar_button()","text":"

    \u0417\u0430\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043a\u043d\u043e \u0447\u0435\u0440\u0435\u0437 \u043a\u043d\u043e\u043f\u043a\u0443 \u0432 \u0442\u0443\u043b\u0431\u0430\u0440\u0435.

    Source code in components_derived\\modal_add_local_user.py
    def close_window_by_toolbar_button(self):\n    \"\"\"\u0417\u0430\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043a\u043d\u043e \u0447\u0435\u0440\u0435\u0437 \u043a\u043d\u043e\u043f\u043a\u0443 \u0432 \u0442\u0443\u043b\u0431\u0430\u0440\u0435.\"\"\"\n\n    self.click_toolbar_close_button()\n
    "},{"location":"components_derived/modal_add_local_user/#components_derived.modal_add_local_user.AddLocalUserModalWindow.new_user","title":"new_user(user_data)","text":"

    \u0417\u0430\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u0444\u043e\u0440\u043c\u0443 \u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u043d\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.

    Parameters:

    Name Type Description Default user_data dict

    \u0414\u0430\u043d\u043d\u044b\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f (\u0438\u043c\u044f, \u0440\u043e\u043b\u044c, \u043f\u0430\u0440\u043e\u043b\u044c \u0438 \u0434\u0440.)

    required Source code in components_derived\\modal_add_local_user.py
    def new_user(self, user_data):\n    \"\"\"\u0417\u0430\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u0444\u043e\u0440\u043c\u0443 \u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u043d\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\n\n    Args:\n        user_data (dict): \u0414\u0430\u043d\u043d\u044b\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f (\u0438\u043c\u044f, \u0440\u043e\u043b\u044c, \u043f\u0430\u0440\u043e\u043b\u044c \u0438 \u0434\u0440.)\n    \"\"\"\n\n    fields = user_data.keys()\n\n    if \"name\" in fields:\n        input_field = self.get_content_item(\"name_input\")\n        input_field.input_value(user_data[\"name\"])\n\n    if \"role\" in fields:\n        role_field = self.get_content_item(\"role_input\")\n        role_field.click()\n\n        roles_list = self.get_content_item(\"roles_list\")\n        roles_list.check_item_with_text(user_data[\"role\"])\n        roles_list.click_item_with_text(user_data[\"role\"])\n\n    if \"password\" in fields:\n        input_field = self.get_content_item(\"password_input\")\n        input_field.input_value(user_data[\"password\"])\n\n    if \"commentary\" in fields:\n        input_field = self.get_content_item(\"commentary_input\")\n        input_field.input_value(user_data[\"commentary\"])\n\n    if \"email\" in fields:\n        input_field = self.get_content_item(\"email_input\")\n        input_field.input_value(user_data[\"email\"])\n\n    if \"phone_number\" in fields:\n        input_field = self.get_content_item(\"phone_input\")\n        input_field.input_value(user_data[\"phone_number\"])\n\n    if \"push_notification_checked\" in fields:\n        checkbox = self.get_content_item(\"push_notification_checkbox\")\n        if user_data[\"push_notification_checked\"]:\n            checkbox.check()\n        else:\n            checkbox.uncheck()\n\n    # \u041e\u0442\u043f\u0440\u0430\u0432\u043a\u0430 \u0444\u043e\u0440\u043c\u044b\n    add_button = self.get_button_by_name(\"add\")\n    add_button.click()\n\n    # \u041f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f\n    title = \"\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043d\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\"\n    self.new_user_confirm.check_title(\n        title,\n        f\"Confirmation dialog window with title '{title}' is missing\"\n    )\n    self.new_user_confirm.click_allow_button()\n
    "},{"location":"components_derived/modal_add_local_user/#components_derived.modal_add_local_user.AddLocalUserModalWindow.uncheck_active_directory_checkbox","title":"uncheck_active_directory_checkbox()","text":"

    \u0412\u044b\u043a\u043b\u044e\u0447\u0430\u0435\u0442 \u0447\u0435\u043a-\u0431\u043e\u043a\u0441 Active Directory.

    Source code in components_derived\\modal_add_local_user.py
    def uncheck_active_directory_checkbox(self):\n    \"\"\"\u0412\u044b\u043a\u043b\u044e\u0447\u0430\u0435\u0442 \u0447\u0435\u043a-\u0431\u043e\u043a\u0441 Active Directory. \"\"\"\n\n    self.get_content_item(\"active_directory_checkbox\").uncheck(force=True)\n
    "},{"location":"components_derived/modal_change_password/","title":"ChangePasswordModalWindow","text":"

    \u041c\u043e\u0434\u0443\u043b\u044c modal_change_password \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043a\u043b\u0430\u0441\u0441 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u043e\u043a\u043d\u043e\u043c \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u043f\u0430\u0440\u043e\u043b\u044f \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.

    \u041a\u043b\u0430\u0441\u0441 ChangePasswordModalWindow \u043d\u0430\u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u0431\u0430\u0437\u043e\u0432\u044b\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b ModalWindowComponent \u0438 \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u0442 \u043c\u0435\u0442\u043e\u0434\u044b \u0434\u043b\u044f \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u043f\u0430\u0440\u043e\u043b\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.

    "},{"location":"components_derived/modal_change_password/#components_derived.modal_change_password.ChangePasswordModalWindow","title":"ChangePasswordModalWindow","text":"

    Bases: ModalWindowComponent

    \u041c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043a\u043d\u043e \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u043f\u0430\u0440\u043e\u043b\u044f \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.

    \u041d\u0430\u0441\u043b\u0435\u0434\u0443\u0435\u0442 ModalWindowComponent \u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442: - \u041f\u043e\u043b\u044f \u0437\u0430\u0434\u0430\u043d\u0438\u044f \u043f\u0430\u0440\u043e\u043b\u044f - \u041a\u043d\u043e\u043f\u043a\u0438 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439 (\u0421\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c, \u041e\u0442\u043c\u0435\u043d\u0438\u0442\u044c)

    Source code in components_derived\\modal_change_password.py
    class ChangePasswordModalWindow(ModalWindowComponent):\n    \"\"\"\u041c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043a\u043d\u043e \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u043f\u0430\u0440\u043e\u043b\u044f \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\n\n    \u041d\u0430\u0441\u043b\u0435\u0434\u0443\u0435\u0442 ModalWindowComponent \u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442:\n    - \u041f\u043e\u043b\u044f \u0437\u0430\u0434\u0430\u043d\u0438\u044f \u043f\u0430\u0440\u043e\u043b\u044f\n    - \u041a\u043d\u043e\u043f\u043a\u0438 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439 (\u0421\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c, \u041e\u0442\u043c\u0435\u043d\u0438\u0442\u044c)\n    \"\"\"\n\n    def __init__(self, page: Page):\n        \"\"\"\u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0444\u043e\u0440\u043c\u044b \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\"\"\"\n\n        super().__init__(page)\n\n        modal_window_locator = page.locator(ModalWindowLocators.MODAL_WINDOW)\n\n        # \u0422\u0443\u043b\u0431\u0430\u0440 \u0441 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u043e\u043c\n        user_name = host.get_current_user_name()\n        self.add_toolbar_title(f\"\u0418\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u043f\u0430\u0440\u043e\u043b\u044c \u0434\u043b\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f {user_name}?\")\n\n        # \u041f\u043e\u043b\u044f \u0432\u0432\u043e\u0434\u0430 \u043f\u0430\u0440\u043e\u043b\u044f\n        loc = modal_window_locator.get_by_label(\"\u0412\u0432\u0435\u0434\u0438\u0442\u0435 \u0442\u0435\u043a\u0443\u0449\u0438\u0439 \u043f\u0430\u0440\u043e\u043b\u044c *\")\n        old_password_input = TextInput(page, loc, \"old_password_input\")\n        self.add_content_item(\"old_password_input\", old_password_input)\n\n        icon_locator = loc.locator(\"xpath=../..\").locator(TextInputLocators.ICON_PASSWORD_HIDING)\n        old_password_hidden_icon = Icon(page, icon_locator,\n                                         \"old password hidden icon\")\n        self.add_content_item(\"old_password_hidden_icon\", old_password_hidden_icon)\n\n        loc = modal_window_locator.get_by_label(\"\u0412\u0432\u0435\u0434\u0438\u0442\u0435 \u043d\u043e\u0432\u044b\u0439 \u043f\u0430\u0440\u043e\u043b\u044c *\")\n        new_password_input = TextInput(page, loc, \"new_password_input\")\n        self.add_content_item(\"new_password_input\", new_password_input)\n\n        icon_locator = loc.locator(\"xpath=../..\").locator(TextInputLocators.ICON_PASSWORD_HIDING)\n        new_password_hidden_icon = Icon(page, icon_locator,\n                                         \"new password hidden icon\")\n        self.add_content_item(\"new_password_hidden_icon\", new_password_hidden_icon)\n\n        loc = modal_window_locator.get_by_label(\"\u0412\u0432\u0435\u0434\u0438\u0442\u0435 \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u043e \u043d\u043e\u0432\u044b\u0439 \u043f\u0430\u0440\u043e\u043b\u044c *\")\n        confirm_password_input = TextInput(page, loc, \"confirm_password_input\")\n        self.add_content_item(\"confirm_password_input\", confirm_password_input)\n\n        icon_locator = loc.locator(\"xpath=../..\").locator(TextInputLocators.ICON_PASSWORD_HIDING)\n        confirm_password_hidden_icon = Icon(page, icon_locator,\n                                           \"confirm password hidden icon\")\n        self.add_content_item(\"confirm_password_hidden_icon\", confirm_password_hidden_icon)\n\n        input_form_error_message = Text(page,\n                                       modal_window_locator.locator(TextInputLocators.INPUT_FORM_MESSAGE),\n                                       \"input form error message\")\n        self.add_content_item(\"input_form_error_message\", input_form_error_message)\n\n        # \u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043a\u043d\u043e\u043f\u043e\u043a \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439\n        locator_button_save = self.page.get_by_role(\"button\", name=\"\u0421\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c\")\n        self.add_button(locator_button_save, \"save\")\n\n        locator_button_cancel = self.page.get_by_role(\"button\", name=\"\u041e\u0442\u043c\u0435\u043d\u0438\u0442\u044c\")\n        self.add_button(locator_button_cancel, \"cancel\")\n\n        # Alert \u043f\u0440\u0438 \u0443\u0441\u043f\u0435\u0448\u043d\u043e\u043c \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\n        self.alert = AlertComponent(page)\n\n    # \u0414\u0435\u0439\u0441\u0442\u0432\u0438\u044f:\n    def click_cancel_button(self) -> None:\n        \"\"\"\u041d\u0430\u0436\u0438\u043c\u0430\u0435\u0442 \u043a\u043d\u043e\u043f\u043a\u0443 '\u041e\u0442\u043c\u0435\u043d\u0438\u0442\u044c'\"\"\"\n\n        self.get_button_by_name(\"cancel\").click()\n\n    def click_old_password_hidden_icon(self) -> None:\n        \"\"\"\u041d\u0430\u0436\u0430\u0442\u0438\u0435 \u043d\u0430 \u0438\u043a\u043e\u043d\u043a\u0443 \u0441\u043a\u0440\u044b\u0442\u0438\u044f \u0441\u0442\u0430\u0440\u043e\u0433\u043e \u043f\u0430\u0440\u043e\u043b\u044f.\"\"\"\n\n        self.get_content_item(\"old_password_hidden_icon\").click()\n\n    def click_new_password_hidden_icon(self) -> None:\n        \"\"\"\u041d\u0430\u0436\u0430\u0442\u0438\u0435 \u043d\u0430 \u0438\u043a\u043e\u043d\u043a\u0443 \u0441\u043a\u0440\u044b\u0442\u0438\u044f \u043d\u043e\u0432\u043e\u0433\u043e \u043f\u0430\u0440\u043e\u043b\u044f.\"\"\"\n\n        self.get_content_item(\"new_password_hidden_icon\").click()\n\n    def click_confirm_password_hidden_icon(self) -> None:\n        \"\"\"\u041d\u0430\u0436\u0430\u0442\u0438\u0435 \u043d\u0430 \u0438\u043a\u043e\u043d\u043a\u0443 \u0441\u043a\u0440\u044b\u0442\u0438\u044f \u043f\u0430\u0440\u043e\u043b\u044f \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u044f.\"\"\"\n\n        self.get_content_item(\"confirm_password_hidden_icon\").click()\n\n    def change_password(self, old_password: str, new_password: str):\n        \"\"\"\u0417\u0430\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0444\u043e\u0440\u043c\u044b, \u043d\u0430\u0436\u0438\u043c\u0430\u0435\u0442 \u043a\u043d\u043e\u043f\u043a\u0443 '\u0421\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c'\"\"\"\n\n        error = \"\"\n\n        self.get_content_item(\"old_password_input\").input_value(old_password)\n        self.get_content_item(\"new_password_input\").input_value(new_password)\n        self.get_content_item(\"confirm_password_input\").input_value(new_password)\n\n        button_save = self.get_button_by_name(\"save\")\n\n        if button_save.is_disabled():\n            error_message = self.get_content_item(\"input_form_error_message\")\n            error = error_message.get_text(0)\n            return False, error\n\n        button_save.click()\n\n        is_changed = False\n\n        alert_type = self.alert.get_alert_type()\n        if alert_type == \"success\":\n            self.alert.check_alert_presence(' \u041f\u0430\u0440\u043e\u043b\u044c \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u0438\u0437\u043c\u0435\u043d\u0451\u043d ')\n            self.alert.check_alert_absence(' \u041f\u0430\u0440\u043e\u043b\u044c \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u0438\u0437\u043c\u0435\u043d\u0451\u043d ')\n            is_changed = True\n        elif alert_type == \"error\":\n            # to do: fix message after translation\n            self.alert.check_alert_presence(' Old password not equal ')\n            self.alert.check_alert_absence(' Old password not equal ')\n\n            error = \"Old password is not equal real password\"\n        else:\n            error = f\"Got unexpected alert type {alert_type}\"\n\n        return is_changed, error\n\n    def get_password_inputs(self) -> []:\n        \"\"\"\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0441\u043f\u0438\u0441\u043e\u043a \u043f\u043e\u043b\u0435\u0439 \u0432\u0432\u043e\u0434\u0430 \u043f\u0430\u0440\u043e\u043b\u044f (\u0434\u043b\u044f \u0442\u0435\u0441\u0442\u043e\u0432\u044b\u0445 \u0446\u0435\u043b\u0435\u0439).\"\"\"\n\n        text_inputs = []\n        text_inputs.append(self.get_content_item(\"old_password_input\"))\n        text_inputs.append(self.get_content_item(\"new_password_input\"))\n        text_inputs.append(self.get_content_item(\"confirm_password_input\"))\n        return text_inputs\n\n    # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0438:\n    def check_content(self):\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0438 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0441\u0442\u044c \u0432\u0441\u0435\u0445 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0444\u043e\u0440\u043c\u044b.\"\"\"\n\n        self.check_by_window_title()\n\n        self.get_content_item(\"old_password_input\").check_visibility(\n                                  \"Old password input form is missing\"\n                             )\n        old_password_hidden_icon = self.get_content_item(\"old_password_hidden_icon\") \n        old_password_hidden_icon.check_visibility(\n                                  \"Old password hidden icon is missing\"\n                             )\n        is_hidden_state = old_password_hidden_icon.is_password_hidden()\n        assert is_hidden_state, \"Old password hidden icon should be in hidden state\"\n\n        self.get_content_item(\"new_password_input\").check_visibility(\n                                  \"New password input form is missing\"\n                             )\n        new_password_hidden_icon = self.get_content_item(\"new_password_hidden_icon\") \n        new_password_hidden_icon.check_visibility(\n                                  \"New password hidden icon is missing\"\n                             )\n        is_hidden_state = new_password_hidden_icon.is_password_hidden()\n        assert is_hidden_state, \"New password hidden icon should be in hidden state\"\n\n        self.get_content_item(\"confirm_password_input\").check_visibility(\n                                  \"Confirm password input form is missing\"\n                             )\n        confirm_password_hidden_icon = self.get_content_item(\"confirm_password_hidden_icon\") \n        confirm_password_hidden_icon.check_visibility(\n                                  \"Confirm password hidden icon is missing\"\n                             )\n        is_hidden_state = confirm_password_hidden_icon.is_password_hidden()\n        assert is_hidden_state, \"Confirm password hidden icon should be in hidden state\"\n\n        self.check_button_visibility(\"cancel\")\n\n        button_save = self.get_button_by_name(\"save\")\n        is_disabled = button_save.is_disabled()\n        assert is_disabled, \"Button '\u0421\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c' should be hidden\"\n\n    def check_error_message(self, text: str) -> None:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u043e\u0431 \u043e\u0448\u0438\u0431\u043a\u0435, \u0432\u043e\u0437\u043d\u0438\u043a\u0448\u0435\u0435 \u043f\u0440\u0438 \u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0438 \u043f\u043e\u043b\u0435\u0439 \u0444\u043e\u0440\u043c\u044b.\"\"\"\n\n        error_message = self.get_content_item(\"input_form_error_message\")\n        error_message.check_have_text(text, \"Unexpected error message\")\n
    "},{"location":"components_derived/modal_change_password/#components_derived.modal_change_password.ChangePasswordModalWindow.__init__","title":"__init__(page)","text":"

    \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0444\u043e\u0440\u043c\u044b \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.

    Source code in components_derived\\modal_change_password.py
    def __init__(self, page: Page):\n    \"\"\"\u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0444\u043e\u0440\u043c\u044b \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\"\"\"\n\n    super().__init__(page)\n\n    modal_window_locator = page.locator(ModalWindowLocators.MODAL_WINDOW)\n\n    # \u0422\u0443\u043b\u0431\u0430\u0440 \u0441 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u043e\u043c\n    user_name = host.get_current_user_name()\n    self.add_toolbar_title(f\"\u0418\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u043f\u0430\u0440\u043e\u043b\u044c \u0434\u043b\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f {user_name}?\")\n\n    # \u041f\u043e\u043b\u044f \u0432\u0432\u043e\u0434\u0430 \u043f\u0430\u0440\u043e\u043b\u044f\n    loc = modal_window_locator.get_by_label(\"\u0412\u0432\u0435\u0434\u0438\u0442\u0435 \u0442\u0435\u043a\u0443\u0449\u0438\u0439 \u043f\u0430\u0440\u043e\u043b\u044c *\")\n    old_password_input = TextInput(page, loc, \"old_password_input\")\n    self.add_content_item(\"old_password_input\", old_password_input)\n\n    icon_locator = loc.locator(\"xpath=../..\").locator(TextInputLocators.ICON_PASSWORD_HIDING)\n    old_password_hidden_icon = Icon(page, icon_locator,\n                                     \"old password hidden icon\")\n    self.add_content_item(\"old_password_hidden_icon\", old_password_hidden_icon)\n\n    loc = modal_window_locator.get_by_label(\"\u0412\u0432\u0435\u0434\u0438\u0442\u0435 \u043d\u043e\u0432\u044b\u0439 \u043f\u0430\u0440\u043e\u043b\u044c *\")\n    new_password_input = TextInput(page, loc, \"new_password_input\")\n    self.add_content_item(\"new_password_input\", new_password_input)\n\n    icon_locator = loc.locator(\"xpath=../..\").locator(TextInputLocators.ICON_PASSWORD_HIDING)\n    new_password_hidden_icon = Icon(page, icon_locator,\n                                     \"new password hidden icon\")\n    self.add_content_item(\"new_password_hidden_icon\", new_password_hidden_icon)\n\n    loc = modal_window_locator.get_by_label(\"\u0412\u0432\u0435\u0434\u0438\u0442\u0435 \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u043e \u043d\u043e\u0432\u044b\u0439 \u043f\u0430\u0440\u043e\u043b\u044c *\")\n    confirm_password_input = TextInput(page, loc, \"confirm_password_input\")\n    self.add_content_item(\"confirm_password_input\", confirm_password_input)\n\n    icon_locator = loc.locator(\"xpath=../..\").locator(TextInputLocators.ICON_PASSWORD_HIDING)\n    confirm_password_hidden_icon = Icon(page, icon_locator,\n                                       \"confirm password hidden icon\")\n    self.add_content_item(\"confirm_password_hidden_icon\", confirm_password_hidden_icon)\n\n    input_form_error_message = Text(page,\n                                   modal_window_locator.locator(TextInputLocators.INPUT_FORM_MESSAGE),\n                                   \"input form error message\")\n    self.add_content_item(\"input_form_error_message\", input_form_error_message)\n\n    # \u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043a\u043d\u043e\u043f\u043e\u043a \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439\n    locator_button_save = self.page.get_by_role(\"button\", name=\"\u0421\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c\")\n    self.add_button(locator_button_save, \"save\")\n\n    locator_button_cancel = self.page.get_by_role(\"button\", name=\"\u041e\u0442\u043c\u0435\u043d\u0438\u0442\u044c\")\n    self.add_button(locator_button_cancel, \"cancel\")\n\n    # Alert \u043f\u0440\u0438 \u0443\u0441\u043f\u0435\u0448\u043d\u043e\u043c \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\n    self.alert = AlertComponent(page)\n
    "},{"location":"components_derived/modal_change_password/#components_derived.modal_change_password.ChangePasswordModalWindow.change_password","title":"change_password(old_password, new_password)","text":"

    \u0417\u0430\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0444\u043e\u0440\u043c\u044b, \u043d\u0430\u0436\u0438\u043c\u0430\u0435\u0442 \u043a\u043d\u043e\u043f\u043a\u0443 '\u0421\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c'

    Source code in components_derived\\modal_change_password.py
    def change_password(self, old_password: str, new_password: str):\n    \"\"\"\u0417\u0430\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0444\u043e\u0440\u043c\u044b, \u043d\u0430\u0436\u0438\u043c\u0430\u0435\u0442 \u043a\u043d\u043e\u043f\u043a\u0443 '\u0421\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c'\"\"\"\n\n    error = \"\"\n\n    self.get_content_item(\"old_password_input\").input_value(old_password)\n    self.get_content_item(\"new_password_input\").input_value(new_password)\n    self.get_content_item(\"confirm_password_input\").input_value(new_password)\n\n    button_save = self.get_button_by_name(\"save\")\n\n    if button_save.is_disabled():\n        error_message = self.get_content_item(\"input_form_error_message\")\n        error = error_message.get_text(0)\n        return False, error\n\n    button_save.click()\n\n    is_changed = False\n\n    alert_type = self.alert.get_alert_type()\n    if alert_type == \"success\":\n        self.alert.check_alert_presence(' \u041f\u0430\u0440\u043e\u043b\u044c \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u0438\u0437\u043c\u0435\u043d\u0451\u043d ')\n        self.alert.check_alert_absence(' \u041f\u0430\u0440\u043e\u043b\u044c \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u0438\u0437\u043c\u0435\u043d\u0451\u043d ')\n        is_changed = True\n    elif alert_type == \"error\":\n        # to do: fix message after translation\n        self.alert.check_alert_presence(' Old password not equal ')\n        self.alert.check_alert_absence(' Old password not equal ')\n\n        error = \"Old password is not equal real password\"\n    else:\n        error = f\"Got unexpected alert type {alert_type}\"\n\n    return is_changed, error\n
    "},{"location":"components_derived/modal_change_password/#components_derived.modal_change_password.ChangePasswordModalWindow.check_content","title":"check_content()","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0438 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0441\u0442\u044c \u0432\u0441\u0435\u0445 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0444\u043e\u0440\u043c\u044b.

    Source code in components_derived\\modal_change_password.py
    def check_content(self):\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0438 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0441\u0442\u044c \u0432\u0441\u0435\u0445 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0444\u043e\u0440\u043c\u044b.\"\"\"\n\n    self.check_by_window_title()\n\n    self.get_content_item(\"old_password_input\").check_visibility(\n                              \"Old password input form is missing\"\n                         )\n    old_password_hidden_icon = self.get_content_item(\"old_password_hidden_icon\") \n    old_password_hidden_icon.check_visibility(\n                              \"Old password hidden icon is missing\"\n                         )\n    is_hidden_state = old_password_hidden_icon.is_password_hidden()\n    assert is_hidden_state, \"Old password hidden icon should be in hidden state\"\n\n    self.get_content_item(\"new_password_input\").check_visibility(\n                              \"New password input form is missing\"\n                         )\n    new_password_hidden_icon = self.get_content_item(\"new_password_hidden_icon\") \n    new_password_hidden_icon.check_visibility(\n                              \"New password hidden icon is missing\"\n                         )\n    is_hidden_state = new_password_hidden_icon.is_password_hidden()\n    assert is_hidden_state, \"New password hidden icon should be in hidden state\"\n\n    self.get_content_item(\"confirm_password_input\").check_visibility(\n                              \"Confirm password input form is missing\"\n                         )\n    confirm_password_hidden_icon = self.get_content_item(\"confirm_password_hidden_icon\") \n    confirm_password_hidden_icon.check_visibility(\n                              \"Confirm password hidden icon is missing\"\n                         )\n    is_hidden_state = confirm_password_hidden_icon.is_password_hidden()\n    assert is_hidden_state, \"Confirm password hidden icon should be in hidden state\"\n\n    self.check_button_visibility(\"cancel\")\n\n    button_save = self.get_button_by_name(\"save\")\n    is_disabled = button_save.is_disabled()\n    assert is_disabled, \"Button '\u0421\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c' should be hidden\"\n
    "},{"location":"components_derived/modal_change_password/#components_derived.modal_change_password.ChangePasswordModalWindow.check_error_message","title":"check_error_message(text)","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u043e\u0431 \u043e\u0448\u0438\u0431\u043a\u0435, \u0432\u043e\u0437\u043d\u0438\u043a\u0448\u0435\u0435 \u043f\u0440\u0438 \u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0438 \u043f\u043e\u043b\u0435\u0439 \u0444\u043e\u0440\u043c\u044b.

    Source code in components_derived\\modal_change_password.py
    def check_error_message(self, text: str) -> None:\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u043e\u0431 \u043e\u0448\u0438\u0431\u043a\u0435, \u0432\u043e\u0437\u043d\u0438\u043a\u0448\u0435\u0435 \u043f\u0440\u0438 \u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0438 \u043f\u043e\u043b\u0435\u0439 \u0444\u043e\u0440\u043c\u044b.\"\"\"\n\n    error_message = self.get_content_item(\"input_form_error_message\")\n    error_message.check_have_text(text, \"Unexpected error message\")\n
    "},{"location":"components_derived/modal_change_password/#components_derived.modal_change_password.ChangePasswordModalWindow.click_cancel_button","title":"click_cancel_button()","text":"

    \u041d\u0430\u0436\u0438\u043c\u0430\u0435\u0442 \u043a\u043d\u043e\u043f\u043a\u0443 '\u041e\u0442\u043c\u0435\u043d\u0438\u0442\u044c'

    Source code in components_derived\\modal_change_password.py
    def click_cancel_button(self) -> None:\n    \"\"\"\u041d\u0430\u0436\u0438\u043c\u0430\u0435\u0442 \u043a\u043d\u043e\u043f\u043a\u0443 '\u041e\u0442\u043c\u0435\u043d\u0438\u0442\u044c'\"\"\"\n\n    self.get_button_by_name(\"cancel\").click()\n
    "},{"location":"components_derived/modal_change_password/#components_derived.modal_change_password.ChangePasswordModalWindow.click_confirm_password_hidden_icon","title":"click_confirm_password_hidden_icon()","text":"

    \u041d\u0430\u0436\u0430\u0442\u0438\u0435 \u043d\u0430 \u0438\u043a\u043e\u043d\u043a\u0443 \u0441\u043a\u0440\u044b\u0442\u0438\u044f \u043f\u0430\u0440\u043e\u043b\u044f \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u044f.

    Source code in components_derived\\modal_change_password.py
    def click_confirm_password_hidden_icon(self) -> None:\n    \"\"\"\u041d\u0430\u0436\u0430\u0442\u0438\u0435 \u043d\u0430 \u0438\u043a\u043e\u043d\u043a\u0443 \u0441\u043a\u0440\u044b\u0442\u0438\u044f \u043f\u0430\u0440\u043e\u043b\u044f \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u044f.\"\"\"\n\n    self.get_content_item(\"confirm_password_hidden_icon\").click()\n
    "},{"location":"components_derived/modal_change_password/#components_derived.modal_change_password.ChangePasswordModalWindow.click_new_password_hidden_icon","title":"click_new_password_hidden_icon()","text":"

    \u041d\u0430\u0436\u0430\u0442\u0438\u0435 \u043d\u0430 \u0438\u043a\u043e\u043d\u043a\u0443 \u0441\u043a\u0440\u044b\u0442\u0438\u044f \u043d\u043e\u0432\u043e\u0433\u043e \u043f\u0430\u0440\u043e\u043b\u044f.

    Source code in components_derived\\modal_change_password.py
    def click_new_password_hidden_icon(self) -> None:\n    \"\"\"\u041d\u0430\u0436\u0430\u0442\u0438\u0435 \u043d\u0430 \u0438\u043a\u043e\u043d\u043a\u0443 \u0441\u043a\u0440\u044b\u0442\u0438\u044f \u043d\u043e\u0432\u043e\u0433\u043e \u043f\u0430\u0440\u043e\u043b\u044f.\"\"\"\n\n    self.get_content_item(\"new_password_hidden_icon\").click()\n
    "},{"location":"components_derived/modal_change_password/#components_derived.modal_change_password.ChangePasswordModalWindow.click_old_password_hidden_icon","title":"click_old_password_hidden_icon()","text":"

    \u041d\u0430\u0436\u0430\u0442\u0438\u0435 \u043d\u0430 \u0438\u043a\u043e\u043d\u043a\u0443 \u0441\u043a\u0440\u044b\u0442\u0438\u044f \u0441\u0442\u0430\u0440\u043e\u0433\u043e \u043f\u0430\u0440\u043e\u043b\u044f.

    Source code in components_derived\\modal_change_password.py
    def click_old_password_hidden_icon(self) -> None:\n    \"\"\"\u041d\u0430\u0436\u0430\u0442\u0438\u0435 \u043d\u0430 \u0438\u043a\u043e\u043d\u043a\u0443 \u0441\u043a\u0440\u044b\u0442\u0438\u044f \u0441\u0442\u0430\u0440\u043e\u0433\u043e \u043f\u0430\u0440\u043e\u043b\u044f.\"\"\"\n\n    self.get_content_item(\"old_password_hidden_icon\").click()\n
    "},{"location":"components_derived/modal_change_password/#components_derived.modal_change_password.ChangePasswordModalWindow.get_password_inputs","title":"get_password_inputs()","text":"

    \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0441\u043f\u0438\u0441\u043e\u043a \u043f\u043e\u043b\u0435\u0439 \u0432\u0432\u043e\u0434\u0430 \u043f\u0430\u0440\u043e\u043b\u044f (\u0434\u043b\u044f \u0442\u0435\u0441\u0442\u043e\u0432\u044b\u0445 \u0446\u0435\u043b\u0435\u0439).

    Source code in components_derived\\modal_change_password.py
    def get_password_inputs(self) -> []:\n    \"\"\"\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0441\u043f\u0438\u0441\u043e\u043a \u043f\u043e\u043b\u0435\u0439 \u0432\u0432\u043e\u0434\u0430 \u043f\u0430\u0440\u043e\u043b\u044f (\u0434\u043b\u044f \u0442\u0435\u0441\u0442\u043e\u0432\u044b\u0445 \u0446\u0435\u043b\u0435\u0439).\"\"\"\n\n    text_inputs = []\n    text_inputs.append(self.get_content_item(\"old_password_input\"))\n    text_inputs.append(self.get_content_item(\"new_password_input\"))\n    text_inputs.append(self.get_content_item(\"confirm_password_input\"))\n    return text_inputs\n
    "},{"location":"components_derived/modal_edit_user/","title":"EditUserModalWindow","text":"

    \u041c\u043e\u0434\u0443\u043b\u044c modal_edit_user \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043a\u043b\u0430\u0441\u0441 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u043e\u043a\u043d\u043e\u043c \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.

    \u041a\u043b\u0430\u0441\u0441 EditUserModalWindow \u043d\u0430\u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u0431\u0430\u0437\u043e\u0432\u044b\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b ModalWindowComponent \u0438 \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u0442 \u043c\u0435\u0442\u043e\u0434\u044b \u0434\u043b\u044f \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.

    "},{"location":"components_derived/modal_edit_user/#components_derived.modal_edit_user.EditUserModalWindow","title":"EditUserModalWindow","text":"

    Bases: ModalWindowComponent

    \u041c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043a\u043d\u043e \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.

    \u041d\u0430\u0441\u043b\u0435\u0434\u0443\u0435\u0442 ModalWindowComponent \u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442: - \u041f\u043e\u043b\u044f \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445 - \u0427\u0435\u043a\u0431\u043e\u043a\u0441\u044b \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043a - \u0412\u044b\u043f\u0430\u0434\u0430\u044e\u0449\u0438\u0439 \u0441\u043f\u0438\u0441\u043e\u043a \u0440\u043e\u043b\u0435\u0439 - \u041a\u043d\u043e\u043f\u043a\u0438 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439 (\u0421\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c, \u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0438 \u0434\u0440.)

    Source code in components_derived\\modal_edit_user.py
    class EditUserModalWindow(ModalWindowComponent):\n    \"\"\"\u041c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043a\u043d\u043e \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\n\n    \u041d\u0430\u0441\u043b\u0435\u0434\u0443\u0435\u0442 ModalWindowComponent \u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442:\n    - \u041f\u043e\u043b\u044f \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445\n    - \u0427\u0435\u043a\u0431\u043e\u043a\u0441\u044b \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043a\n    - \u0412\u044b\u043f\u0430\u0434\u0430\u044e\u0449\u0438\u0439 \u0441\u043f\u0438\u0441\u043e\u043a \u0440\u043e\u043b\u0435\u0439\n    - \u041a\u043d\u043e\u043f\u043a\u0438 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439 (\u0421\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c, \u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0438 \u0434\u0440.)\n    \"\"\"\n\n    def __init__(self, page: Page, user_name: str):\n        \"\"\"\u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0444\u043e\u0440\u043c\u044b \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\"\"\"\n\n        super().__init__(page)\n\n        # \u041b\u043e\u043a\u0430\u0442\u043e\u0440\u044b \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0444\u043e\u0440\u043c\u044b\n        text_field_locator = ModalWindowLocators.TEXT_FIELD_INPUT_FORM_USER_DATA\n        input_form_locator = ModalWindowLocators.INPUT_FORM_USER_DATA\n        label_locator = ModalWindowLocators.LABEL_INPUT_FORM_USER_DATA\n\n        # \u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430 \u0438 \u043a\u043d\u043e\u043f\u043a\u0438 \u0437\u0430\u043a\u0440\u044b\u0442\u0438\u044f\n        self.window_title = user_name\n        locator_button_toolbar_close = self.page.get_by_role(\"navigation\").filter(\n            has_text=re.compile(self.window_title)\n        ).get_by_role(\"button\")\n\n        self.add_toolbar_title(self.window_title)\n        self.add_toolbar_button(locator_button_toolbar_close, \"close\")\n\n        # \u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043f\u043e\u043b\u0435\u0439 \u0444\u043e\u0440\u043c\u044b\n        loc = self.page.locator(input_form_locator).locator(\"xpath=div[1]\").locator(text_field_locator)\n        name_input = TextInput(page, loc, \"name_input\")\n        self.add_content_item(\"name_input\", name_input)\n\n        role_loc = self.page.locator(input_form_locator).get_by_role(\"combobox\").nth(0)\n        role_input = TextInput(page, role_loc, \"role_input\")\n        self.add_content_item(\"role_input\", role_input)\n        self.add_content_item(\n            \"roles_list\",\n            DropdownList(page)\n        )\n\n        loc = self.page.locator(input_form_locator).locator(\"xpath=div[3]\").locator(text_field_locator)\n        commentary_input = TextInput(page, loc, \"commentary_input\")\n        self.add_content_item(\"commentary_input\", commentary_input)\n\n        loc = self.page.locator(input_form_locator).locator(\"xpath=div[4]\").locator(text_field_locator)\n        email_input = TextInput(page, loc, \"email_input\")\n        self.add_content_item(\"email_input\", email_input)\n\n        loc = self.page.locator(input_form_locator).locator(\"xpath=div[5]\").locator(text_field_locator)\n        phone_input = TextInput(page, loc, \"phone_input\")\n        self.add_content_item(\"phone_input\", phone_input)\n\n        # \u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0447\u0435\u043a\u0431\u043e\u043a\u0441\u043e\u0432 \u0438 \u0438\u0445 \u043c\u0435\u0442\u043e\u043a\n        checkbox_2 = Checkbox(\n            page,\n            page.get_by_role(\"checkbox\").nth(0),\n            \"push_notification\"\n        )\n        self.add_content_item(\"push_notification_checkbox\", checkbox_2)\n\n        label_2 = Text(\n            page,\n            self.page.locator(label_locator).nth(0),\n            \"push_notification_checkbox_label\"\n        )\n        self.add_content_item(\"push_notification_checkbox_label\", label_2)\n\n        # \u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043a\u043d\u043e\u043f\u043e\u043a \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439\n        locator_button_save = self.page.get_by_role(\"button\", name=\"\u0421\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c\")\n        self.add_button(locator_button_save, \"save\")\n\n        locator_button_delete = self.page.get_by_role(\"button\", name=\"\u0423\u0434\u0430\u043b\u0438\u0442\u044c\")\n        self.add_button(locator_button_delete, \"delete\")\n\n        locator_button_reset = self.page.get_by_role(\"button\", name=\"\u0421\u0431\u0440\u043e\u0441\u0438\u0442\u044c \u043f\u0430\u0440\u043e\u043b\u044c\")\n        self.add_button(locator_button_reset, \"reset_password\")\n\n        locator_button_close = self.page.get_by_role(\"button\", name=\"\u0417\u0430\u043a\u0440\u044b\u0442\u044c\")\n        self.add_button(locator_button_close, \"close\")\n\n        # \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043e\u0432 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u044f\n        self.save_user_confirm = ConfirmComponent(page, \" \u041e\u0442\u043c\u0435\u043d\u0430 \", \" \u0421\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \")\n        self.delete_user_confirm = ConfirmComponent(page, \" \u041e\u0442\u043c\u0435\u043d\u0430 \", \" \u0423\u0434\u0430\u043b\u0438\u0442\u044c \")\n\n    def close_window(self):\n        \"\"\"\u0417\u0430\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u043e\u043a\u043d\u043e \u0447\u0435\u0440\u0435\u0437 \u043a\u043d\u043e\u043f\u043a\u0443 '\u0417\u0430\u043a\u0440\u044b\u0442\u044c'.\"\"\"\n\n        close_button = self.get_button_by_name(\"close\")\n        close_button.click()\n\n    def close_window_by_toolbar_button(self):\n        \"\"\"\u0417\u0430\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u043e\u043a\u043d\u043e \u0447\u0435\u0440\u0435\u0437 \u043a\u043d\u043e\u043f\u043a\u0443 \u0432 \u0442\u0443\u043b\u0431\u0430\u0440\u0435.\"\"\"\n\n        self.click_toolbar_close_button()\n\n    def delete_user(self):\n        \"\"\"\u0423\u0434\u0430\u043b\u044f\u0435\u0442 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0441 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u0435\u043c.\"\"\"\n\n        delete_button = self.get_button_by_name(\"delete\")\n        delete_button.click()\n\n        title = \"\u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435\"\n        self.delete_user_confirm.check_title(\n            title,\n            f\"Confirmation dialog window with title '{title}' is missing\"\n        )\n        self.delete_user_confirm.click_allow_button()\n\n    def edit_user(self, user_data):\n        \"\"\"\u0420\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u0443\u0435\u0442 \u0434\u0430\u043d\u043d\u044b\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\n\n        Args:\n            user_data (dict): \u0414\u0430\u043d\u043d\u044b\u0435 \u0434\u043b\u044f \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f (\u0438\u043c\u044f, \u0440\u043e\u043b\u044c \u0438 \u0434\u0440.)\n        \"\"\"\n\n        fields = user_data.keys()\n\n        if \"name\" in fields:\n            input_field = self.get_content_item(\"name_input\")\n            input_field.input_value(user_data[\"name\"])\n\n        if \"role\" in fields:\n            role_field = self.get_content_item(\"role_input\")\n            role_field.click()\n\n            roles_list = self.get_content_item(\"roles_list\")\n            roles_list.check_item_with_text(user_data[\"role\"])\n            roles_list.click_item_with_text(user_data[\"role\"])\n\n        if \"commentary\" in fields:\n            input_field = self.get_content_item(\"commentary_input\")\n            input_field.input_value(user_data[\"commentary\"])\n\n        if \"email\" in fields:\n            input_field = self.get_content_item(\"email_input\")\n            input_field.input_value(user_data[\"email\"])\n\n        if \"phone_number\" in fields:\n            input_field = self.get_content_item(\"phone_input\")\n            input_field.input_value(user_data[\"phone_number\"])\n\n        if \"push_notification_checked\" in fields:\n            checkbox = self.get_content_item(\"push_notification_checkbox\")\n            if user_data[\"push_notification_checked\"]:\n                checkbox.check()\n            else:\n                checkbox.uncheck()\n\n        save_button = self.get_button_by_name(\"save\")\n        save_button.click()\n\n        title = \"\u0421\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435\"\n        self.save_user_confirm.check_title(\n            title,\n            f\"Confirmation dialog window with title '{title}' is missing\"\n        )\n        self.save_user_confirm.click_allow_button()\n\n    def reset_password(self):\n        \"\"\"\u0418\u043d\u0438\u0446\u0438\u0438\u0440\u0443\u0435\u0442 \u0441\u0431\u0440\u043e\u0441 \u043f\u0430\u0440\u043e\u043b\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\"\"\"\n\n        reset_password_button = self.get_button_by_name(\"reset_password\")\n        reset_password_button.click()\n\n    def check_content(self, user_name, role):\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0438 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0441\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u043e\u043a\u043d\u0430.\n\n        Args:\n            user_name (str): \u041e\u0436\u0438\u0434\u0430\u0435\u043c\u043e\u0435 \u0438\u043c\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\n            role (str): \u041e\u0436\u0438\u0434\u0430\u0435\u043c\u0430\u044f \u0440\u043e\u043b\u044c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\n        \"\"\"\n\n        menu_locator = self.page.locator(ModalWindowLocators.MENU_INPUT_FORM_USER_DATA)\n\n        self.check_by_window_title()\n        self.check_toolbar_button_visibility(\"close\")\n        self.check_toolbar_button_tooltip(\"close\", \"\u0417\u0430\u043a\u0440\u044b\u0442\u044c\")\n\n        for name in self.content_items.keys():\n            item = self.get_content_item(name)\n\n            if name == \"push_notification_checkbox_label\":\n                item.check_have_text(\n                    \"\u041f\u043e\u0434\u043f\u0438\u0441\u043a\u0430 \u043d\u0430 Push-\u0443\u0432\u0435\u0434\u043e\u043c\u043b\u0435\u043d\u0438\u044f\",\n                    \"Label '\u041f\u043e\u0434\u043f\u0438\u0441\u043a\u0430 \u043d\u0430 Push-\u0443\u0432\u0435\u0434\u043e\u043c\u043b\u0435\u043d\u0438\u044f' is missing\"\n                )\n            elif name == \"name_input\":\n                name = self.get_content_item(\"name_input\")\n                text_value = name.get_input_value()\n                assert text_value == user_name, (\n                    f\"Expected user name '{user_name}' is not equal real user name '{text_value}'\"\n                )\n            elif name == \"role_input\":\n                item.click()\n                roles_list = self.get_content_item(\"roles_list\")\n                roles_list.check_visibility(menu_locator,\n                                          \"Roles list is missing\")\n                roles_list.check_item_with_text(role)\n            elif name == \"roles_list\":\n                continue\n            else:\n                item.check_visibility(\n                    f\"Modal window content item with name '{name}' is missing\"\n                )\n\n        self.check_button_visibility(\"save\")\n        self.check_button_visibility(\"delete\")\n        self.check_button_visibility(\"reset_password\")\n        self.check_button_visibility(\"close\")\n
    "},{"location":"components_derived/modal_edit_user/#components_derived.modal_edit_user.EditUserModalWindow.__init__","title":"__init__(page, user_name)","text":"

    \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0444\u043e\u0440\u043c\u044b \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.

    Source code in components_derived\\modal_edit_user.py
    def __init__(self, page: Page, user_name: str):\n    \"\"\"\u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0444\u043e\u0440\u043c\u044b \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\"\"\"\n\n    super().__init__(page)\n\n    # \u041b\u043e\u043a\u0430\u0442\u043e\u0440\u044b \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0444\u043e\u0440\u043c\u044b\n    text_field_locator = ModalWindowLocators.TEXT_FIELD_INPUT_FORM_USER_DATA\n    input_form_locator = ModalWindowLocators.INPUT_FORM_USER_DATA\n    label_locator = ModalWindowLocators.LABEL_INPUT_FORM_USER_DATA\n\n    # \u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430 \u0438 \u043a\u043d\u043e\u043f\u043a\u0438 \u0437\u0430\u043a\u0440\u044b\u0442\u0438\u044f\n    self.window_title = user_name\n    locator_button_toolbar_close = self.page.get_by_role(\"navigation\").filter(\n        has_text=re.compile(self.window_title)\n    ).get_by_role(\"button\")\n\n    self.add_toolbar_title(self.window_title)\n    self.add_toolbar_button(locator_button_toolbar_close, \"close\")\n\n    # \u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043f\u043e\u043b\u0435\u0439 \u0444\u043e\u0440\u043c\u044b\n    loc = self.page.locator(input_form_locator).locator(\"xpath=div[1]\").locator(text_field_locator)\n    name_input = TextInput(page, loc, \"name_input\")\n    self.add_content_item(\"name_input\", name_input)\n\n    role_loc = self.page.locator(input_form_locator).get_by_role(\"combobox\").nth(0)\n    role_input = TextInput(page, role_loc, \"role_input\")\n    self.add_content_item(\"role_input\", role_input)\n    self.add_content_item(\n        \"roles_list\",\n        DropdownList(page)\n    )\n\n    loc = self.page.locator(input_form_locator).locator(\"xpath=div[3]\").locator(text_field_locator)\n    commentary_input = TextInput(page, loc, \"commentary_input\")\n    self.add_content_item(\"commentary_input\", commentary_input)\n\n    loc = self.page.locator(input_form_locator).locator(\"xpath=div[4]\").locator(text_field_locator)\n    email_input = TextInput(page, loc, \"email_input\")\n    self.add_content_item(\"email_input\", email_input)\n\n    loc = self.page.locator(input_form_locator).locator(\"xpath=div[5]\").locator(text_field_locator)\n    phone_input = TextInput(page, loc, \"phone_input\")\n    self.add_content_item(\"phone_input\", phone_input)\n\n    # \u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0447\u0435\u043a\u0431\u043e\u043a\u0441\u043e\u0432 \u0438 \u0438\u0445 \u043c\u0435\u0442\u043e\u043a\n    checkbox_2 = Checkbox(\n        page,\n        page.get_by_role(\"checkbox\").nth(0),\n        \"push_notification\"\n    )\n    self.add_content_item(\"push_notification_checkbox\", checkbox_2)\n\n    label_2 = Text(\n        page,\n        self.page.locator(label_locator).nth(0),\n        \"push_notification_checkbox_label\"\n    )\n    self.add_content_item(\"push_notification_checkbox_label\", label_2)\n\n    # \u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043a\u043d\u043e\u043f\u043e\u043a \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439\n    locator_button_save = self.page.get_by_role(\"button\", name=\"\u0421\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c\")\n    self.add_button(locator_button_save, \"save\")\n\n    locator_button_delete = self.page.get_by_role(\"button\", name=\"\u0423\u0434\u0430\u043b\u0438\u0442\u044c\")\n    self.add_button(locator_button_delete, \"delete\")\n\n    locator_button_reset = self.page.get_by_role(\"button\", name=\"\u0421\u0431\u0440\u043e\u0441\u0438\u0442\u044c \u043f\u0430\u0440\u043e\u043b\u044c\")\n    self.add_button(locator_button_reset, \"reset_password\")\n\n    locator_button_close = self.page.get_by_role(\"button\", name=\"\u0417\u0430\u043a\u0440\u044b\u0442\u044c\")\n    self.add_button(locator_button_close, \"close\")\n\n    # \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043e\u0432 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u044f\n    self.save_user_confirm = ConfirmComponent(page, \" \u041e\u0442\u043c\u0435\u043d\u0430 \", \" \u0421\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \")\n    self.delete_user_confirm = ConfirmComponent(page, \" \u041e\u0442\u043c\u0435\u043d\u0430 \", \" \u0423\u0434\u0430\u043b\u0438\u0442\u044c \")\n
    "},{"location":"components_derived/modal_edit_user/#components_derived.modal_edit_user.EditUserModalWindow.check_content","title":"check_content(user_name, role)","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0438 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0441\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u043e\u043a\u043d\u0430.

    Parameters:

    Name Type Description Default user_name str

    \u041e\u0436\u0438\u0434\u0430\u0435\u043c\u043e\u0435 \u0438\u043c\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f

    required role str

    \u041e\u0436\u0438\u0434\u0430\u0435\u043c\u0430\u044f \u0440\u043e\u043b\u044c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f

    required Source code in components_derived\\modal_edit_user.py
    def check_content(self, user_name, role):\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0438 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0441\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u043e\u043a\u043d\u0430.\n\n    Args:\n        user_name (str): \u041e\u0436\u0438\u0434\u0430\u0435\u043c\u043e\u0435 \u0438\u043c\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\n        role (str): \u041e\u0436\u0438\u0434\u0430\u0435\u043c\u0430\u044f \u0440\u043e\u043b\u044c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\n    \"\"\"\n\n    menu_locator = self.page.locator(ModalWindowLocators.MENU_INPUT_FORM_USER_DATA)\n\n    self.check_by_window_title()\n    self.check_toolbar_button_visibility(\"close\")\n    self.check_toolbar_button_tooltip(\"close\", \"\u0417\u0430\u043a\u0440\u044b\u0442\u044c\")\n\n    for name in self.content_items.keys():\n        item = self.get_content_item(name)\n\n        if name == \"push_notification_checkbox_label\":\n            item.check_have_text(\n                \"\u041f\u043e\u0434\u043f\u0438\u0441\u043a\u0430 \u043d\u0430 Push-\u0443\u0432\u0435\u0434\u043e\u043c\u043b\u0435\u043d\u0438\u044f\",\n                \"Label '\u041f\u043e\u0434\u043f\u0438\u0441\u043a\u0430 \u043d\u0430 Push-\u0443\u0432\u0435\u0434\u043e\u043c\u043b\u0435\u043d\u0438\u044f' is missing\"\n            )\n        elif name == \"name_input\":\n            name = self.get_content_item(\"name_input\")\n            text_value = name.get_input_value()\n            assert text_value == user_name, (\n                f\"Expected user name '{user_name}' is not equal real user name '{text_value}'\"\n            )\n        elif name == \"role_input\":\n            item.click()\n            roles_list = self.get_content_item(\"roles_list\")\n            roles_list.check_visibility(menu_locator,\n                                      \"Roles list is missing\")\n            roles_list.check_item_with_text(role)\n        elif name == \"roles_list\":\n            continue\n        else:\n            item.check_visibility(\n                f\"Modal window content item with name '{name}' is missing\"\n            )\n\n    self.check_button_visibility(\"save\")\n    self.check_button_visibility(\"delete\")\n    self.check_button_visibility(\"reset_password\")\n    self.check_button_visibility(\"close\")\n
    "},{"location":"components_derived/modal_edit_user/#components_derived.modal_edit_user.EditUserModalWindow.close_window","title":"close_window()","text":"

    \u0417\u0430\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u043e\u043a\u043d\u043e \u0447\u0435\u0440\u0435\u0437 \u043a\u043d\u043e\u043f\u043a\u0443 '\u0417\u0430\u043a\u0440\u044b\u0442\u044c'.

    Source code in components_derived\\modal_edit_user.py
    def close_window(self):\n    \"\"\"\u0417\u0430\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u043e\u043a\u043d\u043e \u0447\u0435\u0440\u0435\u0437 \u043a\u043d\u043e\u043f\u043a\u0443 '\u0417\u0430\u043a\u0440\u044b\u0442\u044c'.\"\"\"\n\n    close_button = self.get_button_by_name(\"close\")\n    close_button.click()\n
    "},{"location":"components_derived/modal_edit_user/#components_derived.modal_edit_user.EditUserModalWindow.close_window_by_toolbar_button","title":"close_window_by_toolbar_button()","text":"

    \u0417\u0430\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u043e\u043a\u043d\u043e \u0447\u0435\u0440\u0435\u0437 \u043a\u043d\u043e\u043f\u043a\u0443 \u0432 \u0442\u0443\u043b\u0431\u0430\u0440\u0435.

    Source code in components_derived\\modal_edit_user.py
    def close_window_by_toolbar_button(self):\n    \"\"\"\u0417\u0430\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u043e\u043a\u043d\u043e \u0447\u0435\u0440\u0435\u0437 \u043a\u043d\u043e\u043f\u043a\u0443 \u0432 \u0442\u0443\u043b\u0431\u0430\u0440\u0435.\"\"\"\n\n    self.click_toolbar_close_button()\n
    "},{"location":"components_derived/modal_edit_user/#components_derived.modal_edit_user.EditUserModalWindow.delete_user","title":"delete_user()","text":"

    \u0423\u0434\u0430\u043b\u044f\u0435\u0442 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0441 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u0435\u043c.

    Source code in components_derived\\modal_edit_user.py
    def delete_user(self):\n    \"\"\"\u0423\u0434\u0430\u043b\u044f\u0435\u0442 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0441 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u0435\u043c.\"\"\"\n\n    delete_button = self.get_button_by_name(\"delete\")\n    delete_button.click()\n\n    title = \"\u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435\"\n    self.delete_user_confirm.check_title(\n        title,\n        f\"Confirmation dialog window with title '{title}' is missing\"\n    )\n    self.delete_user_confirm.click_allow_button()\n
    "},{"location":"components_derived/modal_edit_user/#components_derived.modal_edit_user.EditUserModalWindow.edit_user","title":"edit_user(user_data)","text":"

    \u0420\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u0443\u0435\u0442 \u0434\u0430\u043d\u043d\u044b\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.

    Parameters:

    Name Type Description Default user_data dict

    \u0414\u0430\u043d\u043d\u044b\u0435 \u0434\u043b\u044f \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f (\u0438\u043c\u044f, \u0440\u043e\u043b\u044c \u0438 \u0434\u0440.)

    required Source code in components_derived\\modal_edit_user.py
    def edit_user(self, user_data):\n    \"\"\"\u0420\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u0443\u0435\u0442 \u0434\u0430\u043d\u043d\u044b\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\n\n    Args:\n        user_data (dict): \u0414\u0430\u043d\u043d\u044b\u0435 \u0434\u043b\u044f \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f (\u0438\u043c\u044f, \u0440\u043e\u043b\u044c \u0438 \u0434\u0440.)\n    \"\"\"\n\n    fields = user_data.keys()\n\n    if \"name\" in fields:\n        input_field = self.get_content_item(\"name_input\")\n        input_field.input_value(user_data[\"name\"])\n\n    if \"role\" in fields:\n        role_field = self.get_content_item(\"role_input\")\n        role_field.click()\n\n        roles_list = self.get_content_item(\"roles_list\")\n        roles_list.check_item_with_text(user_data[\"role\"])\n        roles_list.click_item_with_text(user_data[\"role\"])\n\n    if \"commentary\" in fields:\n        input_field = self.get_content_item(\"commentary_input\")\n        input_field.input_value(user_data[\"commentary\"])\n\n    if \"email\" in fields:\n        input_field = self.get_content_item(\"email_input\")\n        input_field.input_value(user_data[\"email\"])\n\n    if \"phone_number\" in fields:\n        input_field = self.get_content_item(\"phone_input\")\n        input_field.input_value(user_data[\"phone_number\"])\n\n    if \"push_notification_checked\" in fields:\n        checkbox = self.get_content_item(\"push_notification_checkbox\")\n        if user_data[\"push_notification_checked\"]:\n            checkbox.check()\n        else:\n            checkbox.uncheck()\n\n    save_button = self.get_button_by_name(\"save\")\n    save_button.click()\n\n    title = \"\u0421\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435\"\n    self.save_user_confirm.check_title(\n        title,\n        f\"Confirmation dialog window with title '{title}' is missing\"\n    )\n    self.save_user_confirm.click_allow_button()\n
    "},{"location":"components_derived/modal_edit_user/#components_derived.modal_edit_user.EditUserModalWindow.reset_password","title":"reset_password()","text":"

    \u0418\u043d\u0438\u0446\u0438\u0438\u0440\u0443\u0435\u0442 \u0441\u0431\u0440\u043e\u0441 \u043f\u0430\u0440\u043e\u043b\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.

    Source code in components_derived\\modal_edit_user.py
    def reset_password(self):\n    \"\"\"\u0418\u043d\u0438\u0446\u0438\u0438\u0440\u0443\u0435\u0442 \u0441\u0431\u0440\u043e\u0441 \u043f\u0430\u0440\u043e\u043b\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\"\"\"\n\n    reset_password_button = self.get_button_by_name(\"reset_password\")\n    reset_password_button.click()\n
    "},{"location":"components_derived/modal_view_template/","title":"ViewTemplateModalWindow","text":"

    \u041c\u043e\u0434\u0443\u043b\u044c modal_view_template \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043a\u043b\u0430\u0441\u0441 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u044b\u043c \u043e\u043a\u043d\u043e\u043c \u0448\u0430\u0431\u043b\u043e\u043d\u0430.

    \u041a\u043b\u0430\u0441\u0441 ViewTemplateModalWindow \u043d\u0430\u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u0431\u0430\u0437\u043e\u0432\u044b\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b ModalWindowComponent \u0438 \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u0442 \u043c\u0435\u0442\u043e\u0434\u044b \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0430 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430 \u0448\u0430\u0431\u043b\u043e\u043d\u0430.

    "},{"location":"components_derived/modal_view_template/#components_derived.modal_view_template.ViewTemplateModalWindow","title":"ViewTemplateModalWindow","text":"

    Bases: ModalWindowComponent

    \u041c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043a\u043d\u043e \u0448\u0430\u0431\u043b\u043e\u043d\u0430.

    \u041d\u0430\u0441\u043b\u0435\u0434\u0443\u0435\u0442 ModalWindowComponent \u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b \u0434\u043b\u044f: 1. \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430 \u0441 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u043c \u0448\u0430\u0431\u043b\u043e\u043d\u043e\u043c 2. \u0417\u0430\u043a\u0440\u044b\u0442\u0438\u044f \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430 3. \u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u0448\u0430\u0431\u043b\u043e\u043d\u0430 4. \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0433\u043e \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430

    Source code in components_derived\\modal_view_template.py
    class ViewTemplateModalWindow(ModalWindowComponent):\n    \"\"\"\u041c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043a\u043d\u043e \u0448\u0430\u0431\u043b\u043e\u043d\u0430.\n\n    \u041d\u0430\u0441\u043b\u0435\u0434\u0443\u0435\u0442 ModalWindowComponent \u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b \u0434\u043b\u044f:\n    1. \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430 \u0441 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u043c \u0448\u0430\u0431\u043b\u043e\u043d\u043e\u043c\n    2. \u0417\u0430\u043a\u0440\u044b\u0442\u0438\u044f \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430\n    3. \u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u0448\u0430\u0431\u043b\u043e\u043d\u0430\n    4. \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0433\u043e \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430\n    \"\"\"\n\n    def __init__(self, page: Page, template_name: str):\n        \"\"\"\u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0444\u043e\u0440\u043c\u044b \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430 \u0448\u0430\u0431\u043b\u043e\u043d\u0430.\"\"\"\n\n        super().__init__(page)\n\n        # \u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430 \u0438 \u043a\u043d\u043e\u043f\u043a\u0438 \u0437\u0430\u043a\u0440\u044b\u0442\u0438\u044f\n        self.window_title = template_name\n        locator_button_toolbar_close = self.page.get_by_role(\"navigation\").filter(\n            has_text=re.compile(self.window_title)\n        ).get_by_role(\"button\")\n\n        self.add_toolbar_title(self.window_title)\n        self.add_toolbar_button(locator_button_toolbar_close, \"close\")\n\n    def close_window(self) -> None:\n        \"\"\"\u0417\u0430\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u043e\u043a\u043d\u043e \u0447\u0435\u0440\u0435\u0437 \u043a\u043d\u043e\u043f\u043a\u0443 '\u0417\u0430\u043a\u0440\u044b\u0442\u044c'.\"\"\"\n\n        close_button = self.get_button_by_name(\"close\")\n        close_button.click()\n\n    def check_content(self) -> None:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0438 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0441\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u043e\u043a\u043d\u0430.\n\n        \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442:\n        1. \u041d\u0430\u043b\u0438\u0447\u0438\u0435 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430 \u043e\u043a\u043d\u0430 \u0441 \u0438\u043c\u0435\u043d\u0435\u043c \u0448\u0430\u0431\u043b\u043e\u043d\u0430\n        2. \u0412\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u043a\u043d\u043e\u043f\u043a\u0438 \u0437\u0430\u043a\u0440\u044b\u0442\u0438\u044f\n        3. \u041f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0443 \u043a\u043d\u043e\u043f\u043a\u0438 \u0437\u0430\u043a\u0440\u044b\u0442\u0438\u044f\n        \"\"\"\n\n        self.check_by_window_title()\n        self.check_toolbar_button_visibility(\"close\")\n        self.check_toolbar_button_tooltip(\"close\", \"\u0417\u0430\u043a\u0440\u044b\u0442\u044c\")\n\n    # \u0420\u0430\u0437\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442\u0441\u044f =========================================================\n    def _get_config_data(self) -> dict:\n        \"\"\"\u041f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0438\u0437 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430.\n\n        Returns:\n            dict: \u0421\u043b\u043e\u0432\u0430\u0440\u044c \u0441 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u0438\u043b\u0438 \u043f\u0443\u0441\u0442\u043e\u0439 \u0441\u043b\u043e\u0432\u0430\u0440\u044c\n        \"\"\"\n        config_data = {}\n\n        # \u0418\u0449\u0435\u043c \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440 \u0441 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u043c\u0438\n        config_container = self.page.locator(\n            \"//*[@id='app']/div[2]/div/div/div/div/div/div/div/div/div[2]/div/div/div\"\n        )\n\n        return config_data\n
    "},{"location":"components_derived/modal_view_template/#components_derived.modal_view_template.ViewTemplateModalWindow.__init__","title":"__init__(page, template_name)","text":"

    \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0444\u043e\u0440\u043c\u044b \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430 \u0448\u0430\u0431\u043b\u043e\u043d\u0430.

    Source code in components_derived\\modal_view_template.py
    def __init__(self, page: Page, template_name: str):\n    \"\"\"\u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0444\u043e\u0440\u043c\u044b \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430 \u0448\u0430\u0431\u043b\u043e\u043d\u0430.\"\"\"\n\n    super().__init__(page)\n\n    # \u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430 \u0438 \u043a\u043d\u043e\u043f\u043a\u0438 \u0437\u0430\u043a\u0440\u044b\u0442\u0438\u044f\n    self.window_title = template_name\n    locator_button_toolbar_close = self.page.get_by_role(\"navigation\").filter(\n        has_text=re.compile(self.window_title)\n    ).get_by_role(\"button\")\n\n    self.add_toolbar_title(self.window_title)\n    self.add_toolbar_button(locator_button_toolbar_close, \"close\")\n
    "},{"location":"components_derived/modal_view_template/#components_derived.modal_view_template.ViewTemplateModalWindow.check_content","title":"check_content()","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0438 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0441\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u043e\u043a\u043d\u0430.

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442: 1. \u041d\u0430\u043b\u0438\u0447\u0438\u0435 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430 \u043e\u043a\u043d\u0430 \u0441 \u0438\u043c\u0435\u043d\u0435\u043c \u0448\u0430\u0431\u043b\u043e\u043d\u0430 2. \u0412\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u043a\u043d\u043e\u043f\u043a\u0438 \u0437\u0430\u043a\u0440\u044b\u0442\u0438\u044f 3. \u041f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0443 \u043a\u043d\u043e\u043f\u043a\u0438 \u0437\u0430\u043a\u0440\u044b\u0442\u0438\u044f

    Source code in components_derived\\modal_view_template.py
    def check_content(self) -> None:\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0438 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0441\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u043e\u043a\u043d\u0430.\n\n    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442:\n    1. \u041d\u0430\u043b\u0438\u0447\u0438\u0435 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430 \u043e\u043a\u043d\u0430 \u0441 \u0438\u043c\u0435\u043d\u0435\u043c \u0448\u0430\u0431\u043b\u043e\u043d\u0430\n    2. \u0412\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u043a\u043d\u043e\u043f\u043a\u0438 \u0437\u0430\u043a\u0440\u044b\u0442\u0438\u044f\n    3. \u041f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0443 \u043a\u043d\u043e\u043f\u043a\u0438 \u0437\u0430\u043a\u0440\u044b\u0442\u0438\u044f\n    \"\"\"\n\n    self.check_by_window_title()\n    self.check_toolbar_button_visibility(\"close\")\n    self.check_toolbar_button_tooltip(\"close\", \"\u0417\u0430\u043a\u0440\u044b\u0442\u044c\")\n
    "},{"location":"components_derived/modal_view_template/#components_derived.modal_view_template.ViewTemplateModalWindow.close_window","title":"close_window()","text":"

    \u0417\u0430\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u043e\u043a\u043d\u043e \u0447\u0435\u0440\u0435\u0437 \u043a\u043d\u043e\u043f\u043a\u0443 '\u0417\u0430\u043a\u0440\u044b\u0442\u044c'.

    Source code in components_derived\\modal_view_template.py
    def close_window(self) -> None:\n    \"\"\"\u0417\u0430\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u043e\u043a\u043d\u043e \u0447\u0435\u0440\u0435\u0437 \u043a\u043d\u043e\u043f\u043a\u0443 '\u0417\u0430\u043a\u0440\u044b\u0442\u044c'.\"\"\"\n\n    close_button = self.get_button_by_name(\"close\")\n    close_button.click()\n
    "},{"location":"components_derived/user_card/","title":"UserCard","text":"

    \u041c\u043e\u0434\u0443\u043b\u044c \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430 \u043a\u0430\u0440\u0442\u043e\u0447\u043a\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.

    \u0421\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043a\u043b\u0430\u0441\u0441 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u043a\u0430\u0440\u0442\u043e\u0447\u043a\u043e\u0439 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0447\u0435\u0440\u0435\u0437 Playwright.

    "},{"location":"components_derived/user_card/#components_derived.user_card.UserCard","title":"UserCard","text":"

    Bases: BaseComponent

    \u041a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 \u043a\u0430\u0440\u0442\u043e\u0447\u043a\u0430.

    \u041f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u043c\u0435\u0442\u043e\u0434\u044b \u0434\u043b\u044f \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0441 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u043c\u0438 \u043a\u0430\u0440\u0442\u043e\u0447\u043a\u0438.

    Source code in components_derived\\user_card.py
    class UserCard(BaseComponent):\n    \"\"\"\u041a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 \u043a\u0430\u0440\u0442\u043e\u0447\u043a\u0430.\n\n    \u041f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u043c\u0435\u0442\u043e\u0434\u044b \u0434\u043b\u044f \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0441 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u043c\u0438 \u043a\u0430\u0440\u0442\u043e\u0447\u043a\u0438.\n    \"\"\"\n\n    def __init__(self, page: Page):\n        \"\"\"\u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 \u043a\u0430\u0440\u0442\u043e\u0447\u043a\u0438.\n\n        Args:\n            page: \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.\n        \"\"\"\n\n        super().__init__(page)\n\n        card_locator = page.locator(UserCardLocators.CARD_USER)\n\n        self.current_user_name = Text(page,\n                                      card_locator.locator(\"xpath=/div/div[2]\"),\n                                      \"current user name\")\n        self.current_user_role = Text(page,\n                                      card_locator.locator(\"xpath=/div/div[3]\"),\n                                      \"current user role\")\n        self.login_time = Text(page,\n                               card_locator.locator(\"xpath=/div/div[4]\"),\n                               \"login time\")\n        self.session_time = Text(page,\n                                 card_locator.locator(\"xpath=/div/div[5]\"),\n                                 \"current user name\")\n        self.logout_button = Button(\n            page,\n            page.get_by_role(\"button\", name=\"\u0412\u044b\u0439\u0442\u0438\"),\n            \"logout button\"\n        )\n        self.change_password_button = Button(\n            page,\n            page.get_by_role(\"button\", name=\"\u0418\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u043f\u0430\u0440\u043e\u043b\u044c\"),\n            \"change password button\"\n        )\n        self.settings_button = Button(\n            page,\n            page.get_by_role(\"button\", name=\"\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438\"),\n            \"settings button\"\n        )\n\n        # self.close_button = Button(\n        #     page,\n        #     page.get_by_role(\"button\", name=\"\u0417\u0430\u043a\u0440\u044b\u0442\u044c\"),\n        #     \"close button\"\n        # )\n\n        # \u043e\u043a\u043d\u0430, \u043e\u0442\u0440\u044b\u0432\u0430\u0435\u043c\u044b\u0435 \u043f\u043e\u0441\u043b\u0435 \u043d\u0430\u0436\u0430\u0442\u0438\u044f \u043a\u043d\u043e\u043f\u043e\u043a\n        self.user_settings_dialog_window = UserSettingsDialogWindow(page)\n        self.change_password_modal_window = ChangePasswordModalWindow(page)\n\n    # \u0414\u0435\u0439\u0441\u0442\u0432\u0438\u044f:\n    # def click_close_button(self):\n    #     \"\"\"\u041d\u0430\u0436\u0438\u043c\u0430\u0435\u0442 \u043a\u043d\u043e\u043f\u043a\u0443 \u0432\u044b\u0445\u043e\u0434\u0430 \u0438\u0437 \u043a\u0430\u0440\u0442\u043e\u0447\u043a\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\n\n    #     \u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u043a\u043b\u0438\u043a \u043f\u043e \u043a\u043d\u043e\u043f\u043a\u0435 '\u0417\u0430\u043a\u0440\u044b\u0442\u044c' \u0432 \u043a\u0430\u0440\u0442\u043e\u0447\u043a\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\n    #     \"\"\"\n\n    #     self.close_button.click()\n\n    def click_change_password_button(self) -> ChangePasswordModalWindow:\n        \"\"\"\u041d\u0430\u0436\u0438\u043c\u0430\u0435\u0442 \u043a\u043d\u043e\u043f\u043a\u0443 \u043e\u0442\u043a\u0440\u044b\u0442\u0438\u044f \u043e\u043a\u043d\u0430 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u043f\u0430\u0440\u043e\u043b\u044f.\n\n        \u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u043a\u043b\u0438\u043a \u043f\u043e \u043a\u043d\u043e\u043f\u043a\u0435 '\u0418\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u043f\u0430\u0440\u043e\u043b\u044c' \u0432 \u043a\u0430\u0440\u0442\u043e\u0447\u043a\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\n        \"\"\"\n\n        self.change_password_button.click()\n        return self.change_password_modal_window\n\n    def click_logout_button(self) -> None:\n        \"\"\"\u041d\u0430\u0436\u0438\u043c\u0430\u0435\u0442 \u043a\u043d\u043e\u043f\u043a\u0443 \u0432\u044b\u0445\u043e\u0434\u0430 \u0438\u0437 \u0441\u0438\u0441\u0442\u0435\u043c\u044b.\n\n        \u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u043a\u043b\u0438\u043a \u043f\u043e \u043a\u043d\u043e\u043f\u043a\u0435 '\u0412\u044b\u0439\u0442\u0438' \u0432 \u043a\u0430\u0440\u0442\u043e\u0447\u043a\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\n        \"\"\"\n\n        self.logout_button.click()\n\n    def click_settings_button(self) -> UserSettingsDialogWindow:\n        \"\"\"\u041d\u0430\u0436\u0438\u043c\u0430\u0435\u0442 \u043a\u043d\u043e\u043f\u043a\u0443 \u043e\u0442\u043a\u0440\u044b\u0442\u0438\u044f \u043e\u043a\u043d\u0430 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0445 \u0441\u0435\u0441\u0441\u0438\u0439.\n\n        \u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u043a\u043b\u0438\u043a \u043f\u043e \u043a\u043d\u043e\u043f\u043a\u0435 '\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438' \u0432 \u043a\u0430\u0440\u0442\u043e\u0447\u043a\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\n        \"\"\"\n\n        self.settings_button.click()\n        return self.user_settings_dialog_window\n\n    # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0438:\n    def check_content(self) -> None:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0438 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0441\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u043a\u0430\u0440\u0442\u043e\u0447\u043a\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\n           \u0432 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u0435\u0433\u043e \u0440\u043e\u043b\u0438 \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0435.\"\"\"\n\n        current_user_credential = host.get_current_user_credential()\n\n        name = current_user_credential[\"login\"]\n        text_to_check = f\"\u0418\u043c\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f: {name}\"\n        self.current_user_name.check_have_text(text_to_check,\n                                               f\"Expected text {text_to_check} is missing in user card\")\n\n        role = roles_dict.get(current_user_credential[\"role\"])\n        if role is None:\n            assert False, \"Unknown user role in current user credential\"\n        text_to_check = f\"\u0420\u043e\u043b\u044c: {role}\"\n        self.current_user_role.check_have_text(text_to_check,\n                                               f\"Expected text {text_to_check} is missing in user card\")\n\n        login_time_str = self.login_time.get_text(0)\n        assert login_time_str.find(\"\u0412\u0440\u0435\u043c\u044f \u0432\u0445\u043e\u0434\u0430:\")!= -1, \\\n               \"Expected text '\u0412\u0440\u0435\u043c\u044f \u0432\u0445\u043e\u0434\u0430:' is missing in user card\"\n        session_time_str = self.session_time.get_text(0)\n        assert session_time_str.find(\"\u0412\u0440\u0435\u043c\u044f \u0441\u0435\u0441\u0441\u0438\u0438:\")!= -1, \\\n               \"Expected text '\u0412\u0440\u0435\u043c\u044f \u0441\u0435\u0441\u0441\u0438\u0438:' is missing in user card\"\n\n        self.logout_button.check_visibility(\"Logout button is missing on user card\")\n        self.change_password_button.check_visibility(\"Change password button is missing on user card\")\n        # self.close_button.check_visibility(\"Close button is missing on user card\")\n\n        admin_roles = [\"\u0410\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440\",\n                       \"\u0421\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0441\u0442 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u043e\u043d\u043d\u043e\u0439 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u0438\"]\n        if role in admin_roles:\n            self.settings_button.check_visibility(\"Settings button is missing on user card\")\n
    "},{"location":"components_derived/user_card/#components_derived.user_card.UserCard.__init__","title":"__init__(page)","text":"

    \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 \u043a\u0430\u0440\u0442\u043e\u0447\u043a\u0438.

    Parameters:

    Name Type Description Default page Page

    \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.

    required Source code in components_derived\\user_card.py
    def __init__(self, page: Page):\n    \"\"\"\u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 \u043a\u0430\u0440\u0442\u043e\u0447\u043a\u0438.\n\n    Args:\n        page: \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.\n    \"\"\"\n\n    super().__init__(page)\n\n    card_locator = page.locator(UserCardLocators.CARD_USER)\n\n    self.current_user_name = Text(page,\n                                  card_locator.locator(\"xpath=/div/div[2]\"),\n                                  \"current user name\")\n    self.current_user_role = Text(page,\n                                  card_locator.locator(\"xpath=/div/div[3]\"),\n                                  \"current user role\")\n    self.login_time = Text(page,\n                           card_locator.locator(\"xpath=/div/div[4]\"),\n                           \"login time\")\n    self.session_time = Text(page,\n                             card_locator.locator(\"xpath=/div/div[5]\"),\n                             \"current user name\")\n    self.logout_button = Button(\n        page,\n        page.get_by_role(\"button\", name=\"\u0412\u044b\u0439\u0442\u0438\"),\n        \"logout button\"\n    )\n    self.change_password_button = Button(\n        page,\n        page.get_by_role(\"button\", name=\"\u0418\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u043f\u0430\u0440\u043e\u043b\u044c\"),\n        \"change password button\"\n    )\n    self.settings_button = Button(\n        page,\n        page.get_by_role(\"button\", name=\"\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438\"),\n        \"settings button\"\n    )\n\n    # self.close_button = Button(\n    #     page,\n    #     page.get_by_role(\"button\", name=\"\u0417\u0430\u043a\u0440\u044b\u0442\u044c\"),\n    #     \"close button\"\n    # )\n\n    # \u043e\u043a\u043d\u0430, \u043e\u0442\u0440\u044b\u0432\u0430\u0435\u043c\u044b\u0435 \u043f\u043e\u0441\u043b\u0435 \u043d\u0430\u0436\u0430\u0442\u0438\u044f \u043a\u043d\u043e\u043f\u043e\u043a\n    self.user_settings_dialog_window = UserSettingsDialogWindow(page)\n    self.change_password_modal_window = ChangePasswordModalWindow(page)\n
    "},{"location":"components_derived/user_card/#components_derived.user_card.UserCard.check_content","title":"check_content()","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0438 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0441\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u043a\u0430\u0440\u0442\u043e\u0447\u043a\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0432 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u0435\u0433\u043e \u0440\u043e\u043b\u0438 \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0435.

    Source code in components_derived\\user_card.py
    def check_content(self) -> None:\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0438 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0441\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u043a\u0430\u0440\u0442\u043e\u0447\u043a\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\n       \u0432 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u0435\u0433\u043e \u0440\u043e\u043b\u0438 \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0435.\"\"\"\n\n    current_user_credential = host.get_current_user_credential()\n\n    name = current_user_credential[\"login\"]\n    text_to_check = f\"\u0418\u043c\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f: {name}\"\n    self.current_user_name.check_have_text(text_to_check,\n                                           f\"Expected text {text_to_check} is missing in user card\")\n\n    role = roles_dict.get(current_user_credential[\"role\"])\n    if role is None:\n        assert False, \"Unknown user role in current user credential\"\n    text_to_check = f\"\u0420\u043e\u043b\u044c: {role}\"\n    self.current_user_role.check_have_text(text_to_check,\n                                           f\"Expected text {text_to_check} is missing in user card\")\n\n    login_time_str = self.login_time.get_text(0)\n    assert login_time_str.find(\"\u0412\u0440\u0435\u043c\u044f \u0432\u0445\u043e\u0434\u0430:\")!= -1, \\\n           \"Expected text '\u0412\u0440\u0435\u043c\u044f \u0432\u0445\u043e\u0434\u0430:' is missing in user card\"\n    session_time_str = self.session_time.get_text(0)\n    assert session_time_str.find(\"\u0412\u0440\u0435\u043c\u044f \u0441\u0435\u0441\u0441\u0438\u0438:\")!= -1, \\\n           \"Expected text '\u0412\u0440\u0435\u043c\u044f \u0441\u0435\u0441\u0441\u0438\u0438:' is missing in user card\"\n\n    self.logout_button.check_visibility(\"Logout button is missing on user card\")\n    self.change_password_button.check_visibility(\"Change password button is missing on user card\")\n    # self.close_button.check_visibility(\"Close button is missing on user card\")\n\n    admin_roles = [\"\u0410\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440\",\n                   \"\u0421\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0441\u0442 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u043e\u043d\u043d\u043e\u0439 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u0438\"]\n    if role in admin_roles:\n        self.settings_button.check_visibility(\"Settings button is missing on user card\")\n
    "},{"location":"components_derived/user_card/#components_derived.user_card.UserCard.click_change_password_button","title":"click_change_password_button()","text":"

    \u041d\u0430\u0436\u0438\u043c\u0430\u0435\u0442 \u043a\u043d\u043e\u043f\u043a\u0443 \u043e\u0442\u043a\u0440\u044b\u0442\u0438\u044f \u043e\u043a\u043d\u0430 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u043f\u0430\u0440\u043e\u043b\u044f.

    \u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u043a\u043b\u0438\u043a \u043f\u043e \u043a\u043d\u043e\u043f\u043a\u0435 '\u0418\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u043f\u0430\u0440\u043e\u043b\u044c' \u0432 \u043a\u0430\u0440\u0442\u043e\u0447\u043a\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.

    Source code in components_derived\\user_card.py
    def click_change_password_button(self) -> ChangePasswordModalWindow:\n    \"\"\"\u041d\u0430\u0436\u0438\u043c\u0430\u0435\u0442 \u043a\u043d\u043e\u043f\u043a\u0443 \u043e\u0442\u043a\u0440\u044b\u0442\u0438\u044f \u043e\u043a\u043d\u0430 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u043f\u0430\u0440\u043e\u043b\u044f.\n\n    \u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u043a\u043b\u0438\u043a \u043f\u043e \u043a\u043d\u043e\u043f\u043a\u0435 '\u0418\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u043f\u0430\u0440\u043e\u043b\u044c' \u0432 \u043a\u0430\u0440\u0442\u043e\u0447\u043a\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\n    \"\"\"\n\n    self.change_password_button.click()\n    return self.change_password_modal_window\n
    "},{"location":"components_derived/user_card/#components_derived.user_card.UserCard.click_logout_button","title":"click_logout_button()","text":"

    \u041d\u0430\u0436\u0438\u043c\u0430\u0435\u0442 \u043a\u043d\u043e\u043f\u043a\u0443 \u0432\u044b\u0445\u043e\u0434\u0430 \u0438\u0437 \u0441\u0438\u0441\u0442\u0435\u043c\u044b.

    \u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u043a\u043b\u0438\u043a \u043f\u043e \u043a\u043d\u043e\u043f\u043a\u0435 '\u0412\u044b\u0439\u0442\u0438' \u0432 \u043a\u0430\u0440\u0442\u043e\u0447\u043a\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.

    Source code in components_derived\\user_card.py
    def click_logout_button(self) -> None:\n    \"\"\"\u041d\u0430\u0436\u0438\u043c\u0430\u0435\u0442 \u043a\u043d\u043e\u043f\u043a\u0443 \u0432\u044b\u0445\u043e\u0434\u0430 \u0438\u0437 \u0441\u0438\u0441\u0442\u0435\u043c\u044b.\n\n    \u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u043a\u043b\u0438\u043a \u043f\u043e \u043a\u043d\u043e\u043f\u043a\u0435 '\u0412\u044b\u0439\u0442\u0438' \u0432 \u043a\u0430\u0440\u0442\u043e\u0447\u043a\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\n    \"\"\"\n\n    self.logout_button.click()\n
    "},{"location":"components_derived/user_card/#components_derived.user_card.UserCard.click_settings_button","title":"click_settings_button()","text":"

    \u041d\u0430\u0436\u0438\u043c\u0430\u0435\u0442 \u043a\u043d\u043e\u043f\u043a\u0443 \u043e\u0442\u043a\u0440\u044b\u0442\u0438\u044f \u043e\u043a\u043d\u0430 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0445 \u0441\u0435\u0441\u0441\u0438\u0439.

    \u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u043a\u043b\u0438\u043a \u043f\u043e \u043a\u043d\u043e\u043f\u043a\u0435 '\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438' \u0432 \u043a\u0430\u0440\u0442\u043e\u0447\u043a\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.

    Source code in components_derived\\user_card.py
    def click_settings_button(self) -> UserSettingsDialogWindow:\n    \"\"\"\u041d\u0430\u0436\u0438\u043c\u0430\u0435\u0442 \u043a\u043d\u043e\u043f\u043a\u0443 \u043e\u0442\u043a\u0440\u044b\u0442\u0438\u044f \u043e\u043a\u043d\u0430 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0445 \u0441\u0435\u0441\u0441\u0438\u0439.\n\n    \u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u043a\u043b\u0438\u043a \u043f\u043e \u043a\u043d\u043e\u043f\u043a\u0435 '\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438' \u0432 \u043a\u0430\u0440\u0442\u043e\u0447\u043a\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\n    \"\"\"\n\n    self.settings_button.click()\n    return self.user_settings_dialog_window\n
    "},{"location":"config/add_docstring/","title":"\u0422\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u044f \u043f\u0440\u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0438 docstring","text":"

    \u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 Docstring

    "},{"location":"config/add_docstring/#_1","title":"\u0418\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u0441\u043e\u0431\u043b\u044e\u0434\u0430\u044f \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u044f:","text":"
    1. \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u044e\u0449\u0438\u0435 \u0438 \u0443\u043b\u0443\u0447\u0448\u0438\u0442\u044c \u0438\u043c\u0435\u044e\u0449\u0438\u0435\u0441\u044f docstrings \u044f\u0437\u044b\u043a \u0440\u0443\u0441\u0441\u043a\u0438\u0439.

    2. \u0421\u0434\u0435\u043b\u0430\u0442\u044c docstring \u0431\u043e\u043b\u0435\u0435 \u043a\u043e\u043c\u043f\u0430\u043a\u0442\u043d\u044b\u043c\u0438, \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0432 \u0432\u0441\u044e \u0432\u0430\u0436\u043d\u0443\u044e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e.

    3. \u041e\u0433\u0440\u0430\u043d\u0438\u0447\u0438\u0442\u044c \u0432 docstring \u0434\u043b\u0438\u043d\u0443 \u0441\u0442\u0440\u043e\u043a 79 \u0441\u0438\u043c\u0432\u043e\u043b\u0430\u043c\u0438.

    4. \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c docstring \u043f\u0435\u0440\u0435\u0434 \u0438\u043c\u043f\u043e\u0440\u0442\u0430\u043c\u0438.

    5. \u0414\u043e\u043b\u0436\u043d\u0430 \u0431\u044b\u0442\u044c \u043f\u0443\u0441\u0442\u0430\u044f \u0441\u0442\u0440\u043e\u043a\u0430 \u043f\u043e\u0441\u043b\u0435 \u043a\u0430\u0436\u0434\u043e\u0433\u043e docstring.

    6. \u0421\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0432\u0441\u0435 \u0442\u0435\u043a\u0443\u0449\u0438\u0435 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0438.

    7. \u0417\u0430\u043f\u0440\u0435\u0449\u0435\u043d\u043e \u0438\u0437\u043c\u0435\u043d\u044f\u0442\u044c \u043a\u043e\u0434 (\u0438\u0437\u043c\u0435\u043d\u044f\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e docstring).

    8. \u041d\u0435 \u0443\u0434\u0430\u043b\u044f\u0442\u044c \u043f\u0443\u0441\u0442\u044b\u0435 \u0441\u0442\u0440\u043e\u043a\u0438.

    9. \u0412 \u043a\u043e\u043d\u0446\u0435 \u043a\u043e\u0434\u0430 \u0434\u043e\u043b\u0436\u043d\u0430 \u0431\u044b\u0442\u044c \u043e\u0434\u043d\u0430 \u043f\u0443\u0441\u0442\u0430\u044f \u0441\u0442\u0440\u043e\u043a\u0430.

    "},{"location":"config/add_docstring/#docstring-deepseek","title":"\u041f\u0440\u0438\u043c\u0435\u0440 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f Docstring \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0418\u0418 \"DeepSeek\":","text":"
    • \u0417\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c: DeepSeek \u0444\u0430\u0439\u043b \u043f\u0440\u043e\u0435\u043a\u0442\u0430 my_name.py \u0438 docs/config/add_docstring.md.
    • \u0417\u0430\u043f\u0440\u043e\u0441\u0438\u0442\u044c: \u0418\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u0441\u0442\u0440\u043e\u0433\u043e \u0441\u043e\u0431\u043b\u044e\u0434\u0430\u044f \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u044f,\u0432\u044b\u0432\u0435\u0441\u0442\u0438 \u043f\u043e\u043b\u043d\u044b\u0439 \u0438\u0437\u043c\u0435\u043d\u0451\u043d\u043d\u044b\u0439 \u043a\u043e\u0434 \u0438 \u043e\u0442\u0447\u0435\u0442 \u043e \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0438 \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u0439.
    • \u041f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435\u043c \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439 \u0441\u0434\u0435\u043b\u0430\u043d\u043d\u044b\u043c\u0438 \u0432 \u043a\u043e\u0434\u0435 \u0418\u0418 \"DeepSeek\" \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e notepad++.
    "},{"location":"config/code_development_process/","title":"\u041f\u0440\u043e\u0446\u0435\u0441\u0441 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u043a\u043e\u0434\u0430","text":"

    \u0414\u043e\u043a\u0443\u043c\u0435\u043d\u0442 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c

    "},{"location":"config/mkdocs_guide/","title":"\u0414\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f \u043f\u0440\u043e\u0435\u043a\u0442\u0430: \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 MkDocs \u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438 \u041a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430 UI \"alert_component.py\"","text":""},{"location":"config/mkdocs_guide/#1","title":"1 \u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u043f\u0440\u043e\u0435\u043a\u0442\u0430","text":"
    nms_tests/\n\u251c\u2500\u2500 docs/\n\u2502 \u251c\u2500\u2500 components/\n\u2502 \u2502 \u2514\u2500\u2500 alert_component.md\n\u2502 \u2514\u2500\u2500 index.md\n\u251c\n\u251c\u2500\u2500 components/\n\u2502 \u2514\u2500\u2500 alert_component.py\n\u2514\u2500\u2500 mkdocs.yml\n
    "},{"location":"config/mkdocs_guide/#2-mkdocs","title":"2 \u0418\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f \u043f\u043e \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0435 MkDocs","text":""},{"location":"config/mkdocs_guide/#21","title":"2.1 \u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439","text":"

    powershell pip install mkdocs mkdocs-material mkdocstrings mkdocstrings-python

    "},{"location":"config/mkdocs_guide/#22","title":"2.2 \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043f\u0440\u043e\u0435\u043a\u0442\u0430","text":"

    powershell mkdocs new .

    "},{"location":"config/mkdocs_guide/#3","title":"3 \u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438","text":""},{"location":"config/mkdocs_guide/#31-docstrings-alert-alert_componentpy","title":"3.1 \u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0435\u0432 docstrings \u0432 \u041a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 Alert (alert_component.py)","text":"
    python\n\"\"\"\u041c\u043e\u0434\u0443\u043b\u044c \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043e\u043c alert-\u043e\u043a\u043d\u0430 \u0432 Playwright.\n\n\u0421\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043a\u043b\u0430\u0441\u0441 AlertComponent \u0434\u043b\u044f \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0441 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u043c\u0438 \u0442\u0438\u043f\u0430\u043c\u0438\nalert-\u043e\u043a\u043e\u043d (error, success, info, warning) \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0438\u0445 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f.\n\"\"\"\n\nfrom playwright.sync_api import Page, expect\nfrom tools.logger import get_logger\nfrom elements.text_element import Text\nfrom components.base_component import BaseComponent\n\nlogger = get_logger(\"ALERT\")\n\nclass AlertComponent(BaseComponent):\n    \"\"\"\u041a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 alert-\u043e\u043a\u043d\u0430\u043c\u0438 Playwright.\n\n    \u041f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u0442\u0438\u043f\u044b: error, success, info, warning.\n    \u041f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0442\u044c \u043d\u0430\u043b\u0438\u0447\u0438\u0435, \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u0435 \u0438 \u0442\u0435\u043a\u0441\u0442 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439.\n    \"\"\"\n\n    # ... (\u043f\u043e\u043b\u043d\u044b\u0439 \u043a\u043e\u0434 \u043a\u043b\u0430\u0441\u0441\u0430 \u0438\u0437 \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0433\u043e \u0444\u0430\u0439\u043b\u0430)\n
    "},{"location":"config/mkdocs_guide/#32-mkdocs-mkdocsyml","title":"3.2 \u041a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f MkDocs (mkdocs.yml)","text":"
    yaml\nsite_name: \u0414\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f \u0442\u0435\u0441\u0442\u043e\u0432\ntheme:\n  name: material\n\nplugins:\n  - search\n  - mkdocstrings:\n      default_handler: python\n      handlers:\n        python:\n          paths: [\".\", \"pages\"]\n          options:\n            show_source: true\n\nnav:\n  - \u0413\u043b\u0430\u0432\u043d\u0430\u044f: index.md\n  - \u041a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u044b UI:\n    - AlertComponent: components/alert_component.md\n  # ... (\u043e\u0441\u0442\u0430\u043b\u044c\u043d\u0430\u044f \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438)\n
    "},{"location":"config/mkdocs_guide/#33-alert","title":"3.3 \u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0444\u0430\u0439\u043b\u0430 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u041a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430 Alert","text":"

    docs/components/alert_component.md:

    markdown\n# AlertComponent\n\n::: components.alert_component:AlertComponent\n    handler: python\n    options:\n      show_source: true\n      heading_level: 2\n
    "},{"location":"config/mkdocs_guide/#4","title":"4 \u0420\u0430\u0431\u043e\u0442\u0430 \u0441 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0435\u0439.","text":""},{"location":"config/mkdocs_guide/#41","title":"4.1 \u041f\u0440\u043e\u0441\u043c\u043e\u0442\u0440 \u0432 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u043c \u0432\u0440\u0435\u043c\u0435\u043d\u0438","text":"

    bash

    mkdocs serve

    "},{"location":"config/mkdocs_guide/#42","title":"4.2 \u0421\u0431\u043e\u0440\u043a\u0430 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438","text":"

    bash

    rmdir /s /q site # \u041e\u0447\u0438\u0441\u0442\u043a\u0430 \u043a\u044d\u0448\u0430

    mkdocs build # \u041f\u0435\u0440\u0435\u0441\u0431\u043e\u0440\u043a\u0430

    "},{"location":"config/mkdocs_guide/#5","title":"5 \u0427\u0430\u0441\u0442\u044b\u0435 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u0438 \u0440\u0435\u0448\u0435\u043d\u0438\u044f","text":"

    \u041e\u0448\u0438\u0431\u043a\u0438 \u0438\u043c\u043f\u043e\u0440\u0442\u0430:

    • \u0423\u0431\u0435\u0434\u0438\u0442\u0435\u0441\u044c \u0432 \u043d\u0430\u043b\u0438\u0447\u0438\u0438 init.py \u0432 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044f\u0445.

    • \u041f\u0440\u043e\u0432\u0435\u0440\u044c\u0442\u0435 \u043f\u0443\u0442\u0438 \u0432 mkdocs.yml.

    \u041f\u0440\u0435\u0434\u0443\u043f\u0440\u0435\u0436\u0434\u0435\u043d\u0438\u044f \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u0438 \u0442\u0438\u043f\u043e\u0432 \u0434\u043b\u044f \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430:

    \u0423\u0431\u0435\u0434\u0438\u0442\u0435\u0441\u044c \u0432 \u043d\u0430\u043b\u0438\u0447\u0438\u0438 \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u0438 \u0442\u0438\u043f\u043e\u0432 \u0434\u043b\u044f \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430.

    "},{"location":"config/mkdocs_guide/#6","title":"6 \u0417\u0430\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435","text":"

    \u0414\u043b\u044f \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438 \u043f\u043e\u0441\u043b\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439 \u0432 \u043a\u043e\u0434\u0435:

    • \u0412\u043d\u0435\u0441\u0438\u0442\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0432 docstrings Python-\u043a\u043e\u0434\u0430.

    • \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u0435 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435 .md-\u0444\u0430\u0439\u043b\u044b.

    • \u041f\u0435\u0440\u0435\u0441\u043e\u0431\u0435\u0440\u0438\u0442\u0435 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044e.

    "},{"location":"data/constants/","title":"Constants","text":"

    \u041c\u043e\u0434\u0443\u043b\u044c constants \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0438 \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u044b \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f.

    \u041e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u043a\u043b\u0430\u0441\u0441 Constants \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u043c \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u043c \u0434\u043b\u044f \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 \u0438 \u0434\u0440\u0443\u0433\u0438\u0445 \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043a.

    "},{"location":"data/constants/#data.constants.Constants","title":"Constants","text":"

    \u0425\u0440\u0430\u043d\u0438\u0442 \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u044b \u0438 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f.

    \u041f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0438\u0437 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f. \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438.

    \u0410\u0442\u0440\u0438\u0431\u0443\u0442\u044b

    login (str): \u041b\u043e\u0433\u0438\u043d \u0434\u043b\u044f \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438. password (str): \u041f\u0430\u0440\u043e\u043b\u044c \u0434\u043b\u044f \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438.

    Source code in data\\constants.py
    class Constants:\n    \"\"\"\u0425\u0440\u0430\u043d\u0438\u0442 \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u044b \u0438 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f.\n\n\n    \u041f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0438\u0437 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f. \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438.\n\n    \u0410\u0442\u0440\u0438\u0431\u0443\u0442\u044b:\n        login (str): \u041b\u043e\u0433\u0438\u043d \u0434\u043b\u044f \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438.\n        password (str): \u041f\u0430\u0440\u043e\u043b\u044c \u0434\u043b\u044f \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438.\n    \"\"\"\n\n    try:\n        login = os.getenv('AUTH_LOGIN')\n        password = os.getenv('AUTH_PASSWORD')\n    except KeyError:\n        print(\"LOGIN OR PASSWORD WASN'T FOUND\")\n
    "},{"location":"data/environment/","title":"Environment","text":"

    \u041c\u043e\u0434\u0443\u043b\u044c environment \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f \u0438 URL-\u0430\u0434\u0440\u0435\u0441\u043e\u0432.

    \u041a\u043b\u0430\u0441\u0441 Environment \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u043c\u0435\u0442\u043e\u0434\u044b \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0435\u043c, \u0442\u043e\u043a\u0435\u043d\u0430\u043c\u0438 \u0438 URL-\u0430\u0434\u0440\u0435\u0441\u0430\u043c\u0438 API.

    "},{"location":"data/environment/#data.environment.Environment","title":"Environment","text":"

    \u0423\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0435\u043c, URL-\u0430\u0434\u0440\u0435\u0441\u0430\u043c\u0438 \u0438 \u0442\u043e\u043a\u0435\u043d\u0430\u043c\u0438.

    \u0410\u0442\u0440\u0438\u0431\u0443\u0442\u044b \u043a\u043b\u0430\u0441\u0441\u0430

    TEST (str): \u041a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u0430 \u0434\u043b\u044f \u0442\u0435\u0441\u0442\u043e\u0432\u043e\u0433\u043e \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f. DEVELOP (str): \u041a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u0430 \u0434\u043b\u044f dev-\u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f. URLS (Dict[str, str]): \u0421\u043b\u043e\u0432\u0430\u0440\u044c URL \u0434\u043b\u044f \u0440\u0430\u0437\u043d\u044b\u0445 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0439.

    Source code in data\\environment.py
    class Environment:\n    \"\"\"\u0423\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0435\u043c, URL-\u0430\u0434\u0440\u0435\u0441\u0430\u043c\u0438 \u0438 \u0442\u043e\u043a\u0435\u043d\u0430\u043c\u0438.\n\n    \u0410\u0442\u0440\u0438\u0431\u0443\u0442\u044b \u043a\u043b\u0430\u0441\u0441\u0430:\n        TEST (str): \u041a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u0430 \u0434\u043b\u044f \u0442\u0435\u0441\u0442\u043e\u0432\u043e\u0433\u043e \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f.\n        DEVELOP (str): \u041a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u0430 \u0434\u043b\u044f dev-\u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f.\n        URLS (Dict[str, str]): \u0421\u043b\u043e\u0432\u0430\u0440\u044c URL \u0434\u043b\u044f \u0440\u0430\u0437\u043d\u044b\u0445 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0439.\n    \"\"\"\n\n    TEST: str = 'test'\n    DEVELOP: str = 'develop'\n\n    URLS: Dict[str, str] = {\n        TEST: 'http://192.168.2.76/',\n        DEVELOP: 'http://192.168.2.69/'\n    }\n\n    def __init__(self) -> None:\n        \"\"\"\u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442 \u043e\u0431\u044a\u0435\u043a\u0442 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f \u0438 \u0442\u043e\u043a\u0435\u043d\u044b.\"\"\"\n\n        try:\n            self.env: str = os.getenv('ENV', self.TEST)\n            self.current_user_credential = {}\n        except KeyError:\n            self.env: str = self.TEST\n\n    def get_base_url(self) -> str:\n        \"\"\"\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0431\u0430\u0437\u043e\u0432\u044b\u0439 URL \u0434\u043b\u044f \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f.\n\n        \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442:\n            str: \u0411\u0430\u0437\u043e\u0432\u044b\u0439 URL \u0441 \u043f\u0443\u0442\u0435\u043c \u0434\u043b\u044f \u0442\u0435\u0441\u0442\u0430 \u0438\u043b\u0438 \u0431\u0435\u0437 \u043d\u0435\u0433\u043e.\n        \"\"\"\n\n        if self.env in self.URLS:\n            if self.env == self.TEST:\n                return self.URLS[self.env] + \"e-nms-ui/\"\n            return self.URLS[self.env]\n        raise Exception(f\"Unknown value of ENV variable {self.env}\")\n\n    def get_env_name(self) -> str:\n        \"\"\"\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0438\u043c\u044f \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f.\n\n        \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442:\n            str: \u0438\u043c\u044f \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f.\n        \"\"\"\n        return self.env\n\n    def get_request_url(self) -> str:\n        \"\"\"\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 URL \u0434\u043b\u044f API-\u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432.\n\n        \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442:\n            str: URL \u0434\u043b\u044f API-\u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432.\n        \"\"\"\n\n        if self.env in self.URLS:\n            return self.URLS[self.env]\n        raise Exception(f\"Unknown value of ENV variable {self.env}\")\n\n    def set_current_user_credential(self, credential: {}) -> None:\n        \"\"\"\u0421\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u0442 \u0443\u0447\u0435\u0442\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\n\n        \u0410\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u044b:\n            credential ({}): \u0423\u0447\u0435\u0442\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\n        \"\"\"\n\n        self.current_user_credential = credential\n\n    def get_access_token(self) -> str:\n        \"\"\"\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0442\u0435\u043a\u0443\u0449\u0438\u0439 \u0442\u043e\u043a\u0435\u043d \u0434\u043e\u0441\u0442\u0443\u043f\u0430.\n\n        \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442:\n            str: \u0422\u0435\u043a\u0443\u0449\u0438\u0439 \u0442\u043e\u043a\u0435\u043d \u0434\u043e\u0441\u0442\u0443\u043f\u0430.\n        \"\"\"\n\n        return self.current_user_credential.get(\"access_token\")\n\n    def get_current_user_name(self) -> str:\n        \"\"\"\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0438\u043c\u044f \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\n\n        \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442:\n            str: \u0418\u043c\u044f \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\n        \"\"\"\n\n        return self.current_user_credential.get(\"login\")\n\n    def get_current_user_role(self) -> str:\n        \"\"\"\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0440\u043e\u043b\u044c \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\n\n        \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442:\n            str: \u0420\u043e\u043b\u044c \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\n        \"\"\"\n\n        return self.current_user_credential.get(\"role\")\n\n    def get_current_user_id(self) -> str:\n        \"\"\"\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 id \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\n\n        \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442:\n            str: id \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\n        \"\"\"\n\n        return self.current_user_credential.get(\"$id\")\n\n    def get_current_user_credential(self) -> {}:\n        \"\"\"\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0443\u0447\u0435\u0442\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\"\"\"\n\n        return self.current_user_credential\n
    "},{"location":"data/environment/#data.environment.Environment.__init__","title":"__init__()","text":"

    \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442 \u043e\u0431\u044a\u0435\u043a\u0442 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f \u0438 \u0442\u043e\u043a\u0435\u043d\u044b.

    Source code in data\\environment.py
    def __init__(self) -> None:\n    \"\"\"\u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442 \u043e\u0431\u044a\u0435\u043a\u0442 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f \u0438 \u0442\u043e\u043a\u0435\u043d\u044b.\"\"\"\n\n    try:\n        self.env: str = os.getenv('ENV', self.TEST)\n        self.current_user_credential = {}\n    except KeyError:\n        self.env: str = self.TEST\n
    "},{"location":"data/environment/#data.environment.Environment.get_access_token","title":"get_access_token()","text":"

    \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0442\u0435\u043a\u0443\u0449\u0438\u0439 \u0442\u043e\u043a\u0435\u043d \u0434\u043e\u0441\u0442\u0443\u043f\u0430.

    \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442

    str: \u0422\u0435\u043a\u0443\u0449\u0438\u0439 \u0442\u043e\u043a\u0435\u043d \u0434\u043e\u0441\u0442\u0443\u043f\u0430.

    Source code in data\\environment.py
    def get_access_token(self) -> str:\n    \"\"\"\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0442\u0435\u043a\u0443\u0449\u0438\u0439 \u0442\u043e\u043a\u0435\u043d \u0434\u043e\u0441\u0442\u0443\u043f\u0430.\n\n    \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442:\n        str: \u0422\u0435\u043a\u0443\u0449\u0438\u0439 \u0442\u043e\u043a\u0435\u043d \u0434\u043e\u0441\u0442\u0443\u043f\u0430.\n    \"\"\"\n\n    return self.current_user_credential.get(\"access_token\")\n
    "},{"location":"data/environment/#data.environment.Environment.get_base_url","title":"get_base_url()","text":"

    \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0431\u0430\u0437\u043e\u0432\u044b\u0439 URL \u0434\u043b\u044f \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f.

    \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442

    str: \u0411\u0430\u0437\u043e\u0432\u044b\u0439 URL \u0441 \u043f\u0443\u0442\u0435\u043c \u0434\u043b\u044f \u0442\u0435\u0441\u0442\u0430 \u0438\u043b\u0438 \u0431\u0435\u0437 \u043d\u0435\u0433\u043e.

    Source code in data\\environment.py
    def get_base_url(self) -> str:\n    \"\"\"\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0431\u0430\u0437\u043e\u0432\u044b\u0439 URL \u0434\u043b\u044f \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f.\n\n    \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442:\n        str: \u0411\u0430\u0437\u043e\u0432\u044b\u0439 URL \u0441 \u043f\u0443\u0442\u0435\u043c \u0434\u043b\u044f \u0442\u0435\u0441\u0442\u0430 \u0438\u043b\u0438 \u0431\u0435\u0437 \u043d\u0435\u0433\u043e.\n    \"\"\"\n\n    if self.env in self.URLS:\n        if self.env == self.TEST:\n            return self.URLS[self.env] + \"e-nms-ui/\"\n        return self.URLS[self.env]\n    raise Exception(f\"Unknown value of ENV variable {self.env}\")\n
    "},{"location":"data/environment/#data.environment.Environment.get_current_user_credential","title":"get_current_user_credential()","text":"

    \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0443\u0447\u0435\u0442\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.

    Source code in data\\environment.py
    def get_current_user_credential(self) -> {}:\n    \"\"\"\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0443\u0447\u0435\u0442\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\"\"\"\n\n    return self.current_user_credential\n
    "},{"location":"data/environment/#data.environment.Environment.get_current_user_id","title":"get_current_user_id()","text":"

    \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 id \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.

    \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442

    str: id \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.

    Source code in data\\environment.py
    def get_current_user_id(self) -> str:\n    \"\"\"\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 id \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\n\n    \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442:\n        str: id \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\n    \"\"\"\n\n    return self.current_user_credential.get(\"$id\")\n
    "},{"location":"data/environment/#data.environment.Environment.get_current_user_name","title":"get_current_user_name()","text":"

    \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0438\u043c\u044f \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.

    \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442

    str: \u0418\u043c\u044f \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.

    Source code in data\\environment.py
    def get_current_user_name(self) -> str:\n    \"\"\"\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0438\u043c\u044f \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\n\n    \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442:\n        str: \u0418\u043c\u044f \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\n    \"\"\"\n\n    return self.current_user_credential.get(\"login\")\n
    "},{"location":"data/environment/#data.environment.Environment.get_current_user_role","title":"get_current_user_role()","text":"

    \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0440\u043e\u043b\u044c \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.

    \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442

    str: \u0420\u043e\u043b\u044c \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.

    Source code in data\\environment.py
    def get_current_user_role(self) -> str:\n    \"\"\"\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0440\u043e\u043b\u044c \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\n\n    \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442:\n        str: \u0420\u043e\u043b\u044c \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\n    \"\"\"\n\n    return self.current_user_credential.get(\"role\")\n
    "},{"location":"data/environment/#data.environment.Environment.get_env_name","title":"get_env_name()","text":"

    \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0438\u043c\u044f \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f.

    \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442

    str: \u0438\u043c\u044f \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f.

    Source code in data\\environment.py
    def get_env_name(self) -> str:\n    \"\"\"\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0438\u043c\u044f \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f.\n\n    \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442:\n        str: \u0438\u043c\u044f \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f.\n    \"\"\"\n    return self.env\n
    "},{"location":"data/environment/#data.environment.Environment.get_request_url","title":"get_request_url()","text":"

    \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 URL \u0434\u043b\u044f API-\u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432.

    \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442

    str: URL \u0434\u043b\u044f API-\u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432.

    Source code in data\\environment.py
    def get_request_url(self) -> str:\n    \"\"\"\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 URL \u0434\u043b\u044f API-\u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432.\n\n    \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442:\n        str: URL \u0434\u043b\u044f API-\u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432.\n    \"\"\"\n\n    if self.env in self.URLS:\n        return self.URLS[self.env]\n    raise Exception(f\"Unknown value of ENV variable {self.env}\")\n
    "},{"location":"data/environment/#data.environment.Environment.set_current_user_credential","title":"set_current_user_credential(credential)","text":"

    \u0421\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u0442 \u0443\u0447\u0435\u0442\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.

    \u0410\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u044b

    credential ({}): \u0423\u0447\u0435\u0442\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.

    Source code in data\\environment.py
    def set_current_user_credential(self, credential: {}) -> None:\n    \"\"\"\u0421\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u0442 \u0443\u0447\u0435\u0442\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\n\n    \u0410\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u044b:\n        credential ({}): \u0423\u0447\u0435\u0442\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\n    \"\"\"\n\n    self.current_user_credential = credential\n
    "},{"location":"data/roles_dict/","title":"Roles_dict","text":"

    \u041c\u043e\u0434\u0443\u043b\u044c roles_dict \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0441\u043b\u043e\u0432\u0430\u0440\u044c \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u044f \u0440\u043e\u043b\u0435\u0439.

    \u0421\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0441\u043e\u043f\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0445 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0439 \u0440\u043e\u043b\u0435\u0439 \u0441 \u0438\u0445 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0435\u043c\u044b\u043c\u0438 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u044f\u043c\u0438.

    "},{"location":"elements/base_element/","title":"BaseElement","text":"

    \u041c\u043e\u0434\u0443\u043b\u044c base_element \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0431\u0430\u0437\u043e\u0432\u044b\u0439 \u043a\u043b\u0430\u0441\u0441 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u043c\u0438 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b.

    \u041a\u043b\u0430\u0441\u0441 BaseElement \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u043c\u0435\u0442\u043e\u0434\u044b \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0441 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u043c\u0438 \u0438 \u0438\u0445 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0447\u0435\u0440\u0435\u0437 Playwright.

    "},{"location":"elements/base_element/#elements.base_element.BaseElement","title":"BaseElement","text":"

    \u0411\u0430\u0437\u043e\u0432\u044b\u0439 \u043a\u043b\u0430\u0441\u0441 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u043c\u0438 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u0447\u0435\u0440\u0435\u0437 Playwright.

    \u041f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u043c\u0435\u0442\u043e\u0434\u044b \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0441 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u043c\u0438: \u043a\u043b\u0438\u043a\u0438, \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0442\u0435\u043a\u0441\u0442\u0430, \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u0435 \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f.

    Source code in elements\\base_element.py
    class BaseElement:\n    \"\"\"\u0411\u0430\u0437\u043e\u0432\u044b\u0439 \u043a\u043b\u0430\u0441\u0441 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u043c\u0438 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u0447\u0435\u0440\u0435\u0437 Playwright.\n\n    \u041f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u043c\u0435\u0442\u043e\u0434\u044b \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0441 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u043c\u0438:\n    \u043a\u043b\u0438\u043a\u0438, \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0442\u0435\u043a\u0441\u0442\u0430, \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u0435 \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f.\n    \"\"\"\n\n    def __init__(self, page: Page, locator: str | Locator, name: str) -> None:\n        \"\"\"\u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442 \u0431\u0430\u0437\u043e\u0432\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b.\n\n        Args:\n            page: \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright\n            locator: \u041b\u043e\u043a\u0430\u0442\u043e\u0440 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 (\u0441\u0442\u0440\u043e\u043a\u0430 \u0438\u043b\u0438 \u043e\u0431\u044a\u0435\u043a\u0442 Locator)\n            name: \u0418\u043c\u044f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0434\u043b\u044f \u043b\u043e\u0433\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f\n        \"\"\"\n\n        self.page = page\n        self.name = name\n        self.locator: Locator\n\n        if isinstance(locator, Locator):\n            self.locator = locator\n        elif isinstance(locator, str):\n            self.locator = self.page.locator(locator)\n        else:\n            raise TypeError(\"locator value should be string type or Locator type\")\n\n    @property\n    def type_of(self) -> str:\n        \"\"\"\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0442\u0438\u043f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 (\u0434\u043b\u044f \u043b\u043e\u0433\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f).\"\"\"\n\n        return \"base element\"\n\n    # \u0414\u0435\u0439\u0441\u0442\u0432\u0438\u044f:\n    def click(self) -> None:\n        \"\"\"\u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u043a\u043b\u0438\u043a \u043f\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0443.\"\"\"\n\n        logger.info(f\"Clicking {self.type_of} '{self.name}'\")\n        self.locator.click()\n\n    def get_text(self, index: int) -> str:\n        \"\"\"\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0442\u0435\u043a\u0441\u0442 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u043f\u043e \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u043e\u043c\u0443 \u0438\u043d\u0434\u0435\u043a\u0441\u0443.\"\"\"\n\n        logger.info(f\"Get text for {self.type_of} '{self.name}'\")\n        return self.locator.nth(index).text_content()\n\n    def update_locator(self, new_locator: Locator) -> None:\n        \"\"\"\u041c\u0435\u043d\u044f\u0435\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043b\u043e\u043a\u0430\u0442\u043e\u0440\u0430 \u0434\u043b\u044f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\"\"\"\n\n        logger.info(f\"Update locator for {self.type_of} '{self.name}'\")\n        self.locator = new_locator\n\n    def wait_for_element(self, timeout: int = 12000) -> None:\n        \"\"\"\u041e\u0436\u0438\u0434\u0430\u0435\u0442 \u043f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0432 \u0442\u0435\u0447\u0435\u043d\u0438\u0435 \u0437\u0430\u0434\u0430\u043d\u043d\u043e\u0433\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438.\"\"\"\n\n        logger.info(f\"Wait for {self.type_of} '{self.name}'\")\n        self.locator.wait_for(timeout=timeout)\n\n    # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0438:\n    def check_have_text(self, text: str, msg: str) -> None:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u043e\u0433\u043e \u0442\u0435\u043a\u0441\u0442\u0430 \u0432 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0435.\"\"\"\n\n        logger.info(f\"Check that {self.type_of} '{self.name}' has text '{text}'\")\n        expect(self.locator).to_have_text(text), msg\n\n    def check_visibility(self, msg: str) -> None:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u043d\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435.\"\"\"\n\n        logger.info(f\"Check that {self.type_of} '{self.name}' is present\")\n        print(self.locator)\n        expect(self.locator).to_be_visible(visible=True, timeout=12000), msg\n\n    def is_present(self, timeout: int = 5000) -> bool:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0432 \u0442\u0435\u0447\u0435\u043d\u0438\u0435 \u0437\u0430\u0434\u0430\u043d\u043d\u043e\u0433\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438.\"\"\"\n\n        logger.info(f\"Check that {self.type_of} '{self.name}' is present\")\n        try:\n            self.locator.wait_for(timeout=timeout)\n        except TimeoutError:\n            return False\n        return True\n\n    def is_not_present(self, timeout: int = 5000) -> bool:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0432 \u0442\u0435\u0447\u0435\u043d\u0438\u0435 \u0437\u0430\u0434\u0430\u043d\u043d\u043e\u0433\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438.\"\"\"\n\n        logger.info(f\"Check that {self.type_of} '{self.name}' is missing\")\n        try:\n            self.locator.wait_for(timeout=timeout)\n        except TimeoutError:\n            return True\n        return False\n
    "},{"location":"elements/base_element/#elements.base_element.BaseElement.type_of","title":"type_of property","text":"

    \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0442\u0438\u043f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 (\u0434\u043b\u044f \u043b\u043e\u0433\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f).

    "},{"location":"elements/base_element/#elements.base_element.BaseElement.__init__","title":"__init__(page, locator, name)","text":"

    \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442 \u0431\u0430\u0437\u043e\u0432\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b.

    Parameters:

    Name Type Description Default page Page

    \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright

    required locator str | Locator

    \u041b\u043e\u043a\u0430\u0442\u043e\u0440 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 (\u0441\u0442\u0440\u043e\u043a\u0430 \u0438\u043b\u0438 \u043e\u0431\u044a\u0435\u043a\u0442 Locator)

    required name str

    \u0418\u043c\u044f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0434\u043b\u044f \u043b\u043e\u0433\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f

    required Source code in elements\\base_element.py
    def __init__(self, page: Page, locator: str | Locator, name: str) -> None:\n    \"\"\"\u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442 \u0431\u0430\u0437\u043e\u0432\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b.\n\n    Args:\n        page: \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright\n        locator: \u041b\u043e\u043a\u0430\u0442\u043e\u0440 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 (\u0441\u0442\u0440\u043e\u043a\u0430 \u0438\u043b\u0438 \u043e\u0431\u044a\u0435\u043a\u0442 Locator)\n        name: \u0418\u043c\u044f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0434\u043b\u044f \u043b\u043e\u0433\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f\n    \"\"\"\n\n    self.page = page\n    self.name = name\n    self.locator: Locator\n\n    if isinstance(locator, Locator):\n        self.locator = locator\n    elif isinstance(locator, str):\n        self.locator = self.page.locator(locator)\n    else:\n        raise TypeError(\"locator value should be string type or Locator type\")\n
    "},{"location":"elements/base_element/#elements.base_element.BaseElement.check_have_text","title":"check_have_text(text, msg)","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u043e\u0433\u043e \u0442\u0435\u043a\u0441\u0442\u0430 \u0432 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0435.

    Source code in elements\\base_element.py
    def check_have_text(self, text: str, msg: str) -> None:\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u043e\u0433\u043e \u0442\u0435\u043a\u0441\u0442\u0430 \u0432 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0435.\"\"\"\n\n    logger.info(f\"Check that {self.type_of} '{self.name}' has text '{text}'\")\n    expect(self.locator).to_have_text(text), msg\n
    "},{"location":"elements/base_element/#elements.base_element.BaseElement.check_visibility","title":"check_visibility(msg)","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u043d\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435.

    Source code in elements\\base_element.py
    def check_visibility(self, msg: str) -> None:\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u043d\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435.\"\"\"\n\n    logger.info(f\"Check that {self.type_of} '{self.name}' is present\")\n    print(self.locator)\n    expect(self.locator).to_be_visible(visible=True, timeout=12000), msg\n
    "},{"location":"elements/base_element/#elements.base_element.BaseElement.click","title":"click()","text":"

    \u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u043a\u043b\u0438\u043a \u043f\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0443.

    Source code in elements\\base_element.py
    def click(self) -> None:\n    \"\"\"\u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u043a\u043b\u0438\u043a \u043f\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0443.\"\"\"\n\n    logger.info(f\"Clicking {self.type_of} '{self.name}'\")\n    self.locator.click()\n
    "},{"location":"elements/base_element/#elements.base_element.BaseElement.get_text","title":"get_text(index)","text":"

    \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0442\u0435\u043a\u0441\u0442 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u043f\u043e \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u043e\u043c\u0443 \u0438\u043d\u0434\u0435\u043a\u0441\u0443.

    Source code in elements\\base_element.py
    def get_text(self, index: int) -> str:\n    \"\"\"\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0442\u0435\u043a\u0441\u0442 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u043f\u043e \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u043e\u043c\u0443 \u0438\u043d\u0434\u0435\u043a\u0441\u0443.\"\"\"\n\n    logger.info(f\"Get text for {self.type_of} '{self.name}'\")\n    return self.locator.nth(index).text_content()\n
    "},{"location":"elements/base_element/#elements.base_element.BaseElement.is_not_present","title":"is_not_present(timeout=5000)","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0432 \u0442\u0435\u0447\u0435\u043d\u0438\u0435 \u0437\u0430\u0434\u0430\u043d\u043d\u043e\u0433\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438.

    Source code in elements\\base_element.py
    def is_not_present(self, timeout: int = 5000) -> bool:\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0432 \u0442\u0435\u0447\u0435\u043d\u0438\u0435 \u0437\u0430\u0434\u0430\u043d\u043d\u043e\u0433\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438.\"\"\"\n\n    logger.info(f\"Check that {self.type_of} '{self.name}' is missing\")\n    try:\n        self.locator.wait_for(timeout=timeout)\n    except TimeoutError:\n        return True\n    return False\n
    "},{"location":"elements/base_element/#elements.base_element.BaseElement.is_present","title":"is_present(timeout=5000)","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0432 \u0442\u0435\u0447\u0435\u043d\u0438\u0435 \u0437\u0430\u0434\u0430\u043d\u043d\u043e\u0433\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438.

    Source code in elements\\base_element.py
    def is_present(self, timeout: int = 5000) -> bool:\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0432 \u0442\u0435\u0447\u0435\u043d\u0438\u0435 \u0437\u0430\u0434\u0430\u043d\u043d\u043e\u0433\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438.\"\"\"\n\n    logger.info(f\"Check that {self.type_of} '{self.name}' is present\")\n    try:\n        self.locator.wait_for(timeout=timeout)\n    except TimeoutError:\n        return False\n    return True\n
    "},{"location":"elements/base_element/#elements.base_element.BaseElement.update_locator","title":"update_locator(new_locator)","text":"

    \u041c\u0435\u043d\u044f\u0435\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043b\u043e\u043a\u0430\u0442\u043e\u0440\u0430 \u0434\u043b\u044f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430

    Source code in elements\\base_element.py
    def update_locator(self, new_locator: Locator) -> None:\n    \"\"\"\u041c\u0435\u043d\u044f\u0435\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043b\u043e\u043a\u0430\u0442\u043e\u0440\u0430 \u0434\u043b\u044f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\"\"\"\n\n    logger.info(f\"Update locator for {self.type_of} '{self.name}'\")\n    self.locator = new_locator\n
    "},{"location":"elements/base_element/#elements.base_element.BaseElement.wait_for_element","title":"wait_for_element(timeout=12000)","text":"

    \u041e\u0436\u0438\u0434\u0430\u0435\u0442 \u043f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0432 \u0442\u0435\u0447\u0435\u043d\u0438\u0435 \u0437\u0430\u0434\u0430\u043d\u043d\u043e\u0433\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438.

    Source code in elements\\base_element.py
    def wait_for_element(self, timeout: int = 12000) -> None:\n    \"\"\"\u041e\u0436\u0438\u0434\u0430\u0435\u0442 \u043f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0432 \u0442\u0435\u0447\u0435\u043d\u0438\u0435 \u0437\u0430\u0434\u0430\u043d\u043d\u043e\u0433\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438.\"\"\"\n\n    logger.info(f\"Wait for {self.type_of} '{self.name}'\")\n    self.locator.wait_for(timeout=timeout)\n
    "},{"location":"elements/button_element/","title":"Button","text":"

    \u041c\u043e\u0434\u0443\u043b\u044c button_element \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043a\u043b\u0430\u0441\u0441 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u043a\u043d\u043e\u043f\u043a\u0430\u043c\u0438 \u043d\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435.

    \u041a\u043b\u0430\u0441\u0441 Button \u043d\u0430\u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u0431\u0430\u0437\u043e\u0432\u044b\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b BaseElement \u0438 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u0447\u043d\u044b\u0435 \u043c\u0435\u0442\u043e\u0434\u044b \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u043c\u0438 \u0442\u0438\u043f\u0430 '\u043a\u043d\u043e\u043f\u043a\u0430'.

    "},{"location":"elements/button_element/#elements.button_element.Button","title":"Button","text":"

    Bases: BaseElement

    \u041a\u043b\u0430\u0441\u0441 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u043a\u043d\u043e\u043f\u043a\u0430\u043c\u0438 \u043d\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435.

    \u041d\u0430\u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c BaseElement \u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u0447\u043d\u044b\u0435 \u0434\u043b\u044f \u043a\u043d\u043e\u043f\u043e\u043a \u043c\u0435\u0442\u043e\u0434\u044b \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438.

    Source code in elements\\button_element.py
    class Button(BaseElement):\n    \"\"\"\u041a\u043b\u0430\u0441\u0441 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u043a\u043d\u043e\u043f\u043a\u0430\u043c\u0438 \u043d\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435.\n\n    \u041d\u0430\u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c BaseElement \u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u0447\u043d\u044b\u0435\n    \u0434\u043b\u044f \u043a\u043d\u043e\u043f\u043e\u043a \u043c\u0435\u0442\u043e\u0434\u044b \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438.\n    \"\"\"\n\n    @property\n    def type_of(self) -> str:\n        \"\"\"\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0442\u0438\u043f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 ('\u043a\u043d\u043e\u043f\u043a\u0430').\n\n        Returns:\n            str: \u0422\u0438\u043f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 - '\u043a\u043d\u043e\u043f\u043a\u0430'.\n        \"\"\"\n\n        return \"button\"\n\n   # \u0414\u0435\u0439\u0441\u0442\u0432\u0438\u044f:\n    # (\u041c\u0435\u0442\u043e\u0434\u044b \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439 \u0431\u0443\u0434\u0443\u0442 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u044b \u043f\u043e \u043c\u0435\u0440\u0435 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438)\n\n    # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0438:\n    def is_disabled(self) -> bool:\n        \"\"\" \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435, \u043e\u0442\u043a\u043b\u044e\u0447\u0435\u043d\u0430 \u043b\u0438 \u043a\u043d\u043e\u043f\u043a\u0430 (\u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0441\u043a\u0440\u044b\u0442\u043e\u0439) \"\"\"\n\n        return self.locator.is_disabled()\n
    "},{"location":"elements/button_element/#elements.button_element.Button.type_of","title":"type_of property","text":"

    \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0442\u0438\u043f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 ('\u043a\u043d\u043e\u043f\u043a\u0430').

    Returns:

    Name Type Description str str

    \u0422\u0438\u043f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 - '\u043a\u043d\u043e\u043f\u043a\u0430'.

    "},{"location":"elements/button_element/#elements.button_element.Button.is_disabled","title":"is_disabled()","text":"

    \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435, \u043e\u0442\u043a\u043b\u044e\u0447\u0435\u043d\u0430 \u043b\u0438 \u043a\u043d\u043e\u043f\u043a\u0430 (\u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0441\u043a\u0440\u044b\u0442\u043e\u0439)

    Source code in elements\\button_element.py
    def is_disabled(self) -> bool:\n    \"\"\" \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435, \u043e\u0442\u043a\u043b\u044e\u0447\u0435\u043d\u0430 \u043b\u0438 \u043a\u043d\u043e\u043f\u043a\u0430 (\u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0441\u043a\u0440\u044b\u0442\u043e\u0439) \"\"\"\n\n    return self.locator.is_disabled()\n
    "},{"location":"elements/checkbox_element/","title":"Checkbox","text":"

    \u041c\u043e\u0434\u0443\u043b\u044c checkbox_element \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043a\u043b\u0430\u0441\u0441 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0447\u0435\u043a\u0431\u043e\u043a\u0441\u0430\u043c\u0438.

    \u041a\u043b\u0430\u0441\u0441 Checkbox \u043d\u0430\u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u0431\u0430\u0437\u043e\u0432\u044b\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b BaseElement \u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u0447\u043d\u044b\u0435 \u043c\u0435\u0442\u043e\u0434\u044b \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u043c\u0438 \u0442\u0438\u043f\u0430 '\u0447\u0435\u043a\u0431\u043e\u043a\u0441'.

    "},{"location":"elements/checkbox_element/#elements.checkbox_element.Checkbox","title":"Checkbox","text":"

    Bases: BaseElement

    \u041a\u043b\u0430\u0441\u0441 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0447\u0435\u043a\u0431\u043e\u043a\u0441\u0430\u043c\u0438 \u043d\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435.

    \u041d\u0430\u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c BaseElement \u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u043c\u0435\u0442\u043e\u0434\u044b \u0434\u043b\u044f \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0441 \u0447\u0435\u043a\u0431\u043e\u043a\u0441\u0430\u043c\u0438 \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0438\u0445 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f.

    Source code in elements\\checkbox_element.py
    class Checkbox(BaseElement):\n    \"\"\"\u041a\u043b\u0430\u0441\u0441 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0447\u0435\u043a\u0431\u043e\u043a\u0441\u0430\u043c\u0438 \u043d\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435.\n\n    \u041d\u0430\u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c BaseElement \u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u043c\u0435\u0442\u043e\u0434\u044b \u0434\u043b\u044f\n    \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0441 \u0447\u0435\u043a\u0431\u043e\u043a\u0441\u0430\u043c\u0438 \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0438\u0445 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f.\n    \"\"\"\n\n    @property\n    def type_of(self) -> str:\n        \"\"\"\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0442\u0438\u043f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 ('\u0447\u0435\u043a\u0431\u043e\u043a\u0441').\n\n        Returns:\n            str: \u0422\u0438\u043f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 - '\u0447\u0435\u043a\u0431\u043e\u043a\u0441'.\n        \"\"\"\n\n        return \"checkbox\"\n\n    # \u0414\u0435\u0439\u0441\u0442\u0432\u0438\u044f:\n    def check(self, force=False) -> None:\n        \"\"\"\u041e\u0442\u043c\u0435\u0447\u0430\u0435\u0442 \u0447\u0435\u043a\u0431\u043e\u043a\u0441 (\u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442 \u0433\u0430\u043b\u043e\u0447\u043a\u0443).\"\"\"\n\n        logger.info(f\"Checking checkbox '{self.name}'\")\n        if force:\n            self.locator.check(force=True)\n        else:\n            self.locator.check()\n\n    def uncheck(self, force=False) -> None:\n        \"\"\"\u0421\u043d\u0438\u043c\u0430\u0435\u0442 \u043e\u0442\u043c\u0435\u0442\u043a\u0443 \u0441 \u0447\u0435\u043a\u0431\u043e\u043a\u0441\u0430 (\u0443\u0431\u0438\u0440\u0430\u0435\u0442 \u0433\u0430\u043b\u043e\u0447\u043a\u0443).\"\"\"\n\n        logger.info(f\"Unchecking checkbox '{self.name}'\")\n        if force:\n            self.locator.uncheck(force=True)\n        else:\n            self.locator.uncheck()\n\n    # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0438:\n    def is_checked(self) -> bool:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442, \u043e\u0442\u043c\u0435\u0447\u0435\u043d \u043b\u0438 \u0447\u0435\u043a\u0431\u043e\u043a\u0441.\n\n        Returns:\n            bool: True \u0435\u0441\u043b\u0438 \u043e\u0442\u043c\u0435\u0447\u0435\u043d, False \u0435\u0441\u043b\u0438 \u043d\u0435\u0442.\n        \"\"\"\n\n        logger.info(f\"Checking if checkbox '{self.name}' is checked\")\n        return self.locator.is_checked()\n
    "},{"location":"elements/checkbox_element/#elements.checkbox_element.Checkbox.type_of","title":"type_of property","text":"

    \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0442\u0438\u043f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 ('\u0447\u0435\u043a\u0431\u043e\u043a\u0441').

    Returns:

    Name Type Description str str

    \u0422\u0438\u043f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 - '\u0447\u0435\u043a\u0431\u043e\u043a\u0441'.

    "},{"location":"elements/checkbox_element/#elements.checkbox_element.Checkbox.check","title":"check(force=False)","text":"

    \u041e\u0442\u043c\u0435\u0447\u0430\u0435\u0442 \u0447\u0435\u043a\u0431\u043e\u043a\u0441 (\u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442 \u0433\u0430\u043b\u043e\u0447\u043a\u0443).

    Source code in elements\\checkbox_element.py
    def check(self, force=False) -> None:\n    \"\"\"\u041e\u0442\u043c\u0435\u0447\u0430\u0435\u0442 \u0447\u0435\u043a\u0431\u043e\u043a\u0441 (\u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442 \u0433\u0430\u043b\u043e\u0447\u043a\u0443).\"\"\"\n\n    logger.info(f\"Checking checkbox '{self.name}'\")\n    if force:\n        self.locator.check(force=True)\n    else:\n        self.locator.check()\n
    "},{"location":"elements/checkbox_element/#elements.checkbox_element.Checkbox.is_checked","title":"is_checked()","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442, \u043e\u0442\u043c\u0435\u0447\u0435\u043d \u043b\u0438 \u0447\u0435\u043a\u0431\u043e\u043a\u0441.

    Returns:

    Name Type Description bool bool

    True \u0435\u0441\u043b\u0438 \u043e\u0442\u043c\u0435\u0447\u0435\u043d, False \u0435\u0441\u043b\u0438 \u043d\u0435\u0442.

    Source code in elements\\checkbox_element.py
    def is_checked(self) -> bool:\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442, \u043e\u0442\u043c\u0435\u0447\u0435\u043d \u043b\u0438 \u0447\u0435\u043a\u0431\u043e\u043a\u0441.\n\n    Returns:\n        bool: True \u0435\u0441\u043b\u0438 \u043e\u0442\u043c\u0435\u0447\u0435\u043d, False \u0435\u0441\u043b\u0438 \u043d\u0435\u0442.\n    \"\"\"\n\n    logger.info(f\"Checking if checkbox '{self.name}' is checked\")\n    return self.locator.is_checked()\n
    "},{"location":"elements/checkbox_element/#elements.checkbox_element.Checkbox.uncheck","title":"uncheck(force=False)","text":"

    \u0421\u043d\u0438\u043c\u0430\u0435\u0442 \u043e\u0442\u043c\u0435\u0442\u043a\u0443 \u0441 \u0447\u0435\u043a\u0431\u043e\u043a\u0441\u0430 (\u0443\u0431\u0438\u0440\u0430\u0435\u0442 \u0433\u0430\u043b\u043e\u0447\u043a\u0443).

    Source code in elements\\checkbox_element.py
    def uncheck(self, force=False) -> None:\n    \"\"\"\u0421\u043d\u0438\u043c\u0430\u0435\u0442 \u043e\u0442\u043c\u0435\u0442\u043a\u0443 \u0441 \u0447\u0435\u043a\u0431\u043e\u043a\u0441\u0430 (\u0443\u0431\u0438\u0440\u0430\u0435\u0442 \u0433\u0430\u043b\u043e\u0447\u043a\u0443).\"\"\"\n\n    logger.info(f\"Unchecking checkbox '{self.name}'\")\n    if force:\n        self.locator.uncheck(force=True)\n    else:\n        self.locator.uncheck()\n
    "},{"location":"elements/icon_element/","title":"Icon","text":"

    \u041c\u043e\u0434\u0443\u043b\u044c icon_element \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043a\u043b\u0430\u0441\u0441 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u043c \u0442\u0438\u043f\u0430 \u0438\u043a\u043e\u043d\u043a\u0430.

    \u041a\u043b\u0430\u0441\u0441 Icon \u043d\u0430\u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u0431\u0430\u0437\u043e\u0432\u044b\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b BaseElement \u0438 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u043c\u0435\u0442\u043e\u0434\u044b \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u044b\u043c\u0438 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u043c\u0438 \u043d\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435.

    "},{"location":"elements/icon_element/#elements.icon_element.Icon","title":"Icon","text":"

    Bases: BaseElement

    \u041a\u043b\u0430\u0441\u0441 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u043c \u0442\u0438\u043f\u0430 \u0438\u043a\u043e\u043d\u043a\u0430.

    \u041d\u0430\u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c BaseElement \u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u0447\u043d\u044b\u0435 \u043c\u0435\u0442\u043e\u0434\u044b \u0434\u043b\u044f \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0441 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u043c \u0442\u0438\u043f\u0430 \u0438\u043a\u043e\u043d\u043a\u0430.

    Source code in elements\\icon_element.py
    class Icon(BaseElement):\n    \"\"\"\u041a\u043b\u0430\u0441\u0441 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u043c \u0442\u0438\u043f\u0430 \u0438\u043a\u043e\u043d\u043a\u0430.\n\n    \u041d\u0430\u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c BaseElement \u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u0447\u043d\u044b\u0435\n    \u043c\u0435\u0442\u043e\u0434\u044b \u0434\u043b\u044f \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0441 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u043c \u0442\u0438\u043f\u0430 \u0438\u043a\u043e\u043d\u043a\u0430.\n    \"\"\"\n\n    @property\n    def type_of(self) -> str:\n        \"\"\"\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0442\u0438\u043f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 ('\u0438\u043a\u043e\u043d\u043a\u0430').\n\n        Returns:\n            str: \u0422\u0438\u043f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 - '\u0438\u043a\u043e\u043d\u043a\u0430'.\n        \"\"\"\n\n        return \"icon\"\n\n    # \u0414\u0435\u0439\u0441\u0442\u0432\u0438\u044f:\n    # (\u041c\u0435\u0442\u043e\u0434\u044b \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439 \u0431\u0443\u0434\u0443\u0442 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u044b \u043f\u043e \u043c\u0435\u0440\u0435 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438)\n\n    # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0438:\n    def is_password_hidden(self) -> bool:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0438\u043a\u043e\u043d\u043a\u0438 \u0441\u043a\u0440\u044b\u0442\u0438\u044f \u043f\u0430\u0440\u043e\u043b\u044f.\"\"\"\n\n        state_text = self.locator.text_content()\n        state = True\n        if state_text == \"visibility\":\n            state = False\n        return state\n
    "},{"location":"elements/icon_element/#elements.icon_element.Icon.type_of","title":"type_of property","text":"

    \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0442\u0438\u043f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 ('\u0438\u043a\u043e\u043d\u043a\u0430').

    Returns:

    Name Type Description str str

    \u0422\u0438\u043f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 - '\u0438\u043a\u043e\u043d\u043a\u0430'.

    "},{"location":"elements/icon_element/#elements.icon_element.Icon.is_password_hidden","title":"is_password_hidden()","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0438\u043a\u043e\u043d\u043a\u0438 \u0441\u043a\u0440\u044b\u0442\u0438\u044f \u043f\u0430\u0440\u043e\u043b\u044f.

    Source code in elements\\icon_element.py
    def is_password_hidden(self) -> bool:\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0438\u043a\u043e\u043d\u043a\u0438 \u0441\u043a\u0440\u044b\u0442\u0438\u044f \u043f\u0430\u0440\u043e\u043b\u044f.\"\"\"\n\n    state_text = self.locator.text_content()\n    state = True\n    if state_text == \"visibility\":\n        state = False\n    return state\n
    "},{"location":"elements/tab_button_element/","title":"TabButton","text":"

    \u041c\u043e\u0434\u0443\u043b\u044c tab_button_element \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043a\u043b\u0430\u0441\u0441 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u043a\u043d\u043e\u043f\u043a\u0430\u043c\u0438 \u0442\u0438\u043f\u0430 v-tabs \u043d\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435.

    \u041a\u043b\u0430\u0441\u0441 TabButton \u043d\u0430\u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u0431\u0430\u0437\u043e\u0432\u044b\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b BaseElement \u0438 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u0447\u043d\u044b\u0435 \u043c\u0435\u0442\u043e\u0434\u044b \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u043c\u0438.

    "},{"location":"elements/tab_button_element/#elements.tab_button_element.TabButton","title":"TabButton","text":"

    Bases: BaseElement

    \u041a\u043b\u0430\u0441\u0441 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u043a\u043d\u043e\u043f\u043a\u0430\u043c\u0438 \u0442\u0438\u043f\u0430 v-tabs \u043d\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435.

    \u041d\u0430\u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c BaseElement \u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u0447\u043d\u044b\u0435 \u0434\u043b\u044f \u043a\u043d\u043e\u043f\u043e\u043a \u043c\u0435\u0442\u043e\u0434\u044b \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438.

    Source code in elements\\tab_button_element.py
    class TabButton(BaseElement):\n    \"\"\"\u041a\u043b\u0430\u0441\u0441 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u043a\u043d\u043e\u043f\u043a\u0430\u043c\u0438 \u0442\u0438\u043f\u0430 v-tabs \u043d\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435.\n\n    \u041d\u0430\u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c BaseElement \u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u0447\u043d\u044b\u0435\n    \u0434\u043b\u044f \u043a\u043d\u043e\u043f\u043e\u043a \u043c\u0435\u0442\u043e\u0434\u044b \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438.\n    \"\"\"\n\n    @property\n    def type_of(self) -> str:\n        \"\"\"\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0442\u0438\u043f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 ('\u043a\u043d\u043e\u043f\u043a\u0430-tab').\n\n        Returns:\n            str: \u0422\u0438\u043f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 - '\u043a\u043d\u043e\u043f\u043a\u0430-tab'.\n        \"\"\"\n\n        return \"button_tab\"\n
    "},{"location":"elements/tab_button_element/#elements.tab_button_element.TabButton.type_of","title":"type_of property","text":"

    \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0442\u0438\u043f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 ('\u043a\u043d\u043e\u043f\u043a\u0430-tab').

    Returns:

    Name Type Description str str

    \u0422\u0438\u043f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 - '\u043a\u043d\u043e\u043f\u043a\u0430-tab'.

    "},{"location":"elements/text_element/","title":"Text","text":"

    \u041c\u043e\u0434\u0443\u043b\u044c text_element \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043a\u043b\u0430\u0441\u0441 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u044b\u043c\u0438 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u043c\u0438.

    \u041a\u043b\u0430\u0441\u0441 Text \u043d\u0430\u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u0431\u0430\u0437\u043e\u0432\u044b\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b BaseElement \u0438 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u043c\u0435\u0442\u043e\u0434\u044b \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u044b\u043c\u0438 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u043c\u0438 \u043d\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435.

    "},{"location":"elements/text_element/#elements.text_element.Text","title":"Text","text":"

    Bases: BaseElement

    \u041a\u043b\u0430\u0441\u0441 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u044b\u043c\u0438 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u043c\u0438 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b.

    \u041d\u0430\u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c BaseElement \u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u0447\u043d\u044b\u0435 \u043c\u0435\u0442\u043e\u0434\u044b \u0434\u043b\u044f \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0441 \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u044b\u043c\u0438 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u043c\u0438.

    Source code in elements\\text_element.py
    class Text(BaseElement):\n    \"\"\"\u041a\u043b\u0430\u0441\u0441 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u044b\u043c\u0438 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u043c\u0438 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b.\n\n    \u041d\u0430\u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c BaseElement \u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u0447\u043d\u044b\u0435\n    \u043c\u0435\u0442\u043e\u0434\u044b \u0434\u043b\u044f \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0441 \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u044b\u043c\u0438 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u043c\u0438.\n    \"\"\"\n\n    @property\n    def type_of(self) -> str:\n        \"\"\"\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0442\u0438\u043f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 ('\u0442\u0435\u043a\u0441\u0442').\n\n        Returns:\n            str: \u0422\u0438\u043f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 - '\u0442\u0435\u043a\u0441\u0442'.\n        \"\"\"\n\n        return \"text\"\n
    "},{"location":"elements/text_element/#elements.text_element.Text.type_of","title":"type_of property","text":"

    \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0442\u0438\u043f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 ('\u0442\u0435\u043a\u0441\u0442').

    Returns:

    Name Type Description str str

    \u0422\u0438\u043f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 - '\u0442\u0435\u043a\u0441\u0442'.

    "},{"location":"elements/text_input_element/","title":"TextInput","text":"

    \u041c\u043e\u0434\u0443\u043b\u044c text_input_element \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043a\u043b\u0430\u0441\u0441 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u044b\u043c\u0438 \u043f\u043e\u043b\u044f\u043c\u0438 \u0432\u0432\u043e\u0434\u0430.

    \u041a\u043b\u0430\u0441\u0441 TextInput \u043d\u0430\u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u0431\u0430\u0437\u043e\u0432\u044b\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b BaseElement \u0438 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u043c\u0435\u0442\u043e\u0434\u044b \u0434\u043b\u044f \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0441 \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u044b\u043c\u0438 \u043f\u043e\u043b\u044f\u043c\u0438 \u0432\u0432\u043e\u0434\u0430 \u043d\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435.

    "},{"location":"elements/text_input_element/#elements.text_input_element.TextInput","title":"TextInput","text":"

    Bases: BaseElement

    \u041a\u043b\u0430\u0441\u0441 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u044b\u043c\u0438 \u043f\u043e\u043b\u044f\u043c\u0438 \u0432\u0432\u043e\u0434\u0430.

    \u041d\u0430\u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c BaseElement \u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u043c\u0435\u0442\u043e\u0434\u044b \u0434\u043b\u044f \u0432\u0432\u043e\u0434\u0430, \u043e\u0447\u0438\u0441\u0442\u043a\u0438 \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u044b\u0445 \u043f\u043e\u043b\u0435\u0439.

    Source code in elements\\text_input_element.py
    class TextInput(BaseElement):\n    \"\"\"\u041a\u043b\u0430\u0441\u0441 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u044b\u043c\u0438 \u043f\u043e\u043b\u044f\u043c\u0438 \u0432\u0432\u043e\u0434\u0430.\n\n    \u041d\u0430\u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c BaseElement \u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u043c\u0435\u0442\u043e\u0434\u044b\n    \u0434\u043b\u044f \u0432\u0432\u043e\u0434\u0430, \u043e\u0447\u0438\u0441\u0442\u043a\u0438 \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u044b\u0445 \u043f\u043e\u043b\u0435\u0439.\n    \"\"\"\n\n    @property\n    def type_of(self) -> str:\n        \"\"\"\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0442\u0438\u043f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 ('\u0442\u0435\u043a\u0441\u0442\u043e\u0432\u043e\u0435 \u043f\u043e\u043b\u0435 \u0432\u0432\u043e\u0434\u0430').\n\n        Returns:\n            str: \u0422\u0438\u043f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 - '\u0442\u0435\u043a\u0441\u0442\u043e\u0432\u043e\u0435 \u043f\u043e\u043b\u0435 \u0432\u0432\u043e\u0434\u0430'.\n        \"\"\"\n\n        return \"text input\"\n\n    # \u0414\u0435\u0439\u0441\u0442\u0432\u0438\u044f:\n    def get_input_value(self) -> str:\n        \"\"\"\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0442\u0435\u043a\u0443\u0449\u0435\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043f\u043e\u043b\u044f \u0432\u0432\u043e\u0434\u0430.\n\n        Returns:\n            str: \u0422\u0435\u043a\u0443\u0449\u0435\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0432 \u043f\u043e\u043b\u0435.\n        \"\"\"\n\n        logger.info(f'Getting value from text input \"{self.name}\"')\n        return self.locator.input_value()\n\n    def get_input_type(self) -> str:\n        \"\"\"\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0430\u0442\u0442\u0440\u0438\u0431\u0443\u0442\u0430 type \u043f\u043e\u043b\u044f \u0432\u0432\u043e\u0434\u0430.\n\n        Returns:\n            str: \u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0430\u0442\u0442\u0440\u0438\u0431\u0443\u0442\u0430 type.\n        \"\"\"\n\n        return self.locator.get_attribute(\"type\")\n\n    def input_value(self, value: str) -> None:\n        \"\"\"\u0412\u0432\u043e\u0434\u0438\u0442 \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0432 \u043f\u043e\u043b\u0435.\n\n        Args:\n            value (str): \u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0434\u043b\u044f \u0432\u0432\u043e\u0434\u0430.\n        \"\"\"\n\n        logger.info(f'Inputting value \"{value}\" to text input \"{self.name}\"')\n        self.locator.fill(value)\n\n    def clear(self) -> None:\n        \"\"\"\u041e\u0447\u0438\u0449\u0430\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u043b\u044f.\"\"\"\n\n        logger.info(f'Clearing text input \"{self.name}\"')\n        self.locator.press('Control+A')\n        self.locator.press('Backspace')\n\n    # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0438:\n    def check_empty_input(self, msg: str) -> None:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442, \u0447\u0442\u043e \u043f\u043e\u043b\u0435 \u0432\u0432\u043e\u0434\u0430 \u043f\u0443\u0441\u0442\u043e\u0435.\n\n        Args:\n            msg (str): \u0421\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u043e\u0431 \u043e\u0448\u0438\u0431\u043a\u0435 \u043f\u0440\u0438 \u043d\u0435\u0443\u0434\u0430\u0447\u043d\u043e\u0439 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0435.\n\n        Raises:\n            AssertionError: \u0415\u0441\u043b\u0438 \u043f\u043e\u043b\u0435 \u043d\u0435 \u043f\u0443\u0441\u0442\u043e\u0435.\n        \"\"\"\n\n        logger.info(f'Checking that text input \"{self.name}\" is empty')\n        expect(self.locator).to_be_empty(), msg\n
    "},{"location":"elements/text_input_element/#elements.text_input_element.TextInput.type_of","title":"type_of property","text":"

    \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0442\u0438\u043f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 ('\u0442\u0435\u043a\u0441\u0442\u043e\u0432\u043e\u0435 \u043f\u043e\u043b\u0435 \u0432\u0432\u043e\u0434\u0430').

    Returns:

    Name Type Description str str

    \u0422\u0438\u043f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 - '\u0442\u0435\u043a\u0441\u0442\u043e\u0432\u043e\u0435 \u043f\u043e\u043b\u0435 \u0432\u0432\u043e\u0434\u0430'.

    "},{"location":"elements/text_input_element/#elements.text_input_element.TextInput.check_empty_input","title":"check_empty_input(msg)","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442, \u0447\u0442\u043e \u043f\u043e\u043b\u0435 \u0432\u0432\u043e\u0434\u0430 \u043f\u0443\u0441\u0442\u043e\u0435.

    Parameters:

    Name Type Description Default msg str

    \u0421\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u043e\u0431 \u043e\u0448\u0438\u0431\u043a\u0435 \u043f\u0440\u0438 \u043d\u0435\u0443\u0434\u0430\u0447\u043d\u043e\u0439 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0435.

    required

    Raises:

    Type Description AssertionError

    \u0415\u0441\u043b\u0438 \u043f\u043e\u043b\u0435 \u043d\u0435 \u043f\u0443\u0441\u0442\u043e\u0435.

    Source code in elements\\text_input_element.py
    def check_empty_input(self, msg: str) -> None:\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442, \u0447\u0442\u043e \u043f\u043e\u043b\u0435 \u0432\u0432\u043e\u0434\u0430 \u043f\u0443\u0441\u0442\u043e\u0435.\n\n    Args:\n        msg (str): \u0421\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u043e\u0431 \u043e\u0448\u0438\u0431\u043a\u0435 \u043f\u0440\u0438 \u043d\u0435\u0443\u0434\u0430\u0447\u043d\u043e\u0439 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0435.\n\n    Raises:\n        AssertionError: \u0415\u0441\u043b\u0438 \u043f\u043e\u043b\u0435 \u043d\u0435 \u043f\u0443\u0441\u0442\u043e\u0435.\n    \"\"\"\n\n    logger.info(f'Checking that text input \"{self.name}\" is empty')\n    expect(self.locator).to_be_empty(), msg\n
    "},{"location":"elements/text_input_element/#elements.text_input_element.TextInput.clear","title":"clear()","text":"

    \u041e\u0447\u0438\u0449\u0430\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u043b\u044f.

    Source code in elements\\text_input_element.py
    def clear(self) -> None:\n    \"\"\"\u041e\u0447\u0438\u0449\u0430\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u043b\u044f.\"\"\"\n\n    logger.info(f'Clearing text input \"{self.name}\"')\n    self.locator.press('Control+A')\n    self.locator.press('Backspace')\n
    "},{"location":"elements/text_input_element/#elements.text_input_element.TextInput.get_input_type","title":"get_input_type()","text":"

    \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0430\u0442\u0442\u0440\u0438\u0431\u0443\u0442\u0430 type \u043f\u043e\u043b\u044f \u0432\u0432\u043e\u0434\u0430.

    Returns:

    Name Type Description str str

    \u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0430\u0442\u0442\u0440\u0438\u0431\u0443\u0442\u0430 type.

    Source code in elements\\text_input_element.py
    def get_input_type(self) -> str:\n    \"\"\"\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0430\u0442\u0442\u0440\u0438\u0431\u0443\u0442\u0430 type \u043f\u043e\u043b\u044f \u0432\u0432\u043e\u0434\u0430.\n\n    Returns:\n        str: \u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0430\u0442\u0442\u0440\u0438\u0431\u0443\u0442\u0430 type.\n    \"\"\"\n\n    return self.locator.get_attribute(\"type\")\n
    "},{"location":"elements/text_input_element/#elements.text_input_element.TextInput.get_input_value","title":"get_input_value()","text":"

    \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0442\u0435\u043a\u0443\u0449\u0435\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043f\u043e\u043b\u044f \u0432\u0432\u043e\u0434\u0430.

    Returns:

    Name Type Description str str

    \u0422\u0435\u043a\u0443\u0449\u0435\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0432 \u043f\u043e\u043b\u0435.

    Source code in elements\\text_input_element.py
    def get_input_value(self) -> str:\n    \"\"\"\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0442\u0435\u043a\u0443\u0449\u0435\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043f\u043e\u043b\u044f \u0432\u0432\u043e\u0434\u0430.\n\n    Returns:\n        str: \u0422\u0435\u043a\u0443\u0449\u0435\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0432 \u043f\u043e\u043b\u0435.\n    \"\"\"\n\n    logger.info(f'Getting value from text input \"{self.name}\"')\n    return self.locator.input_value()\n
    "},{"location":"elements/text_input_element/#elements.text_input_element.TextInput.input_value","title":"input_value(value)","text":"

    \u0412\u0432\u043e\u0434\u0438\u0442 \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0432 \u043f\u043e\u043b\u0435.

    Parameters:

    Name Type Description Default value str

    \u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0434\u043b\u044f \u0432\u0432\u043e\u0434\u0430.

    required Source code in elements\\text_input_element.py
    def input_value(self, value: str) -> None:\n    \"\"\"\u0412\u0432\u043e\u0434\u0438\u0442 \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0432 \u043f\u043e\u043b\u0435.\n\n    Args:\n        value (str): \u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0434\u043b\u044f \u0432\u0432\u043e\u0434\u0430.\n    \"\"\"\n\n    logger.info(f'Inputting value \"{value}\" to text input \"{self.name}\"')\n    self.locator.fill(value)\n
    "},{"location":"elements/tooltip_button_element/","title":"TooltipButton","text":"

    \u041c\u043e\u0434\u0443\u043b\u044c tooltip_button_element \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043a\u043b\u0430\u0441\u0441 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u043a\u043d\u043e\u043f\u043a\u0430\u043c\u0438 \u0441 \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0430\u043c\u0438.

    \u041a\u043b\u0430\u0441\u0441 TooltipButton \u043d\u0430\u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u0431\u0430\u0437\u043e\u0432\u044b\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b BaseElement \u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u043c\u0435\u0442\u043e\u0434\u044b \u0434\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0432\u0441\u043f\u043b\u044b\u0432\u0430\u044e\u0449\u0438\u0445 \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043e\u043a \u0443 \u043a\u043d\u043e\u043f\u043e\u043a.

    "},{"location":"elements/tooltip_button_element/#elements.tooltip_button_element.TooltipButton","title":"TooltipButton","text":"

    Bases: BaseElement

    \u041a\u043b\u0430\u0441\u0441 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u043a\u043d\u043e\u043f\u043a\u0430\u043c\u0438, \u0438\u043c\u0435\u044e\u0449\u0438\u043c\u0438 \u0432\u0441\u043f\u043b\u044b\u0432\u0430\u044e\u0449\u0438\u0435 \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0438.

    \u041d\u0430\u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c BaseElement \u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u043c\u0435\u0442\u043e\u0434\u044b \u0434\u043b\u044f \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0441 \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0430\u043c\u0438 \u043a\u043d\u043e\u043f\u043e\u043a.

    Source code in elements\\tooltip_button_element.py
    class TooltipButton(BaseElement):\n    \"\"\"\u041a\u043b\u0430\u0441\u0441 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u043a\u043d\u043e\u043f\u043a\u0430\u043c\u0438, \u0438\u043c\u0435\u044e\u0449\u0438\u043c\u0438 \u0432\u0441\u043f\u043b\u044b\u0432\u0430\u044e\u0449\u0438\u0435 \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0438.\n\n    \u041d\u0430\u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c BaseElement \u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u043c\u0435\u0442\u043e\u0434\u044b\n    \u0434\u043b\u044f \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0441 \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0430\u043c\u0438 \u043a\u043d\u043e\u043f\u043e\u043a.\n    \"\"\"\n\n    @property\n    def type_of(self) -> str:\n        \"\"\"\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0442\u0438\u043f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 ('tooltip_button').\n\n        Returns:\n            str: \u0422\u0438\u043f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 - \u043a\u043d\u043e\u043f\u043a\u0430 \u0441 \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u043e\u0439.\n        \"\"\"\n\n        return \"tooltip_button\"\n\n    # \u0414\u0435\u0439\u0441\u0442\u0432\u0438\u044f:\n    def get_tooltip_text(self) -> str:\n        \"\"\"\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0442\u0435\u043a\u0441\u0442 \u0432\u0441\u043f\u043b\u044b\u0432\u0430\u044e\u0449\u0435\u0439 \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0438.\n\n        Returns:\n            str: \u0422\u0435\u043a\u0441\u0442 \u0432\u0441\u043f\u043b\u044b\u0432\u0430\u044e\u0449\u0435\u0439 \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0438.\n\n        \"\"\"\n\n        # \u041d\u0430\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u043d\u0430 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0434\u043b\u044f \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0438\n        self.locator.hover()\n\n        # \u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0438\n        tooltip = self.page.locator(ButtonLocators.TOOLTIP)\n\n        tooltip.wait_for(state=\"visible\", timeout=5000)\n\n        self.page.wait_for_timeout(300)\n        return tooltip.text_content().strip()\n\n    def wait_for_tooltip_to_disappear(self, timeout: int = 5000) -> None:\n        \"\"\"\u041e\u0436\u0438\u0434\u0430\u0435\u0442 \u0438\u0441\u0447\u0435\u0437\u043d\u043e\u0432\u0435\u043d\u0438\u044f \u0432\u0441\u0435\u0445 \u0430\u043a\u0442\u0438\u0432\u043d\u044b\u0445 \u0432\u0441\u043f\u043b\u044b\u0432\u0430\u044e\u0449\u0438\u0445 \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043e\u043a.\"\"\"\n\n        self.page.mouse.click(10, 10)\n        tooltip_locator = self.page.locator(\".v-tooltip__content.menuable__content__active\")\n\n        tooltip_locator.wait_for(state=\"hidden\", timeout=timeout)\n\n    # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0438:\n    def check_tooltip_with_text(self, expected_text: str) -> None:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0435 \u0442\u0435\u043a\u0441\u0442\u0430 \u0432\u0441\u043f\u043b\u044b\u0432\u0430\u044e\u0449\u0435\u0439 \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0438.\n\n        Args:\n           expected_text (str): \u041e\u0436\u0438\u0434\u0430\u0435\u043c\u044b\u0439 \u0442\u0435\u043a\u0441\u0442 \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0438.\n\n        Raises:\n            AssertionError: \u0415\u0441\u043b\u0438 \u0442\u0435\u043a\u0441\u0442 \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0438 \u043d\u0435 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u043e\u0436\u0438\u0434\u0430\u0435\u043c\u043e\u043c\u0443.\n        \"\"\"\n\n        # \u041d\u0430\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u043d\u0430 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0434\u043b\u044f \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0438\n        self.locator.hover()\n\n        # \u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0438\n        tooltip = self.page.locator(ButtonLocators.TOOLTIP)\n\n        tooltip.wait_for(state=\"visible\", timeout=5000)\n\n        self.page.wait_for_timeout(300)\n\n        # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u044f \u0442\u0435\u043a\u0441\u0442\u0430\n        actual_text = tooltip.text_content().strip()\n        assert actual_text == expected_text, (\n            f\"\u0422\u0435\u043a\u0441\u0442 \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0438 \u043d\u0435 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u043e\u0436\u0438\u0434\u0430\u0435\u043c\u043e\u043c\u0443. \"\n            f\"\u041e\u0436\u0438\u0434\u0430\u043b\u043e\u0441\u044c: '{expected_text}', \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043e: '{actual_text}'\"\n        )\n
    "},{"location":"elements/tooltip_button_element/#elements.tooltip_button_element.TooltipButton.type_of","title":"type_of property","text":"

    \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0442\u0438\u043f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 ('tooltip_button').

    Returns:

    Name Type Description str str

    \u0422\u0438\u043f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 - \u043a\u043d\u043e\u043f\u043a\u0430 \u0441 \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u043e\u0439.

    "},{"location":"elements/tooltip_button_element/#elements.tooltip_button_element.TooltipButton.check_tooltip_with_text","title":"check_tooltip_with_text(expected_text)","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0435 \u0442\u0435\u043a\u0441\u0442\u0430 \u0432\u0441\u043f\u043b\u044b\u0432\u0430\u044e\u0449\u0435\u0439 \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0438.

    Parameters:

    Name Type Description Default expected_text str

    \u041e\u0436\u0438\u0434\u0430\u0435\u043c\u044b\u0439 \u0442\u0435\u043a\u0441\u0442 \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0438.

    required

    Raises:

    Type Description AssertionError

    \u0415\u0441\u043b\u0438 \u0442\u0435\u043a\u0441\u0442 \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0438 \u043d\u0435 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u043e\u0436\u0438\u0434\u0430\u0435\u043c\u043e\u043c\u0443.

    Source code in elements\\tooltip_button_element.py
    def check_tooltip_with_text(self, expected_text: str) -> None:\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0435 \u0442\u0435\u043a\u0441\u0442\u0430 \u0432\u0441\u043f\u043b\u044b\u0432\u0430\u044e\u0449\u0435\u0439 \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0438.\n\n    Args:\n       expected_text (str): \u041e\u0436\u0438\u0434\u0430\u0435\u043c\u044b\u0439 \u0442\u0435\u043a\u0441\u0442 \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0438.\n\n    Raises:\n        AssertionError: \u0415\u0441\u043b\u0438 \u0442\u0435\u043a\u0441\u0442 \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0438 \u043d\u0435 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u043e\u0436\u0438\u0434\u0430\u0435\u043c\u043e\u043c\u0443.\n    \"\"\"\n\n    # \u041d\u0430\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u043d\u0430 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0434\u043b\u044f \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0438\n    self.locator.hover()\n\n    # \u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0438\n    tooltip = self.page.locator(ButtonLocators.TOOLTIP)\n\n    tooltip.wait_for(state=\"visible\", timeout=5000)\n\n    self.page.wait_for_timeout(300)\n\n    # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u044f \u0442\u0435\u043a\u0441\u0442\u0430\n    actual_text = tooltip.text_content().strip()\n    assert actual_text == expected_text, (\n        f\"\u0422\u0435\u043a\u0441\u0442 \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0438 \u043d\u0435 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u043e\u0436\u0438\u0434\u0430\u0435\u043c\u043e\u043c\u0443. \"\n        f\"\u041e\u0436\u0438\u0434\u0430\u043b\u043e\u0441\u044c: '{expected_text}', \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043e: '{actual_text}'\"\n    )\n
    "},{"location":"elements/tooltip_button_element/#elements.tooltip_button_element.TooltipButton.get_tooltip_text","title":"get_tooltip_text()","text":"

    \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0442\u0435\u043a\u0441\u0442 \u0432\u0441\u043f\u043b\u044b\u0432\u0430\u044e\u0449\u0435\u0439 \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0438.

    Returns:

    Name Type Description str str

    \u0422\u0435\u043a\u0441\u0442 \u0432\u0441\u043f\u043b\u044b\u0432\u0430\u044e\u0449\u0435\u0439 \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0438.

    Source code in elements\\tooltip_button_element.py
    def get_tooltip_text(self) -> str:\n    \"\"\"\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0442\u0435\u043a\u0441\u0442 \u0432\u0441\u043f\u043b\u044b\u0432\u0430\u044e\u0449\u0435\u0439 \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0438.\n\n    Returns:\n        str: \u0422\u0435\u043a\u0441\u0442 \u0432\u0441\u043f\u043b\u044b\u0432\u0430\u044e\u0449\u0435\u0439 \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0438.\n\n    \"\"\"\n\n    # \u041d\u0430\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u043d\u0430 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0434\u043b\u044f \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0438\n    self.locator.hover()\n\n    # \u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0438\n    tooltip = self.page.locator(ButtonLocators.TOOLTIP)\n\n    tooltip.wait_for(state=\"visible\", timeout=5000)\n\n    self.page.wait_for_timeout(300)\n    return tooltip.text_content().strip()\n
    "},{"location":"elements/tooltip_button_element/#elements.tooltip_button_element.TooltipButton.wait_for_tooltip_to_disappear","title":"wait_for_tooltip_to_disappear(timeout=5000)","text":"

    \u041e\u0436\u0438\u0434\u0430\u0435\u0442 \u0438\u0441\u0447\u0435\u0437\u043d\u043e\u0432\u0435\u043d\u0438\u044f \u0432\u0441\u0435\u0445 \u0430\u043a\u0442\u0438\u0432\u043d\u044b\u0445 \u0432\u0441\u043f\u043b\u044b\u0432\u0430\u044e\u0449\u0438\u0445 \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043e\u043a.

    Source code in elements\\tooltip_button_element.py
    def wait_for_tooltip_to_disappear(self, timeout: int = 5000) -> None:\n    \"\"\"\u041e\u0436\u0438\u0434\u0430\u0435\u0442 \u0438\u0441\u0447\u0435\u0437\u043d\u043e\u0432\u0435\u043d\u0438\u044f \u0432\u0441\u0435\u0445 \u0430\u043a\u0442\u0438\u0432\u043d\u044b\u0445 \u0432\u0441\u043f\u043b\u044b\u0432\u0430\u044e\u0449\u0438\u0445 \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043e\u043a.\"\"\"\n\n    self.page.mouse.click(10, 10)\n    tooltip_locator = self.page.locator(\".v-tooltip__content.menuable__content__active\")\n\n    tooltip_locator.wait_for(state=\"hidden\", timeout=timeout)\n
    "},{"location":"fixtures/pages/","title":"Browser Fixtures","text":"

    \u041c\u043e\u0434\u0443\u043b\u044c pages \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0444\u0438\u043a\u0441\u0442\u0443\u0440\u044b \u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 Playwright.

    \u041f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u044b \u0434\u043b\u044f \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u043e\u043c, \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0430\u043c\u0438 \u0438 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0430\u043c\u0438 \u0432 \u0442\u0435\u0441\u0442\u0430\u0445 pytest, \u0432\u043a\u043b\u044e\u0447\u0430\u044f \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0443 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 \u0437\u0430\u043f\u0443\u0441\u043a\u0430.

    "},{"location":"fixtures/pages/#fixtures.pages.browser","title":"browser(request)","text":"

    \u0424\u0438\u043a\u0441\u0442\u0443\u0440\u0430 \u0434\u043b\u044f \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u043e\u043c \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0430.

    Parameters:

    Name Type Description Default request FixtureRequest

    \u041e\u0431\u044a\u0435\u043a\u0442 \u0437\u0430\u043f\u0440\u043e\u0441\u0430 pytest \u0434\u043b\u044f \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u043a \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438.

    required

    Returns:

    Name Type Description Page Page

    \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0430.

    Yields:

    Name Type Description Page Page

    \u0421\u0442\u0440\u0430\u043d\u0438\u0446\u0430 \u0434\u043b\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0432 \u0442\u0435\u0441\u0442\u0430\u0445.

    Note

    \u0410\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0437\u0430\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u0431\u0440\u0430\u0443\u0437\u0435\u0440 \u043f\u043e\u0441\u043b\u0435 \u0442\u0435\u0441\u0442\u043e\u0432.

    Source code in fixtures\\pages.py
    @pytest.fixture(scope='class')\ndef browser(request: FixtureRequest) -> Page:\n    \"\"\"\u0424\u0438\u043a\u0441\u0442\u0443\u0440\u0430 \u0434\u043b\u044f \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u043e\u043c \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0430.\n\n    Args:\n        request: \u041e\u0431\u044a\u0435\u043a\u0442 \u0437\u0430\u043f\u0440\u043e\u0441\u0430 pytest \u0434\u043b\u044f \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u043a \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438.\n\n    Returns:\n        Page: \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0430.\n\n    Yields:\n        Page: \u0421\u0442\u0440\u0430\u043d\u0438\u0446\u0430 \u0434\u043b\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0432 \u0442\u0435\u0441\u0442\u0430\u0445.\n\n    Note:\n        \u0410\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0437\u0430\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u0431\u0440\u0430\u0443\u0437\u0435\u0440 \u043f\u043e\u0441\u043b\u0435 \u0442\u0435\u0441\u0442\u043e\u0432.\n    \"\"\"\n\n    playwright = sync_playwright().start()\n\n    # \u0412\u044b\u0431\u043e\u0440 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0430 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430 \u043a\u043e\u043c\u0430\u043d\u0434\u043d\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438\n    if request.config.getoption(\"bn\") == 'remote_chrome':\n        browser = get_remote_chrome(playwright, request)\n        context = get_context(browser, request, 'remote')\n        page_data = context.new_page()\n    elif request.config.getoption(\"bn\") == 'firefox':\n        browser = get_firefox_browser(playwright, request)\n        context = get_context(browser, request, 'local')\n        page_data = context.new_page()\n    elif request.config.getoption(\"bn\") == 'chrome':\n        browser = get_chrome_browser(playwright, request)\n        context = get_context(browser, request, 'local')\n        page_data = context.new_page()\n    else:\n        browser = get_chrome_browser(playwright, request)\n        context = get_context(browser, request, 'local')\n        page_data = context.new_page()\n\n    yield page_data\n\n    # \u041e\u0447\u0438\u0441\u0442\u043a\u0430 \u043f\u043e\u0441\u043b\u0435 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f \u0442\u0435\u0441\u0442\u043e\u0432\n    for context in browser.contexts:\n        context.close()\n    browser.close()\n    playwright.stop()\n
    "},{"location":"fixtures/pages/#fixtures.pages.get_chrome_browser","title":"get_chrome_browser(playwright, request)","text":"

    \u0421\u043e\u0437\u0434\u0430\u0435\u0442 \u0438 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 Chrome \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0430.

    Parameters:

    Name Type Description Default playwright Playwright

    \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 Playwright.

    required request FixtureRequest

    \u041e\u0431\u044a\u0435\u043a\u0442 \u0437\u0430\u043f\u0440\u043e\u0441\u0430 pytest.

    required

    Returns:

    Name Type Description Browser Browser

    \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 Chrome.

    Source code in fixtures\\pages.py
    def get_chrome_browser(playwright: Playwright, request: FixtureRequest) -> Browser:\n    \"\"\"\u0421\u043e\u0437\u0434\u0430\u0435\u0442 \u0438 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 Chrome \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0430.\n\n    Args:\n        playwright: \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 Playwright.\n        request: \u041e\u0431\u044a\u0435\u043a\u0442 \u0437\u0430\u043f\u0440\u043e\u0441\u0430 pytest.\n\n    Returns:\n        Browser: \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 Chrome.\n    \"\"\"\n\n    return playwright.chromium.launch(\n        headless=request.config.getoption(\"h\"),\n        slow_mo=request.config.getoption(\"slow\"),\n        args=['--s']\n    )\n
    "},{"location":"fixtures/pages/#fixtures.pages.get_context","title":"get_context(browser, request, start)","text":"

    \u0421\u043e\u0437\u0434\u0430\u0435\u0442 \u0438 \u043d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u0442 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0430.

    Parameters:

    Name Type Description Default browser Browser

    \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0430.

    required request FixtureRequest

    \u041e\u0431\u044a\u0435\u043a\u0442 \u0437\u0430\u043f\u0440\u043e\u0441\u0430 pytest.

    required start str

    \u0422\u0438\u043f \u0437\u0430\u043f\u0443\u0441\u043a\u0430 ('local' \u0438\u043b\u0438 'remote').

    required

    Returns:

    Name Type Description BrowserContext BrowserContext

    \u041d\u0430\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0439 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442.

    Source code in fixtures\\pages.py
    def get_context(browser: Browser, request: FixtureRequest, start: str) -> BrowserContext:\n    \"\"\"\u0421\u043e\u0437\u0434\u0430\u0435\u0442 \u0438 \u043d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u0442 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0430.\n\n    Args:\n        browser: \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0430.\n        request: \u041e\u0431\u044a\u0435\u043a\u0442 \u0437\u0430\u043f\u0440\u043e\u0441\u0430 pytest.\n        start: \u0422\u0438\u043f \u0437\u0430\u043f\u0443\u0441\u043a\u0430 ('local' \u0438\u043b\u0438 'remote').\n\n    Returns:\n        BrowserContext: \u041d\u0430\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0439 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442.\n    \"\"\"\n\n    if start == 'local':\n       # current_viewport = json.loads(request.config.getoption('--s'))\n\n        context = browser.new_context(\n            # no_viewport=True,\n            viewport= ast.literal_eval(request.config.getoption('--s')),\n            locale=request.config.getoption('l')\n        )\n        context.set_default_timeout(\n            timeout=request.config.getoption('t')\n        )\n        # \u041f\u0440\u0438\u043c\u0435\u0440 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043a\u0443\u043a (\u0437\u0430\u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043e)\n        # context.add_cookies([{'url': 'https://example.ru', 'name': 'ab_test', 'value': 'd'}])\n        return context\n\n    elif start == 'remote':\n        context = browser.new_context(\n            viewport=ast.literal_eval(request.config.getoption('--s')),\n            locale=request.config.getoption('l')\n        )\n        context.set_default_timeout(\n            timeout=request.config.getoption('t')\n        )\n        # \u041f\u0440\u0438\u043c\u0435\u0440 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043a\u0443\u043a (\u0437\u0430\u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043e)\n        # context.add_cookies([{'url': 'https://example.ru', 'name': 'ab_test', 'value': 'd'}])\n        return context\n
    "},{"location":"fixtures/pages/#fixtures.pages.get_firefox_browser","title":"get_firefox_browser(playwright, request)","text":"

    \u0421\u043e\u0437\u0434\u0430\u0435\u0442 \u0438 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 Firefox \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0430.

    Parameters:

    Name Type Description Default playwright Playwright

    \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 Playwright.

    required request FixtureRequest

    \u041e\u0431\u044a\u0435\u043a\u0442 \u0437\u0430\u043f\u0440\u043e\u0441\u0430 pytest.

    required

    Returns:

    Name Type Description Browser Browser

    \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 Firefox.

    Source code in fixtures\\pages.py
    def get_firefox_browser(playwright: Playwright, request: FixtureRequest) -> Browser:\n    \"\"\"\u0421\u043e\u0437\u0434\u0430\u0435\u0442 \u0438 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 Firefox \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0430.\n\n    Args:\n        playwright: \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 Playwright.\n        request: \u041e\u0431\u044a\u0435\u043a\u0442 \u0437\u0430\u043f\u0440\u043e\u0441\u0430 pytest.\n\n    Returns:\n        Browser: \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 Firefox.\n    \"\"\"\n\n    return playwright.firefox.launch(\n        headless=request.config.getoption(\"h\"),\n        slow_mo=request.config.getoption(\"slow\"),\n    )\n
    "},{"location":"fixtures/pages/#fixtures.pages.get_remote_chrome","title":"get_remote_chrome(playwright, request)","text":"

    \u0421\u043e\u0437\u0434\u0430\u0435\u0442 \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 Chrome \u0434\u043b\u044f \u0443\u0434\u0430\u043b\u0435\u043d\u043d\u043e\u0433\u043e \u0437\u0430\u043f\u0443\u0441\u043a\u0430.

    Parameters:

    Name Type Description Default playwright Playwright

    \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 Playwright.

    required request FixtureRequest

    \u041e\u0431\u044a\u0435\u043a\u0442 \u0437\u0430\u043f\u0440\u043e\u0441\u0430 pytest.

    required

    Returns:

    Name Type Description Browser Browser

    \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 Chrome \u0432 headless \u0440\u0435\u0436\u0438\u043c\u0435.

    Source code in fixtures\\pages.py
    def get_remote_chrome(playwright: Playwright, request: FixtureRequest) -> Browser:\n    \"\"\"\u0421\u043e\u0437\u0434\u0430\u0435\u0442 \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 Chrome \u0434\u043b\u044f \u0443\u0434\u0430\u043b\u0435\u043d\u043d\u043e\u0433\u043e \u0437\u0430\u043f\u0443\u0441\u043a\u0430.\n\n    Args:\n        playwright: \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 Playwright.\n        request: \u041e\u0431\u044a\u0435\u043a\u0442 \u0437\u0430\u043f\u0440\u043e\u0441\u0430 pytest.\n\n    Returns:\n        Browser: \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 Chrome \u0432 headless \u0440\u0435\u0436\u0438\u043c\u0435.\n    \"\"\"\n\n    return playwright.chromium.launch(\n        headless=True,\n        slow_mo=request.config.getoption(\"slow\")\n    )\n
    "},{"location":"fixtures/pages/#fixtures.pages.pytest_addoption","title":"pytest_addoption(parser)","text":"

    \u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u043e\u043f\u0446\u0438\u0438 \u043a\u043e\u043c\u0430\u043d\u0434\u043d\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438 \u0434\u043b\u044f \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0430.

    Parameters:

    Name Type Description Default parser Parser

    \u041f\u0430\u0440\u0441\u0435\u0440 pytest \u0434\u043b\u044f \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043e\u043f\u0446\u0438\u0439.

    required \u041e\u043f\u0446\u0438\u0438

    --bn: \u0411\u0440\u0430\u0443\u0437\u0435\u0440 (chrome, remote_chrome, firefox) --h: \u0420\u0435\u0436\u0438\u043c headless (True/False) --s: \u0420\u0430\u0437\u043c\u0435\u0440 \u043e\u043a\u043d\u0430 {'width': int, 'height': int} --slow: \u0417\u0430\u0434\u0435\u0440\u0436\u043a\u0430 \u043c\u0435\u0436\u0434\u0443 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f\u043c\u0438 (\u043c\u0441) --t: \u0422\u0430\u0439\u043c\u0430\u0443\u0442 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e (\u043c\u0441) --l: \u041b\u043e\u043a\u0430\u043b\u044c \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0430

    Source code in fixtures\\pages.py
    def pytest_addoption(parser: Parser):\n    \"\"\"\u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u043e\u043f\u0446\u0438\u0438 \u043a\u043e\u043c\u0430\u043d\u0434\u043d\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438 \u0434\u043b\u044f \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0430.\n\n    Args:\n        parser: \u041f\u0430\u0440\u0441\u0435\u0440 pytest \u0434\u043b\u044f \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043e\u043f\u0446\u0438\u0439.\n\n    \u041e\u043f\u0446\u0438\u0438:\n        --bn: \u0411\u0440\u0430\u0443\u0437\u0435\u0440 (chrome, remote_chrome, firefox)\n        --h: \u0420\u0435\u0436\u0438\u043c headless (True/False)\n        --s: \u0420\u0430\u0437\u043c\u0435\u0440 \u043e\u043a\u043d\u0430 {'width': int, 'height': int}\n        --slow: \u0417\u0430\u0434\u0435\u0440\u0436\u043a\u0430 \u043c\u0435\u0436\u0434\u0443 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f\u043c\u0438 (\u043c\u0441)\n        --t: \u0422\u0430\u0439\u043c\u0430\u0443\u0442 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e (\u043c\u0441)\n        --l: \u041b\u043e\u043a\u0430\u043b\u044c \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0430\n    \"\"\"\n\n    parser.addoption('--bn', action='store', default=\"chrome\",\n                   help=\"Choose browser: chrome, remote_chrome or firefox\")\n    parser.addoption('--h', action='store', default=False,\n                   help='Choose headless: True or False')\n    parser.addoption('--s', action='store', default=\"{'width': 1600, 'height': 900}\",\n                   help='Size window: width,height')\n    # \u0417\u0430\u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u0430\u043b\u044c\u0442\u0435\u0440\u043d\u0430\u0442\u0438\u0432\u043d\u044b\u0435 \u0440\u0430\u0437\u043c\u0435\u0440\u044b \u043e\u043a\u043e\u043d\n    # parser.addoption('--s', action='store', default=\"{'width': 1920, 'height': 1080}\",\n    #                 help='Size window: width,height')\n    # parser.addoption('--s', action='store', default=\"{'width': 1920, 'height': 300}\",\n    #                 help='Size window: width,height')\n    # parser.addoption('--s', action='store', default=\"{'width': 300, 'height': 420}\",\n    #               help='Size window: width,height')\n    parser.addoption('--slow', action='store', default=200,\n                   help='Choose slow_mo for robot action')\n    parser.addoption('--t', action='store', default=60000,\n                   help='Choose timeout')\n    parser.addoption('--l', action='store', default='ru-RU',\n                   help='Choose locale')\n
    "},{"location":"fixtures/pages/#fixtures.pages.return_back","title":"return_back(browser)","text":"

    \u0424\u0438\u043a\u0441\u0442\u0443\u0440\u0430 \u0434\u043b\u044f \u0432\u043e\u0437\u0432\u0440\u0430\u0442\u0430 \u043d\u0430 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0443\u044e \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0443.

    Parameters:

    Name Type Description Default browser Page

    \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0430.

    required Source code in fixtures\\pages.py
    @pytest.fixture(scope=\"function\")\ndef return_back(browser: Page):\n    \"\"\"\u0424\u0438\u043a\u0441\u0442\u0443\u0440\u0430 \u0434\u043b\u044f \u0432\u043e\u0437\u0432\u0440\u0430\u0442\u0430 \u043d\u0430 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0443\u044e \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0443.\n\n    Args:\n        browser: \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0430.\n    \"\"\"\n\n    browser.go_back()\n
    "},{"location":"locators/button_locators/","title":"ButtonLocators","text":"

    \u041c\u043e\u0434\u0443\u043b\u044c button_locators \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043b\u043e\u043a\u0430\u0442\u043e\u0440\u044b \u0434\u043b\u044f \u043a\u043d\u043e\u043f\u043e\u043a \u0438 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430.

    \u041a\u043b\u0430\u0441\u0441 ButtonLocators \u0445\u0440\u0430\u043d\u0438\u0442 XPath \u0438 CSS \u043b\u043e\u043a\u0430\u0442\u043e\u0440\u044b \u0434\u043b\u044f \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0441 \u043a\u043d\u043e\u043f\u043a\u0430\u043c\u0438 \u0438 \u0432\u0441\u043f\u043b\u044b\u0432\u0430\u044e\u0449\u0438\u043c\u0438 \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0430\u043c\u0438 \u0432 \u0442\u0435\u0441\u0442\u0430\u0445.

    "},{"location":"locators/button_locators/#locators.button_locators.ButtonLocators","title":"ButtonLocators","text":"

    \u041a\u043b\u0430\u0441\u0441 \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u043b\u043e\u043a\u0430\u0442\u043e\u0440\u043e\u0432 \u043a\u043d\u043e\u043f\u043e\u043a \u0438 \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u0445 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432.

    \u0421\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043b\u043e\u043a\u0430\u0442\u043e\u0440\u044b \u0432 \u0444\u043e\u0440\u043c\u0430\u0442\u0435 XPath \u0438 CSS \u0434\u043b\u044f \u043f\u043e\u0438\u0441\u043a\u0430 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432: - \u041a\u043d\u043e\u043f\u043a\u0430 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u043b\u0438\u0446\u0435\u043d\u0437\u0438\u0438 - \u0412\u0441\u043f\u043b\u044b\u0432\u0430\u044e\u0449\u0430\u044f \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0430 - \u041a\u043d\u043e\u043f\u043a\u0430 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u0441\u0435\u0441\u0441\u0438\u0438

    Source code in locators\\button_locators.py
    class ButtonLocators:\n    \"\"\"\u041a\u043b\u0430\u0441\u0441 \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u043b\u043e\u043a\u0430\u0442\u043e\u0440\u043e\u0432 \u043a\u043d\u043e\u043f\u043e\u043a \u0438 \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u0445 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432.\n\n    \u0421\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043b\u043e\u043a\u0430\u0442\u043e\u0440\u044b \u0432 \u0444\u043e\u0440\u043c\u0430\u0442\u0435 XPath \u0438 CSS \u0434\u043b\u044f \u043f\u043e\u0438\u0441\u043a\u0430 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432:\n    - \u041a\u043d\u043e\u043f\u043a\u0430 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u043b\u0438\u0446\u0435\u043d\u0437\u0438\u0438\n    - \u0412\u0441\u043f\u043b\u044b\u0432\u0430\u044e\u0449\u0430\u044f \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0430\n    - \u041a\u043d\u043e\u043f\u043a\u0430 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u0441\u0435\u0441\u0441\u0438\u0438\n    \"\"\"\n\n    BUTTON_LICENSE_UPDATE = \"//div[@class='scrollarea__footer']//button\"\n    TOOLTIP = \"//div[contains(@class,'v-tooltip__content menuable__content__active')]\"\n    BUTTON_DELETE_SESSION = \"button.v-btn--icon svg[fill='#4caf50']\"\n
    "},{"location":"locators/confirm_locators/","title":"ConfirmLocators","text":"

    \u041c\u043e\u0434\u0443\u043b\u044c confirm_locators \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043b\u043e\u043a\u0430\u0442\u043e\u0440\u044b \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0434\u0438\u0430\u043b\u043e\u0433\u043e\u0432 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u044f.

    \u041a\u043b\u0430\u0441\u0441 ConfirmLocators \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 XPath \u043b\u043e\u043a\u0430\u0442\u043e\u0440\u044b \u0434\u043b\u044f \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0441 \u0434\u0438\u0430\u043b\u043e\u0433\u043e\u0432\u044b\u043c\u0438 \u043e\u043a\u043d\u0430\u043c\u0438 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u044f \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439 \u0432 \u0442\u0435\u0441\u0442\u0430\u0445.

    "},{"location":"locators/confirm_locators/#locators.confirm_locators.ConfirmLocators","title":"ConfirmLocators","text":"

    \u041b\u043e\u043a\u0430\u0442\u043e\u0440\u044b \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0434\u0438\u0430\u043b\u043e\u0433\u043e\u0432 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u044f.

    \u0421\u043e\u0434\u0435\u0440\u0436\u0438\u0442 XPath \u043b\u043e\u043a\u0430\u0442\u043e\u0440\u044b \u0434\u043b\u044f

    CONFIRM (str): \u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0433\u043e \u0434\u0438\u0430\u043b\u043e\u0433\u043e\u0432\u043e\u0433\u043e \u043e\u043a\u043d\u0430. TITLE (str): \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430 \u0434\u0438\u0430\u043b\u043e\u0433\u043e\u0432\u043e\u0433\u043e \u043e\u043a\u043d\u0430. BUTTON_CLOSE (str): \u043a\u043d\u043e\u043f\u043a\u0438 \u0437\u0430\u043a\u0440\u044b\u0442\u0438\u044f \u0434\u0438\u0430\u043b\u043e\u0433\u0430. TEXT (str): \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u043e\u0433\u043e \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0433\u043e \u0434\u0438\u0430\u043b\u043e\u0433\u0430 (\u0444\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0438).

    Source code in locators\\confirm_locators.py
    class ConfirmLocators:\n    \"\"\"\u041b\u043e\u043a\u0430\u0442\u043e\u0440\u044b \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0434\u0438\u0430\u043b\u043e\u0433\u043e\u0432 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u044f.\n\n    \u0421\u043e\u0434\u0435\u0440\u0436\u0438\u0442 XPath \u043b\u043e\u043a\u0430\u0442\u043e\u0440\u044b \u0434\u043b\u044f:\n        CONFIRM (str): \u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0433\u043e \u0434\u0438\u0430\u043b\u043e\u0433\u043e\u0432\u043e\u0433\u043e \u043e\u043a\u043d\u0430.\n        TITLE (str): \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430 \u0434\u0438\u0430\u043b\u043e\u0433\u043e\u0432\u043e\u0433\u043e \u043e\u043a\u043d\u0430.\n        BUTTON_CLOSE (str): \u043a\u043d\u043e\u043f\u043a\u0438 \u0437\u0430\u043a\u0440\u044b\u0442\u0438\u044f \u0434\u0438\u0430\u043b\u043e\u0433\u0430.\n        TEXT (str): \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u043e\u0433\u043e \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0433\u043e \u0434\u0438\u0430\u043b\u043e\u0433\u0430 (\u0444\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0438).\n    \"\"\"\n\n    CONFIRM = \"//div[contains(@class, 'v-dialog--active')]\"\n    TITLE = \"//div[@class='v-card__title']/h3\"\n    BUTTON_CLOSE = \"//div[@class='vuedl-layout__closeBtn']\"\n    TEXT = f\"{CONFIRM}/div[2]/div[@class='v-card__text']\"\n
    "},{"location":"locators/event_panel_locators/","title":"EventPanelLocators","text":"

    \u041c\u043e\u0434\u0443\u043b\u044c event_panel_locators \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043b\u043e\u043a\u0430\u0442\u043e\u0440\u044b \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u043f\u0430\u043d\u0435\u043b\u0438 \u0441\u043e\u0431\u044b\u0442\u0438\u0439.

    \u041a\u043b\u0430\u0441\u0441 EventPanelLocators \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 XPath \u043b\u043e\u043a\u0430\u0442\u043e\u0440\u044b \u0434\u043b\u044f \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0441 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u043c\u0438 \u043f\u0430\u043d\u0435\u043b\u0438 \u0441\u043e\u0431\u044b\u0442\u0438\u0439 \u0432 \u0442\u0435\u0441\u0442\u0430\u0445.

    "},{"location":"locators/event_panel_locators/#locators.event_panel_locators.EventPanelLocators","title":"EventPanelLocators","text":"

    \u041b\u043e\u043a\u0430\u0442\u043e\u0440\u044b \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u043f\u0430\u043d\u0435\u043b\u0438 \u0441\u043e\u0431\u044b\u0442\u0438\u0439.

    \u0421\u043e\u0434\u0435\u0440\u0436\u0438\u0442 XPath \u043b\u043e\u043a\u0430\u0442\u043e\u0440\u044b \u0434\u043b\u044f: TABS_BLOCK (str): \u0431\u043b\u043e\u043a\u0430 \u043a\u043d\u043e\u043f\u043e\u043a \u0432 \u043f\u0430\u043d\u0435\u043b\u0438 \u0441\u043e\u0431\u044b\u0442\u0438\u0439. TAB_EXPAND_BUTTONS (str): \u0431\u043b\u043e\u043a\u0430 \u043a\u043d\u043e\u043f\u043e\u043a \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f \u043f\u0430\u043d\u0435\u043b\u0438 \u0441\u043e\u0431\u044b\u0442\u0438\u0439. TAB_STATES (str): \u043a\u043d\u043e\u043f\u043a\u0438 \u0421\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f. TAB_ACTIONS (str): \u043a\u043d\u043e\u043f\u043a\u0438 \u0414\u0435\u0439\u0441\u0442\u0432\u0438\u044f. TAB_EVENTS (str): \u043a\u043d\u043e\u043f\u043a\u0438 \u0421\u043e\u0431\u044b\u0442\u0438\u044f. TAB_MAINTENANCE (str): \u043a\u043d\u043e\u043f\u043a\u0438 \u041e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u043d\u0438\u044f. TAB_SYSTEM_LOG (str): \u043a\u043d\u043e\u043f\u043a\u0438 \u0421\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0439 \u0436\u0443\u0440\u043d\u0430\u043b. BUTTONS_EVENT (str): \u0431\u043b\u043e\u043a\u0430 \u043a\u043d\u043e\u043f\u043e\u043a-\u0441\u0447\u0435\u0442\u0447\u0438\u043a\u043e\u0432 \u0441\u043e\u0431\u044b\u0442\u0438\u0439. BUTTONS_SERVICE (str): \u0431\u043b\u043e\u043a\u0430 \u043a\u043d\u043e\u043f\u043e\u043a, \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0435\u0433\u043e \u043a\u043d\u043e\u043f\u043a\u0438 \u041f\u043e\u0438\u0441\u043a\u0430 \u0438 \u0422\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f. AREA_EVENTS (str): \u0440\u0430\u0431\u043e\u0447\u0435\u0439 \u043e\u0431\u043b\u0430\u0441\u0442\u0438 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b.

    Source code in locators\\event_panel_locators.py
    class EventPanelLocators:\n    \"\"\"\u041b\u043e\u043a\u0430\u0442\u043e\u0440\u044b \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u043f\u0430\u043d\u0435\u043b\u0438 \u0441\u043e\u0431\u044b\u0442\u0438\u0439.\n\n    \u0421\u043e\u0434\u0435\u0440\u0436\u0438\u0442 XPath \u043b\u043e\u043a\u0430\u0442\u043e\u0440\u044b \u0434\u043b\u044f:\n    TABS_BLOCK (str): \u0431\u043b\u043e\u043a\u0430 \u043a\u043d\u043e\u043f\u043e\u043a \u0432 \u043f\u0430\u043d\u0435\u043b\u0438 \u0441\u043e\u0431\u044b\u0442\u0438\u0439.\n    TAB_EXPAND_BUTTONS (str): \u0431\u043b\u043e\u043a\u0430 \u043a\u043d\u043e\u043f\u043e\u043a \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f \u043f\u0430\u043d\u0435\u043b\u0438 \u0441\u043e\u0431\u044b\u0442\u0438\u0439.\n    TAB_STATES (str): \u043a\u043d\u043e\u043f\u043a\u0438 \u0421\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f.\n    TAB_ACTIONS (str): \u043a\u043d\u043e\u043f\u043a\u0438 \u0414\u0435\u0439\u0441\u0442\u0432\u0438\u044f.\n    TAB_EVENTS (str): \u043a\u043d\u043e\u043f\u043a\u0438 \u0421\u043e\u0431\u044b\u0442\u0438\u044f.\n    TAB_MAINTENANCE (str): \u043a\u043d\u043e\u043f\u043a\u0438 \u041e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u043d\u0438\u044f.\n    TAB_SYSTEM_LOG (str): \u043a\u043d\u043e\u043f\u043a\u0438 \u0421\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0439 \u0436\u0443\u0440\u043d\u0430\u043b.\n    BUTTONS_EVENT (str): \u0431\u043b\u043e\u043a\u0430 \u043a\u043d\u043e\u043f\u043e\u043a-\u0441\u0447\u0435\u0442\u0447\u0438\u043a\u043e\u0432 \u0441\u043e\u0431\u044b\u0442\u0438\u0439.\n    BUTTONS_SERVICE (str): \u0431\u043b\u043e\u043a\u0430 \u043a\u043d\u043e\u043f\u043e\u043a, \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0435\u0433\u043e \u043a\u043d\u043e\u043f\u043a\u0438 \u041f\u043e\u0438\u0441\u043a\u0430 \u0438 \u0422\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\n    AREA_EVENTS (str): \u0440\u0430\u0431\u043e\u0447\u0435\u0439 \u043e\u0431\u043b\u0430\u0441\u0442\u0438 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b.\n    \"\"\"\n\n    TABS_BLOCK = \"//nav/div[@class='v-toolbar__content']/div[@class='v-toolbar__items'][1]\"\n    TAB_EXPAND_BUTTONS = f\"{TABS_BLOCK}/div[1]/div[1]/div\"\n    TAB_STATES = f\"{TABS_BLOCK}//div[@class='v-tabs']//div[@class='v-tabs__container']/div[2]\"\n    TAB_ACTIONS = f\"{TABS_BLOCK}//div[@class='v-tabs']//div[@class='v-tabs__container']/div[3]\"\n    TAB_EVENTS = f\"{TABS_BLOCK}//div[@class='v-tabs']//div[@class='v-tabs__container']/div[4]\"\n    TAB_MAINTENANCE = f\"{TABS_BLOCK}//div[@class='v-tabs']//div[@class='v-tabs__container']/div[5]\"\n    TAB_SYSTEM_LOG = f\"{TABS_BLOCK}//div[@class='v-tabs']//div[@class='v-tabs__container']/div[6]\"\n\n    BUTTONS_EVENT = \"//nav/div[@class='v-toolbar__content']/div[@class='v-toolbar__items'][2]//span[contains(@class, 'v-tooltip')]\"\n    BUTTONS_SERVICE = \"//nav/div[@class='v-toolbar__content']/div[@class='v-toolbar__items'][2]\"\n\n    AREA_EVENTS = \"#app > div.application--wrap > div > div:nth-child(3)\"\n
    "},{"location":"locators/input_locators/","title":"InputLocators","text":"

    \u041c\u043e\u0434\u0443\u043b\u044c input_locators \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043b\u043e\u043a\u0430\u0442\u043e\u0440\u044b \u043f\u043e\u043b\u0435\u0439 \u0432\u0432\u043e\u0434\u0430 \u043d\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435.

    \u041a\u043b\u0430\u0441\u0441 InputLocators \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 XPath \u043b\u043e\u043a\u0430\u0442\u043e\u0440\u044b \u0434\u043b\u044f \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0441 \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u044b\u043c\u0438 \u043f\u043e\u043b\u044f\u043c\u0438 \u0432\u0432\u043e\u0434\u0430 \u0432 \u0442\u0435\u0441\u0442\u0430\u0445.

    "},{"location":"locators/input_locators/#locators.input_locators.InputLocators","title":"InputLocators","text":"

    \u041b\u043e\u043a\u0430\u0442\u043e\u0440\u044b \u0434\u043b\u044f \u043f\u043e\u043b\u0435\u0439 \u0432\u0432\u043e\u0434\u0430 \u043d\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435.

    \u0421\u043e\u0434\u0435\u0440\u0436\u0438\u0442 XPath \u043b\u043e\u043a\u0430\u0442\u043e\u0440\u044b \u0434\u043b\u044f: LICENSE_ID_UPDATE (str): \u043f\u043e\u043b\u044f \u0432\u0432\u043e\u0434\u0430 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u0430 \u043b\u0438\u0446\u0435\u043d\u0437\u0438\u0438 \u0432 \u043f\u043e\u0434\u0432\u0430\u043b\u0435

    Source code in locators\\input_locators.py
    class InputLocators:\n    \"\"\"\u041b\u043e\u043a\u0430\u0442\u043e\u0440\u044b \u0434\u043b\u044f \u043f\u043e\u043b\u0435\u0439 \u0432\u0432\u043e\u0434\u0430 \u043d\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435.\n\n\n    \u0421\u043e\u0434\u0435\u0440\u0436\u0438\u0442 XPath \u043b\u043e\u043a\u0430\u0442\u043e\u0440\u044b \u0434\u043b\u044f:\n    LICENSE_ID_UPDATE (str): \u043f\u043e\u043b\u044f \u0432\u0432\u043e\u0434\u0430 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u0430 \u043b\u0438\u0446\u0435\u043d\u0437\u0438\u0438 \u0432 \u043f\u043e\u0434\u0432\u0430\u043b\u0435\n\n\n\n\n    \"\"\"\n\n    LICENSE_ID_UPDATE = \"//div[@class='scrollarea__footer']//div[@class='v-input__control']//textarea\"\n
    "},{"location":"locators/json_container_locators/","title":"JsonContainerLocators","text":"

    \u041c\u043e\u0434\u0443\u043b\u044c json_container_locators \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043b\u043e\u043a\u0430\u0442\u043e\u0440\u044b \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u043e\u0432 JSON-\u0434\u0430\u043d\u043d\u044b\u0445.

    \u041a\u043b\u0430\u0441\u0441 JsonContainerLocators \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 XPath \u043b\u043e\u043a\u0430\u0442\u043e\u0440\u044b \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430\u043c\u0438 JSON-\u0434\u0430\u043d\u043d\u044b\u0445 \u043d\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435.

    "},{"location":"locators/json_container_locators/#locators.json_container_locators.JsonContainerLocators","title":"JsonContainerLocators","text":"

    \u041b\u043e\u043a\u0430\u0442\u043e\u0440\u044b \u0434\u043b\u044f \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u043e\u0432 JSON-\u0434\u0430\u043d\u043d\u044b\u0445 \u043d\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435.

    \u0421\u043e\u0434\u0435\u0440\u0436\u0438\u0442 XPath \u043b\u043e\u043a\u0430\u0442\u043e\u0440\u044b \u0434\u043b\u044f: CONTAINER (str): \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0433\u043e \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430 JSON-\u0434\u0430\u043d\u043d\u044b\u0445 SCROLL_CONTAINER (str): \u043f\u0440\u043e\u043a\u0440\u0443\u0447\u0438\u0432\u0430\u0435\u043c\u043e\u0439 \u043e\u0431\u043b\u0430\u0441\u0442\u0438 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430

    Source code in locators\\json_container_locators.py
    class JsonContainerLocators:\n    \"\"\"\u041b\u043e\u043a\u0430\u0442\u043e\u0440\u044b \u0434\u043b\u044f \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u043e\u0432 JSON-\u0434\u0430\u043d\u043d\u044b\u0445 \u043d\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435.\n\n    \u0421\u043e\u0434\u0435\u0440\u0436\u0438\u0442 XPath \u043b\u043e\u043a\u0430\u0442\u043e\u0440\u044b \u0434\u043b\u044f:\n    CONTAINER (str): \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0433\u043e \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430 JSON-\u0434\u0430\u043d\u043d\u044b\u0445\n    SCROLL_CONTAINER (str): \u043f\u0440\u043e\u043a\u0440\u0443\u0447\u0438\u0432\u0430\u0435\u043c\u043e\u0439 \u043e\u0431\u043b\u0430\u0441\u0442\u0438 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430\n    \"\"\"\n\n    CONTAINER = \"//div[contains(@class,'jv-container')]\"\n    SCROLL_CONTAINER = \"//div[contains(@class, 'scrollarea__body')]\"\n
    "},{"location":"locators/modal_window_locators/","title":"ModalWindowLocators","text":"

    \u041c\u043e\u0434\u0443\u043b\u044c modal_window_locators \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043b\u043e\u043a\u0430\u0442\u043e\u0440\u044b \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u044b\u0445 \u043e\u043a\u043e\u043d.

    \u041a\u043b\u0430\u0441\u0441 ModalWindowLocators \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 XPath \u043b\u043e\u043a\u0430\u0442\u043e\u0440\u044b \u0434\u043b\u044f \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0441 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u043c\u0438 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u044b\u0445 \u043e\u043a\u043e\u043d \u0432 \u0442\u0435\u0441\u0442\u0430\u0445.

    "},{"location":"locators/modal_window_locators/#locators.modal_window_locators.ModalWindowLocators","title":"ModalWindowLocators","text":"

    \u041b\u043e\u043a\u0430\u0442\u043e\u0440\u044b \u0434\u043b\u044f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u044b\u0445 \u043e\u043a\u043e\u043d.

    \u0421\u043e\u0434\u0435\u0440\u0436\u0438\u0442 XPath \u043b\u043e\u043a\u0430\u0442\u043e\u0440\u044b \u0434\u043b\u044f: MODAL_WINDOW (str): \u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0433\u043e \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430 INPUT_FORM_USER_DATA (str): \u0444\u043e\u0440\u043c\u044b \u0432\u0432\u043e\u0434\u0430 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 TEXT_FIELD_INPUT_FORM_USER_DATA (str): \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u043b\u044f \u0432\u0432\u043e\u0434\u0430 MENU_INPUT_FORM_USER_DATA (str): \u043c\u0435\u043d\u044e \u0432\u044b\u0431\u043e\u0440\u0430 \u0440\u043e\u043b\u0435\u0439 LABEL_INPUT_FORM_USER_DATA (str): \u043c\u0435\u0442\u043a\u0438 \u043f\u043e\u043b\u044f \u0432\u0432\u043e\u0434\u0430 MODAL_WINDOW_SCROLL_CONTAINER (str): \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430 \u0441 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u043e\u0439 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430

    Source code in locators\\modal_window_locators.py
    class ModalWindowLocators:\n    \"\"\"\u041b\u043e\u043a\u0430\u0442\u043e\u0440\u044b \u0434\u043b\u044f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u044b\u0445 \u043e\u043a\u043e\u043d.\n\n    \u0421\u043e\u0434\u0435\u0440\u0436\u0438\u0442 XPath \u043b\u043e\u043a\u0430\u0442\u043e\u0440\u044b \u0434\u043b\u044f:\n    MODAL_WINDOW (str): \u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0433\u043e \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430\n    INPUT_FORM_USER_DATA (str): \u0444\u043e\u0440\u043c\u044b \u0432\u0432\u043e\u0434\u0430 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0445 \u0434\u0430\u043d\u043d\u044b\u0445\n    TEXT_FIELD_INPUT_FORM_USER_DATA (str): \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u043b\u044f \u0432\u0432\u043e\u0434\u0430\n    MENU_INPUT_FORM_USER_DATA (str): \u043c\u0435\u043d\u044e \u0432\u044b\u0431\u043e\u0440\u0430 \u0440\u043e\u043b\u0435\u0439\n    LABEL_INPUT_FORM_USER_DATA (str): \u043c\u0435\u0442\u043a\u0438 \u043f\u043e\u043b\u044f \u0432\u0432\u043e\u0434\u0430\n    MODAL_WINDOW_SCROLL_CONTAINER (str): \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430 \u0441 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u043e\u0439 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430\n    \"\"\"\n\n    MODAL_WINDOW = \"//div[contains(@class, 'v-dialog--active')]\"\n    MODAL_WINDOW_SCROLL_CONTAINER = f\"{MODAL_WINDOW}//div[contains(@class, 'scrollarea__body')]\"\n\n\n    INPUT_FORM_USER_DATA = \"//form[@class='v-form']\"\n    TEXT_FIELD_INPUT_FORM_USER_DATA = \"xpath=div[2]/div/div/div/div/input\"\n    MENU_INPUT_FORM_USER_DATA = \"//div[contains(@class, 'menuable__content__active')]\"\n    LABEL_INPUT_FORM_USER_DATA = \"//label[contains(@class,'v-label')]/span\"\n
    "},{"location":"locators/navigation_panel_locators/","title":"NavigationPanelLocators","text":"

    \u041c\u043e\u0434\u0443\u043b\u044c navigation_panel_locators \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043b\u043e\u043a\u0430\u0442\u043e\u0440\u044b \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u043e\u043d\u043d\u043e\u0439 \u043f\u0430\u043d\u0435\u043b\u0438.

    \u041a\u043b\u0430\u0441\u0441 NavigationPanelLocators \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 XPath \u043b\u043e\u043a\u0430\u0442\u043e\u0440\u044b \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u043c\u0438 \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u043e\u043d\u043d\u043e\u0439 \u043f\u0430\u043d\u0435\u043b\u0438 \u0432 \u0442\u0435\u0441\u0442\u0430\u0445.

    "},{"location":"locators/navigation_panel_locators/#locators.navigation_panel_locators.NavigationPanelLocators","title":"NavigationPanelLocators","text":"

    \u041b\u043e\u043a\u0430\u0442\u043e\u0440\u044b \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u043e\u043d\u043d\u043e\u0439 \u043f\u0430\u043d\u0435\u043b\u0438.

    \u0421\u043e\u0434\u0435\u0440\u0436\u0438\u0442 XPath \u043b\u043e\u043a\u0430\u0442\u043e\u0440\u044b \u0434\u043b\u044f: PANEL_MAIN (str): \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u043f\u0430\u043d\u0435\u043b\u0438 \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438 PANEL_SCROLL_CONTAINER (str): \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430 \u0441 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u043e\u0439 ACTIVE_CONTAINER(str): \u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0433\u043e \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430, \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0435\u0433\u043e \u043e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u043c\u044b\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u043f\u0430\u043d\u0435\u043b\u0438 \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438 TREEVIEW(str): \u043a\u043e\u0440\u043d\u044f \u043e\u0431\u044a\u0435\u043a\u0442\u0430 v-treeview NODE(str): \u0443\u0437\u043b\u0430 \u0434\u0435\u0440\u0435\u0432\u0430 NODE_ROOT (str): \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0433\u043e \u0443\u0437\u043b\u0430 \u0434\u0435\u0440\u0435\u0432\u0430 NODE_CHILDREN (str): \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0445 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0443\u0437\u043b\u0430 TOGGLE_BUTTON(str): \u043a\u043d\u043e\u043f\u043a\u0438 \u0440\u0430\u0441\u043a\u0440\u044b\u0442\u0438\u044f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u043f\u0430\u043d\u0435\u043b\u0438 \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438

    Source code in locators\\navigation_panel_locators.py
    class NavigationPanelLocators:\n    \"\"\"\u041b\u043e\u043a\u0430\u0442\u043e\u0440\u044b \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u043e\u043d\u043d\u043e\u0439 \u043f\u0430\u043d\u0435\u043b\u0438.\n\n    \u0421\u043e\u0434\u0435\u0440\u0436\u0438\u0442 XPath \u043b\u043e\u043a\u0430\u0442\u043e\u0440\u044b \u0434\u043b\u044f:\n    PANEL_MAIN (str): \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u043f\u0430\u043d\u0435\u043b\u0438 \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438\n    PANEL_SCROLL_CONTAINER (str): \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430 \u0441 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u043e\u0439\n    ACTIVE_CONTAINER(str): \u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0433\u043e \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430, \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0435\u0433\u043e \u043e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u043c\u044b\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u043f\u0430\u043d\u0435\u043b\u0438 \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438\n    TREEVIEW(str): \u043a\u043e\u0440\u043d\u044f \u043e\u0431\u044a\u0435\u043a\u0442\u0430 v-treeview\n    NODE(str): \u0443\u0437\u043b\u0430 \u0434\u0435\u0440\u0435\u0432\u0430\n    NODE_ROOT (str): \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0433\u043e \u0443\u0437\u043b\u0430 \u0434\u0435\u0440\u0435\u0432\u0430\n    NODE_CHILDREN (str): \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0445 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0443\u0437\u043b\u0430\n    TOGGLE_BUTTON(str): \u043a\u043d\u043e\u043f\u043a\u0438 \u0440\u0430\u0441\u043a\u0440\u044b\u0442\u0438\u044f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u043f\u0430\u043d\u0435\u043b\u0438 \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438\n    \"\"\"\n\n    PANEL_MAIN = \"//ul[contains(@class, 'v-expansion-panel')]\"\n    PANEL_SCROLL_CONTAINER = \"//div[contains(@class, 'scrollarea__body') and .//ul[contains(@class, 'v-expansion-panel')]]\"\n\n    ACTIVE_CONTAINER = \"//li[contains(@class, 'v-expansion-panel__container--active')]\"\n    SUB_PANEL_MAIN = \"//div[contains(@class,'v-expansion-panel__body')]\"\n\n    TREEVIEW = \"//div[contains(@class,'v-treeview')]\"\n    NODE = \"//div[contains(@class,'v-treeview-node')]\"\n    NODE_ROOT = \"//div[contains(@class,'v-treeview-node__root')]\"\n    NODE_CHILDREN = \"//div[contains(@class,'v-treeview-node__children')]\"\n    TOGGLE_BUTTON = \"//i[contains(@class,'v-treeview-node__toggle')]\"\n
    "},{"location":"locators/table_locators/","title":"TableLocators","text":"

    \u041c\u043e\u0434\u0443\u043b\u044c table_locators \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043b\u043e\u043a\u0430\u0442\u043e\u0440\u044b \u0442\u0430\u0431\u043b\u0438\u0447\u043d\u044b\u0445 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432.

    \u041a\u043b\u0430\u0441\u0441 TableLocators \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 XPath \u043b\u043e\u043a\u0430\u0442\u043e\u0440\u044b \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0442\u0430\u0431\u043b\u0438\u0446\u0430\u043c\u0438 \u0432 \u0440\u0430\u0431\u043e\u0447\u0435\u0439 \u043e\u0431\u043b\u0430\u0441\u0442\u0438 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f.

    "},{"location":"locators/table_locators/#locators.table_locators.TableLocators","title":"TableLocators","text":"

    \u041b\u043e\u043a\u0430\u0442\u043e\u0440\u044b \u0434\u043b\u044f \u0442\u0430\u0431\u043b\u0438\u0447\u043d\u044b\u0445 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0432 \u0440\u0430\u0431\u043e\u0447\u0435\u0439 \u043e\u0431\u043b\u0430\u0441\u0442\u0438.

    \u0421\u043e\u0434\u0435\u0440\u0436\u0438\u0442 XPath \u043b\u043e\u043a\u0430\u0442\u043e\u0440\u044b \u0434\u043b\u044f: TABLE_WORK_AREA (str): \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0432 \u0440\u0430\u0431\u043e\u0447\u0435\u0439 \u043e\u0431\u043b\u0430\u0441\u0442\u0438 TABLE_SCROLL_CONTAINER (str): \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430 \u0441 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u043e\u0439 \u0442\u0430\u0431\u043b\u0438\u0446\u044b

    Source code in locators\\table_locators.py
    class TableLocators:\n    \"\"\"\u041b\u043e\u043a\u0430\u0442\u043e\u0440\u044b \u0434\u043b\u044f \u0442\u0430\u0431\u043b\u0438\u0447\u043d\u044b\u0445 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0432 \u0440\u0430\u0431\u043e\u0447\u0435\u0439 \u043e\u0431\u043b\u0430\u0441\u0442\u0438.\n\n    \u0421\u043e\u0434\u0435\u0440\u0436\u0438\u0442 XPath \u043b\u043e\u043a\u0430\u0442\u043e\u0440\u044b \u0434\u043b\u044f:\n    TABLE_WORK_AREA (str): \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0432 \u0440\u0430\u0431\u043e\u0447\u0435\u0439 \u043e\u0431\u043b\u0430\u0441\u0442\u0438\n    TABLE_SCROLL_CONTAINER (str): \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430 \u0441 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u043e\u0439 \u0442\u0430\u0431\u043b\u0438\u0446\u044b\n    \"\"\"\n\n    TABLE_WORK_AREA = \"//div[@class='scrollarea__body']/div/div/div/table\"\n    TABLE_SCROLL_CONTAINER = \"//div[contains(@class, 'scrollarea__body') and .//table[@class='scrolltable__container']]//tbody\"\n
    "},{"location":"locators/text_input_locators/","title":"TextInputLocators","text":"

    \u041c\u043e\u0434\u0443\u043b\u044c text_input_locators \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043b\u043e\u043a\u0430\u0442\u043e\u0440\u044b \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0432\u0432\u043e\u0434\u0430 \u0442\u0435\u043a\u0441\u0442\u0430.

    \u041a\u043b\u0430\u0441\u0441 TextInputLocators \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 XPath \u043b\u043e\u043a\u0430\u0442\u043e\u0440\u044b \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u043c\u0438 \u0432\u0432\u043e\u0434\u0430 \u0442\u0435\u043a\u0441\u0442\u0430 \u043d\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0430\u0445 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f.

    "},{"location":"locators/text_input_locators/#locators.text_input_locators.TextInputLocators","title":"TextInputLocators","text":"

    \u041b\u043e\u043a\u0430\u0442\u043e\u0440\u044b \u0434\u043b\u044f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0432\u0432\u043e\u0434\u0430 \u0442\u0435\u043a\u0441\u0442\u0430.

    \u0421\u043e\u0434\u0435\u0440\u0436\u0438\u0442 XPath \u043b\u043e\u043a\u0430\u0442\u043e\u0440\u044b \u0434\u043b\u044f: INPUT_FORM_MESSAGE (str): \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f-\u043f\u0440\u0435\u0434\u0443\u043f\u0440\u0435\u0436\u0434\u0435\u043d\u0438\u044f \u043f\u043e\u043b\u044f \u0444\u043e\u0440\u043c\u044b \u0432\u0432\u043e\u0434\u0430

    Source code in locators\\text_input_locators.py
    class TextInputLocators:\n    \"\"\"\u041b\u043e\u043a\u0430\u0442\u043e\u0440\u044b \u0434\u043b\u044f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0432\u0432\u043e\u0434\u0430 \u0442\u0435\u043a\u0441\u0442\u0430.\n\n    \u0421\u043e\u0434\u0435\u0440\u0436\u0438\u0442 XPath \u043b\u043e\u043a\u0430\u0442\u043e\u0440\u044b \u0434\u043b\u044f:\n    INPUT_FORM_MESSAGE (str): \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f-\u043f\u0440\u0435\u0434\u0443\u043f\u0440\u0435\u0436\u0434\u0435\u043d\u0438\u044f \u043f\u043e\u043b\u044f \u0444\u043e\u0440\u043c\u044b \u0432\u0432\u043e\u0434\u0430\n    \"\"\"\n\n    INPUT_FORM_MESSAGE = \"//div[contains(@class,'v-messages__message')]\"\n    ICON_PASSWORD_HIDING = \"//i[contains(@class,'v-icon')]\"\n
    "},{"location":"locators/text_locators/","title":"TextLocators","text":"

    \u041c\u043e\u0434\u0443\u043b\u044c text_locators \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043b\u043e\u043a\u0430\u0442\u043e\u0440\u044b \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u044b\u0445 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432.

    \u041a\u043b\u0430\u0441\u0441 TextLocators \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 XPath \u043b\u043e\u043a\u0430\u0442\u043e\u0440\u044b \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u044b\u043c\u0438 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u043c\u0438 \u043d\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0430\u0445 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f.

    "},{"location":"locators/text_locators/#locators.text_locators.TextLocators","title":"TextLocators","text":"

    \u041b\u043e\u043a\u0430\u0442\u043e\u0440\u044b \u0434\u043b\u044f \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u044b\u0445 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u043d\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435.

    \u0421\u043e\u0434\u0435\u0440\u0436\u0438\u0442 XPath \u043b\u043e\u043a\u0430\u0442\u043e\u0440\u044b \u0434\u043b\u044f: TITLE_LICENSE_INPUT_FORM (str): \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430 \u0444\u043e\u0440\u043c\u044b \u0432\u0432\u043e\u0434\u0430 \u043b\u0438\u0446\u0435\u043d\u0437\u0438\u0438 LICENSE_ID (str): \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0435\u043c\u043e\u0433\u043e ID \u043b\u0438\u0446\u0435\u043d\u0437\u0438\u0438 (\u0432\u044b\u0434\u0435\u043b\u044f\u0435\u043c\u044b\u0439 \u0442\u0435\u043a\u0441\u0442)

    Source code in locators\\text_locators.py
    class TextLocators:\n    \"\"\"\u041b\u043e\u043a\u0430\u0442\u043e\u0440\u044b \u0434\u043b\u044f \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u044b\u0445 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u043d\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435.\n\n    \u0421\u043e\u0434\u0435\u0440\u0436\u0438\u0442 XPath \u043b\u043e\u043a\u0430\u0442\u043e\u0440\u044b \u0434\u043b\u044f:\n    TITLE_LICENSE_INPUT_FORM (str): \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430 \u0444\u043e\u0440\u043c\u044b \u0432\u0432\u043e\u0434\u0430 \u043b\u0438\u0446\u0435\u043d\u0437\u0438\u0438\n    LICENSE_ID (str): \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0435\u043c\u043e\u0433\u043e ID \u043b\u0438\u0446\u0435\u043d\u0437\u0438\u0438 (\u0432\u044b\u0434\u0435\u043b\u044f\u0435\u043c\u044b\u0439 \u0442\u0435\u043a\u0441\u0442)\n    \"\"\"\n\n    TITLE_LICENSE_INPUT_FORM = \"//span[@class='title']\"\n    LICENSE_ID = \"//span[@class='title text_select']\"\n
    "},{"location":"locators/toolbar_locators/","title":"ToolbarLocators","text":"

    \u041c\u043e\u0434\u0443\u043b\u044c toolbar_locators \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043b\u043e\u043a\u0430\u0442\u043e\u0440\u044b \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u043f\u0430\u043d\u0435\u043b\u0438 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432.

    \u041a\u043b\u0430\u0441\u0441 ToolbarLocators \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 XPath \u043b\u043e\u043a\u0430\u0442\u043e\u0440\u044b \u0434\u043b\u044f \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0441 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u043c\u0438 \u0442\u0443\u043b\u0431\u0430\u0440\u0430 \u0438 \u0432\u0441\u043f\u043b\u044b\u0432\u0430\u044e\u0449\u0438\u043c\u0438 \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0430\u043c\u0438.

    "},{"location":"locators/toolbar_locators/#locators.toolbar_locators.ToolbarLocators","title":"ToolbarLocators","text":"

    \u041b\u043e\u043a\u0430\u0442\u043e\u0440\u044b \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u043f\u0430\u043d\u0435\u043b\u0438 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432 (\u0442\u0443\u043b\u0431\u0430\u0440\u0430).

    \u0421\u043e\u0434\u0435\u0440\u0436\u0438\u0442 XPath \u043b\u043e\u043a\u0430\u0442\u043e\u0440\u044b \u0434\u043b\u044f: TITLE (str): \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430 \u0442\u0443\u043b\u0431\u0430\u0440\u0430 TOOLTIP (str): \u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0439 \u0432\u0441\u043f\u043b\u044b\u0432\u0430\u044e\u0449\u0435\u0439 \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0438

    Source code in locators\\toolbar_locators.py
    class ToolbarLocators:\n    \"\"\"\u041b\u043e\u043a\u0430\u0442\u043e\u0440\u044b \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u043f\u0430\u043d\u0435\u043b\u0438 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432 (\u0442\u0443\u043b\u0431\u0430\u0440\u0430).\n\n    \u0421\u043e\u0434\u0435\u0440\u0436\u0438\u0442 XPath \u043b\u043e\u043a\u0430\u0442\u043e\u0440\u044b \u0434\u043b\u044f:\n    TITLE (str): \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430 \u0442\u0443\u043b\u0431\u0430\u0440\u0430\n\tTOOLTIP (str): \u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0439 \u0432\u0441\u043f\u043b\u044b\u0432\u0430\u044e\u0449\u0435\u0439 \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0438\n    \"\"\"\n\n    TITLE = \"//nav//div[contains(@class, 'v-toolbar__title')]\"\n    TOOLTIP = \"//div[contains(@class,'v-tooltip__content menuable__content__active')]\"\n
    "},{"location":"locators/user_card_locators/","title":"UserCardLocators","text":"

    \u041c\u043e\u0434\u0443\u043b\u044c user_card_locators \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043b\u043e\u043a\u0430\u0442\u043e\u0440\u044b \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u043a\u0430\u0440\u0442\u043e\u0447\u043a\u0438 \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.

    \u041a\u043b\u0430\u0441\u0441 UserCardLocators \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 XPath \u043b\u043e\u043a\u0430\u0442\u043e\u0440\u044b \u0434\u043b\u044f \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0441 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u043c\u0438 \u043a\u0430\u0440\u0442\u043e\u0447\u043a\u0438 \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.

    "},{"location":"locators/user_card_locators/#locators.user_card_locators.UserCardLocators","title":"UserCardLocators","text":"

    \u041b\u043e\u043a\u0430\u0442\u043e\u0440\u044b \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u043a\u0430\u0440\u0442\u043e\u0447\u043a\u0438 \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.

    \u0421\u043e\u0434\u0435\u0440\u0436\u0438\u0442 XPath \u043b\u043e\u043a\u0430\u0442\u043e\u0440\u044b \u0434\u043b\u044f: CARD_USER (str): \u043a\u0430\u0440\u0442\u043e\u0447\u043a\u0438 \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f. DIALOG_USER_SETTINGS (str): \u043e\u043a\u043d\u0430 \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0430 \u0441\u0435\u0441\u0441\u0438\u043e\u043d\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439. HEADER_DIALOG_USER_SETTINGS (str): \u0441\u0442\u0440\u043e\u043a\u0438 \u0441 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u043e\u043c \u043e\u043a\u043d\u0430 \u0438 \u043a\u043d\u043e\u043f\u043a\u043e\u0439 \u0437\u0430\u043a\u0440\u044b\u0442\u0438\u044f. TITLE_DIALOG_USER_SETTINGS (str): \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430 \u043e\u043a\u043d\u0430. TABLE_WORK_AREA (str): \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0441 \u0441\u0435\u0441\u0441\u0438\u043e\u043d\u043d\u044b\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439.

    Source code in locators\\user_card_locators.py
    class UserCardLocators:\n    \"\"\"\u041b\u043e\u043a\u0430\u0442\u043e\u0440\u044b \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u043a\u0430\u0440\u0442\u043e\u0447\u043a\u0438 \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\n\n    \u0421\u043e\u0434\u0435\u0440\u0436\u0438\u0442 XPath \u043b\u043e\u043a\u0430\u0442\u043e\u0440\u044b \u0434\u043b\u044f:\n    CARD_USER (str): \u043a\u0430\u0440\u0442\u043e\u0447\u043a\u0438 \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\n    DIALOG_USER_SETTINGS (str): \u043e\u043a\u043d\u0430 \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0430 \u0441\u0435\u0441\u0441\u0438\u043e\u043d\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439.\n    HEADER_DIALOG_USER_SETTINGS (str): \u0441\u0442\u0440\u043e\u043a\u0438 \u0441 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u043e\u043c \u043e\u043a\u043d\u0430 \u0438 \u043a\u043d\u043e\u043f\u043a\u043e\u0439 \u0437\u0430\u043a\u0440\u044b\u0442\u0438\u044f.\n    TITLE_DIALOG_USER_SETTINGS (str): \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430 \u043e\u043a\u043d\u0430.\n    TABLE_WORK_AREA (str): \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0441 \u0441\u0435\u0441\u0441\u0438\u043e\u043d\u043d\u044b\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439.\n    \"\"\"\n\n    CARD_USER = \"//div[@class='v-card__text']\"\n\n    DIALOG_USER_SETTINGS = \"//div[@class='dialog-drag']\"\n    HEADER_DIALOG_USER_SETTINGS = \"xpath=/div[@class='dialog-header']\"\n    TITLE_DIALOG_USER_SETTINGS = \"xpath=/div[@class='dialog-header']/div[@class='title']\"\n    TABLE_WORK_AREA = \"//div[@class='dialog-body']//table\"\n
    "},{"location":"pages/base_page/","title":"BasePage","text":"

    \u0411\u0430\u0437\u043e\u0432\u044b\u0439 \u043a\u043b\u0430\u0441\u0441 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 Playwright.

    \u0421\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043e\u0431\u0449\u0438\u0435 \u043c\u0435\u0442\u043e\u0434\u044b \u0434\u043b\u044f \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0441\u043e \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435\u0439 \u0438 API.

    "},{"location":"pages/base_page/#pages.base_page.BasePage","title":"BasePage","text":"

    \u0411\u0430\u0437\u043e\u0432\u044b\u0439 \u043a\u043b\u0430\u0441\u0441 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441\u043e \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0430\u043c\u0438 \u0447\u0435\u0440\u0435\u0437 Playwright.

    \u0410\u0442\u0440\u0438\u0431\u0443\u0442\u044b

    page (Page): \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.

    Source code in pages\\base_page.py
    class BasePage:\n    \"\"\"\u0411\u0430\u0437\u043e\u0432\u044b\u0439 \u043a\u043b\u0430\u0441\u0441 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441\u043e \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0430\u043c\u0438 \u0447\u0435\u0440\u0435\u0437 Playwright.\n\n    \u0410\u0442\u0440\u0438\u0431\u0443\u0442\u044b:\n        page (Page): \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.\n    \"\"\"\n\n    def __init__(self, page: Page):\n        \"\"\"\u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442 \u0431\u0430\u0437\u043e\u0432\u0443\u044e \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0443.\n\n        Args:\n            page (Page): \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.\n        \"\"\"\n        self.page = page\n\n    # \u0414\u0435\u0439\u0441\u0442\u0432\u0438\u044f:\n    def current_url(self) -> str:\n        \"\"\"\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0442\u0435\u043a\u0443\u0449\u0438\u0439 URL \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b.\n\n        Returns:\n            str: \u0422\u0435\u043a\u0443\u0449\u0438\u0439 URL \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b.\n        \"\"\"\n        return self.page.url\n\n    def open(self, uri) -> Response | None:\n        \"\"\"\u041e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u044b\u0439 URI \u0432 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0435.\n\n        Args:\n            uri (str): URI \u0434\u043b\u044f \u043e\u0442\u043a\u0440\u044b\u0442\u0438\u044f (\u0431\u0435\u0437 \u0431\u0430\u0437\u043e\u0432\u043e\u0433\u043e URL).\n\n        Returns:\n            Response | None: \u041e\u0442\u0432\u0435\u0442 \u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u0438\u043b\u0438 None \u0432 \u0441\u043b\u0443\u0447\u0430\u0435 \u043e\u0448\u0438\u0431\u043a\u0438.\n        \"\"\"\n        return self.page.goto(f\"{host.get_base_url()}{uri}\", wait_until='domcontentloaded')\n\n    def page_reload(self) -> None:\n        \"\"\"\u041f\u0435\u0440\u0435\u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u0442 \u0442\u0435\u043a\u0443\u0449\u0443\u044e \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0443.\"\"\"\n        self.page.reload()\n\n    def wait_for_timeout(self, timeout: int) -> None:\n        \"\"\"\u041e\u0436\u0438\u0434\u0430\u0435\u0442 \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043c\u0438\u043b\u043b\u0438\u0441\u0435\u043a\u0443\u043d\u0434.\n\n        Args:\n            timeout (int): \u0412\u0440\u0435\u043c\u044f \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u044f \u0432 \u043c\u0438\u043b\u043b\u0438\u0441\u0435\u043a\u0443\u043d\u0434\u0430\u0445.\n        \"\"\"\n        self.page.wait_for_timeout(timeout)\n\n    def get_api_request_context(self) -> APIRequestContext:\n        \"\"\"\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 API-\u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432.\n\n        Returns:\n            APIRequestContext: \u041a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 \u0434\u043b\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f API-\u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432.\n        \"\"\"\n        return self.page.context.request\n\n    def send_get_api_request(self, uri: str) -> Response:\n        \"\"\"\u041e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 GET-\u0437\u0430\u043f\u0440\u043e\u0441 \u043a API.\n\n        Args:\n            uri (str): URI API-\u044d\u043d\u0434\u043f\u043e\u0438\u043d\u0442\u0430 (\u0431\u0435\u0437 \u0431\u0430\u0437\u043e\u0432\u043e\u0433\u043e URL).\n\n        Returns:\n            Response: \u041e\u0442\u0432\u0435\u0442 \u0441\u0435\u0440\u0432\u0435\u0440\u0430.\n        \"\"\"\n        api_request_context = self.get_api_request_context()\n        token = host.get_access_token()\n\n        # \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u0447\u0442\u043e \u0442\u043e\u043a\u0435\u043d \u043f\u043e\u043b\u0443\u0447\u0435\u043d\n        if not token:\n            logger.error(\"Failed to get access token: token is None or empty\")\n            # \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c \u0437\u0430\u0433\u043b\u0443\u0448\u0435\u0447\u043d\u044b\u0439 response \u0438\u043b\u0438 \u0431\u0440\u043e\u0441\u0430\u0435\u043c \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435\n            # \u0412 Playwright \u043c\u043e\u0436\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u044c mock response \u0435\u0441\u043b\u0438 \u043d\u0443\u0436\u043d\u043e\n            return None\n\n        headers = {\"Accept\": \"application/json\", \"Authorization\": f\"Bearer {token}\"}\n        full_url = f\"{host.get_request_url()}{uri}\"\n\n        logger.debug(\"Sending GET request to: %s\", full_url)\n        response = api_request_context.get(full_url, headers=headers)\n\n        # \u041b\u043e\u0433\u0438\u0440\u0443\u0435\u043c \u0441\u0442\u0430\u0442\u0443\u0441 \u043e\u0442\u0432\u0435\u0442\u0430\n        logger.debug(\"GET response status: %s\", response.status)\n\n        return response\n\n    def send_post_api_request(self, uri: str, payload: Dict) -> Response:\n        \"\"\"\u041e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 POST-\u0437\u0430\u043f\u0440\u043e\u0441 \u043a API.\"\"\"\n        api_request_context = self.get_api_request_context()\n        token = host.get_access_token()\n\n        if not token:\n            logger.error(\"Failed to get access token: token is None or empty\")\n            return None\n\n        headers = {\n            \"Accept\": \"application/json\",\n            \"Content-Type\": \"application/json\",\n            \"Authorization\": f\"Bearer {token}\"\n        }\n        full_url = f\"{host.get_request_url()}{uri}\"\n\n        logger.debug(\"Sending POST request to: %s\", full_url)\n\n        # \u0421\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u0443\u0435\u043c payload \u0432 JSON\n        json_data = json.dumps(payload)\n\n        # \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u0447\u0442\u043e \u0441\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043f\u0440\u043e\u0448\u043b\u0430 \u0443\u0441\u043f\u0435\u0448\u043d\u043e\n        if json_data is None:\n            logger.error(\"Failed to serialize payload to JSON: result is None\")\n            return None\n\n        if not isinstance(json_data, str):\n            logger.error(\"Failed to serialize payload to JSON: expected string got %s\", type(json_data))\n            return None\n\n        response = api_request_context.post(\n            full_url,\n            headers=headers,\n            data=json_data  # \u041f\u0435\u0440\u0435\u0434\u0430\u0435\u043c \u0441\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u043d\u044b\u0439 JSON \u043a\u0430\u043a data\n        )\n\n        logger.debug(\"POST response status: %s\", response.status)\n\n        return response\n\n    def get_response_body(self, response: Response) -> dict | list | None:\n        \"\"\"\u0418\u0437\u0432\u043b\u0435\u043a\u0430\u0435\u0442 \u0442\u0435\u043b\u043e \u043e\u0442\u0432\u0435\u0442\u0430 \u0432 format JSON.\n\n        Args:\n            response (Response): \u041e\u0442\u0432\u0435\u0442 \u0441\u0435\u0440\u0432\u0435\u0440\u0430.\n\n        Returns:\n            dict | list | None: \u0420\u0430\u0441\u043f\u0430\u0440\u0441\u0435\u043d\u043d\u043e\u0435 \u0442\u0435\u043b\u043e \u043e\u0442\u0432\u0435\u0442\u0430 \u0438\u043b\u0438 None \u0432 \u0441\u043b\u0443\u0447\u0430\u0435 \u043e\u0448\u0438\u0431\u043a\u0438.\n        \"\"\"\n        start_time = time.time()\n\n        # \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u0447\u0442\u043e response \u043d\u0435 None\n        if response is None:\n            logger.error(\"Response object is None\")\n            processing_time = time.time() - start_time\n            logger.debug(\"Response processing time1: %.3f seconds\", processing_time)\n            return None\n\n        # \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u0441\u0442\u0430\u0442\u0443\u0441 \u043e\u0442\u0432\u0435\u0442\u0430\n        if response.status >= 400:\n            logger.error(\"API request failed with status %s\", response.status)\n            processing_time = time.time() - start_time\n            logger.debug(\"Response processing time2: %.3f seconds\", processing_time)\n            return None\n\n        # \u041f\u044b\u0442\u0430\u0435\u043c\u0441\u044f \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c JSON\n        json_result = response.json()\n\n        # \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u0447\u0442\u043e \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u043d\u0435 None\n        if json_result is None:\n            logger.error(\"JSON parsing returned None\")\n            processing_time = time.time() - start_time\n            logger.debug(\"Response processing time3: %.3f seconds\", processing_time)\n            return None\n\n        # \u041f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u043c \u043a\u0430\u043a \u0441\u043b\u043e\u0432\u0430\u0440\u0438, \u0442\u0430\u043a \u0438 \u0441\u043f\u0438\u0441\u043a\u0438\n        if not isinstance(json_result, (dict, list)):\n            logger.error(\"Expected dict or list but got %s\", type(json_result))\n            processing_time = time.time() - start_time\n            logger.debug(\"Response processing time4: %.3f seconds\", processing_time)\n            return None\n\n        processing_time = time.time() - start_time\n        logger.debug(\"Response processing time5: %.3f seconds\", processing_time)\n\n        return json_result\n\n        # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0438:\n    def check_URL(self, uri: str, msg: str) -> None:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442, \u0447\u0442\u043e \u0442\u0435\u043a\u0443\u0449\u0438\u0439 URL \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u043e\u0436\u0438\u0434\u0430\u0435\u043c\u043e\u043c\u0443.\n\n        Args:\n            uri (str): \u041e\u0436\u0438\u0434\u0430\u0435\u043c\u044b\u0439 URI (\u0431\u0435\u0437 \u0431\u0430\u0437\u043e\u0432\u043e\u0433\u043e URL).\n            msg (str): \u0421\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u043e\u0431 \u043e\u0448\u0438\u0431\u043a\u0435 \u043f\u0440\u0438 \u043d\u0435\u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0438.\n\n        Raises:\n            AssertionError: \u0415\u0441\u043b\u0438 URL \u043d\u0435 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u043e\u0436\u0438\u0434\u0430\u0435\u043c\u043e\u043c\u0443.\n        \"\"\"\n        expect(self.page).to_have_url(  # pylint: disable=expression-not-assigned\n            f\"{host.get_base_url()}{uri}\",\n            timeout=60000\n        ), msg\n\n    def check_equals(self, actual: Any, expected: Any, msg: str) -> None:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0440\u0430\u0432\u0435\u043d\u0441\u0442\u0432\u043e \u0444\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0438 \u043e\u0436\u0438\u0434\u0430\u0435\u043c\u043e\u0433\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439.\n\n        Args:\n            actual (Any): \u0424\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435.\n            expected (Any): \u041e\u0436\u0438\u0434\u0430\u0435\u043c\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435.\n            msg (str): \u0421\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u043e\u0431 \u043e\u0448\u0438\u0431\u043a\u0435 \u043f\u0440\u0438 \u043d\u0435\u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0438.\n\n        Raises:\n            AssertionError: \u0415\u0441\u043b\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043d\u0435 \u0440\u0430\u0432\u043d\u044b.\n        \"\"\"\n        assert actual == expected, msg\n\n    def check_lists_equals(self, actual: list, expected: list, msg: str) -> None:\n        \"\"\"\u0420\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0440\u0430\u0432\u0435\u043d\u0441\u0442\u0432\u043e \u0434\u0432\u0443\u0445 \u0441\u043f\u0438\u0441\u043a\u043e\u0432.\n\n        Args:\n            actual (list): \u0424\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0441\u043f\u0438\u0441\u043e\u043a.\n            expected (list): \u041e\u0436\u0438\u0434\u0430\u0435\u043c\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a.\n            msg (str): \u0421\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u043e\u0431 \u043e\u0448\u0438\u0431\u043a\u0435 \u043f\u0440\u0438 \u043d\u0435\u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0438.\n\n        Raises:\n            AssertionError: \u0415\u0441\u043b\u0438 \u0441\u043f\u0438\u0441\u043a\u0438 \u043d\u0435 \u0440\u0430\u0432\u043d\u044b.\n        \"\"\"\n        def compare_lists(list1: list, list2: list) -> bool:\n            \"\"\"\u0412\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0434\u043b\u044f \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u043e\u0433\u043e \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044f \u0441\u043f\u0438\u0441\u043a\u043e\u0432.\n\n            Args:\n                list1 (list): \u041f\u0435\u0440\u0432\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a \u0434\u043b\u044f \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044f.\n                list2 (list): \u0412\u0442\u043e\u0440\u043e\u0439 \u0441\u043f\u0438\u0441\u043e\u043a \u0434\u043b\u044f \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044f.\n\n            Returns:\n                bool: True \u0435\u0441\u043b\u0438 \u0441\u043f\u0438\u0441\u043a\u0438 \u0438\u0434\u0435\u043d\u0442\u0438\u0447\u043d\u044b, \u0438\u043d\u0430\u0447\u0435 False.\n            \"\"\"\n            if len(list1) != len(list2):\n                return False\n            for item1, item2 in zip(list1, list2):\n                if isinstance(item1, list) and isinstance(item2, list):\n                    if not compare_lists(item1, item2):\n                        return False\n                elif item1 != item2:\n                    return False\n            return True\n\n        assert compare_lists(actual, expected), msg\n
    "},{"location":"pages/base_page/#pages.base_page.BasePage.__init__","title":"__init__(page)","text":"

    \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442 \u0431\u0430\u0437\u043e\u0432\u0443\u044e \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0443.

    Parameters:

    Name Type Description Default page Page

    \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.

    required Source code in pages\\base_page.py
    def __init__(self, page: Page):\n    \"\"\"\u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442 \u0431\u0430\u0437\u043e\u0432\u0443\u044e \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0443.\n\n    Args:\n        page (Page): \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.\n    \"\"\"\n    self.page = page\n
    "},{"location":"pages/base_page/#pages.base_page.BasePage.check_URL","title":"check_URL(uri, msg)","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442, \u0447\u0442\u043e \u0442\u0435\u043a\u0443\u0449\u0438\u0439 URL \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u043e\u0436\u0438\u0434\u0430\u0435\u043c\u043e\u043c\u0443.

    Parameters:

    Name Type Description Default uri str

    \u041e\u0436\u0438\u0434\u0430\u0435\u043c\u044b\u0439 URI (\u0431\u0435\u0437 \u0431\u0430\u0437\u043e\u0432\u043e\u0433\u043e URL).

    required msg str

    \u0421\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u043e\u0431 \u043e\u0448\u0438\u0431\u043a\u0435 \u043f\u0440\u0438 \u043d\u0435\u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0438.

    required

    Raises:

    Type Description AssertionError

    \u0415\u0441\u043b\u0438 URL \u043d\u0435 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u043e\u0436\u0438\u0434\u0430\u0435\u043c\u043e\u043c\u0443.

    Source code in pages\\base_page.py
    def check_URL(self, uri: str, msg: str) -> None:\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442, \u0447\u0442\u043e \u0442\u0435\u043a\u0443\u0449\u0438\u0439 URL \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u043e\u0436\u0438\u0434\u0430\u0435\u043c\u043e\u043c\u0443.\n\n    Args:\n        uri (str): \u041e\u0436\u0438\u0434\u0430\u0435\u043c\u044b\u0439 URI (\u0431\u0435\u0437 \u0431\u0430\u0437\u043e\u0432\u043e\u0433\u043e URL).\n        msg (str): \u0421\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u043e\u0431 \u043e\u0448\u0438\u0431\u043a\u0435 \u043f\u0440\u0438 \u043d\u0435\u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0438.\n\n    Raises:\n        AssertionError: \u0415\u0441\u043b\u0438 URL \u043d\u0435 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u043e\u0436\u0438\u0434\u0430\u0435\u043c\u043e\u043c\u0443.\n    \"\"\"\n    expect(self.page).to_have_url(  # pylint: disable=expression-not-assigned\n        f\"{host.get_base_url()}{uri}\",\n        timeout=60000\n    ), msg\n
    "},{"location":"pages/base_page/#pages.base_page.BasePage.check_equals","title":"check_equals(actual, expected, msg)","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0440\u0430\u0432\u0435\u043d\u0441\u0442\u0432\u043e \u0444\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0438 \u043e\u0436\u0438\u0434\u0430\u0435\u043c\u043e\u0433\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439.

    Parameters:

    Name Type Description Default actual Any

    \u0424\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435.

    required expected Any

    \u041e\u0436\u0438\u0434\u0430\u0435\u043c\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435.

    required msg str

    \u0421\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u043e\u0431 \u043e\u0448\u0438\u0431\u043a\u0435 \u043f\u0440\u0438 \u043d\u0435\u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0438.

    required

    Raises:

    Type Description AssertionError

    \u0415\u0441\u043b\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043d\u0435 \u0440\u0430\u0432\u043d\u044b.

    Source code in pages\\base_page.py
    def check_equals(self, actual: Any, expected: Any, msg: str) -> None:\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0440\u0430\u0432\u0435\u043d\u0441\u0442\u0432\u043e \u0444\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0438 \u043e\u0436\u0438\u0434\u0430\u0435\u043c\u043e\u0433\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439.\n\n    Args:\n        actual (Any): \u0424\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435.\n        expected (Any): \u041e\u0436\u0438\u0434\u0430\u0435\u043c\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435.\n        msg (str): \u0421\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u043e\u0431 \u043e\u0448\u0438\u0431\u043a\u0435 \u043f\u0440\u0438 \u043d\u0435\u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0438.\n\n    Raises:\n        AssertionError: \u0415\u0441\u043b\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043d\u0435 \u0440\u0430\u0432\u043d\u044b.\n    \"\"\"\n    assert actual == expected, msg\n
    "},{"location":"pages/base_page/#pages.base_page.BasePage.check_lists_equals","title":"check_lists_equals(actual, expected, msg)","text":"

    \u0420\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0440\u0430\u0432\u0435\u043d\u0441\u0442\u0432\u043e \u0434\u0432\u0443\u0445 \u0441\u043f\u0438\u0441\u043a\u043e\u0432.

    Parameters:

    Name Type Description Default actual list

    \u0424\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0441\u043f\u0438\u0441\u043e\u043a.

    required expected list

    \u041e\u0436\u0438\u0434\u0430\u0435\u043c\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a.

    required msg str

    \u0421\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u043e\u0431 \u043e\u0448\u0438\u0431\u043a\u0435 \u043f\u0440\u0438 \u043d\u0435\u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0438.

    required

    Raises:

    Type Description AssertionError

    \u0415\u0441\u043b\u0438 \u0441\u043f\u0438\u0441\u043a\u0438 \u043d\u0435 \u0440\u0430\u0432\u043d\u044b.

    Source code in pages\\base_page.py
    def check_lists_equals(self, actual: list, expected: list, msg: str) -> None:\n    \"\"\"\u0420\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0440\u0430\u0432\u0435\u043d\u0441\u0442\u0432\u043e \u0434\u0432\u0443\u0445 \u0441\u043f\u0438\u0441\u043a\u043e\u0432.\n\n    Args:\n        actual (list): \u0424\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0441\u043f\u0438\u0441\u043e\u043a.\n        expected (list): \u041e\u0436\u0438\u0434\u0430\u0435\u043c\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a.\n        msg (str): \u0421\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u043e\u0431 \u043e\u0448\u0438\u0431\u043a\u0435 \u043f\u0440\u0438 \u043d\u0435\u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0438.\n\n    Raises:\n        AssertionError: \u0415\u0441\u043b\u0438 \u0441\u043f\u0438\u0441\u043a\u0438 \u043d\u0435 \u0440\u0430\u0432\u043d\u044b.\n    \"\"\"\n    def compare_lists(list1: list, list2: list) -> bool:\n        \"\"\"\u0412\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0434\u043b\u044f \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u043e\u0433\u043e \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044f \u0441\u043f\u0438\u0441\u043a\u043e\u0432.\n\n        Args:\n            list1 (list): \u041f\u0435\u0440\u0432\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a \u0434\u043b\u044f \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044f.\n            list2 (list): \u0412\u0442\u043e\u0440\u043e\u0439 \u0441\u043f\u0438\u0441\u043e\u043a \u0434\u043b\u044f \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044f.\n\n        Returns:\n            bool: True \u0435\u0441\u043b\u0438 \u0441\u043f\u0438\u0441\u043a\u0438 \u0438\u0434\u0435\u043d\u0442\u0438\u0447\u043d\u044b, \u0438\u043d\u0430\u0447\u0435 False.\n        \"\"\"\n        if len(list1) != len(list2):\n            return False\n        for item1, item2 in zip(list1, list2):\n            if isinstance(item1, list) and isinstance(item2, list):\n                if not compare_lists(item1, item2):\n                    return False\n            elif item1 != item2:\n                return False\n        return True\n\n    assert compare_lists(actual, expected), msg\n
    "},{"location":"pages/base_page/#pages.base_page.BasePage.current_url","title":"current_url()","text":"

    \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0442\u0435\u043a\u0443\u0449\u0438\u0439 URL \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b.

    Returns:

    Name Type Description str str

    \u0422\u0435\u043a\u0443\u0449\u0438\u0439 URL \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b.

    Source code in pages\\base_page.py
    def current_url(self) -> str:\n    \"\"\"\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0442\u0435\u043a\u0443\u0449\u0438\u0439 URL \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b.\n\n    Returns:\n        str: \u0422\u0435\u043a\u0443\u0449\u0438\u0439 URL \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b.\n    \"\"\"\n    return self.page.url\n
    "},{"location":"pages/base_page/#pages.base_page.BasePage.get_api_request_context","title":"get_api_request_context()","text":"

    \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 API-\u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432.

    Returns:

    Name Type Description APIRequestContext APIRequestContext

    \u041a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 \u0434\u043b\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f API-\u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432.

    Source code in pages\\base_page.py
    def get_api_request_context(self) -> APIRequestContext:\n    \"\"\"\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 API-\u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432.\n\n    Returns:\n        APIRequestContext: \u041a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 \u0434\u043b\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f API-\u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432.\n    \"\"\"\n    return self.page.context.request\n
    "},{"location":"pages/base_page/#pages.base_page.BasePage.get_response_body","title":"get_response_body(response)","text":"

    \u0418\u0437\u0432\u043b\u0435\u043a\u0430\u0435\u0442 \u0442\u0435\u043b\u043e \u043e\u0442\u0432\u0435\u0442\u0430 \u0432 format JSON.

    Parameters:

    Name Type Description Default response Response

    \u041e\u0442\u0432\u0435\u0442 \u0441\u0435\u0440\u0432\u0435\u0440\u0430.

    required

    Returns:

    Type Description dict | list | None

    dict | list | None: \u0420\u0430\u0441\u043f\u0430\u0440\u0441\u0435\u043d\u043d\u043e\u0435 \u0442\u0435\u043b\u043e \u043e\u0442\u0432\u0435\u0442\u0430 \u0438\u043b\u0438 None \u0432 \u0441\u043b\u0443\u0447\u0430\u0435 \u043e\u0448\u0438\u0431\u043a\u0438.

    Source code in pages\\base_page.py
    def get_response_body(self, response: Response) -> dict | list | None:\n    \"\"\"\u0418\u0437\u0432\u043b\u0435\u043a\u0430\u0435\u0442 \u0442\u0435\u043b\u043e \u043e\u0442\u0432\u0435\u0442\u0430 \u0432 format JSON.\n\n    Args:\n        response (Response): \u041e\u0442\u0432\u0435\u0442 \u0441\u0435\u0440\u0432\u0435\u0440\u0430.\n\n    Returns:\n        dict | list | None: \u0420\u0430\u0441\u043f\u0430\u0440\u0441\u0435\u043d\u043d\u043e\u0435 \u0442\u0435\u043b\u043e \u043e\u0442\u0432\u0435\u0442\u0430 \u0438\u043b\u0438 None \u0432 \u0441\u043b\u0443\u0447\u0430\u0435 \u043e\u0448\u0438\u0431\u043a\u0438.\n    \"\"\"\n    start_time = time.time()\n\n    # \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u0447\u0442\u043e response \u043d\u0435 None\n    if response is None:\n        logger.error(\"Response object is None\")\n        processing_time = time.time() - start_time\n        logger.debug(\"Response processing time1: %.3f seconds\", processing_time)\n        return None\n\n    # \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u0441\u0442\u0430\u0442\u0443\u0441 \u043e\u0442\u0432\u0435\u0442\u0430\n    if response.status >= 400:\n        logger.error(\"API request failed with status %s\", response.status)\n        processing_time = time.time() - start_time\n        logger.debug(\"Response processing time2: %.3f seconds\", processing_time)\n        return None\n\n    # \u041f\u044b\u0442\u0430\u0435\u043c\u0441\u044f \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c JSON\n    json_result = response.json()\n\n    # \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u0447\u0442\u043e \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u043d\u0435 None\n    if json_result is None:\n        logger.error(\"JSON parsing returned None\")\n        processing_time = time.time() - start_time\n        logger.debug(\"Response processing time3: %.3f seconds\", processing_time)\n        return None\n\n    # \u041f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u043c \u043a\u0430\u043a \u0441\u043b\u043e\u0432\u0430\u0440\u0438, \u0442\u0430\u043a \u0438 \u0441\u043f\u0438\u0441\u043a\u0438\n    if not isinstance(json_result, (dict, list)):\n        logger.error(\"Expected dict or list but got %s\", type(json_result))\n        processing_time = time.time() - start_time\n        logger.debug(\"Response processing time4: %.3f seconds\", processing_time)\n        return None\n\n    processing_time = time.time() - start_time\n    logger.debug(\"Response processing time5: %.3f seconds\", processing_time)\n\n    return json_result\n
    "},{"location":"pages/base_page/#pages.base_page.BasePage.open","title":"open(uri)","text":"

    \u041e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u044b\u0439 URI \u0432 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0435.

    Parameters:

    Name Type Description Default uri str

    URI \u0434\u043b\u044f \u043e\u0442\u043a\u0440\u044b\u0442\u0438\u044f (\u0431\u0435\u0437 \u0431\u0430\u0437\u043e\u0432\u043e\u0433\u043e URL).

    required

    Returns:

    Type Description Response | None

    Response | None: \u041e\u0442\u0432\u0435\u0442 \u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u0438\u043b\u0438 None \u0432 \u0441\u043b\u0443\u0447\u0430\u0435 \u043e\u0448\u0438\u0431\u043a\u0438.

    Source code in pages\\base_page.py
    def open(self, uri) -> Response | None:\n    \"\"\"\u041e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u044b\u0439 URI \u0432 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0435.\n\n    Args:\n        uri (str): URI \u0434\u043b\u044f \u043e\u0442\u043a\u0440\u044b\u0442\u0438\u044f (\u0431\u0435\u0437 \u0431\u0430\u0437\u043e\u0432\u043e\u0433\u043e URL).\n\n    Returns:\n        Response | None: \u041e\u0442\u0432\u0435\u0442 \u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u0438\u043b\u0438 None \u0432 \u0441\u043b\u0443\u0447\u0430\u0435 \u043e\u0448\u0438\u0431\u043a\u0438.\n    \"\"\"\n    return self.page.goto(f\"{host.get_base_url()}{uri}\", wait_until='domcontentloaded')\n
    "},{"location":"pages/base_page/#pages.base_page.BasePage.page_reload","title":"page_reload()","text":"

    \u041f\u0435\u0440\u0435\u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u0442 \u0442\u0435\u043a\u0443\u0449\u0443\u044e \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0443.

    Source code in pages\\base_page.py
    def page_reload(self) -> None:\n    \"\"\"\u041f\u0435\u0440\u0435\u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u0442 \u0442\u0435\u043a\u0443\u0449\u0443\u044e \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0443.\"\"\"\n    self.page.reload()\n
    "},{"location":"pages/base_page/#pages.base_page.BasePage.send_get_api_request","title":"send_get_api_request(uri)","text":"

    \u041e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 GET-\u0437\u0430\u043f\u0440\u043e\u0441 \u043a API.

    Parameters:

    Name Type Description Default uri str

    URI API-\u044d\u043d\u0434\u043f\u043e\u0438\u043d\u0442\u0430 (\u0431\u0435\u0437 \u0431\u0430\u0437\u043e\u0432\u043e\u0433\u043e URL).

    required

    Returns:

    Name Type Description Response Response

    \u041e\u0442\u0432\u0435\u0442 \u0441\u0435\u0440\u0432\u0435\u0440\u0430.

    Source code in pages\\base_page.py
    def send_get_api_request(self, uri: str) -> Response:\n    \"\"\"\u041e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 GET-\u0437\u0430\u043f\u0440\u043e\u0441 \u043a API.\n\n    Args:\n        uri (str): URI API-\u044d\u043d\u0434\u043f\u043e\u0438\u043d\u0442\u0430 (\u0431\u0435\u0437 \u0431\u0430\u0437\u043e\u0432\u043e\u0433\u043e URL).\n\n    Returns:\n        Response: \u041e\u0442\u0432\u0435\u0442 \u0441\u0435\u0440\u0432\u0435\u0440\u0430.\n    \"\"\"\n    api_request_context = self.get_api_request_context()\n    token = host.get_access_token()\n\n    # \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u0447\u0442\u043e \u0442\u043e\u043a\u0435\u043d \u043f\u043e\u043b\u0443\u0447\u0435\u043d\n    if not token:\n        logger.error(\"Failed to get access token: token is None or empty\")\n        # \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c \u0437\u0430\u0433\u043b\u0443\u0448\u0435\u0447\u043d\u044b\u0439 response \u0438\u043b\u0438 \u0431\u0440\u043e\u0441\u0430\u0435\u043c \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435\n        # \u0412 Playwright \u043c\u043e\u0436\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u044c mock response \u0435\u0441\u043b\u0438 \u043d\u0443\u0436\u043d\u043e\n        return None\n\n    headers = {\"Accept\": \"application/json\", \"Authorization\": f\"Bearer {token}\"}\n    full_url = f\"{host.get_request_url()}{uri}\"\n\n    logger.debug(\"Sending GET request to: %s\", full_url)\n    response = api_request_context.get(full_url, headers=headers)\n\n    # \u041b\u043e\u0433\u0438\u0440\u0443\u0435\u043c \u0441\u0442\u0430\u0442\u0443\u0441 \u043e\u0442\u0432\u0435\u0442\u0430\n    logger.debug(\"GET response status: %s\", response.status)\n\n    return response\n
    "},{"location":"pages/base_page/#pages.base_page.BasePage.send_post_api_request","title":"send_post_api_request(uri, payload)","text":"

    \u041e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 POST-\u0437\u0430\u043f\u0440\u043e\u0441 \u043a API.

    Source code in pages\\base_page.py
    def send_post_api_request(self, uri: str, payload: Dict) -> Response:\n    \"\"\"\u041e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 POST-\u0437\u0430\u043f\u0440\u043e\u0441 \u043a API.\"\"\"\n    api_request_context = self.get_api_request_context()\n    token = host.get_access_token()\n\n    if not token:\n        logger.error(\"Failed to get access token: token is None or empty\")\n        return None\n\n    headers = {\n        \"Accept\": \"application/json\",\n        \"Content-Type\": \"application/json\",\n        \"Authorization\": f\"Bearer {token}\"\n    }\n    full_url = f\"{host.get_request_url()}{uri}\"\n\n    logger.debug(\"Sending POST request to: %s\", full_url)\n\n    # \u0421\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u0443\u0435\u043c payload \u0432 JSON\n    json_data = json.dumps(payload)\n\n    # \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u0447\u0442\u043e \u0441\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043f\u0440\u043e\u0448\u043b\u0430 \u0443\u0441\u043f\u0435\u0448\u043d\u043e\n    if json_data is None:\n        logger.error(\"Failed to serialize payload to JSON: result is None\")\n        return None\n\n    if not isinstance(json_data, str):\n        logger.error(\"Failed to serialize payload to JSON: expected string got %s\", type(json_data))\n        return None\n\n    response = api_request_context.post(\n        full_url,\n        headers=headers,\n        data=json_data  # \u041f\u0435\u0440\u0435\u0434\u0430\u0435\u043c \u0441\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u043d\u044b\u0439 JSON \u043a\u0430\u043a data\n    )\n\n    logger.debug(\"POST response status: %s\", response.status)\n\n    return response\n
    "},{"location":"pages/base_page/#pages.base_page.BasePage.wait_for_timeout","title":"wait_for_timeout(timeout)","text":"

    \u041e\u0436\u0438\u0434\u0430\u0435\u0442 \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043c\u0438\u043b\u043b\u0438\u0441\u0435\u043a\u0443\u043d\u0434.

    Parameters:

    Name Type Description Default timeout int

    \u0412\u0440\u0435\u043c\u044f \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u044f \u0432 \u043c\u0438\u043b\u043b\u0438\u0441\u0435\u043a\u0443\u043d\u0434\u0430\u0445.

    required Source code in pages\\base_page.py
    def wait_for_timeout(self, timeout: int) -> None:\n    \"\"\"\u041e\u0436\u0438\u0434\u0430\u0435\u0442 \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043c\u0438\u043b\u043b\u0438\u0441\u0435\u043a\u0443\u043d\u0434.\n\n    Args:\n        timeout (int): \u0412\u0440\u0435\u043c\u044f \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u044f \u0432 \u043c\u0438\u043b\u043b\u0438\u0441\u0435\u043a\u0443\u043d\u0434\u0430\u0445.\n    \"\"\"\n    self.page.wait_for_timeout(timeout)\n
    "},{"location":"pages/license_tab/","title":"LicenseTab","text":"

    \u041c\u043e\u0434\u0443\u043b\u044c license_tab \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043a\u043b\u0430\u0441\u0441 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0432\u043a\u043b\u0430\u0434\u043a\u043e\u0439 '\u041b\u0438\u0446\u0435\u043d\u0437\u0438\u0438'.

    \u041a\u043b\u0430\u0441\u0441 LicenseTab \u043d\u0430\u0441\u043b\u0435\u0434\u0443\u0435\u0442 BasePage \u0438 \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u0442 \u043c\u0435\u0442\u043e\u0434\u044b \u0434\u043b\u044f \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0441 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u043c\u0438 \u0432\u043a\u043b\u0430\u0434\u043a\u0438 \u043b\u0438\u0446\u0435\u043d\u0437\u0438\u0439 \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0438\u0445 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f.

    "},{"location":"pages/license_tab/#pages.license_tab.LicenseTab","title":"LicenseTab","text":"

    Bases: BasePage

    \u041a\u043b\u0430\u0441\u0441 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0432\u043a\u043b\u0430\u0434\u043a\u043e\u0439 '\u041b\u0438\u0446\u0435\u043d\u0437\u0438\u0438'.

    \u0421\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043c\u0435\u0442\u043e\u0434\u044b \u0434\u043b\u044f: - \u0412\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0441 \u0444\u043e\u0440\u043c\u043e\u0439 \u0432\u0432\u043e\u0434\u0430 \u043b\u0438\u0446\u0435\u043d\u0437\u0438\u0438 - \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0433\u043e JSON-\u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430 - \u0420\u0430\u0431\u043e\u0442\u044b \u0441 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u043c\u0438 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f

    Source code in pages\\license_tab.py
    class LicenseTab(BasePage):\n    \"\"\"\u041a\u043b\u0430\u0441\u0441 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0432\u043a\u043b\u0430\u0434\u043a\u043e\u0439 '\u041b\u0438\u0446\u0435\u043d\u0437\u0438\u0438'.\n\n    \u0421\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043c\u0435\u0442\u043e\u0434\u044b \u0434\u043b\u044f:\n    - \u0412\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0441 \u0444\u043e\u0440\u043c\u043e\u0439 \u0432\u0432\u043e\u0434\u0430 \u043b\u0438\u0446\u0435\u043d\u0437\u0438\u0438\n    - \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0433\u043e JSON-\u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430\n    - \u0420\u0430\u0431\u043e\u0442\u044b \u0441 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u043c\u0438 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f\n    \"\"\"\n\n    def __init__(self, page: Page) -> None:\n        \"\"\"\u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0432\u043a\u043b\u0430\u0434\u043a\u0438 '\u041b\u0438\u0446\u0435\u043d\u0437\u0438\u0438'.\n\n        Args:\n            page: \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright\n        \"\"\"\n\n        super().__init__(page)\n\n        self.toolbar = ToolbarComponent(page, \"\u041b\u0438\u0446\u0435\u043d\u0437\u0438\u0438\")\n        self.json_container = JsonContainerComponent(page)\n\n        self.input_form_title = Text(page, TextLocators.TITLE_LICENSE_INPUT_FORM, \"input form title\")\n        self.license_id = Text(page, TextLocators.LICENSE_ID, \"license id\")\n        self.license_id_input = TextInput(page, InputLocators.LICENSE_ID_UPDATE, \"license id input\")\n        self.update_button = Button(page, ButtonLocators.BUTTON_LICENSE_UPDATE, \"update license button\")\n\n        self.alert = AlertComponent(page)\n\n    # \u0414\u0435\u0439\u0441\u0442\u0432\u0438\u044f:\n    def fill_license_input_form(self, value: str) -> None:\n        \"\"\"\u0417\u0430\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u0444\u043e\u0440\u043c\u0443 \u0432\u0432\u043e\u0434\u0430 \u043b\u0438\u0446\u0435\u043d\u0437\u0438\u0438 \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u044b\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u043c.\n\n        Args:\n            value: \u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0434\u043b\u044f \u0432\u0432\u043e\u0434\u0430\n        \"\"\"\n\n        self.license_id_input.clear()\n        self.license_id_input.input_value(value)\n        self.update_button.click()\n\n    def scroll_json_container_up(self) -> None:\n        \"\"\"\u041f\u0440\u043e\u043a\u0440\u0443\u0447\u0438\u0432\u0430\u0435\u0442 JSON-\u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440 \u0432\u0432\u0435\u0440\u0445.\"\"\"\n\n        loc = self.page.locator(JsonContainerLocators.SCROLL_CONTAINER).first\n        self.json_container.scroll_up(loc)\n\n    def scroll_json_container_down(self) -> None:\n        \"\"\"\u041f\u0440\u043e\u043a\u0440\u0443\u0447\u0438\u0432\u0430\u0435\u0442 JSON-\u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440 \u0432\u043d\u0438\u0437.\"\"\"\n\n        loc = self.page.locator(JsonContainerLocators.SCROLL_CONTAINER).first\n        self.json_container.scroll_down(loc)\n\n    # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0438:\n    def check_json_container_verticall_scrolling(self) -> bool:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u0439 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0438 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430.\n\n        Returns:\n            bool: \u0414\u043e\u0441\u0442\u0443\u043f\u043d\u043e\u0441\u0442\u044c \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0438\n        \"\"\"\n\n        loc = self.page.locator(JsonContainerLocators.SCROLL_CONTAINER).first\n        return self.json_container.is_scrollable_vertically(loc)\n\n    def check_content(self) -> None:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0432\u0441\u0435\u0445 \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0445 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0432\u043a\u043b\u0430\u0434\u043a\u0438.\"\"\"\n\n        self.should_be_toolbar()\n        self.should_be_json_container()\n        self.should_be_input_form_title()\n        self.should_be_empty_input_form()\n        self.should_be_update_button()\n\n        self.verify_json_container_content()\n\n    def should_be_error_alert_window_with_text(self, text: str) -> None:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435/\u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u0435 \u0430\u043b\u0435\u0440\u0442\u0430 \u0441 \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u044b\u043c \u0442\u0435\u043a\u0441\u0442\u043e\u043c.\n\n        Args:\n            text: \u0422\u0435\u043a\u0441\u0442 \u0434\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438\n        \"\"\"\n\n        alert_type = self.alert.get_alert_type()\n        assert alert_type==\"error\", f\"Expected error alert, but got {alert_type} alert\"\n\n        self.alert.check_alert_presence(text)\n        self.alert.check_alert_absence(text)\n\n    def should_be_toolbar(self) -> None:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u043f\u0430\u043d\u0435\u043b\u0438 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432.\"\"\"\n\n        self.toolbar.check_toolbar_presence(\"Toolbar is missing\")\n\n    def should_be_json_container(self) -> None:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 JSON-\u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430.\"\"\"\n\n        self.json_container.check_visibility(\n            JsonContainerLocators.CONTAINER,\n            \"Json container with license info is missing\"\n        )\n\n    def should_be_input_form_title(self) -> None:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a \u0444\u043e\u0440\u043c\u044b \u0438 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0435 ID \u043b\u0438\u0446\u0435\u043d\u0437\u0438\u0438.\"\"\"\n\n        self.input_form_title.check_have_text(\n            \"\u0418\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440:\",\n            \"Input lisence id form title '\u0418\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440:' is missing\"\n        )\n\n        actual_lisence_id = self.license_id.get_text(0).strip()\n\n        # send request to backend to get license id\n        response = self.send_get_api_request(\"e-cmdb/api/lic/deviceid\")\n        response_body = self.get_response_body(response)\n\n        self.check_equals(\n            actual_lisence_id,\n            response_body['deviceId'],\n            f\"Expected ID value {response_body['deviceId']} is not equal actual value {actual_lisence_id}\"\n        )\n\n    def should_be_empty_input_form(self) -> None:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043f\u0443\u0441\u0442\u043e\u0442\u0443 \u0444\u043e\u0440\u043c\u044b \u0432\u0432\u043e\u0434\u0430 \u043b\u0438\u0446\u0435\u043d\u0437\u0438\u0438.\"\"\"\n\n        self.license_id_input.check_empty_input(\"Input lisence id form is missing or not empty\")\n\n    def should_be_update_button(self) -> None:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u043a\u043d\u043e\u043f\u043a\u0438 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u043b\u0438\u0446\u0435\u043d\u0437\u0438\u0438.\"\"\"\n\n        button_text = \"\u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u043b\u0438\u0446\u0435\u043d\u0437\u0438\u044e\"\n        self.update_button.check_have_text(\n            button_text,\n            f\"Update button with text '{button_text}' is missing\"\n        )\n\n    def verify_json_container_content(self) -> None:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430 \u0434\u0430\u043d\u043d\u044b\u043c \u0438\u0437 API.\"\"\"\n\n        actual_data = self.json_container.read_data(JsonContainerLocators.CONTAINER)\n\n        env_name = host.get_env_name()\n\n        # temporarily because of difference in version\n        if env_name == \"test\":\n            # send request to backend to get license info\n            response = self.send_get_api_request(\"e-cmdb/api/lic\")\n            response_body = self.get_response_body(response)\n\n            del response_body[\"netManagment\"]\n            response_body[\"ui\"][\"lcc\"].pop(\"lcc_object\")\n            response_body[\"ui\"][\"lcc\"].pop(\"lcc_reference_book\")\n            response_body[\"ui\"][\"lcc\"].pop(\"lcc_reports\")\n            response_body[\"ui\"][\"lcc\"].pop(\"lcc_library_files\")\n            response_body[\"ui\"][\"lcc\"].pop(\"lcc_global_map\")\n            response_body[\"ui\"][\"cmdb\"].pop(\"logical_phone\")\n            response_body[\"ui\"][\"cmdb\"].pop(\"logical_ip\")\n            response_body[\"ui\"][\"cmdb\"].pop(\"logical_vlan\")\n            response_body[\"ui\"][\"cmdb\"].pop(\"logical_vm\")\n\n            # compare actual and response from cmdb\n            self.json_container.check_json_equals(\n                actual_data,\n                response_body,\n                \"Expected json content is not equal actual:\"\n            )\n        elif env_name == \"develop\" != 0:\n            # send request to backend to get license info\n            response = self.send_get_api_request(\"api/service-manager/license\")\n            response_body = self.get_response_body(response)\n\n            # compare actual and response from cmdb\n            self.json_container.check_json_equals(\n                actual_data,\n                response_body[\"data\"][\"config\"][\"config\"][\"e-nms\"],\n                \"Expected json content is not equal actual:\"\n            )\n        else:\n            pass\n
    "},{"location":"pages/license_tab/#pages.license_tab.LicenseTab.__init__","title":"__init__(page)","text":"

    \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0432\u043a\u043b\u0430\u0434\u043a\u0438 '\u041b\u0438\u0446\u0435\u043d\u0437\u0438\u0438'.

    Parameters:

    Name Type Description Default page Page

    \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright

    required Source code in pages\\license_tab.py
    def __init__(self, page: Page) -> None:\n    \"\"\"\u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0432\u043a\u043b\u0430\u0434\u043a\u0438 '\u041b\u0438\u0446\u0435\u043d\u0437\u0438\u0438'.\n\n    Args:\n        page: \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright\n    \"\"\"\n\n    super().__init__(page)\n\n    self.toolbar = ToolbarComponent(page, \"\u041b\u0438\u0446\u0435\u043d\u0437\u0438\u0438\")\n    self.json_container = JsonContainerComponent(page)\n\n    self.input_form_title = Text(page, TextLocators.TITLE_LICENSE_INPUT_FORM, \"input form title\")\n    self.license_id = Text(page, TextLocators.LICENSE_ID, \"license id\")\n    self.license_id_input = TextInput(page, InputLocators.LICENSE_ID_UPDATE, \"license id input\")\n    self.update_button = Button(page, ButtonLocators.BUTTON_LICENSE_UPDATE, \"update license button\")\n\n    self.alert = AlertComponent(page)\n
    "},{"location":"pages/license_tab/#pages.license_tab.LicenseTab.check_content","title":"check_content()","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0432\u0441\u0435\u0445 \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0445 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0432\u043a\u043b\u0430\u0434\u043a\u0438.

    Source code in pages\\license_tab.py
    def check_content(self) -> None:\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0432\u0441\u0435\u0445 \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0445 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0432\u043a\u043b\u0430\u0434\u043a\u0438.\"\"\"\n\n    self.should_be_toolbar()\n    self.should_be_json_container()\n    self.should_be_input_form_title()\n    self.should_be_empty_input_form()\n    self.should_be_update_button()\n\n    self.verify_json_container_content()\n
    "},{"location":"pages/license_tab/#pages.license_tab.LicenseTab.check_json_container_verticall_scrolling","title":"check_json_container_verticall_scrolling()","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u0439 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0438 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430.

    Returns:

    Name Type Description bool bool

    \u0414\u043e\u0441\u0442\u0443\u043f\u043d\u043e\u0441\u0442\u044c \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0438

    Source code in pages\\license_tab.py
    def check_json_container_verticall_scrolling(self) -> bool:\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u0439 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0438 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430.\n\n    Returns:\n        bool: \u0414\u043e\u0441\u0442\u0443\u043f\u043d\u043e\u0441\u0442\u044c \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0438\n    \"\"\"\n\n    loc = self.page.locator(JsonContainerLocators.SCROLL_CONTAINER).first\n    return self.json_container.is_scrollable_vertically(loc)\n
    "},{"location":"pages/license_tab/#pages.license_tab.LicenseTab.fill_license_input_form","title":"fill_license_input_form(value)","text":"

    \u0417\u0430\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u0444\u043e\u0440\u043c\u0443 \u0432\u0432\u043e\u0434\u0430 \u043b\u0438\u0446\u0435\u043d\u0437\u0438\u0438 \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u044b\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u043c.

    Parameters:

    Name Type Description Default value str

    \u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0434\u043b\u044f \u0432\u0432\u043e\u0434\u0430

    required Source code in pages\\license_tab.py
    def fill_license_input_form(self, value: str) -> None:\n    \"\"\"\u0417\u0430\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u0444\u043e\u0440\u043c\u0443 \u0432\u0432\u043e\u0434\u0430 \u043b\u0438\u0446\u0435\u043d\u0437\u0438\u0438 \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u044b\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u043c.\n\n    Args:\n        value: \u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0434\u043b\u044f \u0432\u0432\u043e\u0434\u0430\n    \"\"\"\n\n    self.license_id_input.clear()\n    self.license_id_input.input_value(value)\n    self.update_button.click()\n
    "},{"location":"pages/license_tab/#pages.license_tab.LicenseTab.scroll_json_container_down","title":"scroll_json_container_down()","text":"

    \u041f\u0440\u043e\u043a\u0440\u0443\u0447\u0438\u0432\u0430\u0435\u0442 JSON-\u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440 \u0432\u043d\u0438\u0437.

    Source code in pages\\license_tab.py
    def scroll_json_container_down(self) -> None:\n    \"\"\"\u041f\u0440\u043e\u043a\u0440\u0443\u0447\u0438\u0432\u0430\u0435\u0442 JSON-\u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440 \u0432\u043d\u0438\u0437.\"\"\"\n\n    loc = self.page.locator(JsonContainerLocators.SCROLL_CONTAINER).first\n    self.json_container.scroll_down(loc)\n
    "},{"location":"pages/license_tab/#pages.license_tab.LicenseTab.scroll_json_container_up","title":"scroll_json_container_up()","text":"

    \u041f\u0440\u043e\u043a\u0440\u0443\u0447\u0438\u0432\u0430\u0435\u0442 JSON-\u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440 \u0432\u0432\u0435\u0440\u0445.

    Source code in pages\\license_tab.py
    def scroll_json_container_up(self) -> None:\n    \"\"\"\u041f\u0440\u043e\u043a\u0440\u0443\u0447\u0438\u0432\u0430\u0435\u0442 JSON-\u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440 \u0432\u0432\u0435\u0440\u0445.\"\"\"\n\n    loc = self.page.locator(JsonContainerLocators.SCROLL_CONTAINER).first\n    self.json_container.scroll_up(loc)\n
    "},{"location":"pages/license_tab/#pages.license_tab.LicenseTab.should_be_empty_input_form","title":"should_be_empty_input_form()","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043f\u0443\u0441\u0442\u043e\u0442\u0443 \u0444\u043e\u0440\u043c\u044b \u0432\u0432\u043e\u0434\u0430 \u043b\u0438\u0446\u0435\u043d\u0437\u0438\u0438.

    Source code in pages\\license_tab.py
    def should_be_empty_input_form(self) -> None:\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043f\u0443\u0441\u0442\u043e\u0442\u0443 \u0444\u043e\u0440\u043c\u044b \u0432\u0432\u043e\u0434\u0430 \u043b\u0438\u0446\u0435\u043d\u0437\u0438\u0438.\"\"\"\n\n    self.license_id_input.check_empty_input(\"Input lisence id form is missing or not empty\")\n
    "},{"location":"pages/license_tab/#pages.license_tab.LicenseTab.should_be_error_alert_window_with_text","title":"should_be_error_alert_window_with_text(text)","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435/\u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u0435 \u0430\u043b\u0435\u0440\u0442\u0430 \u0441 \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u044b\u043c \u0442\u0435\u043a\u0441\u0442\u043e\u043c.

    Parameters:

    Name Type Description Default text str

    \u0422\u0435\u043a\u0441\u0442 \u0434\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438

    required Source code in pages\\license_tab.py
    def should_be_error_alert_window_with_text(self, text: str) -> None:\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435/\u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u0435 \u0430\u043b\u0435\u0440\u0442\u0430 \u0441 \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u044b\u043c \u0442\u0435\u043a\u0441\u0442\u043e\u043c.\n\n    Args:\n        text: \u0422\u0435\u043a\u0441\u0442 \u0434\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438\n    \"\"\"\n\n    alert_type = self.alert.get_alert_type()\n    assert alert_type==\"error\", f\"Expected error alert, but got {alert_type} alert\"\n\n    self.alert.check_alert_presence(text)\n    self.alert.check_alert_absence(text)\n
    "},{"location":"pages/license_tab/#pages.license_tab.LicenseTab.should_be_input_form_title","title":"should_be_input_form_title()","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a \u0444\u043e\u0440\u043c\u044b \u0438 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0435 ID \u043b\u0438\u0446\u0435\u043d\u0437\u0438\u0438.

    Source code in pages\\license_tab.py
    def should_be_input_form_title(self) -> None:\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a \u0444\u043e\u0440\u043c\u044b \u0438 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0435 ID \u043b\u0438\u0446\u0435\u043d\u0437\u0438\u0438.\"\"\"\n\n    self.input_form_title.check_have_text(\n        \"\u0418\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440:\",\n        \"Input lisence id form title '\u0418\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440:' is missing\"\n    )\n\n    actual_lisence_id = self.license_id.get_text(0).strip()\n\n    # send request to backend to get license id\n    response = self.send_get_api_request(\"e-cmdb/api/lic/deviceid\")\n    response_body = self.get_response_body(response)\n\n    self.check_equals(\n        actual_lisence_id,\n        response_body['deviceId'],\n        f\"Expected ID value {response_body['deviceId']} is not equal actual value {actual_lisence_id}\"\n    )\n
    "},{"location":"pages/license_tab/#pages.license_tab.LicenseTab.should_be_json_container","title":"should_be_json_container()","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 JSON-\u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430.

    Source code in pages\\license_tab.py
    def should_be_json_container(self) -> None:\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 JSON-\u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430.\"\"\"\n\n    self.json_container.check_visibility(\n        JsonContainerLocators.CONTAINER,\n        \"Json container with license info is missing\"\n    )\n
    "},{"location":"pages/license_tab/#pages.license_tab.LicenseTab.should_be_toolbar","title":"should_be_toolbar()","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u043f\u0430\u043d\u0435\u043b\u0438 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432.

    Source code in pages\\license_tab.py
    def should_be_toolbar(self) -> None:\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u043f\u0430\u043d\u0435\u043b\u0438 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432.\"\"\"\n\n    self.toolbar.check_toolbar_presence(\"Toolbar is missing\")\n
    "},{"location":"pages/license_tab/#pages.license_tab.LicenseTab.should_be_update_button","title":"should_be_update_button()","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u043a\u043d\u043e\u043f\u043a\u0438 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u043b\u0438\u0446\u0435\u043d\u0437\u0438\u0438.

    Source code in pages\\license_tab.py
    def should_be_update_button(self) -> None:\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u043a\u043d\u043e\u043f\u043a\u0438 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u043b\u0438\u0446\u0435\u043d\u0437\u0438\u0438.\"\"\"\n\n    button_text = \"\u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u043b\u0438\u0446\u0435\u043d\u0437\u0438\u044e\"\n    self.update_button.check_have_text(\n        button_text,\n        f\"Update button with text '{button_text}' is missing\"\n    )\n
    "},{"location":"pages/license_tab/#pages.license_tab.LicenseTab.verify_json_container_content","title":"verify_json_container_content()","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430 \u0434\u0430\u043d\u043d\u044b\u043c \u0438\u0437 API.

    Source code in pages\\license_tab.py
    def verify_json_container_content(self) -> None:\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430 \u0434\u0430\u043d\u043d\u044b\u043c \u0438\u0437 API.\"\"\"\n\n    actual_data = self.json_container.read_data(JsonContainerLocators.CONTAINER)\n\n    env_name = host.get_env_name()\n\n    # temporarily because of difference in version\n    if env_name == \"test\":\n        # send request to backend to get license info\n        response = self.send_get_api_request(\"e-cmdb/api/lic\")\n        response_body = self.get_response_body(response)\n\n        del response_body[\"netManagment\"]\n        response_body[\"ui\"][\"lcc\"].pop(\"lcc_object\")\n        response_body[\"ui\"][\"lcc\"].pop(\"lcc_reference_book\")\n        response_body[\"ui\"][\"lcc\"].pop(\"lcc_reports\")\n        response_body[\"ui\"][\"lcc\"].pop(\"lcc_library_files\")\n        response_body[\"ui\"][\"lcc\"].pop(\"lcc_global_map\")\n        response_body[\"ui\"][\"cmdb\"].pop(\"logical_phone\")\n        response_body[\"ui\"][\"cmdb\"].pop(\"logical_ip\")\n        response_body[\"ui\"][\"cmdb\"].pop(\"logical_vlan\")\n        response_body[\"ui\"][\"cmdb\"].pop(\"logical_vm\")\n\n        # compare actual and response from cmdb\n        self.json_container.check_json_equals(\n            actual_data,\n            response_body,\n            \"Expected json content is not equal actual:\"\n        )\n    elif env_name == \"develop\" != 0:\n        # send request to backend to get license info\n        response = self.send_get_api_request(\"api/service-manager/license\")\n        response_body = self.get_response_body(response)\n\n        # compare actual and response from cmdb\n        self.json_container.check_json_equals(\n            actual_data,\n            response_body[\"data\"][\"config\"][\"config\"][\"e-nms\"],\n            \"Expected json content is not equal actual:\"\n        )\n    else:\n        pass\n
    "},{"location":"pages/login_page/","title":"LoginPage","text":"

    \u041c\u043e\u0434\u0443\u043b\u044c \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u0438.

    \u0421\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043a\u043b\u0430\u0441\u0441 LoginPage \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u043c\u0438 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u0432\u0445\u043e\u0434\u0430 \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0443. \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 Playwright \u0434\u043b\u044f \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0441 UI \u0438 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u043e\u0442\u0432\u0435\u0442\u043e\u0432 \u0441\u0435\u0440\u0432\u0435\u0440\u0430.

    "},{"location":"pages/login_page/#pages.login_page.LoginPage","title":"LoginPage","text":"

    Bases: BasePage

    \u041a\u043b\u0430\u0441\u0441 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441\u043e \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435\u0439 \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u0438.

    \u0410\u0442\u0440\u0438\u0431\u0443\u0442\u044b

    page: \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright. login_input: \u041f\u043e\u043b\u0435 \u0432\u0432\u043e\u0434\u0430 \u043b\u043e\u0433\u0438\u043d\u0430. password_input: \u041f\u043e\u043b\u0435 \u0432\u0432\u043e\u0434\u0430 \u043f\u0430\u0440\u043e\u043b\u044f. login_button: \u041a\u043d\u043e\u043f\u043a\u0430 \u0432\u0445\u043e\u0434\u0430. alert: \u0410\u043b\u0435\u0440\u0442 \u043e\u043a\u043d\u043e \u0441 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435\u043c \u043e\u0431 \u043e\u0448\u0438\u0431\u043a\u0435.

    Source code in pages\\login_page.py
    class LoginPage(BasePage):\n    \"\"\"\u041a\u043b\u0430\u0441\u0441 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441\u043e \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435\u0439 \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u0438.\n\n    \u0410\u0442\u0440\u0438\u0431\u0443\u0442\u044b:\n        page: \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.\n        login_input: \u041f\u043e\u043b\u0435 \u0432\u0432\u043e\u0434\u0430 \u043b\u043e\u0433\u0438\u043d\u0430.\n        password_input: \u041f\u043e\u043b\u0435 \u0432\u0432\u043e\u0434\u0430 \u043f\u0430\u0440\u043e\u043b\u044f.\n        login_button: \u041a\u043d\u043e\u043f\u043a\u0430 \u0432\u0445\u043e\u0434\u0430.\n        alert: \u0410\u043b\u0435\u0440\u0442 \u043e\u043a\u043d\u043e \u0441 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435\u043c \u043e\u0431 \u043e\u0448\u0438\u0431\u043a\u0435.\n    \"\"\"\n\n    def __init__(self, page: Page) -> None:\n        \"\"\"\u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u0438.\n\n        Args:\n            page: \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.\n        \"\"\"\n\n        super().__init__(page)\n\n        self.login_input = TextInput(page, page.get_by_label(\"\u0418\u043c\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\"), \"login input\")\n        self.password_input = TextInput(page, page.get_by_label(\"\u041f\u0430\u0440\u043e\u043b\u044c\"), \"password input\")\n\n        icon_locator = page.get_by_label(\"\u041f\u0430\u0440\u043e\u043b\u044c\").locator(\"xpath=../..\").locator(TextInputLocators.ICON_PASSWORD_HIDING)\n        self.password_hidden_icon = Icon(page,\n                                         icon_locator,\n                                         \"password hidden icon\")\n        self.login_button = Button(page, page.get_by_role(\"button\"), \"login button\")\n\n        self.alert = AlertComponent(page)\n\n    # \u0414\u0435\u0439\u0441\u0442\u0432\u0438\u044f:\n    def click_password_hidden_icon(self) -> None:\n        \"\"\"\u041d\u0430\u0436\u0430\u0442\u0438\u0435 \u043d\u0430 \u0438\u043a\u043e\u043d\u043a\u0443 \u0441\u043a\u0440\u044b\u0442\u0438\u044f \u043f\u0430\u0440\u043e\u043b\u044f.\"\"\"\n\n        self.password_hidden_icon.click()\n\n    def do_login(self, username: str = None, password: str = None) -> None:\n        \"\"\"\u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u0432\u0445\u043e\u0434 \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0443.\n\n        \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u043f\u0435\u0440\u0435\u0434\u0430\u043d\u043d\u044b\u0435 \u0443\u0447\u0435\u0442\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0438\u043b\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0438\u0437 Constants.\n        \u041e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442 \u043e\u0442\u0432\u0435\u0442 \u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u0434\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0442\u043e\u043a\u0435\u043d\u0430 \u0434\u043e\u0441\u0442\u0443\u043f\u0430.\n\n        Args:\n            username: \u041b\u043e\u0433\u0438\u043d \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f. \u041f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u0438\u0437 Constants.\n            password: \u041f\u0430\u0440\u043e\u043b\u044c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f. \u041f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u0438\u0437 Constants.\n\n        Raises:\n            AssertionError: \u0415\u0441\u043b\u0438 \u043f\u043e\u0441\u043b\u0435 \u0432\u0445\u043e\u0434\u0430 \u043e\u0442\u043a\u0440\u044b\u043b\u0430\u0441\u044c \u043d\u0435\u043e\u0436\u0438\u0434\u0430\u043d\u043d\u0430\u044f \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0430.\n        \"\"\"\n\n        def handle_response(response):\n            if \"login\" in response.url:\n                response_body = self.get_response_body(response)\n                if response_body:\n                    host.set_current_user_credential(response_body)\n\n        self.page.on(\"response\", handle_response)\n\n        self.open(\"\")\n\n        # \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u043f\u0435\u0440\u0435\u0434\u0430\u043d\u043d\u044b\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0438\u043b\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u0438\u0437 Constants\n        actual_username = username if username is not None else Constants.login\n        actual_password = password if password is not None else Constants.password\n\n        self.login_input.clear()\n        self.login_input.input_value(actual_username)\n\n        self.password_input.clear()\n        self.password_input.input_value(actual_password)\n\n        self.login_button.click()\n\n        self.check_URL(\"dashboard\", \"An unexpected page has been opened\")\n\n    def do_unsuccessful_login(self, username: str = \"someuser\", password: str = \"password\") -> None:\n        \"\"\"\u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u043f\u043e\u043f\u044b\u0442\u043a\u0443 \u0432\u0445\u043e\u0434\u0430 \u0441 \u043d\u0435\u0432\u0435\u0440\u043d\u044b\u043c\u0438 \u0443\u0447\u0435\u0442\u043d\u044b\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u043c\u0438.\n\n        \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u043e\u0431 \u043e\u0448\u0438\u0431\u043a\u0435. \u041c\u043e\u0436\u043d\u043e \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u044c \u0441\u0432\u043e\u0438 \u0434\u0430\u043d\u043d\u044b\u0435\n        \u0438\u043b\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e.\n\n        Args:\n            username: \u041d\u0435\u0432\u0435\u0440\u043d\u044b\u0439 \u043b\u043e\u0433\u0438\u043d. \u041f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \"someuser\".\n            password: \u041d\u0435\u0432\u0435\u0440\u043d\u044b\u0439 \u043f\u0430\u0440\u043e\u043b\u044c. \u041f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \"password\".\n        \"\"\"\n\n        self.open(\"\")\n\n        self.login_input.clear()\n        self.login_input.input_value(username)\n\n        self.password_input.clear()\n        self.password_input.input_value(password)\n\n        self.login_button.click()\n\n        alert_type = self.alert.get_alert_type()\n        assert alert_type==\"error\", f\"Expected error alert, but got {alert_type} alert\"\n\n        self.alert.check_alert_presence(\"\u041d\u0435\u0432\u0435\u0440\u043d\u0430\u044f \u043f\u0430\u0440\u0430 \u043b\u043e\u0433\u0438\u043d/\u043f\u0430\u0440\u043e\u043b\u044c\")\n        self.alert.check_alert_absence(\"\u041d\u0435\u0432\u0435\u0440\u043d\u0430\u044f \u043f\u0430\u0440\u0430 \u043b\u043e\u0433\u0438\u043d/\u043f\u0430\u0440\u043e\u043b\u044c\")\n\n    # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0438:\n    def is_password_icon_hidden(self) -> bool:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0438\u043a\u043e\u043d\u043a\u0438 \u0441\u043a\u0440\u044b\u0442\u0438\u044f \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432 \u043f\u0430\u0440\u043e\u043b\u044f.\n           \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 True \u0435\u0441\u043b\u0438 \u043f\u0430\u0440\u043e\u043b\u044c \u0431\u0443\u0434\u0435\u0442 \u0441\u043a\u0440\u044b\u0442, \u0438\u043d\u0430\u0447\u0435 False\n        \"\"\"\n\n        return self.password_hidden_icon.is_password_hidden()\n\n    def is_password_hidden(self) -> bool:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432 \u043f\u0430\u0440\u043e\u043b\u044f.\"\"\"\n\n        input_type = self.password_input.get_input_type()\n        if input_type == \"password\":\n            return True\n        elif input_type == \"text\":\n            return False\n        else:\n            assert False, \"Check password hidden error\"\n
    "},{"location":"pages/login_page/#pages.login_page.LoginPage.__init__","title":"__init__(page)","text":"

    \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u0438.

    Parameters:

    Name Type Description Default page Page

    \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.

    required Source code in pages\\login_page.py
    def __init__(self, page: Page) -> None:\n    \"\"\"\u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u0438.\n\n    Args:\n        page: \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.\n    \"\"\"\n\n    super().__init__(page)\n\n    self.login_input = TextInput(page, page.get_by_label(\"\u0418\u043c\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\"), \"login input\")\n    self.password_input = TextInput(page, page.get_by_label(\"\u041f\u0430\u0440\u043e\u043b\u044c\"), \"password input\")\n\n    icon_locator = page.get_by_label(\"\u041f\u0430\u0440\u043e\u043b\u044c\").locator(\"xpath=../..\").locator(TextInputLocators.ICON_PASSWORD_HIDING)\n    self.password_hidden_icon = Icon(page,\n                                     icon_locator,\n                                     \"password hidden icon\")\n    self.login_button = Button(page, page.get_by_role(\"button\"), \"login button\")\n\n    self.alert = AlertComponent(page)\n
    "},{"location":"pages/login_page/#pages.login_page.LoginPage.click_password_hidden_icon","title":"click_password_hidden_icon()","text":"

    \u041d\u0430\u0436\u0430\u0442\u0438\u0435 \u043d\u0430 \u0438\u043a\u043e\u043d\u043a\u0443 \u0441\u043a\u0440\u044b\u0442\u0438\u044f \u043f\u0430\u0440\u043e\u043b\u044f.

    Source code in pages\\login_page.py
    def click_password_hidden_icon(self) -> None:\n    \"\"\"\u041d\u0430\u0436\u0430\u0442\u0438\u0435 \u043d\u0430 \u0438\u043a\u043e\u043d\u043a\u0443 \u0441\u043a\u0440\u044b\u0442\u0438\u044f \u043f\u0430\u0440\u043e\u043b\u044f.\"\"\"\n\n    self.password_hidden_icon.click()\n
    "},{"location":"pages/login_page/#pages.login_page.LoginPage.do_login","title":"do_login(username=None, password=None)","text":"

    \u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u0432\u0445\u043e\u0434 \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0443.

    \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u043f\u0435\u0440\u0435\u0434\u0430\u043d\u043d\u044b\u0435 \u0443\u0447\u0435\u0442\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0438\u043b\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0438\u0437 Constants. \u041e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442 \u043e\u0442\u0432\u0435\u0442 \u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u0434\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0442\u043e\u043a\u0435\u043d\u0430 \u0434\u043e\u0441\u0442\u0443\u043f\u0430.

    Parameters:

    Name Type Description Default username str

    \u041b\u043e\u0433\u0438\u043d \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f. \u041f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u0438\u0437 Constants.

    None password str

    \u041f\u0430\u0440\u043e\u043b\u044c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f. \u041f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u0438\u0437 Constants.

    None

    Raises:

    Type Description AssertionError

    \u0415\u0441\u043b\u0438 \u043f\u043e\u0441\u043b\u0435 \u0432\u0445\u043e\u0434\u0430 \u043e\u0442\u043a\u0440\u044b\u043b\u0430\u0441\u044c \u043d\u0435\u043e\u0436\u0438\u0434\u0430\u043d\u043d\u0430\u044f \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0430.

    Source code in pages\\login_page.py
    def do_login(self, username: str = None, password: str = None) -> None:\n    \"\"\"\u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u0432\u0445\u043e\u0434 \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0443.\n\n    \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u043f\u0435\u0440\u0435\u0434\u0430\u043d\u043d\u044b\u0435 \u0443\u0447\u0435\u0442\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0438\u043b\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0438\u0437 Constants.\n    \u041e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442 \u043e\u0442\u0432\u0435\u0442 \u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u0434\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0442\u043e\u043a\u0435\u043d\u0430 \u0434\u043e\u0441\u0442\u0443\u043f\u0430.\n\n    Args:\n        username: \u041b\u043e\u0433\u0438\u043d \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f. \u041f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u0438\u0437 Constants.\n        password: \u041f\u0430\u0440\u043e\u043b\u044c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f. \u041f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u0438\u0437 Constants.\n\n    Raises:\n        AssertionError: \u0415\u0441\u043b\u0438 \u043f\u043e\u0441\u043b\u0435 \u0432\u0445\u043e\u0434\u0430 \u043e\u0442\u043a\u0440\u044b\u043b\u0430\u0441\u044c \u043d\u0435\u043e\u0436\u0438\u0434\u0430\u043d\u043d\u0430\u044f \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0430.\n    \"\"\"\n\n    def handle_response(response):\n        if \"login\" in response.url:\n            response_body = self.get_response_body(response)\n            if response_body:\n                host.set_current_user_credential(response_body)\n\n    self.page.on(\"response\", handle_response)\n\n    self.open(\"\")\n\n    # \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u043f\u0435\u0440\u0435\u0434\u0430\u043d\u043d\u044b\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0438\u043b\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u0438\u0437 Constants\n    actual_username = username if username is not None else Constants.login\n    actual_password = password if password is not None else Constants.password\n\n    self.login_input.clear()\n    self.login_input.input_value(actual_username)\n\n    self.password_input.clear()\n    self.password_input.input_value(actual_password)\n\n    self.login_button.click()\n\n    self.check_URL(\"dashboard\", \"An unexpected page has been opened\")\n
    "},{"location":"pages/login_page/#pages.login_page.LoginPage.do_unsuccessful_login","title":"do_unsuccessful_login(username='someuser', password='password')","text":"

    \u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u043f\u043e\u043f\u044b\u0442\u043a\u0443 \u0432\u0445\u043e\u0434\u0430 \u0441 \u043d\u0435\u0432\u0435\u0440\u043d\u044b\u043c\u0438 \u0443\u0447\u0435\u0442\u043d\u044b\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u043c\u0438.

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u043e\u0431 \u043e\u0448\u0438\u0431\u043a\u0435. \u041c\u043e\u0436\u043d\u043e \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u044c \u0441\u0432\u043e\u0438 \u0434\u0430\u043d\u043d\u044b\u0435 \u0438\u043b\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e.

    Parameters:

    Name Type Description Default username str

    \u041d\u0435\u0432\u0435\u0440\u043d\u044b\u0439 \u043b\u043e\u0433\u0438\u043d. \u041f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \"someuser\".

    'someuser' password str

    \u041d\u0435\u0432\u0435\u0440\u043d\u044b\u0439 \u043f\u0430\u0440\u043e\u043b\u044c. \u041f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \"password\".

    'password' Source code in pages\\login_page.py
    def do_unsuccessful_login(self, username: str = \"someuser\", password: str = \"password\") -> None:\n    \"\"\"\u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u043f\u043e\u043f\u044b\u0442\u043a\u0443 \u0432\u0445\u043e\u0434\u0430 \u0441 \u043d\u0435\u0432\u0435\u0440\u043d\u044b\u043c\u0438 \u0443\u0447\u0435\u0442\u043d\u044b\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u043c\u0438.\n\n    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u043e\u0431 \u043e\u0448\u0438\u0431\u043a\u0435. \u041c\u043e\u0436\u043d\u043e \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u044c \u0441\u0432\u043e\u0438 \u0434\u0430\u043d\u043d\u044b\u0435\n    \u0438\u043b\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e.\n\n    Args:\n        username: \u041d\u0435\u0432\u0435\u0440\u043d\u044b\u0439 \u043b\u043e\u0433\u0438\u043d. \u041f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \"someuser\".\n        password: \u041d\u0435\u0432\u0435\u0440\u043d\u044b\u0439 \u043f\u0430\u0440\u043e\u043b\u044c. \u041f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \"password\".\n    \"\"\"\n\n    self.open(\"\")\n\n    self.login_input.clear()\n    self.login_input.input_value(username)\n\n    self.password_input.clear()\n    self.password_input.input_value(password)\n\n    self.login_button.click()\n\n    alert_type = self.alert.get_alert_type()\n    assert alert_type==\"error\", f\"Expected error alert, but got {alert_type} alert\"\n\n    self.alert.check_alert_presence(\"\u041d\u0435\u0432\u0435\u0440\u043d\u0430\u044f \u043f\u0430\u0440\u0430 \u043b\u043e\u0433\u0438\u043d/\u043f\u0430\u0440\u043e\u043b\u044c\")\n    self.alert.check_alert_absence(\"\u041d\u0435\u0432\u0435\u0440\u043d\u0430\u044f \u043f\u0430\u0440\u0430 \u043b\u043e\u0433\u0438\u043d/\u043f\u0430\u0440\u043e\u043b\u044c\")\n
    "},{"location":"pages/login_page/#pages.login_page.LoginPage.is_password_hidden","title":"is_password_hidden()","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432 \u043f\u0430\u0440\u043e\u043b\u044f.

    Source code in pages\\login_page.py
    def is_password_hidden(self) -> bool:\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432 \u043f\u0430\u0440\u043e\u043b\u044f.\"\"\"\n\n    input_type = self.password_input.get_input_type()\n    if input_type == \"password\":\n        return True\n    elif input_type == \"text\":\n        return False\n    else:\n        assert False, \"Check password hidden error\"\n
    "},{"location":"pages/login_page/#pages.login_page.LoginPage.is_password_icon_hidden","title":"is_password_icon_hidden()","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0438\u043a\u043e\u043d\u043a\u0438 \u0441\u043a\u0440\u044b\u0442\u0438\u044f \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432 \u043f\u0430\u0440\u043e\u043b\u044f. \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 True \u0435\u0441\u043b\u0438 \u043f\u0430\u0440\u043e\u043b\u044c \u0431\u0443\u0434\u0435\u0442 \u0441\u043a\u0440\u044b\u0442, \u0438\u043d\u0430\u0447\u0435 False

    Source code in pages\\login_page.py
    def is_password_icon_hidden(self) -> bool:\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0438\u043a\u043e\u043d\u043a\u0438 \u0441\u043a\u0440\u044b\u0442\u0438\u044f \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432 \u043f\u0430\u0440\u043e\u043b\u044f.\n       \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 True \u0435\u0441\u043b\u0438 \u043f\u0430\u0440\u043e\u043b\u044c \u0431\u0443\u0434\u0435\u0442 \u0441\u043a\u0440\u044b\u0442, \u0438\u043d\u0430\u0447\u0435 False\n    \"\"\"\n\n    return self.password_hidden_icon.is_password_hidden()\n
    "},{"location":"pages/main_page/","title":"MainPage","text":"

    \u041c\u043e\u0434\u0443\u043b\u044c \u0433\u043b\u0430\u0432\u043d\u043e\u0439 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f.

    \u0421\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043a\u043b\u0430\u0441\u0441 MainPage \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u043c\u0438 \u0433\u043b\u0430\u0432\u043d\u043e\u0439 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b. \u0412\u043a\u043b\u044e\u0447\u0430\u0435\u0442 \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u0441 \u043f\u0430\u043d\u0435\u043b\u044c\u044e \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438, \u043a\u043d\u043e\u043f\u043a\u0430\u043c\u0438 \u0438 \u043a\u0430\u0440\u0442\u043e\u0447\u043a\u043e\u0439 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.

    "},{"location":"pages/main_page/#pages.main_page.MainPage","title":"MainPage","text":"

    Bases: BasePage

    \u041a\u043b\u0430\u0441\u0441 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0433\u043b\u0430\u0432\u043d\u043e\u0439 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435\u0439 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f.

    \u0410\u0442\u0440\u0438\u0431\u0443\u0442\u044b

    page: \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright. navigation_panel: \u041a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 \u043f\u0430\u043d\u0435\u043b\u0438 \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438. user_button: \u041a\u043d\u043e\u043f\u043a\u0430 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f. user_card: \u041a\u0430\u0440\u0442\u043e\u0447\u043a\u0430 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.

    Source code in pages\\main_page.py
    class MainPage(BasePage):\n    \"\"\"\u041a\u043b\u0430\u0441\u0441 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0433\u043b\u0430\u0432\u043d\u043e\u0439 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435\u0439 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f.\n\n    \u0410\u0442\u0440\u0438\u0431\u0443\u0442\u044b:\n        page: \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.\n        navigation_panel: \u041a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 \u043f\u0430\u043d\u0435\u043b\u0438 \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438.\n        user_button: \u041a\u043d\u043e\u043f\u043a\u0430 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\n        user_card: \u041a\u0430\u0440\u0442\u043e\u0447\u043a\u0430 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\n    \"\"\"\n\n    def __init__(self, page: Page) -> None:\n        \"\"\"\u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0433\u043b\u0430\u0432\u043d\u043e\u0439 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b.\n\n        Args:\n            page: \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.\n        \"\"\"\n\n        super().__init__(page)\n\n        self.navigation_panel = NavigationPanelComponent(page)\n        self.event_panel = EventPanelComponent(page)\n\n    # \u0414\u0435\u0439\u0441\u0442\u0432\u0438\u044f:\n    def click_main_navigation_panel_item(self, item_name: str) -> None:\n        \"\"\"\u041a\u043b\u0438\u043a\u0430\u0435\u0442 \u043f\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0443 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u043f\u0430\u043d\u0435\u043b\u0438 \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438.\n\n        Args:\n            item_name: \u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0434\u043b\u044f \u043a\u043b\u0438\u043a\u0430.\n        \"\"\"\n\n        self.navigation_panel.click_item(NavigationPanelLocators.PANEL_MAIN, item_name)\n\n    def click_subpanel_item(self, item_name: str) -> None:\n        \"\"\"\u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u044b\u0439 \u043f\u043e\u0438\u0441\u043a \u043f\u043e \u043f\u0430\u043d\u0435\u043b\u0438 \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438 \u0437\u0430\u0434\u0430\u043d\u043d\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0438 \u0434\u0435\u043b\u0430\u0435\u0442 \u043a\u043b\u0438\u043a \u043f\u043e \u043d\u0435\u043c\u0443.\"\"\"\n\n        active_item_locator = self.page.locator(NavigationPanelLocators.PANEL_MAIN).locator(NavigationPanelLocators.ACTIVE_CONTAINER)\n        node_locator = active_item_locator.locator(NavigationPanelLocators.SUB_PANEL_MAIN).locator(NavigationPanelLocators.TREEVIEW).first\n\n        # \u0420\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u044b\u0439 \u043f\u043e\u0438\u0441\u043a \u0432 \u0434\u0435\u0440\u0435\u0432\u0435 v-treeview \u0437\u0430\u0434\u0430\u043d\u043d\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0438 \u043a\u043b\u0438\u043a \u043f\u043e \u043d\u0435\u043c\u0443\n        self.navigation_panel.click_sub_item(node_locator, item_name)\n\n    def click_events_panel_expand_less_button(self) -> None:\n        \"\"\"\u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u043d\u0430\u0436\u0430\u0442\u0438\u0435 \u043a\u043d\u043e\u043f\u043a\u0438 \u0433\u0430\u043b\u043e\u0447\u043a\u0430 \u0432\u0432\u0435\u0440\u0445.\"\"\"\n\n        self.event_panel.click_expand_less_button()\n\n    def click_events_panel_expand_more_button(self) -> None:\n        \"\"\"\u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u043d\u0430\u0436\u0430\u0442\u0438\u0435 \u043a\u043d\u043e\u043f\u043a\u0438 \u0433\u0430\u043b\u043e\u0447\u043a\u0430 \u0432\u043d\u0438\u0437.\"\"\"\n\n        self.event_panel.click_expand_more_button()\n\n    def click_user_button(self) -> UserCard:\n        \"\"\"\u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u043d\u0430\u0436\u0430\u0442\u0438\u0435 \u043a\u043d\u043e\u043f\u043a\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\"\"\"\n\n        return self.event_panel.click_user_button()\n\n    def do_logout(self) -> None:\n        \"\"\"\u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u0432\u044b\u0445\u043e\u0434 \u0438\u0437 \u0441\u0438\u0441\u0442\u0435\u043c\u044b.\"\"\"\n\n        self.event_panel.do_logout()\n\n    def expand_navigation_subpanel(self):\n        \"\"\"\u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u043f\u043e\u043b\u043d\u043e\u0435 \u043e\u0442\u043a\u0440\u044b\u0442\u0438\u0435 \u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0439 \u0433\u043b\u0430\u0432\u043d\u043e\u0439 \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u043e\u043d\u043d\u043e\u0439 \u043f\u043e\u0434\u043f\u0430\u043d\u0435\u043b\u0438.\"\"\"\n\n        active_item_locator = self.page.locator(NavigationPanelLocators.PANEL_MAIN).locator(NavigationPanelLocators.ACTIVE_CONTAINER)\n        node_locator = active_item_locator.locator(NavigationPanelLocators.SUB_PANEL_MAIN).locator(NavigationPanelLocators.TREEVIEW).first\n\n        # \u0420\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u044b\u0439 \u043e\u0431\u0445\u043e\u0434 \u0434\u0435\u0440\u0435\u0432\u0430 v-treeview \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u043e\u0439 \u043f\u043e\u0434\u043f\u0430\u043d\u0435\u043b\u0438 \u0438 \u0432\u044b\u0432\u043e\u0434 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u043e\u0431 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u0445 \u0432 \u0440\u0435\u0436\u0438\u043c\u0435 \u043e\u0442\u043b\u0430\u0434\u043a\u0438 (debug=True)\n        self.navigation_panel.traverse_panel_tree(node_locator, debug=False)\n\n    def get_event_counters_by_tooltips(self) -> {}:\n        \"\"\"\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043d\u0430\u0431\u043e\u0440 \u0442\u0435\u043a\u0441\u0442\u043e\u0432 \u0432\u0441\u043f\u043b\u044b\u0432\u0430\u044e\u0449\u0438\u0445 \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043e\u043a \u043a\u043d\u043e\u043f\u043e\u043a \u0441\u0447\u0435\u0442\u0447\u0438\u043a\u043e\u0432 \u0441\u043e\u0431\u044b\u0442\u0438\u0439.\"\"\"\n\n        events = self.event_panel.get_event_tooltip_texts()\n\n        event_counters = {}\n\n        for event in events:\n            if len(event) > 0:\n                event_name, count = event.split(\" \")\n                event_counters[event_name] = count\n        return event_counters\n\n    def get_event_counters_by_buttons(self) -> {}:\n        \"\"\"\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043d\u0430\u0431\u043e\u0440 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u043a\u043d\u043e\u043f\u043e\u043a \u0441\u0447\u0435\u0442\u0447\u0438\u043a\u043e\u0432 \u0441\u043e\u0431\u044b\u0442\u0438\u0439.\"\"\"\n\n        return self.event_panel.get_event_button_values()\n\n    def get_events_panel_position(self) -> str:\n        \"\"\"\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0442\u0435\u043a\u0443\u0449\u0435\u0435 \u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043f\u0430\u043d\u0435\u043b\u0438 \u0441\u043e\u0431\u044b\u0442\u0438\u0439 \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b: \"top\", \"center\",\"bottom\".\"\"\"\n\n        return self.event_panel.get_panel_position()\n\n    def scroll_navigation_panel_up(self) -> None:\n        \"\"\"\u041f\u0440\u043e\u043a\u0440\u0443\u0447\u0438\u0432\u0430\u0435\u0442 \u043f\u0430\u043d\u0435\u043b\u044c \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438 \u0432\u0432\u0435\u0440\u0445.\"\"\"\n\n        self.navigation_panel.scroll_up(NavigationPanelLocators.PANEL_SCROLL_CONTAINER)\n\n    def scroll_navigation_panel_down(self) -> None:\n        \"\"\"\u041f\u0440\u043e\u043a\u0440\u0443\u0447\u0438\u0432\u0430\u0435\u0442 \u043f\u0430\u043d\u0435\u043b\u044c \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438 \u0432\u043d\u0438\u0437.\"\"\"\n\n        self.navigation_panel.scroll_down(NavigationPanelLocators.PANEL_SCROLL_CONTAINER)\n\n    # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0438:\n    def should_be_navigation_panel(self) -> None:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u043f\u0430\u043d\u0435\u043b\u0438 \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438.\"\"\"\n\n        self.navigation_panel.check_visibility(\n            NavigationPanelLocators.PANEL_MAIN,\n            \"Navigation panel is missing\"\n        )\n\n    def should_be_event_panel(self) -> None:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u043f\u0430\u043d\u0435\u043b\u0438 \u0441\u043e\u0431\u044b\u0442\u0438\u0439.\"\"\"\n\n        ## to-do: \u043a\u043d\u043e\u043f\u043a\u0438 \u0433\u0430\u043b\u043e\u0447\u043a\u0438???\n        self.event_panel.should_be_tab_buttons()\n        self.event_panel.should_be_event_buttons()\n        self.event_panel.should_be_search_button()\n        self.event_panel.should_be_user_button()\n\n    def check_expand_less_button(self) -> bool:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u043a\u043d\u043e\u043f\u043a\u0438 \u0433\u0430\u043b\u043e\u0447\u043a\u0430 \u0432\u0432\u0435\u0440\u0445.\"\"\"\n\n        return self.event_panel.check_expand_less_button()\n\n    def check_expand_more_button(self) -> bool:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u043a\u043d\u043e\u043f\u043a\u0438 \u0433\u0430\u043b\u043e\u0447\u043a\u0430 \u0432\u043d\u0438\u0437.\"\"\"\n\n        return self.event_panel.check_expand_more_button()\n\n    def check_navigation_panel_verticall_scrolling(self) -> bool:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u0439 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0438 \u043f\u0430\u043d\u0435\u043b\u0438.\n\n        Returns:\n            bool: True \u0435\u0441\u043b\u0438 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0430 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u0430, \u0438\u043d\u0430\u0447\u0435 False.\n        \"\"\"\n\n        return self.navigation_panel.is_scrollable_vertically(\n            NavigationPanelLocators.PANEL_SCROLL_CONTAINER\n        )\n\n    def check_navigation_panel_item_visibility(self, item_name: str) -> None:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0432 \u043f\u0430\u043d\u0435\u043b\u0438 \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438.\n\n        Args:\n            item_name: \u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0434\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438.\n        \"\"\"\n\n        self.navigation_panel.check_item_visibility(\n            NavigationPanelLocators.PANEL_MAIN,\n            item_name\n        )\n
    "},{"location":"pages/main_page/#pages.main_page.MainPage.__init__","title":"__init__(page)","text":"

    \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0433\u043b\u0430\u0432\u043d\u043e\u0439 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b.

    Parameters:

    Name Type Description Default page Page

    \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.

    required Source code in pages\\main_page.py
    def __init__(self, page: Page) -> None:\n    \"\"\"\u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0433\u043b\u0430\u0432\u043d\u043e\u0439 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b.\n\n    Args:\n        page: \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.\n    \"\"\"\n\n    super().__init__(page)\n\n    self.navigation_panel = NavigationPanelComponent(page)\n    self.event_panel = EventPanelComponent(page)\n
    "},{"location":"pages/main_page/#pages.main_page.MainPage.check_expand_less_button","title":"check_expand_less_button()","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u043a\u043d\u043e\u043f\u043a\u0438 \u0433\u0430\u043b\u043e\u0447\u043a\u0430 \u0432\u0432\u0435\u0440\u0445.

    Source code in pages\\main_page.py
    def check_expand_less_button(self) -> bool:\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u043a\u043d\u043e\u043f\u043a\u0438 \u0433\u0430\u043b\u043e\u0447\u043a\u0430 \u0432\u0432\u0435\u0440\u0445.\"\"\"\n\n    return self.event_panel.check_expand_less_button()\n
    "},{"location":"pages/main_page/#pages.main_page.MainPage.check_expand_more_button","title":"check_expand_more_button()","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u043a\u043d\u043e\u043f\u043a\u0438 \u0433\u0430\u043b\u043e\u0447\u043a\u0430 \u0432\u043d\u0438\u0437.

    Source code in pages\\main_page.py
    def check_expand_more_button(self) -> bool:\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u043a\u043d\u043e\u043f\u043a\u0438 \u0433\u0430\u043b\u043e\u0447\u043a\u0430 \u0432\u043d\u0438\u0437.\"\"\"\n\n    return self.event_panel.check_expand_more_button()\n
    "},{"location":"pages/main_page/#pages.main_page.MainPage.check_navigation_panel_item_visibility","title":"check_navigation_panel_item_visibility(item_name)","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0432 \u043f\u0430\u043d\u0435\u043b\u0438 \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438.

    Parameters:

    Name Type Description Default item_name str

    \u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0434\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438.

    required Source code in pages\\main_page.py
    def check_navigation_panel_item_visibility(self, item_name: str) -> None:\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0432 \u043f\u0430\u043d\u0435\u043b\u0438 \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438.\n\n    Args:\n        item_name: \u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0434\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438.\n    \"\"\"\n\n    self.navigation_panel.check_item_visibility(\n        NavigationPanelLocators.PANEL_MAIN,\n        item_name\n    )\n
    "},{"location":"pages/main_page/#pages.main_page.MainPage.check_navigation_panel_verticall_scrolling","title":"check_navigation_panel_verticall_scrolling()","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u0439 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0438 \u043f\u0430\u043d\u0435\u043b\u0438.

    Returns:

    Name Type Description bool bool

    True \u0435\u0441\u043b\u0438 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0430 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u0430, \u0438\u043d\u0430\u0447\u0435 False.

    Source code in pages\\main_page.py
    def check_navigation_panel_verticall_scrolling(self) -> bool:\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u0439 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0438 \u043f\u0430\u043d\u0435\u043b\u0438.\n\n    Returns:\n        bool: True \u0435\u0441\u043b\u0438 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0430 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u0430, \u0438\u043d\u0430\u0447\u0435 False.\n    \"\"\"\n\n    return self.navigation_panel.is_scrollable_vertically(\n        NavigationPanelLocators.PANEL_SCROLL_CONTAINER\n    )\n
    "},{"location":"pages/main_page/#pages.main_page.MainPage.click_events_panel_expand_less_button","title":"click_events_panel_expand_less_button()","text":"

    \u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u043d\u0430\u0436\u0430\u0442\u0438\u0435 \u043a\u043d\u043e\u043f\u043a\u0438 \u0433\u0430\u043b\u043e\u0447\u043a\u0430 \u0432\u0432\u0435\u0440\u0445.

    Source code in pages\\main_page.py
    def click_events_panel_expand_less_button(self) -> None:\n    \"\"\"\u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u043d\u0430\u0436\u0430\u0442\u0438\u0435 \u043a\u043d\u043e\u043f\u043a\u0438 \u0433\u0430\u043b\u043e\u0447\u043a\u0430 \u0432\u0432\u0435\u0440\u0445.\"\"\"\n\n    self.event_panel.click_expand_less_button()\n
    "},{"location":"pages/main_page/#pages.main_page.MainPage.click_events_panel_expand_more_button","title":"click_events_panel_expand_more_button()","text":"

    \u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u043d\u0430\u0436\u0430\u0442\u0438\u0435 \u043a\u043d\u043e\u043f\u043a\u0438 \u0433\u0430\u043b\u043e\u0447\u043a\u0430 \u0432\u043d\u0438\u0437.

    Source code in pages\\main_page.py
    def click_events_panel_expand_more_button(self) -> None:\n    \"\"\"\u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u043d\u0430\u0436\u0430\u0442\u0438\u0435 \u043a\u043d\u043e\u043f\u043a\u0438 \u0433\u0430\u043b\u043e\u0447\u043a\u0430 \u0432\u043d\u0438\u0437.\"\"\"\n\n    self.event_panel.click_expand_more_button()\n
    "},{"location":"pages/main_page/#pages.main_page.MainPage.click_main_navigation_panel_item","title":"click_main_navigation_panel_item(item_name)","text":"

    \u041a\u043b\u0438\u043a\u0430\u0435\u0442 \u043f\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0443 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u043f\u0430\u043d\u0435\u043b\u0438 \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438.

    Parameters:

    Name Type Description Default item_name str

    \u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0434\u043b\u044f \u043a\u043b\u0438\u043a\u0430.

    required Source code in pages\\main_page.py
    def click_main_navigation_panel_item(self, item_name: str) -> None:\n    \"\"\"\u041a\u043b\u0438\u043a\u0430\u0435\u0442 \u043f\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0443 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u043f\u0430\u043d\u0435\u043b\u0438 \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438.\n\n    Args:\n        item_name: \u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0434\u043b\u044f \u043a\u043b\u0438\u043a\u0430.\n    \"\"\"\n\n    self.navigation_panel.click_item(NavigationPanelLocators.PANEL_MAIN, item_name)\n
    "},{"location":"pages/main_page/#pages.main_page.MainPage.click_subpanel_item","title":"click_subpanel_item(item_name)","text":"

    \u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u044b\u0439 \u043f\u043e\u0438\u0441\u043a \u043f\u043e \u043f\u0430\u043d\u0435\u043b\u0438 \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438 \u0437\u0430\u0434\u0430\u043d\u043d\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0438 \u0434\u0435\u043b\u0430\u0435\u0442 \u043a\u043b\u0438\u043a \u043f\u043e \u043d\u0435\u043c\u0443.

    Source code in pages\\main_page.py
    def click_subpanel_item(self, item_name: str) -> None:\n    \"\"\"\u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u044b\u0439 \u043f\u043e\u0438\u0441\u043a \u043f\u043e \u043f\u0430\u043d\u0435\u043b\u0438 \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438 \u0437\u0430\u0434\u0430\u043d\u043d\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0438 \u0434\u0435\u043b\u0430\u0435\u0442 \u043a\u043b\u0438\u043a \u043f\u043e \u043d\u0435\u043c\u0443.\"\"\"\n\n    active_item_locator = self.page.locator(NavigationPanelLocators.PANEL_MAIN).locator(NavigationPanelLocators.ACTIVE_CONTAINER)\n    node_locator = active_item_locator.locator(NavigationPanelLocators.SUB_PANEL_MAIN).locator(NavigationPanelLocators.TREEVIEW).first\n\n    # \u0420\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u044b\u0439 \u043f\u043e\u0438\u0441\u043a \u0432 \u0434\u0435\u0440\u0435\u0432\u0435 v-treeview \u0437\u0430\u0434\u0430\u043d\u043d\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0438 \u043a\u043b\u0438\u043a \u043f\u043e \u043d\u0435\u043c\u0443\n    self.navigation_panel.click_sub_item(node_locator, item_name)\n
    "},{"location":"pages/main_page/#pages.main_page.MainPage.click_user_button","title":"click_user_button()","text":"

    \u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u043d\u0430\u0436\u0430\u0442\u0438\u0435 \u043a\u043d\u043e\u043f\u043a\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.

    Source code in pages\\main_page.py
    def click_user_button(self) -> UserCard:\n    \"\"\"\u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u043d\u0430\u0436\u0430\u0442\u0438\u0435 \u043a\u043d\u043e\u043f\u043a\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\"\"\"\n\n    return self.event_panel.click_user_button()\n
    "},{"location":"pages/main_page/#pages.main_page.MainPage.do_logout","title":"do_logout()","text":"

    \u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u0432\u044b\u0445\u043e\u0434 \u0438\u0437 \u0441\u0438\u0441\u0442\u0435\u043c\u044b.

    Source code in pages\\main_page.py
    def do_logout(self) -> None:\n    \"\"\"\u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u0432\u044b\u0445\u043e\u0434 \u0438\u0437 \u0441\u0438\u0441\u0442\u0435\u043c\u044b.\"\"\"\n\n    self.event_panel.do_logout()\n
    "},{"location":"pages/main_page/#pages.main_page.MainPage.expand_navigation_subpanel","title":"expand_navigation_subpanel()","text":"

    \u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u043f\u043e\u043b\u043d\u043e\u0435 \u043e\u0442\u043a\u0440\u044b\u0442\u0438\u0435 \u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0439 \u0433\u043b\u0430\u0432\u043d\u043e\u0439 \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u043e\u043d\u043d\u043e\u0439 \u043f\u043e\u0434\u043f\u0430\u043d\u0435\u043b\u0438.

    Source code in pages\\main_page.py
    def expand_navigation_subpanel(self):\n    \"\"\"\u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u043f\u043e\u043b\u043d\u043e\u0435 \u043e\u0442\u043a\u0440\u044b\u0442\u0438\u0435 \u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0439 \u0433\u043b\u0430\u0432\u043d\u043e\u0439 \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u043e\u043d\u043d\u043e\u0439 \u043f\u043e\u0434\u043f\u0430\u043d\u0435\u043b\u0438.\"\"\"\n\n    active_item_locator = self.page.locator(NavigationPanelLocators.PANEL_MAIN).locator(NavigationPanelLocators.ACTIVE_CONTAINER)\n    node_locator = active_item_locator.locator(NavigationPanelLocators.SUB_PANEL_MAIN).locator(NavigationPanelLocators.TREEVIEW).first\n\n    # \u0420\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u044b\u0439 \u043e\u0431\u0445\u043e\u0434 \u0434\u0435\u0440\u0435\u0432\u0430 v-treeview \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u043e\u0439 \u043f\u043e\u0434\u043f\u0430\u043d\u0435\u043b\u0438 \u0438 \u0432\u044b\u0432\u043e\u0434 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u043e\u0431 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u0445 \u0432 \u0440\u0435\u0436\u0438\u043c\u0435 \u043e\u0442\u043b\u0430\u0434\u043a\u0438 (debug=True)\n    self.navigation_panel.traverse_panel_tree(node_locator, debug=False)\n
    "},{"location":"pages/main_page/#pages.main_page.MainPage.get_event_counters_by_buttons","title":"get_event_counters_by_buttons()","text":"

    \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043d\u0430\u0431\u043e\u0440 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u043a\u043d\u043e\u043f\u043e\u043a \u0441\u0447\u0435\u0442\u0447\u0438\u043a\u043e\u0432 \u0441\u043e\u0431\u044b\u0442\u0438\u0439.

    Source code in pages\\main_page.py
    def get_event_counters_by_buttons(self) -> {}:\n    \"\"\"\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043d\u0430\u0431\u043e\u0440 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u043a\u043d\u043e\u043f\u043e\u043a \u0441\u0447\u0435\u0442\u0447\u0438\u043a\u043e\u0432 \u0441\u043e\u0431\u044b\u0442\u0438\u0439.\"\"\"\n\n    return self.event_panel.get_event_button_values()\n
    "},{"location":"pages/main_page/#pages.main_page.MainPage.get_event_counters_by_tooltips","title":"get_event_counters_by_tooltips()","text":"

    \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043d\u0430\u0431\u043e\u0440 \u0442\u0435\u043a\u0441\u0442\u043e\u0432 \u0432\u0441\u043f\u043b\u044b\u0432\u0430\u044e\u0449\u0438\u0445 \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043e\u043a \u043a\u043d\u043e\u043f\u043e\u043a \u0441\u0447\u0435\u0442\u0447\u0438\u043a\u043e\u0432 \u0441\u043e\u0431\u044b\u0442\u0438\u0439.

    Source code in pages\\main_page.py
    def get_event_counters_by_tooltips(self) -> {}:\n    \"\"\"\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043d\u0430\u0431\u043e\u0440 \u0442\u0435\u043a\u0441\u0442\u043e\u0432 \u0432\u0441\u043f\u043b\u044b\u0432\u0430\u044e\u0449\u0438\u0445 \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043e\u043a \u043a\u043d\u043e\u043f\u043e\u043a \u0441\u0447\u0435\u0442\u0447\u0438\u043a\u043e\u0432 \u0441\u043e\u0431\u044b\u0442\u0438\u0439.\"\"\"\n\n    events = self.event_panel.get_event_tooltip_texts()\n\n    event_counters = {}\n\n    for event in events:\n        if len(event) > 0:\n            event_name, count = event.split(\" \")\n            event_counters[event_name] = count\n    return event_counters\n
    "},{"location":"pages/main_page/#pages.main_page.MainPage.get_events_panel_position","title":"get_events_panel_position()","text":"

    \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0442\u0435\u043a\u0443\u0449\u0435\u0435 \u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043f\u0430\u043d\u0435\u043b\u0438 \u0441\u043e\u0431\u044b\u0442\u0438\u0439 \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b: \"top\", \"center\",\"bottom\".

    Source code in pages\\main_page.py
    def get_events_panel_position(self) -> str:\n    \"\"\"\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0442\u0435\u043a\u0443\u0449\u0435\u0435 \u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043f\u0430\u043d\u0435\u043b\u0438 \u0441\u043e\u0431\u044b\u0442\u0438\u0439 \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b: \"top\", \"center\",\"bottom\".\"\"\"\n\n    return self.event_panel.get_panel_position()\n
    "},{"location":"pages/main_page/#pages.main_page.MainPage.scroll_navigation_panel_down","title":"scroll_navigation_panel_down()","text":"

    \u041f\u0440\u043e\u043a\u0440\u0443\u0447\u0438\u0432\u0430\u0435\u0442 \u043f\u0430\u043d\u0435\u043b\u044c \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438 \u0432\u043d\u0438\u0437.

    Source code in pages\\main_page.py
    def scroll_navigation_panel_down(self) -> None:\n    \"\"\"\u041f\u0440\u043e\u043a\u0440\u0443\u0447\u0438\u0432\u0430\u0435\u0442 \u043f\u0430\u043d\u0435\u043b\u044c \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438 \u0432\u043d\u0438\u0437.\"\"\"\n\n    self.navigation_panel.scroll_down(NavigationPanelLocators.PANEL_SCROLL_CONTAINER)\n
    "},{"location":"pages/main_page/#pages.main_page.MainPage.scroll_navigation_panel_up","title":"scroll_navigation_panel_up()","text":"

    \u041f\u0440\u043e\u043a\u0440\u0443\u0447\u0438\u0432\u0430\u0435\u0442 \u043f\u0430\u043d\u0435\u043b\u044c \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438 \u0432\u0432\u0435\u0440\u0445.

    Source code in pages\\main_page.py
    def scroll_navigation_panel_up(self) -> None:\n    \"\"\"\u041f\u0440\u043e\u043a\u0440\u0443\u0447\u0438\u0432\u0430\u0435\u0442 \u043f\u0430\u043d\u0435\u043b\u044c \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438 \u0432\u0432\u0435\u0440\u0445.\"\"\"\n\n    self.navigation_panel.scroll_up(NavigationPanelLocators.PANEL_SCROLL_CONTAINER)\n
    "},{"location":"pages/main_page/#pages.main_page.MainPage.should_be_event_panel","title":"should_be_event_panel()","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u043f\u0430\u043d\u0435\u043b\u0438 \u0441\u043e\u0431\u044b\u0442\u0438\u0439.

    Source code in pages\\main_page.py
    def should_be_event_panel(self) -> None:\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u043f\u0430\u043d\u0435\u043b\u0438 \u0441\u043e\u0431\u044b\u0442\u0438\u0439.\"\"\"\n\n    ## to-do: \u043a\u043d\u043e\u043f\u043a\u0438 \u0433\u0430\u043b\u043e\u0447\u043a\u0438???\n    self.event_panel.should_be_tab_buttons()\n    self.event_panel.should_be_event_buttons()\n    self.event_panel.should_be_search_button()\n    self.event_panel.should_be_user_button()\n
    "},{"location":"pages/main_page/#pages.main_page.MainPage.should_be_navigation_panel","title":"should_be_navigation_panel()","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u043f\u0430\u043d\u0435\u043b\u0438 \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438.

    Source code in pages\\main_page.py
    def should_be_navigation_panel(self) -> None:\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u043f\u0430\u043d\u0435\u043b\u0438 \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438.\"\"\"\n\n    self.navigation_panel.check_visibility(\n        NavigationPanelLocators.PANEL_MAIN,\n        \"Navigation panel is missing\"\n    )\n
    "},{"location":"pages/service_status_tab/","title":"ServiceStatusTab","text":"

    \u041c\u043e\u0434\u0443\u043b\u044c \u0432\u043a\u043b\u0430\u0434\u043a\u0438 '\u0421\u0442\u0430\u0442\u0443\u0441 \u043e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u043d\u0438\u044f'.

    \u0421\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043a\u043b\u0430\u0441\u0441 ServiceStatusTab \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0442\u0430\u0431\u043b\u0438\u0446\u0435\u0439 \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432. \u041f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0442\u044c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0438 \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c \u0441 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u043c\u0438 \u0432\u043a\u043b\u0430\u0434\u043a\u0438.

    "},{"location":"pages/service_status_tab/#pages.service_status_tab.ServiceStatusTab","title":"ServiceStatusTab","text":"

    Bases: BasePage

    \u041a\u043b\u0430\u0441\u0441 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0432\u043a\u043b\u0430\u0434\u043a\u043e\u0439 '\u0421\u0442\u0430\u0442\u0443\u0441 \u043e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u043d\u0438\u044f'.

    \u041f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u043c\u0435\u0442\u043e\u0434\u044b \u0434\u043b\u044f \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0441 \u0442\u0430\u0431\u043b\u0438\u0446\u0435\u0439 \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432 \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0435\u0451 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f.

    Parameters:

    Name Type Description Default page Page

    \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.

    required Source code in pages\\service_status_tab.py
    class ServiceStatusTab(BasePage):\n    \"\"\"\u041a\u043b\u0430\u0441\u0441 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0432\u043a\u043b\u0430\u0434\u043a\u043e\u0439 '\u0421\u0442\u0430\u0442\u0443\u0441 \u043e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u043d\u0438\u044f'.\n\n    \u041f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u043c\u0435\u0442\u043e\u0434\u044b \u0434\u043b\u044f \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0441 \u0442\u0430\u0431\u043b\u0438\u0446\u0435\u0439 \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432 \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438\n    \u0435\u0451 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f.\n\n    Args:\n        page: \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.\n    \"\"\"\n\n    def __init__(self, page: Page) -> None:\n        \"\"\"\u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u044b \u0432\u043a\u043b\u0430\u0434\u043a\u0438 '\u0421\u0442\u0430\u0442\u0443\u0441 \u043e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u043d\u0438\u044f'.\"\"\"\n\n        super().__init__(page)\n\n        self.toolbar = ToolbarComponent(page, \"\u0421\u0442\u0430\u0442\u0443\u0441 \u043e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u043d\u0438\u044f\")\n        self.services_table = TableComponent(page)\n\n    def get_rows_count(self) -> int:\n        \"\"\"\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0441\u0442\u0440\u043e\u043a \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435 (\u0431\u0435\u0437 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430).\n\n        Returns:\n            int: \u041a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0441\u0442\u0440\u043e\u043a \u0441 \u0434\u0430\u043d\u043d\u044b\u043c\u0438.\n\n        Raises:\n            AssertionError: \u0415\u0441\u043b\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u043f\u0443\u0441\u0442\u0430.\n        \"\"\"\n\n        table_content = self.services_table.read(TableLocators.TABLE_WORK_AREA)\n        rows_count = len(table_content)\n\n        if rows_count == 0:\n            assert False, \"The contents of the table are missing\"\n\n        return rows_count - 1\n\n    def scroll_services_table_up(self) -> None:\n        \"\"\"\u041f\u0440\u043e\u043a\u0440\u0443\u0447\u0438\u0432\u0430\u0435\u0442 \u0442\u0430\u0431\u043b\u0438\u0446\u0443 \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432 \u0432\u0432\u0435\u0440\u0445.\"\"\"\n\n        self.services_table.scroll_up(TableLocators.TABLE_SCROLL_CONTAINER)\n\n    def scroll_services_table_down(self) -> None:\n        \"\"\"\u041f\u0440\u043e\u043a\u0440\u0443\u0447\u0438\u0432\u0430\u0435\u0442 \u0442\u0430\u0431\u043b\u0438\u0446\u0443 \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432 \u0432\u043d\u0438\u0437.\"\"\"\n\n        self.services_table.scroll_down(TableLocators.TABLE_SCROLL_CONTAINER)\n\n    def check_services_table_content(self) -> None:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432.\n\n        \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0438 \u0438 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435.\n\n\n\n\n        Raises:\n            AssertionError: \u0415\u0441\u043b\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u043f\u0443\u0441\u0442\u0430 \u0438\u043b\u0438 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0438 \u043d\u0435\u0432\u0435\u0440\u043d\u044b.\n        \"\"\"\n\n        expected_headers = [\n            '\u041a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440',\n            '\u0412\u0440\u0435\u043c\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f',\n            '\u0421\u0442\u0430\u0442\u0443\u0441',\n            '\u0412\u0440\u0435\u043c\u044f \u0440\u0430\u0431\u043e\u0442\u044b',\n            'Image ID',\n            'Image \u0422\u042d\u0413'\n        ]\n\n        table_content = self.services_table.read(TableLocators.TABLE_WORK_AREA)\n\n        if len(table_content) == 0:\n            assert False, \"The contents of the table are missing\"\n\n        actual_headers = table_content[0]\n\n        self.check_equals(\n            actual_headers,\n            expected_headers,\n            f\"Expected table headers {expected_headers} are not equal {actual_headers}\"\n        )\n\n        if len(table_content) == 1:\n            assert False, \"Table body is missing\"\n\n    def check_services_table_verticall_scrolling(self) -> bool:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u0439 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u044b.\n\n        Returns:\n            bool: True \u0435\u0441\u043b\u0438 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0430 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u0430, \u0438\u043d\u0430\u0447\u0435 False.\n        \"\"\"\n\n        return self.services_table.is_scrollable_vertically(\n            TableLocators.TABLE_SCROLL_CONTAINER\n        )\n\n    def check_services_table_first_row_visibility(self) -> None:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u043f\u0435\u0440\u0432\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u044b.\n\n        Raises:\n            AssertionError: \u0415\u0441\u043b\u0438 \u0441\u0442\u0440\u043e\u043a\u0430 \u043d\u0435 \u0432\u0438\u0434\u043d\u0430.\n        \"\"\"\n\n        self.services_table.check_first_row_visibility(TableLocators.TABLE_WORK_AREA)\n\n    def check_services_table_last_row_visibility(self) -> None:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0439 \u0441\u0442\u0440\u043e\u043a\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u044b.\n\n        Raises:\n            AssertionError: \u0415\u0441\u043b\u0438 \u0441\u0442\u0440\u043e\u043a\u0430 \u043d\u0435 \u0432\u0438\u0434\u043d\u0430.\n        \"\"\"\n\n        self.services_table.check_last_row_visibility(TableLocators.TABLE_WORK_AREA)\n\n    def check_services_table_row_highlighting(self, row_index: int) -> None:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u044b.\n\n        Args:\n            row_index: \u0418\u043d\u0434\u0435\u043a\u0441 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438.\n\n        Raises:\n            AssertionError: \u0415\u0441\u043b\u0438 \u0441\u0442\u0440\u043e\u043a\u0430 \u043d\u0435 \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u0430.\n        \"\"\"\n\n        self.services_table.check_row_highlighting(\n            TableLocators.TABLE_WORK_AREA,\n            row_index\n        )\n\n    def should_be_toolbar(self) -> None:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0442\u0443\u043b\u0431\u0430\u0440\u0430 \u043d\u0430 \u0432\u043a\u043b\u0430\u0434\u043a\u0435.\n\n        Raises:\n            AssertionError: \u0415\u0441\u043b\u0438 \u0442\u0443\u043b\u0431\u0430\u0440 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442.\n        \"\"\"\n\n        self.toolbar.check_toolbar_presence(\"Toolbar is missing\")\n\n    def should_be_services_table(self) -> None:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432.\n\n        Raises:\n            AssertionError: \u0415\u0441\u043b\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442.\n        \"\"\"\n\n        self.services_table.check_visibility(\n            TableLocators.TABLE_WORK_AREA,\n            \"Service statuses table is missing\"\n        )\n
    "},{"location":"pages/service_status_tab/#pages.service_status_tab.ServiceStatusTab.__init__","title":"__init__(page)","text":"

    \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u044b \u0432\u043a\u043b\u0430\u0434\u043a\u0438 '\u0421\u0442\u0430\u0442\u0443\u0441 \u043e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u043d\u0438\u044f'.

    Source code in pages\\service_status_tab.py
    def __init__(self, page: Page) -> None:\n    \"\"\"\u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u044b \u0432\u043a\u043b\u0430\u0434\u043a\u0438 '\u0421\u0442\u0430\u0442\u0443\u0441 \u043e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u043d\u0438\u044f'.\"\"\"\n\n    super().__init__(page)\n\n    self.toolbar = ToolbarComponent(page, \"\u0421\u0442\u0430\u0442\u0443\u0441 \u043e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u043d\u0438\u044f\")\n    self.services_table = TableComponent(page)\n
    "},{"location":"pages/service_status_tab/#pages.service_status_tab.ServiceStatusTab.check_services_table_content","title":"check_services_table_content()","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432.

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0438 \u0438 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435.

    Raises:

    Type Description AssertionError

    \u0415\u0441\u043b\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u043f\u0443\u0441\u0442\u0430 \u0438\u043b\u0438 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0438 \u043d\u0435\u0432\u0435\u0440\u043d\u044b.

    Source code in pages\\service_status_tab.py
    def check_services_table_content(self) -> None:\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432.\n\n    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0438 \u0438 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435.\n\n\n\n\n    Raises:\n        AssertionError: \u0415\u0441\u043b\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u043f\u0443\u0441\u0442\u0430 \u0438\u043b\u0438 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0438 \u043d\u0435\u0432\u0435\u0440\u043d\u044b.\n    \"\"\"\n\n    expected_headers = [\n        '\u041a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440',\n        '\u0412\u0440\u0435\u043c\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f',\n        '\u0421\u0442\u0430\u0442\u0443\u0441',\n        '\u0412\u0440\u0435\u043c\u044f \u0440\u0430\u0431\u043e\u0442\u044b',\n        'Image ID',\n        'Image \u0422\u042d\u0413'\n    ]\n\n    table_content = self.services_table.read(TableLocators.TABLE_WORK_AREA)\n\n    if len(table_content) == 0:\n        assert False, \"The contents of the table are missing\"\n\n    actual_headers = table_content[0]\n\n    self.check_equals(\n        actual_headers,\n        expected_headers,\n        f\"Expected table headers {expected_headers} are not equal {actual_headers}\"\n    )\n\n    if len(table_content) == 1:\n        assert False, \"Table body is missing\"\n
    "},{"location":"pages/service_status_tab/#pages.service_status_tab.ServiceStatusTab.check_services_table_first_row_visibility","title":"check_services_table_first_row_visibility()","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u043f\u0435\u0440\u0432\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u044b.

    Raises:

    Type Description AssertionError

    \u0415\u0441\u043b\u0438 \u0441\u0442\u0440\u043e\u043a\u0430 \u043d\u0435 \u0432\u0438\u0434\u043d\u0430.

    Source code in pages\\service_status_tab.py
    def check_services_table_first_row_visibility(self) -> None:\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u043f\u0435\u0440\u0432\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u044b.\n\n    Raises:\n        AssertionError: \u0415\u0441\u043b\u0438 \u0441\u0442\u0440\u043e\u043a\u0430 \u043d\u0435 \u0432\u0438\u0434\u043d\u0430.\n    \"\"\"\n\n    self.services_table.check_first_row_visibility(TableLocators.TABLE_WORK_AREA)\n
    "},{"location":"pages/service_status_tab/#pages.service_status_tab.ServiceStatusTab.check_services_table_last_row_visibility","title":"check_services_table_last_row_visibility()","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0439 \u0441\u0442\u0440\u043e\u043a\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u044b.

    Raises:

    Type Description AssertionError

    \u0415\u0441\u043b\u0438 \u0441\u0442\u0440\u043e\u043a\u0430 \u043d\u0435 \u0432\u0438\u0434\u043d\u0430.

    Source code in pages\\service_status_tab.py
    def check_services_table_last_row_visibility(self) -> None:\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0439 \u0441\u0442\u0440\u043e\u043a\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u044b.\n\n    Raises:\n        AssertionError: \u0415\u0441\u043b\u0438 \u0441\u0442\u0440\u043e\u043a\u0430 \u043d\u0435 \u0432\u0438\u0434\u043d\u0430.\n    \"\"\"\n\n    self.services_table.check_last_row_visibility(TableLocators.TABLE_WORK_AREA)\n
    "},{"location":"pages/service_status_tab/#pages.service_status_tab.ServiceStatusTab.check_services_table_row_highlighting","title":"check_services_table_row_highlighting(row_index)","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u044b.

    Parameters:

    Name Type Description Default row_index int

    \u0418\u043d\u0434\u0435\u043a\u0441 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438.

    required

    Raises:

    Type Description AssertionError

    \u0415\u0441\u043b\u0438 \u0441\u0442\u0440\u043e\u043a\u0430 \u043d\u0435 \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u0430.

    Source code in pages\\service_status_tab.py
    def check_services_table_row_highlighting(self, row_index: int) -> None:\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u044b.\n\n    Args:\n        row_index: \u0418\u043d\u0434\u0435\u043a\u0441 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438.\n\n    Raises:\n        AssertionError: \u0415\u0441\u043b\u0438 \u0441\u0442\u0440\u043e\u043a\u0430 \u043d\u0435 \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u0430.\n    \"\"\"\n\n    self.services_table.check_row_highlighting(\n        TableLocators.TABLE_WORK_AREA,\n        row_index\n    )\n
    "},{"location":"pages/service_status_tab/#pages.service_status_tab.ServiceStatusTab.check_services_table_verticall_scrolling","title":"check_services_table_verticall_scrolling()","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u0439 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u044b.

    Returns:

    Name Type Description bool bool

    True \u0435\u0441\u043b\u0438 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0430 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u0430, \u0438\u043d\u0430\u0447\u0435 False.

    Source code in pages\\service_status_tab.py
    def check_services_table_verticall_scrolling(self) -> bool:\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u0439 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u044b.\n\n    Returns:\n        bool: True \u0435\u0441\u043b\u0438 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0430 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u0430, \u0438\u043d\u0430\u0447\u0435 False.\n    \"\"\"\n\n    return self.services_table.is_scrollable_vertically(\n        TableLocators.TABLE_SCROLL_CONTAINER\n    )\n
    "},{"location":"pages/service_status_tab/#pages.service_status_tab.ServiceStatusTab.get_rows_count","title":"get_rows_count()","text":"

    \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0441\u0442\u0440\u043e\u043a \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435 (\u0431\u0435\u0437 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430).

    Returns:

    Name Type Description int int

    \u041a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0441\u0442\u0440\u043e\u043a \u0441 \u0434\u0430\u043d\u043d\u044b\u043c\u0438.

    Raises:

    Type Description AssertionError

    \u0415\u0441\u043b\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u043f\u0443\u0441\u0442\u0430.

    Source code in pages\\service_status_tab.py
    def get_rows_count(self) -> int:\n    \"\"\"\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0441\u0442\u0440\u043e\u043a \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435 (\u0431\u0435\u0437 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430).\n\n    Returns:\n        int: \u041a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0441\u0442\u0440\u043e\u043a \u0441 \u0434\u0430\u043d\u043d\u044b\u043c\u0438.\n\n    Raises:\n        AssertionError: \u0415\u0441\u043b\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u043f\u0443\u0441\u0442\u0430.\n    \"\"\"\n\n    table_content = self.services_table.read(TableLocators.TABLE_WORK_AREA)\n    rows_count = len(table_content)\n\n    if rows_count == 0:\n        assert False, \"The contents of the table are missing\"\n\n    return rows_count - 1\n
    "},{"location":"pages/service_status_tab/#pages.service_status_tab.ServiceStatusTab.scroll_services_table_down","title":"scroll_services_table_down()","text":"

    \u041f\u0440\u043e\u043a\u0440\u0443\u0447\u0438\u0432\u0430\u0435\u0442 \u0442\u0430\u0431\u043b\u0438\u0446\u0443 \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432 \u0432\u043d\u0438\u0437.

    Source code in pages\\service_status_tab.py
    def scroll_services_table_down(self) -> None:\n    \"\"\"\u041f\u0440\u043e\u043a\u0440\u0443\u0447\u0438\u0432\u0430\u0435\u0442 \u0442\u0430\u0431\u043b\u0438\u0446\u0443 \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432 \u0432\u043d\u0438\u0437.\"\"\"\n\n    self.services_table.scroll_down(TableLocators.TABLE_SCROLL_CONTAINER)\n
    "},{"location":"pages/service_status_tab/#pages.service_status_tab.ServiceStatusTab.scroll_services_table_up","title":"scroll_services_table_up()","text":"

    \u041f\u0440\u043e\u043a\u0440\u0443\u0447\u0438\u0432\u0430\u0435\u0442 \u0442\u0430\u0431\u043b\u0438\u0446\u0443 \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432 \u0432\u0432\u0435\u0440\u0445.

    Source code in pages\\service_status_tab.py
    def scroll_services_table_up(self) -> None:\n    \"\"\"\u041f\u0440\u043e\u043a\u0440\u0443\u0447\u0438\u0432\u0430\u0435\u0442 \u0442\u0430\u0431\u043b\u0438\u0446\u0443 \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432 \u0432\u0432\u0435\u0440\u0445.\"\"\"\n\n    self.services_table.scroll_up(TableLocators.TABLE_SCROLL_CONTAINER)\n
    "},{"location":"pages/service_status_tab/#pages.service_status_tab.ServiceStatusTab.should_be_services_table","title":"should_be_services_table()","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432.

    Raises:

    Type Description AssertionError

    \u0415\u0441\u043b\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442.

    Source code in pages\\service_status_tab.py
    def should_be_services_table(self) -> None:\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432.\n\n    Raises:\n        AssertionError: \u0415\u0441\u043b\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442.\n    \"\"\"\n\n    self.services_table.check_visibility(\n        TableLocators.TABLE_WORK_AREA,\n        \"Service statuses table is missing\"\n    )\n
    "},{"location":"pages/service_status_tab/#pages.service_status_tab.ServiceStatusTab.should_be_toolbar","title":"should_be_toolbar()","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0442\u0443\u043b\u0431\u0430\u0440\u0430 \u043d\u0430 \u0432\u043a\u043b\u0430\u0434\u043a\u0435.

    Raises:

    Type Description AssertionError

    \u0415\u0441\u043b\u0438 \u0442\u0443\u043b\u0431\u0430\u0440 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442.

    Source code in pages\\service_status_tab.py
    def should_be_toolbar(self) -> None:\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0442\u0443\u043b\u0431\u0430\u0440\u0430 \u043d\u0430 \u0432\u043a\u043b\u0430\u0434\u043a\u0435.\n\n    Raises:\n        AssertionError: \u0415\u0441\u043b\u0438 \u0442\u0443\u043b\u0431\u0430\u0440 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442.\n    \"\"\"\n\n    self.toolbar.check_toolbar_presence(\"Toolbar is missing\")\n
    "},{"location":"pages/session_tab/","title":"SessionTab","text":"

    \u041c\u043e\u0434\u0443\u043b\u044c \u0432\u043a\u043b\u0430\u0434\u043a\u0438 '\u0421\u0435\u0430\u043d\u0441'.

    \u0421\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043a\u043b\u0430\u0441\u0441 SessionsTab \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0442\u0430\u0431\u043b\u0438\u0446\u0435\u0439 \u0441\u0435\u0430\u043d\u0441\u043e\u0432. \u041f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0442\u044c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0438 \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c \u0441 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u043c\u0438 \u0432\u043a\u043b\u0430\u0434\u043a\u0438.

    "},{"location":"pages/session_tab/#pages.session_tab.SessionsTab","title":"SessionsTab","text":"

    Bases: BasePage

    \u041a\u043b\u0430\u0441\u0441 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0432\u043a\u043b\u0430\u0434\u043a\u043e\u0439 '\u0421\u0435\u0430\u043d\u0441'.

    \u041f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u043c\u0435\u0442\u043e\u0434\u044b \u0434\u043b\u044f \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0441 \u0442\u0430\u0431\u043b\u0438\u0446\u0435\u0439 \u0441\u0435\u0430\u043d\u0441\u043e\u0432 \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0435\u0451 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f.

    Parameters:

    Name Type Description Default page Page

    \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.

    required Source code in pages\\session_tab.py
    class SessionsTab(BasePage):\n    \"\"\"\u041a\u043b\u0430\u0441\u0441 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0432\u043a\u043b\u0430\u0434\u043a\u043e\u0439 '\u0421\u0435\u0430\u043d\u0441'.\n\n    \u041f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u043c\u0435\u0442\u043e\u0434\u044b \u0434\u043b\u044f \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0441 \u0442\u0430\u0431\u043b\u0438\u0446\u0435\u0439 \u0441\u0435\u0430\u043d\u0441\u043e\u0432 \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438\n    \u0435\u0451 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f.\n\n    Args:\n        page: \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.\n    \"\"\"\n\n    def __init__(self, page: Page) -> None:\n        \"\"\"\u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u044b \u0432\u043a\u043b\u0430\u0434\u043a\u0438 '\u0421\u0435\u0430\u043d\u0441'.\"\"\"\n\n        super().__init__(page)\n\n        self.toolbar = ToolbarComponent(page, \"\u0421\u0435\u0441\u0441\u0438\u044f\")\n        self.sessions_table = TableComponent(page)\n\n        self.delete_session_confirm = ConfirmComponent(page, \" \u041e\u0442\u043c\u0435\u043d\u0430 \", \" \u0423\u0434\u0430\u043b\u0438\u0442\u044c \")\n\n    # \u0414\u0435\u0439\u0441\u0442\u0432\u0438\u044f:\n    def get_rows_count(self) -> int:\n        \"\"\"\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0441\u0442\u0440\u043e\u043a \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435 (\u0431\u0435\u0437 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430).\n\n        Returns:\n            int: \u041a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0441\u0442\u0440\u043e\u043a \u0441 \u0434\u0430\u043d\u043d\u044b\u043c\u0438.\n\n        Raises:\n            AssertionError: \u0415\u0441\u043b\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u043f\u0443\u0441\u0442\u0430.\n        \"\"\"\n\n        table_content = self.sessions_table.read(TableLocators.TABLE_WORK_AREA)\n        rows_count = len(table_content)\n\n        if rows_count == 0:\n            assert False, \"The contents of the table are missing\"\n\n        return rows_count - 1\n\n    def get_delete_session_button_from_row(self, row_index: int) -> TooltipButton:\n        \"\"\"\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043a\u043d\u043e\u043f\u043a\u0443 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u0441\u0435\u0430\u043d\u0441\u0430 \u0434\u043b\u044f \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438.\n\n        Args:\n            row_index: \u0418\u043d\u0434\u0435\u043a\u0441 \u0441\u0442\u0440\u043e\u043a\u0438 \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435.\n\n        Returns:\n            TooltipButton: \u041a\u043d\u043e\u043f\u043a\u0430 \u0441 \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u043e\u0439.\n\n        Raises:\n            AssertionError: \u0415\u0441\u043b\u0438 \u0441\u0442\u0440\u043e\u043a\u0430 \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u0430.\n        \"\"\"\n\n        row_locator = self.sessions_table.get_row_locator(\n            TableLocators.TABLE_WORK_AREA,\n            row_index\n        )\n        assert isinstance(row_locator, Locator), f\"Row with index {row_index} is missing\"\n\n        button_locator = row_locator.locator(ButtonLocators.BUTTON_DELETE_SESSION)\n        return TooltipButton(self.page, button_locator, \"delete_session_button\")\n\n    def get_session_token(self) -> str:\n        \"\"\"\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0442\u043e\u043a\u0435\u043d \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\n\n        Args:\n\n        Returns:\n            str: \u0422\u043e\u043a\u0435\u043d \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\n\n        Raises:\n        \"\"\"\n        return host.get_access_token()\n\n    def find_session_in_table(self, token: str) -> int:\n        \"\"\"\u0418\u0449\u0435\u0442 \u0441\u0435\u0430\u043d\u0441 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435 \u043f\u043e \u0432\u044b\u0434\u0430\u043d\u043d\u043e\u043c\u0443 \u0435\u043c\u0443 \u0442\u043e\u043a\u0435\u043d\u0443.\n\n        Args:\n            token (str): \u0422\u043e\u043a\u0435\u043d \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\n\n        Returns:\n            int: \u0418\u043d\u0434\u0435\u043a\u0441 \u0441\u0442\u0440\u043e\u043a\u0438 \u0438\u043b\u0438 -1 \u0435\u0441\u043b\u0438 \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\n\n        Raises:\n            AssertionError: \u0415\u0441\u043b\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u043f\u0443\u0441\u0442\u0430.\n        \"\"\"\n        table_content = self.sessions_table.read(TableLocators.TABLE_WORK_AREA)\n        if len(table_content) == 0:\n            assert False, \"The contents of the table are missing\"\n\n        del table_content[0]  # \u0423\u0434\u0430\u043b\u044f\u0435\u043c \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a\n\n        for row_index, session_info in enumerate(table_content):\n            if token in session_info:\n                return row_index\n        return -1\n\n    def delete_session_by_token(self, token: str) -> None:\n        \"\"\"\u0423\u0434\u0430\u043b\u044f\u0435\u0442 \u0441\u0435\u0430\u043d\u0441 \u043f\u043e \u0442\u043e\u043a\u0435\u043d\u0443.\n\n        Args:\n            token (str): \u0422\u043e\u043a\u0435\u043d \u0441\u0435\u0430\u043d\u0441 \u0434\u043b\u044f \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f\n\n        Raises:\n            AssertionError: \u0415\u0441\u043b\u0438 \u0441\u0435\u0430\u043d\u0441 \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d \u0438\u043b\u0438 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u043d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c.\n        \"\"\"\n        row_index = self.find_session_in_table(token)\n        if row_index == -1:\n            raise AssertionError(f\"Session with token {token} not found\")\n\n        self.delete_session_by_index(row_index)\n\n    def delete_session_by_index(self, row_index: int) -> None:\n        \"\"\"\u0423\u0434\u0430\u043b\u044f\u0435\u0442 \u0441\u0435\u0430\u043d\u0441 \u043f\u043e \u0438\u043d\u0434\u0435\u043a\u0441\u0443 \u0441\u0442\u0440\u043e\u043a\u0438.\n\n        Args:\n            row_index (int): \u0418\u043d\u0434\u0435\u043a\u0441 \u0441\u0442\u0440\u043e\u043a\u0438 \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435\n\n        Raises:\n            AssertionError: \u0415\u0441\u043b\u0438 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u043d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c.\n        \"\"\"\n        try:\n            # \u041d\u0430\u0445\u043e\u0434\u0438\u043c \u043a\u043d\u043e\u043f\u043a\u0443 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u0441\u0435\u0430\u043d\u0441\u0430 \u0438 \u043d\u0430\u0436\u0438\u043c\u0430\u0435\u043c \u043d\u0430 \u043d\u0435\u0435\n            delete_session_button = self.get_delete_session_button_from_row(row_index)\n            delete_session_button.click()\n            self.page.wait_for_timeout(1000)\n\n            # \u041f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0430\u0435\u043c \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0435\n            self.delete_session_confirm.click_allow_button()\n\n            # \u0416\u0434\u0435\u043c \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u044b\n            self.page.wait_for_timeout(1000)\n\n        except Exception as e:\n            raise AssertionError(f\"Failed to delete session at index {row_index}: {e}\")\n\n\n    def scroll_sessions_table_up(self) -> None:\n        \"\"\"\u041f\u0440\u043e\u043a\u0440\u0443\u0447\u0438\u0432\u0430\u0435\u0442 \u0442\u0430\u0431\u043b\u0438\u0446\u0443 \u0441\u0435\u0430\u043d\u0441\u043e\u0432 \u0432\u0432\u0435\u0440\u0445.\"\"\"\n\n        self.sessions_table.scroll_up(TableLocators.TABLE_SCROLL_CONTAINER)\n\n    def scroll_sessions_table_down(self) -> None:\n        \"\"\"\u041f\u0440\u043e\u043a\u0440\u0443\u0447\u0438\u0432\u0430\u0435\u0442 \u0442\u0430\u0431\u043b\u0438\u0446\u0443 \u0441\u0435\u0430\u043d\u0441\u043e\u0432 \u0432\u043d\u0438\u0437.\"\"\"\n\n        self.sessions_table.scroll_down(TableLocators.TABLE_SCROLL_CONTAINER)\n\n    # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0438:\n    def check_delete_session_confirm_window(self):\n        \"\"\" \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043a\u043e\u043d\u0442\u0435\u043d\u0442 \u0438 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0433\u043e\u0440\u0438\u0437\u043e\u043d\u0442\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0441\u043a\u0440\u043e\u043b\u043b\u0438\u043d\u0433\u0430 \u043e\u043a\u043d\u0430 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u044f \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u0441\u0435\u0430\u043d\u0441. \"\"\"\n\n        # \u041f\u043e\u0438\u0441\u043a \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435 \u0441\u0435\u0430\u043d\u0441 \u0441\u0440\u043e\u043a\u0438 \u0434\u043b\u044f \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\n        session_token = self.get_session_token()\n        row_index = self.find_session_in_table(session_token)\n        if row_index == -1:\n            assert False, \"Session for this token has not been found\"\n\n        # \u041d\u0430\u0439\u0442\u0438 \u043a\u043d\u043e\u043f\u043a\u0443 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u0441\u0435\u0430\u043d\u0441\u0430 \u0438 \u043d\u0430\u0436\u0430\u0442\u044c \u043d\u0430 \u043d\u0435\u0435\n        delete_session_button = self.get_delete_session_button_from_row(row_index)\n        delete_session_button.click()\n\n        # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043e\u0442\u043a\u0440\u044b\u0442\u0438\u044f \u043e\u043a\u043d\u0430 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u044f \u0441 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u043e\u043c \"\u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435\"\n        title = \"\u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435\"\n        self.delete_session_confirm.check_title(\n            title,\n            f\"Confirmation dialog window text '{title}' is missing\"\n        )\n\n        # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0442\u0435\u043a\u0441\u0442\u0430 \u0432 \u043e\u043a\u043d\u0435 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u044f\n        confirm_message = f\"\u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0441\u0435\u0441\u0441\u0438\u044e {session_token}?\"\n        self.delete_session_confirm.check_text(\n            confirm_message,\n            \"Confirmation dialog window text does not match what is expected\"\n        )\n\n        # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043d\u0430\u043b\u0438\u0447\u0438\u044f \u0438 \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u043a\u043d\u043e\u043f\u043a\u0438 \"\u041e\u0442\u043c\u0435\u043d\u0430\"\n        self.delete_session_confirm.should_be_cancel_button()\n\n        # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043d\u0430\u043b\u0438\u0447\u0438\u044f \u0438 \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u043a\u043d\u043e\u043f\u043a\u0438 \"\u0423\u0434\u0430\u043b\u0438\u0442\u044c\"\n        self.delete_session_confirm.should_be_allow_button()\n\n        # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0442\u0435\u043a\u0441\u0442\u0430 \u043d\u0430 \u043a\u043d\u043e\u043f\u043a\u0430\u0445\n        self.delete_session_confirm.check_cancel_button_text(\" \u041e\u0442\u043c\u0435\u043d\u0430 \")\n        self.delete_session_confirm.check_allow_button_text(\" \u0423\u0434\u0430\u043b\u0438\u0442\u044c \")\n\n        # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0433\u043e\u0440\u0438\u0437\u043e\u043d\u0442\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0441\u043a\u0440\u043e\u043b\u043b\u0438\u043d\u0433\u0430\n        is_scrollable_horizontally = self.delete_session_confirm.check_window_horizontal_scrolling()\n        assert is_scrollable_horizontally, \"Should be horizontal scrolling\"\n\n        self.delete_session_confirm.scroll_window_right()\n        self.page.wait_for_timeout(3000)\n        self.delete_session_confirm.scroll_window_left()\n        self.page.wait_for_timeout(2000)\n\n        # \u041d\u0430\u0436\u0430\u0442\u044c \u043a\u043d\u043e\u043f\u043a\u0443 \"\u041e\u0442\u043c\u0435\u043d\u0430\"\n        self.delete_session_confirm.click_cancel_button()\n\n    def check_sessions_table_content(self, verify: bool = False) -> None:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0441\u0435\u0430\u043d\u0441\u043e\u0432.\n\n        Args:\n            verify: \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0442\u044c \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438\u0437 \u0411\u0414. \u041f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e False.\n\n        Raises:\n            AssertionError: \u0415\u0441\u043b\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u043f\u0443\u0441\u0442\u0430 \u0438\u043b\u0438 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0438 \u043d\u0435\u0432\u0435\u0440\u043d\u044b.\n        \"\"\"\n\n        expected_headers = [\n            'ID \u0441\u0435\u0441\u0441\u0438\u0438',\n            'ID \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f',\n            '\u0412\u0440\u0435\u043c\u044f \u0436\u0438\u0437\u043d\u0438',\n            '\u0420\u043e\u043b\u044c',\n            '\u0410\u0434\u0440\u0435\u0441'\n        ]\n\n        table_content = self.sessions_table.read(TableLocators.TABLE_WORK_AREA)\n        len_table_content = len(table_content)\n\n        if len_table_content == 0:\n            assert False, \"The contents of the table are missing\"\n\n        actual_headers = table_content[0]\n\n        self.check_equals(\n            actual_headers,\n            expected_headers,\n            f\"Expected table headers {expected_headers} are not equal {actual_headers}\"\n        )\n\n        if len_table_content == 1:\n            assert False, \"Table body is missing\"\n\n        if verify:\n            self.verify_sessions_table_content(table_content)\n\n        for index in range(len_table_content - 1):\n            self.should_be_delete_button_on_sessions_table_row(index, \"\u0423\u0434\u0430\u043b\u0438\u0442\u044c\")\n\n    def check_sessions_table_verticall_scrolling(self) -> bool:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u0439 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u044b.\n\n        Returns:\n            bool: True \u0435\u0441\u043b\u0438 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0430 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u0430, \u0438\u043d\u0430\u0447\u0435 False.\n        \"\"\"\n\n        return self.sessions_table.is_scrollable_vertically(\n            TableLocators.TABLE_SCROLL_CONTAINER\n        )\n\n    def check_sessions_table_first_row_visibility(self) -> None:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u043f\u0435\u0440\u0432\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u044b.\n\n        Raises:\n            AssertionError: \u0415\u0441\u043b\u0438 \u0441\u0442\u0440\u043e\u043a\u0430 \u043d\u0435 \u0432\u0438\u0434\u043d\u0430.\n        \"\"\"\n\n        self.sessions_table.check_first_row_visibility(TableLocators.TABLE_WORK_AREA)\n\n    def check_sessions_table_last_row_visibility(self) -> None:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0439 \u0441\u0442\u0440\u043e\u043a\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u044b.\n\n        Raises:\n            AssertionError: \u0415\u0441\u043b\u0438 \u0441\u0442\u0440\u043e\u043a\u0430 \u043d\u0435 \u0432\u0438\u0434\u043d\u0430.\n        \"\"\"\n\n        self.sessions_table.check_last_row_visibility(TableLocators.TABLE_WORK_AREA)\n\n    def check_sessions_table_row_highlighting(self, row_index: int) -> None:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u044b.\n\n        Args:\n            row_index: \u0418\u043d\u0434\u0435\u043a\u0441 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438.\n\n        Raises:\n            AssertionError: \u0415\u0441\u043b\u0438 \u0441\u0442\u0440\u043e\u043a\u0430 \u043d\u0435 \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u0430.\n        \"\"\"\n\n        self.sessions_table.check_row_highlighting(\n            TableLocators.TABLE_WORK_AREA,\n            row_index\n        )\n\n    def should_be_toolbar(self) -> None:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0442\u0443\u043b\u0431\u0430\u0440\u0430 \u043d\u0430 \u0432\u043a\u043b\u0430\u0434\u043a\u0435.\n\n        Raises:\n            AssertionError: \u0415\u0441\u043b\u0438 \u0442\u0443\u043b\u0431\u0430\u0440 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442.\n        \"\"\"\n\n        self.toolbar.check_toolbar_presence(\"Toolbar is missing\")\n\n    def should_be_sessions_table(self) -> None:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0441\u0435\u0430\u043d\u0441\u043e\u0432.\n\n        Raises:\n            AssertionError: \u0415\u0441\u043b\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442.\n        \"\"\"\n\n        self.sessions_table.check_visibility(\n            TableLocators.TABLE_WORK_AREA,\n            \"Sessions table is missing\"\n        )\n\n    def should_be_delete_button_on_sessions_table_row(\n        self,\n        row_index: int,\n        tooltip: str\n    ) -> None:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u043a\u043d\u043e\u043f\u043a\u0438 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u0432 \u0441\u0442\u0440\u043e\u043a\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u044b.\n\n        Args:\n            row_index: \u0418\u043d\u0434\u0435\u043a\u0441 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438.\n            tooltip: \u041e\u0436\u0438\u0434\u0430\u0435\u043c\u044b\u0439 \u0442\u0435\u043a\u0441\u0442 \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0438.\n\n        Raises:\n            AssertionError: \u0415\u0441\u043b\u0438 \u043a\u043d\u043e\u043f\u043a\u0430 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u0438\u043b\u0438 \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0430 \u043d\u0435\u0432\u0435\u0440\u043d\u0430.\n        \"\"\"\n        delete_button = self.get_delete_session_button_from_row(row_index)\n\n        # \u041e\u0436\u0438\u0434\u0430\u0435\u043c \u0438\u0441\u0447\u0435\u0437\u043d\u043e\u0432\u0435\u043d\u0438\u044f \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0445 \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043e\u043a \u043f\u0435\u0440\u0435\u0434 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u043e\u0439\n        delete_button.wait_for_tooltip_to_disappear()\n\n        delete_button.check_visibility(\n            f\"Delete session button is missing on {row_index} row\"\n        )\n        delete_button.check_tooltip_with_text(tooltip)\n\n        # \u041e\u0436\u0438\u0434\u0430\u0435\u043c \u0438\u0441\u0447\u0435\u0437\u043d\u043e\u0432\u0435\u043d\u0438\u044f \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0438 \u043f\u043e\u0441\u043b\u0435 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438\n        delete_button.wait_for_tooltip_to_disappear()\n\n\n    def should_be_session_in_table(self, token: str) -> None:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0441\u0435\u0430\u043d\u0441\u0430 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435.\n\n        Args:\n            token (str): \u0422\u043e\u043a\u0435\u043d \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\n\n        Raises:\n            AssertionError: \u0415\u0441\u043b\u0438 \u0441\u0435\u0430\u043d\u0441 \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d.\n        \"\"\"\n        found = self.find_session_in_table(token)\n        if found == -1:\n            assert False, \"Session for this token has not been found\"\n\n    def should_not_be_session_in_table(self, token: str) -> None:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u0435 \u0441\u0435\u0430\u043d\u0441\u0430 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435.\n\n        Args:\n            token (str): \u0422\u043e\u043a\u0435\u043d \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\n\n        Raises:\n            AssertionError: \u0415\u0441\u043b\u0438 \u0441\u0435\u0430\u043d\u0441 \u043d\u0430\u0439\u0434\u0435\u043d.\n        \"\"\"\n        found = self.find_session_in_table(token)\n        if found != -1:\n            assert False, \"Session for this token has been found\"\n\n\n    def verify_sessions_table_content(self, sessions_table: list) -> None:\n        \"\"\"\u0421\u0432\u0435\u0440\u044f\u0435\u0442 \u0434\u0430\u043d\u043d\u044b\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0441 \u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u0438\u0437 \u0411\u0414.\n\n        Args:\n            sessions_table: \u0414\u0430\u043d\u043d\u044b\u0435 \u0438\u0437 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u043d\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435.\n\n        Raises:\n            AssertionError: \u0415\u0441\u043b\u0438 \u0434\u0430\u043d\u043d\u044b\u0435 \u043d\u0435 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0442.\n        \"\"\"\n\n        expected_sessions_list = []\n\n        # \u041e\u0442\u043f\u0440\u0430\u0432\u043a\u0430 \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u043a \u0431\u044d\u043a\u0435\u043d\u0434\u0443 \u0434\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u043e \u0441\u0435\u0430\u043d\u0441\u0430\u0445\n        response = self.send_get_api_request(\"e-nms/auth/sessions\")\n        response_body = self.get_response_body(response)\n\n        for item in response_body:\n            session_info = []\n            session_info.append(item[\"id\"])\n            session_info.append(item[\"userId\"])\n\n            # \u0412\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u043d\u0435\u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u043c\u043e\u0435 \u043f\u043e\u043b\u0435: \u0432\u0440\u0435\u043c\u044f \u0436\u0438\u0437\u043d\u0438 \u0441\u0435\u0430\u043d\u0441\u0430\n            session_info.append(\"\")\n\n            roles = []\n            for role in item[\"roles\"]:\n                if role in roles_dict.keys():\n                    roles.append(roles_dict[role])\n\n            session_info.append(\",\".join(roles))\n            session_info.append(item[\"ip\"])\n\n            expected_sessions_list.append(session_info)\n\n        del sessions_table[0]  # \u0423\u0434\u0430\u043b\u044f\u0435\u043c \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a\n\n        self.check_lists_equals(\n            sessions_table,\n            expected_sessions_list,\n            \"Actual sessions list is not equal expected users list on base db\"\n        )\n
    "},{"location":"pages/session_tab/#pages.session_tab.SessionsTab.__init__","title":"__init__(page)","text":"

    \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u044b \u0432\u043a\u043b\u0430\u0434\u043a\u0438 '\u0421\u0435\u0430\u043d\u0441'.

    Source code in pages\\session_tab.py
    def __init__(self, page: Page) -> None:\n    \"\"\"\u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u044b \u0432\u043a\u043b\u0430\u0434\u043a\u0438 '\u0421\u0435\u0430\u043d\u0441'.\"\"\"\n\n    super().__init__(page)\n\n    self.toolbar = ToolbarComponent(page, \"\u0421\u0435\u0441\u0441\u0438\u044f\")\n    self.sessions_table = TableComponent(page)\n\n    self.delete_session_confirm = ConfirmComponent(page, \" \u041e\u0442\u043c\u0435\u043d\u0430 \", \" \u0423\u0434\u0430\u043b\u0438\u0442\u044c \")\n
    "},{"location":"pages/session_tab/#pages.session_tab.SessionsTab.check_delete_session_confirm_window","title":"check_delete_session_confirm_window()","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043a\u043e\u043d\u0442\u0435\u043d\u0442 \u0438 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0433\u043e\u0440\u0438\u0437\u043e\u043d\u0442\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0441\u043a\u0440\u043e\u043b\u043b\u0438\u043d\u0433\u0430 \u043e\u043a\u043d\u0430 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u044f \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u0441\u0435\u0430\u043d\u0441.

    Source code in pages\\session_tab.py
    def check_delete_session_confirm_window(self):\n    \"\"\" \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043a\u043e\u043d\u0442\u0435\u043d\u0442 \u0438 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0433\u043e\u0440\u0438\u0437\u043e\u043d\u0442\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0441\u043a\u0440\u043e\u043b\u043b\u0438\u043d\u0433\u0430 \u043e\u043a\u043d\u0430 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u044f \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u0441\u0435\u0430\u043d\u0441. \"\"\"\n\n    # \u041f\u043e\u0438\u0441\u043a \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435 \u0441\u0435\u0430\u043d\u0441 \u0441\u0440\u043e\u043a\u0438 \u0434\u043b\u044f \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\n    session_token = self.get_session_token()\n    row_index = self.find_session_in_table(session_token)\n    if row_index == -1:\n        assert False, \"Session for this token has not been found\"\n\n    # \u041d\u0430\u0439\u0442\u0438 \u043a\u043d\u043e\u043f\u043a\u0443 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u0441\u0435\u0430\u043d\u0441\u0430 \u0438 \u043d\u0430\u0436\u0430\u0442\u044c \u043d\u0430 \u043d\u0435\u0435\n    delete_session_button = self.get_delete_session_button_from_row(row_index)\n    delete_session_button.click()\n\n    # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043e\u0442\u043a\u0440\u044b\u0442\u0438\u044f \u043e\u043a\u043d\u0430 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u044f \u0441 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u043e\u043c \"\u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435\"\n    title = \"\u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435\"\n    self.delete_session_confirm.check_title(\n        title,\n        f\"Confirmation dialog window text '{title}' is missing\"\n    )\n\n    # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0442\u0435\u043a\u0441\u0442\u0430 \u0432 \u043e\u043a\u043d\u0435 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u044f\n    confirm_message = f\"\u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0441\u0435\u0441\u0441\u0438\u044e {session_token}?\"\n    self.delete_session_confirm.check_text(\n        confirm_message,\n        \"Confirmation dialog window text does not match what is expected\"\n    )\n\n    # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043d\u0430\u043b\u0438\u0447\u0438\u044f \u0438 \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u043a\u043d\u043e\u043f\u043a\u0438 \"\u041e\u0442\u043c\u0435\u043d\u0430\"\n    self.delete_session_confirm.should_be_cancel_button()\n\n    # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043d\u0430\u043b\u0438\u0447\u0438\u044f \u0438 \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u043a\u043d\u043e\u043f\u043a\u0438 \"\u0423\u0434\u0430\u043b\u0438\u0442\u044c\"\n    self.delete_session_confirm.should_be_allow_button()\n\n    # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0442\u0435\u043a\u0441\u0442\u0430 \u043d\u0430 \u043a\u043d\u043e\u043f\u043a\u0430\u0445\n    self.delete_session_confirm.check_cancel_button_text(\" \u041e\u0442\u043c\u0435\u043d\u0430 \")\n    self.delete_session_confirm.check_allow_button_text(\" \u0423\u0434\u0430\u043b\u0438\u0442\u044c \")\n\n    # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0433\u043e\u0440\u0438\u0437\u043e\u043d\u0442\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0441\u043a\u0440\u043e\u043b\u043b\u0438\u043d\u0433\u0430\n    is_scrollable_horizontally = self.delete_session_confirm.check_window_horizontal_scrolling()\n    assert is_scrollable_horizontally, \"Should be horizontal scrolling\"\n\n    self.delete_session_confirm.scroll_window_right()\n    self.page.wait_for_timeout(3000)\n    self.delete_session_confirm.scroll_window_left()\n    self.page.wait_for_timeout(2000)\n\n    # \u041d\u0430\u0436\u0430\u0442\u044c \u043a\u043d\u043e\u043f\u043a\u0443 \"\u041e\u0442\u043c\u0435\u043d\u0430\"\n    self.delete_session_confirm.click_cancel_button()\n
    "},{"location":"pages/session_tab/#pages.session_tab.SessionsTab.check_sessions_table_content","title":"check_sessions_table_content(verify=False)","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0441\u0435\u0430\u043d\u0441\u043e\u0432.

    Parameters:

    Name Type Description Default verify bool

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0442\u044c \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438\u0437 \u0411\u0414. \u041f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e False.

    False

    Raises:

    Type Description AssertionError

    \u0415\u0441\u043b\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u043f\u0443\u0441\u0442\u0430 \u0438\u043b\u0438 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0438 \u043d\u0435\u0432\u0435\u0440\u043d\u044b.

    Source code in pages\\session_tab.py
    def check_sessions_table_content(self, verify: bool = False) -> None:\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0441\u0435\u0430\u043d\u0441\u043e\u0432.\n\n    Args:\n        verify: \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0442\u044c \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438\u0437 \u0411\u0414. \u041f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e False.\n\n    Raises:\n        AssertionError: \u0415\u0441\u043b\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u043f\u0443\u0441\u0442\u0430 \u0438\u043b\u0438 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0438 \u043d\u0435\u0432\u0435\u0440\u043d\u044b.\n    \"\"\"\n\n    expected_headers = [\n        'ID \u0441\u0435\u0441\u0441\u0438\u0438',\n        'ID \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f',\n        '\u0412\u0440\u0435\u043c\u044f \u0436\u0438\u0437\u043d\u0438',\n        '\u0420\u043e\u043b\u044c',\n        '\u0410\u0434\u0440\u0435\u0441'\n    ]\n\n    table_content = self.sessions_table.read(TableLocators.TABLE_WORK_AREA)\n    len_table_content = len(table_content)\n\n    if len_table_content == 0:\n        assert False, \"The contents of the table are missing\"\n\n    actual_headers = table_content[0]\n\n    self.check_equals(\n        actual_headers,\n        expected_headers,\n        f\"Expected table headers {expected_headers} are not equal {actual_headers}\"\n    )\n\n    if len_table_content == 1:\n        assert False, \"Table body is missing\"\n\n    if verify:\n        self.verify_sessions_table_content(table_content)\n\n    for index in range(len_table_content - 1):\n        self.should_be_delete_button_on_sessions_table_row(index, \"\u0423\u0434\u0430\u043b\u0438\u0442\u044c\")\n
    "},{"location":"pages/session_tab/#pages.session_tab.SessionsTab.check_sessions_table_first_row_visibility","title":"check_sessions_table_first_row_visibility()","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u043f\u0435\u0440\u0432\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u044b.

    Raises:

    Type Description AssertionError

    \u0415\u0441\u043b\u0438 \u0441\u0442\u0440\u043e\u043a\u0430 \u043d\u0435 \u0432\u0438\u0434\u043d\u0430.

    Source code in pages\\session_tab.py
    def check_sessions_table_first_row_visibility(self) -> None:\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u043f\u0435\u0440\u0432\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u044b.\n\n    Raises:\n        AssertionError: \u0415\u0441\u043b\u0438 \u0441\u0442\u0440\u043e\u043a\u0430 \u043d\u0435 \u0432\u0438\u0434\u043d\u0430.\n    \"\"\"\n\n    self.sessions_table.check_first_row_visibility(TableLocators.TABLE_WORK_AREA)\n
    "},{"location":"pages/session_tab/#pages.session_tab.SessionsTab.check_sessions_table_last_row_visibility","title":"check_sessions_table_last_row_visibility()","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0439 \u0441\u0442\u0440\u043e\u043a\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u044b.

    Raises:

    Type Description AssertionError

    \u0415\u0441\u043b\u0438 \u0441\u0442\u0440\u043e\u043a\u0430 \u043d\u0435 \u0432\u0438\u0434\u043d\u0430.

    Source code in pages\\session_tab.py
    def check_sessions_table_last_row_visibility(self) -> None:\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0439 \u0441\u0442\u0440\u043e\u043a\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u044b.\n\n    Raises:\n        AssertionError: \u0415\u0441\u043b\u0438 \u0441\u0442\u0440\u043e\u043a\u0430 \u043d\u0435 \u0432\u0438\u0434\u043d\u0430.\n    \"\"\"\n\n    self.sessions_table.check_last_row_visibility(TableLocators.TABLE_WORK_AREA)\n
    "},{"location":"pages/session_tab/#pages.session_tab.SessionsTab.check_sessions_table_row_highlighting","title":"check_sessions_table_row_highlighting(row_index)","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u044b.

    Parameters:

    Name Type Description Default row_index int

    \u0418\u043d\u0434\u0435\u043a\u0441 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438.

    required

    Raises:

    Type Description AssertionError

    \u0415\u0441\u043b\u0438 \u0441\u0442\u0440\u043e\u043a\u0430 \u043d\u0435 \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u0430.

    Source code in pages\\session_tab.py
    def check_sessions_table_row_highlighting(self, row_index: int) -> None:\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u044b.\n\n    Args:\n        row_index: \u0418\u043d\u0434\u0435\u043a\u0441 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438.\n\n    Raises:\n        AssertionError: \u0415\u0441\u043b\u0438 \u0441\u0442\u0440\u043e\u043a\u0430 \u043d\u0435 \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u0430.\n    \"\"\"\n\n    self.sessions_table.check_row_highlighting(\n        TableLocators.TABLE_WORK_AREA,\n        row_index\n    )\n
    "},{"location":"pages/session_tab/#pages.session_tab.SessionsTab.check_sessions_table_verticall_scrolling","title":"check_sessions_table_verticall_scrolling()","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u0439 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u044b.

    Returns:

    Name Type Description bool bool

    True \u0435\u0441\u043b\u0438 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0430 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u0430, \u0438\u043d\u0430\u0447\u0435 False.

    Source code in pages\\session_tab.py
    def check_sessions_table_verticall_scrolling(self) -> bool:\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u0439 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u044b.\n\n    Returns:\n        bool: True \u0435\u0441\u043b\u0438 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0430 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u0430, \u0438\u043d\u0430\u0447\u0435 False.\n    \"\"\"\n\n    return self.sessions_table.is_scrollable_vertically(\n        TableLocators.TABLE_SCROLL_CONTAINER\n    )\n
    "},{"location":"pages/session_tab/#pages.session_tab.SessionsTab.delete_session_by_index","title":"delete_session_by_index(row_index)","text":"

    \u0423\u0434\u0430\u043b\u044f\u0435\u0442 \u0441\u0435\u0430\u043d\u0441 \u043f\u043e \u0438\u043d\u0434\u0435\u043a\u0441\u0443 \u0441\u0442\u0440\u043e\u043a\u0438.

    Parameters:

    Name Type Description Default row_index int

    \u0418\u043d\u0434\u0435\u043a\u0441 \u0441\u0442\u0440\u043e\u043a\u0438 \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435

    required

    Raises:

    Type Description AssertionError

    \u0415\u0441\u043b\u0438 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u043d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c.

    Source code in pages\\session_tab.py
    def delete_session_by_index(self, row_index: int) -> None:\n    \"\"\"\u0423\u0434\u0430\u043b\u044f\u0435\u0442 \u0441\u0435\u0430\u043d\u0441 \u043f\u043e \u0438\u043d\u0434\u0435\u043a\u0441\u0443 \u0441\u0442\u0440\u043e\u043a\u0438.\n\n    Args:\n        row_index (int): \u0418\u043d\u0434\u0435\u043a\u0441 \u0441\u0442\u0440\u043e\u043a\u0438 \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435\n\n    Raises:\n        AssertionError: \u0415\u0441\u043b\u0438 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u043d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c.\n    \"\"\"\n    try:\n        # \u041d\u0430\u0445\u043e\u0434\u0438\u043c \u043a\u043d\u043e\u043f\u043a\u0443 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u0441\u0435\u0430\u043d\u0441\u0430 \u0438 \u043d\u0430\u0436\u0438\u043c\u0430\u0435\u043c \u043d\u0430 \u043d\u0435\u0435\n        delete_session_button = self.get_delete_session_button_from_row(row_index)\n        delete_session_button.click()\n        self.page.wait_for_timeout(1000)\n\n        # \u041f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0430\u0435\u043c \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0435\n        self.delete_session_confirm.click_allow_button()\n\n        # \u0416\u0434\u0435\u043c \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u044b\n        self.page.wait_for_timeout(1000)\n\n    except Exception as e:\n        raise AssertionError(f\"Failed to delete session at index {row_index}: {e}\")\n
    "},{"location":"pages/session_tab/#pages.session_tab.SessionsTab.delete_session_by_token","title":"delete_session_by_token(token)","text":"

    \u0423\u0434\u0430\u043b\u044f\u0435\u0442 \u0441\u0435\u0430\u043d\u0441 \u043f\u043e \u0442\u043e\u043a\u0435\u043d\u0443.

    Parameters:

    Name Type Description Default token str

    \u0422\u043e\u043a\u0435\u043d \u0441\u0435\u0430\u043d\u0441 \u0434\u043b\u044f \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f

    required

    Raises:

    Type Description AssertionError

    \u0415\u0441\u043b\u0438 \u0441\u0435\u0430\u043d\u0441 \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d \u0438\u043b\u0438 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u043d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c.

    Source code in pages\\session_tab.py
    def delete_session_by_token(self, token: str) -> None:\n    \"\"\"\u0423\u0434\u0430\u043b\u044f\u0435\u0442 \u0441\u0435\u0430\u043d\u0441 \u043f\u043e \u0442\u043e\u043a\u0435\u043d\u0443.\n\n    Args:\n        token (str): \u0422\u043e\u043a\u0435\u043d \u0441\u0435\u0430\u043d\u0441 \u0434\u043b\u044f \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f\n\n    Raises:\n        AssertionError: \u0415\u0441\u043b\u0438 \u0441\u0435\u0430\u043d\u0441 \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d \u0438\u043b\u0438 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u043d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c.\n    \"\"\"\n    row_index = self.find_session_in_table(token)\n    if row_index == -1:\n        raise AssertionError(f\"Session with token {token} not found\")\n\n    self.delete_session_by_index(row_index)\n
    "},{"location":"pages/session_tab/#pages.session_tab.SessionsTab.find_session_in_table","title":"find_session_in_table(token)","text":"

    \u0418\u0449\u0435\u0442 \u0441\u0435\u0430\u043d\u0441 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435 \u043f\u043e \u0432\u044b\u0434\u0430\u043d\u043d\u043e\u043c\u0443 \u0435\u043c\u0443 \u0442\u043e\u043a\u0435\u043d\u0443.

    Parameters:

    Name Type Description Default token str

    \u0422\u043e\u043a\u0435\u043d \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f

    required

    Returns:

    Name Type Description int int

    \u0418\u043d\u0434\u0435\u043a\u0441 \u0441\u0442\u0440\u043e\u043a\u0438 \u0438\u043b\u0438 -1 \u0435\u0441\u043b\u0438 \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d

    Raises:

    Type Description AssertionError

    \u0415\u0441\u043b\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u043f\u0443\u0441\u0442\u0430.

    Source code in pages\\session_tab.py
    def find_session_in_table(self, token: str) -> int:\n    \"\"\"\u0418\u0449\u0435\u0442 \u0441\u0435\u0430\u043d\u0441 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435 \u043f\u043e \u0432\u044b\u0434\u0430\u043d\u043d\u043e\u043c\u0443 \u0435\u043c\u0443 \u0442\u043e\u043a\u0435\u043d\u0443.\n\n    Args:\n        token (str): \u0422\u043e\u043a\u0435\u043d \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\n\n    Returns:\n        int: \u0418\u043d\u0434\u0435\u043a\u0441 \u0441\u0442\u0440\u043e\u043a\u0438 \u0438\u043b\u0438 -1 \u0435\u0441\u043b\u0438 \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\n\n    Raises:\n        AssertionError: \u0415\u0441\u043b\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u043f\u0443\u0441\u0442\u0430.\n    \"\"\"\n    table_content = self.sessions_table.read(TableLocators.TABLE_WORK_AREA)\n    if len(table_content) == 0:\n        assert False, \"The contents of the table are missing\"\n\n    del table_content[0]  # \u0423\u0434\u0430\u043b\u044f\u0435\u043c \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a\n\n    for row_index, session_info in enumerate(table_content):\n        if token in session_info:\n            return row_index\n    return -1\n
    "},{"location":"pages/session_tab/#pages.session_tab.SessionsTab.get_delete_session_button_from_row","title":"get_delete_session_button_from_row(row_index)","text":"

    \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043a\u043d\u043e\u043f\u043a\u0443 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u0441\u0435\u0430\u043d\u0441\u0430 \u0434\u043b\u044f \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438.

    Parameters:

    Name Type Description Default row_index int

    \u0418\u043d\u0434\u0435\u043a\u0441 \u0441\u0442\u0440\u043e\u043a\u0438 \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435.

    required

    Returns:

    Name Type Description TooltipButton TooltipButton

    \u041a\u043d\u043e\u043f\u043a\u0430 \u0441 \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u043e\u0439.

    Raises:

    Type Description AssertionError

    \u0415\u0441\u043b\u0438 \u0441\u0442\u0440\u043e\u043a\u0430 \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u0430.

    Source code in pages\\session_tab.py
    def get_delete_session_button_from_row(self, row_index: int) -> TooltipButton:\n    \"\"\"\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043a\u043d\u043e\u043f\u043a\u0443 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u0441\u0435\u0430\u043d\u0441\u0430 \u0434\u043b\u044f \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438.\n\n    Args:\n        row_index: \u0418\u043d\u0434\u0435\u043a\u0441 \u0441\u0442\u0440\u043e\u043a\u0438 \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435.\n\n    Returns:\n        TooltipButton: \u041a\u043d\u043e\u043f\u043a\u0430 \u0441 \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u043e\u0439.\n\n    Raises:\n        AssertionError: \u0415\u0441\u043b\u0438 \u0441\u0442\u0440\u043e\u043a\u0430 \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u0430.\n    \"\"\"\n\n    row_locator = self.sessions_table.get_row_locator(\n        TableLocators.TABLE_WORK_AREA,\n        row_index\n    )\n    assert isinstance(row_locator, Locator), f\"Row with index {row_index} is missing\"\n\n    button_locator = row_locator.locator(ButtonLocators.BUTTON_DELETE_SESSION)\n    return TooltipButton(self.page, button_locator, \"delete_session_button\")\n
    "},{"location":"pages/session_tab/#pages.session_tab.SessionsTab.get_rows_count","title":"get_rows_count()","text":"

    \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0441\u0442\u0440\u043e\u043a \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435 (\u0431\u0435\u0437 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430).

    Returns:

    Name Type Description int int

    \u041a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0441\u0442\u0440\u043e\u043a \u0441 \u0434\u0430\u043d\u043d\u044b\u043c\u0438.

    Raises:

    Type Description AssertionError

    \u0415\u0441\u043b\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u043f\u0443\u0441\u0442\u0430.

    Source code in pages\\session_tab.py
    def get_rows_count(self) -> int:\n    \"\"\"\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0441\u0442\u0440\u043e\u043a \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435 (\u0431\u0435\u0437 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430).\n\n    Returns:\n        int: \u041a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0441\u0442\u0440\u043e\u043a \u0441 \u0434\u0430\u043d\u043d\u044b\u043c\u0438.\n\n    Raises:\n        AssertionError: \u0415\u0441\u043b\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u043f\u0443\u0441\u0442\u0430.\n    \"\"\"\n\n    table_content = self.sessions_table.read(TableLocators.TABLE_WORK_AREA)\n    rows_count = len(table_content)\n\n    if rows_count == 0:\n        assert False, \"The contents of the table are missing\"\n\n    return rows_count - 1\n
    "},{"location":"pages/session_tab/#pages.session_tab.SessionsTab.get_session_token","title":"get_session_token()","text":"

    \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0442\u043e\u043a\u0435\u043d \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.

    Args:

    Returns:

    Name Type Description str str

    \u0422\u043e\u043a\u0435\u043d \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f

    Raises:

    Source code in pages\\session_tab.py
    def get_session_token(self) -> str:\n    \"\"\"\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0442\u043e\u043a\u0435\u043d \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\n\n    Args:\n\n    Returns:\n        str: \u0422\u043e\u043a\u0435\u043d \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\n\n    Raises:\n    \"\"\"\n    return host.get_access_token()\n
    "},{"location":"pages/session_tab/#pages.session_tab.SessionsTab.scroll_sessions_table_down","title":"scroll_sessions_table_down()","text":"

    \u041f\u0440\u043e\u043a\u0440\u0443\u0447\u0438\u0432\u0430\u0435\u0442 \u0442\u0430\u0431\u043b\u0438\u0446\u0443 \u0441\u0435\u0430\u043d\u0441\u043e\u0432 \u0432\u043d\u0438\u0437.

    Source code in pages\\session_tab.py
    def scroll_sessions_table_down(self) -> None:\n    \"\"\"\u041f\u0440\u043e\u043a\u0440\u0443\u0447\u0438\u0432\u0430\u0435\u0442 \u0442\u0430\u0431\u043b\u0438\u0446\u0443 \u0441\u0435\u0430\u043d\u0441\u043e\u0432 \u0432\u043d\u0438\u0437.\"\"\"\n\n    self.sessions_table.scroll_down(TableLocators.TABLE_SCROLL_CONTAINER)\n
    "},{"location":"pages/session_tab/#pages.session_tab.SessionsTab.scroll_sessions_table_up","title":"scroll_sessions_table_up()","text":"

    \u041f\u0440\u043e\u043a\u0440\u0443\u0447\u0438\u0432\u0430\u0435\u0442 \u0442\u0430\u0431\u043b\u0438\u0446\u0443 \u0441\u0435\u0430\u043d\u0441\u043e\u0432 \u0432\u0432\u0435\u0440\u0445.

    Source code in pages\\session_tab.py
    def scroll_sessions_table_up(self) -> None:\n    \"\"\"\u041f\u0440\u043e\u043a\u0440\u0443\u0447\u0438\u0432\u0430\u0435\u0442 \u0442\u0430\u0431\u043b\u0438\u0446\u0443 \u0441\u0435\u0430\u043d\u0441\u043e\u0432 \u0432\u0432\u0435\u0440\u0445.\"\"\"\n\n    self.sessions_table.scroll_up(TableLocators.TABLE_SCROLL_CONTAINER)\n
    "},{"location":"pages/session_tab/#pages.session_tab.SessionsTab.should_be_delete_button_on_sessions_table_row","title":"should_be_delete_button_on_sessions_table_row(row_index, tooltip)","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u043a\u043d\u043e\u043f\u043a\u0438 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u0432 \u0441\u0442\u0440\u043e\u043a\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u044b.

    Parameters:

    Name Type Description Default row_index int

    \u0418\u043d\u0434\u0435\u043a\u0441 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438.

    required tooltip str

    \u041e\u0436\u0438\u0434\u0430\u0435\u043c\u044b\u0439 \u0442\u0435\u043a\u0441\u0442 \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0438.

    required

    Raises:

    Type Description AssertionError

    \u0415\u0441\u043b\u0438 \u043a\u043d\u043e\u043f\u043a\u0430 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u0438\u043b\u0438 \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0430 \u043d\u0435\u0432\u0435\u0440\u043d\u0430.

    Source code in pages\\session_tab.py
    def should_be_delete_button_on_sessions_table_row(\n    self,\n    row_index: int,\n    tooltip: str\n) -> None:\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u043a\u043d\u043e\u043f\u043a\u0438 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u0432 \u0441\u0442\u0440\u043e\u043a\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u044b.\n\n    Args:\n        row_index: \u0418\u043d\u0434\u0435\u043a\u0441 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438.\n        tooltip: \u041e\u0436\u0438\u0434\u0430\u0435\u043c\u044b\u0439 \u0442\u0435\u043a\u0441\u0442 \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0438.\n\n    Raises:\n        AssertionError: \u0415\u0441\u043b\u0438 \u043a\u043d\u043e\u043f\u043a\u0430 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u0438\u043b\u0438 \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0430 \u043d\u0435\u0432\u0435\u0440\u043d\u0430.\n    \"\"\"\n    delete_button = self.get_delete_session_button_from_row(row_index)\n\n    # \u041e\u0436\u0438\u0434\u0430\u0435\u043c \u0438\u0441\u0447\u0435\u0437\u043d\u043e\u0432\u0435\u043d\u0438\u044f \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0445 \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043e\u043a \u043f\u0435\u0440\u0435\u0434 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u043e\u0439\n    delete_button.wait_for_tooltip_to_disappear()\n\n    delete_button.check_visibility(\n        f\"Delete session button is missing on {row_index} row\"\n    )\n    delete_button.check_tooltip_with_text(tooltip)\n\n    # \u041e\u0436\u0438\u0434\u0430\u0435\u043c \u0438\u0441\u0447\u0435\u0437\u043d\u043e\u0432\u0435\u043d\u0438\u044f \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0438 \u043f\u043e\u0441\u043b\u0435 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438\n    delete_button.wait_for_tooltip_to_disappear()\n
    "},{"location":"pages/session_tab/#pages.session_tab.SessionsTab.should_be_session_in_table","title":"should_be_session_in_table(token)","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0441\u0435\u0430\u043d\u0441\u0430 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435.

    Parameters:

    Name Type Description Default token str

    \u0422\u043e\u043a\u0435\u043d \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f

    required

    Raises:

    Type Description AssertionError

    \u0415\u0441\u043b\u0438 \u0441\u0435\u0430\u043d\u0441 \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d.

    Source code in pages\\session_tab.py
    def should_be_session_in_table(self, token: str) -> None:\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0441\u0435\u0430\u043d\u0441\u0430 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435.\n\n    Args:\n        token (str): \u0422\u043e\u043a\u0435\u043d \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\n\n    Raises:\n        AssertionError: \u0415\u0441\u043b\u0438 \u0441\u0435\u0430\u043d\u0441 \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d.\n    \"\"\"\n    found = self.find_session_in_table(token)\n    if found == -1:\n        assert False, \"Session for this token has not been found\"\n
    "},{"location":"pages/session_tab/#pages.session_tab.SessionsTab.should_be_sessions_table","title":"should_be_sessions_table()","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0441\u0435\u0430\u043d\u0441\u043e\u0432.

    Raises:

    Type Description AssertionError

    \u0415\u0441\u043b\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442.

    Source code in pages\\session_tab.py
    def should_be_sessions_table(self) -> None:\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0441\u0435\u0430\u043d\u0441\u043e\u0432.\n\n    Raises:\n        AssertionError: \u0415\u0441\u043b\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442.\n    \"\"\"\n\n    self.sessions_table.check_visibility(\n        TableLocators.TABLE_WORK_AREA,\n        \"Sessions table is missing\"\n    )\n
    "},{"location":"pages/session_tab/#pages.session_tab.SessionsTab.should_be_toolbar","title":"should_be_toolbar()","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0442\u0443\u043b\u0431\u0430\u0440\u0430 \u043d\u0430 \u0432\u043a\u043b\u0430\u0434\u043a\u0435.

    Raises:

    Type Description AssertionError

    \u0415\u0441\u043b\u0438 \u0442\u0443\u043b\u0431\u0430\u0440 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442.

    Source code in pages\\session_tab.py
    def should_be_toolbar(self) -> None:\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0442\u0443\u043b\u0431\u0430\u0440\u0430 \u043d\u0430 \u0432\u043a\u043b\u0430\u0434\u043a\u0435.\n\n    Raises:\n        AssertionError: \u0415\u0441\u043b\u0438 \u0442\u0443\u043b\u0431\u0430\u0440 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442.\n    \"\"\"\n\n    self.toolbar.check_toolbar_presence(\"Toolbar is missing\")\n
    "},{"location":"pages/session_tab/#pages.session_tab.SessionsTab.should_not_be_session_in_table","title":"should_not_be_session_in_table(token)","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u0435 \u0441\u0435\u0430\u043d\u0441\u0430 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435.

    Parameters:

    Name Type Description Default token str

    \u0422\u043e\u043a\u0435\u043d \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f

    required

    Raises:

    Type Description AssertionError

    \u0415\u0441\u043b\u0438 \u0441\u0435\u0430\u043d\u0441 \u043d\u0430\u0439\u0434\u0435\u043d.

    Source code in pages\\session_tab.py
    def should_not_be_session_in_table(self, token: str) -> None:\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u0435 \u0441\u0435\u0430\u043d\u0441\u0430 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435.\n\n    Args:\n        token (str): \u0422\u043e\u043a\u0435\u043d \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\n\n    Raises:\n        AssertionError: \u0415\u0441\u043b\u0438 \u0441\u0435\u0430\u043d\u0441 \u043d\u0430\u0439\u0434\u0435\u043d.\n    \"\"\"\n    found = self.find_session_in_table(token)\n    if found != -1:\n        assert False, \"Session for this token has been found\"\n
    "},{"location":"pages/session_tab/#pages.session_tab.SessionsTab.verify_sessions_table_content","title":"verify_sessions_table_content(sessions_table)","text":"

    \u0421\u0432\u0435\u0440\u044f\u0435\u0442 \u0434\u0430\u043d\u043d\u044b\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0441 \u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u0438\u0437 \u0411\u0414.

    Parameters:

    Name Type Description Default sessions_table list

    \u0414\u0430\u043d\u043d\u044b\u0435 \u0438\u0437 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u043d\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435.

    required

    Raises:

    Type Description AssertionError

    \u0415\u0441\u043b\u0438 \u0434\u0430\u043d\u043d\u044b\u0435 \u043d\u0435 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0442.

    Source code in pages\\session_tab.py
    def verify_sessions_table_content(self, sessions_table: list) -> None:\n    \"\"\"\u0421\u0432\u0435\u0440\u044f\u0435\u0442 \u0434\u0430\u043d\u043d\u044b\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0441 \u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u0438\u0437 \u0411\u0414.\n\n    Args:\n        sessions_table: \u0414\u0430\u043d\u043d\u044b\u0435 \u0438\u0437 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u043d\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435.\n\n    Raises:\n        AssertionError: \u0415\u0441\u043b\u0438 \u0434\u0430\u043d\u043d\u044b\u0435 \u043d\u0435 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0442.\n    \"\"\"\n\n    expected_sessions_list = []\n\n    # \u041e\u0442\u043f\u0440\u0430\u0432\u043a\u0430 \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u043a \u0431\u044d\u043a\u0435\u043d\u0434\u0443 \u0434\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u043e \u0441\u0435\u0430\u043d\u0441\u0430\u0445\n    response = self.send_get_api_request(\"e-nms/auth/sessions\")\n    response_body = self.get_response_body(response)\n\n    for item in response_body:\n        session_info = []\n        session_info.append(item[\"id\"])\n        session_info.append(item[\"userId\"])\n\n        # \u0412\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u043d\u0435\u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u043c\u043e\u0435 \u043f\u043e\u043b\u0435: \u0432\u0440\u0435\u043c\u044f \u0436\u0438\u0437\u043d\u0438 \u0441\u0435\u0430\u043d\u0441\u0430\n        session_info.append(\"\")\n\n        roles = []\n        for role in item[\"roles\"]:\n            if role in roles_dict.keys():\n                roles.append(roles_dict[role])\n\n        session_info.append(\",\".join(roles))\n        session_info.append(item[\"ip\"])\n\n        expected_sessions_list.append(session_info)\n\n    del sessions_table[0]  # \u0423\u0434\u0430\u043b\u044f\u0435\u043c \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a\n\n    self.check_lists_equals(\n        sessions_table,\n        expected_sessions_list,\n        \"Actual sessions list is not equal expected users list on base db\"\n    )\n
    "},{"location":"pages/templates_tab/","title":"TemplatesTab","text":"

    \u041c\u043e\u0434\u0443\u043b\u044c \u0432\u043a\u043b\u0430\u0434\u043a\u0438 '\u0428\u0430\u0431\u043b\u043e\u043d\u044b'.

    \u0421\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043a\u043b\u0430\u0441\u0441 TemplatesTab \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0442\u0430\u0431\u043b\u0438\u0446\u0435\u0439 \u0448\u0430\u0431\u043b\u043e\u043d\u043e\u0432. \u041f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0442\u044c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0438 \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c \u0441 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u043c\u0438 \u0432\u043a\u043b\u0430\u0434\u043a\u0438.

    "},{"location":"pages/templates_tab/#pages.templates_tab.TemplatesTab","title":"TemplatesTab","text":"

    Bases: BasePage

    \u041a\u043b\u0430\u0441\u0441 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0432\u043a\u043b\u0430\u0434\u043a\u043e\u0439 '\u0428\u0430\u0431\u043b\u043e\u043d\u044b'.

    \u041f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u043c\u0435\u0442\u043e\u0434\u044b \u0434\u043b\u044f \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0441 \u0442\u0430\u0431\u043b\u0438\u0446\u0435\u0439 \u0448\u0430\u0431\u043b\u043e\u043d\u043e\u0432 \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0435\u0451 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f.

    Parameters:

    Name Type Description Default page Page

    \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.

    required Source code in pages\\templates_tab.py
    class TemplatesTab(BasePage):\n    \"\"\"\u041a\u043b\u0430\u0441\u0441 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0432\u043a\u043b\u0430\u0434\u043a\u043e\u0439 '\u0428\u0430\u0431\u043b\u043e\u043d\u044b'.\n\n    \u041f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u043c\u0435\u0442\u043e\u0434\u044b \u0434\u043b\u044f \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0441 \u0442\u0430\u0431\u043b\u0438\u0446\u0435\u0439 \u0448\u0430\u0431\u043b\u043e\u043d\u043e\u0432 \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438\n    \u0435\u0451 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f.\n\n    Args:\n        page: \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.\n    \"\"\"\n\n    def __init__(self, page: Page) -> None:\n        \"\"\"\u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u044b \u0432\u043a\u043b\u0430\u0434\u043a\u0438 '\u0428\u0430\u0431\u043b\u043e\u043d\u044b'.\"\"\"\n\n        super().__init__(page)\n\n        self.toolbar = ToolbarComponent(page, \"\u0428\u0430\u0431\u043b\u043e\u043d\u044b\")\n\n        self.templates_table = TableComponent(page)\n        self.modal_windows = {}\n\n        self.json_container = JsonContainerComponent(page)\n        self.alert = AlertComponent(page)\n\n    def add_modal_window(self, title: str) -> None:\n        \"\"\"\u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043a\u043d\u043e \u0432 \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u044e.\n\n        Args:\n            title: \u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a \u043e\u043a\u043d\u0430.\n        \"\"\"\n\n        self.modal_windows[title] = ViewTemplateModalWindow(self.page, title)\n\n    def get_modal_window(self, title: str):\n        \"\"\"\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043a\u043d\u043e \u043f\u043e \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0443.\n\n        Args:\n            title: \u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a \u043e\u043a\u043d\u0430.\n\n        Returns:\n            ModalWindowComponent: \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430.\n\n        Raises:\n            AssertionError: \u0415\u0441\u043b\u0438 \u043e\u043a\u043d\u043e \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u043e.\n        \"\"\"\n\n        modal_window = self.modal_windows.get(title)\n\n        if modal_window is None:\n            assert False, f\"Modal window with title '{title}' not found\"\n        return modal_window\n\n    def delete_modal_window(self, title: str) -> None:\n        \"\"\"\u0423\u0434\u0430\u043b\u044f\u0435\u0442 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043a\u043d\u043e \u0438\u0437 \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u0438.\n\n        Args:\n            title: \u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a \u043e\u043a\u043d\u0430.\n\n        Raises:\n            AssertionError: \u0415\u0441\u043b\u0438 \u043e\u043a\u043d\u043e \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u043e.\n        \"\"\"\n\n        if self.modal_windows.get(title) is None:\n            assert False, f\"Modal window with title '{title}' not found\"\n        self.modal_windows[title] = None\n\n    def open_template_modal(self, row_index: int = 0) -> None:\n        \"\"\"\u041e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043a\u043d\u043e \u0448\u0430\u0431\u043b\u043e\u043d\u0430 \u043f\u043e \u043a\u043b\u0438\u043a\u0443 \u043d\u0430 \u0441\u0442\u0440\u043e\u043a\u0443 \u0442\u0430\u0431\u043b\u0438\u0446\u044b.\n\n        Args:\n            row_index: \u0418\u043d\u0434\u0435\u043a\u0441 \u0441\u0442\u0440\u043e\u043a\u0438 \u0434\u043b\u044f \u043a\u043b\u0438\u043a\u0430 (\u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e 0 - \u043f\u0435\u0440\u0432\u0430\u044f \u0441\u0442\u0440\u043e\u043a\u0430).\n        \"\"\"\n        row_locator = self.templates_table.get_row_locator(\n            TableLocators.TABLE_WORK_AREA,\n            row_index\n        )\n        row_locator.click()\n\n        # \u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0438\u043c\u044f \u0448\u0430\u0431\u043b\u043e\u043d\u0430 \u0438\u0437 \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438\n        table_content = self.templates_table.read(TableLocators.TABLE_WORK_AREA)\n        template_name = table_content[row_index + 1][0]  # +1 \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043f\u0435\u0440\u0432\u0430\u044f \u0441\u0442\u0440\u043e\u043a\u0430 - \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0438\n\n        # \u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043a\u043d\u043e \u0432 \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u044e \u043f\u043e\u0441\u043b\u0435 \u043e\u0442\u043a\u0440\u044b\u0442\u0438\u044f\n        self.add_modal_window(template_name)\n\n        return template_name\n\n    def close_modal_window_by_toolbar_button(self, title: str) -> None:\n        \"\"\"\u0417\u0430\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043a\u043d\u043e \u0447\u0435\u0440\u0435\u0437 \u043a\u043d\u043e\u043f\u043a\u0443 \u0432 \u0442\u0443\u043b\u0431\u0430\u0440\u0435.\n\n        Args:\n            title: \u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a \u043e\u043a\u043d\u0430.\n        \"\"\"\n\n        modal_window = self.get_modal_window(title)\n        modal_window.click_toolbar_close_button()\n        self.delete_modal_window(title)\n\n    def get_rows_count(self) -> int:\n        \"\"\"\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0441\u0442\u0440\u043e\u043a \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435 (\u0431\u0435\u0437 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430).\n\n        Returns:\n            int: \u041a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0441\u0442\u0440\u043e\u043a \u0441 \u0434\u0430\u043d\u043d\u044b\u043c\u0438.\n\n        Raises:\n            AssertionError: \u0415\u0441\u043b\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u043f\u0443\u0441\u0442\u0430.\n        \"\"\"\n\n        table_content = self.templates_table.read(TableLocators.TABLE_WORK_AREA)\n        rows_count = len(table_content)\n\n        if rows_count == 0:\n            assert False, \"The contents of the table are missing\"\n\n        return rows_count - 1\n\n    def get_first_template_name(self) -> str:\n        \"\"\"\u041f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u0438\u043c\u044f \u0448\u0430\u0431\u043b\u043e\u043d\u0430 \u0438\u0437 \u043f\u0435\u0440\u0432\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u044b.\n\n        Returns:\n            str: \u0418\u043c\u044f \u0448\u0430\u0431\u043b\u043e\u043d\u0430 \u0438\u0437 \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u0441\u0442\u043e\u043b\u0431\u0446\u0430 \u043f\u0435\u0440\u0432\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438.\n\n        Raises:\n            AssertionError: \u0415\u0441\u043b\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u043f\u0443\u0441\u0442\u0430 \u0438\u043b\u0438 \u0438\u043c\u044f \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u043e.\n        \"\"\"\n        table_content = self.templates_table.read(TableLocators.TABLE_WORK_AREA)\n\n        if len(table_content) < 2:  # \u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a + \u0445\u043e\u0442\u044f \u0431\u044b \u043e\u0434\u043d\u0430 \u0441\u0442\u0440\u043e\u043a\u0430\n            assert False, \"Table is empty or missing data rows\"\n\n        # \u041f\u0435\u0440\u0432\u0430\u044f \u0441\u0442\u0440\u043e\u043a\u0430 \u0441 \u0434\u0430\u043d\u043d\u044b\u043c\u0438 (\u0438\u043d\u0434\u0435\u043a\u0441 1, \u0442\u0430\u043a \u043a\u0430\u043a \u0438\u043d\u0434\u0435\u043a\u0441 0 - \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0438)\n        first_row = table_content[1]\n\n        if len(first_row) == 0:\n            assert False, \"First row is empty\"\n\n        template_name = first_row[0]  # \u041f\u0435\u0440\u0432\u044b\u0439 \u0441\u0442\u043e\u043b\u0431\u0435\u0446 - \u0438\u043c\u044f \u0448\u0430\u0431\u043b\u043e\u043d\u0430\n        return template_name\n\n    def scroll_templates_table_up(self) -> None:\n        \"\"\"\u041f\u0440\u043e\u043a\u0440\u0443\u0447\u0438\u0432\u0430\u0435\u0442 \u0442\u0430\u0431\u043b\u0438\u0446\u0443 \u0448\u0430\u0431\u043b\u043e\u043d\u043e\u0432 \u0432\u0432\u0435\u0440\u0445.\"\"\"\n\n        self.templates_table.scroll_up(TableLocators.TABLE_SCROLL_CONTAINER)\n\n    def scroll_templates_table_down(self) -> None:\n        \"\"\"\u041f\u0440\u043e\u043a\u0440\u0443\u0447\u0438\u0432\u0430\u0435\u0442 \u0442\u0430\u0431\u043b\u0438\u0446\u0443 \u0448\u0430\u0431\u043b\u043e\u043d\u043e\u0432 \u0432\u043d\u0438\u0437.\"\"\"\n\n        self.templates_table.scroll_down(TableLocators.TABLE_SCROLL_CONTAINER)\n\n    def scroll_modal_up(self) -> None:\n        \"\"\"\u041f\u0440\u043e\u043a\u0440\u0443\u0447\u0438\u0432\u0430\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430 \u0432\u0432\u0435\u0440\u0445.\"\"\"\n        self.templates_table.scroll_up(ModalWindowLocators.MODAL_WINDOW_SCROLL_CONTAINER)\n\n    def scroll_modal_down(self) -> None:\n        \"\"\"\u041f\u0440\u043e\u043a\u0440\u0443\u0447\u0438\u0432\u0430\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430 \u0432\u043d\u0438\u0437.\"\"\"\n        self.templates_table.scroll_down(ModalWindowLocators.MODAL_WINDOW_SCROLL_CONTAINER)\n\n    def check_templates_modal_content(self, template_name: str) -> None:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0438 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0441\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430 \u0448\u0430\u0431\u043b\u043e\u043d\u0430.\n\n        Args:\n            template_name: \u0418\u043c\u044f \u0448\u0430\u0431\u043b\u043e\u043d\u0430 \u0434\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430 \u043e\u043a\u043d\u0430.\n\n        Raises:\n            AssertionError: \u0415\u0441\u043b\u0438 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u043e\u043a\u043d\u0430 \u043d\u0435\u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u044b.\n        \"\"\"\n        modal_window = self.get_modal_window(template_name)\n        modal_window.check_content()\n\n    def check_templates_table_content(self) -> None:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0448\u0430\u0431\u043b\u043e\u043d\u043e\u0432.\n\n        \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0438 \u0438 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435.\n\n        Raises:\n            AssertionError: \u0415\u0441\u043b\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u043f\u0443\u0441\u0442\u0430 \u0438\u043b\u0438 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0438 \u043d\u0435\u0432\u0435\u0440\u043d\u044b.\n        \"\"\"\n\n        expected_headers = [\n            '\u0418\u043c\u044f',\n            '\u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435',\n            '\u0422\u0438\u043f \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430',\n            '\u041f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c'\n        ]\n\n        table_content = self.templates_table.read(TableLocators.TABLE_WORK_AREA)\n\n        if len(table_content) == 0:\n            assert False, \"The contents of the table are missing\"\n\n        actual_headers = table_content[0]\n\n        self.check_equals(\n            actual_headers,\n            expected_headers,\n            f\"Expected table headers {expected_headers} are not equal {actual_headers}\"\n        )\n\n        if len(table_content) == 1:\n            assert False, \"Table body is missing\"\n\n    def check_templates_table_verticall_scrolling(self) -> bool:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u0439 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u044b.\n\n        Returns:\n            bool: True \u0435\u0441\u043b\u0438 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0430 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u0430, \u0438\u043d\u0430\u0447\u0435 False.\n        \"\"\"\n\n        return self.templates_table.is_scrollable_vertically(\n            TableLocators.TABLE_SCROLL_CONTAINER\n        )\n\n    def check_templates_table_first_row_visibility(self) -> None:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u043f\u0435\u0440\u0432\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u044b.\n\n        Raises:\n            AssertionError: \u0415\u0441\u043b\u0438 \u0441\u0442\u0440\u043e\u043a\u0430 \u043d\u0435 \u0432\u0438\u0434\u043d\u0430.\n        \"\"\"\n\n        self.templates_table.check_first_row_visibility(TableLocators.TABLE_WORK_AREA)\n\n    def check_templates_table_last_row_visibility(self) -> None:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0439 \u0441\u0442\u0440\u043e\u043a\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u044b.\n\n        Raises:\n            AssertionError: \u0415\u0441\u043b\u0438 \u0441\u0442\u0440\u043e\u043a\u0430 \u043d\u0435 \u0432\u0438\u0434\u043d\u0430.\n        \"\"\"\n\n        self.templates_table.check_last_row_visibility(TableLocators.TABLE_WORK_AREA)\n\n    def check_templates_table_row_highlighting(self, row_index: int) -> None:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u044b.\n\n        Args:\n            row_index: \u0418\u043d\u0434\u0435\u043a\u0441 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438.\n\n        Raises:\n            AssertionError: \u0415\u0441\u043b\u0438 \u0441\u0442\u0440\u043e\u043a\u0430 \u043d\u0435 \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u0430.\n        \"\"\"\n\n        self.templates_table.check_row_highlighting(\n            TableLocators.TABLE_WORK_AREA,\n            row_index\n        )\n\n    def should_be_toolbar(self) -> None:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0442\u0443\u043b\u0431\u0430\u0440\u0430 \u043d\u0430 \u0432\u043a\u043b\u0430\u0434\u043a\u0435.\n\n        Raises:\n            AssertionError: \u0415\u0441\u043b\u0438 \u0442\u0443\u043b\u0431\u0430\u0440 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442.\n        \"\"\"\n\n        self.toolbar.check_toolbar_presence(\"Toolbar is missing\")\n\n    def should_be_templates_table(self) -> None:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0448\u0430\u0431\u043b\u043e\u043d\u043e\u0432.\n\n        Raises:\n            AssertionError: \u0415\u0441\u043b\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442.\n        \"\"\"\n\n        self.templates_table.check_visibility(\n            TableLocators.TABLE_WORK_AREA,\n            \"Templates table is missing\"\n        )\n\n    def should_be_modal_window(self) -> None:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430.\n\n        Raises:\n            AssertionError: \u0415\u0441\u043b\u0438 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043a\u043d\u043e \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442.\n        \"\"\"\n        self.templates_table.check_visibility(\n            ModalWindowLocators.MODAL_WINDOW,\n            \"Modal window is not visible\"\n        )\n\n    def should_not_be_modal_window(self) -> None:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442, \u0447\u0442\u043e \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043a\u043d\u043e \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442.\n\n        Raises:\n            AssertionError: \u0415\u0441\u043b\u0438 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043a\u043d\u043e \u0432\u0441\u0435 \u0435\u0449\u0435 \u0432\u0438\u0434\u043d\u043e.\n        \"\"\"\n        is_visible = self.page.locator(ModalWindowLocators.MODAL_WINDOW).is_visible(timeout=1000)\n        if is_visible:\n            assert False, \"Modal window should not be visible\"\n\n    def check_modal_vertical_scrolling(self) -> bool:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0441\u043a\u0440\u043e\u043b\u043b\u0438\u043d\u0433\u0430 \u0432 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u043c \u043e\u043a\u043d\u0435.\n\n        Returns:\n            bool: True \u0435\u0441\u043b\u0438 \u0441\u043a\u0440\u043e\u043b\u043b\u0438\u043d\u0433 \u0432\u043e\u0437\u043c\u043e\u0436\u0435\u043d, \u0438\u043d\u0430\u0447\u0435 False.\n        \"\"\"\n        return self.templates_table.is_scrollable_vertically(\n            ModalWindowLocators.MODAL_WINDOW_SCROLL_CONTAINER\n        )\n\n    # \u0420\u0430\u0437\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442\u0441\u044f =========================================================\n    def get_template_data_from_api(self, template_name: str) -> dict:\n        \"\"\"\u041f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 JSON \u0434\u0430\u043d\u043d\u044b\u0435 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0433\u043e \u0448\u0430\u0431\u043b\u043e\u043d\u0430 \u0438\u0437 API.\n\n        Args:\n            template_name: \u0418\u043c\u044f \u0448\u0430\u0431\u043b\u043e\u043d\u0430.\n\n        Returns:\n            dict: JSON \u0434\u0430\u043d\u043d\u044b\u0435 \u0448\u0430\u0431\u043b\u043e\u043d\u0430 \u0438\u0437 API.\n\n        Raises:\n            AssertionError: \u0415\u0441\u043b\u0438 \u043d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u0438\u0437 API.\n        \"\"\"\n\n        # \u041e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u043c \u0437\u0430\u043f\u0440\u043e\u0441 \u043a API \u0434\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0433\u043e \u0448\u0430\u0431\u043b\u043e\u043d\u0430\n        response = self.send_get_api_request(\"e-cmdb/api/device/template\")\n        response_data = self.get_response_body(response)\n        print(response_data)\n\n        if response.status_code != 200:\n            assert False, f\"API request failed with status {response.status_code}\"\n\n        # \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c, \u0447\u0442\u043e \u043e\u0442\u0432\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0434\u0430\u043d\u043d\u044b\u0435 \u043d\u0443\u0436\u043d\u043e\u0433\u043e \u0448\u0430\u0431\u043b\u043e\u043d\u0430\n        if 'name' in response_data and response_data['name'] != template_name:\n            assert False, f\"API returned data for wrong template: expected '{template_name}', got '{response_data['name']}'\"\n\n        return response_data\n\n    def verify_modal_content_with_api(self, template_name: str) -> None:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430 \u0434\u0430\u043d\u043d\u044b\u043c \u0438\u0437 API.\n\n        Args:\n            template_name: \u0418\u043c\u044f \u0448\u0430\u0431\u043b\u043e\u043d\u0430 \u0434\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438.\n\n        Raises:\n            AssertionError: \u0415\u0441\u043b\u0438 \u0434\u0430\u043d\u043d\u044b\u0435 \u043d\u0435 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0442 API.\n        \"\"\"\n        # \u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0434\u0430\u043d\u043d\u044b\u0435 \u0438\u0437 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430\n        modal_window = self.get_modal_window(template_name)\n        modal_data = modal_window.get_modal_content_data()\n\n        # \u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0434\u0430\u043d\u043d\u044b\u0435 \u0438\u0437 API\n        api_data = self.get_template_data_from_api(template_name)\n\n        # \u0421\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u0435\u043c \u0434\u0430\u043d\u043d\u044b\u0435\n        self.compare_modal_with_api_data(modal_data, api_data, template_name)\n\n\n    def compare_modal_with_api_data(self, modal_data: dict, api_data: dict, template_name: str) -> None:\n        \"\"\"\u0421\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u0435\u0442 JSON \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430 \u0441 \u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u0438\u0437 API.\n\n        Args:\n            modal_data: JSON \u0434\u0430\u043d\u043d\u044b\u0435 \u0438\u0437 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430.\n            api_data: JSON \u0434\u0430\u043d\u043d\u044b\u0435 \u0438\u0437 API.\n            template_name: \u0418\u043c\u044f \u0448\u0430\u0431\u043b\u043e\u043d\u0430 \u0434\u043b\u044f \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439 \u043e\u0431 \u043e\u0448\u0438\u0431\u043a\u0430\u0445.\n\n        Raises:\n            AssertionError: \u0415\u0441\u043b\u0438 JSON \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u043d\u0435 \u0441\u043e\u0432\u043f\u0430\u0434\u0430\u044e\u0442.\n        \"\"\"\n        # \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c, \u0447\u0442\u043e modal_data \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0434\u0430\u043d\u043d\u044b\u0435\n        if not modal_data:\n            assert False, f\"No modal data found for template '{template_name}'\"\n\n        # \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c, \u0447\u0442\u043e api_data \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0434\u0430\u043d\u043d\u044b\u0435\n        if not api_data:\n            assert False, f\"No API data found for template '{template_name}'\"\n\n        # \u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0438\u0437 \u043e\u0431\u043e\u0438\u0445 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u043e\u0432\n        modal_config = modal_data.get('config', {})\n        api_config = api_data.get('config', {})\n\n        # \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c, \u0447\u0442\u043e \u043e\u0431\u0430 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0430 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044e\n        if not modal_config:\n            assert False, f\"No config data found in modal for template '{template_name}'\"\n\n        if not api_config:\n            assert False, f\"No config data found in API for template '{template_name}'\"\n\n        # \u0421\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u0435\u043c JSON \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438\n        self.check_equals(\n            modal_config,\n            api_config,\n            f\"JSON config data mismatch for template '{template_name}'\"\n        )\n\n    def verify_json_container_content(self) -> None:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430 \u0434\u0430\u043d\u043d\u044b\u043c \u0438\u0437 API.\"\"\"\n\n        # \u0427\u0438\u0442\u0430\u0435\u043c \u0434\u0430\u043d\u043d\u044b\u0435 \u0438\u0437 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430\n        actual_data = self.json_container.read_data(JsonContainerLocators.CONTAINER)\n        print(actual_data)\n\n        \"\"\"\n        # send request to backend to get template info\n        response = self.send_get_api_request(\"e-cmdb/api/device/template\")\n        response_body = self.get_response_body(response)\n\n        # compare actual and response from cmdb\n        self.json_container.check_json_equals(\n            actual_data,\n            response_body,\n            \"Expected json content is not equal actual:\"\n        )\n        \"\"\"\n
    "},{"location":"pages/templates_tab/#pages.templates_tab.TemplatesTab.__init__","title":"__init__(page)","text":"

    \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u044b \u0432\u043a\u043b\u0430\u0434\u043a\u0438 '\u0428\u0430\u0431\u043b\u043e\u043d\u044b'.

    Source code in pages\\templates_tab.py
    def __init__(self, page: Page) -> None:\n    \"\"\"\u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u044b \u0432\u043a\u043b\u0430\u0434\u043a\u0438 '\u0428\u0430\u0431\u043b\u043e\u043d\u044b'.\"\"\"\n\n    super().__init__(page)\n\n    self.toolbar = ToolbarComponent(page, \"\u0428\u0430\u0431\u043b\u043e\u043d\u044b\")\n\n    self.templates_table = TableComponent(page)\n    self.modal_windows = {}\n\n    self.json_container = JsonContainerComponent(page)\n    self.alert = AlertComponent(page)\n
    "},{"location":"pages/templates_tab/#pages.templates_tab.TemplatesTab.add_modal_window","title":"add_modal_window(title)","text":"

    \u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043a\u043d\u043e \u0432 \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u044e.

    Parameters:

    Name Type Description Default title str

    \u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a \u043e\u043a\u043d\u0430.

    required Source code in pages\\templates_tab.py
    def add_modal_window(self, title: str) -> None:\n    \"\"\"\u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043a\u043d\u043e \u0432 \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u044e.\n\n    Args:\n        title: \u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a \u043e\u043a\u043d\u0430.\n    \"\"\"\n\n    self.modal_windows[title] = ViewTemplateModalWindow(self.page, title)\n
    "},{"location":"pages/templates_tab/#pages.templates_tab.TemplatesTab.check_modal_vertical_scrolling","title":"check_modal_vertical_scrolling()","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0441\u043a\u0440\u043e\u043b\u043b\u0438\u043d\u0433\u0430 \u0432 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u043c \u043e\u043a\u043d\u0435.

    Returns:

    Name Type Description bool bool

    True \u0435\u0441\u043b\u0438 \u0441\u043a\u0440\u043e\u043b\u043b\u0438\u043d\u0433 \u0432\u043e\u0437\u043c\u043e\u0436\u0435\u043d, \u0438\u043d\u0430\u0447\u0435 False.

    Source code in pages\\templates_tab.py
    def check_modal_vertical_scrolling(self) -> bool:\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0441\u043a\u0440\u043e\u043b\u043b\u0438\u043d\u0433\u0430 \u0432 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u043c \u043e\u043a\u043d\u0435.\n\n    Returns:\n        bool: True \u0435\u0441\u043b\u0438 \u0441\u043a\u0440\u043e\u043b\u043b\u0438\u043d\u0433 \u0432\u043e\u0437\u043c\u043e\u0436\u0435\u043d, \u0438\u043d\u0430\u0447\u0435 False.\n    \"\"\"\n    return self.templates_table.is_scrollable_vertically(\n        ModalWindowLocators.MODAL_WINDOW_SCROLL_CONTAINER\n    )\n
    "},{"location":"pages/templates_tab/#pages.templates_tab.TemplatesTab.check_templates_modal_content","title":"check_templates_modal_content(template_name)","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0438 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0441\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430 \u0448\u0430\u0431\u043b\u043e\u043d\u0430.

    Parameters:

    Name Type Description Default template_name str

    \u0418\u043c\u044f \u0448\u0430\u0431\u043b\u043e\u043d\u0430 \u0434\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430 \u043e\u043a\u043d\u0430.

    required

    Raises:

    Type Description AssertionError

    \u0415\u0441\u043b\u0438 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u043e\u043a\u043d\u0430 \u043d\u0435\u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u044b.

    Source code in pages\\templates_tab.py
    def check_templates_modal_content(self, template_name: str) -> None:\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0438 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0441\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430 \u0448\u0430\u0431\u043b\u043e\u043d\u0430.\n\n    Args:\n        template_name: \u0418\u043c\u044f \u0448\u0430\u0431\u043b\u043e\u043d\u0430 \u0434\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430 \u043e\u043a\u043d\u0430.\n\n    Raises:\n        AssertionError: \u0415\u0441\u043b\u0438 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u043e\u043a\u043d\u0430 \u043d\u0435\u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u044b.\n    \"\"\"\n    modal_window = self.get_modal_window(template_name)\n    modal_window.check_content()\n
    "},{"location":"pages/templates_tab/#pages.templates_tab.TemplatesTab.check_templates_table_content","title":"check_templates_table_content()","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0448\u0430\u0431\u043b\u043e\u043d\u043e\u0432.

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0438 \u0438 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435.

    Raises:

    Type Description AssertionError

    \u0415\u0441\u043b\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u043f\u0443\u0441\u0442\u0430 \u0438\u043b\u0438 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0438 \u043d\u0435\u0432\u0435\u0440\u043d\u044b.

    Source code in pages\\templates_tab.py
    def check_templates_table_content(self) -> None:\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0448\u0430\u0431\u043b\u043e\u043d\u043e\u0432.\n\n    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0438 \u0438 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435.\n\n    Raises:\n        AssertionError: \u0415\u0441\u043b\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u043f\u0443\u0441\u0442\u0430 \u0438\u043b\u0438 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0438 \u043d\u0435\u0432\u0435\u0440\u043d\u044b.\n    \"\"\"\n\n    expected_headers = [\n        '\u0418\u043c\u044f',\n        '\u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435',\n        '\u0422\u0438\u043f \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430',\n        '\u041f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c'\n    ]\n\n    table_content = self.templates_table.read(TableLocators.TABLE_WORK_AREA)\n\n    if len(table_content) == 0:\n        assert False, \"The contents of the table are missing\"\n\n    actual_headers = table_content[0]\n\n    self.check_equals(\n        actual_headers,\n        expected_headers,\n        f\"Expected table headers {expected_headers} are not equal {actual_headers}\"\n    )\n\n    if len(table_content) == 1:\n        assert False, \"Table body is missing\"\n
    "},{"location":"pages/templates_tab/#pages.templates_tab.TemplatesTab.check_templates_table_first_row_visibility","title":"check_templates_table_first_row_visibility()","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u043f\u0435\u0440\u0432\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u044b.

    Raises:

    Type Description AssertionError

    \u0415\u0441\u043b\u0438 \u0441\u0442\u0440\u043e\u043a\u0430 \u043d\u0435 \u0432\u0438\u0434\u043d\u0430.

    Source code in pages\\templates_tab.py
    def check_templates_table_first_row_visibility(self) -> None:\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u043f\u0435\u0440\u0432\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u044b.\n\n    Raises:\n        AssertionError: \u0415\u0441\u043b\u0438 \u0441\u0442\u0440\u043e\u043a\u0430 \u043d\u0435 \u0432\u0438\u0434\u043d\u0430.\n    \"\"\"\n\n    self.templates_table.check_first_row_visibility(TableLocators.TABLE_WORK_AREA)\n
    "},{"location":"pages/templates_tab/#pages.templates_tab.TemplatesTab.check_templates_table_last_row_visibility","title":"check_templates_table_last_row_visibility()","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0439 \u0441\u0442\u0440\u043e\u043a\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u044b.

    Raises:

    Type Description AssertionError

    \u0415\u0441\u043b\u0438 \u0441\u0442\u0440\u043e\u043a\u0430 \u043d\u0435 \u0432\u0438\u0434\u043d\u0430.

    Source code in pages\\templates_tab.py
    def check_templates_table_last_row_visibility(self) -> None:\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0439 \u0441\u0442\u0440\u043e\u043a\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u044b.\n\n    Raises:\n        AssertionError: \u0415\u0441\u043b\u0438 \u0441\u0442\u0440\u043e\u043a\u0430 \u043d\u0435 \u0432\u0438\u0434\u043d\u0430.\n    \"\"\"\n\n    self.templates_table.check_last_row_visibility(TableLocators.TABLE_WORK_AREA)\n
    "},{"location":"pages/templates_tab/#pages.templates_tab.TemplatesTab.check_templates_table_row_highlighting","title":"check_templates_table_row_highlighting(row_index)","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u044b.

    Parameters:

    Name Type Description Default row_index int

    \u0418\u043d\u0434\u0435\u043a\u0441 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438.

    required

    Raises:

    Type Description AssertionError

    \u0415\u0441\u043b\u0438 \u0441\u0442\u0440\u043e\u043a\u0430 \u043d\u0435 \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u0430.

    Source code in pages\\templates_tab.py
    def check_templates_table_row_highlighting(self, row_index: int) -> None:\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u044b.\n\n    Args:\n        row_index: \u0418\u043d\u0434\u0435\u043a\u0441 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438.\n\n    Raises:\n        AssertionError: \u0415\u0441\u043b\u0438 \u0441\u0442\u0440\u043e\u043a\u0430 \u043d\u0435 \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u0430.\n    \"\"\"\n\n    self.templates_table.check_row_highlighting(\n        TableLocators.TABLE_WORK_AREA,\n        row_index\n    )\n
    "},{"location":"pages/templates_tab/#pages.templates_tab.TemplatesTab.check_templates_table_verticall_scrolling","title":"check_templates_table_verticall_scrolling()","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u0439 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u044b.

    Returns:

    Name Type Description bool bool

    True \u0435\u0441\u043b\u0438 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0430 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u0430, \u0438\u043d\u0430\u0447\u0435 False.

    Source code in pages\\templates_tab.py
    def check_templates_table_verticall_scrolling(self) -> bool:\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u0439 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u044b.\n\n    Returns:\n        bool: True \u0435\u0441\u043b\u0438 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0430 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u0430, \u0438\u043d\u0430\u0447\u0435 False.\n    \"\"\"\n\n    return self.templates_table.is_scrollable_vertically(\n        TableLocators.TABLE_SCROLL_CONTAINER\n    )\n
    "},{"location":"pages/templates_tab/#pages.templates_tab.TemplatesTab.close_modal_window_by_toolbar_button","title":"close_modal_window_by_toolbar_button(title)","text":"

    \u0417\u0430\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043a\u043d\u043e \u0447\u0435\u0440\u0435\u0437 \u043a\u043d\u043e\u043f\u043a\u0443 \u0432 \u0442\u0443\u043b\u0431\u0430\u0440\u0435.

    Parameters:

    Name Type Description Default title str

    \u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a \u043e\u043a\u043d\u0430.

    required Source code in pages\\templates_tab.py
    def close_modal_window_by_toolbar_button(self, title: str) -> None:\n    \"\"\"\u0417\u0430\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043a\u043d\u043e \u0447\u0435\u0440\u0435\u0437 \u043a\u043d\u043e\u043f\u043a\u0443 \u0432 \u0442\u0443\u043b\u0431\u0430\u0440\u0435.\n\n    Args:\n        title: \u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a \u043e\u043a\u043d\u0430.\n    \"\"\"\n\n    modal_window = self.get_modal_window(title)\n    modal_window.click_toolbar_close_button()\n    self.delete_modal_window(title)\n
    "},{"location":"pages/templates_tab/#pages.templates_tab.TemplatesTab.compare_modal_with_api_data","title":"compare_modal_with_api_data(modal_data, api_data, template_name)","text":"

    \u0421\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u0435\u0442 JSON \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430 \u0441 \u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u0438\u0437 API.

    Parameters:

    Name Type Description Default modal_data dict

    JSON \u0434\u0430\u043d\u043d\u044b\u0435 \u0438\u0437 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430.

    required api_data dict

    JSON \u0434\u0430\u043d\u043d\u044b\u0435 \u0438\u0437 API.

    required template_name str

    \u0418\u043c\u044f \u0448\u0430\u0431\u043b\u043e\u043d\u0430 \u0434\u043b\u044f \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439 \u043e\u0431 \u043e\u0448\u0438\u0431\u043a\u0430\u0445.

    required

    Raises:

    Type Description AssertionError

    \u0415\u0441\u043b\u0438 JSON \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u043d\u0435 \u0441\u043e\u0432\u043f\u0430\u0434\u0430\u044e\u0442.

    Source code in pages\\templates_tab.py
    def compare_modal_with_api_data(self, modal_data: dict, api_data: dict, template_name: str) -> None:\n    \"\"\"\u0421\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u0435\u0442 JSON \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430 \u0441 \u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u0438\u0437 API.\n\n    Args:\n        modal_data: JSON \u0434\u0430\u043d\u043d\u044b\u0435 \u0438\u0437 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430.\n        api_data: JSON \u0434\u0430\u043d\u043d\u044b\u0435 \u0438\u0437 API.\n        template_name: \u0418\u043c\u044f \u0448\u0430\u0431\u043b\u043e\u043d\u0430 \u0434\u043b\u044f \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439 \u043e\u0431 \u043e\u0448\u0438\u0431\u043a\u0430\u0445.\n\n    Raises:\n        AssertionError: \u0415\u0441\u043b\u0438 JSON \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u043d\u0435 \u0441\u043e\u0432\u043f\u0430\u0434\u0430\u044e\u0442.\n    \"\"\"\n    # \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c, \u0447\u0442\u043e modal_data \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0434\u0430\u043d\u043d\u044b\u0435\n    if not modal_data:\n        assert False, f\"No modal data found for template '{template_name}'\"\n\n    # \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c, \u0447\u0442\u043e api_data \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0434\u0430\u043d\u043d\u044b\u0435\n    if not api_data:\n        assert False, f\"No API data found for template '{template_name}'\"\n\n    # \u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0438\u0437 \u043e\u0431\u043e\u0438\u0445 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u043e\u0432\n    modal_config = modal_data.get('config', {})\n    api_config = api_data.get('config', {})\n\n    # \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c, \u0447\u0442\u043e \u043e\u0431\u0430 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0430 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044e\n    if not modal_config:\n        assert False, f\"No config data found in modal for template '{template_name}'\"\n\n    if not api_config:\n        assert False, f\"No config data found in API for template '{template_name}'\"\n\n    # \u0421\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u0435\u043c JSON \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438\n    self.check_equals(\n        modal_config,\n        api_config,\n        f\"JSON config data mismatch for template '{template_name}'\"\n    )\n
    "},{"location":"pages/templates_tab/#pages.templates_tab.TemplatesTab.delete_modal_window","title":"delete_modal_window(title)","text":"

    \u0423\u0434\u0430\u043b\u044f\u0435\u0442 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043a\u043d\u043e \u0438\u0437 \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u0438.

    Parameters:

    Name Type Description Default title str

    \u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a \u043e\u043a\u043d\u0430.

    required

    Raises:

    Type Description AssertionError

    \u0415\u0441\u043b\u0438 \u043e\u043a\u043d\u043e \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u043e.

    Source code in pages\\templates_tab.py
    def delete_modal_window(self, title: str) -> None:\n    \"\"\"\u0423\u0434\u0430\u043b\u044f\u0435\u0442 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043a\u043d\u043e \u0438\u0437 \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u0438.\n\n    Args:\n        title: \u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a \u043e\u043a\u043d\u0430.\n\n    Raises:\n        AssertionError: \u0415\u0441\u043b\u0438 \u043e\u043a\u043d\u043e \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u043e.\n    \"\"\"\n\n    if self.modal_windows.get(title) is None:\n        assert False, f\"Modal window with title '{title}' not found\"\n    self.modal_windows[title] = None\n
    "},{"location":"pages/templates_tab/#pages.templates_tab.TemplatesTab.get_first_template_name","title":"get_first_template_name()","text":"

    \u041f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u0438\u043c\u044f \u0448\u0430\u0431\u043b\u043e\u043d\u0430 \u0438\u0437 \u043f\u0435\u0440\u0432\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u044b.

    Returns:

    Name Type Description str str

    \u0418\u043c\u044f \u0448\u0430\u0431\u043b\u043e\u043d\u0430 \u0438\u0437 \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u0441\u0442\u043e\u043b\u0431\u0446\u0430 \u043f\u0435\u0440\u0432\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438.

    Raises:

    Type Description AssertionError

    \u0415\u0441\u043b\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u043f\u0443\u0441\u0442\u0430 \u0438\u043b\u0438 \u0438\u043c\u044f \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u043e.

    Source code in pages\\templates_tab.py
    def get_first_template_name(self) -> str:\n    \"\"\"\u041f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u0438\u043c\u044f \u0448\u0430\u0431\u043b\u043e\u043d\u0430 \u0438\u0437 \u043f\u0435\u0440\u0432\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u044b.\n\n    Returns:\n        str: \u0418\u043c\u044f \u0448\u0430\u0431\u043b\u043e\u043d\u0430 \u0438\u0437 \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u0441\u0442\u043e\u043b\u0431\u0446\u0430 \u043f\u0435\u0440\u0432\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438.\n\n    Raises:\n        AssertionError: \u0415\u0441\u043b\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u043f\u0443\u0441\u0442\u0430 \u0438\u043b\u0438 \u0438\u043c\u044f \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u043e.\n    \"\"\"\n    table_content = self.templates_table.read(TableLocators.TABLE_WORK_AREA)\n\n    if len(table_content) < 2:  # \u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a + \u0445\u043e\u0442\u044f \u0431\u044b \u043e\u0434\u043d\u0430 \u0441\u0442\u0440\u043e\u043a\u0430\n        assert False, \"Table is empty or missing data rows\"\n\n    # \u041f\u0435\u0440\u0432\u0430\u044f \u0441\u0442\u0440\u043e\u043a\u0430 \u0441 \u0434\u0430\u043d\u043d\u044b\u043c\u0438 (\u0438\u043d\u0434\u0435\u043a\u0441 1, \u0442\u0430\u043a \u043a\u0430\u043a \u0438\u043d\u0434\u0435\u043a\u0441 0 - \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0438)\n    first_row = table_content[1]\n\n    if len(first_row) == 0:\n        assert False, \"First row is empty\"\n\n    template_name = first_row[0]  # \u041f\u0435\u0440\u0432\u044b\u0439 \u0441\u0442\u043e\u043b\u0431\u0435\u0446 - \u0438\u043c\u044f \u0448\u0430\u0431\u043b\u043e\u043d\u0430\n    return template_name\n
    "},{"location":"pages/templates_tab/#pages.templates_tab.TemplatesTab.get_modal_window","title":"get_modal_window(title)","text":"

    \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043a\u043d\u043e \u043f\u043e \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0443.

    Parameters:

    Name Type Description Default title str

    \u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a \u043e\u043a\u043d\u0430.

    required

    Returns:

    Name Type Description ModalWindowComponent

    \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430.

    Raises:

    Type Description AssertionError

    \u0415\u0441\u043b\u0438 \u043e\u043a\u043d\u043e \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u043e.

    Source code in pages\\templates_tab.py
    def get_modal_window(self, title: str):\n    \"\"\"\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043a\u043d\u043e \u043f\u043e \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0443.\n\n    Args:\n        title: \u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a \u043e\u043a\u043d\u0430.\n\n    Returns:\n        ModalWindowComponent: \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430.\n\n    Raises:\n        AssertionError: \u0415\u0441\u043b\u0438 \u043e\u043a\u043d\u043e \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u043e.\n    \"\"\"\n\n    modal_window = self.modal_windows.get(title)\n\n    if modal_window is None:\n        assert False, f\"Modal window with title '{title}' not found\"\n    return modal_window\n
    "},{"location":"pages/templates_tab/#pages.templates_tab.TemplatesTab.get_rows_count","title":"get_rows_count()","text":"

    \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0441\u0442\u0440\u043e\u043a \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435 (\u0431\u0435\u0437 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430).

    Returns:

    Name Type Description int int

    \u041a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0441\u0442\u0440\u043e\u043a \u0441 \u0434\u0430\u043d\u043d\u044b\u043c\u0438.

    Raises:

    Type Description AssertionError

    \u0415\u0441\u043b\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u043f\u0443\u0441\u0442\u0430.

    Source code in pages\\templates_tab.py
    def get_rows_count(self) -> int:\n    \"\"\"\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0441\u0442\u0440\u043e\u043a \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435 (\u0431\u0435\u0437 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430).\n\n    Returns:\n        int: \u041a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0441\u0442\u0440\u043e\u043a \u0441 \u0434\u0430\u043d\u043d\u044b\u043c\u0438.\n\n    Raises:\n        AssertionError: \u0415\u0441\u043b\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u043f\u0443\u0441\u0442\u0430.\n    \"\"\"\n\n    table_content = self.templates_table.read(TableLocators.TABLE_WORK_AREA)\n    rows_count = len(table_content)\n\n    if rows_count == 0:\n        assert False, \"The contents of the table are missing\"\n\n    return rows_count - 1\n
    "},{"location":"pages/templates_tab/#pages.templates_tab.TemplatesTab.get_template_data_from_api","title":"get_template_data_from_api(template_name)","text":"

    \u041f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 JSON \u0434\u0430\u043d\u043d\u044b\u0435 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0433\u043e \u0448\u0430\u0431\u043b\u043e\u043d\u0430 \u0438\u0437 API.

    Parameters:

    Name Type Description Default template_name str

    \u0418\u043c\u044f \u0448\u0430\u0431\u043b\u043e\u043d\u0430.

    required

    Returns:

    Name Type Description dict dict

    JSON \u0434\u0430\u043d\u043d\u044b\u0435 \u0448\u0430\u0431\u043b\u043e\u043d\u0430 \u0438\u0437 API.

    Raises:

    Type Description AssertionError

    \u0415\u0441\u043b\u0438 \u043d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u0438\u0437 API.

    Source code in pages\\templates_tab.py
    def get_template_data_from_api(self, template_name: str) -> dict:\n    \"\"\"\u041f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 JSON \u0434\u0430\u043d\u043d\u044b\u0435 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0433\u043e \u0448\u0430\u0431\u043b\u043e\u043d\u0430 \u0438\u0437 API.\n\n    Args:\n        template_name: \u0418\u043c\u044f \u0448\u0430\u0431\u043b\u043e\u043d\u0430.\n\n    Returns:\n        dict: JSON \u0434\u0430\u043d\u043d\u044b\u0435 \u0448\u0430\u0431\u043b\u043e\u043d\u0430 \u0438\u0437 API.\n\n    Raises:\n        AssertionError: \u0415\u0441\u043b\u0438 \u043d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u0438\u0437 API.\n    \"\"\"\n\n    # \u041e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u043c \u0437\u0430\u043f\u0440\u043e\u0441 \u043a API \u0434\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0433\u043e \u0448\u0430\u0431\u043b\u043e\u043d\u0430\n    response = self.send_get_api_request(\"e-cmdb/api/device/template\")\n    response_data = self.get_response_body(response)\n    print(response_data)\n\n    if response.status_code != 200:\n        assert False, f\"API request failed with status {response.status_code}\"\n\n    # \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c, \u0447\u0442\u043e \u043e\u0442\u0432\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0434\u0430\u043d\u043d\u044b\u0435 \u043d\u0443\u0436\u043d\u043e\u0433\u043e \u0448\u0430\u0431\u043b\u043e\u043d\u0430\n    if 'name' in response_data and response_data['name'] != template_name:\n        assert False, f\"API returned data for wrong template: expected '{template_name}', got '{response_data['name']}'\"\n\n    return response_data\n
    "},{"location":"pages/templates_tab/#pages.templates_tab.TemplatesTab.open_template_modal","title":"open_template_modal(row_index=0)","text":"

    \u041e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043a\u043d\u043e \u0448\u0430\u0431\u043b\u043e\u043d\u0430 \u043f\u043e \u043a\u043b\u0438\u043a\u0443 \u043d\u0430 \u0441\u0442\u0440\u043e\u043a\u0443 \u0442\u0430\u0431\u043b\u0438\u0446\u044b.

    Parameters:

    Name Type Description Default row_index int

    \u0418\u043d\u0434\u0435\u043a\u0441 \u0441\u0442\u0440\u043e\u043a\u0438 \u0434\u043b\u044f \u043a\u043b\u0438\u043a\u0430 (\u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e 0 - \u043f\u0435\u0440\u0432\u0430\u044f \u0441\u0442\u0440\u043e\u043a\u0430).

    0 Source code in pages\\templates_tab.py
    def open_template_modal(self, row_index: int = 0) -> None:\n    \"\"\"\u041e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043a\u043d\u043e \u0448\u0430\u0431\u043b\u043e\u043d\u0430 \u043f\u043e \u043a\u043b\u0438\u043a\u0443 \u043d\u0430 \u0441\u0442\u0440\u043e\u043a\u0443 \u0442\u0430\u0431\u043b\u0438\u0446\u044b.\n\n    Args:\n        row_index: \u0418\u043d\u0434\u0435\u043a\u0441 \u0441\u0442\u0440\u043e\u043a\u0438 \u0434\u043b\u044f \u043a\u043b\u0438\u043a\u0430 (\u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e 0 - \u043f\u0435\u0440\u0432\u0430\u044f \u0441\u0442\u0440\u043e\u043a\u0430).\n    \"\"\"\n    row_locator = self.templates_table.get_row_locator(\n        TableLocators.TABLE_WORK_AREA,\n        row_index\n    )\n    row_locator.click()\n\n    # \u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0438\u043c\u044f \u0448\u0430\u0431\u043b\u043e\u043d\u0430 \u0438\u0437 \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438\n    table_content = self.templates_table.read(TableLocators.TABLE_WORK_AREA)\n    template_name = table_content[row_index + 1][0]  # +1 \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043f\u0435\u0440\u0432\u0430\u044f \u0441\u0442\u0440\u043e\u043a\u0430 - \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0438\n\n    # \u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043a\u043d\u043e \u0432 \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u044e \u043f\u043e\u0441\u043b\u0435 \u043e\u0442\u043a\u0440\u044b\u0442\u0438\u044f\n    self.add_modal_window(template_name)\n\n    return template_name\n
    "},{"location":"pages/templates_tab/#pages.templates_tab.TemplatesTab.scroll_modal_down","title":"scroll_modal_down()","text":"

    \u041f\u0440\u043e\u043a\u0440\u0443\u0447\u0438\u0432\u0430\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430 \u0432\u043d\u0438\u0437.

    Source code in pages\\templates_tab.py
    def scroll_modal_down(self) -> None:\n    \"\"\"\u041f\u0440\u043e\u043a\u0440\u0443\u0447\u0438\u0432\u0430\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430 \u0432\u043d\u0438\u0437.\"\"\"\n    self.templates_table.scroll_down(ModalWindowLocators.MODAL_WINDOW_SCROLL_CONTAINER)\n
    "},{"location":"pages/templates_tab/#pages.templates_tab.TemplatesTab.scroll_modal_up","title":"scroll_modal_up()","text":"

    \u041f\u0440\u043e\u043a\u0440\u0443\u0447\u0438\u0432\u0430\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430 \u0432\u0432\u0435\u0440\u0445.

    Source code in pages\\templates_tab.py
    def scroll_modal_up(self) -> None:\n    \"\"\"\u041f\u0440\u043e\u043a\u0440\u0443\u0447\u0438\u0432\u0430\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430 \u0432\u0432\u0435\u0440\u0445.\"\"\"\n    self.templates_table.scroll_up(ModalWindowLocators.MODAL_WINDOW_SCROLL_CONTAINER)\n
    "},{"location":"pages/templates_tab/#pages.templates_tab.TemplatesTab.scroll_templates_table_down","title":"scroll_templates_table_down()","text":"

    \u041f\u0440\u043e\u043a\u0440\u0443\u0447\u0438\u0432\u0430\u0435\u0442 \u0442\u0430\u0431\u043b\u0438\u0446\u0443 \u0448\u0430\u0431\u043b\u043e\u043d\u043e\u0432 \u0432\u043d\u0438\u0437.

    Source code in pages\\templates_tab.py
    def scroll_templates_table_down(self) -> None:\n    \"\"\"\u041f\u0440\u043e\u043a\u0440\u0443\u0447\u0438\u0432\u0430\u0435\u0442 \u0442\u0430\u0431\u043b\u0438\u0446\u0443 \u0448\u0430\u0431\u043b\u043e\u043d\u043e\u0432 \u0432\u043d\u0438\u0437.\"\"\"\n\n    self.templates_table.scroll_down(TableLocators.TABLE_SCROLL_CONTAINER)\n
    "},{"location":"pages/templates_tab/#pages.templates_tab.TemplatesTab.scroll_templates_table_up","title":"scroll_templates_table_up()","text":"

    \u041f\u0440\u043e\u043a\u0440\u0443\u0447\u0438\u0432\u0430\u0435\u0442 \u0442\u0430\u0431\u043b\u0438\u0446\u0443 \u0448\u0430\u0431\u043b\u043e\u043d\u043e\u0432 \u0432\u0432\u0435\u0440\u0445.

    Source code in pages\\templates_tab.py
    def scroll_templates_table_up(self) -> None:\n    \"\"\"\u041f\u0440\u043e\u043a\u0440\u0443\u0447\u0438\u0432\u0430\u0435\u0442 \u0442\u0430\u0431\u043b\u0438\u0446\u0443 \u0448\u0430\u0431\u043b\u043e\u043d\u043e\u0432 \u0432\u0432\u0435\u0440\u0445.\"\"\"\n\n    self.templates_table.scroll_up(TableLocators.TABLE_SCROLL_CONTAINER)\n
    "},{"location":"pages/templates_tab/#pages.templates_tab.TemplatesTab.should_be_modal_window","title":"should_be_modal_window()","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430.

    Raises:

    Type Description AssertionError

    \u0415\u0441\u043b\u0438 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043a\u043d\u043e \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442.

    Source code in pages\\templates_tab.py
    def should_be_modal_window(self) -> None:\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430.\n\n    Raises:\n        AssertionError: \u0415\u0441\u043b\u0438 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043a\u043d\u043e \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442.\n    \"\"\"\n    self.templates_table.check_visibility(\n        ModalWindowLocators.MODAL_WINDOW,\n        \"Modal window is not visible\"\n    )\n
    "},{"location":"pages/templates_tab/#pages.templates_tab.TemplatesTab.should_be_templates_table","title":"should_be_templates_table()","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0448\u0430\u0431\u043b\u043e\u043d\u043e\u0432.

    Raises:

    Type Description AssertionError

    \u0415\u0441\u043b\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442.

    Source code in pages\\templates_tab.py
    def should_be_templates_table(self) -> None:\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0448\u0430\u0431\u043b\u043e\u043d\u043e\u0432.\n\n    Raises:\n        AssertionError: \u0415\u0441\u043b\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442.\n    \"\"\"\n\n    self.templates_table.check_visibility(\n        TableLocators.TABLE_WORK_AREA,\n        \"Templates table is missing\"\n    )\n
    "},{"location":"pages/templates_tab/#pages.templates_tab.TemplatesTab.should_be_toolbar","title":"should_be_toolbar()","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0442\u0443\u043b\u0431\u0430\u0440\u0430 \u043d\u0430 \u0432\u043a\u043b\u0430\u0434\u043a\u0435.

    Raises:

    Type Description AssertionError

    \u0415\u0441\u043b\u0438 \u0442\u0443\u043b\u0431\u0430\u0440 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442.

    Source code in pages\\templates_tab.py
    def should_be_toolbar(self) -> None:\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0442\u0443\u043b\u0431\u0430\u0440\u0430 \u043d\u0430 \u0432\u043a\u043b\u0430\u0434\u043a\u0435.\n\n    Raises:\n        AssertionError: \u0415\u0441\u043b\u0438 \u0442\u0443\u043b\u0431\u0430\u0440 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442.\n    \"\"\"\n\n    self.toolbar.check_toolbar_presence(\"Toolbar is missing\")\n
    "},{"location":"pages/templates_tab/#pages.templates_tab.TemplatesTab.should_not_be_modal_window","title":"should_not_be_modal_window()","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442, \u0447\u0442\u043e \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043a\u043d\u043e \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442.

    Raises:

    Type Description AssertionError

    \u0415\u0441\u043b\u0438 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043a\u043d\u043e \u0432\u0441\u0435 \u0435\u0449\u0435 \u0432\u0438\u0434\u043d\u043e.

    Source code in pages\\templates_tab.py
    def should_not_be_modal_window(self) -> None:\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442, \u0447\u0442\u043e \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043a\u043d\u043e \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442.\n\n    Raises:\n        AssertionError: \u0415\u0441\u043b\u0438 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043a\u043d\u043e \u0432\u0441\u0435 \u0435\u0449\u0435 \u0432\u0438\u0434\u043d\u043e.\n    \"\"\"\n    is_visible = self.page.locator(ModalWindowLocators.MODAL_WINDOW).is_visible(timeout=1000)\n    if is_visible:\n        assert False, \"Modal window should not be visible\"\n
    "},{"location":"pages/templates_tab/#pages.templates_tab.TemplatesTab.verify_json_container_content","title":"verify_json_container_content()","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430 \u0434\u0430\u043d\u043d\u044b\u043c \u0438\u0437 API.

    Source code in pages\\templates_tab.py
    def verify_json_container_content(self) -> None:\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430 \u0434\u0430\u043d\u043d\u044b\u043c \u0438\u0437 API.\"\"\"\n\n    # \u0427\u0438\u0442\u0430\u0435\u043c \u0434\u0430\u043d\u043d\u044b\u0435 \u0438\u0437 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430\n    actual_data = self.json_container.read_data(JsonContainerLocators.CONTAINER)\n    print(actual_data)\n\n    \"\"\"\n    # send request to backend to get template info\n    response = self.send_get_api_request(\"e-cmdb/api/device/template\")\n    response_body = self.get_response_body(response)\n\n    # compare actual and response from cmdb\n    self.json_container.check_json_equals(\n        actual_data,\n        response_body,\n        \"Expected json content is not equal actual:\"\n    )\n    \"\"\"\n
    "},{"location":"pages/templates_tab/#pages.templates_tab.TemplatesTab.verify_modal_content_with_api","title":"verify_modal_content_with_api(template_name)","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430 \u0434\u0430\u043d\u043d\u044b\u043c \u0438\u0437 API.

    Parameters:

    Name Type Description Default template_name str

    \u0418\u043c\u044f \u0448\u0430\u0431\u043b\u043e\u043d\u0430 \u0434\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438.

    required

    Raises:

    Type Description AssertionError

    \u0415\u0441\u043b\u0438 \u0434\u0430\u043d\u043d\u044b\u0435 \u043d\u0435 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0442 API.

    Source code in pages\\templates_tab.py
    def verify_modal_content_with_api(self, template_name: str) -> None:\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430 \u0434\u0430\u043d\u043d\u044b\u043c \u0438\u0437 API.\n\n    Args:\n        template_name: \u0418\u043c\u044f \u0448\u0430\u0431\u043b\u043e\u043d\u0430 \u0434\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438.\n\n    Raises:\n        AssertionError: \u0415\u0441\u043b\u0438 \u0434\u0430\u043d\u043d\u044b\u0435 \u043d\u0435 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0442 API.\n    \"\"\"\n    # \u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0434\u0430\u043d\u043d\u044b\u0435 \u0438\u0437 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430\n    modal_window = self.get_modal_window(template_name)\n    modal_data = modal_window.get_modal_content_data()\n\n    # \u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0434\u0430\u043d\u043d\u044b\u0435 \u0438\u0437 API\n    api_data = self.get_template_data_from_api(template_name)\n\n    # \u0421\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u0435\u043c \u0434\u0430\u043d\u043d\u044b\u0435\n    self.compare_modal_with_api_data(modal_data, api_data, template_name)\n
    "},{"location":"pages/users_tab/","title":"UsersTab","text":"

    \u041c\u043e\u0434\u0443\u043b\u044c \u0432\u043a\u043b\u0430\u0434\u043a\u0438 '\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438'.

    \u0421\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043a\u043b\u0430\u0441\u0441 UsersTab \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0442\u0430\u0431\u043b\u0438\u0446\u0435\u0439 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439. \u041f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\u043c\u0438 \u0447\u0435\u0440\u0435\u0437 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u044b\u0435 \u043e\u043a\u043d\u0430 \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0442\u044c \u0438\u0445 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435.

    "},{"location":"pages/users_tab/#pages.users_tab.UsersTab","title":"UsersTab","text":"

    Bases: BasePage

    \u041a\u043b\u0430\u0441\u0441 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0432\u043a\u043b\u0430\u0434\u043a\u043e\u0439 '\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438'.

    \u041f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u043c\u0435\u0442\u043e\u0434\u044b \u0434\u043b\u044f \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0441 \u0442\u0430\u0431\u043b\u0438\u0446\u0435\u0439 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439, \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u044b\u043c\u0438 \u043e\u043a\u043d\u0430\u043c\u0438 \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432.

    Parameters:

    Name Type Description Default page Page

    \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.

    required Source code in pages\\users_tab.py
    class UsersTab(BasePage):\n    \"\"\"\u041a\u043b\u0430\u0441\u0441 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0432\u043a\u043b\u0430\u0434\u043a\u043e\u0439 '\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438'.\n\n    \u041f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u043c\u0435\u0442\u043e\u0434\u044b \u0434\u043b\u044f \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0441 \u0442\u0430\u0431\u043b\u0438\u0446\u0435\u0439 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439,\n    \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u044b\u043c\u0438 \u043e\u043a\u043d\u0430\u043c\u0438 \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432.\n\n    Args:\n        page: \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.\n    \"\"\"\n\n    def __init__(self, page: Page) -> None:\n        \"\"\"\u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u044b \u0432\u043a\u043b\u0430\u0434\u043a\u0438 '\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438'.\"\"\"\n\n        super().__init__(page)\n\n        locator_button_1 = self.page.get_by_role(\"navigation\").filter(\n            has_text=re.compile(\"\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438\")\n        ).get_by_role(\"button\").nth(0)\n        locator_button_2 = self.page.get_by_role(\"navigation\").filter(\n            has_text=re.compile(\"\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438\")\n        ).get_by_role(\"button\").nth(1)\n\n        self.toolbar = ToolbarComponent(page, \"\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438\")\n        self.toolbar.add_tooltip_button(locator_button_1, \"edit\")\n        self.toolbar.add_tooltip_button(locator_button_1, \"add_user\")\n        self.toolbar.add_tooltip_button(locator_button_2, \"close\")\n\n        self.users_table = TableComponent(page)\n        self.modal_windows = {}\n        self.alert = AlertComponent(page)\n\n    # \u0414\u0435\u0439\u0441\u0442\u0432\u0438\u044f:\n    def add_modal_window(self, window_type: str, title: str) -> None:\n        \"\"\"\u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043a\u043d\u043e \u0432 \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u044e.\n\n        Args:\n            window_type: \u0422\u0438\u043f \u043e\u043a\u043d\u0430 ('add_user' \u0438\u043b\u0438 'edit_user').\n            title: \u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a \u043e\u043a\u043d\u0430.\n\n        Raises:\n            AssertionError: \u0415\u0441\u043b\u0438 \u0442\u0438\u043f \u043e\u043a\u043d\u0430 \u043d\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442\u0441\u044f.\n        \"\"\"\n\n        if window_type == \"add_local_user\":\n            self.modal_windows[\"add_local_user\"] = AddLocalUserModalWindow(self.page)\n        elif window_type == \"add_AD_user\":\n            self.modal_windows[\"add_AD_user\"] = AddADUserModalWindow(self.page)\n        elif window_type == \"edit_user\":\n            self.modal_windows[title] = EditUserModalWindow(self.page, title)\n        else:\n            assert False, \"Unsupported modal window type\"\n\n    def get_modal_window(self, title: str) -> ModalWindowComponent:\n        \"\"\"\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043a\u043d\u043e \u043f\u043e \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0443.\n\n        Args:\n            title: \u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a \u043e\u043a\u043d\u0430.\n\n        Returns:\n            ModalWindowComponent: \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430.\n\n        Raises:\n            AssertionError: \u0415\u0441\u043b\u0438 \u043e\u043a\u043d\u043e \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u043e.\n        \"\"\"\n\n        modal_window = self.modal_windows.get(title)\n        if modal_window is None:\n            assert False, f\"Modal window with title '{title}' not found\"\n        return modal_window\n\n    def delete_modal_window(self, title: str) -> None:\n        \"\"\"\u0423\u0434\u0430\u043b\u044f\u0435\u0442 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043a\u043d\u043e \u0438\u0437 \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u0438.\n\n        Args:\n            title: \u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a \u043e\u043a\u043d\u0430.\n\n        Raises:\n            AssertionError: \u0415\u0441\u043b\u0438 \u043e\u043a\u043d\u043e \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u043e.\n        \"\"\"\n\n        if self.modal_windows.get(title) is None:\n            assert False, f\"Modal window with title '{title}' not found\"\n        self.modal_windows[title] = None\n\n    def close_modal_window_by_toolbar_button(self, title: str) -> None:\n        \"\"\"\u0417\u0430\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043a\u043d\u043e \u0447\u0435\u0440\u0435\u0437 \u043a\u043d\u043e\u043f\u043a\u0443 \u0432 \u0442\u0443\u043b\u0431\u0430\u0440\u0435.\n\n        Args:\n            title: \u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a \u043e\u043a\u043d\u0430.\n        \"\"\"\n\n        modal_window = self.get_modal_window(title)\n        modal_window.close_window_by_toolbar_button()\n        self.delete_modal_window(title)\n\n    def close_modal_window(self, title: str) -> None:\n        \"\"\"\u0417\u0430\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043a\u043d\u043e \u0447\u0435\u0440\u0435\u0437 \u043a\u043d\u043e\u043f\u043a\u0443 \u0437\u0430\u043a\u0440\u044b\u0442\u0438\u044f.\n\n        Args:\n            title: \u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a \u043e\u043a\u043d\u0430.\n        \"\"\"\n\n        modal_window = self.get_modal_window(title)\n        modal_window.close_window()\n        self.delete_modal_window(title)\n\n    def close_add_AD_user_window_by_toolbar_button(self) -> None:\n        \"\"\"\u0417\u0430\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u043e\u043a\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0447\u0435\u0440\u0435\u0437 \u0442\u0443\u043b\u0431\u0430\u0440.\"\"\"\n\n        self.close_modal_window_by_toolbar_button(\"add_AD_user\")\n\n    def close_add_AD_user_window(self) -> None:\n        \"\"\"\u0417\u0430\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u043e\u043a\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\"\"\"\n\n        self.close_modal_window(\"add_AD_user\")\n\n    def close_add_user_window_by_toolbar_button(self) -> None:\n        \"\"\"\u0417\u0430\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u043e\u043a\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0447\u0435\u0440\u0435\u0437 \u0442\u0443\u043b\u0431\u0430\u0440.\"\"\"\n\n        self.close_modal_window_by_toolbar_button(\"add_local_user\")\n\n    def close_add_user_window(self) -> None:\n        \"\"\"\u0417\u0430\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u043e\u043a\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\"\"\"\n\n        self.close_modal_window(\"add_local_user\")\n\n    def close_edit_user_window_by_toolbar_button(self, title: str) -> None:\n        \"\"\"\u0417\u0430\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u043e\u043a\u043d\u043e \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0447\u0435\u0440\u0435\u0437 \u043a\u043d\u043e\u043f\u043a\u0443 \u0432 \u0442\u0443\u043b\u0431\u0430\u0440\u0435.\n\n        Args:\n            title: \u0418\u043c\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f (\u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a \u043e\u043a\u043d\u0430).\n        \"\"\"\n\n        self.close_modal_window_by_toolbar_button(title)\n\n    def close_edit_user_window(self, title: str) -> None:\n        \"\"\"\u0417\u0430\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u043e\u043a\u043d\u043e \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\n\n        Args:\n            title: \u0418\u043c\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f (\u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a \u043e\u043a\u043d\u0430).\n        \"\"\"\n\n        self.close_modal_window(title)\n\n\n    def add_new_user(self, user_data: dict) -> bool:\n        \"\"\"\u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u043d\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0438\u043b\u0438 \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442 \u043e\u0448\u0438\u0431\u043a\u0443 \u043f\u0440\u0438 \u0434\u0443\u0431\u043b\u0438\u043a\u0430\u0442\u0435.\n\n        Args:\n            user_data: \u0414\u0430\u043d\u043d\u044b\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f (name, role, password).\n\n        Returns:\n            bool: True \u0435\u0441\u043b\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d, False \u0435\u0441\u043b\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u0443\u0436\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442.\n\n        Raises:\n            AssertionError: \u0415\u0441\u043b\u0438 \u043e\u0442\u043a\u0440\u044b\u043b\u043e\u0441\u044c alert \u043e\u043a\u043d\u043e \u043e\u0442\u043b\u0438\u0447\u043d\u043e\u0435 \u043e\u0442 success \u0438\u043b\u0438 error,\n                        \u0438\u043b\u0438 \u0435\u0441\u043b\u0438 \u0442\u0435\u043a\u0441\u0442 alert \u043d\u0435 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u043e\u0436\u0438\u0434\u0430\u0435\u043c\u043e\u043c\u0443.\n        \"\"\"\n\n        add_user_window = self.get_modal_window(\"add_local_user\")\n\n        auth_type = user_data.get(\"auth_type\")\n        if auth_type == \"active_directory\":\n            add_user_window.check_active_directory_checkbox()\n            self.add_modal_window(\"add_AD_user\", \"\")\n            add_user_window = self.get_modal_window(\"add_AD_user\")\n            add_user_window.new_user(user_data)\n            return True\n\n        add_user_window.new_user(user_data)\n\n        is_added = False\n        alert_type = self.alert.get_alert_type()\n        if alert_type == \"success\":\n            self.alert.check_alert_presence(' \u041d\u043e\u0432\u044b\u0439 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \\n \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d! ')\n            self.alert.check_alert_absence(' \u041d\u043e\u0432\u044b\u0439 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \\n \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d! ')\n            is_added = True\n        elif alert_type == \"error\":\n            self.alert.check_alert_presence(f' \u0418\u043c\u044f {user_data[\"name\"]} \u0443\u0436\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f ')\n            self.alert.check_alert_absence(f' \u0418\u043c\u044f {user_data[\"name\"]} \u0443\u0436\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f ')\n        else:\n            assert False, f\"Got unexpected alert type {alert_type}\"\n\n        return is_added\n\n    def delete_user(self, user_name: str) -> None:\n        \"\"\"\u0423\u0434\u0430\u043b\u044f\u0435\u0442 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\n\n        Args:\n            user_name: \u0418\u043c\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\n\n        Raises:\n            AssertionError: \u0415\u0441\u043b\u0438 \u043d\u0435\u0442 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u043e\u0431 \u0443\u0441\u043f\u0435\u0448\u043d\u043e\u043c \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0438.\n        \"\"\"\n\n        self.get_modal_window(user_name).delete_user()\n\n        alert_type = self.alert.get_alert_type()\n        assert alert_type==\"success\", f\"Expected success alert, but got {alert_type} alert\"\n\n        self.alert.check_alert_presence('\\n\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u0443\u0434\u0430\u043b\u0451\u043d\\n')\n        self.alert.check_alert_absence('\\n\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u0443\u0434\u0430\u043b\u0451\u043d\\n')\n\n    def edit_user(self, user_name: str, user_data: dict) -> None:\n        \"\"\"\u0420\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u0443\u0435\u0442 \u0434\u0430\u043d\u043d\u044b\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\n\n        Args:\n            user_name: \u0418\u043c\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\n            user_data: \u041d\u043e\u0432\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\n\n        Raises:\n            AssertionError: \u0415\u0441\u043b\u0438 \u043d\u0435\u0442 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u043e\u0431 \u0443\u0441\u043f\u0435\u0448\u043d\u043e\u043c \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0438.\n        \"\"\"\n\n        self.get_modal_window(user_name).edit_user(user_data)\n\n        alert_type = self.alert.get_alert_type()\n        assert alert_type==\"success\", f\"Expected success alert, but got {alert_type} alert\"\n\n        self.alert.check_alert_presence('\\n\u041e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u0443\u0441\u043f\u0435\u0448\u043d\u043e\\n')\n        self.alert.check_alert_absence('\\n\u041e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u0443\u0441\u043f\u0435\u0448\u043d\u043e\\n')\n\n    def reset_password(self, user_name: str) -> str:\n        \"\"\"\u0421\u0431\u0440\u0430\u0441\u044b\u0432\u0430\u0435\u0442 \u043f\u0430\u0440\u043e\u043b\u044c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\n\n        Args:\n            user_name: \u0418\u043c\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\n\n        Returns:\n            str: \u041d\u043e\u0432\u044b\u0439 \u043f\u0430\u0440\u043e\u043b\u044c (\u0435\u0441\u043b\u0438 \u043f\u043e\u043b\u0443\u0447\u0435\u043d).\n        \"\"\"\n\n        new_password = \"\"\n        self.get_modal_window(user_name).reset_password()\n\n        self.alert.check_alert_presence(\"\")\n        alert_message = self.alert.get_text()\n        if len(alert_message) > 0:\n            new_password = re.findall(r'[\\d]+', alert_message)[0]\n\n        return new_password\n\n    def find_user_in_table(self, name: str, role: str) -> int:\n        \"\"\"\u0418\u0449\u0435\u0442 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435.\n\n        Args:\n            name: \u0418\u043c\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\n            role: \u0420\u043e\u043b\u044c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\n\n        Returns:\n            int: \u0418\u043d\u0434\u0435\u043a\u0441 \u0441\u0442\u0440\u043e\u043a\u0438 \u0438\u043b\u0438 -1 \u0435\u0441\u043b\u0438 \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d.\n\n        Raises:\n            AssertionError: \u0415\u0441\u043b\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u043f\u0443\u0441\u0442\u0430.\n        \"\"\"\n\n        self.page.wait_for_timeout(1000)\n\n        table_content = self.users_table.read(TableLocators.TABLE_WORK_AREA)\n        if len(table_content) == 0:\n            assert False, \"The contents of the table are missing\"\n\n        del table_content[0]  # \u0423\u0434\u0430\u043b\u044f\u0435\u043c \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a\n\n        for row_index, user_info in enumerate(table_content):\n            if name in user_info and role in user_info:\n                return row_index\n        return -1\n\n    def open_add_user_window(self) -> None:\n        \"\"\"\u041e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u043e\u043a\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\n\n        Raises:\n            AssertionError: \u0415\u0441\u043b\u0438 \u043a\u043d\u043e\u043f\u043a\u0438 \u043d\u0435\u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b \u0438\u043b\u0438 \u043e\u043a\u043d\u043e \u043d\u0435 \u043e\u0442\u043a\u0440\u044b\u043b\u043e\u0441\u044c.\n        \"\"\"\n\n        if self.toolbar.is_button_not_present(\"close\"):\n            self.toolbar.check_button_visibility(\"edit\")\n            self.toolbar.click_button(\"edit\")\n\n        self.toolbar.check_button_visibility(\"add_user\")\n        self.toolbar.click_button(\"add_user\")\n        self.add_modal_window(\"add_local_user\", \"\")\n        self.get_modal_window(\"add_local_user\").check_by_window_title()\n\n    def open_edit_user_page_by_index(self, row_index: int) -> tuple:\n        \"\"\"\u041e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u043e\u043a\u043d\u043e \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043f\u043e \u0438\u043d\u0434\u0435\u043a\u0441\u0443 \u0441\u0442\u0440\u043e\u043a\u0438.\n\n        Args:\n            row_index: \u0418\u043d\u0434\u0435\u043a\u0441 \u0441\u0442\u0440\u043e\u043a\u0438 \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435.\n\n        Returns:\n            tuple: (\u0438\u043c\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f, \u0440\u043e\u043b\u044c).\n\n        Raises:\n            AssertionError: \u0415\u0441\u043b\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u043f\u0443\u0441\u0442\u0430 \u0438\u043b\u0438 \u0438\u043d\u0434\u0435\u043a\u0441 \u0432\u043d\u0435 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0430.\n        \"\"\"\n\n        self.page.wait_for_timeout(2000)\n\n        tmp_dict = {\"admin\": \"\u0410\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440\", \"manager\": \"\u041a\u043e\u043d\u0442\u0430\u043a\u0442\u043d\u043e\u0435 \u043b\u0438\u0446\u043e\", \"operator\": \"\u041e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\"}\n        table_content = self.users_table.read(TableLocators.TABLE_WORK_AREA)\n\n        if len(table_content) == 0:\n            assert False, \"The contents of the table are missing\"\n\n        del table_content[0]  # \u0423\u0434\u0430\u043b\u044f\u0435\u043c \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a\n\n        if row_index >= len(table_content):\n            assert False, \"Row_index is out of range\"\n\n        user_name = table_content[row_index][0]\n        for key, val in tmp_dict.items():\n            if user_name == val:\n                user_name = key\n\n        role = table_content[row_index][2]\n\n        self.page.locator(TableLocators.TABLE_WORK_AREA).locator(\"//tbody/tr\").nth(row_index).click()\n        self.add_modal_window(\"edit_user\", user_name)\n        self.get_modal_window(user_name).check_by_window_title()\n\n        return user_name, role\n\n    def open_edit_user_page_by_user(self, user_name: str, role: str) -> None:\n        \"\"\"\u041e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u043e\u043a\u043d\u043e \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043f\u043e \u0438\u043c\u0435\u043d\u0438 \u0438 \u0440\u043e\u043b\u0438.\n\n        Args:\n            user_name: \u0418\u043c\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\n            role: \u0420\u043e\u043b\u044c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\n\n        Raises:\n            AssertionError: \u0415\u0441\u043b\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d.\n        \"\"\"\n\n        row_index = self.find_user_in_table(user_name, role)\n        if row_index == -1:\n            assert False, f\"User with name {user_name} and role {role} has not been found\"\n\n        self.page.locator(TableLocators.TABLE_WORK_AREA).locator(\"//tbody/tr\").nth(row_index).click()\n        self.add_modal_window(\"edit_user\", user_name)\n        self.get_modal_window(user_name).check_by_window_title()\n\n    def transform_to_add_AD_user_window(self):\n        \"\"\"\u0422\u0440\u0430\u043d\u0441\u0444\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u0442 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043a\u043d\u043e  \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\n           \u0432 \u043e\u043a\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f Active Directory \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043d\u0430\u0436\u0430\u0442\u0438\u044f\n           \u0447\u0435\u043a-\u0431\u043e\u043a\u0441\u0430 Active Directory.\n        \"\"\"\n\n        self.get_modal_window(\"add_local_user\").check_active_directory_checkbox()\n        modal_window = self.modal_windows.get(\"add_AD_user\")\n        if modal_window is None:\n            self.add_modal_window(\"add_AD_user\", \"\")\n\n    def transform_to_add_user_window(self):\n        \"\"\"\u0422\u0440\u0430\u043d\u0441\u0444\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u0442 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043a\u043d\u043e  \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f Active Directory\n           \u0432 \u043e\u043a\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0441\u043d\u044f\u0442\u0438\u044f \u043e\u0442\u043c\u0435\u0442\u043a\u0438 \u0441\n           \u0447\u0435\u043a-\u0431\u043e\u043a\u0441\u0430 Active Directory.\n        \"\"\"\n\n        self.get_modal_window(\"add_AD_user\").uncheck_active_directory_checkbox()\n        modal_window = self.modal_windows.get(\"add_local_user\")\n        if modal_window is None:\n            self.add_modal_window(\"add_local_user\", \"\")\n\n    # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0438:\n    def check_users_table_content(self, verify: bool = False) -> None:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439.\n\n        Args:\n            verify: \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0442\u044c \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438\u0437 \u0411\u0414. \u041f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e False.\n\n        Raises:\n            AssertionError: \u0415\u0441\u043b\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u043f\u0443\u0441\u0442\u0430 \u0438\u043b\u0438 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0438 \u043d\u0435\u0432\u0435\u0440\u043d\u044b.\n        \"\"\"\n        self.page.wait_for_timeout(2000)\n\n        expected_headers = ['\u0418\u043c\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f', '\u0422\u0438\u043f \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u0438', '\u0420\u043e\u043b\u044c', 'E-mail', '\u041d\u043e\u043c\u0435\u0440 \u0434\u043b\u044f \u0421\u041c\u0421']\n        table_content = self.users_table.read(TableLocators.TABLE_WORK_AREA)\n\n        if len(table_content) == 0:\n            assert False, \"The contents of the table are missing\"\n\n        actual_headers = table_content[0]\n        self.check_equals(\n            actual_headers,\n            expected_headers,\n            f\"Expected table headers {expected_headers} are not equal {actual_headers}\"\n        )\n\n        if len(table_content) == 1:\n            assert False, \"Table body is missing\"\n\n        if verify:\n            self.verify_users_table_content(table_content)\n\n    def check_add_user_window_content(self) -> None:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u043e\u043a\u043d\u0430 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\"\"\"\n\n        self.get_modal_window(\"add_local_user\").check_content()\n\n    def check_add_AD_user_window_content(self) -> None:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u043e\u043a\u043d\u0430 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0447\u0435\u0440\u0435\u0437 Active Directory.\"\"\"\n\n        self.get_modal_window(\"add_AD_user\").check_content()\n\n    def check_edit_user_window_content(self, user_name: str, role: str) -> None:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u043e\u043a\u043d\u0430 \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f.\n\n        Args:\n            user_name: \u0418\u043c\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\n            role: \u0420\u043e\u043b\u044c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\n        \"\"\"\n\n        edit_user_window = self.get_modal_window(user_name)\n        edit_user_window.check_content(user_name, role)\n\n    def should_be_toolbar(self) -> None:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0442\u0443\u043b\u0431\u0430\u0440\u0430.\n\n        Raises:\n            AssertionError: \u0415\u0441\u043b\u0438 \u0442\u0443\u043b\u0431\u0430\u0440 \u0438\u043b\u0438 \u043a\u043d\u043e\u043f\u043a\u0430 \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u044e\u0442.\n        \"\"\"\n\n        self.toolbar.check_toolbar_presence(\"Toolbar is missing\")\n        self.toolbar.check_button_visibility(\"edit\")\n\n    def should_be_toolbar_buttons(self) -> None:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u043a\u043d\u043e\u043f\u043e\u043a \u0442\u0443\u043b\u0431\u0430\u0440\u0430.\n\n        Raises:\n            AssertionError: \u0415\u0441\u043b\u0438 \u043a\u043d\u043e\u043f\u043a\u0438 \u043d\u0435\u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b \u0438\u043b\u0438 \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0438 \u043d\u0435\u0432\u0435\u0440\u043d\u044b.\n        \"\"\"\n\n        self.toolbar.check_button_visibility(\"edit\")\n        self.toolbar.check_button_tooltip(\"edit\", \"\u0420\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c\")\n\n        self.toolbar.get_button_by_name(\"edit\").click()\n        self.toolbar.check_button_visibility(\"add_user\")\n        self.toolbar.check_button_visibility(\"close\")\n        self.toolbar.check_button_tooltip(\"add_user\", \"\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c\")\n        self.toolbar.check_button_tooltip(\"close\", \"\u0417\u0430\u043a\u0440\u044b\u0442\u044c\")\n\n        self.toolbar.get_button_by_name(\"close\").click()\n        self.toolbar.check_button_visibility(\"edit\")\n\n    def should_be_users_table(self) -> None:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439.\n\n        Raises:\n            AssertionError: \u0415\u0441\u043b\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442.\n        \"\"\"\n\n        self.users_table.check_visibility(\n            TableLocators.TABLE_WORK_AREA,\n            \"Users table is missing\"\n        )\n\n    def should_be_user_in_table(self, name: str, role: str) -> None:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435.\n\n        Args:\n            name: \u0418\u043c\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\n            role: \u0420\u043e\u043b\u044c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\n\n        Raises:\n            AssertionError: \u0415\u0441\u043b\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d.\n        \"\"\"\n\n        found = self.find_user_in_table(name, role)\n        if found == -1:\n            assert False, f\"User with name {name} and role {role} has not been found\"\n\n    def should_not_be_user_in_table(self, name: str, role: str) -> None:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435.\n\n        Args:\n            name: \u0418\u043c\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\n            role: \u0420\u043e\u043b\u044c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\n\n        Raises:\n            AssertionError: \u0415\u0441\u043b\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u043d\u0430\u0439\u0434\u0435\u043d.\n        \"\"\"\n\n        found = self.find_user_in_table(name, role)\n        if found != -1:\n            assert False, f\"User with name {name} and role {role} has been found\"\n\n    def verify_users_table_content(self, users_table: list) -> None:\n        \"\"\"\u0421\u0432\u0435\u0440\u044f\u0435\u0442 \u0434\u0430\u043d\u043d\u044b\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0441 \u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u0438\u0437 \u0411\u0414.\n\n        Args:\n            users_table: \u0414\u0430\u043d\u043d\u044b\u0435 \u0438\u0437 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u043d\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435.\n\n        Raises:\n            AssertionError: \u0415\u0441\u043b\u0438 \u0434\u0430\u043d\u043d\u044b\u0435 \u043d\u0435 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0442.\n        \"\"\"\n\n        expected_users_list = []\n        tmp_dict = {\"admin\": \"\u0410\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440\", \"manager\": \"\u041a\u043e\u043d\u0442\u0430\u043a\u0442\u043d\u043e\u0435 \u043b\u0438\u0446\u043e\", \"operator\": \"\u041e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\"}\n\n        query = {\n            \"id\": [\"/catalogs/user\"],\n            \"data\": {\n                \"namePath\": True,\n                \"children\": {\"flatten\": True}\n            }\n        }\n\n        response = self.send_post_api_request(\"e-cmdb/api/query\", query)\n        response_body = self.get_response_body(response)\n\n        for item in response_body[0][\"children\"]:\n            user_info = []\n            user_name = item[\"name\"]\n\n            if user_name in tmp_dict.keys():\n                item[\"name\"] = tmp_dict[user_name]\n            user_info.append(item[\"name\"])\n\n            if item[\"type_auth\"] is not None:\n                user_info.append(item[\"type_auth\"])\n            else:\n                user_info.append(\"\")\n\n            if item[\"role\"] is not None:\n                role = item[\"role\"]\n                if role in roles_dict.keys():\n                    item[\"role\"] = roles_dict[role]\n                user_info.append(item[\"role\"])\n            else:\n                user_info.append(\"\")\n\n            if item[\"email\"] is not None:\n                user_info.append(item[\"email\"])\n            else:\n                user_info.append(\"\")\n\n            if item[\"sms_phone\"] is not None:\n                user_info.append(item[\"sms_phone\"])\n            else:\n                user_info.append(\"\")\n\n            expected_users_list.append(user_info)\n\n        del users_table[0]  # \u0423\u0434\u0430\u043b\u044f\u0435\u043c \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a\n\n        self.check_lists_equals(\n            users_table,\n            expected_users_list,\n            \"Actual users list is not equal expected users list on base db\"\n        )\n
    "},{"location":"pages/users_tab/#pages.users_tab.UsersTab.__init__","title":"__init__(page)","text":"

    \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u044b \u0432\u043a\u043b\u0430\u0434\u043a\u0438 '\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438'.

    Source code in pages\\users_tab.py
    def __init__(self, page: Page) -> None:\n    \"\"\"\u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u044b \u0432\u043a\u043b\u0430\u0434\u043a\u0438 '\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438'.\"\"\"\n\n    super().__init__(page)\n\n    locator_button_1 = self.page.get_by_role(\"navigation\").filter(\n        has_text=re.compile(\"\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438\")\n    ).get_by_role(\"button\").nth(0)\n    locator_button_2 = self.page.get_by_role(\"navigation\").filter(\n        has_text=re.compile(\"\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438\")\n    ).get_by_role(\"button\").nth(1)\n\n    self.toolbar = ToolbarComponent(page, \"\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438\")\n    self.toolbar.add_tooltip_button(locator_button_1, \"edit\")\n    self.toolbar.add_tooltip_button(locator_button_1, \"add_user\")\n    self.toolbar.add_tooltip_button(locator_button_2, \"close\")\n\n    self.users_table = TableComponent(page)\n    self.modal_windows = {}\n    self.alert = AlertComponent(page)\n
    "},{"location":"pages/users_tab/#pages.users_tab.UsersTab.add_modal_window","title":"add_modal_window(window_type, title)","text":"

    \u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043a\u043d\u043e \u0432 \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u044e.

    Parameters:

    Name Type Description Default window_type str

    \u0422\u0438\u043f \u043e\u043a\u043d\u0430 ('add_user' \u0438\u043b\u0438 'edit_user').

    required title str

    \u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a \u043e\u043a\u043d\u0430.

    required

    Raises:

    Type Description AssertionError

    \u0415\u0441\u043b\u0438 \u0442\u0438\u043f \u043e\u043a\u043d\u0430 \u043d\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442\u0441\u044f.

    Source code in pages\\users_tab.py
    def add_modal_window(self, window_type: str, title: str) -> None:\n    \"\"\"\u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043a\u043d\u043e \u0432 \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u044e.\n\n    Args:\n        window_type: \u0422\u0438\u043f \u043e\u043a\u043d\u0430 ('add_user' \u0438\u043b\u0438 'edit_user').\n        title: \u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a \u043e\u043a\u043d\u0430.\n\n    Raises:\n        AssertionError: \u0415\u0441\u043b\u0438 \u0442\u0438\u043f \u043e\u043a\u043d\u0430 \u043d\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442\u0441\u044f.\n    \"\"\"\n\n    if window_type == \"add_local_user\":\n        self.modal_windows[\"add_local_user\"] = AddLocalUserModalWindow(self.page)\n    elif window_type == \"add_AD_user\":\n        self.modal_windows[\"add_AD_user\"] = AddADUserModalWindow(self.page)\n    elif window_type == \"edit_user\":\n        self.modal_windows[title] = EditUserModalWindow(self.page, title)\n    else:\n        assert False, \"Unsupported modal window type\"\n
    "},{"location":"pages/users_tab/#pages.users_tab.UsersTab.add_new_user","title":"add_new_user(user_data)","text":"

    \u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u043d\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0438\u043b\u0438 \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442 \u043e\u0448\u0438\u0431\u043a\u0443 \u043f\u0440\u0438 \u0434\u0443\u0431\u043b\u0438\u043a\u0430\u0442\u0435.

    Parameters:

    Name Type Description Default user_data dict

    \u0414\u0430\u043d\u043d\u044b\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f (name, role, password).

    required

    Returns:

    Name Type Description bool bool

    True \u0435\u0441\u043b\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d, False \u0435\u0441\u043b\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u0443\u0436\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442.

    Raises:

    Type Description AssertionError

    \u0415\u0441\u043b\u0438 \u043e\u0442\u043a\u0440\u044b\u043b\u043e\u0441\u044c alert \u043e\u043a\u043d\u043e \u043e\u0442\u043b\u0438\u0447\u043d\u043e\u0435 \u043e\u0442 success \u0438\u043b\u0438 error, \u0438\u043b\u0438 \u0435\u0441\u043b\u0438 \u0442\u0435\u043a\u0441\u0442 alert \u043d\u0435 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u043e\u0436\u0438\u0434\u0430\u0435\u043c\u043e\u043c\u0443.

    Source code in pages\\users_tab.py
    def add_new_user(self, user_data: dict) -> bool:\n    \"\"\"\u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u043d\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0438\u043b\u0438 \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442 \u043e\u0448\u0438\u0431\u043a\u0443 \u043f\u0440\u0438 \u0434\u0443\u0431\u043b\u0438\u043a\u0430\u0442\u0435.\n\n    Args:\n        user_data: \u0414\u0430\u043d\u043d\u044b\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f (name, role, password).\n\n    Returns:\n        bool: True \u0435\u0441\u043b\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d, False \u0435\u0441\u043b\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u0443\u0436\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442.\n\n    Raises:\n        AssertionError: \u0415\u0441\u043b\u0438 \u043e\u0442\u043a\u0440\u044b\u043b\u043e\u0441\u044c alert \u043e\u043a\u043d\u043e \u043e\u0442\u043b\u0438\u0447\u043d\u043e\u0435 \u043e\u0442 success \u0438\u043b\u0438 error,\n                    \u0438\u043b\u0438 \u0435\u0441\u043b\u0438 \u0442\u0435\u043a\u0441\u0442 alert \u043d\u0435 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u043e\u0436\u0438\u0434\u0430\u0435\u043c\u043e\u043c\u0443.\n    \"\"\"\n\n    add_user_window = self.get_modal_window(\"add_local_user\")\n\n    auth_type = user_data.get(\"auth_type\")\n    if auth_type == \"active_directory\":\n        add_user_window.check_active_directory_checkbox()\n        self.add_modal_window(\"add_AD_user\", \"\")\n        add_user_window = self.get_modal_window(\"add_AD_user\")\n        add_user_window.new_user(user_data)\n        return True\n\n    add_user_window.new_user(user_data)\n\n    is_added = False\n    alert_type = self.alert.get_alert_type()\n    if alert_type == \"success\":\n        self.alert.check_alert_presence(' \u041d\u043e\u0432\u044b\u0439 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \\n \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d! ')\n        self.alert.check_alert_absence(' \u041d\u043e\u0432\u044b\u0439 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \\n \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d! ')\n        is_added = True\n    elif alert_type == \"error\":\n        self.alert.check_alert_presence(f' \u0418\u043c\u044f {user_data[\"name\"]} \u0443\u0436\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f ')\n        self.alert.check_alert_absence(f' \u0418\u043c\u044f {user_data[\"name\"]} \u0443\u0436\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f ')\n    else:\n        assert False, f\"Got unexpected alert type {alert_type}\"\n\n    return is_added\n
    "},{"location":"pages/users_tab/#pages.users_tab.UsersTab.check_add_AD_user_window_content","title":"check_add_AD_user_window_content()","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u043e\u043a\u043d\u0430 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0447\u0435\u0440\u0435\u0437 Active Directory.

    Source code in pages\\users_tab.py
    def check_add_AD_user_window_content(self) -> None:\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u043e\u043a\u043d\u0430 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0447\u0435\u0440\u0435\u0437 Active Directory.\"\"\"\n\n    self.get_modal_window(\"add_AD_user\").check_content()\n
    "},{"location":"pages/users_tab/#pages.users_tab.UsersTab.check_add_user_window_content","title":"check_add_user_window_content()","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u043e\u043a\u043d\u0430 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.

    Source code in pages\\users_tab.py
    def check_add_user_window_content(self) -> None:\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u043e\u043a\u043d\u0430 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\"\"\"\n\n    self.get_modal_window(\"add_local_user\").check_content()\n
    "},{"location":"pages/users_tab/#pages.users_tab.UsersTab.check_edit_user_window_content","title":"check_edit_user_window_content(user_name, role)","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u043e\u043a\u043d\u0430 \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f.

    Parameters:

    Name Type Description Default user_name str

    \u0418\u043c\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.

    required role str

    \u0420\u043e\u043b\u044c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.

    required Source code in pages\\users_tab.py
    def check_edit_user_window_content(self, user_name: str, role: str) -> None:\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u043e\u043a\u043d\u0430 \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f.\n\n    Args:\n        user_name: \u0418\u043c\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\n        role: \u0420\u043e\u043b\u044c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\n    \"\"\"\n\n    edit_user_window = self.get_modal_window(user_name)\n    edit_user_window.check_content(user_name, role)\n
    "},{"location":"pages/users_tab/#pages.users_tab.UsersTab.check_users_table_content","title":"check_users_table_content(verify=False)","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439.

    Parameters:

    Name Type Description Default verify bool

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0442\u044c \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438\u0437 \u0411\u0414. \u041f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e False.

    False

    Raises:

    Type Description AssertionError

    \u0415\u0441\u043b\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u043f\u0443\u0441\u0442\u0430 \u0438\u043b\u0438 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0438 \u043d\u0435\u0432\u0435\u0440\u043d\u044b.

    Source code in pages\\users_tab.py
    def check_users_table_content(self, verify: bool = False) -> None:\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439.\n\n    Args:\n        verify: \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0442\u044c \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438\u0437 \u0411\u0414. \u041f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e False.\n\n    Raises:\n        AssertionError: \u0415\u0441\u043b\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u043f\u0443\u0441\u0442\u0430 \u0438\u043b\u0438 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0438 \u043d\u0435\u0432\u0435\u0440\u043d\u044b.\n    \"\"\"\n    self.page.wait_for_timeout(2000)\n\n    expected_headers = ['\u0418\u043c\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f', '\u0422\u0438\u043f \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u0438', '\u0420\u043e\u043b\u044c', 'E-mail', '\u041d\u043e\u043c\u0435\u0440 \u0434\u043b\u044f \u0421\u041c\u0421']\n    table_content = self.users_table.read(TableLocators.TABLE_WORK_AREA)\n\n    if len(table_content) == 0:\n        assert False, \"The contents of the table are missing\"\n\n    actual_headers = table_content[0]\n    self.check_equals(\n        actual_headers,\n        expected_headers,\n        f\"Expected table headers {expected_headers} are not equal {actual_headers}\"\n    )\n\n    if len(table_content) == 1:\n        assert False, \"Table body is missing\"\n\n    if verify:\n        self.verify_users_table_content(table_content)\n
    "},{"location":"pages/users_tab/#pages.users_tab.UsersTab.close_add_AD_user_window","title":"close_add_AD_user_window()","text":"

    \u0417\u0430\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u043e\u043a\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.

    Source code in pages\\users_tab.py
    def close_add_AD_user_window(self) -> None:\n    \"\"\"\u0417\u0430\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u043e\u043a\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\"\"\"\n\n    self.close_modal_window(\"add_AD_user\")\n
    "},{"location":"pages/users_tab/#pages.users_tab.UsersTab.close_add_AD_user_window_by_toolbar_button","title":"close_add_AD_user_window_by_toolbar_button()","text":"

    \u0417\u0430\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u043e\u043a\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0447\u0435\u0440\u0435\u0437 \u0442\u0443\u043b\u0431\u0430\u0440.

    Source code in pages\\users_tab.py
    def close_add_AD_user_window_by_toolbar_button(self) -> None:\n    \"\"\"\u0417\u0430\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u043e\u043a\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0447\u0435\u0440\u0435\u0437 \u0442\u0443\u043b\u0431\u0430\u0440.\"\"\"\n\n    self.close_modal_window_by_toolbar_button(\"add_AD_user\")\n
    "},{"location":"pages/users_tab/#pages.users_tab.UsersTab.close_add_user_window","title":"close_add_user_window()","text":"

    \u0417\u0430\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u043e\u043a\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.

    Source code in pages\\users_tab.py
    def close_add_user_window(self) -> None:\n    \"\"\"\u0417\u0430\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u043e\u043a\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\"\"\"\n\n    self.close_modal_window(\"add_local_user\")\n
    "},{"location":"pages/users_tab/#pages.users_tab.UsersTab.close_add_user_window_by_toolbar_button","title":"close_add_user_window_by_toolbar_button()","text":"

    \u0417\u0430\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u043e\u043a\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0447\u0435\u0440\u0435\u0437 \u0442\u0443\u043b\u0431\u0430\u0440.

    Source code in pages\\users_tab.py
    def close_add_user_window_by_toolbar_button(self) -> None:\n    \"\"\"\u0417\u0430\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u043e\u043a\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0447\u0435\u0440\u0435\u0437 \u0442\u0443\u043b\u0431\u0430\u0440.\"\"\"\n\n    self.close_modal_window_by_toolbar_button(\"add_local_user\")\n
    "},{"location":"pages/users_tab/#pages.users_tab.UsersTab.close_edit_user_window","title":"close_edit_user_window(title)","text":"

    \u0417\u0430\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u043e\u043a\u043d\u043e \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.

    Parameters:

    Name Type Description Default title str

    \u0418\u043c\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f (\u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a \u043e\u043a\u043d\u0430).

    required Source code in pages\\users_tab.py
    def close_edit_user_window(self, title: str) -> None:\n    \"\"\"\u0417\u0430\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u043e\u043a\u043d\u043e \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\n\n    Args:\n        title: \u0418\u043c\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f (\u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a \u043e\u043a\u043d\u0430).\n    \"\"\"\n\n    self.close_modal_window(title)\n
    "},{"location":"pages/users_tab/#pages.users_tab.UsersTab.close_edit_user_window_by_toolbar_button","title":"close_edit_user_window_by_toolbar_button(title)","text":"

    \u0417\u0430\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u043e\u043a\u043d\u043e \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0447\u0435\u0440\u0435\u0437 \u043a\u043d\u043e\u043f\u043a\u0443 \u0432 \u0442\u0443\u043b\u0431\u0430\u0440\u0435.

    Parameters:

    Name Type Description Default title str

    \u0418\u043c\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f (\u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a \u043e\u043a\u043d\u0430).

    required Source code in pages\\users_tab.py
    def close_edit_user_window_by_toolbar_button(self, title: str) -> None:\n    \"\"\"\u0417\u0430\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u043e\u043a\u043d\u043e \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0447\u0435\u0440\u0435\u0437 \u043a\u043d\u043e\u043f\u043a\u0443 \u0432 \u0442\u0443\u043b\u0431\u0430\u0440\u0435.\n\n    Args:\n        title: \u0418\u043c\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f (\u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a \u043e\u043a\u043d\u0430).\n    \"\"\"\n\n    self.close_modal_window_by_toolbar_button(title)\n
    "},{"location":"pages/users_tab/#pages.users_tab.UsersTab.close_modal_window","title":"close_modal_window(title)","text":"

    \u0417\u0430\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043a\u043d\u043e \u0447\u0435\u0440\u0435\u0437 \u043a\u043d\u043e\u043f\u043a\u0443 \u0437\u0430\u043a\u0440\u044b\u0442\u0438\u044f.

    Parameters:

    Name Type Description Default title str

    \u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a \u043e\u043a\u043d\u0430.

    required Source code in pages\\users_tab.py
    def close_modal_window(self, title: str) -> None:\n    \"\"\"\u0417\u0430\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043a\u043d\u043e \u0447\u0435\u0440\u0435\u0437 \u043a\u043d\u043e\u043f\u043a\u0443 \u0437\u0430\u043a\u0440\u044b\u0442\u0438\u044f.\n\n    Args:\n        title: \u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a \u043e\u043a\u043d\u0430.\n    \"\"\"\n\n    modal_window = self.get_modal_window(title)\n    modal_window.close_window()\n    self.delete_modal_window(title)\n
    "},{"location":"pages/users_tab/#pages.users_tab.UsersTab.close_modal_window_by_toolbar_button","title":"close_modal_window_by_toolbar_button(title)","text":"

    \u0417\u0430\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043a\u043d\u043e \u0447\u0435\u0440\u0435\u0437 \u043a\u043d\u043e\u043f\u043a\u0443 \u0432 \u0442\u0443\u043b\u0431\u0430\u0440\u0435.

    Parameters:

    Name Type Description Default title str

    \u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a \u043e\u043a\u043d\u0430.

    required Source code in pages\\users_tab.py
    def close_modal_window_by_toolbar_button(self, title: str) -> None:\n    \"\"\"\u0417\u0430\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043a\u043d\u043e \u0447\u0435\u0440\u0435\u0437 \u043a\u043d\u043e\u043f\u043a\u0443 \u0432 \u0442\u0443\u043b\u0431\u0430\u0440\u0435.\n\n    Args:\n        title: \u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a \u043e\u043a\u043d\u0430.\n    \"\"\"\n\n    modal_window = self.get_modal_window(title)\n    modal_window.close_window_by_toolbar_button()\n    self.delete_modal_window(title)\n
    "},{"location":"pages/users_tab/#pages.users_tab.UsersTab.delete_modal_window","title":"delete_modal_window(title)","text":"

    \u0423\u0434\u0430\u043b\u044f\u0435\u0442 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043a\u043d\u043e \u0438\u0437 \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u0438.

    Parameters:

    Name Type Description Default title str

    \u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a \u043e\u043a\u043d\u0430.

    required

    Raises:

    Type Description AssertionError

    \u0415\u0441\u043b\u0438 \u043e\u043a\u043d\u043e \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u043e.

    Source code in pages\\users_tab.py
    def delete_modal_window(self, title: str) -> None:\n    \"\"\"\u0423\u0434\u0430\u043b\u044f\u0435\u0442 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043a\u043d\u043e \u0438\u0437 \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u0438.\n\n    Args:\n        title: \u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a \u043e\u043a\u043d\u0430.\n\n    Raises:\n        AssertionError: \u0415\u0441\u043b\u0438 \u043e\u043a\u043d\u043e \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u043e.\n    \"\"\"\n\n    if self.modal_windows.get(title) is None:\n        assert False, f\"Modal window with title '{title}' not found\"\n    self.modal_windows[title] = None\n
    "},{"location":"pages/users_tab/#pages.users_tab.UsersTab.delete_user","title":"delete_user(user_name)","text":"

    \u0423\u0434\u0430\u043b\u044f\u0435\u0442 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.

    Parameters:

    Name Type Description Default user_name str

    \u0418\u043c\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.

    required

    Raises:

    Type Description AssertionError

    \u0415\u0441\u043b\u0438 \u043d\u0435\u0442 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u043e\u0431 \u0443\u0441\u043f\u0435\u0448\u043d\u043e\u043c \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0438.

    Source code in pages\\users_tab.py
    def delete_user(self, user_name: str) -> None:\n    \"\"\"\u0423\u0434\u0430\u043b\u044f\u0435\u0442 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\n\n    Args:\n        user_name: \u0418\u043c\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\n\n    Raises:\n        AssertionError: \u0415\u0441\u043b\u0438 \u043d\u0435\u0442 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u043e\u0431 \u0443\u0441\u043f\u0435\u0448\u043d\u043e\u043c \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0438.\n    \"\"\"\n\n    self.get_modal_window(user_name).delete_user()\n\n    alert_type = self.alert.get_alert_type()\n    assert alert_type==\"success\", f\"Expected success alert, but got {alert_type} alert\"\n\n    self.alert.check_alert_presence('\\n\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u0443\u0434\u0430\u043b\u0451\u043d\\n')\n    self.alert.check_alert_absence('\\n\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u0443\u0434\u0430\u043b\u0451\u043d\\n')\n
    "},{"location":"pages/users_tab/#pages.users_tab.UsersTab.edit_user","title":"edit_user(user_name, user_data)","text":"

    \u0420\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u0443\u0435\u0442 \u0434\u0430\u043d\u043d\u044b\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.

    Parameters:

    Name Type Description Default user_name str

    \u0418\u043c\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.

    required user_data dict

    \u041d\u043e\u0432\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.

    required

    Raises:

    Type Description AssertionError

    \u0415\u0441\u043b\u0438 \u043d\u0435\u0442 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u043e\u0431 \u0443\u0441\u043f\u0435\u0448\u043d\u043e\u043c \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0438.

    Source code in pages\\users_tab.py
    def edit_user(self, user_name: str, user_data: dict) -> None:\n    \"\"\"\u0420\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u0443\u0435\u0442 \u0434\u0430\u043d\u043d\u044b\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\n\n    Args:\n        user_name: \u0418\u043c\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\n        user_data: \u041d\u043e\u0432\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\n\n    Raises:\n        AssertionError: \u0415\u0441\u043b\u0438 \u043d\u0435\u0442 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u043e\u0431 \u0443\u0441\u043f\u0435\u0448\u043d\u043e\u043c \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0438.\n    \"\"\"\n\n    self.get_modal_window(user_name).edit_user(user_data)\n\n    alert_type = self.alert.get_alert_type()\n    assert alert_type==\"success\", f\"Expected success alert, but got {alert_type} alert\"\n\n    self.alert.check_alert_presence('\\n\u041e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u0443\u0441\u043f\u0435\u0448\u043d\u043e\\n')\n    self.alert.check_alert_absence('\\n\u041e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u0443\u0441\u043f\u0435\u0448\u043d\u043e\\n')\n
    "},{"location":"pages/users_tab/#pages.users_tab.UsersTab.find_user_in_table","title":"find_user_in_table(name, role)","text":"

    \u0418\u0449\u0435\u0442 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435.

    Parameters:

    Name Type Description Default name str

    \u0418\u043c\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.

    required role str

    \u0420\u043e\u043b\u044c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.

    required

    Returns:

    Name Type Description int int

    \u0418\u043d\u0434\u0435\u043a\u0441 \u0441\u0442\u0440\u043e\u043a\u0438 \u0438\u043b\u0438 -1 \u0435\u0441\u043b\u0438 \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d.

    Raises:

    Type Description AssertionError

    \u0415\u0441\u043b\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u043f\u0443\u0441\u0442\u0430.

    Source code in pages\\users_tab.py
    def find_user_in_table(self, name: str, role: str) -> int:\n    \"\"\"\u0418\u0449\u0435\u0442 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435.\n\n    Args:\n        name: \u0418\u043c\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\n        role: \u0420\u043e\u043b\u044c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\n\n    Returns:\n        int: \u0418\u043d\u0434\u0435\u043a\u0441 \u0441\u0442\u0440\u043e\u043a\u0438 \u0438\u043b\u0438 -1 \u0435\u0441\u043b\u0438 \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d.\n\n    Raises:\n        AssertionError: \u0415\u0441\u043b\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u043f\u0443\u0441\u0442\u0430.\n    \"\"\"\n\n    self.page.wait_for_timeout(1000)\n\n    table_content = self.users_table.read(TableLocators.TABLE_WORK_AREA)\n    if len(table_content) == 0:\n        assert False, \"The contents of the table are missing\"\n\n    del table_content[0]  # \u0423\u0434\u0430\u043b\u044f\u0435\u043c \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a\n\n    for row_index, user_info in enumerate(table_content):\n        if name in user_info and role in user_info:\n            return row_index\n    return -1\n
    "},{"location":"pages/users_tab/#pages.users_tab.UsersTab.get_modal_window","title":"get_modal_window(title)","text":"

    \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043a\u043d\u043e \u043f\u043e \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0443.

    Parameters:

    Name Type Description Default title str

    \u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a \u043e\u043a\u043d\u0430.

    required

    Returns:

    Name Type Description ModalWindowComponent ModalWindowComponent

    \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430.

    Raises:

    Type Description AssertionError

    \u0415\u0441\u043b\u0438 \u043e\u043a\u043d\u043e \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u043e.

    Source code in pages\\users_tab.py
    def get_modal_window(self, title: str) -> ModalWindowComponent:\n    \"\"\"\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043a\u043d\u043e \u043f\u043e \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0443.\n\n    Args:\n        title: \u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a \u043e\u043a\u043d\u0430.\n\n    Returns:\n        ModalWindowComponent: \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430.\n\n    Raises:\n        AssertionError: \u0415\u0441\u043b\u0438 \u043e\u043a\u043d\u043e \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u043e.\n    \"\"\"\n\n    modal_window = self.modal_windows.get(title)\n    if modal_window is None:\n        assert False, f\"Modal window with title '{title}' not found\"\n    return modal_window\n
    "},{"location":"pages/users_tab/#pages.users_tab.UsersTab.open_add_user_window","title":"open_add_user_window()","text":"

    \u041e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u043e\u043a\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.

    Raises:

    Type Description AssertionError

    \u0415\u0441\u043b\u0438 \u043a\u043d\u043e\u043f\u043a\u0438 \u043d\u0435\u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b \u0438\u043b\u0438 \u043e\u043a\u043d\u043e \u043d\u0435 \u043e\u0442\u043a\u0440\u044b\u043b\u043e\u0441\u044c.

    Source code in pages\\users_tab.py
    def open_add_user_window(self) -> None:\n    \"\"\"\u041e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u043e\u043a\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\n\n    Raises:\n        AssertionError: \u0415\u0441\u043b\u0438 \u043a\u043d\u043e\u043f\u043a\u0438 \u043d\u0435\u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b \u0438\u043b\u0438 \u043e\u043a\u043d\u043e \u043d\u0435 \u043e\u0442\u043a\u0440\u044b\u043b\u043e\u0441\u044c.\n    \"\"\"\n\n    if self.toolbar.is_button_not_present(\"close\"):\n        self.toolbar.check_button_visibility(\"edit\")\n        self.toolbar.click_button(\"edit\")\n\n    self.toolbar.check_button_visibility(\"add_user\")\n    self.toolbar.click_button(\"add_user\")\n    self.add_modal_window(\"add_local_user\", \"\")\n    self.get_modal_window(\"add_local_user\").check_by_window_title()\n
    "},{"location":"pages/users_tab/#pages.users_tab.UsersTab.open_edit_user_page_by_index","title":"open_edit_user_page_by_index(row_index)","text":"

    \u041e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u043e\u043a\u043d\u043e \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043f\u043e \u0438\u043d\u0434\u0435\u043a\u0441\u0443 \u0441\u0442\u0440\u043e\u043a\u0438.

    Parameters:

    Name Type Description Default row_index int

    \u0418\u043d\u0434\u0435\u043a\u0441 \u0441\u0442\u0440\u043e\u043a\u0438 \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435.

    required

    Returns:

    Name Type Description tuple tuple

    (\u0438\u043c\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f, \u0440\u043e\u043b\u044c).

    Raises:

    Type Description AssertionError

    \u0415\u0441\u043b\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u043f\u0443\u0441\u0442\u0430 \u0438\u043b\u0438 \u0438\u043d\u0434\u0435\u043a\u0441 \u0432\u043d\u0435 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0430.

    Source code in pages\\users_tab.py
    def open_edit_user_page_by_index(self, row_index: int) -> tuple:\n    \"\"\"\u041e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u043e\u043a\u043d\u043e \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043f\u043e \u0438\u043d\u0434\u0435\u043a\u0441\u0443 \u0441\u0442\u0440\u043e\u043a\u0438.\n\n    Args:\n        row_index: \u0418\u043d\u0434\u0435\u043a\u0441 \u0441\u0442\u0440\u043e\u043a\u0438 \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435.\n\n    Returns:\n        tuple: (\u0438\u043c\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f, \u0440\u043e\u043b\u044c).\n\n    Raises:\n        AssertionError: \u0415\u0441\u043b\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u043f\u0443\u0441\u0442\u0430 \u0438\u043b\u0438 \u0438\u043d\u0434\u0435\u043a\u0441 \u0432\u043d\u0435 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0430.\n    \"\"\"\n\n    self.page.wait_for_timeout(2000)\n\n    tmp_dict = {\"admin\": \"\u0410\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440\", \"manager\": \"\u041a\u043e\u043d\u0442\u0430\u043a\u0442\u043d\u043e\u0435 \u043b\u0438\u0446\u043e\", \"operator\": \"\u041e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\"}\n    table_content = self.users_table.read(TableLocators.TABLE_WORK_AREA)\n\n    if len(table_content) == 0:\n        assert False, \"The contents of the table are missing\"\n\n    del table_content[0]  # \u0423\u0434\u0430\u043b\u044f\u0435\u043c \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a\n\n    if row_index >= len(table_content):\n        assert False, \"Row_index is out of range\"\n\n    user_name = table_content[row_index][0]\n    for key, val in tmp_dict.items():\n        if user_name == val:\n            user_name = key\n\n    role = table_content[row_index][2]\n\n    self.page.locator(TableLocators.TABLE_WORK_AREA).locator(\"//tbody/tr\").nth(row_index).click()\n    self.add_modal_window(\"edit_user\", user_name)\n    self.get_modal_window(user_name).check_by_window_title()\n\n    return user_name, role\n
    "},{"location":"pages/users_tab/#pages.users_tab.UsersTab.open_edit_user_page_by_user","title":"open_edit_user_page_by_user(user_name, role)","text":"

    \u041e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u043e\u043a\u043d\u043e \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043f\u043e \u0438\u043c\u0435\u043d\u0438 \u0438 \u0440\u043e\u043b\u0438.

    Parameters:

    Name Type Description Default user_name str

    \u0418\u043c\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.

    required role str

    \u0420\u043e\u043b\u044c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.

    required

    Raises:

    Type Description AssertionError

    \u0415\u0441\u043b\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d.

    Source code in pages\\users_tab.py
    def open_edit_user_page_by_user(self, user_name: str, role: str) -> None:\n    \"\"\"\u041e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u043e\u043a\u043d\u043e \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043f\u043e \u0438\u043c\u0435\u043d\u0438 \u0438 \u0440\u043e\u043b\u0438.\n\n    Args:\n        user_name: \u0418\u043c\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\n        role: \u0420\u043e\u043b\u044c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\n\n    Raises:\n        AssertionError: \u0415\u0441\u043b\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d.\n    \"\"\"\n\n    row_index = self.find_user_in_table(user_name, role)\n    if row_index == -1:\n        assert False, f\"User with name {user_name} and role {role} has not been found\"\n\n    self.page.locator(TableLocators.TABLE_WORK_AREA).locator(\"//tbody/tr\").nth(row_index).click()\n    self.add_modal_window(\"edit_user\", user_name)\n    self.get_modal_window(user_name).check_by_window_title()\n
    "},{"location":"pages/users_tab/#pages.users_tab.UsersTab.reset_password","title":"reset_password(user_name)","text":"

    \u0421\u0431\u0440\u0430\u0441\u044b\u0432\u0430\u0435\u0442 \u043f\u0430\u0440\u043e\u043b\u044c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.

    Parameters:

    Name Type Description Default user_name str

    \u0418\u043c\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.

    required

    Returns:

    Name Type Description str str

    \u041d\u043e\u0432\u044b\u0439 \u043f\u0430\u0440\u043e\u043b\u044c (\u0435\u0441\u043b\u0438 \u043f\u043e\u043b\u0443\u0447\u0435\u043d).

    Source code in pages\\users_tab.py
    def reset_password(self, user_name: str) -> str:\n    \"\"\"\u0421\u0431\u0440\u0430\u0441\u044b\u0432\u0430\u0435\u0442 \u043f\u0430\u0440\u043e\u043b\u044c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\n\n    Args:\n        user_name: \u0418\u043c\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\n\n    Returns:\n        str: \u041d\u043e\u0432\u044b\u0439 \u043f\u0430\u0440\u043e\u043b\u044c (\u0435\u0441\u043b\u0438 \u043f\u043e\u043b\u0443\u0447\u0435\u043d).\n    \"\"\"\n\n    new_password = \"\"\n    self.get_modal_window(user_name).reset_password()\n\n    self.alert.check_alert_presence(\"\")\n    alert_message = self.alert.get_text()\n    if len(alert_message) > 0:\n        new_password = re.findall(r'[\\d]+', alert_message)[0]\n\n    return new_password\n
    "},{"location":"pages/users_tab/#pages.users_tab.UsersTab.should_be_toolbar","title":"should_be_toolbar()","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0442\u0443\u043b\u0431\u0430\u0440\u0430.

    Raises:

    Type Description AssertionError

    \u0415\u0441\u043b\u0438 \u0442\u0443\u043b\u0431\u0430\u0440 \u0438\u043b\u0438 \u043a\u043d\u043e\u043f\u043a\u0430 \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u044e\u0442.

    Source code in pages\\users_tab.py
    def should_be_toolbar(self) -> None:\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0442\u0443\u043b\u0431\u0430\u0440\u0430.\n\n    Raises:\n        AssertionError: \u0415\u0441\u043b\u0438 \u0442\u0443\u043b\u0431\u0430\u0440 \u0438\u043b\u0438 \u043a\u043d\u043e\u043f\u043a\u0430 \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u044e\u0442.\n    \"\"\"\n\n    self.toolbar.check_toolbar_presence(\"Toolbar is missing\")\n    self.toolbar.check_button_visibility(\"edit\")\n
    "},{"location":"pages/users_tab/#pages.users_tab.UsersTab.should_be_toolbar_buttons","title":"should_be_toolbar_buttons()","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u043a\u043d\u043e\u043f\u043e\u043a \u0442\u0443\u043b\u0431\u0430\u0440\u0430.

    Raises:

    Type Description AssertionError

    \u0415\u0441\u043b\u0438 \u043a\u043d\u043e\u043f\u043a\u0438 \u043d\u0435\u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b \u0438\u043b\u0438 \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0438 \u043d\u0435\u0432\u0435\u0440\u043d\u044b.

    Source code in pages\\users_tab.py
    def should_be_toolbar_buttons(self) -> None:\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u043a\u043d\u043e\u043f\u043e\u043a \u0442\u0443\u043b\u0431\u0430\u0440\u0430.\n\n    Raises:\n        AssertionError: \u0415\u0441\u043b\u0438 \u043a\u043d\u043e\u043f\u043a\u0438 \u043d\u0435\u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b \u0438\u043b\u0438 \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0438 \u043d\u0435\u0432\u0435\u0440\u043d\u044b.\n    \"\"\"\n\n    self.toolbar.check_button_visibility(\"edit\")\n    self.toolbar.check_button_tooltip(\"edit\", \"\u0420\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c\")\n\n    self.toolbar.get_button_by_name(\"edit\").click()\n    self.toolbar.check_button_visibility(\"add_user\")\n    self.toolbar.check_button_visibility(\"close\")\n    self.toolbar.check_button_tooltip(\"add_user\", \"\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c\")\n    self.toolbar.check_button_tooltip(\"close\", \"\u0417\u0430\u043a\u0440\u044b\u0442\u044c\")\n\n    self.toolbar.get_button_by_name(\"close\").click()\n    self.toolbar.check_button_visibility(\"edit\")\n
    "},{"location":"pages/users_tab/#pages.users_tab.UsersTab.should_be_user_in_table","title":"should_be_user_in_table(name, role)","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435.

    Parameters:

    Name Type Description Default name str

    \u0418\u043c\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.

    required role str

    \u0420\u043e\u043b\u044c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.

    required

    Raises:

    Type Description AssertionError

    \u0415\u0441\u043b\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d.

    Source code in pages\\users_tab.py
    def should_be_user_in_table(self, name: str, role: str) -> None:\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435.\n\n    Args:\n        name: \u0418\u043c\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\n        role: \u0420\u043e\u043b\u044c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\n\n    Raises:\n        AssertionError: \u0415\u0441\u043b\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d.\n    \"\"\"\n\n    found = self.find_user_in_table(name, role)\n    if found == -1:\n        assert False, f\"User with name {name} and role {role} has not been found\"\n
    "},{"location":"pages/users_tab/#pages.users_tab.UsersTab.should_be_users_table","title":"should_be_users_table()","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439.

    Raises:

    Type Description AssertionError

    \u0415\u0441\u043b\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442.

    Source code in pages\\users_tab.py
    def should_be_users_table(self) -> None:\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439.\n\n    Raises:\n        AssertionError: \u0415\u0441\u043b\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442.\n    \"\"\"\n\n    self.users_table.check_visibility(\n        TableLocators.TABLE_WORK_AREA,\n        \"Users table is missing\"\n    )\n
    "},{"location":"pages/users_tab/#pages.users_tab.UsersTab.should_not_be_user_in_table","title":"should_not_be_user_in_table(name, role)","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435.

    Parameters:

    Name Type Description Default name str

    \u0418\u043c\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.

    required role str

    \u0420\u043e\u043b\u044c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.

    required

    Raises:

    Type Description AssertionError

    \u0415\u0441\u043b\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u043d\u0430\u0439\u0434\u0435\u043d.

    Source code in pages\\users_tab.py
    def should_not_be_user_in_table(self, name: str, role: str) -> None:\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435.\n\n    Args:\n        name: \u0418\u043c\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\n        role: \u0420\u043e\u043b\u044c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\n\n    Raises:\n        AssertionError: \u0415\u0441\u043b\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u043d\u0430\u0439\u0434\u0435\u043d.\n    \"\"\"\n\n    found = self.find_user_in_table(name, role)\n    if found != -1:\n        assert False, f\"User with name {name} and role {role} has been found\"\n
    "},{"location":"pages/users_tab/#pages.users_tab.UsersTab.transform_to_add_AD_user_window","title":"transform_to_add_AD_user_window()","text":"

    \u0422\u0440\u0430\u043d\u0441\u0444\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u0442 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043a\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0432 \u043e\u043a\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f Active Directory \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043d\u0430\u0436\u0430\u0442\u0438\u044f \u0447\u0435\u043a-\u0431\u043e\u043a\u0441\u0430 Active Directory.

    Source code in pages\\users_tab.py
    def transform_to_add_AD_user_window(self):\n    \"\"\"\u0422\u0440\u0430\u043d\u0441\u0444\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u0442 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043a\u043d\u043e  \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\n       \u0432 \u043e\u043a\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f Active Directory \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043d\u0430\u0436\u0430\u0442\u0438\u044f\n       \u0447\u0435\u043a-\u0431\u043e\u043a\u0441\u0430 Active Directory.\n    \"\"\"\n\n    self.get_modal_window(\"add_local_user\").check_active_directory_checkbox()\n    modal_window = self.modal_windows.get(\"add_AD_user\")\n    if modal_window is None:\n        self.add_modal_window(\"add_AD_user\", \"\")\n
    "},{"location":"pages/users_tab/#pages.users_tab.UsersTab.transform_to_add_user_window","title":"transform_to_add_user_window()","text":"

    \u0422\u0440\u0430\u043d\u0441\u0444\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u0442 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043a\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f Active Directory \u0432 \u043e\u043a\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0441\u043d\u044f\u0442\u0438\u044f \u043e\u0442\u043c\u0435\u0442\u043a\u0438 \u0441 \u0447\u0435\u043a-\u0431\u043e\u043a\u0441\u0430 Active Directory.

    Source code in pages\\users_tab.py
    def transform_to_add_user_window(self):\n    \"\"\"\u0422\u0440\u0430\u043d\u0441\u0444\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u0442 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043a\u043d\u043e  \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f Active Directory\n       \u0432 \u043e\u043a\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0441\u043d\u044f\u0442\u0438\u044f \u043e\u0442\u043c\u0435\u0442\u043a\u0438 \u0441\n       \u0447\u0435\u043a-\u0431\u043e\u043a\u0441\u0430 Active Directory.\n    \"\"\"\n\n    self.get_modal_window(\"add_AD_user\").uncheck_active_directory_checkbox()\n    modal_window = self.modal_windows.get(\"add_local_user\")\n    if modal_window is None:\n        self.add_modal_window(\"add_local_user\", \"\")\n
    "},{"location":"pages/users_tab/#pages.users_tab.UsersTab.verify_users_table_content","title":"verify_users_table_content(users_table)","text":"

    \u0421\u0432\u0435\u0440\u044f\u0435\u0442 \u0434\u0430\u043d\u043d\u044b\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0441 \u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u0438\u0437 \u0411\u0414.

    Parameters:

    Name Type Description Default users_table list

    \u0414\u0430\u043d\u043d\u044b\u0435 \u0438\u0437 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u043d\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435.

    required

    Raises:

    Type Description AssertionError

    \u0415\u0441\u043b\u0438 \u0434\u0430\u043d\u043d\u044b\u0435 \u043d\u0435 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0442.

    Source code in pages\\users_tab.py
    def verify_users_table_content(self, users_table: list) -> None:\n    \"\"\"\u0421\u0432\u0435\u0440\u044f\u0435\u0442 \u0434\u0430\u043d\u043d\u044b\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0441 \u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u0438\u0437 \u0411\u0414.\n\n    Args:\n        users_table: \u0414\u0430\u043d\u043d\u044b\u0435 \u0438\u0437 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u043d\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435.\n\n    Raises:\n        AssertionError: \u0415\u0441\u043b\u0438 \u0434\u0430\u043d\u043d\u044b\u0435 \u043d\u0435 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0442.\n    \"\"\"\n\n    expected_users_list = []\n    tmp_dict = {\"admin\": \"\u0410\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440\", \"manager\": \"\u041a\u043e\u043d\u0442\u0430\u043a\u0442\u043d\u043e\u0435 \u043b\u0438\u0446\u043e\", \"operator\": \"\u041e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\"}\n\n    query = {\n        \"id\": [\"/catalogs/user\"],\n        \"data\": {\n            \"namePath\": True,\n            \"children\": {\"flatten\": True}\n        }\n    }\n\n    response = self.send_post_api_request(\"e-cmdb/api/query\", query)\n    response_body = self.get_response_body(response)\n\n    for item in response_body[0][\"children\"]:\n        user_info = []\n        user_name = item[\"name\"]\n\n        if user_name in tmp_dict.keys():\n            item[\"name\"] = tmp_dict[user_name]\n        user_info.append(item[\"name\"])\n\n        if item[\"type_auth\"] is not None:\n            user_info.append(item[\"type_auth\"])\n        else:\n            user_info.append(\"\")\n\n        if item[\"role\"] is not None:\n            role = item[\"role\"]\n            if role in roles_dict.keys():\n                item[\"role\"] = roles_dict[role]\n            user_info.append(item[\"role\"])\n        else:\n            user_info.append(\"\")\n\n        if item[\"email\"] is not None:\n            user_info.append(item[\"email\"])\n        else:\n            user_info.append(\"\")\n\n        if item[\"sms_phone\"] is not None:\n            user_info.append(item[\"sms_phone\"])\n        else:\n            user_info.append(\"\")\n\n        expected_users_list.append(user_info)\n\n    del users_table[0]  # \u0423\u0434\u0430\u043b\u044f\u0435\u043c \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a\n\n    self.check_lists_equals(\n        users_table,\n        expected_users_list,\n        \"Actual users list is not equal expected users list on base db\"\n    )\n
    "},{"location":"tests/components/test_json_container/","title":"TestJsonContainer","text":"

    \u041c\u043e\u0434\u0443\u043b\u044c \u0442\u0435\u0441\u0442\u043e\u0432 \u0434\u043b\u044f \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430 \u0441 JSON-\u0434\u0430\u043d\u043d\u044b\u043c\u0438.

    \u0421\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0442\u0435\u0441\u0442\u044b \u0434\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430 \u0441 JSON-\u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u043d\u0430 \u0432\u043a\u043b\u0430\u0434\u043a\u0435 \u043b\u0438\u0446\u0435\u043d\u0437\u0438\u0439.

    "},{"location":"tests/components/test_json_container/#tests.components.test_json_container.TestJsonContainer","title":"TestJsonContainer","text":"

    \u0422\u0435\u0441\u0442\u044b \u0434\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430 \u0441 JSON-\u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u043d\u0430 \u0432\u043a\u043b\u0430\u0434\u043a\u0435 \u043b\u0438\u0446\u0435\u043d\u0437\u0438\u0439.

    Source code in tests\\components\\test_json_container.py
    class TestJsonContainer:\n    \"\"\"\u0422\u0435\u0441\u0442\u044b \u0434\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430 \u0441 JSON-\u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u043d\u0430 \u0432\u043a\u043b\u0430\u0434\u043a\u0435 \u043b\u0438\u0446\u0435\u043d\u0437\u0438\u0439.\"\"\"\n\n    @pytest.fixture(scope=\"function\", autouse=True)\n    def setup(self, browser: Page) -> None:\n        \"\"\"\u041d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u0442 \u0442\u0435\u0441\u0442\u043e\u0432\u043e\u0435 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0435 \u043f\u0435\u0440\u0435\u0434 \u043a\u0430\u0436\u0434\u044b\u043c \u0442\u0435\u0441\u0442\u043e\u043c.\n\n        Args:\n            browser: \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.\n        \"\"\"\n\n        lp = LoginPage(browser)\n        lp.do_login()\n\n        mp = MainPage(browser)\n        mp.should_be_navigation_panel()\n        mp.click_main_navigation_panel_item(\"\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438\")\n        mp.click_subpanel_item(\"\u041b\u0438\u0446\u0435\u043d\u0437\u0438\u0438\")\n\n    def test_verticall_scrolling(self, browser: Page) -> None:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u0443\u044e \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0443 \u0432 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0435 \u0441 JSON-\u0434\u0430\u043d\u043d\u044b\u043c\u0438.\n\n        Args:\n            browser: \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.\n\n        Steps:\n            1. \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u0439 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0438\n            2. \u041f\u0440\u043e\u043a\u0440\u0443\u0447\u0438\u0432\u0430\u0435\u0442 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440 \u0432\u043d\u0438\u0437\n            3. \u041f\u0440\u043e\u043a\u0440\u0443\u0447\u0438\u0432\u0430\u0435\u0442 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440 \u0432\u0432\u0435\u0440\u0445\n        \"\"\"\n\n        lt = LicenseTab(browser)\n\n        is_scrollable = lt.check_json_container_verticall_scrolling()\n        assert is_scrollable, \"Should be verticall scrolling\"\n\n        lt.scroll_json_container_down()\n        lt.wait_for_timeout(3000)\n\n        lt.scroll_json_container_up()\n        lt.wait_for_timeout(2000)\n
    "},{"location":"tests/components/test_json_container/#tests.components.test_json_container.TestJsonContainer.setup","title":"setup(browser)","text":"

    \u041d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u0442 \u0442\u0435\u0441\u0442\u043e\u0432\u043e\u0435 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0435 \u043f\u0435\u0440\u0435\u0434 \u043a\u0430\u0436\u0434\u044b\u043c \u0442\u0435\u0441\u0442\u043e\u043c.

    Parameters:

    Name Type Description Default browser Page

    \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.

    required Source code in tests\\components\\test_json_container.py
    @pytest.fixture(scope=\"function\", autouse=True)\ndef setup(self, browser: Page) -> None:\n    \"\"\"\u041d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u0442 \u0442\u0435\u0441\u0442\u043e\u0432\u043e\u0435 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0435 \u043f\u0435\u0440\u0435\u0434 \u043a\u0430\u0436\u0434\u044b\u043c \u0442\u0435\u0441\u0442\u043e\u043c.\n\n    Args:\n        browser: \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.\n    \"\"\"\n\n    lp = LoginPage(browser)\n    lp.do_login()\n\n    mp = MainPage(browser)\n    mp.should_be_navigation_panel()\n    mp.click_main_navigation_panel_item(\"\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438\")\n    mp.click_subpanel_item(\"\u041b\u0438\u0446\u0435\u043d\u0437\u0438\u0438\")\n
    "},{"location":"tests/components/test_json_container/#tests.components.test_json_container.TestJsonContainer.test_verticall_scrolling","title":"test_verticall_scrolling(browser)","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u0443\u044e \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0443 \u0432 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0435 \u0441 JSON-\u0434\u0430\u043d\u043d\u044b\u043c\u0438.

    Parameters:

    Name Type Description Default browser Page

    \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.

    required Steps
    1. \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u0439 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0438
    2. \u041f\u0440\u043e\u043a\u0440\u0443\u0447\u0438\u0432\u0430\u0435\u0442 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440 \u0432\u043d\u0438\u0437
    3. \u041f\u0440\u043e\u043a\u0440\u0443\u0447\u0438\u0432\u0430\u0435\u0442 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440 \u0432\u0432\u0435\u0440\u0445
    Source code in tests\\components\\test_json_container.py
    def test_verticall_scrolling(self, browser: Page) -> None:\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u0443\u044e \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0443 \u0432 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0435 \u0441 JSON-\u0434\u0430\u043d\u043d\u044b\u043c\u0438.\n\n    Args:\n        browser: \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.\n\n    Steps:\n        1. \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u0439 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0438\n        2. \u041f\u0440\u043e\u043a\u0440\u0443\u0447\u0438\u0432\u0430\u0435\u0442 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440 \u0432\u043d\u0438\u0437\n        3. \u041f\u0440\u043e\u043a\u0440\u0443\u0447\u0438\u0432\u0430\u0435\u0442 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440 \u0432\u0432\u0435\u0440\u0445\n    \"\"\"\n\n    lt = LicenseTab(browser)\n\n    is_scrollable = lt.check_json_container_verticall_scrolling()\n    assert is_scrollable, \"Should be verticall scrolling\"\n\n    lt.scroll_json_container_down()\n    lt.wait_for_timeout(3000)\n\n    lt.scroll_json_container_up()\n    lt.wait_for_timeout(2000)\n
    "},{"location":"tests/components/test_navigation_panel/","title":"TestNavigationPanel","text":"

    \u041c\u043e\u0434\u0443\u043b\u044c \u0442\u0435\u0441\u0442\u043e\u0432 \u043f\u0430\u043d\u0435\u043b\u0438 \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438.

    \u0421\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0442\u0435\u0441\u0442\u044b \u0434\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u0438 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0438 \u043f\u0430\u043d\u0435\u043b\u0438 \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438 \u0432 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0438.

    "},{"location":"tests/components/test_navigation_panel/#tests.components.test_navigation_panel.TestNavigationPanel","title":"TestNavigationPanel","text":"

    \u041a\u043b\u0430\u0441\u0441 \u0442\u0435\u0441\u0442\u043e\u0432 \u0434\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u043f\u0430\u043d\u0435\u043b\u0438 \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438.

    \u0410\u0442\u0440\u0438\u0431\u0443\u0442\u044b

    browser: \u0424\u0438\u043a\u0441\u0442\u0443\u0440\u0430 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u043e\u043c.

    Source code in tests\\components\\test_navigation_panel.py
    class TestNavigationPanel:\n    \"\"\"\u041a\u043b\u0430\u0441\u0441 \u0442\u0435\u0441\u0442\u043e\u0432 \u0434\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u043f\u0430\u043d\u0435\u043b\u0438 \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438.\n\n    \u0410\u0442\u0440\u0438\u0431\u0443\u0442\u044b:\n        browser: \u0424\u0438\u043a\u0441\u0442\u0443\u0440\u0430 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u043e\u043c.\n    \"\"\"\n\n    def test_verticall_scrolling(self, browser: Page):\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u0443\u044e \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0443 \u043f\u0430\u043d\u0435\u043b\u0438 \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438.\n\n        Args:\n            browser: \u0424\u0438\u043a\u0441\u0442\u0443\u0440\u0430 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u043e\u043c.\n\n        Raises:\n            AssertionError: \u0415\u0441\u043b\u0438 \u043f\u0430\u043d\u0435\u043b\u044c \u043d\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0443.\n        \"\"\"\n\n        # \u0414\u0435\u0439\u0441\u0442\u0432\u0438\u044f:\n        lp = LoginPage(browser)\n        lp.do_login()\n\n        # \u041c\u044b \u043d\u0430 \u0433\u043b\u0430\u0432\u043d\u043e\u0439 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435\n        mp = MainPage(browser)\n\n        # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0438:\n        # \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u043f\u0430\u043d\u0435\u043b\u0438 \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438\n        mp.should_be_navigation_panel()\n\n        # \u041e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u043c \u0432\u0441\u0435 \u043f\u0443\u043d\u043a\u0442\u044b \u043f\u0430\u043d\u0435\u043b\u0438\n        mp.click_main_navigation_panel_item(\"\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438\")\n        mp.expand_navigation_subpanel()\n\n        mp.click_main_navigation_panel_item(\"\u041e\u0431\u044a\u0435\u043a\u0442\u044b\")\n        mp.wait_for_timeout(300)\n        mp.expand_navigation_subpanel()\n\n        # \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u0439 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0438\n        is_scrollable = mp.check_navigation_panel_verticall_scrolling()\n        assert is_scrollable, \"Should be vertical scrolling\"\n\n        # \u0414\u0435\u0439\u0441\u0442\u0432\u0438\u044f:\n        # \u041f\u0440\u043e\u043a\u0440\u0443\u0447\u0438\u0432\u0430\u0435\u043c \u0432\u0432\u0435\u0440\u0445 \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\n        mp.scroll_navigation_panel_up()\n        mp.check_navigation_panel_item_visibility(\"\u041f\u0430\u043d\u0435\u043b\u044c \u043f\u0440\u0438\u0431\u043e\u0440\u043e\u0432\")\n        mp.wait_for_timeout(3000)\n\n        # \u041f\u0440\u043e\u043a\u0440\u0443\u0447\u0438\u0432\u0430\u0435\u043c \u0432\u043d\u0438\u0437 \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438/ZTP/\u0428\u0430\u0431\u043b\u043e\u043d\u044b\n        mp.scroll_navigation_panel_down()\n        mp.check_navigation_panel_item_visibility(\"\u0428\u0430\u0431\u043b\u043e\u043d\u044b_2\")\n        mp.wait_for_timeout(2000)\n
    "},{"location":"tests/components/test_navigation_panel/#tests.components.test_navigation_panel.TestNavigationPanel.test_verticall_scrolling","title":"test_verticall_scrolling(browser)","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u0443\u044e \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0443 \u043f\u0430\u043d\u0435\u043b\u0438 \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438.

    Parameters:

    Name Type Description Default browser Page

    \u0424\u0438\u043a\u0441\u0442\u0443\u0440\u0430 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u043e\u043c.

    required

    Raises:

    Type Description AssertionError

    \u0415\u0441\u043b\u0438 \u043f\u0430\u043d\u0435\u043b\u044c \u043d\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0443.

    Source code in tests\\components\\test_navigation_panel.py
    def test_verticall_scrolling(self, browser: Page):\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u0443\u044e \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0443 \u043f\u0430\u043d\u0435\u043b\u0438 \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438.\n\n    Args:\n        browser: \u0424\u0438\u043a\u0441\u0442\u0443\u0440\u0430 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u043e\u043c.\n\n    Raises:\n        AssertionError: \u0415\u0441\u043b\u0438 \u043f\u0430\u043d\u0435\u043b\u044c \u043d\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0443.\n    \"\"\"\n\n    # \u0414\u0435\u0439\u0441\u0442\u0432\u0438\u044f:\n    lp = LoginPage(browser)\n    lp.do_login()\n\n    # \u041c\u044b \u043d\u0430 \u0433\u043b\u0430\u0432\u043d\u043e\u0439 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435\n    mp = MainPage(browser)\n\n    # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0438:\n    # \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u043f\u0430\u043d\u0435\u043b\u0438 \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438\n    mp.should_be_navigation_panel()\n\n    # \u041e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u043c \u0432\u0441\u0435 \u043f\u0443\u043d\u043a\u0442\u044b \u043f\u0430\u043d\u0435\u043b\u0438\n    mp.click_main_navigation_panel_item(\"\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438\")\n    mp.expand_navigation_subpanel()\n\n    mp.click_main_navigation_panel_item(\"\u041e\u0431\u044a\u0435\u043a\u0442\u044b\")\n    mp.wait_for_timeout(300)\n    mp.expand_navigation_subpanel()\n\n    # \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u0439 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0438\n    is_scrollable = mp.check_navigation_panel_verticall_scrolling()\n    assert is_scrollable, \"Should be vertical scrolling\"\n\n    # \u0414\u0435\u0439\u0441\u0442\u0432\u0438\u044f:\n    # \u041f\u0440\u043e\u043a\u0440\u0443\u0447\u0438\u0432\u0430\u0435\u043c \u0432\u0432\u0435\u0440\u0445 \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\n    mp.scroll_navigation_panel_up()\n    mp.check_navigation_panel_item_visibility(\"\u041f\u0430\u043d\u0435\u043b\u044c \u043f\u0440\u0438\u0431\u043e\u0440\u043e\u0432\")\n    mp.wait_for_timeout(3000)\n\n    # \u041f\u0440\u043e\u043a\u0440\u0443\u0447\u0438\u0432\u0430\u0435\u043c \u0432\u043d\u0438\u0437 \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438/ZTP/\u0428\u0430\u0431\u043b\u043e\u043d\u044b\n    mp.scroll_navigation_panel_down()\n    mp.check_navigation_panel_item_visibility(\"\u0428\u0430\u0431\u043b\u043e\u043d\u044b_2\")\n    mp.wait_for_timeout(2000)\n
    "},{"location":"tests/components/test_services_table/","title":"TestServiceStatusTable","text":"

    \u041c\u043e\u0434\u0443\u043b\u044c \u0442\u0435\u0441\u0442\u043e\u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0441\u0442\u0430\u0442\u0443\u0441\u043e\u0432 \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432.

    \u0421\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0442\u0435\u0441\u0442\u044b \u0434\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u0438 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0441\u0442\u0430\u0442\u0443\u0441\u043e\u0432 \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432 \u043d\u0430 \u0432\u043a\u043b\u0430\u0434\u043a\u0435 \u043e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u043d\u0438\u044f.

    "},{"location":"tests/components/test_services_table/#tests.components.test_services_table.TestServiceStatusTable","title":"TestServiceStatusTable","text":"

    \u041a\u043b\u0430\u0441\u0441 \u0442\u0435\u0441\u0442\u043e\u0432 \u0434\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0441\u0442\u0430\u0442\u0443\u0441\u043e\u0432 \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432.

    Source code in tests\\components\\test_services_table.py
    class TestServiceStatusTable:\n    \"\"\"\u041a\u043b\u0430\u0441\u0441 \u0442\u0435\u0441\u0442\u043e\u0432 \u0434\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0441\u0442\u0430\u0442\u0443\u0441\u043e\u0432 \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432.\"\"\"\n\n    @pytest.fixture(scope=\"function\", autouse=True)\n    def setup(self, browser: Page) -> None:\n        \"\"\"\u041d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u0442 \u0442\u0435\u0441\u0442\u043e\u0432\u043e\u0435 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0435 \u043f\u0435\u0440\u0435\u0434 \u043a\u0430\u0436\u0434\u044b\u043c \u0442\u0435\u0441\u0442\u043e\u043c.\n\n        Args:\n            browser: \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.\n        \"\"\"\n\n        lp = LoginPage(browser)\n        lp.do_login()\n\n        mp = MainPage(browser)\n        mp.should_be_navigation_panel()\n        mp.click_main_navigation_panel_item(\"\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438\")\n        mp.click_subpanel_item(\"\u041e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u043d\u0438\u0435 \u0438 \u0434\u0438\u0430\u0433\u043d\u043e\u0441\u0442\u0438\u043a\u0430\")\n        mp.click_subpanel_item(\"\u0421\u0442\u0430\u0442\u0443\u0441 \u043e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u043d\u0438\u044f\")\n\n    def test_scrolling(self, browser: Page) -> None:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0443 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0441\u0442\u0430\u0442\u0443\u0441\u043e\u0432 \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432.\n\n        Args:\n            browser: \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.\n\n        Steps:\n            1. \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0438 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u044b\n            2. \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u0439 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0438\n            3. \u041f\u0440\u043e\u043a\u0440\u0443\u0447\u0438\u0432\u0430\u0435\u0442 \u0432\u043d\u0438\u0437 \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0439 \u0441\u0442\u0440\u043e\u043a\u0438\n            4. \u041f\u0440\u043e\u043a\u0440\u0443\u0447\u0438\u0432\u0430\u0435\u0442 \u0432\u0432\u0435\u0440\u0445 \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u043f\u0435\u0440\u0432\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438\n        \"\"\"\n\n        sst = ServiceStatusTab(browser)\n\n        sst.should_be_services_table()\n        sst.check_services_table_content()\n\n        is_scrollable_vertically = sst.check_services_table_verticall_scrolling()\n        assert is_scrollable_vertically, \"Should be vertical scrolling\"\n\n        sst.scroll_services_table_down()\n        sst.check_services_table_last_row_visibility()\n        sst.wait_for_timeout(3000)\n\n        sst.scroll_services_table_up()\n        sst.check_services_table_first_row_visibility()\n        sst.wait_for_timeout(2000)\n
    "},{"location":"tests/components/test_services_table/#tests.components.test_services_table.TestServiceStatusTable.setup","title":"setup(browser)","text":"

    \u041d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u0442 \u0442\u0435\u0441\u0442\u043e\u0432\u043e\u0435 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0435 \u043f\u0435\u0440\u0435\u0434 \u043a\u0430\u0436\u0434\u044b\u043c \u0442\u0435\u0441\u0442\u043e\u043c.

    Parameters:

    Name Type Description Default browser Page

    \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.

    required Source code in tests\\components\\test_services_table.py
    @pytest.fixture(scope=\"function\", autouse=True)\ndef setup(self, browser: Page) -> None:\n    \"\"\"\u041d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u0442 \u0442\u0435\u0441\u0442\u043e\u0432\u043e\u0435 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0435 \u043f\u0435\u0440\u0435\u0434 \u043a\u0430\u0436\u0434\u044b\u043c \u0442\u0435\u0441\u0442\u043e\u043c.\n\n    Args:\n        browser: \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.\n    \"\"\"\n\n    lp = LoginPage(browser)\n    lp.do_login()\n\n    mp = MainPage(browser)\n    mp.should_be_navigation_panel()\n    mp.click_main_navigation_panel_item(\"\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438\")\n    mp.click_subpanel_item(\"\u041e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u043d\u0438\u0435 \u0438 \u0434\u0438\u0430\u0433\u043d\u043e\u0441\u0442\u0438\u043a\u0430\")\n    mp.click_subpanel_item(\"\u0421\u0442\u0430\u0442\u0443\u0441 \u043e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u043d\u0438\u044f\")\n
    "},{"location":"tests/components/test_services_table/#tests.components.test_services_table.TestServiceStatusTable.test_scrolling","title":"test_scrolling(browser)","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0443 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0441\u0442\u0430\u0442\u0443\u0441\u043e\u0432 \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432.

    Parameters:

    Name Type Description Default browser Page

    \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.

    required Steps
    1. \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0438 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u044b
    2. \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u0439 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0438
    3. \u041f\u0440\u043e\u043a\u0440\u0443\u0447\u0438\u0432\u0430\u0435\u0442 \u0432\u043d\u0438\u0437 \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0439 \u0441\u0442\u0440\u043e\u043a\u0438
    4. \u041f\u0440\u043e\u043a\u0440\u0443\u0447\u0438\u0432\u0430\u0435\u0442 \u0432\u0432\u0435\u0440\u0445 \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u043f\u0435\u0440\u0432\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438
    Source code in tests\\components\\test_services_table.py
    def test_scrolling(self, browser: Page) -> None:\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0443 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0441\u0442\u0430\u0442\u0443\u0441\u043e\u0432 \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432.\n\n    Args:\n        browser: \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.\n\n    Steps:\n        1. \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0438 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u044b\n        2. \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u0439 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0438\n        3. \u041f\u0440\u043e\u043a\u0440\u0443\u0447\u0438\u0432\u0430\u0435\u0442 \u0432\u043d\u0438\u0437 \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0439 \u0441\u0442\u0440\u043e\u043a\u0438\n        4. \u041f\u0440\u043e\u043a\u0440\u0443\u0447\u0438\u0432\u0430\u0435\u0442 \u0432\u0432\u0435\u0440\u0445 \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u043f\u0435\u0440\u0432\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438\n    \"\"\"\n\n    sst = ServiceStatusTab(browser)\n\n    sst.should_be_services_table()\n    sst.check_services_table_content()\n\n    is_scrollable_vertically = sst.check_services_table_verticall_scrolling()\n    assert is_scrollable_vertically, \"Should be vertical scrolling\"\n\n    sst.scroll_services_table_down()\n    sst.check_services_table_last_row_visibility()\n    sst.wait_for_timeout(3000)\n\n    sst.scroll_services_table_up()\n    sst.check_services_table_first_row_visibility()\n    sst.wait_for_timeout(2000)\n
    "},{"location":"tests/components/test_user_modal_window/","title":"TestUsersModalWindow","text":"

    \u041c\u043e\u0434\u0443\u043b\u044c \u0442\u0435\u0441\u0442\u043e\u0432 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u044b\u0445 \u043e\u043a\u043e\u043d \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439.

    \u0421\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0442\u0435\u0441\u0442\u044b \u0434\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u0438 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0438 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u044b\u0445 \u043e\u043a\u043e\u043d \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\u043c\u0438.

    "},{"location":"tests/components/test_user_modal_window/#tests.components.test_user_modal_window.TestUsersModalWindow","title":"TestUsersModalWindow","text":"

    \u041a\u043b\u0430\u0441\u0441 \u0442\u0435\u0441\u0442\u043e\u0432 \u0434\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u044b\u0445 \u043e\u043a\u043e\u043d \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439.

    Source code in tests\\components\\test_user_modal_window.py
    class TestUsersModalWindow:\n    \"\"\"\u041a\u043b\u0430\u0441\u0441 \u0442\u0435\u0441\u0442\u043e\u0432 \u0434\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u044b\u0445 \u043e\u043a\u043e\u043d \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439.\"\"\"\n\n    @pytest.fixture(scope=\"function\", autouse=True)\n    def setup(self, browser: Page) -> None:\n        \"\"\"\u041d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u0442 \u0442\u0435\u0441\u0442\u043e\u0432\u043e\u0435 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0435 \u043f\u0435\u0440\u0435\u0434 \u043a\u0430\u0436\u0434\u044b\u043c \u0442\u0435\u0441\u0442\u043e\u043c.\n\n        Args:\n            browser: \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.\n        \"\"\"\n\n        lp = LoginPage(browser)\n        lp.do_login()\n\n        mp = MainPage(browser)\n        mp.should_be_navigation_panel()\n        mp.click_main_navigation_panel_item(\"\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438\")\n        mp.click_subpanel_item(\"\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438\")\n\n    @pytest.mark.develop\n    def test_edit_user_window_scrolling(self, browser: Page) -> None:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0443 \u043e\u043a\u043d\u0430 \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\n\n        Args:\n            browser: \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.\n\n        Steps:\n            1. \u041e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u043e\u043a\u043d\u043e \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f\n            2. \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u0443\u044e \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0443\n            3. \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0433\u043e\u0440\u0438\u0437\u043e\u043d\u0442\u0430\u043b\u044c\u043d\u0443\u044e \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0443\n        \"\"\"\n\n        ut = UsersTab(browser)\n        user_name, role = ut.open_edit_user_page_by_index(0)\n        modal_window = ut.get_modal_window(user_name)\n\n        is_scrollable_vertically = modal_window.check_window_vertical_scrolling()\n        assert is_scrollable_vertically, \"Should be vertical scrolling\"\n\n        modal_window.scroll_window_down()\n        modal_window.check_button_visibility(\"close\")\n        ut.wait_for_timeout(3000)\n\n        modal_window.scroll_window_up()\n        modal_window.check_toolbar_button_visibility(\"close\")\n        ut.wait_for_timeout(3000)\n\n        is_scrollable_horizontally = modal_window.check_window_horizontal_scrolling()\n        assert is_scrollable_horizontally, \"Should be horizontal scrolling\"\n\n        modal_window.scroll_window_right()\n        ut.wait_for_timeout(3000)\n        modal_window.scroll_window_left()\n        ut.wait_for_timeout(2000)\n\n    def test_add_user_window_scrolling(self, browser: Page) -> None:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0443 \u043e\u043a\u043d\u0430 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\n\n        Args:\n            browser: \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.\n\n        Steps:\n            1. \u041e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u043e\u043a\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f\n            2. \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u0443\u044e \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0443\n        \"\"\"\n\n        ut = UsersTab(browser)\n        ut.open_add_user_window()\n        modal_window = ut.get_modal_window(\"add_local_user\")\n\n        is_scrollable_vertically = modal_window.check_window_vertical_scrolling()\n        assert is_scrollable_vertically, \"Should be vertical scrolling\"\n\n        modal_window.scroll_window_down()\n        modal_window.check_button_visibility(\"close\")\n        ut.wait_for_timeout(3000)\n\n        modal_window.scroll_window_up()\n        modal_window.check_toolbar_button_visibility(\"close\")\n        ut.wait_for_timeout(3000)\n
    "},{"location":"tests/components/test_user_modal_window/#tests.components.test_user_modal_window.TestUsersModalWindow.setup","title":"setup(browser)","text":"

    \u041d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u0442 \u0442\u0435\u0441\u0442\u043e\u0432\u043e\u0435 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0435 \u043f\u0435\u0440\u0435\u0434 \u043a\u0430\u0436\u0434\u044b\u043c \u0442\u0435\u0441\u0442\u043e\u043c.

    Parameters:

    Name Type Description Default browser Page

    \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.

    required Source code in tests\\components\\test_user_modal_window.py
    @pytest.fixture(scope=\"function\", autouse=True)\ndef setup(self, browser: Page) -> None:\n    \"\"\"\u041d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u0442 \u0442\u0435\u0441\u0442\u043e\u0432\u043e\u0435 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0435 \u043f\u0435\u0440\u0435\u0434 \u043a\u0430\u0436\u0434\u044b\u043c \u0442\u0435\u0441\u0442\u043e\u043c.\n\n    Args:\n        browser: \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.\n    \"\"\"\n\n    lp = LoginPage(browser)\n    lp.do_login()\n\n    mp = MainPage(browser)\n    mp.should_be_navigation_panel()\n    mp.click_main_navigation_panel_item(\"\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438\")\n    mp.click_subpanel_item(\"\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438\")\n
    "},{"location":"tests/components/test_user_modal_window/#tests.components.test_user_modal_window.TestUsersModalWindow.test_add_user_window_scrolling","title":"test_add_user_window_scrolling(browser)","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0443 \u043e\u043a\u043d\u0430 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.

    Parameters:

    Name Type Description Default browser Page

    \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.

    required Steps
    1. \u041e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u043e\u043a\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f
    2. \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u0443\u044e \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0443
    Source code in tests\\components\\test_user_modal_window.py
    def test_add_user_window_scrolling(self, browser: Page) -> None:\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0443 \u043e\u043a\u043d\u0430 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\n\n    Args:\n        browser: \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.\n\n    Steps:\n        1. \u041e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u043e\u043a\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f\n        2. \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u0443\u044e \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0443\n    \"\"\"\n\n    ut = UsersTab(browser)\n    ut.open_add_user_window()\n    modal_window = ut.get_modal_window(\"add_local_user\")\n\n    is_scrollable_vertically = modal_window.check_window_vertical_scrolling()\n    assert is_scrollable_vertically, \"Should be vertical scrolling\"\n\n    modal_window.scroll_window_down()\n    modal_window.check_button_visibility(\"close\")\n    ut.wait_for_timeout(3000)\n\n    modal_window.scroll_window_up()\n    modal_window.check_toolbar_button_visibility(\"close\")\n    ut.wait_for_timeout(3000)\n
    "},{"location":"tests/components/test_user_modal_window/#tests.components.test_user_modal_window.TestUsersModalWindow.test_edit_user_window_scrolling","title":"test_edit_user_window_scrolling(browser)","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0443 \u043e\u043a\u043d\u0430 \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.

    Parameters:

    Name Type Description Default browser Page

    \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.

    required Steps
    1. \u041e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u043e\u043a\u043d\u043e \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f
    2. \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u0443\u044e \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0443
    3. \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0433\u043e\u0440\u0438\u0437\u043e\u043d\u0442\u0430\u043b\u044c\u043d\u0443\u044e \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0443
    Source code in tests\\components\\test_user_modal_window.py
    @pytest.mark.develop\ndef test_edit_user_window_scrolling(self, browser: Page) -> None:\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0443 \u043e\u043a\u043d\u0430 \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\n\n    Args:\n        browser: \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.\n\n    Steps:\n        1. \u041e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u043e\u043a\u043d\u043e \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f\n        2. \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u0443\u044e \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0443\n        3. \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0433\u043e\u0440\u0438\u0437\u043e\u043d\u0442\u0430\u043b\u044c\u043d\u0443\u044e \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0443\n    \"\"\"\n\n    ut = UsersTab(browser)\n    user_name, role = ut.open_edit_user_page_by_index(0)\n    modal_window = ut.get_modal_window(user_name)\n\n    is_scrollable_vertically = modal_window.check_window_vertical_scrolling()\n    assert is_scrollable_vertically, \"Should be vertical scrolling\"\n\n    modal_window.scroll_window_down()\n    modal_window.check_button_visibility(\"close\")\n    ut.wait_for_timeout(3000)\n\n    modal_window.scroll_window_up()\n    modal_window.check_toolbar_button_visibility(\"close\")\n    ut.wait_for_timeout(3000)\n\n    is_scrollable_horizontally = modal_window.check_window_horizontal_scrolling()\n    assert is_scrollable_horizontally, \"Should be horizontal scrolling\"\n\n    modal_window.scroll_window_right()\n    ut.wait_for_timeout(3000)\n    modal_window.scroll_window_left()\n    ut.wait_for_timeout(2000)\n
    "},{"location":"tests/e2e/test_event_panel/","title":"TestEventPanel","text":"

    \u041c\u043e\u0434\u0443\u043b\u044c \u0442\u0435\u0441\u0442\u043e\u0432 \u043f\u0430\u043d\u0435\u043b\u0438 \u0441\u043e\u0431\u044b\u0442\u0438\u0439.

    \u0421\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0442\u0435\u0441\u0442\u044b \u0434\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u043f\u0430\u043d\u0435\u043b\u0438 \u0441\u043e\u0431\u044b\u0442\u0438\u0439 \u0432 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0438.

    "},{"location":"tests/e2e/test_event_panel/#tests.e2e.test_event_panel.TestEventPanel","title":"TestEventPanel","text":"

    \u041a\u043b\u0430\u0441\u0441 \u0442\u0435\u0441\u0442\u043e\u0432 \u0434\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u043f\u0430\u043d\u0435\u043b\u0438 \u0441\u043e\u0431\u044b\u0442\u0438\u0439.

    \u0422\u0435\u0441\u0442\u044b \u043f\u043e\u043a\u0440\u044b\u0432\u0430\u044e\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0438: 1. test_event_panel_content: \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u043f\u0430\u043d\u0435\u043b\u0438 \u0441\u043e\u0431\u044b\u0442\u0438\u0439 2. test_event_panel_expand_buttons: \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0438 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043a\u043d\u043e\u043f\u043e\u043a \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f \u0440\u0430\u0431\u043e\u0447\u0435\u0439 \u043e\u0431\u043b\u0430\u0441\u0442\u0438 \u043f\u0430\u043d\u0435\u043b\u0438 \u0441\u043e\u0431\u044b\u0442\u0438\u0439

    \u0410\u0442\u0440\u0438\u0431\u0443\u0442\u044b

    browser: \u0424\u0438\u043a\u0441\u0442\u0443\u0440\u0430 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u043e\u043c.

    Source code in tests\\e2e\\test_event_panel.py
    class TestEventPanel:\n    \"\"\"\u041a\u043b\u0430\u0441\u0441 \u0442\u0435\u0441\u0442\u043e\u0432 \u0434\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u043f\u0430\u043d\u0435\u043b\u0438 \u0441\u043e\u0431\u044b\u0442\u0438\u0439.\n\n    \u0422\u0435\u0441\u0442\u044b \u043f\u043e\u043a\u0440\u044b\u0432\u0430\u044e\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0438:\n    1. test_event_panel_content: \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u043f\u0430\u043d\u0435\u043b\u0438 \u0441\u043e\u0431\u044b\u0442\u0438\u0439\n    2. test_event_panel_expand_buttons: \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0438 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043a\u043d\u043e\u043f\u043e\u043a \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f \u0440\u0430\u0431\u043e\u0447\u0435\u0439 \u043e\u0431\u043b\u0430\u0441\u0442\u0438 \u043f\u0430\u043d\u0435\u043b\u0438 \u0441\u043e\u0431\u044b\u0442\u0438\u0439\n\n    \u0410\u0442\u0440\u0438\u0431\u0443\u0442\u044b:\n        browser: \u0424\u0438\u043a\u0441\u0442\u0443\u0440\u0430 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u043e\u043c.\n    \"\"\"\n\n    def test_event_panel_content(self, browser: Page) -> None:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u043f\u0430\u043d\u0435\u043b\u0438 \u0441\u043e\u0431\u044b\u0442\u0438\u0439.\n\n        Args:\n            browser: \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.\n        \"\"\"\n\n        lp = LoginPage(browser)\n        lp.do_login()\n\n        mp = MainPage(browser)\n        mp.should_be_event_panel()\n\n        # \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0435 \u0442\u0443\u043b\u0442\u0438\u043f\u043e\u0432 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u043d\u0430 \u043a\u043d\u043e\u043f\u043a\u0430\u0445\n        tooltip_event_counters = mp.get_event_counters_by_tooltips()\n        button_event_counters = mp.get_event_counters_by_tooltips()\n\n        for event, counter in tooltip_event_counters.items():\n            button_counter = button_event_counters.get(event)\n            if button_counter is None:\n                assert False, f\"Found unexpected tooltip {event} for event button\"\n\n            if button_counter != counter:\n                assert False, f\"Expected tooltip value {counter} is not equal button value {button_counter} for event button {event}\"\n\n    def test_event_panel_expand_buttons(self, browser: Page) -> None:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0438 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043a\u043d\u043e\u043f\u043e\u043a \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f \u0440\u0430\u0431\u043e\u0447\u0435\u0439 \u043e\u0431\u043b\u0430\u0441\u0442\u0438 \u043f\u0430\u043d\u0435\u043b\u0438 \u0441\u043e\u0431\u044b\u0442\u0438\u0439.\n\n        Args:\n            browser: \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.\n        \"\"\"\n\n        lp = LoginPage(browser)\n        lp.do_login()\n\n        mp = MainPage(browser)\n\n        # \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 - \u043f\u0430\u043d\u0435\u043b\u044c \u0441\u043e\u0431\u044b\u0442\u0438\u0439 \u0432\u043d\u0438\u0437\u0443, \u0432\u0438\u0434\u043d\u0430 \u043e\u0434\u043d\u0430 \u043a\u043d\u043e\u043f\u043a\u0430 expand less\n        current_position = mp.get_events_panel_position()\n        assert current_position == \"bottom\", \\\n               \"Events panel should be located on main page bottom\"\n        assert mp.check_expand_less_button(), \\\n               \"Expand less button should be present\"\n        assert mp.check_expand_more_button(), \\\n               \"Expand more button should be absent\"\n\n        mp.click_events_panel_expand_less_button()\n        mp.wait_for_timeout(500)\n\n        # \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c, \u0447\u0442\u043e \u043f\u0430\u043d\u0435\u043b\u044c \u0441\u043e\u0431\u044b\u0442\u0438\u0439 \u043f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u043b\u0430\u0441\u044c \u0432 \u0441\u0435\u0440\u0435\u0434\u0438\u043d\u0443 \u044d\u043a\u0440\u0430\u043d\u0430,\n        # \u0432\u0438\u0434\u043d\u0430 \u043e\u0431\u0435 \u043a\u043d\u043e\u043f\u043a\u0438 expand less \u0438 expand more\n        current_position = mp.get_events_panel_position()\n        assert current_position == \"center\", \\\n               \"Events panel should be located on main page center\"\n        assert mp.check_expand_less_button(), \\\n               \"Expand less button should be present\"\n        assert mp.check_expand_more_button(), \\\n               \"Expand more button should be present\"\n\n        mp.click_events_panel_expand_less_button()\n        mp.wait_for_timeout(500)\n\n        # \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c, \u0447\u0442\u043e \u043f\u0430\u043d\u0435\u043b\u044c \u0441\u043e\u0431\u044b\u0442\u0438\u0439 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432\u0432\u0435\u0440\u0445\u0443 \u044d\u043a\u0440\u0430\u043d\u0430,\n        # \u0432\u0438\u0434\u043d\u0430 \u043a\u043d\u043e\u043f\u043a\u0438 expand more \u0438 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442 expand less\n        current_position = mp.get_events_panel_position()\n        assert current_position == \"top\", \\\n               \"Events panel should be located on main page top\"\n        assert mp.check_expand_less_button(), \\\n               \"Expand less button should be absent\"\n        assert mp.check_expand_more_button(), \\\n               \"Expand more button should be present\"\n\n        # \u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0435\u043d\u0438\u0435 \u0432 \u043e\u0442\u0440\u0430\u0442\u043d\u043e\u043c \u043d\u0430\u043f\u0440\u0432\u043b\u0435\u043d\u0438\u0438 \u0441\u0432\u0435\u0440\u0445\u0443 \u0432\u043d\u0438\u0437\n        mp.click_events_panel_expand_more_button()\n        mp.wait_for_timeout(500)\n\n        current_position = mp.get_events_panel_position()\n        assert current_position == \"center\", \\\n               \"Events panel should be located on main page center\"\n        assert mp.check_expand_less_button(), \\\n               \"Expand less button should be present\"\n        assert mp.check_expand_more_button(), \\\n               \"Expand more button should be present\"\n\n        mp.click_events_panel_expand_more_button()\n        mp.wait_for_timeout(500)\n\n        current_position = mp.get_events_panel_position()\n        assert current_position == \"bottom\", \\\n               \"Events panel should be located on main page bottom\"\n        assert mp.check_expand_less_button(), \\\n               \"Expand less button should be present\"\n        assert mp.check_expand_more_button(), \\\n               \"Expand more button should be absent\"\n
    "},{"location":"tests/e2e/test_event_panel/#tests.e2e.test_event_panel.TestEventPanel.test_event_panel_content","title":"test_event_panel_content(browser)","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u043f\u0430\u043d\u0435\u043b\u0438 \u0441\u043e\u0431\u044b\u0442\u0438\u0439.

    Parameters:

    Name Type Description Default browser Page

    \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.

    required Source code in tests\\e2e\\test_event_panel.py
    def test_event_panel_content(self, browser: Page) -> None:\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u043f\u0430\u043d\u0435\u043b\u0438 \u0441\u043e\u0431\u044b\u0442\u0438\u0439.\n\n    Args:\n        browser: \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.\n    \"\"\"\n\n    lp = LoginPage(browser)\n    lp.do_login()\n\n    mp = MainPage(browser)\n    mp.should_be_event_panel()\n\n    # \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0435 \u0442\u0443\u043b\u0442\u0438\u043f\u043e\u0432 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u043d\u0430 \u043a\u043d\u043e\u043f\u043a\u0430\u0445\n    tooltip_event_counters = mp.get_event_counters_by_tooltips()\n    button_event_counters = mp.get_event_counters_by_tooltips()\n\n    for event, counter in tooltip_event_counters.items():\n        button_counter = button_event_counters.get(event)\n        if button_counter is None:\n            assert False, f\"Found unexpected tooltip {event} for event button\"\n\n        if button_counter != counter:\n            assert False, f\"Expected tooltip value {counter} is not equal button value {button_counter} for event button {event}\"\n
    "},{"location":"tests/e2e/test_event_panel/#tests.e2e.test_event_panel.TestEventPanel.test_event_panel_expand_buttons","title":"test_event_panel_expand_buttons(browser)","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0438 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043a\u043d\u043e\u043f\u043e\u043a \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f \u0440\u0430\u0431\u043e\u0447\u0435\u0439 \u043e\u0431\u043b\u0430\u0441\u0442\u0438 \u043f\u0430\u043d\u0435\u043b\u0438 \u0441\u043e\u0431\u044b\u0442\u0438\u0439.

    Parameters:

    Name Type Description Default browser Page

    \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.

    required Source code in tests\\e2e\\test_event_panel.py
    def test_event_panel_expand_buttons(self, browser: Page) -> None:\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0438 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043a\u043d\u043e\u043f\u043e\u043a \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f \u0440\u0430\u0431\u043e\u0447\u0435\u0439 \u043e\u0431\u043b\u0430\u0441\u0442\u0438 \u043f\u0430\u043d\u0435\u043b\u0438 \u0441\u043e\u0431\u044b\u0442\u0438\u0439.\n\n    Args:\n        browser: \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.\n    \"\"\"\n\n    lp = LoginPage(browser)\n    lp.do_login()\n\n    mp = MainPage(browser)\n\n    # \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 - \u043f\u0430\u043d\u0435\u043b\u044c \u0441\u043e\u0431\u044b\u0442\u0438\u0439 \u0432\u043d\u0438\u0437\u0443, \u0432\u0438\u0434\u043d\u0430 \u043e\u0434\u043d\u0430 \u043a\u043d\u043e\u043f\u043a\u0430 expand less\n    current_position = mp.get_events_panel_position()\n    assert current_position == \"bottom\", \\\n           \"Events panel should be located on main page bottom\"\n    assert mp.check_expand_less_button(), \\\n           \"Expand less button should be present\"\n    assert mp.check_expand_more_button(), \\\n           \"Expand more button should be absent\"\n\n    mp.click_events_panel_expand_less_button()\n    mp.wait_for_timeout(500)\n\n    # \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c, \u0447\u0442\u043e \u043f\u0430\u043d\u0435\u043b\u044c \u0441\u043e\u0431\u044b\u0442\u0438\u0439 \u043f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u043b\u0430\u0441\u044c \u0432 \u0441\u0435\u0440\u0435\u0434\u0438\u043d\u0443 \u044d\u043a\u0440\u0430\u043d\u0430,\n    # \u0432\u0438\u0434\u043d\u0430 \u043e\u0431\u0435 \u043a\u043d\u043e\u043f\u043a\u0438 expand less \u0438 expand more\n    current_position = mp.get_events_panel_position()\n    assert current_position == \"center\", \\\n           \"Events panel should be located on main page center\"\n    assert mp.check_expand_less_button(), \\\n           \"Expand less button should be present\"\n    assert mp.check_expand_more_button(), \\\n           \"Expand more button should be present\"\n\n    mp.click_events_panel_expand_less_button()\n    mp.wait_for_timeout(500)\n\n    # \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c, \u0447\u0442\u043e \u043f\u0430\u043d\u0435\u043b\u044c \u0441\u043e\u0431\u044b\u0442\u0438\u0439 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432\u0432\u0435\u0440\u0445\u0443 \u044d\u043a\u0440\u0430\u043d\u0430,\n    # \u0432\u0438\u0434\u043d\u0430 \u043a\u043d\u043e\u043f\u043a\u0438 expand more \u0438 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442 expand less\n    current_position = mp.get_events_panel_position()\n    assert current_position == \"top\", \\\n           \"Events panel should be located on main page top\"\n    assert mp.check_expand_less_button(), \\\n           \"Expand less button should be absent\"\n    assert mp.check_expand_more_button(), \\\n           \"Expand more button should be present\"\n\n    # \u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0435\u043d\u0438\u0435 \u0432 \u043e\u0442\u0440\u0430\u0442\u043d\u043e\u043c \u043d\u0430\u043f\u0440\u0432\u043b\u0435\u043d\u0438\u0438 \u0441\u0432\u0435\u0440\u0445\u0443 \u0432\u043d\u0438\u0437\n    mp.click_events_panel_expand_more_button()\n    mp.wait_for_timeout(500)\n\n    current_position = mp.get_events_panel_position()\n    assert current_position == \"center\", \\\n           \"Events panel should be located on main page center\"\n    assert mp.check_expand_less_button(), \\\n           \"Expand less button should be present\"\n    assert mp.check_expand_more_button(), \\\n           \"Expand more button should be present\"\n\n    mp.click_events_panel_expand_more_button()\n    mp.wait_for_timeout(500)\n\n    current_position = mp.get_events_panel_position()\n    assert current_position == \"bottom\", \\\n           \"Events panel should be located on main page bottom\"\n    assert mp.check_expand_less_button(), \\\n           \"Expand less button should be present\"\n    assert mp.check_expand_more_button(), \\\n           \"Expand more button should be absent\"\n
    "},{"location":"tests/e2e/test_expand_navigation_panel/","title":"TestNavigationPanel","text":"

    \u041c\u043e\u0434\u0443\u043b\u044c \u0442\u0435\u0441\u0442\u043e\u0432 \u043f\u0430\u043d\u0435\u043b\u0438 \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438.

    \u0421\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0442\u0435\u0441\u0442\u044b \u0434\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u043f\u0430\u043d\u0435\u043b\u0438 \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438 \u0432 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0438.

    "},{"location":"tests/e2e/test_expand_navigation_panel/#tests.e2e.test_expand_navigation_panel.TestNavigationPanel","title":"TestNavigationPanel","text":"

    \u041a\u043b\u0430\u0441\u0441 \u0442\u0435\u0441\u0442\u043e\u0432 \u0434\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u043f\u0430\u043d\u0435\u043b\u0438 \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438.

    \u0422\u0435\u0441\u0442\u044b \u043f\u043e\u043a\u0440\u044b\u0432\u0430\u044e\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0438: - test_expand_panel: \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043f\u043e\u043b\u043d\u043e\u0435 \u0440\u0430\u0441\u043a\u0440\u044b\u0442\u0438\u0435 \u043f\u0430\u043d\u0435\u043b\u0438 \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438 - test_sub_panel_item_click: \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043a\u043b\u0438\u043a\u0430 \u0437\u0430\u0434\u0430\u043d\u043d\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0432 \u043f\u043e\u0434\u043f\u0430\u043d\u0435\u043b\u0438 \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438

    \u0410\u0442\u0440\u0438\u0431\u0443\u0442\u044b

    browser: \u0424\u0438\u043a\u0441\u0442\u0443\u0440\u0430 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u043e\u043c.

    Source code in tests\\e2e\\test_expand_navigation_panel.py
    class TestNavigationPanel:\n    \"\"\"\u041a\u043b\u0430\u0441\u0441 \u0442\u0435\u0441\u0442\u043e\u0432 \u0434\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u043f\u0430\u043d\u0435\u043b\u0438 \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438.\n\n    \u0422\u0435\u0441\u0442\u044b \u043f\u043e\u043a\u0440\u044b\u0432\u0430\u044e\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0438:\n    - test_expand_panel: \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043f\u043e\u043b\u043d\u043e\u0435 \u0440\u0430\u0441\u043a\u0440\u044b\u0442\u0438\u0435 \u043f\u0430\u043d\u0435\u043b\u0438 \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438\n    - test_sub_panel_item_click: \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043a\u043b\u0438\u043a\u0430 \u0437\u0430\u0434\u0430\u043d\u043d\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0432 \u043f\u043e\u0434\u043f\u0430\u043d\u0435\u043b\u0438 \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438\n\n    \u0410\u0442\u0440\u0438\u0431\u0443\u0442\u044b:\n        browser: \u0424\u0438\u043a\u0441\u0442\u0443\u0440\u0430 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u043e\u043c.\n    \"\"\"\n\n    def test_expand_panel(self, browser: Page):\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043f\u043e\u043b\u043d\u043e\u0435 \u0440\u0430\u0441\u043a\u0440\u044b\u0442\u0438\u0435 \u043f\u0430\u043d\u0435\u043b\u0438 \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438.\n\n        Args:\n            browser: \u0424\u0438\u043a\u0441\u0442\u0443\u0440\u0430 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u043e\u043c.\n\n        \"\"\"\n\n        # \u0414\u0435\u0439\u0441\u0442\u0432\u0438\u044f:\n        lp = LoginPage(browser)\n        lp.do_login()\n\n        # \u041c\u044b \u043d\u0430 \u0433\u043b\u0430\u0432\u043d\u043e\u0439 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435\n        mp = MainPage(browser)\n\n        # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0438:\n        # \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u043f\u0430\u043d\u0435\u043b\u0438 \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438\n        mp.should_be_navigation_panel()\n\n        # \u041e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u043c \u0432\u0441\u0435 \u043f\u0443\u043d\u043a\u0442\u044b \u043f\u0430\u043d\u0435\u043b\u0438\n        mp.click_main_navigation_panel_item(\"\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438\")\n\n        mp.expand_navigation_subpanel()\n\n        mp.click_main_navigation_panel_item(\"\u041e\u0431\u044a\u0435\u043a\u0442\u044b\")\n        mp.wait_for_timeout(300)\n\n        mp.expand_navigation_subpanel()\n\n    def test_sub_panel_item_click(self, browser: Page):\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043a\u043b\u0438\u043a\u0430 \u0437\u0430\u0434\u0430\u043d\u043d\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0432 \u043f\u043e\u0434\u043f\u0430\u043d\u0435\u043b\u0438 \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438.\n\n        Args:\n            browser: \u0424\u0438\u043a\u0441\u0442\u0443\u0440\u0430 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u043e\u043c.\n\n        \"\"\"\n\n        # \u0414\u0435\u0439\u0441\u0442\u0432\u0438\u044f:\n        lp = LoginPage(browser)\n        lp.do_login()\n\n        # \u041c\u044b \u043d\u0430 \u0433\u043b\u0430\u0432\u043d\u043e\u0439 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435\n        mp = MainPage(browser)\n\n        # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0438:\n        # \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u043f\u0430\u043d\u0435\u043b\u0438 \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438\n        mp.should_be_navigation_panel()\n\n        # \u041e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u043c \u0432\u0441\u0435 \u043f\u0443\u043d\u043a\u0442\u044b \u043f\u0430\u043d\u0435\u043b\u0438\n        mp.click_main_navigation_panel_item(\"\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438\")\n\n        mp.click_subpanel_item(\"\u041e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u043d\u0438\u0435 \u0438 \u0434\u0438\u0430\u0433\u043d\u043e\u0441\u0442\u0438\u043a\u0430\")\n        mp.click_subpanel_item(\"\u0421\u0442\u0430\u0442\u0443\u0441 \u043e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u043d\u0438\u044f\")\n\n        mp.wait_for_timeout(500)\n\n        mp.click_subpanel_item(\"\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438\")\n        mp.click_subpanel_item(\"\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438\")\n
    "},{"location":"tests/e2e/test_expand_navigation_panel/#tests.e2e.test_expand_navigation_panel.TestNavigationPanel.test_expand_panel","title":"test_expand_panel(browser)","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043f\u043e\u043b\u043d\u043e\u0435 \u0440\u0430\u0441\u043a\u0440\u044b\u0442\u0438\u0435 \u043f\u0430\u043d\u0435\u043b\u0438 \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438.

    Parameters:

    Name Type Description Default browser Page

    \u0424\u0438\u043a\u0441\u0442\u0443\u0440\u0430 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u043e\u043c.

    required Source code in tests\\e2e\\test_expand_navigation_panel.py
    def test_expand_panel(self, browser: Page):\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043f\u043e\u043b\u043d\u043e\u0435 \u0440\u0430\u0441\u043a\u0440\u044b\u0442\u0438\u0435 \u043f\u0430\u043d\u0435\u043b\u0438 \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438.\n\n    Args:\n        browser: \u0424\u0438\u043a\u0441\u0442\u0443\u0440\u0430 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u043e\u043c.\n\n    \"\"\"\n\n    # \u0414\u0435\u0439\u0441\u0442\u0432\u0438\u044f:\n    lp = LoginPage(browser)\n    lp.do_login()\n\n    # \u041c\u044b \u043d\u0430 \u0433\u043b\u0430\u0432\u043d\u043e\u0439 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435\n    mp = MainPage(browser)\n\n    # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0438:\n    # \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u043f\u0430\u043d\u0435\u043b\u0438 \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438\n    mp.should_be_navigation_panel()\n\n    # \u041e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u043c \u0432\u0441\u0435 \u043f\u0443\u043d\u043a\u0442\u044b \u043f\u0430\u043d\u0435\u043b\u0438\n    mp.click_main_navigation_panel_item(\"\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438\")\n\n    mp.expand_navigation_subpanel()\n\n    mp.click_main_navigation_panel_item(\"\u041e\u0431\u044a\u0435\u043a\u0442\u044b\")\n    mp.wait_for_timeout(300)\n\n    mp.expand_navigation_subpanel()\n
    "},{"location":"tests/e2e/test_expand_navigation_panel/#tests.e2e.test_expand_navigation_panel.TestNavigationPanel.test_sub_panel_item_click","title":"test_sub_panel_item_click(browser)","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043a\u043b\u0438\u043a\u0430 \u0437\u0430\u0434\u0430\u043d\u043d\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0432 \u043f\u043e\u0434\u043f\u0430\u043d\u0435\u043b\u0438 \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438.

    Parameters:

    Name Type Description Default browser Page

    \u0424\u0438\u043a\u0441\u0442\u0443\u0440\u0430 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u043e\u043c.

    required Source code in tests\\e2e\\test_expand_navigation_panel.py
    def test_sub_panel_item_click(self, browser: Page):\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043a\u043b\u0438\u043a\u0430 \u0437\u0430\u0434\u0430\u043d\u043d\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0432 \u043f\u043e\u0434\u043f\u0430\u043d\u0435\u043b\u0438 \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438.\n\n    Args:\n        browser: \u0424\u0438\u043a\u0441\u0442\u0443\u0440\u0430 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u043e\u043c.\n\n    \"\"\"\n\n    # \u0414\u0435\u0439\u0441\u0442\u0432\u0438\u044f:\n    lp = LoginPage(browser)\n    lp.do_login()\n\n    # \u041c\u044b \u043d\u0430 \u0433\u043b\u0430\u0432\u043d\u043e\u0439 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435\n    mp = MainPage(browser)\n\n    # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0438:\n    # \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u043f\u0430\u043d\u0435\u043b\u0438 \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438\n    mp.should_be_navigation_panel()\n\n    # \u041e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u043c \u0432\u0441\u0435 \u043f\u0443\u043d\u043a\u0442\u044b \u043f\u0430\u043d\u0435\u043b\u0438\n    mp.click_main_navigation_panel_item(\"\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438\")\n\n    mp.click_subpanel_item(\"\u041e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u043d\u0438\u0435 \u0438 \u0434\u0438\u0430\u0433\u043d\u043e\u0441\u0442\u0438\u043a\u0430\")\n    mp.click_subpanel_item(\"\u0421\u0442\u0430\u0442\u0443\u0441 \u043e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u043d\u0438\u044f\")\n\n    mp.wait_for_timeout(500)\n\n    mp.click_subpanel_item(\"\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438\")\n    mp.click_subpanel_item(\"\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438\")\n
    "},{"location":"tests/e2e/test_license_tab/","title":"TestLicenseTab","text":"

    \u041c\u043e\u0434\u0443\u043b\u044c \u0442\u0435\u0441\u0442\u043e\u0432 \u0432\u043a\u043b\u0430\u0434\u043a\u0438 '\u041b\u0438\u0446\u0435\u043d\u0437\u0438\u0438'.

    \u0421\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0442\u0435\u0441\u0442\u044b \u0434\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u0438 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0433\u043e \u0432\u043a\u043b\u0430\u0434\u043a\u0438 \u043b\u0438\u0446\u0435\u043d\u0437\u0438\u0439.

    "},{"location":"tests/e2e/test_license_tab/#tests.e2e.test_license_tab.TestLicenseTab","title":"TestLicenseTab","text":"

    \u041a\u043b\u0430\u0441\u0441 \u0442\u0435\u0441\u0442\u043e\u0432 \u0434\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0432\u043a\u043b\u0430\u0434\u043a\u0438 '\u041b\u0438\u0446\u0435\u043d\u0437\u0438\u0438'.

    \u0422\u0435\u0441\u0442\u044b \u043f\u043e\u043a\u0440\u044b\u0432\u0430\u044e\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0438: 1. test_lisence_tab_content: \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u0432\u043a\u043b\u0430\u0434\u043a\u0438 '\u041b\u0438\u0446\u0435\u043d\u0437\u0438\u0438' 2. test_license_tab_input_form_and_check_alert: \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0444\u043e\u0440\u043c\u0443 \u0432\u0432\u043e\u0434\u0430 \u043b\u0438\u0446\u0435\u043d\u0437\u0438\u0438 \u0438 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0430\u043b\u0435\u0440\u0442\u043e\u0432

    Source code in tests\\e2e\\test_license_tab.py
    class TestLicenseTab:\n    \"\"\"\u041a\u043b\u0430\u0441\u0441 \u0442\u0435\u0441\u0442\u043e\u0432 \u0434\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0432\u043a\u043b\u0430\u0434\u043a\u0438 '\u041b\u0438\u0446\u0435\u043d\u0437\u0438\u0438'.\n\n    \u0422\u0435\u0441\u0442\u044b \u043f\u043e\u043a\u0440\u044b\u0432\u0430\u044e\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0438:\n    1. test_lisence_tab_content: \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u0432\u043a\u043b\u0430\u0434\u043a\u0438 '\u041b\u0438\u0446\u0435\u043d\u0437\u0438\u0438'\n    2. test_license_tab_input_form_and_check_alert: \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0444\u043e\u0440\u043c\u0443 \u0432\u0432\u043e\u0434\u0430 \u043b\u0438\u0446\u0435\u043d\u0437\u0438\u0438 \u0438 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0430\u043b\u0435\u0440\u0442\u043e\u0432\n    \"\"\"\n\n    @pytest.fixture(scope=\"function\", autouse=True)\n    def setup(self, browser: Page) -> None:\n        \"\"\"\u041d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u0442 \u0442\u0435\u0441\u0442\u043e\u0432\u043e\u0435 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0435 \u043f\u0435\u0440\u0435\u0434 \u043a\u0430\u0436\u0434\u044b\u043c \u0442\u0435\u0441\u0442\u043e\u043c.\n\n        Args:\n            browser: \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.\n        \"\"\"\n\n        lp = LoginPage(browser)\n        lp.do_login()\n\n        mp = MainPage(browser)\n        mp.should_be_navigation_panel()\n        mp.click_main_navigation_panel_item(\"\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438\")\n        mp.click_subpanel_item(\"\u041b\u0438\u0446\u0435\u043d\u0437\u0438\u0438\")\n\n    def test_lisence_tab_content(self, browser: Page) -> None:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u0432\u043a\u043b\u0430\u0434\u043a\u0438 '\u041b\u0438\u0446\u0435\u043d\u0437\u0438\u0438'.\n\n        Args:\n            browser: \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.\n        \"\"\"\n\n        lt = LicenseTab(browser)\n        lt.check_content()\n\n    def test_license_tab_input_form_and_check_alert(self, browser: Page) -> None:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0444\u043e\u0440\u043c\u0443 \u0432\u0432\u043e\u0434\u0430 \u043b\u0438\u0446\u0435\u043d\u0437\u0438\u0438 \u0438 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0430\u043b\u0435\u0440\u0442\u043e\u0432.\n\n        Args:\n            browser: \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.\n        \"\"\"\n\n        def gen_test_data() -> List[str]:\n            \"\"\"\u0413\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442 \u0442\u0435\u0441\u0442\u043e\u0432\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0434\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0444\u043e\u0440\u043c\u044b.\n\n            Returns:\n                List[str]: \u0421\u043f\u0438\u0441\u043e\u043a \u0442\u0435\u0441\u0442\u043e\u0432\u044b\u0445 \u0441\u0442\u0440\u043e\u043a \u043b\u0438\u0446\u0435\u043d\u0437\u0438\u0439.\n            \"\"\"\n\n            data = []\n            for i in range(3):\n                data.append(uuid.uuid4().hex)\n\n            lowercase_str = uuid.uuid4().hex\n            data.append(lowercase_str.upper())\n            data.append(lowercase_str + \"fffffffff\")\n            data.append(\"0\")\n            data.append(\"000000000000000000000000000000000000000000000000\")\n            data.append(\"-1\")\n\n            return data\n\n        lt = LicenseTab(browser)\n        lt.should_be_empty_input_form()\n\n        lt.fill_license_input_form(\"\")\n        lt.should_be_error_alert_window_with_text(\"\u041d\u0435\u0432\u0435\u0440\u043d\u044b\u0439 \u043b\u0438\u0446\u0435\u043d\u0437\u0438\u043e\u043d\u043d\u044b\u0439 \u043a\u043b\u044e\u0447\")\n\n        data = gen_test_data()\n\n        for data_string in data:\n            lt.fill_license_input_form(data_string)\n            lt.should_be_error_alert_window_with_text(\"\u041e\u0448\u0438\u0431\u043a\u0430 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u043b\u0438\u0446\u0435\u043d\u0437\u0438\u0438\")\n
    "},{"location":"tests/e2e/test_license_tab/#tests.e2e.test_license_tab.TestLicenseTab.setup","title":"setup(browser)","text":"

    \u041d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u0442 \u0442\u0435\u0441\u0442\u043e\u0432\u043e\u0435 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0435 \u043f\u0435\u0440\u0435\u0434 \u043a\u0430\u0436\u0434\u044b\u043c \u0442\u0435\u0441\u0442\u043e\u043c.

    Parameters:

    Name Type Description Default browser Page

    \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.

    required Source code in tests\\e2e\\test_license_tab.py
    @pytest.fixture(scope=\"function\", autouse=True)\ndef setup(self, browser: Page) -> None:\n    \"\"\"\u041d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u0442 \u0442\u0435\u0441\u0442\u043e\u0432\u043e\u0435 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0435 \u043f\u0435\u0440\u0435\u0434 \u043a\u0430\u0436\u0434\u044b\u043c \u0442\u0435\u0441\u0442\u043e\u043c.\n\n    Args:\n        browser: \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.\n    \"\"\"\n\n    lp = LoginPage(browser)\n    lp.do_login()\n\n    mp = MainPage(browser)\n    mp.should_be_navigation_panel()\n    mp.click_main_navigation_panel_item(\"\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438\")\n    mp.click_subpanel_item(\"\u041b\u0438\u0446\u0435\u043d\u0437\u0438\u0438\")\n
    "},{"location":"tests/e2e/test_license_tab/#tests.e2e.test_license_tab.TestLicenseTab.test_license_tab_input_form_and_check_alert","title":"test_license_tab_input_form_and_check_alert(browser)","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0444\u043e\u0440\u043c\u0443 \u0432\u0432\u043e\u0434\u0430 \u043b\u0438\u0446\u0435\u043d\u0437\u0438\u0438 \u0438 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0430\u043b\u0435\u0440\u0442\u043e\u0432.

    Parameters:

    Name Type Description Default browser Page

    \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.

    required Source code in tests\\e2e\\test_license_tab.py
    def test_license_tab_input_form_and_check_alert(self, browser: Page) -> None:\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0444\u043e\u0440\u043c\u0443 \u0432\u0432\u043e\u0434\u0430 \u043b\u0438\u0446\u0435\u043d\u0437\u0438\u0438 \u0438 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0430\u043b\u0435\u0440\u0442\u043e\u0432.\n\n    Args:\n        browser: \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.\n    \"\"\"\n\n    def gen_test_data() -> List[str]:\n        \"\"\"\u0413\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442 \u0442\u0435\u0441\u0442\u043e\u0432\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0434\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0444\u043e\u0440\u043c\u044b.\n\n        Returns:\n            List[str]: \u0421\u043f\u0438\u0441\u043e\u043a \u0442\u0435\u0441\u0442\u043e\u0432\u044b\u0445 \u0441\u0442\u0440\u043e\u043a \u043b\u0438\u0446\u0435\u043d\u0437\u0438\u0439.\n        \"\"\"\n\n        data = []\n        for i in range(3):\n            data.append(uuid.uuid4().hex)\n\n        lowercase_str = uuid.uuid4().hex\n        data.append(lowercase_str.upper())\n        data.append(lowercase_str + \"fffffffff\")\n        data.append(\"0\")\n        data.append(\"000000000000000000000000000000000000000000000000\")\n        data.append(\"-1\")\n\n        return data\n\n    lt = LicenseTab(browser)\n    lt.should_be_empty_input_form()\n\n    lt.fill_license_input_form(\"\")\n    lt.should_be_error_alert_window_with_text(\"\u041d\u0435\u0432\u0435\u0440\u043d\u044b\u0439 \u043b\u0438\u0446\u0435\u043d\u0437\u0438\u043e\u043d\u043d\u044b\u0439 \u043a\u043b\u044e\u0447\")\n\n    data = gen_test_data()\n\n    for data_string in data:\n        lt.fill_license_input_form(data_string)\n        lt.should_be_error_alert_window_with_text(\"\u041e\u0448\u0438\u0431\u043a\u0430 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u043b\u0438\u0446\u0435\u043d\u0437\u0438\u0438\")\n
    "},{"location":"tests/e2e/test_license_tab/#tests.e2e.test_license_tab.TestLicenseTab.test_lisence_tab_content","title":"test_lisence_tab_content(browser)","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u0432\u043a\u043b\u0430\u0434\u043a\u0438 '\u041b\u0438\u0446\u0435\u043d\u0437\u0438\u0438'.

    Parameters:

    Name Type Description Default browser Page

    \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.

    required Source code in tests\\e2e\\test_license_tab.py
    def test_lisence_tab_content(self, browser: Page) -> None:\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u0432\u043a\u043b\u0430\u0434\u043a\u0438 '\u041b\u0438\u0446\u0435\u043d\u0437\u0438\u0438'.\n\n    Args:\n        browser: \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.\n    \"\"\"\n\n    lt = LicenseTab(browser)\n    lt.check_content()\n
    "},{"location":"tests/e2e/test_login/","title":"TestLogin","text":"

    \u041c\u043e\u0434\u0443\u043b\u044c \u0442\u0435\u0441\u0442\u043e\u0432 \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u0438.

    \u0421\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0442\u0435\u0441\u0442\u044b \u0434\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u0430 \u0432\u0445\u043e\u0434\u0430 \u0438 \u0432\u044b\u0445\u043e\u0434\u0430 \u0438\u0437 \u0441\u0438\u0441\u0442\u0435\u043c\u044b.

    "},{"location":"tests/e2e/test_login/#tests.e2e.test_login.TestLogin","title":"TestLogin","text":"

    \u041a\u043b\u0430\u0441\u0441 \u0442\u0435\u0441\u0442\u043e\u0432 \u0434\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u0438.

    \u0422\u0435\u0441\u0442\u044b \u043f\u043e\u043a\u0440\u044b\u0432\u0430\u044e\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0438: 1. test_successful_login: \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0443\u0441\u043f\u0435\u0448\u043d\u044b\u0439 \u0432\u0445\u043e\u0434 \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0443 2. test_unsuccessful_login: \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u0445\u043e\u0434 \u0441 \u043d\u0435\u0432\u0435\u0440\u043d\u044b\u043c\u0438 \u0443\u0447\u0435\u0442\u043d\u044b\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u043c\u0438 3. test_successful_login_and_logout: \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0443\u0441\u043f\u0435\u0448\u043d\u044b\u0439 \u0432\u0445\u043e\u0434 \u0438 \u0432\u044b\u0445\u043e\u0434 \u0438\u0437 \u0441\u0438\u0441\u0442\u0435\u043c\u044b 4. test_password_visibility: \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432 \u043f\u0430\u0440\u043e\u043b\u044f

    Source code in tests\\e2e\\test_login.py
    class TestLogin:\n    \"\"\"\u041a\u043b\u0430\u0441\u0441 \u0442\u0435\u0441\u0442\u043e\u0432 \u0434\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u0438.\n\n    \u0422\u0435\u0441\u0442\u044b \u043f\u043e\u043a\u0440\u044b\u0432\u0430\u044e\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0438:\n    1. test_successful_login: \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0443\u0441\u043f\u0435\u0448\u043d\u044b\u0439 \u0432\u0445\u043e\u0434 \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0443\n    2. test_unsuccessful_login: \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u0445\u043e\u0434 \u0441 \u043d\u0435\u0432\u0435\u0440\u043d\u044b\u043c\u0438 \u0443\u0447\u0435\u0442\u043d\u044b\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u043c\u0438\n    3. test_successful_login_and_logout: \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0443\u0441\u043f\u0435\u0448\u043d\u044b\u0439 \u0432\u0445\u043e\u0434 \u0438 \u0432\u044b\u0445\u043e\u0434 \u0438\u0437 \u0441\u0438\u0441\u0442\u0435\u043c\u044b\n    4. test_password_visibility: \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432 \u043f\u0430\u0440\u043e\u043b\u044f\n    \"\"\"\n\n    def test_successful_login(self, browser: Page) -> None:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0443\u0441\u043f\u0435\u0448\u043d\u044b\u0439 \u0432\u0445\u043e\u0434 \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0443.\n\n        Args:\n            browser: \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.\n        \"\"\"\n\n        lp = LoginPage(browser)\n        lp.do_login()\n\n    def test_unsuccessful_login(self, browser: Page) -> None:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u0445\u043e\u0434 \u0441 \u043d\u0435\u0432\u0435\u0440\u043d\u044b\u043c\u0438 \u0443\u0447\u0435\u0442\u043d\u044b\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u043c\u0438.\n\n        Args:\n            browser: \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.\n        \"\"\"\n\n        lp = LoginPage(browser)\n        lp.do_unsuccessful_login()\n\n    def test_successful_login_and_logout(self, browser: Page) -> None:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0443\u0441\u043f\u0435\u0448\u043d\u044b\u0439 \u0432\u0445\u043e\u0434 \u0438 \u0432\u044b\u0445\u043e\u0434 \u0438\u0437 \u0441\u0438\u0441\u0442\u0435\u043c\u044b.\n\n        Args:\n            browser: \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.\n        \"\"\"\n\n        lp = LoginPage(browser)\n        lp.do_login()\n\n        mp = MainPage(browser)\n        mp.do_logout()\n\n    def test_password_visibility(self, browser: Page) -> None:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432 \u043f\u0430\u0440\u043e\u043b\u044f.\n\n        Args:\n            browser: \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.\n        \"\"\"\n\n        lp = LoginPage(browser)\n        lp.open(\"\")\n\n        is_hidden_icon = lp.is_password_icon_hidden()\n\n        if is_hidden_icon:\n            is_hidden = lp.is_password_hidden()\n            assert is_hidden, \"Password should be hidden\"\n\n            # \u041d\u0430\u0436\u0430\u0442\u0438\u0435 \u043d\u0430 \u0438\u043a\u043e\u043d\u043a\u0443 \u0441\u043a\u0440\u044b\u0442\u0438\u044f \u043f\u0430\u0440\u043e\u043b\u044f, \u043f\u0430\u0440\u043e\u043b\u044c \u0432\u0438\u0434\u0438\u043c\n            lp.click_password_hidden_icon()\n            is_hidden_icon = lp.is_password_icon_hidden()\n            is_hidden = lp.is_password_hidden()\n\n            assert not is_hidden_icon, \"Password hidden icon should not be in hidden state\"\n            assert not is_hidden, \"Password should be visible\"\n        else:\n            is_hidden = lp.is_password_hidden()\n            assert not is_hidden, \"Password should be visible\"\n\n            # \u041d\u0430\u0436\u0430\u0442\u0438\u0435 \u043d\u0430 \u0438\u043a\u043e\u043d\u043a\u0443 \u0441\u043a\u0440\u044b\u0442\u0438\u044f \u043f\u0430\u0440\u043e\u043b\u044f, \u043f\u0430\u0440\u043e\u043b\u044c \u0441\u043a\u0440\u044b\u0442\n            lp.click_password_hidden_icon()\n            is_hidden_icon = lp.is_password_icon_hidden()\n            is_hidden = lp.is_password_hidden()\n\n            assert is_hidden_icon, \"Password hidden icon should be in hidden state\"\n            assert is_hidden, \"Password should be hidden\"\n
    "},{"location":"tests/e2e/test_login/#tests.e2e.test_login.TestLogin.test_password_visibility","title":"test_password_visibility(browser)","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432 \u043f\u0430\u0440\u043e\u043b\u044f.

    Parameters:

    Name Type Description Default browser Page

    \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.

    required Source code in tests\\e2e\\test_login.py
    def test_password_visibility(self, browser: Page) -> None:\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432 \u043f\u0430\u0440\u043e\u043b\u044f.\n\n    Args:\n        browser: \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.\n    \"\"\"\n\n    lp = LoginPage(browser)\n    lp.open(\"\")\n\n    is_hidden_icon = lp.is_password_icon_hidden()\n\n    if is_hidden_icon:\n        is_hidden = lp.is_password_hidden()\n        assert is_hidden, \"Password should be hidden\"\n\n        # \u041d\u0430\u0436\u0430\u0442\u0438\u0435 \u043d\u0430 \u0438\u043a\u043e\u043d\u043a\u0443 \u0441\u043a\u0440\u044b\u0442\u0438\u044f \u043f\u0430\u0440\u043e\u043b\u044f, \u043f\u0430\u0440\u043e\u043b\u044c \u0432\u0438\u0434\u0438\u043c\n        lp.click_password_hidden_icon()\n        is_hidden_icon = lp.is_password_icon_hidden()\n        is_hidden = lp.is_password_hidden()\n\n        assert not is_hidden_icon, \"Password hidden icon should not be in hidden state\"\n        assert not is_hidden, \"Password should be visible\"\n    else:\n        is_hidden = lp.is_password_hidden()\n        assert not is_hidden, \"Password should be visible\"\n\n        # \u041d\u0430\u0436\u0430\u0442\u0438\u0435 \u043d\u0430 \u0438\u043a\u043e\u043d\u043a\u0443 \u0441\u043a\u0440\u044b\u0442\u0438\u044f \u043f\u0430\u0440\u043e\u043b\u044f, \u043f\u0430\u0440\u043e\u043b\u044c \u0441\u043a\u0440\u044b\u0442\n        lp.click_password_hidden_icon()\n        is_hidden_icon = lp.is_password_icon_hidden()\n        is_hidden = lp.is_password_hidden()\n\n        assert is_hidden_icon, \"Password hidden icon should be in hidden state\"\n        assert is_hidden, \"Password should be hidden\"\n
    "},{"location":"tests/e2e/test_login/#tests.e2e.test_login.TestLogin.test_successful_login","title":"test_successful_login(browser)","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0443\u0441\u043f\u0435\u0448\u043d\u044b\u0439 \u0432\u0445\u043e\u0434 \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0443.

    Parameters:

    Name Type Description Default browser Page

    \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.

    required Source code in tests\\e2e\\test_login.py
    def test_successful_login(self, browser: Page) -> None:\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0443\u0441\u043f\u0435\u0448\u043d\u044b\u0439 \u0432\u0445\u043e\u0434 \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0443.\n\n    Args:\n        browser: \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.\n    \"\"\"\n\n    lp = LoginPage(browser)\n    lp.do_login()\n
    "},{"location":"tests/e2e/test_login/#tests.e2e.test_login.TestLogin.test_successful_login_and_logout","title":"test_successful_login_and_logout(browser)","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0443\u0441\u043f\u0435\u0448\u043d\u044b\u0439 \u0432\u0445\u043e\u0434 \u0438 \u0432\u044b\u0445\u043e\u0434 \u0438\u0437 \u0441\u0438\u0441\u0442\u0435\u043c\u044b.

    Parameters:

    Name Type Description Default browser Page

    \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.

    required Source code in tests\\e2e\\test_login.py
    def test_successful_login_and_logout(self, browser: Page) -> None:\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0443\u0441\u043f\u0435\u0448\u043d\u044b\u0439 \u0432\u0445\u043e\u0434 \u0438 \u0432\u044b\u0445\u043e\u0434 \u0438\u0437 \u0441\u0438\u0441\u0442\u0435\u043c\u044b.\n\n    Args:\n        browser: \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.\n    \"\"\"\n\n    lp = LoginPage(browser)\n    lp.do_login()\n\n    mp = MainPage(browser)\n    mp.do_logout()\n
    "},{"location":"tests/e2e/test_login/#tests.e2e.test_login.TestLogin.test_unsuccessful_login","title":"test_unsuccessful_login(browser)","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u0445\u043e\u0434 \u0441 \u043d\u0435\u0432\u0435\u0440\u043d\u044b\u043c\u0438 \u0443\u0447\u0435\u0442\u043d\u044b\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u043c\u0438.

    Parameters:

    Name Type Description Default browser Page

    \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.

    required Source code in tests\\e2e\\test_login.py
    def test_unsuccessful_login(self, browser: Page) -> None:\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u0445\u043e\u0434 \u0441 \u043d\u0435\u0432\u0435\u0440\u043d\u044b\u043c\u0438 \u0443\u0447\u0435\u0442\u043d\u044b\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u043c\u0438.\n\n    Args:\n        browser: \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.\n    \"\"\"\n\n    lp = LoginPage(browser)\n    lp.do_unsuccessful_login()\n
    "},{"location":"tests/e2e/test_service_status_tab/","title":"TestServiceStatusTab","text":"

    \u041c\u043e\u0434\u0443\u043b\u044c \u0442\u0435\u0441\u0442\u043e\u0432 \u0432\u043a\u043b\u0430\u0434\u043a\u0438 '\u0421\u0442\u0430\u0442\u0443\u0441 \u043e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u043d\u0438\u044f'.

    \u0421\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0442\u0435\u0441\u0442\u044b \u0434\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0432\u043a\u043b\u0430\u0434\u043a\u0438 \u0441\u0442\u0430\u0442\u0443\u0441\u043e\u0432 \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432.

    "},{"location":"tests/e2e/test_service_status_tab/#tests.e2e.test_service_status_tab.TestServiceStatusTab","title":"TestServiceStatusTab","text":"

    \u041a\u043b\u0430\u0441\u0441 \u0442\u0435\u0441\u0442\u043e\u0432 \u0434\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0432\u043a\u043b\u0430\u0434\u043a\u0438 '\u0421\u0442\u0430\u0442\u0443\u0441 \u043e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u043d\u0438\u044f'.

    \u0422\u0435\u0441\u0442\u044b \u043f\u043e\u043a\u0440\u044b\u0432\u0430\u044e\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0438: 1. test_service_status_tab_content: \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u0432\u043a\u043b\u0430\u0434\u043a\u0438 '\u0421\u0442\u0430\u0442\u0443\u0441 \u043e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u043d\u0438\u044f' 2. test_service_status_table_row_highlighting: \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0441\u0442\u0440\u043e\u043a \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435 \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432

    Source code in tests\\e2e\\test_service_status_tab.py
    class TestServiceStatusTab:\n    \"\"\"\u041a\u043b\u0430\u0441\u0441 \u0442\u0435\u0441\u0442\u043e\u0432 \u0434\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0432\u043a\u043b\u0430\u0434\u043a\u0438 '\u0421\u0442\u0430\u0442\u0443\u0441 \u043e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u043d\u0438\u044f'.\n\n    \u0422\u0435\u0441\u0442\u044b \u043f\u043e\u043a\u0440\u044b\u0432\u0430\u044e\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0438:\n    1. test_service_status_tab_content: \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u0432\u043a\u043b\u0430\u0434\u043a\u0438 '\u0421\u0442\u0430\u0442\u0443\u0441 \u043e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u043d\u0438\u044f'\n    2. test_service_status_table_row_highlighting: \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0441\u0442\u0440\u043e\u043a \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435 \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432\n    \"\"\"\n\n    @pytest.fixture(scope=\"function\", autouse=True)\n    def setup(self, browser: Page):\n        \"\"\"\u041f\u043e\u0434\u0433\u043e\u0442\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442 \u0442\u0435\u0441\u0442\u043e\u0432\u043e\u0435 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0435.\n\n        Args:\n            browser: \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.\n        \"\"\"\n\n        lp = LoginPage(browser)\n        lp.do_login()\n\n        # \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u043d\u0430 \u0433\u043b\u0430\u0432\u043d\u0443\u044e \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0443\n        mp = MainPage(browser)\n\n        # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043d\u0430\u043b\u0438\u0447\u0438\u044f \u043f\u0430\u043d\u0435\u043b\u0438 \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438\n        mp.should_be_navigation_panel()\n\n        # \u041a\u043b\u0438\u043a \u043f\u043e \u043f\u0443\u043d\u043a\u0442\u0443 '\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438' \u0432 \u0433\u043b\u0430\u0432\u043d\u043e\u0439 \u043f\u0430\u043d\u0435\u043b\u0438 \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438\n        mp.click_main_navigation_panel_item(\"\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438\")\n\n        # \u041a\u043b\u0438\u043a \u043f\u043e \u043f\u0443\u043d\u043a\u0442\u0443 '\u041e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u043d\u0438\u0435 \u0438 \u0434\u0438\u0430\u0433\u043d\u043e\u0441\u0442\u0438\u043a\u0430' \u0432 \u043f\u0430\u043d\u0435\u043b\u0438 \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438 \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043a\n        mp.click_subpanel_item(\"\u041e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u043d\u0438\u0435 \u0438 \u0434\u0438\u0430\u0433\u043d\u043e\u0441\u0442\u0438\u043a\u0430\")\n\n        # \u041a\u043b\u0438\u043a \u043f\u043e \u043f\u0443\u043d\u043a\u0442\u0443 '\u0421\u0442\u0430\u0442\u0443\u0441 \u043e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u043d\u0438\u044f' \u0432 \u043f\u0430\u043d\u0435\u043b\u0438 \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438 \u043e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u043d\u0438\u044f\n        mp.click_subpanel_item(\"\u0421\u0442\u0430\u0442\u0443\u0441 \u043e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u043d\u0438\u044f\")\n\n    def test_service_status_tab_content(self, browser: Page):\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u0432\u043a\u043b\u0430\u0434\u043a\u0438 '\u0421\u0442\u0430\u0442\u0443\u0441 \u043e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u043d\u0438\u044f'.\n\n        Args:\n            browser: \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.\n        \"\"\"\n\n        sst = ServiceStatusTab(browser)\n\n        # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0442\u0443\u043b\u0431\u0430\u0440\u0430 \u0432\u043a\u043b\u0430\u0434\u043a\u0438\n        sst.should_be_toolbar()\n\n        # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043d\u0430\u043b\u0438\u0447\u0438\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0441\u0442\u0430\u0442\u0443\u0441\u043e\u0432 \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432\n        sst.should_be_services_table()\n\n        # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0433\u043e \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432\n        sst.check_services_table_content()\n\n    def test_service_status_table_row_highlighting(self, browser: Page):\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0441\u0442\u0440\u043e\u043a \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435 \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432.\n\n        Args:\n            browser: \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.\n        \"\"\"\n\n        sst = ServiceStatusTab(browser)\n\n        # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0442\u0443\u043b\u0431\u0430\u0440\u0430 \u0432\u043a\u043b\u0430\u0434\u043a\u0438\n        sst.should_be_toolbar()\n\n        # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043d\u0430\u043b\u0438\u0447\u0438\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0441\u0442\u0430\u0442\u0443\u0441\u043e\u0432 \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432\n        sst.should_be_services_table()\n\n        # \u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0430 \u0441\u0442\u0440\u043e\u043a \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435\n        rows_count = sst.get_rows_count()\n\n        # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0441\u0442\u0440\u043e\u043a\n        sst.check_services_table_row_highlighting(0)\n        sst.check_services_table_row_highlighting(rows_count - 1)\n        sst.check_services_table_row_highlighting(int(rows_count / 2))\n
    "},{"location":"tests/e2e/test_service_status_tab/#tests.e2e.test_service_status_tab.TestServiceStatusTab.setup","title":"setup(browser)","text":"

    \u041f\u043e\u0434\u0433\u043e\u0442\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442 \u0442\u0435\u0441\u0442\u043e\u0432\u043e\u0435 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0435.

    Parameters:

    Name Type Description Default browser Page

    \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.

    required Source code in tests\\e2e\\test_service_status_tab.py
    @pytest.fixture(scope=\"function\", autouse=True)\ndef setup(self, browser: Page):\n    \"\"\"\u041f\u043e\u0434\u0433\u043e\u0442\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442 \u0442\u0435\u0441\u0442\u043e\u0432\u043e\u0435 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0435.\n\n    Args:\n        browser: \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.\n    \"\"\"\n\n    lp = LoginPage(browser)\n    lp.do_login()\n\n    # \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u043d\u0430 \u0433\u043b\u0430\u0432\u043d\u0443\u044e \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0443\n    mp = MainPage(browser)\n\n    # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043d\u0430\u043b\u0438\u0447\u0438\u044f \u043f\u0430\u043d\u0435\u043b\u0438 \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438\n    mp.should_be_navigation_panel()\n\n    # \u041a\u043b\u0438\u043a \u043f\u043e \u043f\u0443\u043d\u043a\u0442\u0443 '\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438' \u0432 \u0433\u043b\u0430\u0432\u043d\u043e\u0439 \u043f\u0430\u043d\u0435\u043b\u0438 \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438\n    mp.click_main_navigation_panel_item(\"\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438\")\n\n    # \u041a\u043b\u0438\u043a \u043f\u043e \u043f\u0443\u043d\u043a\u0442\u0443 '\u041e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u043d\u0438\u0435 \u0438 \u0434\u0438\u0430\u0433\u043d\u043e\u0441\u0442\u0438\u043a\u0430' \u0432 \u043f\u0430\u043d\u0435\u043b\u0438 \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438 \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043a\n    mp.click_subpanel_item(\"\u041e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u043d\u0438\u0435 \u0438 \u0434\u0438\u0430\u0433\u043d\u043e\u0441\u0442\u0438\u043a\u0430\")\n\n    # \u041a\u043b\u0438\u043a \u043f\u043e \u043f\u0443\u043d\u043a\u0442\u0443 '\u0421\u0442\u0430\u0442\u0443\u0441 \u043e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u043d\u0438\u044f' \u0432 \u043f\u0430\u043d\u0435\u043b\u0438 \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438 \u043e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u043d\u0438\u044f\n    mp.click_subpanel_item(\"\u0421\u0442\u0430\u0442\u0443\u0441 \u043e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u043d\u0438\u044f\")\n
    "},{"location":"tests/e2e/test_service_status_tab/#tests.e2e.test_service_status_tab.TestServiceStatusTab.test_service_status_tab_content","title":"test_service_status_tab_content(browser)","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u0432\u043a\u043b\u0430\u0434\u043a\u0438 '\u0421\u0442\u0430\u0442\u0443\u0441 \u043e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u043d\u0438\u044f'.

    Parameters:

    Name Type Description Default browser Page

    \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.

    required Source code in tests\\e2e\\test_service_status_tab.py
    def test_service_status_tab_content(self, browser: Page):\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u0432\u043a\u043b\u0430\u0434\u043a\u0438 '\u0421\u0442\u0430\u0442\u0443\u0441 \u043e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u043d\u0438\u044f'.\n\n    Args:\n        browser: \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.\n    \"\"\"\n\n    sst = ServiceStatusTab(browser)\n\n    # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0442\u0443\u043b\u0431\u0430\u0440\u0430 \u0432\u043a\u043b\u0430\u0434\u043a\u0438\n    sst.should_be_toolbar()\n\n    # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043d\u0430\u043b\u0438\u0447\u0438\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0441\u0442\u0430\u0442\u0443\u0441\u043e\u0432 \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432\n    sst.should_be_services_table()\n\n    # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0433\u043e \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432\n    sst.check_services_table_content()\n
    "},{"location":"tests/e2e/test_service_status_tab/#tests.e2e.test_service_status_tab.TestServiceStatusTab.test_service_status_table_row_highlighting","title":"test_service_status_table_row_highlighting(browser)","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0441\u0442\u0440\u043e\u043a \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435 \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432.

    Parameters:

    Name Type Description Default browser Page

    \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.

    required Source code in tests\\e2e\\test_service_status_tab.py
    def test_service_status_table_row_highlighting(self, browser: Page):\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0441\u0442\u0440\u043e\u043a \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435 \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432.\n\n    Args:\n        browser: \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.\n    \"\"\"\n\n    sst = ServiceStatusTab(browser)\n\n    # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0442\u0443\u043b\u0431\u0430\u0440\u0430 \u0432\u043a\u043b\u0430\u0434\u043a\u0438\n    sst.should_be_toolbar()\n\n    # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043d\u0430\u043b\u0438\u0447\u0438\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0441\u0442\u0430\u0442\u0443\u0441\u043e\u0432 \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432\n    sst.should_be_services_table()\n\n    # \u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0430 \u0441\u0442\u0440\u043e\u043a \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435\n    rows_count = sst.get_rows_count()\n\n    # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0441\u0442\u0440\u043e\u043a\n    sst.check_services_table_row_highlighting(0)\n    sst.check_services_table_row_highlighting(rows_count - 1)\n    sst.check_services_table_row_highlighting(int(rows_count / 2))\n
    "},{"location":"tests/e2e/test_sessions_tab/","title":"TestSessionTab","text":"

    \u041c\u043e\u0434\u0443\u043b\u044c \u0442\u0435\u0441\u0442\u043e\u0432 \u0432\u043a\u043b\u0430\u0434\u043a\u0438 '\u0421\u0435\u0430\u043d\u0441\u044b'.

    \u0421\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0442\u0435\u0441\u0442\u044b \u0434\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0442\u0441\u043a\u0438\u043c\u0438 \u0441\u0435\u0430\u043d\u0441\u0430\u043c\u0438.

    "},{"location":"tests/e2e/test_sessions_tab/#tests.e2e.test_sessions_tab.TestSessionsTab","title":"TestSessionsTab","text":"

    \u041d\u0430\u0431\u043e\u0440 \u0442\u0435\u0441\u0442\u043e\u0432 \u0434\u043b\u044f \u0432\u043a\u043b\u0430\u0434\u043a\u0438 '\u0421\u0435\u0430\u043d\u0441\u044b'.

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0441\u0442\u044c \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0432\u043a\u043b\u0430\u0434\u043a\u0438 \u0441\u0435\u0430\u043d\u0441\u043e\u0432, \u0432\u043a\u043b\u044e\u0447\u0430\u044f \u0440\u0430\u0431\u043e\u0442\u0443 \u0441 \u0441\u0435\u0430\u043d\u0441\u0430\u043c\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439, \u0438\u0445 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435, \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u0438 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0443\u044e \u043e\u0447\u0438\u0441\u0442\u043a\u0443.

    \u0422\u0435\u0441\u0442\u044b \u043f\u043e\u043a\u0440\u044b\u0432\u0430\u044e\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0438: 1. test_sessions_tab_content: \u0422\u0435\u0441\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0433\u043e \u0432\u043a\u043b\u0430\u0434\u043a\u0438 '\u0421\u0435\u0430\u043d\u0441\u044b' 2. test_delete_session_confirm_window: \u0422\u0435\u0441\u0442 \u043e\u043a\u043d\u0430 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u044f \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u0441\u0435\u0430\u043d\u0441\u0430 3. test_delete_session_after_logout: \u0422\u0435\u0441\u0442 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u0441\u0435\u0430\u043d\u0441\u0430 \u043f\u043e\u0441\u043b\u0435 \u0432\u044b\u0445\u043e\u0434\u0430 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0438\u0437 \u0441\u0438\u0441\u0442\u0435\u043c\u044b 4. test_delete_existed_session: \u0422\u0435\u0441\u0442 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u043e\u0433\u043e \u0441\u0435\u0430\u043d\u0441\u0430 5 test_multiple_users_sessions: \u0422\u0435\u0441\u0442 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 \u0438 \u0438\u0445 \u0441\u0435\u0430\u043d\u0441\u043e\u0432 6. test_session_removed_when_user_deleted: \u0422\u0435\u0441\u0442 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u0441\u0435\u0430\u043d\u0441\u0430 \u043f\u0440\u0438 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f 7. test_session_auto_deletion_after_15_minutes: \u0422\u0435\u0441\u0442 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u0441\u0435\u0430\u043d\u0441\u0430 \u0447\u0435\u0440\u0435\u0437 15 \u043c\u0438\u043d\u0443\u0442 \u043f\u043e\u0441\u043b\u0435 \u0432\u044b\u0445\u043e\u0434\u0430 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f 8. test_user_cannot_delete_own_session: \u0422\u0435\u0441\u0442 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u043d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u0441\u0432\u043e\u0439 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u0441\u0435\u0430\u043d\u0441

    Source code in tests\\e2e\\test_sessions_tab.py
    class TestSessionsTab:\n    \"\"\"\u041d\u0430\u0431\u043e\u0440 \u0442\u0435\u0441\u0442\u043e\u0432 \u0434\u043b\u044f \u0432\u043a\u043b\u0430\u0434\u043a\u0438 '\u0421\u0435\u0430\u043d\u0441\u044b'.\n\n    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0441\u0442\u044c \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0432\u043a\u043b\u0430\u0434\u043a\u0438 \u0441\u0435\u0430\u043d\u0441\u043e\u0432,\n    \u0432\u043a\u043b\u044e\u0447\u0430\u044f \u0440\u0430\u0431\u043e\u0442\u0443 \u0441 \u0441\u0435\u0430\u043d\u0441\u0430\u043c\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439, \u0438\u0445 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435, \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u0438 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0443\u044e \u043e\u0447\u0438\u0441\u0442\u043a\u0443.\n\n    \u0422\u0435\u0441\u0442\u044b \u043f\u043e\u043a\u0440\u044b\u0432\u0430\u044e\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0438:\n    1. test_sessions_tab_content: \u0422\u0435\u0441\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0433\u043e \u0432\u043a\u043b\u0430\u0434\u043a\u0438 '\u0421\u0435\u0430\u043d\u0441\u044b'\n    2. test_delete_session_confirm_window: \u0422\u0435\u0441\u0442 \u043e\u043a\u043d\u0430 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u044f \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u0441\u0435\u0430\u043d\u0441\u0430\n    3. test_delete_session_after_logout: \u0422\u0435\u0441\u0442 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u0441\u0435\u0430\u043d\u0441\u0430 \u043f\u043e\u0441\u043b\u0435 \u0432\u044b\u0445\u043e\u0434\u0430 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0438\u0437 \u0441\u0438\u0441\u0442\u0435\u043c\u044b\n    4. test_delete_existed_session: \u0422\u0435\u0441\u0442 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u043e\u0433\u043e \u0441\u0435\u0430\u043d\u0441\u0430\n    5 test_multiple_users_sessions: \u0422\u0435\u0441\u0442 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 \u0438 \u0438\u0445 \u0441\u0435\u0430\u043d\u0441\u043e\u0432\n    6. test_session_removed_when_user_deleted: \u0422\u0435\u0441\u0442 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u0441\u0435\u0430\u043d\u0441\u0430 \u043f\u0440\u0438 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\n    7. test_session_auto_deletion_after_15_minutes: \u0422\u0435\u0441\u0442 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u0441\u0435\u0430\u043d\u0441\u0430 \u0447\u0435\u0440\u0435\u0437 15 \u043c\u0438\u043d\u0443\u0442 \u043f\u043e\u0441\u043b\u0435 \u0432\u044b\u0445\u043e\u0434\u0430 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\n    8. test_user_cannot_delete_own_session: \u0422\u0435\u0441\u0442 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u043d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u0441\u0432\u043e\u0439 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u0441\u0435\u0430\u043d\u0441\n    \"\"\"\n\n\n    @pytest.fixture(scope=\"function\", autouse=True)\n    def setup(self, browser: Page) -> None:\n        \"\"\"\u0424\u0438\u043a\u0441\u0442\u0443\u0440\u0430 \u0434\u043b\u044f \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0438 \u0442\u0435\u0441\u0442\u043e\u0432\u043e\u0433\u043e \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f.\n\n        \u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442:\n        1. \u0410\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u044e \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0435\n        2. \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u043d\u0430 \u0432\u043a\u043b\u0430\u0434\u043a\u0443 '\u0421\u0435\u0430\u043d\u0441\u044b' \u0447\u0435\u0440\u0435\u0437 \u043f\u0430\u043d\u0435\u043b\u044c \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438\n        \"\"\"\n        # \u0410\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u044f \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0435\n        login_page = LoginPage(browser)\n        login_page.do_login()\n\n        # \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0433\u043b\u0430\u0432\u043d\u043e\u0439 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b\n        main_page = MainPage(browser)\n\n        # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0438 \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u0441 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u043c\u0438 \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438\n        main_page.should_be_navigation_panel()\n        main_page.click_main_navigation_panel_item(\"\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438\")\n        main_page.click_subpanel_item(\"\u041e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u043d\u0438\u0435 \u0438 \u0434\u0438\u0430\u0433\u043d\u043e\u0441\u0442\u0438\u043a\u0430\")\n        main_page.click_subpanel_item(\"\u0421\u0435\u0430\u043d\u0441\u044b\")\n\n    @pytest.fixture(scope=\"function\")\n    def cleanup_users(self, browser: Page) -> None:\n        \"\"\"\u0424\u0438\u043a\u0441\u0442\u0443\u0440\u0430 \u0434\u043b\u044f \u043e\u0447\u0438\u0441\u0442\u043a\u0438 \u0442\u0435\u0441\u0442\u043e\u0432\u044b\u0445 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 \u0438 \u0438\u0445 \u0441\u0435\u0430\u043d\u0441\u043e\u0432 \u043f\u043e\u0441\u043b\u0435 \u0442\u0435\u0441\u0442\u0430.\"\"\"\n        yield\n\n        # \u0412\u044b\u0445\u043e\u0434 \u0438\u0437 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\n        mp = MainPage(browser)\n        mp.do_logout()\n\n        # \u0410\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u044f \u0430\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440\u043e\u043c \u0434\u043b\u044f \u043e\u0447\u0438\u0441\u0442\u043a\u0438\n        login_page = LoginPage(browser)\n        login_page.do_login()\n\n        # \u0423\u0434\u0430\u043b\u044f\u0435\u043c \u0442\u0435\u0441\u0442\u043e\u0432\u044b\u0445 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439\n        self._cleanup_test_users(browser)\n\n    def _cleanup_test_users(self, browser: Page) -> None:\n        \"\"\"\u0423\u0434\u0430\u043b\u044f\u0435\u0442 \u0442\u0435\u0441\u0442\u043e\u0432\u044b\u0445 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439.\"\"\"\n        mp = MainPage(browser)\n        mp.click_main_navigation_panel_item(\"\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438\")\n        mp.click_subpanel_item(\"\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438\")\n        ut = UsersTab(browser)\n\n        # \u0423\u0434\u0430\u043b\u044f\u0435\u043c \u0442\u0435\u0441\u0442\u043e\u0432\u044b\u0445 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439\n        test_users = [\"TestUser1\", \"TestUser2\", \"TestUser3\", \"TestUserForSessionDeletion\",\n                     \"TestUserForManualDeletion\", \"UserForAutoSessionDeletion\",\n                     \"TestUserFor15MinDeletion\", \"TestUserForSelfDeletion\"]\n\n        for user_name in test_users:\n            # \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u043b\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u0438 \u0443\u0434\u0430\u043b\u044f\u0435\u043c \u0435\u0433\u043e\n            user_index = ut.find_user_in_table(user_name, \"\u0410\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440\")\n            if user_index != -1:\n                ut.open_edit_user_page_by_user(user_name, \"\u0410\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440\")\n                ut.delete_user(user_name)\n\n    def test_sessions_tab_content(self, browser: Page) -> None:\n        \"\"\"\u0422\u0435\u0441\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0433\u043e \u0432\u043a\u043b\u0430\u0434\u043a\u0438 '\u0421\u0435\u0430\u043d\u0441\u044b'.\n\n        \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442:\n        1. \u041d\u0430\u043b\u0438\u0447\u0438\u0435 \u0438 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0441\u0442\u044c \u0442\u0443\u043b\u0431\u0430\u0440\u0430\n        2. \u041d\u0430\u043b\u0438\u0447\u0438\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0441\u0435\u0430\u043d\u0441\u043e\u0432\n        3. \u0421\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0433\u043e \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0434\u0430\u043d\u043d\u044b\u043c \u0438\u0437 \u0411\u0414\n        \"\"\"\n        # \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u0441\u0435\u0430\u043d\u0441\u043e\u0432\n        sessions_tab = SessionsTab(browser)\n\n        # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430\n        sessions_tab.should_be_toolbar()\n        sessions_tab.should_be_sessions_table()\n\n        # \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c API \u043e\u0442\u0432\u0435\u0442\n        response = sessions_tab.send_get_api_request(\"e-nms/auth/sessions\")\n        response_body = sessions_tab.get_response_body(response)\n\n        if not response_body:\n            print(\"No sessions data from API - table might be empty\")\n            # \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u0442\u043e\u043b\u044c\u043a\u043e \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0438\n            sessions_tab.check_sessions_table_content(verify=False)\n        else:\n            sessions_tab.check_sessions_table_content(verify=True)\n\n        # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0433\u043e \u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u0441 \u0432\u0435\u0440\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0435\u0439 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438\u0437 \u0411\u0414\n        sessions_tab.check_sessions_table_content(verify=True)\n\n\n    def test_delete_session_confirm_window(self, browser: Page) -> None:\n        \"\"\"\u0422\u0435\u0441\u0442 \u043e\u043a\u043d\u0430 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u044f \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u0441\u0435\u0430\u043d\u0441\u0430.\n\n        \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442:\n        1. \u041d\u0430\u043b\u0438\u0447\u0438\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0441\u0435\u0430\u043d\u0441\u043e\u0432\n        2. \u0421\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u043e\u043a\u043d\u0430 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u044f \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u0441\u0435\u0430\u043d\u0441\u0430\n        3. \u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0433\u043e\u0440\u0438\u0437\u043e\u043d\u0442\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0441\u043a\u0440\u043e\u043b\u043b\u0438\u043d\u0433\u0430 \u0432 \u043e\u043a\u043d\u0435 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u044f\n        4. \u041a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0441\u0442\u044c \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430 \u0432 \u043e\u043a\u043d\u0435 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u044f\n        5. \u0424\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u043a\u043d\u043e\u043f\u043e\u043a \u0432 \u043e\u043a\u043d\u0435 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u044f \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f\n        \"\"\"\n        # \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u0441\u0435\u0430\u043d\u0441\u043e\u0432\n        sessions_tab = SessionsTab(browser)\n\n        # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043d\u0430\u043b\u0438\u0447\u0438\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0441\u0435\u0430\u043d\u0441\u043e\u0432\n        sessions_tab.should_be_sessions_table()\n\n        # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043a\u043e\u043d\u0442\u0435\u043d\u0442\u0430 \u0438 \u0441\u043a\u0440\u043e\u043b\u043b\u0438\u043d\u0433\u0430 \u043e\u043a\u043d\u0430 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u044f \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u0441\u0435\u0430\u043d\u0441\u0430\n        sessions_tab.check_delete_session_confirm_window()\n\n    @pytest.mark.skip(reason=\"\u041d\u0435 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u043e \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u043c, \u0437\u0430\u0432\u0435\u0434\u0435\u043d \u0442\u0438\u043a\u0435\u0442\")\n    def test_delete_session_after_logout(self, browser: Page, cleanup_users: None) -> None:\n        \"\"\"\u0422\u0435\u0441\u0442 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u0441\u0435\u0430\u043d\u0441\u0430 \u043f\u043e\u0441\u043b\u0435 \u0432\u044b\u0445\u043e\u0434\u0430 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0438\u0437 \u0441\u0438\u0441\u0442\u0435\u043c\u044b.\n\n        \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442:\n        1. \u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043d\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\n        2. \u0412\u0445\u043e\u0434 \u043d\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0443\n        3. \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043d\u0430\u043b\u0438\u0447\u0438\u044f \u0441\u0435\u0430\u043d\u0441\u0430 \u043d\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\n        4. \u0412\u044b\u0445\u043e\u0434 \u043d\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0438\u0437 \u0441\u0438\u0441\u0442\u0435\u043c\u044b (logout)\n        5. \u0412\u0445\u043e\u0434 \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0443 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f admin\n        6. \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u044f \u0441\u0435\u0430\u043d\u0441\u0430 \u043d\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\n        7. \u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0444\u0438\u043a\u0441\u0442\u0443\u0440\u043e\u0439 cleanup_users\n        \"\"\"\n        user_data = {\"name\": \"TestUserForSessionDeletion\", \"role\": \"\u0410\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440\", \"password\": \"qwerty\"}\n\n        mp = MainPage(browser)\n        ut = UsersTab(browser)\n\n        # \u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043d\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\n        mp.click_subpanel_item(\"\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438\")\n        ut.open_add_user_window()\n        ut.add_new_user(user_data)\n\n        # \u041e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u0441\u043f\u0438\u0441\u043a\u0430 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 (\u0434\u0432\u043e\u0439\u043d\u043e\u0439 \u043a\u043b\u0438\u043a - \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u0431\u0430\u0433?)\n        mp.click_subpanel_item(\"\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438\")\n        mp.click_subpanel_item(\"\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438\")\n\n        # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043d\u0430\u043b\u0438\u0447\u0438\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435\n        ut.should_be_user_in_table(user_data[\"name\"], user_data[\"role\"])\n\n        # \u0412\u0445\u043e\u0434 \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0443 \u0434\u043b\u044f \u043d\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\n        new_lp = LoginPage(browser)\n        new_lp.do_login(username=user_data[\"name\"], password=user_data[\"password\"])\n\n        # \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0433\u043b\u0430\u0432\u043d\u043e\u0439 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b\n        new_mp = MainPage(browser)\n\n        # \u041e\u0442\u043a\u0440\u044b\u0442\u044c \u0432\u043a\u043b\u0430\u0434\u043a\u0443 \u0421\u0435\u0441\u0441\u0438\u0438\n        new_mp.should_be_navigation_panel()\n        new_mp.click_main_navigation_panel_item(\"\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438\")\n        new_mp.click_subpanel_item(\"\u041e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u043d\u0438\u0435 \u0438 \u0434\u0438\u0430\u0433\u043d\u043e\u0441\u0442\u0438\u043a\u0430\")\n        new_mp.click_subpanel_item(\"\u0421\u0435\u0430\u043d\u0441\u044b\")\n\n        # \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u0441\u0435\u0430\u043d\u0441\u043e\u0432\n        st = SessionsTab(browser)\n\n        # # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043d\u0430\u043b\u0438\u0447\u0438\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0441\u0435\u0430\u043d\u0441\u043e\u0432\n        st.should_be_sessions_table()\n\n        # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043d\u0430\u043b\u0438\u0447\u0438\u044f \u0437\u0430\u043f\u0438\u0441\u0438 \u043e \u0441\u0435\u0430\u043d\u0441\u0435 \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\n        session_token = st.get_session_token()\n        st.should_be_session_in_table(session_token)\n\n        # logout\n        new_mp.do_logout()\n\n        # \u0410\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u044f \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0435 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\n        admin_lp = LoginPage(browser)\n        admin_lp.do_login()\n\n        # \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0433\u043b\u0430\u0432\u043d\u043e\u0439 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b\n        admin_mp = MainPage(browser)\n\n        # \u041e\u0442\u043a\u0440\u044b\u0442\u044c \u0432\u043a\u043b\u0430\u0434\u043a\u0443 \u0421\u0435\u0430\u043d\u0441\u044b\n        admin_mp.should_be_navigation_panel()\n        admin_mp.click_main_navigation_panel_item(\"\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438\")\n        admin_mp.click_subpanel_item(\"\u041e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u043d\u0438\u0435 \u0438 \u0434\u0438\u0430\u0433\u043d\u043e\u0441\u0442\u0438\u043a\u0430\")\n        admin_mp.click_subpanel_item(\"\u0421\u0435\u0430\u043d\u0441\u044b\")\n\n        # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043d\u0430\u043b\u0438\u0447\u0438\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u0441\u0435\u0430\u043d\u0441\u043e\u0432\n        st.should_be_sessions_table()\n\n        # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u044f \u0437\u0430\u043f\u0438\u0441\u0438 \u043e \u0441\u0435\u0441\u0441\u0438\u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u043f\u043e\u0441\u043b\u0435 \u0432\u044b\u0445\u043e\u0434\u0430 \u0438\u0437 \u0441\u0438\u0441\u0442\u0435\u043c\u044b\n        st.should_not_be_session_in_table(session_token)\n\n        # \u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0444\u0438\u043a\u0441\u0442\u0443\u0440\u043e\u0439 cleanup_users \u043f\u043e\u0441\u043b\u0435 \u0442\u0435\u0441\u0442\u0430\n\n    def test_delete_existed_session(self, browser: Page, cleanup_users: None) -> None:\n        \"\"\"\u0422\u0435\u0441\u0442 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u043e\u0433\u043e \u0441\u0435\u0430\u043d\u0441\u0430.\n\n        \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442:\n        1. \u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043d\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\n        2. \u0412\u0445\u043e\u0434 \u043d\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0443\n        3. \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043d\u0430\u043b\u0438\u0447\u0438\u044f \u0441\u0435\u0430\u043d\u0441\u0430 \u043d\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\n        4. \u0412\u044b\u0445\u043e\u0434 \u043d\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0438\u0437 \u0441\u0438\u0441\u0442\u0435\u043c\u044b (logout)\n        5. \u0412\u0445\u043e\u0434 \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0443 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f admin\n        6. \u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u0441\u0435\u0430\u043d\u0441\u0430 \u043d\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\n        7. \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u044f \u0441\u0435\u0430\u043d\u0441\u0430 \u043d\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\n        8. \u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0444\u0438\u043a\u0441\u0442\u0443\u0440\u043e\u0439 cleanup_users\n        \"\"\"\n        user_data = {\"name\": \"TestUserForManualDeletion\", \"role\": \"\u0410\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440\", \"password\": \"qwerty123\"}\n\n        mp = MainPage(browser)\n        ut = UsersTab(browser)\n\n        # \u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043d\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f NewUser\n        mp.click_subpanel_item(\"\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438\")\n        ut.open_add_user_window()\n        ut.add_new_user(user_data)\n\n        # \u041e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u0441\u043f\u0438\u0441\u043a\u0430 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 (\u0434\u0432\u043e\u0439\u043d\u043e\u0439 \u043a\u043b\u0438\u043a - \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u0431\u0430\u0433?)\n        mp.click_subpanel_item(\"\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438\")\n        mp.click_subpanel_item(\"\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438\")\n\n        # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043d\u0430\u043b\u0438\u0447\u0438\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435\n        ut.should_be_user_in_table(user_data[\"name\"], user_data[\"role\"])\n\n        # \u0412\u0445\u043e\u0434 \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0443 \u0434\u043b\u044f \u043d\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f NewUser\n        new_lp = LoginPage(browser)\n        new_lp.do_login(username=user_data[\"name\"], password=user_data[\"password\"])\n\n        # \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0433\u043b\u0430\u0432\u043d\u043e\u0439 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b\n        new_mp = MainPage(browser)\n\n        # \u041e\u0442\u043a\u0440\u044b\u0442\u044c \u0432\u043a\u043b\u0430\u0434\u043a\u0443 \u0421\u0435\u0430\u043d\u0441\u0430\n        new_mp.should_be_navigation_panel()\n        new_mp.click_main_navigation_panel_item(\"\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438\")\n        new_mp.click_subpanel_item(\"\u041e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u043d\u0438\u0435 \u0438 \u0434\u0438\u0430\u0433\u043d\u043e\u0441\u0442\u0438\u043a\u0430\")\n        new_mp.click_subpanel_item(\"\u0421\u0435\u0430\u043d\u0441\u044b\")\n\n        # \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u0441\u0435\u0430\u043d\u0441\u043e\u0432\n        st = SessionsTab(browser)\n\n        # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043d\u0430\u043b\u0438\u0447\u0438\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0441\u0435\u0430\u043d\u0441\u043e\u0432\n        st.should_be_sessions_table()\n\n        # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043d\u0430\u043b\u0438\u0447\u0438\u044f \u0437\u0430\u043f\u0438\u0441\u0438 \u043e \u0441\u0435\u0430\u043d\u0441\u0435 \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\n        new_user_token = st.get_session_token()\n        st.should_be_session_in_table(new_user_token)\n\n        # logout\n        new_mp.do_logout()\n\n        # \u0410\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u044f \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f admin\n        admin_lp = LoginPage(browser)\n        admin_lp.do_login()\n\n        # \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u043d\u0430 \u0432\u043a\u043b\u0430\u0434\u043a\u0443 \u0421\u0435\u0430\u043d\u0441\u044b\n        admin_mp = MainPage(browser)\n        admin_mp.should_be_navigation_panel()\n        admin_mp.click_main_navigation_panel_item(\"\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438\")\n        admin_mp.click_subpanel_item(\"\u041e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u043d\u0438\u0435 \u0438 \u0434\u0438\u0430\u0433\u043d\u043e\u0441\u0442\u0438\u043a\u0430\")\n        admin_mp.click_subpanel_item(\"\u0421\u0435\u0430\u043d\u0441\u044b\")\n\n        # \u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u0441\u0435\u0430\u043d\u0441\u0430 \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u043f\u043e \u0442\u043e\u043a\u0435\u043d\u0443\n        admin_sessions_tab = SessionsTab(browser)\n        admin_sessions_tab.should_be_sessions_table()\n        admin_sessions_tab.delete_session_by_token(new_user_token)\n\n        # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u044f \u0437\u0430\u043f\u0438\u0441\u0438 \u043e \u0441\u0435\u0430\u043d\u0441\u0435 \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u043f\u043e\u0441\u043b\u0435 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f\n        admin_sessions_tab.should_not_be_session_in_table(new_user_token)\n\n        # \u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0444\u0438\u043a\u0441\u0442\u0443\u0440\u043e\u0439 cleanup_users \u043f\u043e\u0441\u043b\u0435 \u0442\u0435\u0441\u0442\u0430\n\n    def test_multiple_users_sessions(self, browser: Page, cleanup_users: None) -> None:\n        \"\"\"\u0422\u0435\u0441\u0442 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 \u0438 \u0438\u0445 \u0441\u0435\u0430\u043d\u0441\u043e\u0432.\n\n        \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442:\n        1. \u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 User1..User3\n        2. \u0412\u0445\u043e\u0434 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0443 \u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0441\u0435\u0430\u043d\u0441\u043e\u0432\n        3. \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043d\u0430\u043b\u0438\u0447\u0438\u044f \u0441\u0435\u0430\u043d\u0441\u0430 \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435\n        4. \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0441\u043a\u0440\u043e\u043b\u043b\u0438\u043d\u0433\u0430 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0441 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e\u043c \u0441\u0435\u0430\u043d\u0441\u043e\u0432\n        5. \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043f\u043e\u0434\u0441\u0432\u0435\u0442\u043a\u0438 \u0441\u0442\u0440\u043e\u043a \u0442\u0430\u0431\u043b\u0438\u0446\u044b\n        6. \u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0444\u0438\u043a\u0441\u0442\u0443\u0440\u043e\u0439 cleanup_users\n        \"\"\"\n        users_data = [\n            {\"name\": \"TestUser1\", \"role\": \"\u0410\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440\", \"password\": \"password1\"},\n            {\"name\": \"TestUser2\", \"role\": \"\u0410\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440\", \"password\": \"password2\"},\n            {\"name\": \"TestUser3\", \"role\": \"\u0410\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440\", \"password\": \"password3\"}\n        ]\n\n        session_tokens = []\n\n        mp = MainPage(browser)\n        ut = UsersTab(browser)\n        mp.click_subpanel_item(\"\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438\")\n\n        # \u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439\n        for user_data in users_data:\n            mp.click_subpanel_item(\"\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438\")\n            mp.click_subpanel_item(\"\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438\")\n            ut.open_add_user_window()\n            ut.add_new_user(user_data)\n\n            # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043d\u0430\u043b\u0438\u0447\u0438\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435\n            ut.should_be_user_in_table(user_data[\"name\"], user_data[\"role\"])\n\n        # \u0412\u0445\u043e\u0434 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0438 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0442\u043e\u043a\u0435\u043d\u043e\u0432 \u0441\u0435\u0430\u043d\u0441\u043e\u0432\n        for user_data in users_data:\n            # \u0412\u0445\u043e\u0434 \u043d\u043e\u0432\u044b\u043c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u043c\n            login_page = LoginPage(browser)\n            login_page.do_login(username=user_data[\"name\"], password=user_data[\"password\"])\n\n            # \u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0442\u043e\u043a\u0435\u043d\u0430 \u0441\u0435\u0430\u043d\u0441\u043e\u0432\n            sessions_tab = SessionsTab(browser)\n            #sessions_tab.should_be_sessions_table()\n            session_token = sessions_tab.get_session_token()\n            session_tokens.append(session_token)\n\n        # \u0412\u043e\u0437\u0432\u0440\u0430\u0442 \u0430\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440\u0430 \u0434\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0441\u0435\u0430\u043d\u0441\u043e\u0432\n        login_page = LoginPage(browser)\n        login_page.do_login()\n\n        mp = MainPage(browser)\n        mp.click_main_navigation_panel_item(\"\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438\")\n        mp.click_subpanel_item(\"\u041e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u043d\u0438\u0435 \u0438 \u0434\u0438\u0430\u0433\u043d\u043e\u0441\u0442\u0438\u043a\u0430\")\n        mp.click_subpanel_item(\"\u0421\u0435\u0430\u043d\u0441\u044b\")\n\n        sessions_tab = SessionsTab(browser)\n        sessions_tab.should_be_sessions_table()\n\n        # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043d\u0430\u043b\u0438\u0447\u0438\u044f \u0441\u0435\u0430\u043d\u0441\u043e\u0432 \u0432\u0441\u0435\u0445 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439\n        for session_token in session_tokens:\n            sessions_tab.should_be_session_in_table(session_token)\n\n        # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0441\u043a\u0440\u043e\u043b\u043b\u0438\u043d\u0433\u0430 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0441 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e\u043c \u0441\u0435\u0430\u043d\u0441\u043e\u0432\n        self._test_sessions_table_scrolling(sessions_tab)\n\n        # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043f\u043e\u0434\u0441\u0432\u0435\u0442\u043a\u0438 \u0441\u0442\u0440\u043e\u043a \u0442\u0430\u0431\u043b\u0438\u0446\u044b\n        rows_count = sessions_tab.get_rows_count()\n        browser.wait_for_timeout(1000)\n\n        # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043f\u043e\u0434\u0441\u0432\u0435\u0442\u043a\u0438 \u043f\u0435\u0440\u0432\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438\n        sessions_tab.check_sessions_table_row_highlighting(0)\n\n        # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043f\u043e\u0434\u0441\u0432\u0435\u0442\u043a\u0438 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0439 \u0441\u0442\u0440\u043e\u043a\u0438 (\u0435\u0441\u043b\u0438 \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435 \u0431\u043e\u043b\u0435\u0435 \u043e\u0434\u043d\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438)\n        if rows_count > 1:\n            browser.wait_for_timeout(1000)\n            sessions_tab.check_sessions_table_row_highlighting(rows_count - 1)\n\n\n    def _test_sessions_table_scrolling(self, sessions_tab: SessionsTab) -> None:\n        \"\"\"\u0412\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043c\u0435\u0442\u043e\u0434 \u0434\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0441\u043a\u0440\u043e\u043b\u043b\u0438\u043d\u0433\u0430 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0441\u0435\u0430\u043d\u0441\u043e\u0432.\n\n        \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442:\n        1. \u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0441\u043a\u0440\u043e\u043b\u043b\u0438\u043d\u0433\u0430 \u0442\u0430\u0431\u043b\u0438\u0446\u044b\n        2. \u0412\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u043f\u0435\u0440\u0432\u043e\u0439 \u0438 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0439 \u0441\u0442\u0440\u043e\u043a \u043f\u043e\u0441\u043b\u0435 \u0441\u043a\u0440\u043e\u043b\u043b\u0438\u043d\u0433\u0430\n        \"\"\"\n        # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0441\u043a\u0440\u043e\u043b\u043b\u0438\u043d\u0433\u0430\n        is_scrollable = sessions_tab.check_sessions_table_verticall_scrolling()\n\n        if is_scrollable:\n            print(\"\u0422\u0430\u0431\u043b\u0438\u0446\u0430 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u0439 \u0441\u043a\u0440\u043e\u043b\u043b\u0438\u043d\u0433\")\n\n            # \u041f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0430 \u0432\u043d\u0438\u0437\n            sessions_tab.scroll_sessions_table_down()\n\n            # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0439 \u0441\u0442\u0440\u043e\u043a\u0438 \u043f\u043e\u0441\u043b\u0435 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0438\n            sessions_tab.check_sessions_table_last_row_visibility()\n\n            # \u041f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0430 \u0432\u0432\u0435\u0440\u0445\n            sessions_tab.scroll_sessions_table_up()\n\n            # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u043f\u0435\u0440\u0432\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438 \u043f\u043e\u0441\u043b\u0435 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0438\n            sessions_tab.check_sessions_table_first_row_visibility()\n        else:\n            print(\"\u0422\u0430\u0431\u043b\u0438\u0446\u0430 \u043d\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u0439 \u0441\u043a\u0440\u043e\u043b\u043b\u0438\u043d\u0433 - \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u0431\u0430\u0437\u043e\u0432\u0443\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c\")\n\n            # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u043f\u0435\u0440\u0432\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438\n            sessions_tab.check_sessions_table_first_row_visibility()\n\n    @pytest.mark.skip(reason=\"\u041d\u0435 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u043e \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u043c\")\n    def test_session_removed_when_user_deleted(self, browser: Page, cleanup_users: None) -> None:\n        \"\"\"\u0422\u0435\u0441\u0442 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u0441\u0435\u0430\u043d\u0441\u0430 \u043f\u0440\u0438 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\n\n        \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442:\n        1. \u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043d\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\n        2. \u0412\u0445\u043e\u0434 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0441\u0435\u0430\u043d\u0441\u0430\n        3. \u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0430\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440\u043e\u043c\n        4. \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u0441\u0435\u0430\u043d\u0441\u0430 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\n        \"\"\"\n        user_data = {\"name\": \"UserForAutoSessionDeletion\", \"role\": \"\u0410\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440\", \"password\": \"qwerty123\"}\n\n        mp = MainPage(browser)\n        ut = UsersTab(browser)\n\n        # \u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043d\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\n        mp.click_subpanel_item(\"\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438\")\n        ut.open_add_user_window()\n        ut.add_new_user(user_data)\n\n        # \u041e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u0441\u043f\u0438\u0441\u043a\u0430 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439\n        mp.click_subpanel_item(\"\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438\")\n        mp.click_subpanel_item(\"\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438\")\n\n        # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043d\u0430\u043b\u0438\u0447\u0438\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435\n        ut.should_be_user_in_table(user_data[\"name\"], user_data[\"role\"])\n\n        # \u0412\u0445\u043e\u0434 \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0443 \u0434\u043b\u044f \u043d\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\n        new_lp = LoginPage(browser)\n        new_lp.do_login(username=user_data[\"name\"], password=user_data[\"password\"])\n\n        # \u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0442\u043e\u043a\u0435\u043d\u0430 \u0441\u0435\u0441\u0441\u0438\u0438 \u043d\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\n        new_mp = MainPage(browser)\n\n        # \u041e\u0442\u043a\u0440\u044b\u0442\u044c \u0432\u043a\u043b\u0430\u0434\u043a\u0443 \u0421\u0435\u0441\u0441\u0438\u0438\n        new_mp.should_be_navigation_panel()\n        new_mp.click_main_navigation_panel_item(\"\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438\")\n        new_mp.click_subpanel_item(\"\u041e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u043d\u0438\u0435 \u0438 \u0434\u0438\u0430\u0433\u043d\u043e\u0441\u0442\u0438\u043a\u0430\")\n        new_mp.click_subpanel_item(\"\u0421\u0435\u0430\u043d\u0441\u044b\")\n\n        # \u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0442\u043e\u043a\u0435\u043d \u0441\u0435\u0441\u0441\u0438\u0438\n        sessions_tab = SessionsTab(browser)\n        new_user_token = sessions_tab.get_session_token()\n\n        # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043d\u0430\u043b\u0438\u0447\u0438\u044f \u0441\u0435\u0441\u0441\u0438\u0438 \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435\n        sessions_tab.should_be_session_in_table(new_user_token)\n\n        # \u0412\u044b\u0445\u043e\u0434 \u0438\u0437 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u043d\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\n        new_mp.do_logout()\n\n        # \u0410\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u044f \u0430\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440\u043e\u043c\n        admin_lp = LoginPage(browser)\n        admin_lp.do_login()\n\n        # \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u043d\u0430 \u0432\u043a\u043b\u0430\u0434\u043a\u0443 \u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438\n        admin_mp = MainPage(browser)\n        admin_mp.click_main_navigation_panel_item(\"\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438\")\n        admin_mp.click_subpanel_item(\"\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438\")\n\n        # \u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\n        admin_ut = UsersTab(browser)\n        admin_ut.open_edit_user_page_by_user(user_data[\"name\"], user_data[\"role\"])\n        admin_ut.delete_user(user_data[\"name\"])\n\n        # \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u043d\u0430 \u0432\u043a\u043b\u0430\u0434\u043a\u0443 \u0421\u0435\u0430\u043d\u0441\u044b\n        admin_mp.click_main_navigation_panel_item(\"\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438\")\n        admin_mp.click_main_navigation_panel_item(\"\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438\")\n        admin_mp.click_subpanel_item(\"\u041e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u043d\u0438\u0435 \u0438 \u0434\u0438\u0430\u0433\u043d\u043e\u0441\u0442\u0438\u043a\u0430\")\n        admin_mp.click_subpanel_item(\"\u0421\u0435\u0430\u043d\u0441\u044b\")\n\n        # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u044f \u0441\u0435\u0441\u0441\u0438\u0438 \u043f\u043e\u0441\u043b\u0435 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\n        admin_sessions_tab = SessionsTab(browser)\n        admin_sessions_tab.should_be_sessions_table()\n\n        # \u0421\u0435\u0441\u0441\u0438\u044f \u0434\u043e\u043b\u0436\u043d\u0430 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0443\u0434\u0430\u043b\u0438\u0442\u044c\u0441\u044f \u043f\u0440\u0438 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\n        admin_sessions_tab.should_not_be_session_in_table(new_user_token)\n\n    @pytest.mark.skip(reason=\"\u0422\u0440\u0435\u0431\u0443\u0435\u0442 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0442\u0430\u0439\u043c\u0435\u0440\u0430 \u043e\u0447\u0438\u0441\u0442\u043a\u0438 \u0441\u0435\u0430\u043d\u0441\u043e\u0432\")\n    def test_session_auto_deletion_after_15_minutes(self, browser: Page, cleanup_users: None) -> None:\n        \"\"\"\u0422\u0435\u0441\u0442 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u0441\u0435\u0430\u043d\u0441\u0430 \u0447\u0435\u0440\u0435\u0437 15 \u043c\u0438\u043d\u0443\u0442 \u043f\u043e\u0441\u043b\u0435 \u0432\u044b\u0445\u043e\u0434\u0430 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\n\n        \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442:\n        1. \u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043d\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\n        2. \u0412\u0445\u043e\u0434 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0441\u0435\u0430\u043d\u0441\u0430\n        3. \u0412\u044b\u0445\u043e\u0434 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0438\u0437 \u0441\u0438\u0441\u0442\u0435\u043c\u044b\n        4. \u041e\u0436\u0438\u0434\u0430\u043d\u0438\u0435 15 \u043c\u0438\u043d\u0443\u0442\n        5. \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u0441\u0435\u0430\u043d\u0441\u0430 \u043f\u043e \u0438\u0441\u0442\u0435\u0447\u0435\u043d\u0438\u0438 \u0432\u0440\u0435\u043c\u0435\u043d\u0438\n        6. \u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0444\u0438\u043a\u0441\u0442\u0443\u0440\u043e\u0439 cleanup_users\n        \"\"\"\n        user_data = {\"name\": \"TestUserFor15MinDeletion\", \"role\": \"\u0410\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440\", \"password\": \"qwerty123\"}\n\n        mp = MainPage(browser)\n        ut = UsersTab(browser)\n\n        # \u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043d\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\n        mp.click_subpanel_item(\"\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438\")\n        ut.open_add_user_window()\n        ut.add_new_user(user_data)\n\n        # \u041e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u0441\u043f\u0438\u0441\u043a\u0430 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439\n        mp.click_subpanel_item(\"\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438\")\n        mp.click_subpanel_item(\"\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438\")\n\n        # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043d\u0430\u043b\u0438\u0447\u0438\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435\n        ut.should_be_user_in_table(user_data[\"name\"], user_data[\"role\"])\n\n        # \u0412\u0445\u043e\u0434 \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0443 \u0434\u043b\u044f \u043d\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\n        new_lp = LoginPage(browser)\n        new_lp.do_login(username=user_data[\"name\"], password=user_data[\"password\"])\n\n        # \u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0442\u043e\u043a\u0435\u043d\u0430 \u0441\u0435\u0441\u0441\u0438\u0438 \u043d\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\n        new_mp = MainPage(browser)\n\n        # \u041e\u0442\u043a\u0440\u044b\u0442\u044c \u0432\u043a\u043b\u0430\u0434\u043a\u0443 \u0421\u0435\u0441\u0441\u0438\u0438\n        new_mp.should_be_navigation_panel()\n        new_mp.click_main_navigation_panel_item(\"\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438\")\n        new_mp.click_subpanel_item(\"\u041e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u043d\u0438\u0435 \u0438 \u0434\u0438\u0430\u0433\u043d\u043e\u0441\u0442\u0438\u043a\u0430\")\n        new_mp.click_subpanel_item(\"\u0421\u0435\u0430\u043d\u0441\u044b\")\n\n        # \u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0442\u043e\u043a\u0435\u043d \u0441\u0435\u0441\u0441\u0438\u0438\n        sessions_tab = SessionsTab(browser)\n        session_token = sessions_tab.get_session_token()\n\n        # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043d\u0430\u043b\u0438\u0447\u0438\u044f \u0441\u0435\u0441\u0441\u0438\u0438 \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435\n        sessions_tab.should_be_session_in_table(session_token)\n\n        # \u0412\u044b\u0445\u043e\u0434 \u0438\u0437 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u043d\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\n        new_mp.do_logout()\n\n        # \u0410\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u044f \u0430\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440\u043e\u043c\n        admin_lp = LoginPage(browser)\n        admin_lp.do_login()\n\n        # \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u043d\u0430 \u0432\u043a\u043b\u0430\u0434\u043a\u0443 \u0421\u0435\u0430\u043d\u0441\u044b\n        admin_mp = MainPage(browser)\n        admin_mp.should_be_navigation_panel()\n        admin_mp.click_main_navigation_panel_item(\"\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438\")\n        admin_mp.click_subpanel_item(\"\u041e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u043d\u0438\u0435 \u0438 \u0434\u0438\u0430\u0433\u043d\u043e\u0441\u0442\u0438\u043a\u0430\")\n        admin_mp.click_subpanel_item(\"\u0421\u0435\u0430\u043d\u0441\u044b\")\n\n        # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043d\u0430\u043b\u0438\u0447\u0438\u044f \u0441\u0435\u0441\u0441\u0438\u0438 \u0441\u0440\u0430\u0437\u0443 \u043f\u043e\u0441\u043b\u0435 \u0432\u044b\u0445\u043e\u0434\u0430\n        admin_sessions_tab = SessionsTab(browser)\n        admin_sessions_tab.should_be_session_in_table(session_token)\n\n        admin_mp.do_logout()\n\n        # \u041e\u0436\u0438\u0434\u0430\u043d\u0438\u0435 15 \u043c\u0438\u043d\u0443\u0442 1 \u0441\u0435\u043a\u0443\u043d\u0434\u0430 (901 \u0441\u0435\u043a\u0443\u043d\u0434)\n        print(\"\u041e\u0436\u0438\u0434\u0430\u043d\u0438\u0435 15 \u043c\u0438\u043d\u0443\u0442 \u0434\u043b\u044f \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u0441\u0435\u0430\u043d\u0441\u0430...\")\n        browser.wait_for_timeout(901000)  # 15 \u043c\u0438\u043d\u0443\u0442 1 \u0441\u0435\u043a\u0443\u043d\u0434\u0430 \u0432 \u043c\u0438\u043b\u043b\u0438\u0441\u0435\u043a\u0443\u043d\u0434\u0430\u0445\n\n        # \u0410\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u044f \u0430\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440\u043e\u043c\n        admin_lp = LoginPage(browser)\n        admin_lp.do_login()\n\n        # \u041f\u043e\u0432\u0442\u043e\u0440\u043d\u044b\u0439 \u043f\u0435\u0440\u0435\u0445\u043e\u0434 \u043d\u0430 \u0432\u043a\u043b\u0430\u0434\u043a\u0443 \u0421\u0435\u0430\u043d\u0441\u044b \u043f\u043e\u0441\u043b\u0435 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f\n        admin_mp = MainPage(browser)\n        admin_mp.should_be_navigation_panel()\n        admin_mp.click_main_navigation_panel_item(\"\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438\")\n        admin_mp.click_subpanel_item(\"\u041e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u043d\u0438\u0435 \u0438 \u0434\u0438\u0430\u0433\u043d\u043e\u0441\u0442\u0438\u043a\u0430\")\n        admin_mp.click_subpanel_item(\"\u0421\u0435\u0430\u043d\u0441\u044b\")\n\n        # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u044f \u0441\u0435\u0441\u0441\u0438\u0438 \u043f\u043e\u0441\u043b\u0435 15 \u043c\u0438\u043d\u0443\u0442\n        admin_sessions_tab = SessionsTab(browser)\n        admin_sessions_tab.should_be_sessions_table()\n        admin_sessions_tab.should_not_be_session_in_table(session_token)\n\n        # \u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0444\u0438\u043a\u0441\u0442\u0443\u0440\u043e\u0439 cleanup_users \u043f\u043e\u0441\u043b\u0435 \u0442\u0435\u0441\u0442\u0430\n\n    @pytest.mark.skip(reason=\"\u041d\u0435 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u043c, \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0431\u0438\u0437\u043d\u0435\u0441-\u043b\u043e\u0433\u0438\u043a\u0438\")\n    def test_user_cannot_delete_own_session(self, browser: Page, cleanup_users: None) -> None:\n        \"\"\"\u0422\u0435\u0441\u0442 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u043d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u0441\u0432\u043e\u0439 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u0441\u0435\u0430\u043d\u0441.\n        \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442:\n        1. \u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043d\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\n        2. \u0412\u0445\u043e\u0434 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0441\u0435\u0430\u043d\u0441\u0430\n        3. \u041f\u043e\u043f\u044b\u0442\u043a\u0443 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u0441\u0432\u043e\u0435\u0433\u043e \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0433\u043e \u0441\u0435\u0430\u043d\u0441\u0430\n        4. \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0443, \u0447\u0442\u043e \u043a\u043d\u043e\u043f\u043a\u0430 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u043d\u0435\u0434\u043e\u0441\u0442\u0443\u043f\u043d\u0430 \u0438\u043b\u0438 \u0441\u043a\u0440\u044b\u0442\u0430\n        5. \u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0444\u0438\u043a\u0441\u0442\u0443\u0440\u043e\u0439 cleanup_users\n        \"\"\"\n        user_data = {\"name\": \"TestUserForSelfDeletion\", \"role\": \"\u0410\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440\", \"password\": \"qwerty123\"}\n\n        mp = MainPage(browser)\n        ut = UsersTab(browser)\n\n        # \u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043d\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\n        mp.click_subpanel_item(\"\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438\")\n        ut.open_add_user_window()\n        ut.add_new_user(user_data)\n\n        # \u041e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u0441\u043f\u0438\u0441\u043a\u0430 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439\n        mp.click_subpanel_item(\"\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438\")\n        mp.click_subpanel_item(\"\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438\")\n\n        # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043d\u0430\u043b\u0438\u0447\u0438\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435\n        ut.should_be_user_in_table(user_data[\"name\"], user_data[\"role\"])\n\n        # \u0412\u0445\u043e\u0434 \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0443 \u0434\u043b\u044f \u043d\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\n        new_lp = LoginPage(browser)\n        new_lp.do_login(username=user_data[\"name\"], password=user_data[\"password\"])\n\n        # \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u043d\u0430 \u0432\u043a\u043b\u0430\u0434\u043a\u0443 \u0421\u0435\u0430\u043d\u0441\u044b\n        new_mp = MainPage(browser)\n        new_mp.should_be_navigation_panel()\n        new_mp.click_main_navigation_panel_item(\"\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438\")\n        new_mp.click_subpanel_item(\"\u041e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u043d\u0438\u0435 \u0438 \u0434\u0438\u0430\u0433\u043d\u043e\u0441\u0442\u0438\u043a\u0430\")\n        new_mp.click_subpanel_item(\"\u0421\u0435\u0430\u043d\u0441\u044b\")\n\n        # \u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0442\u043e\u043a\u0435\u043d \u0441\u0435\u0441\u0441\u0438\u0438\n        sessions_tab = SessionsTab(browser)\n        session_token = sessions_tab.get_session_token()\n\n        # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043d\u0430\u043b\u0438\u0447\u0438\u044f \u0441\u0435\u0441\u0441\u0438\u0438 \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435\n        sessions_tab.should_be_session_in_table(session_token)\n\n        # \u041f\u043e\u043f\u044b\u0442\u043a\u0430 \u043d\u0430\u0439\u0442\u0438 \u043a\u043d\u043e\u043f\u043a\u0443 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u0434\u043b\u044f \u0441\u0432\u043e\u0435\u0433\u043e \u0441\u0435\u0430\u043d\u0441\u0430\n        row_index = sessions_tab.find_session_in_table(session_token)\n\n        # \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c, \u0447\u0442\u043e \u043a\u043d\u043e\u043f\u043a\u0430 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u043b\u0438\u0431\u043e \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442, \u043b\u0438\u0431\u043e \u043d\u0435\u0430\u043a\u0442\u0438\u0432\u043d\u0430\n        delete_button = sessions_tab.get_delete_session_button_from_row(row_index)\n\n        # \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c, \u0447\u0442\u043e \u043a\u043d\u043e\u043f\u043a\u0430 \u043b\u0438\u0431\u043e \u043d\u0435 \u0432\u0438\u0434\u0438\u043c\u0430, \u043b\u0438\u0431\u043e \u043e\u0442\u043a\u043b\u044e\u0447\u0435\u043d\u0430\n        expect(delete_button).not_to_be_visible()\n\n        # \u0412\u044b\u0445\u043e\u0434 \u0438\u0437 \u0441\u0438\u0441\u0442\u0435\u043c\u044b\n        new_mp.do_logout()\n
    "},{"location":"tests/e2e/test_sessions_tab/#tests.e2e.test_sessions_tab.TestSessionsTab.cleanup_users","title":"cleanup_users(browser)","text":"

    \u0424\u0438\u043a\u0441\u0442\u0443\u0440\u0430 \u0434\u043b\u044f \u043e\u0447\u0438\u0441\u0442\u043a\u0438 \u0442\u0435\u0441\u0442\u043e\u0432\u044b\u0445 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 \u0438 \u0438\u0445 \u0441\u0435\u0430\u043d\u0441\u043e\u0432 \u043f\u043e\u0441\u043b\u0435 \u0442\u0435\u0441\u0442\u0430.

    Source code in tests\\e2e\\test_sessions_tab.py
    @pytest.fixture(scope=\"function\")\ndef cleanup_users(self, browser: Page) -> None:\n    \"\"\"\u0424\u0438\u043a\u0441\u0442\u0443\u0440\u0430 \u0434\u043b\u044f \u043e\u0447\u0438\u0441\u0442\u043a\u0438 \u0442\u0435\u0441\u0442\u043e\u0432\u044b\u0445 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 \u0438 \u0438\u0445 \u0441\u0435\u0430\u043d\u0441\u043e\u0432 \u043f\u043e\u0441\u043b\u0435 \u0442\u0435\u0441\u0442\u0430.\"\"\"\n    yield\n\n    # \u0412\u044b\u0445\u043e\u0434 \u0438\u0437 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\n    mp = MainPage(browser)\n    mp.do_logout()\n\n    # \u0410\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u044f \u0430\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440\u043e\u043c \u0434\u043b\u044f \u043e\u0447\u0438\u0441\u0442\u043a\u0438\n    login_page = LoginPage(browser)\n    login_page.do_login()\n\n    # \u0423\u0434\u0430\u043b\u044f\u0435\u043c \u0442\u0435\u0441\u0442\u043e\u0432\u044b\u0445 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439\n    self._cleanup_test_users(browser)\n
    "},{"location":"tests/e2e/test_sessions_tab/#tests.e2e.test_sessions_tab.TestSessionsTab.setup","title":"setup(browser)","text":"

    \u0424\u0438\u043a\u0441\u0442\u0443\u0440\u0430 \u0434\u043b\u044f \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0438 \u0442\u0435\u0441\u0442\u043e\u0432\u043e\u0433\u043e \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f.

    \u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442: 1. \u0410\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u044e \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0435 2. \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u043d\u0430 \u0432\u043a\u043b\u0430\u0434\u043a\u0443 '\u0421\u0435\u0430\u043d\u0441\u044b' \u0447\u0435\u0440\u0435\u0437 \u043f\u0430\u043d\u0435\u043b\u044c \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438

    Source code in tests\\e2e\\test_sessions_tab.py
    @pytest.fixture(scope=\"function\", autouse=True)\ndef setup(self, browser: Page) -> None:\n    \"\"\"\u0424\u0438\u043a\u0441\u0442\u0443\u0440\u0430 \u0434\u043b\u044f \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0438 \u0442\u0435\u0441\u0442\u043e\u0432\u043e\u0433\u043e \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f.\n\n    \u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442:\n    1. \u0410\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u044e \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0435\n    2. \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u043d\u0430 \u0432\u043a\u043b\u0430\u0434\u043a\u0443 '\u0421\u0435\u0430\u043d\u0441\u044b' \u0447\u0435\u0440\u0435\u0437 \u043f\u0430\u043d\u0435\u043b\u044c \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438\n    \"\"\"\n    # \u0410\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u044f \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0435\n    login_page = LoginPage(browser)\n    login_page.do_login()\n\n    # \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0433\u043b\u0430\u0432\u043d\u043e\u0439 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b\n    main_page = MainPage(browser)\n\n    # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0438 \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u0441 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u043c\u0438 \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438\n    main_page.should_be_navigation_panel()\n    main_page.click_main_navigation_panel_item(\"\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438\")\n    main_page.click_subpanel_item(\"\u041e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u043d\u0438\u0435 \u0438 \u0434\u0438\u0430\u0433\u043d\u043e\u0441\u0442\u0438\u043a\u0430\")\n    main_page.click_subpanel_item(\"\u0421\u0435\u0430\u043d\u0441\u044b\")\n
    "},{"location":"tests/e2e/test_sessions_tab/#tests.e2e.test_sessions_tab.TestSessionsTab.test_delete_existed_session","title":"test_delete_existed_session(browser, cleanup_users)","text":"

    \u0422\u0435\u0441\u0442 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u043e\u0433\u043e \u0441\u0435\u0430\u043d\u0441\u0430.

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442: 1. \u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043d\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f 2. \u0412\u0445\u043e\u0434 \u043d\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0443 3. \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043d\u0430\u043b\u0438\u0447\u0438\u044f \u0441\u0435\u0430\u043d\u0441\u0430 \u043d\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f 4. \u0412\u044b\u0445\u043e\u0434 \u043d\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0438\u0437 \u0441\u0438\u0441\u0442\u0435\u043c\u044b (logout) 5. \u0412\u0445\u043e\u0434 \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0443 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f admin 6. \u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u0441\u0435\u0430\u043d\u0441\u0430 \u043d\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f 7. \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u044f \u0441\u0435\u0430\u043d\u0441\u0430 \u043d\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f 8. \u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0444\u0438\u043a\u0441\u0442\u0443\u0440\u043e\u0439 cleanup_users

    Source code in tests\\e2e\\test_sessions_tab.py
    def test_delete_existed_session(self, browser: Page, cleanup_users: None) -> None:\n    \"\"\"\u0422\u0435\u0441\u0442 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u043e\u0433\u043e \u0441\u0435\u0430\u043d\u0441\u0430.\n\n    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442:\n    1. \u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043d\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\n    2. \u0412\u0445\u043e\u0434 \u043d\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0443\n    3. \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043d\u0430\u043b\u0438\u0447\u0438\u044f \u0441\u0435\u0430\u043d\u0441\u0430 \u043d\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\n    4. \u0412\u044b\u0445\u043e\u0434 \u043d\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0438\u0437 \u0441\u0438\u0441\u0442\u0435\u043c\u044b (logout)\n    5. \u0412\u0445\u043e\u0434 \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0443 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f admin\n    6. \u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u0441\u0435\u0430\u043d\u0441\u0430 \u043d\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\n    7. \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u044f \u0441\u0435\u0430\u043d\u0441\u0430 \u043d\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\n    8. \u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0444\u0438\u043a\u0441\u0442\u0443\u0440\u043e\u0439 cleanup_users\n    \"\"\"\n    user_data = {\"name\": \"TestUserForManualDeletion\", \"role\": \"\u0410\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440\", \"password\": \"qwerty123\"}\n\n    mp = MainPage(browser)\n    ut = UsersTab(browser)\n\n    # \u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043d\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f NewUser\n    mp.click_subpanel_item(\"\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438\")\n    ut.open_add_user_window()\n    ut.add_new_user(user_data)\n\n    # \u041e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u0441\u043f\u0438\u0441\u043a\u0430 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 (\u0434\u0432\u043e\u0439\u043d\u043e\u0439 \u043a\u043b\u0438\u043a - \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u0431\u0430\u0433?)\n    mp.click_subpanel_item(\"\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438\")\n    mp.click_subpanel_item(\"\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438\")\n\n    # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043d\u0430\u043b\u0438\u0447\u0438\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435\n    ut.should_be_user_in_table(user_data[\"name\"], user_data[\"role\"])\n\n    # \u0412\u0445\u043e\u0434 \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0443 \u0434\u043b\u044f \u043d\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f NewUser\n    new_lp = LoginPage(browser)\n    new_lp.do_login(username=user_data[\"name\"], password=user_data[\"password\"])\n\n    # \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0433\u043b\u0430\u0432\u043d\u043e\u0439 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b\n    new_mp = MainPage(browser)\n\n    # \u041e\u0442\u043a\u0440\u044b\u0442\u044c \u0432\u043a\u043b\u0430\u0434\u043a\u0443 \u0421\u0435\u0430\u043d\u0441\u0430\n    new_mp.should_be_navigation_panel()\n    new_mp.click_main_navigation_panel_item(\"\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438\")\n    new_mp.click_subpanel_item(\"\u041e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u043d\u0438\u0435 \u0438 \u0434\u0438\u0430\u0433\u043d\u043e\u0441\u0442\u0438\u043a\u0430\")\n    new_mp.click_subpanel_item(\"\u0421\u0435\u0430\u043d\u0441\u044b\")\n\n    # \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u0441\u0435\u0430\u043d\u0441\u043e\u0432\n    st = SessionsTab(browser)\n\n    # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043d\u0430\u043b\u0438\u0447\u0438\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0441\u0435\u0430\u043d\u0441\u043e\u0432\n    st.should_be_sessions_table()\n\n    # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043d\u0430\u043b\u0438\u0447\u0438\u044f \u0437\u0430\u043f\u0438\u0441\u0438 \u043e \u0441\u0435\u0430\u043d\u0441\u0435 \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\n    new_user_token = st.get_session_token()\n    st.should_be_session_in_table(new_user_token)\n\n    # logout\n    new_mp.do_logout()\n\n    # \u0410\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u044f \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f admin\n    admin_lp = LoginPage(browser)\n    admin_lp.do_login()\n\n    # \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u043d\u0430 \u0432\u043a\u043b\u0430\u0434\u043a\u0443 \u0421\u0435\u0430\u043d\u0441\u044b\n    admin_mp = MainPage(browser)\n    admin_mp.should_be_navigation_panel()\n    admin_mp.click_main_navigation_panel_item(\"\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438\")\n    admin_mp.click_subpanel_item(\"\u041e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u043d\u0438\u0435 \u0438 \u0434\u0438\u0430\u0433\u043d\u043e\u0441\u0442\u0438\u043a\u0430\")\n    admin_mp.click_subpanel_item(\"\u0421\u0435\u0430\u043d\u0441\u044b\")\n\n    # \u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u0441\u0435\u0430\u043d\u0441\u0430 \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u043f\u043e \u0442\u043e\u043a\u0435\u043d\u0443\n    admin_sessions_tab = SessionsTab(browser)\n    admin_sessions_tab.should_be_sessions_table()\n    admin_sessions_tab.delete_session_by_token(new_user_token)\n\n    # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u044f \u0437\u0430\u043f\u0438\u0441\u0438 \u043e \u0441\u0435\u0430\u043d\u0441\u0435 \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u043f\u043e\u0441\u043b\u0435 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f\n    admin_sessions_tab.should_not_be_session_in_table(new_user_token)\n
    "},{"location":"tests/e2e/test_sessions_tab/#tests.e2e.test_sessions_tab.TestSessionsTab.test_delete_session_after_logout","title":"test_delete_session_after_logout(browser, cleanup_users)","text":"

    \u0422\u0435\u0441\u0442 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u0441\u0435\u0430\u043d\u0441\u0430 \u043f\u043e\u0441\u043b\u0435 \u0432\u044b\u0445\u043e\u0434\u0430 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0438\u0437 \u0441\u0438\u0441\u0442\u0435\u043c\u044b.

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442: 1. \u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043d\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f 2. \u0412\u0445\u043e\u0434 \u043d\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0443 3. \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043d\u0430\u043b\u0438\u0447\u0438\u044f \u0441\u0435\u0430\u043d\u0441\u0430 \u043d\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f 4. \u0412\u044b\u0445\u043e\u0434 \u043d\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0438\u0437 \u0441\u0438\u0441\u0442\u0435\u043c\u044b (logout) 5. \u0412\u0445\u043e\u0434 \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0443 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f admin 6. \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u044f \u0441\u0435\u0430\u043d\u0441\u0430 \u043d\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f 7. \u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0444\u0438\u043a\u0441\u0442\u0443\u0440\u043e\u0439 cleanup_users

    Source code in tests\\e2e\\test_sessions_tab.py
    @pytest.mark.skip(reason=\"\u041d\u0435 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u043e \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u043c, \u0437\u0430\u0432\u0435\u0434\u0435\u043d \u0442\u0438\u043a\u0435\u0442\")\ndef test_delete_session_after_logout(self, browser: Page, cleanup_users: None) -> None:\n    \"\"\"\u0422\u0435\u0441\u0442 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u0441\u0435\u0430\u043d\u0441\u0430 \u043f\u043e\u0441\u043b\u0435 \u0432\u044b\u0445\u043e\u0434\u0430 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0438\u0437 \u0441\u0438\u0441\u0442\u0435\u043c\u044b.\n\n    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442:\n    1. \u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043d\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\n    2. \u0412\u0445\u043e\u0434 \u043d\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0443\n    3. \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043d\u0430\u043b\u0438\u0447\u0438\u044f \u0441\u0435\u0430\u043d\u0441\u0430 \u043d\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\n    4. \u0412\u044b\u0445\u043e\u0434 \u043d\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0438\u0437 \u0441\u0438\u0441\u0442\u0435\u043c\u044b (logout)\n    5. \u0412\u0445\u043e\u0434 \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0443 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f admin\n    6. \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u044f \u0441\u0435\u0430\u043d\u0441\u0430 \u043d\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\n    7. \u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0444\u0438\u043a\u0441\u0442\u0443\u0440\u043e\u0439 cleanup_users\n    \"\"\"\n    user_data = {\"name\": \"TestUserForSessionDeletion\", \"role\": \"\u0410\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440\", \"password\": \"qwerty\"}\n\n    mp = MainPage(browser)\n    ut = UsersTab(browser)\n\n    # \u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043d\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\n    mp.click_subpanel_item(\"\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438\")\n    ut.open_add_user_window()\n    ut.add_new_user(user_data)\n\n    # \u041e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u0441\u043f\u0438\u0441\u043a\u0430 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 (\u0434\u0432\u043e\u0439\u043d\u043e\u0439 \u043a\u043b\u0438\u043a - \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u0431\u0430\u0433?)\n    mp.click_subpanel_item(\"\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438\")\n    mp.click_subpanel_item(\"\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438\")\n\n    # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043d\u0430\u043b\u0438\u0447\u0438\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435\n    ut.should_be_user_in_table(user_data[\"name\"], user_data[\"role\"])\n\n    # \u0412\u0445\u043e\u0434 \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0443 \u0434\u043b\u044f \u043d\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\n    new_lp = LoginPage(browser)\n    new_lp.do_login(username=user_data[\"name\"], password=user_data[\"password\"])\n\n    # \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0433\u043b\u0430\u0432\u043d\u043e\u0439 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b\n    new_mp = MainPage(browser)\n\n    # \u041e\u0442\u043a\u0440\u044b\u0442\u044c \u0432\u043a\u043b\u0430\u0434\u043a\u0443 \u0421\u0435\u0441\u0441\u0438\u0438\n    new_mp.should_be_navigation_panel()\n    new_mp.click_main_navigation_panel_item(\"\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438\")\n    new_mp.click_subpanel_item(\"\u041e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u043d\u0438\u0435 \u0438 \u0434\u0438\u0430\u0433\u043d\u043e\u0441\u0442\u0438\u043a\u0430\")\n    new_mp.click_subpanel_item(\"\u0421\u0435\u0430\u043d\u0441\u044b\")\n\n    # \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u0441\u0435\u0430\u043d\u0441\u043e\u0432\n    st = SessionsTab(browser)\n\n    # # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043d\u0430\u043b\u0438\u0447\u0438\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0441\u0435\u0430\u043d\u0441\u043e\u0432\n    st.should_be_sessions_table()\n\n    # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043d\u0430\u043b\u0438\u0447\u0438\u044f \u0437\u0430\u043f\u0438\u0441\u0438 \u043e \u0441\u0435\u0430\u043d\u0441\u0435 \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\n    session_token = st.get_session_token()\n    st.should_be_session_in_table(session_token)\n\n    # logout\n    new_mp.do_logout()\n\n    # \u0410\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u044f \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0435 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\n    admin_lp = LoginPage(browser)\n    admin_lp.do_login()\n\n    # \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0433\u043b\u0430\u0432\u043d\u043e\u0439 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b\n    admin_mp = MainPage(browser)\n\n    # \u041e\u0442\u043a\u0440\u044b\u0442\u044c \u0432\u043a\u043b\u0430\u0434\u043a\u0443 \u0421\u0435\u0430\u043d\u0441\u044b\n    admin_mp.should_be_navigation_panel()\n    admin_mp.click_main_navigation_panel_item(\"\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438\")\n    admin_mp.click_subpanel_item(\"\u041e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u043d\u0438\u0435 \u0438 \u0434\u0438\u0430\u0433\u043d\u043e\u0441\u0442\u0438\u043a\u0430\")\n    admin_mp.click_subpanel_item(\"\u0421\u0435\u0430\u043d\u0441\u044b\")\n\n    # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043d\u0430\u043b\u0438\u0447\u0438\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u0441\u0435\u0430\u043d\u0441\u043e\u0432\n    st.should_be_sessions_table()\n\n    # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u044f \u0437\u0430\u043f\u0438\u0441\u0438 \u043e \u0441\u0435\u0441\u0441\u0438\u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u043f\u043e\u0441\u043b\u0435 \u0432\u044b\u0445\u043e\u0434\u0430 \u0438\u0437 \u0441\u0438\u0441\u0442\u0435\u043c\u044b\n    st.should_not_be_session_in_table(session_token)\n
    "},{"location":"tests/e2e/test_sessions_tab/#tests.e2e.test_sessions_tab.TestSessionsTab.test_delete_session_confirm_window","title":"test_delete_session_confirm_window(browser)","text":"

    \u0422\u0435\u0441\u0442 \u043e\u043a\u043d\u0430 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u044f \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u0441\u0435\u0430\u043d\u0441\u0430.

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442: 1. \u041d\u0430\u043b\u0438\u0447\u0438\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0441\u0435\u0430\u043d\u0441\u043e\u0432 2. \u0421\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u043e\u043a\u043d\u0430 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u044f \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u0441\u0435\u0430\u043d\u0441\u0430 3. \u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0433\u043e\u0440\u0438\u0437\u043e\u043d\u0442\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0441\u043a\u0440\u043e\u043b\u043b\u0438\u043d\u0433\u0430 \u0432 \u043e\u043a\u043d\u0435 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u044f 4. \u041a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0441\u0442\u044c \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430 \u0432 \u043e\u043a\u043d\u0435 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u044f 5. \u0424\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u043a\u043d\u043e\u043f\u043e\u043a \u0432 \u043e\u043a\u043d\u0435 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u044f \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f

    Source code in tests\\e2e\\test_sessions_tab.py
    def test_delete_session_confirm_window(self, browser: Page) -> None:\n    \"\"\"\u0422\u0435\u0441\u0442 \u043e\u043a\u043d\u0430 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u044f \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u0441\u0435\u0430\u043d\u0441\u0430.\n\n    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442:\n    1. \u041d\u0430\u043b\u0438\u0447\u0438\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0441\u0435\u0430\u043d\u0441\u043e\u0432\n    2. \u0421\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u043e\u043a\u043d\u0430 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u044f \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u0441\u0435\u0430\u043d\u0441\u0430\n    3. \u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0433\u043e\u0440\u0438\u0437\u043e\u043d\u0442\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0441\u043a\u0440\u043e\u043b\u043b\u0438\u043d\u0433\u0430 \u0432 \u043e\u043a\u043d\u0435 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u044f\n    4. \u041a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0441\u0442\u044c \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430 \u0432 \u043e\u043a\u043d\u0435 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u044f\n    5. \u0424\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u043a\u043d\u043e\u043f\u043e\u043a \u0432 \u043e\u043a\u043d\u0435 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u044f \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f\n    \"\"\"\n    # \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u0441\u0435\u0430\u043d\u0441\u043e\u0432\n    sessions_tab = SessionsTab(browser)\n\n    # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043d\u0430\u043b\u0438\u0447\u0438\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0441\u0435\u0430\u043d\u0441\u043e\u0432\n    sessions_tab.should_be_sessions_table()\n\n    # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043a\u043e\u043d\u0442\u0435\u043d\u0442\u0430 \u0438 \u0441\u043a\u0440\u043e\u043b\u043b\u0438\u043d\u0433\u0430 \u043e\u043a\u043d\u0430 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u044f \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u0441\u0435\u0430\u043d\u0441\u0430\n    sessions_tab.check_delete_session_confirm_window()\n
    "},{"location":"tests/e2e/test_sessions_tab/#tests.e2e.test_sessions_tab.TestSessionsTab.test_multiple_users_sessions","title":"test_multiple_users_sessions(browser, cleanup_users)","text":"

    \u0422\u0435\u0441\u0442 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 \u0438 \u0438\u0445 \u0441\u0435\u0430\u043d\u0441\u043e\u0432.

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442: 1. \u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 User1..User3 2. \u0412\u0445\u043e\u0434 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0443 \u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0441\u0435\u0430\u043d\u0441\u043e\u0432 3. \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043d\u0430\u043b\u0438\u0447\u0438\u044f \u0441\u0435\u0430\u043d\u0441\u0430 \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435 4. \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0441\u043a\u0440\u043e\u043b\u043b\u0438\u043d\u0433\u0430 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0441 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e\u043c \u0441\u0435\u0430\u043d\u0441\u043e\u0432 5. \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043f\u043e\u0434\u0441\u0432\u0435\u0442\u043a\u0438 \u0441\u0442\u0440\u043e\u043a \u0442\u0430\u0431\u043b\u0438\u0446\u044b 6. \u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0444\u0438\u043a\u0441\u0442\u0443\u0440\u043e\u0439 cleanup_users

    Source code in tests\\e2e\\test_sessions_tab.py
    def test_multiple_users_sessions(self, browser: Page, cleanup_users: None) -> None:\n    \"\"\"\u0422\u0435\u0441\u0442 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 \u0438 \u0438\u0445 \u0441\u0435\u0430\u043d\u0441\u043e\u0432.\n\n    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442:\n    1. \u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 User1..User3\n    2. \u0412\u0445\u043e\u0434 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0443 \u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0441\u0435\u0430\u043d\u0441\u043e\u0432\n    3. \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043d\u0430\u043b\u0438\u0447\u0438\u044f \u0441\u0435\u0430\u043d\u0441\u0430 \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435\n    4. \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0441\u043a\u0440\u043e\u043b\u043b\u0438\u043d\u0433\u0430 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0441 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e\u043c \u0441\u0435\u0430\u043d\u0441\u043e\u0432\n    5. \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043f\u043e\u0434\u0441\u0432\u0435\u0442\u043a\u0438 \u0441\u0442\u0440\u043e\u043a \u0442\u0430\u0431\u043b\u0438\u0446\u044b\n    6. \u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0444\u0438\u043a\u0441\u0442\u0443\u0440\u043e\u0439 cleanup_users\n    \"\"\"\n    users_data = [\n        {\"name\": \"TestUser1\", \"role\": \"\u0410\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440\", \"password\": \"password1\"},\n        {\"name\": \"TestUser2\", \"role\": \"\u0410\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440\", \"password\": \"password2\"},\n        {\"name\": \"TestUser3\", \"role\": \"\u0410\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440\", \"password\": \"password3\"}\n    ]\n\n    session_tokens = []\n\n    mp = MainPage(browser)\n    ut = UsersTab(browser)\n    mp.click_subpanel_item(\"\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438\")\n\n    # \u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439\n    for user_data in users_data:\n        mp.click_subpanel_item(\"\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438\")\n        mp.click_subpanel_item(\"\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438\")\n        ut.open_add_user_window()\n        ut.add_new_user(user_data)\n\n        # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043d\u0430\u043b\u0438\u0447\u0438\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435\n        ut.should_be_user_in_table(user_data[\"name\"], user_data[\"role\"])\n\n    # \u0412\u0445\u043e\u0434 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0438 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0442\u043e\u043a\u0435\u043d\u043e\u0432 \u0441\u0435\u0430\u043d\u0441\u043e\u0432\n    for user_data in users_data:\n        # \u0412\u0445\u043e\u0434 \u043d\u043e\u0432\u044b\u043c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u043c\n        login_page = LoginPage(browser)\n        login_page.do_login(username=user_data[\"name\"], password=user_data[\"password\"])\n\n        # \u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0442\u043e\u043a\u0435\u043d\u0430 \u0441\u0435\u0430\u043d\u0441\u043e\u0432\n        sessions_tab = SessionsTab(browser)\n        #sessions_tab.should_be_sessions_table()\n        session_token = sessions_tab.get_session_token()\n        session_tokens.append(session_token)\n\n    # \u0412\u043e\u0437\u0432\u0440\u0430\u0442 \u0430\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440\u0430 \u0434\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0441\u0435\u0430\u043d\u0441\u043e\u0432\n    login_page = LoginPage(browser)\n    login_page.do_login()\n\n    mp = MainPage(browser)\n    mp.click_main_navigation_panel_item(\"\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438\")\n    mp.click_subpanel_item(\"\u041e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u043d\u0438\u0435 \u0438 \u0434\u0438\u0430\u0433\u043d\u043e\u0441\u0442\u0438\u043a\u0430\")\n    mp.click_subpanel_item(\"\u0421\u0435\u0430\u043d\u0441\u044b\")\n\n    sessions_tab = SessionsTab(browser)\n    sessions_tab.should_be_sessions_table()\n\n    # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043d\u0430\u043b\u0438\u0447\u0438\u044f \u0441\u0435\u0430\u043d\u0441\u043e\u0432 \u0432\u0441\u0435\u0445 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439\n    for session_token in session_tokens:\n        sessions_tab.should_be_session_in_table(session_token)\n\n    # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0441\u043a\u0440\u043e\u043b\u043b\u0438\u043d\u0433\u0430 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0441 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e\u043c \u0441\u0435\u0430\u043d\u0441\u043e\u0432\n    self._test_sessions_table_scrolling(sessions_tab)\n\n    # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043f\u043e\u0434\u0441\u0432\u0435\u0442\u043a\u0438 \u0441\u0442\u0440\u043e\u043a \u0442\u0430\u0431\u043b\u0438\u0446\u044b\n    rows_count = sessions_tab.get_rows_count()\n    browser.wait_for_timeout(1000)\n\n    # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043f\u043e\u0434\u0441\u0432\u0435\u0442\u043a\u0438 \u043f\u0435\u0440\u0432\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438\n    sessions_tab.check_sessions_table_row_highlighting(0)\n\n    # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043f\u043e\u0434\u0441\u0432\u0435\u0442\u043a\u0438 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0439 \u0441\u0442\u0440\u043e\u043a\u0438 (\u0435\u0441\u043b\u0438 \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435 \u0431\u043e\u043b\u0435\u0435 \u043e\u0434\u043d\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438)\n    if rows_count > 1:\n        browser.wait_for_timeout(1000)\n        sessions_tab.check_sessions_table_row_highlighting(rows_count - 1)\n
    "},{"location":"tests/e2e/test_sessions_tab/#tests.e2e.test_sessions_tab.TestSessionsTab.test_session_auto_deletion_after_15_minutes","title":"test_session_auto_deletion_after_15_minutes(browser, cleanup_users)","text":"

    \u0422\u0435\u0441\u0442 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u0441\u0435\u0430\u043d\u0441\u0430 \u0447\u0435\u0440\u0435\u0437 15 \u043c\u0438\u043d\u0443\u0442 \u043f\u043e\u0441\u043b\u0435 \u0432\u044b\u0445\u043e\u0434\u0430 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442: 1. \u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043d\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f 2. \u0412\u0445\u043e\u0434 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0441\u0435\u0430\u043d\u0441\u0430 3. \u0412\u044b\u0445\u043e\u0434 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0438\u0437 \u0441\u0438\u0441\u0442\u0435\u043c\u044b 4. \u041e\u0436\u0438\u0434\u0430\u043d\u0438\u0435 15 \u043c\u0438\u043d\u0443\u0442 5. \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u0441\u0435\u0430\u043d\u0441\u0430 \u043f\u043e \u0438\u0441\u0442\u0435\u0447\u0435\u043d\u0438\u0438 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 6. \u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0444\u0438\u043a\u0441\u0442\u0443\u0440\u043e\u0439 cleanup_users

    Source code in tests\\e2e\\test_sessions_tab.py
    @pytest.mark.skip(reason=\"\u0422\u0440\u0435\u0431\u0443\u0435\u0442 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0442\u0430\u0439\u043c\u0435\u0440\u0430 \u043e\u0447\u0438\u0441\u0442\u043a\u0438 \u0441\u0435\u0430\u043d\u0441\u043e\u0432\")\ndef test_session_auto_deletion_after_15_minutes(self, browser: Page, cleanup_users: None) -> None:\n    \"\"\"\u0422\u0435\u0441\u0442 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u0441\u0435\u0430\u043d\u0441\u0430 \u0447\u0435\u0440\u0435\u0437 15 \u043c\u0438\u043d\u0443\u0442 \u043f\u043e\u0441\u043b\u0435 \u0432\u044b\u0445\u043e\u0434\u0430 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\n\n    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442:\n    1. \u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043d\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\n    2. \u0412\u0445\u043e\u0434 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0441\u0435\u0430\u043d\u0441\u0430\n    3. \u0412\u044b\u0445\u043e\u0434 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0438\u0437 \u0441\u0438\u0441\u0442\u0435\u043c\u044b\n    4. \u041e\u0436\u0438\u0434\u0430\u043d\u0438\u0435 15 \u043c\u0438\u043d\u0443\u0442\n    5. \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u0441\u0435\u0430\u043d\u0441\u0430 \u043f\u043e \u0438\u0441\u0442\u0435\u0447\u0435\u043d\u0438\u0438 \u0432\u0440\u0435\u043c\u0435\u043d\u0438\n    6. \u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0444\u0438\u043a\u0441\u0442\u0443\u0440\u043e\u0439 cleanup_users\n    \"\"\"\n    user_data = {\"name\": \"TestUserFor15MinDeletion\", \"role\": \"\u0410\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440\", \"password\": \"qwerty123\"}\n\n    mp = MainPage(browser)\n    ut = UsersTab(browser)\n\n    # \u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043d\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\n    mp.click_subpanel_item(\"\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438\")\n    ut.open_add_user_window()\n    ut.add_new_user(user_data)\n\n    # \u041e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u0441\u043f\u0438\u0441\u043a\u0430 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439\n    mp.click_subpanel_item(\"\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438\")\n    mp.click_subpanel_item(\"\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438\")\n\n    # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043d\u0430\u043b\u0438\u0447\u0438\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435\n    ut.should_be_user_in_table(user_data[\"name\"], user_data[\"role\"])\n\n    # \u0412\u0445\u043e\u0434 \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0443 \u0434\u043b\u044f \u043d\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\n    new_lp = LoginPage(browser)\n    new_lp.do_login(username=user_data[\"name\"], password=user_data[\"password\"])\n\n    # \u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0442\u043e\u043a\u0435\u043d\u0430 \u0441\u0435\u0441\u0441\u0438\u0438 \u043d\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\n    new_mp = MainPage(browser)\n\n    # \u041e\u0442\u043a\u0440\u044b\u0442\u044c \u0432\u043a\u043b\u0430\u0434\u043a\u0443 \u0421\u0435\u0441\u0441\u0438\u0438\n    new_mp.should_be_navigation_panel()\n    new_mp.click_main_navigation_panel_item(\"\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438\")\n    new_mp.click_subpanel_item(\"\u041e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u043d\u0438\u0435 \u0438 \u0434\u0438\u0430\u0433\u043d\u043e\u0441\u0442\u0438\u043a\u0430\")\n    new_mp.click_subpanel_item(\"\u0421\u0435\u0430\u043d\u0441\u044b\")\n\n    # \u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0442\u043e\u043a\u0435\u043d \u0441\u0435\u0441\u0441\u0438\u0438\n    sessions_tab = SessionsTab(browser)\n    session_token = sessions_tab.get_session_token()\n\n    # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043d\u0430\u043b\u0438\u0447\u0438\u044f \u0441\u0435\u0441\u0441\u0438\u0438 \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435\n    sessions_tab.should_be_session_in_table(session_token)\n\n    # \u0412\u044b\u0445\u043e\u0434 \u0438\u0437 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u043d\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\n    new_mp.do_logout()\n\n    # \u0410\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u044f \u0430\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440\u043e\u043c\n    admin_lp = LoginPage(browser)\n    admin_lp.do_login()\n\n    # \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u043d\u0430 \u0432\u043a\u043b\u0430\u0434\u043a\u0443 \u0421\u0435\u0430\u043d\u0441\u044b\n    admin_mp = MainPage(browser)\n    admin_mp.should_be_navigation_panel()\n    admin_mp.click_main_navigation_panel_item(\"\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438\")\n    admin_mp.click_subpanel_item(\"\u041e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u043d\u0438\u0435 \u0438 \u0434\u0438\u0430\u0433\u043d\u043e\u0441\u0442\u0438\u043a\u0430\")\n    admin_mp.click_subpanel_item(\"\u0421\u0435\u0430\u043d\u0441\u044b\")\n\n    # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043d\u0430\u043b\u0438\u0447\u0438\u044f \u0441\u0435\u0441\u0441\u0438\u0438 \u0441\u0440\u0430\u0437\u0443 \u043f\u043e\u0441\u043b\u0435 \u0432\u044b\u0445\u043e\u0434\u0430\n    admin_sessions_tab = SessionsTab(browser)\n    admin_sessions_tab.should_be_session_in_table(session_token)\n\n    admin_mp.do_logout()\n\n    # \u041e\u0436\u0438\u0434\u0430\u043d\u0438\u0435 15 \u043c\u0438\u043d\u0443\u0442 1 \u0441\u0435\u043a\u0443\u043d\u0434\u0430 (901 \u0441\u0435\u043a\u0443\u043d\u0434)\n    print(\"\u041e\u0436\u0438\u0434\u0430\u043d\u0438\u0435 15 \u043c\u0438\u043d\u0443\u0442 \u0434\u043b\u044f \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u0441\u0435\u0430\u043d\u0441\u0430...\")\n    browser.wait_for_timeout(901000)  # 15 \u043c\u0438\u043d\u0443\u0442 1 \u0441\u0435\u043a\u0443\u043d\u0434\u0430 \u0432 \u043c\u0438\u043b\u043b\u0438\u0441\u0435\u043a\u0443\u043d\u0434\u0430\u0445\n\n    # \u0410\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u044f \u0430\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440\u043e\u043c\n    admin_lp = LoginPage(browser)\n    admin_lp.do_login()\n\n    # \u041f\u043e\u0432\u0442\u043e\u0440\u043d\u044b\u0439 \u043f\u0435\u0440\u0435\u0445\u043e\u0434 \u043d\u0430 \u0432\u043a\u043b\u0430\u0434\u043a\u0443 \u0421\u0435\u0430\u043d\u0441\u044b \u043f\u043e\u0441\u043b\u0435 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f\n    admin_mp = MainPage(browser)\n    admin_mp.should_be_navigation_panel()\n    admin_mp.click_main_navigation_panel_item(\"\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438\")\n    admin_mp.click_subpanel_item(\"\u041e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u043d\u0438\u0435 \u0438 \u0434\u0438\u0430\u0433\u043d\u043e\u0441\u0442\u0438\u043a\u0430\")\n    admin_mp.click_subpanel_item(\"\u0421\u0435\u0430\u043d\u0441\u044b\")\n\n    # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u044f \u0441\u0435\u0441\u0441\u0438\u0438 \u043f\u043e\u0441\u043b\u0435 15 \u043c\u0438\u043d\u0443\u0442\n    admin_sessions_tab = SessionsTab(browser)\n    admin_sessions_tab.should_be_sessions_table()\n    admin_sessions_tab.should_not_be_session_in_table(session_token)\n
    "},{"location":"tests/e2e/test_sessions_tab/#tests.e2e.test_sessions_tab.TestSessionsTab.test_session_removed_when_user_deleted","title":"test_session_removed_when_user_deleted(browser, cleanup_users)","text":"

    \u0422\u0435\u0441\u0442 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u0441\u0435\u0430\u043d\u0441\u0430 \u043f\u0440\u0438 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442: 1. \u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043d\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f 2. \u0412\u0445\u043e\u0434 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0441\u0435\u0430\u043d\u0441\u0430 3. \u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0430\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440\u043e\u043c 4. \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u0441\u0435\u0430\u043d\u0441\u0430 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f

    Source code in tests\\e2e\\test_sessions_tab.py
    @pytest.mark.skip(reason=\"\u041d\u0435 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u043e \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u043c\")\ndef test_session_removed_when_user_deleted(self, browser: Page, cleanup_users: None) -> None:\n    \"\"\"\u0422\u0435\u0441\u0442 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u0441\u0435\u0430\u043d\u0441\u0430 \u043f\u0440\u0438 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\n\n    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442:\n    1. \u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043d\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\n    2. \u0412\u0445\u043e\u0434 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0441\u0435\u0430\u043d\u0441\u0430\n    3. \u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0430\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440\u043e\u043c\n    4. \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u0441\u0435\u0430\u043d\u0441\u0430 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\n    \"\"\"\n    user_data = {\"name\": \"UserForAutoSessionDeletion\", \"role\": \"\u0410\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440\", \"password\": \"qwerty123\"}\n\n    mp = MainPage(browser)\n    ut = UsersTab(browser)\n\n    # \u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043d\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\n    mp.click_subpanel_item(\"\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438\")\n    ut.open_add_user_window()\n    ut.add_new_user(user_data)\n\n    # \u041e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u0441\u043f\u0438\u0441\u043a\u0430 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439\n    mp.click_subpanel_item(\"\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438\")\n    mp.click_subpanel_item(\"\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438\")\n\n    # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043d\u0430\u043b\u0438\u0447\u0438\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435\n    ut.should_be_user_in_table(user_data[\"name\"], user_data[\"role\"])\n\n    # \u0412\u0445\u043e\u0434 \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0443 \u0434\u043b\u044f \u043d\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\n    new_lp = LoginPage(browser)\n    new_lp.do_login(username=user_data[\"name\"], password=user_data[\"password\"])\n\n    # \u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0442\u043e\u043a\u0435\u043d\u0430 \u0441\u0435\u0441\u0441\u0438\u0438 \u043d\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\n    new_mp = MainPage(browser)\n\n    # \u041e\u0442\u043a\u0440\u044b\u0442\u044c \u0432\u043a\u043b\u0430\u0434\u043a\u0443 \u0421\u0435\u0441\u0441\u0438\u0438\n    new_mp.should_be_navigation_panel()\n    new_mp.click_main_navigation_panel_item(\"\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438\")\n    new_mp.click_subpanel_item(\"\u041e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u043d\u0438\u0435 \u0438 \u0434\u0438\u0430\u0433\u043d\u043e\u0441\u0442\u0438\u043a\u0430\")\n    new_mp.click_subpanel_item(\"\u0421\u0435\u0430\u043d\u0441\u044b\")\n\n    # \u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0442\u043e\u043a\u0435\u043d \u0441\u0435\u0441\u0441\u0438\u0438\n    sessions_tab = SessionsTab(browser)\n    new_user_token = sessions_tab.get_session_token()\n\n    # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043d\u0430\u043b\u0438\u0447\u0438\u044f \u0441\u0435\u0441\u0441\u0438\u0438 \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435\n    sessions_tab.should_be_session_in_table(new_user_token)\n\n    # \u0412\u044b\u0445\u043e\u0434 \u0438\u0437 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u043d\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\n    new_mp.do_logout()\n\n    # \u0410\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u044f \u0430\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440\u043e\u043c\n    admin_lp = LoginPage(browser)\n    admin_lp.do_login()\n\n    # \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u043d\u0430 \u0432\u043a\u043b\u0430\u0434\u043a\u0443 \u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438\n    admin_mp = MainPage(browser)\n    admin_mp.click_main_navigation_panel_item(\"\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438\")\n    admin_mp.click_subpanel_item(\"\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438\")\n\n    # \u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\n    admin_ut = UsersTab(browser)\n    admin_ut.open_edit_user_page_by_user(user_data[\"name\"], user_data[\"role\"])\n    admin_ut.delete_user(user_data[\"name\"])\n\n    # \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u043d\u0430 \u0432\u043a\u043b\u0430\u0434\u043a\u0443 \u0421\u0435\u0430\u043d\u0441\u044b\n    admin_mp.click_main_navigation_panel_item(\"\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438\")\n    admin_mp.click_main_navigation_panel_item(\"\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438\")\n    admin_mp.click_subpanel_item(\"\u041e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u043d\u0438\u0435 \u0438 \u0434\u0438\u0430\u0433\u043d\u043e\u0441\u0442\u0438\u043a\u0430\")\n    admin_mp.click_subpanel_item(\"\u0421\u0435\u0430\u043d\u0441\u044b\")\n\n    # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u044f \u0441\u0435\u0441\u0441\u0438\u0438 \u043f\u043e\u0441\u043b\u0435 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\n    admin_sessions_tab = SessionsTab(browser)\n    admin_sessions_tab.should_be_sessions_table()\n\n    # \u0421\u0435\u0441\u0441\u0438\u044f \u0434\u043e\u043b\u0436\u043d\u0430 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0443\u0434\u0430\u043b\u0438\u0442\u044c\u0441\u044f \u043f\u0440\u0438 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\n    admin_sessions_tab.should_not_be_session_in_table(new_user_token)\n
    "},{"location":"tests/e2e/test_sessions_tab/#tests.e2e.test_sessions_tab.TestSessionsTab.test_sessions_tab_content","title":"test_sessions_tab_content(browser)","text":"

    \u0422\u0435\u0441\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0433\u043e \u0432\u043a\u043b\u0430\u0434\u043a\u0438 '\u0421\u0435\u0430\u043d\u0441\u044b'.

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442: 1. \u041d\u0430\u043b\u0438\u0447\u0438\u0435 \u0438 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0441\u0442\u044c \u0442\u0443\u043b\u0431\u0430\u0440\u0430 2. \u041d\u0430\u043b\u0438\u0447\u0438\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0441\u0435\u0430\u043d\u0441\u043e\u0432 3. \u0421\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0433\u043e \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0434\u0430\u043d\u043d\u044b\u043c \u0438\u0437 \u0411\u0414

    Source code in tests\\e2e\\test_sessions_tab.py
    def test_sessions_tab_content(self, browser: Page) -> None:\n    \"\"\"\u0422\u0435\u0441\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0433\u043e \u0432\u043a\u043b\u0430\u0434\u043a\u0438 '\u0421\u0435\u0430\u043d\u0441\u044b'.\n\n    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442:\n    1. \u041d\u0430\u043b\u0438\u0447\u0438\u0435 \u0438 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0441\u0442\u044c \u0442\u0443\u043b\u0431\u0430\u0440\u0430\n    2. \u041d\u0430\u043b\u0438\u0447\u0438\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0441\u0435\u0430\u043d\u0441\u043e\u0432\n    3. \u0421\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0433\u043e \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0434\u0430\u043d\u043d\u044b\u043c \u0438\u0437 \u0411\u0414\n    \"\"\"\n    # \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u0441\u0435\u0430\u043d\u0441\u043e\u0432\n    sessions_tab = SessionsTab(browser)\n\n    # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430\n    sessions_tab.should_be_toolbar()\n    sessions_tab.should_be_sessions_table()\n\n    # \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c API \u043e\u0442\u0432\u0435\u0442\n    response = sessions_tab.send_get_api_request(\"e-nms/auth/sessions\")\n    response_body = sessions_tab.get_response_body(response)\n\n    if not response_body:\n        print(\"No sessions data from API - table might be empty\")\n        # \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u0442\u043e\u043b\u044c\u043a\u043e \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0438\n        sessions_tab.check_sessions_table_content(verify=False)\n    else:\n        sessions_tab.check_sessions_table_content(verify=True)\n\n    # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0433\u043e \u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u0441 \u0432\u0435\u0440\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0435\u0439 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438\u0437 \u0411\u0414\n    sessions_tab.check_sessions_table_content(verify=True)\n
    "},{"location":"tests/e2e/test_sessions_tab/#tests.e2e.test_sessions_tab.TestSessionsTab.test_user_cannot_delete_own_session","title":"test_user_cannot_delete_own_session(browser, cleanup_users)","text":"

    \u0422\u0435\u0441\u0442 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u043d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u0441\u0432\u043e\u0439 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u0441\u0435\u0430\u043d\u0441. \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442: 1. \u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043d\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f 2. \u0412\u0445\u043e\u0434 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0441\u0435\u0430\u043d\u0441\u0430 3. \u041f\u043e\u043f\u044b\u0442\u043a\u0443 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u0441\u0432\u043e\u0435\u0433\u043e \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0433\u043e \u0441\u0435\u0430\u043d\u0441\u0430 4. \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0443, \u0447\u0442\u043e \u043a\u043d\u043e\u043f\u043a\u0430 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u043d\u0435\u0434\u043e\u0441\u0442\u0443\u043f\u043d\u0430 \u0438\u043b\u0438 \u0441\u043a\u0440\u044b\u0442\u0430 5. \u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0444\u0438\u043a\u0441\u0442\u0443\u0440\u043e\u0439 cleanup_users

    Source code in tests\\e2e\\test_sessions_tab.py
    @pytest.mark.skip(reason=\"\u041d\u0435 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u043c, \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0431\u0438\u0437\u043d\u0435\u0441-\u043b\u043e\u0433\u0438\u043a\u0438\")\ndef test_user_cannot_delete_own_session(self, browser: Page, cleanup_users: None) -> None:\n    \"\"\"\u0422\u0435\u0441\u0442 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u043d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u0441\u0432\u043e\u0439 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u0441\u0435\u0430\u043d\u0441.\n    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442:\n    1. \u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043d\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\n    2. \u0412\u0445\u043e\u0434 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0441\u0435\u0430\u043d\u0441\u0430\n    3. \u041f\u043e\u043f\u044b\u0442\u043a\u0443 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u0441\u0432\u043e\u0435\u0433\u043e \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0433\u043e \u0441\u0435\u0430\u043d\u0441\u0430\n    4. \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0443, \u0447\u0442\u043e \u043a\u043d\u043e\u043f\u043a\u0430 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u043d\u0435\u0434\u043e\u0441\u0442\u0443\u043f\u043d\u0430 \u0438\u043b\u0438 \u0441\u043a\u0440\u044b\u0442\u0430\n    5. \u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0444\u0438\u043a\u0441\u0442\u0443\u0440\u043e\u0439 cleanup_users\n    \"\"\"\n    user_data = {\"name\": \"TestUserForSelfDeletion\", \"role\": \"\u0410\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440\", \"password\": \"qwerty123\"}\n\n    mp = MainPage(browser)\n    ut = UsersTab(browser)\n\n    # \u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043d\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\n    mp.click_subpanel_item(\"\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438\")\n    ut.open_add_user_window()\n    ut.add_new_user(user_data)\n\n    # \u041e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u0441\u043f\u0438\u0441\u043a\u0430 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439\n    mp.click_subpanel_item(\"\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438\")\n    mp.click_subpanel_item(\"\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438\")\n\n    # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043d\u0430\u043b\u0438\u0447\u0438\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435\n    ut.should_be_user_in_table(user_data[\"name\"], user_data[\"role\"])\n\n    # \u0412\u0445\u043e\u0434 \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0443 \u0434\u043b\u044f \u043d\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\n    new_lp = LoginPage(browser)\n    new_lp.do_login(username=user_data[\"name\"], password=user_data[\"password\"])\n\n    # \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u043d\u0430 \u0432\u043a\u043b\u0430\u0434\u043a\u0443 \u0421\u0435\u0430\u043d\u0441\u044b\n    new_mp = MainPage(browser)\n    new_mp.should_be_navigation_panel()\n    new_mp.click_main_navigation_panel_item(\"\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438\")\n    new_mp.click_subpanel_item(\"\u041e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u043d\u0438\u0435 \u0438 \u0434\u0438\u0430\u0433\u043d\u043e\u0441\u0442\u0438\u043a\u0430\")\n    new_mp.click_subpanel_item(\"\u0421\u0435\u0430\u043d\u0441\u044b\")\n\n    # \u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0442\u043e\u043a\u0435\u043d \u0441\u0435\u0441\u0441\u0438\u0438\n    sessions_tab = SessionsTab(browser)\n    session_token = sessions_tab.get_session_token()\n\n    # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043d\u0430\u043b\u0438\u0447\u0438\u044f \u0441\u0435\u0441\u0441\u0438\u0438 \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435\n    sessions_tab.should_be_session_in_table(session_token)\n\n    # \u041f\u043e\u043f\u044b\u0442\u043a\u0430 \u043d\u0430\u0439\u0442\u0438 \u043a\u043d\u043e\u043f\u043a\u0443 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u0434\u043b\u044f \u0441\u0432\u043e\u0435\u0433\u043e \u0441\u0435\u0430\u043d\u0441\u0430\n    row_index = sessions_tab.find_session_in_table(session_token)\n\n    # \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c, \u0447\u0442\u043e \u043a\u043d\u043e\u043f\u043a\u0430 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u043b\u0438\u0431\u043e \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442, \u043b\u0438\u0431\u043e \u043d\u0435\u0430\u043a\u0442\u0438\u0432\u043d\u0430\n    delete_button = sessions_tab.get_delete_session_button_from_row(row_index)\n\n    # \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c, \u0447\u0442\u043e \u043a\u043d\u043e\u043f\u043a\u0430 \u043b\u0438\u0431\u043e \u043d\u0435 \u0432\u0438\u0434\u0438\u043c\u0430, \u043b\u0438\u0431\u043e \u043e\u0442\u043a\u043b\u044e\u0447\u0435\u043d\u0430\n    expect(delete_button).not_to_be_visible()\n\n    # \u0412\u044b\u0445\u043e\u0434 \u0438\u0437 \u0441\u0438\u0441\u0442\u0435\u043c\u044b\n    new_mp.do_logout()\n
    "},{"location":"tests/e2e/test_templates_tab/","title":"TestTemplatesTab","text":"

    \u041c\u043e\u0434\u0443\u043b\u044c \u0442\u0435\u0441\u0442\u043e\u0432 \u0432\u043a\u043b\u0430\u0434\u043a\u0438 '\u0428\u0430\u0431\u043b\u043e\u043d\u044b'.

    \u0421\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0442\u0435\u0441\u0442\u044b \u0434\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0448\u0430\u0431\u043b\u043e\u043d\u0430\u043c\u0438.

    "},{"location":"tests/e2e/test_templates_tab/#tests.e2e.test_templates_tab.TestTemplatesTab","title":"TestTemplatesTab","text":"

    \u041d\u0430\u0431\u043e\u0440 \u0442\u0435\u0441\u0442\u043e\u0432 \u0434\u043b\u044f \u0432\u043a\u043b\u0430\u0434\u043a\u0438 '\u0428\u0430\u0431\u043b\u043e\u043d\u044b'.

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0441\u0442\u044c \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0432\u043a\u043b\u0430\u0434\u043a\u0438 \u0428\u0430\u0431\u043b\u043e\u043d\u044b.

    \u0422\u0435\u0441\u0442\u044b \u043f\u043e\u043a\u0440\u044b\u0432\u0430\u044e\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0438: 1. test_templates_tab_content - \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0433\u043e \u0432\u043a\u043b\u0430\u0434\u043a\u0438 (\u0442\u0443\u043b\u0431\u0430\u0440, \u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u0448\u0430\u0431\u043b\u043e\u043d\u043e\u0432) 2. test_templates_table_row_highlighting - \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0441\u0442\u0440\u043e\u043a \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435 \u0448\u0430\u0431\u043b\u043e\u043d\u043e\u0432 3. test_templates_table_scrolling - \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0441\u043a\u0440\u043e\u043b\u043b\u0438\u043d\u0433\u0430 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0448\u0430\u0431\u043b\u043e\u043d\u043e\u0432 4. test_templates_modal_window_content - \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0433\u043e \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430 \u0448\u0430\u0431\u043b\u043e\u043d\u0430 5. test_templates_modal_window_scrolling - \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0441\u043a\u0440\u043e\u043b\u043b\u0438\u043d\u0433\u0430 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430 \u0448\u0430\u0431\u043b\u043e\u043d\u0430 6. test_templates_modal_window_api_data_consistency - [\u0412 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0435] \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430 \u0434\u0430\u043d\u043d\u044b\u043c \u0438\u0437 API

    Source code in tests\\e2e\\test_templates_tab.py
    class TestTemplatesTab:\n    \"\"\"\u041d\u0430\u0431\u043e\u0440 \u0442\u0435\u0441\u0442\u043e\u0432 \u0434\u043b\u044f \u0432\u043a\u043b\u0430\u0434\u043a\u0438 '\u0428\u0430\u0431\u043b\u043e\u043d\u044b'.\n\n    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0441\u0442\u044c \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0432\u043a\u043b\u0430\u0434\u043a\u0438 \u0428\u0430\u0431\u043b\u043e\u043d\u044b.\n\n    \u0422\u0435\u0441\u0442\u044b \u043f\u043e\u043a\u0440\u044b\u0432\u0430\u044e\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0438:\n    1. test_templates_tab_content - \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0433\u043e \u0432\u043a\u043b\u0430\u0434\u043a\u0438 (\u0442\u0443\u043b\u0431\u0430\u0440, \u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u0448\u0430\u0431\u043b\u043e\u043d\u043e\u0432)\n    2. test_templates_table_row_highlighting - \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0441\u0442\u0440\u043e\u043a \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435 \u0448\u0430\u0431\u043b\u043e\u043d\u043e\u0432\n    3. test_templates_table_scrolling - \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0441\u043a\u0440\u043e\u043b\u043b\u0438\u043d\u0433\u0430 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0448\u0430\u0431\u043b\u043e\u043d\u043e\u0432\n    4. test_templates_modal_window_content - \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0433\u043e \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430 \u0448\u0430\u0431\u043b\u043e\u043d\u0430\n    5. test_templates_modal_window_scrolling - \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0441\u043a\u0440\u043e\u043b\u043b\u0438\u043d\u0433\u0430 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430 \u0448\u0430\u0431\u043b\u043e\u043d\u0430\n    6. test_templates_modal_window_api_data_consistency - [\u0412 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0435]\n       \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430 \u0434\u0430\u043d\u043d\u044b\u043c \u0438\u0437 API\n    \"\"\"\n\n    @pytest.fixture(scope=\"function\", autouse=True)\n    def setup(self, browser: Page) -> None:\n        \"\"\"\u0424\u0438\u043a\u0441\u0442\u0443\u0440\u0430 \u0434\u043b\u044f \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0438 \u0442\u0435\u0441\u0442\u043e\u0432\u043e\u0433\u043e \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f.\n\n        \u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442:\n        1. \u0410\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u044e \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0435\n        2. \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u043d\u0430 \u0432\u043a\u043b\u0430\u0434\u043a\u0443 '\u0428\u0430\u0431\u043b\u043e\u043d\u044b' \u0447\u0435\u0440\u0435\u0437 \u043f\u0430\u043d\u0435\u043b\u044c \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438\n        \"\"\"\n        # \u0410\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u044f \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0435\n        login_page = LoginPage(browser)\n        login_page.do_login()\n\n        # \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0433\u043b\u0430\u0432\u043d\u043e\u0439 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b\n        main_page = MainPage(browser)\n\n        # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0438 \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u0441 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u043c\u0438 \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438\n        main_page.should_be_navigation_panel()\n        main_page.click_main_navigation_panel_item(\"\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438\")\n        main_page.click_subpanel_item(\"\u0428\u0430\u0431\u043b\u043e\u043d\u044b\")\n\n    @pytest.mark.skip(reason=\"\u0412\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u043e \u0438\u0437 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f\")\n    def test_templates_tab_content(self, browser: Page) -> None:\n        \"\"\"\u0422\u0435\u0441\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0433\u043e \u0432\u043a\u043b\u0430\u0434\u043a\u0438 '\u0428\u0430\u0431\u043b\u043e\u043d\u044b'.\n\n        \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442:\n        1. \u041d\u0430\u043b\u0438\u0447\u0438\u0435 \u0438 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0441\u0442\u044c \u0442\u0443\u043b\u0431\u0430\u0440\u0430\n        2. \u041d\u0430\u043b\u0438\u0447\u0438\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0448\u0430\u0431\u043b\u043e\u043d\u043e\u0432\n        3. \u0421\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0433\u043e \u0442\u0430\u0431\u043b\u0438\u0446\u044b\n        \"\"\"\n        # \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u0441\u0435\u0430\u043d\u0441\u043e\u0432\n        templates_tab = TemplatesTab(browser)\n\n        # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0442\u0443\u043b\u0431\u0430\u0440\u0430 \u0432\u043a\u043b\u0430\u0434\u043a\u0438\n        templates_tab.should_be_toolbar()\n\n        # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043d\u0430\u043b\u0438\u0447\u0438\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0448\u0430\u0431\u043b\u043e\u043d\u043e\u0432\n        templates_tab.should_be_templates_table()\n\n        browser.wait_for_timeout(5000)\n\n        # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0433\u043e \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0448\u0430\u0431\u043b\u043e\u043d\u043e\u0432\n        templates_tab.check_templates_table_content()\n\n    @pytest.mark.skip(reason=\"\u0412\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u043e \u0438\u0437 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f\")\n    def test_templates_table_row_highlighting(self, browser: Page) -> None:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0441\u0442\u0440\u043e\u043a \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435 \u0448\u0430\u0431\u043b\u043e\u043d\u043e\u0432.\n\n        \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0441\u0442\u044c \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0441\u0442\u0440\u043e\u043a \u043f\u0440\u0438 \u043a\u043b\u0438\u043a\u0435 \u043d\u0430 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0435 \u043f\u043e\u0437\u0438\u0446\u0438\u0438:\n        1. \u041f\u0435\u0440\u0432\u0430\u044f \u0441\u0442\u0440\u043e\u043a\u0430\n        2. \u041f\u043e\u0441\u043b\u0435\u0434\u043d\u044f\u044f \u0441\u0442\u0440\u043e\u043a\u0430\n        3. \u0421\u0442\u0440\u043e\u043a\u0430 \u0432 \u0441\u0435\u0440\u0435\u0434\u0438\u043d\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u044b\n        \"\"\"\n\n        templates_tab = TemplatesTab(browser)\n\n        # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0442\u0443\u043b\u0431\u0430\u0440\u0430 \u0432\u043a\u043b\u0430\u0434\u043a\u0438\n        templates_tab.should_be_toolbar()\n\n        # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043d\u0430\u043b\u0438\u0447\u0438\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0448\u0430\u0431\u043b\u043e\u043d\u043e\u0432\n        templates_tab.should_be_templates_table()\n\n        # \u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0430 \u0441\u0442\u0440\u043e\u043a \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435\n        rows_count = templates_tab.get_rows_count()\n\n        # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0441\u0442\u0440\u043e\u043a\n        templates_tab.check_templates_table_row_highlighting(0)\n        templates_tab.check_templates_table_row_highlighting(rows_count - 1)\n        templates_tab.check_templates_table_row_highlighting(int(rows_count / 2))\n\n    @pytest.mark.skip(reason=\"\u0412\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u043e \u0438\u0437 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f\")\n    def test_templates_table_scrolling(self, browser: Page) -> None:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0441\u043a\u0440\u043e\u043b\u043b\u0438\u043d\u0433\u0430 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0448\u0430\u0431\u043b\u043e\u043d\u043e\u0432.\n\n        \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442:\n        1. \u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u0439 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u044b\n        2. \u0412\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u0441\u0442\u0440\u043e\u043a \u043f\u043e\u0441\u043b\u0435 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0438 \u0432\u043d\u0438\u0437 \u0438 \u0432\u0432\u0435\u0440\u0445\n        3. \u041a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0441\u0442\u044c \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445 \u043f\u043e\u0441\u043b\u0435 \u0441\u043a\u0440\u043e\u043b\u043b\u0438\u043d\u0433\u0430\n        \"\"\"\n\n        templates_tab = TemplatesTab(browser)\n\n        browser.wait_for_timeout(2000)\n\n        # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0441\u043a\u0440\u043e\u043b\u043b\u0438\u043d\u0433\u0430\n        is_scrollable = templates_tab.check_templates_table_verticall_scrolling()\n\n        if is_scrollable:\n            print(\"\u0422\u0430\u0431\u043b\u0438\u0446\u0430 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u0439 \u0441\u043a\u0440\u043e\u043b\u043b\u0438\u043d\u0433\")\n\n            # \u041f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0430 \u0432\u043d\u0438\u0437\n            templates_tab.scroll_templates_table_down()\n\n            browser.wait_for_timeout(1000)\n\n            # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0439 \u0441\u0442\u0440\u043e\u043a\u0438 \u043f\u043e\u0441\u043b\u0435 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0438\n            templates_tab.check_templates_table_last_row_visibility()\n\n            # \u041f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0430 \u0432\u0432\u0435\u0440\u0445\n            templates_tab.scroll_templates_table_up()\n\n            browser.wait_for_timeout(1000)\n\n            # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u043f\u0435\u0440\u0432\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438 \u043f\u043e\u0441\u043b\u0435 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0438\n            templates_tab.check_templates_table_first_row_visibility()\n        else:\n            print(\"\u0422\u0430\u0431\u043b\u0438\u0446\u0430 \u043d\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u0439 \u0441\u043a\u0440\u043e\u043b\u043b\u0438\u043d\u0433 - \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u0431\u0430\u0437\u043e\u0432\u0443\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c\")\n\n            # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u043f\u0435\u0440\u0432\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438\n            templates_tab.check_templates_table_first_row_visibility()\n\n    @pytest.mark.skip(reason=\"\u0412\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u043e \u0438\u0437 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f\")\n    def test_templates_modal_window_content(self, browser: Page) -> None:\n        \"\"\"\u0422\u0435\u0441\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0433\u043e \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430 \u0448\u0430\u0431\u043b\u043e\u043d\u0430.\n\n        \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442:\n        1. \u041e\u0442\u043a\u0440\u044b\u0442\u0438\u0435 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430 \u043f\u0440\u0438 \u043a\u043b\u0438\u043a\u0435 \u043d\u0430 \u0441\u0442\u0440\u043e\u043a\u0443 \u0442\u0430\u0431\u043b\u0438\u0446\u044b\n        2. \u041d\u0430\u043b\u0438\u0447\u0438\u0435 \u0438 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430\n        3. \u041d\u0430\u043b\u0438\u0447\u0438\u0435 \u0442\u0443\u043b\u0431\u0430\u0440\u0430 \u0432 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u043c \u043e\u043a\u043d\u0435\n        4. \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043a\u043d\u043e\u043f\u043a\u0438 \u0437\u0430\u043a\u0440\u044b\u0442\u0438\u044f \u0438 \u0435\u0451 \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0438\n        5. \u0417\u0430\u043a\u0440\u044b\u0442\u0438\u0435 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430\n        \"\"\"\n        # \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u0448\u0430\u0431\u043b\u043e\u043d\u043e\u0432\n        templates_tab = TemplatesTab(browser)\n\n        # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043d\u0430\u043b\u0438\u0447\u0438\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0448\u0430\u0431\u043b\u043e\u043d\u043e\u0432\n        templates_tab.should_be_templates_table()\n\n        # \u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0437\u0430\u0434\u0435\u0440\u0436\u043a\u0443 \u0434\u043b\u044f \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u0434\u0430\u043d\u043d\u044b\u0445\n        browser.wait_for_timeout(2000)\n\n        # \u041e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u043c \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043a\u043d\u043e, \u043a\u043b\u0438\u043a\u0430\u044f \u043d\u0430 \u043f\u0435\u0440\u0432\u0443\u044e \u0441\u0442\u0440\u043e\u043a\u0443 \u0442\u0430\u0431\u043b\u0438\u0446\u044b\n        template_name = templates_tab.open_template_modal(0)\n\n        # \u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0437\u0430\u0434\u0435\u0440\u0436\u043a\u0443 \u0434\u043b\u044f \u043e\u0442\u043a\u0440\u044b\u0442\u0438\u044f \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430\n        browser.wait_for_timeout(1000)\n\n        # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043e\u0442\u043a\u0440\u044b\u0442\u0438\u044f \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430\n        templates_tab.should_be_modal_window()\n\n        # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0433\u043e \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430\n        templates_tab.check_templates_modal_content(template_name)\n\n        # \u0417\u0430\u043a\u0440\u044b\u0442\u0438\u0435 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430 \u0447\u0435\u0440\u0435\u0437 \u043a\u043d\u043e\u043f\u043a\u0443 \u0437\u0430\u043a\u0440\u044b\u0442\u0438\u044f\n        templates_tab.close_modal_window_by_toolbar_button(template_name)\n\n        # \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c, \u0447\u0442\u043e \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043a\u043d\u043e \u0437\u0430\u043a\u0440\u044b\u043b\u043e\u0441\u044c\n        templates_tab.should_not_be_modal_window()\n\n    @pytest.mark.skip(reason=\"\u0412\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u043e \u0438\u0437 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f\")\n    def test_templates_modal_window_scrolling(self, browser: Page) -> None:\n        \"\"\"\u0422\u0435\u0441\u0442 \u0441\u043a\u0440\u043e\u043b\u043b\u0438\u043d\u0433\u0430 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430 \u0448\u0430\u0431\u043b\u043e\u043d\u0430.\n\n        \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442:\n        1. \u041e\u0442\u043a\u0440\u044b\u0442\u0438\u0435 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430 \u043f\u0440\u0438 \u043a\u043b\u0438\u043a\u0435 \u043d\u0430 \u0441\u0442\u0440\u043e\u043a\u0443 \u0442\u0430\u0431\u043b\u0438\u0446\u044b\n        2. \u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0441\u043a\u0440\u043e\u043b\u043b\u0438\u043d\u0433\u0430 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0433\u043e \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430\n        3. \u0417\u0430\u043a\u0440\u044b\u0442\u0438\u0435 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430\n        \"\"\"\n\n        # \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u0448\u0430\u0431\u043b\u043e\u043d\u043e\u0432\n        templates_tab = TemplatesTab(browser)\n\n        # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043d\u0430\u043b\u0438\u0447\u0438\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0448\u0430\u0431\u043b\u043e\u043d\u043e\u0432\n        templates_tab.should_be_templates_table()\n\n        # \u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0437\u0430\u0434\u0435\u0440\u0436\u043a\u0443 \u0434\u043b\u044f \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u0434\u0430\u043d\u043d\u044b\u0445\n        browser.wait_for_timeout(2000)\n\n        # \u041e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u043c \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043a\u043d\u043e, \u043a\u043b\u0438\u043a\u0430\u044f \u043d\u0430 \u043f\u0435\u0440\u0432\u0443\u044e \u0441\u0442\u0440\u043e\u043a\u0443 \u0442\u0430\u0431\u043b\u0438\u0446\u044b\n        template_name = templates_tab.open_template_modal(0)\n\n        # \u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0437\u0430\u0434\u0435\u0440\u0436\u043a\u0443 \u0434\u043b\u044f \u043e\u0442\u043a\u0440\u044b\u0442\u0438\u044f \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430\n        browser.wait_for_timeout(1000)\n\n        # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043e\u0442\u043a\u0440\u044b\u0442\u0438\u044f \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430\n        templates_tab.should_be_modal_window()\n\n        # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0441\u043a\u0440\u043e\u043b\u043b\u0438\u043d\u0433\u0430 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430\n        is_scrollable = templates_tab.check_modal_vertical_scrolling()\n\n        if is_scrollable:\n            print(\"\u041c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043a\u043d\u043e \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u0439 \u0441\u043a\u0440\u043e\u043b\u043b\u0438\u043d\u0433\")\n\n            # \u041f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0430 \u0432\u043d\u0438\u0437\n            templates_tab.scroll_modal_down()\n            browser.wait_for_timeout(1000)\n\n            # \u041f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0430 \u0432\u0432\u0435\u0440\u0445\n            templates_tab.scroll_modal_up()\n            browser.wait_for_timeout(1000)\n        else:\n            print(\"\u041c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043a\u043d\u043e \u043d\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u0439 \u0441\u043a\u0440\u043e\u043b\u043b\u0438\u043d\u0433\")\n\n        # \u0417\u0430\u043a\u0440\u044b\u0442\u0438\u0435 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430 \u0447\u0435\u0440\u0435\u0437 \u043a\u043d\u043e\u043f\u043a\u0443 \u0437\u0430\u043a\u0440\u044b\u0442\u0438\u044f\n        templates_tab.close_modal_window_by_toolbar_button(template_name)\n\n        # \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c, \u0447\u0442\u043e \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043a\u043d\u043e \u0437\u0430\u043a\u0440\u044b\u043b\u043e\u0441\u044c\n        templates_tab.should_not_be_modal_window()\n\n    #@pytest.mark.skip(reason=\"\u0420\u0430\u0437\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442\u0441\u044f. \u0412\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u043e \u0438\u0437 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f\")\n    def test_templates_modal_window_api_data_consistency(self, browser: Page) -> None:\n        \"\"\"\u0422\u0435\u0441\u0442 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430 \u0434\u0430\u043d\u043d\u044b\u043c \u0438\u0437 API.\n\n        \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442:\n        1. \u041e\u0442\u043a\u0440\u044b\u0442\u0438\u0435 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430 \u043f\u0440\u0438 \u043a\u043b\u0438\u043a\u0435 \u043d\u0430 \u0441\u0442\u0440\u043e\u043a\u0443 \u0442\u0430\u0431\u043b\u0438\u0446\u044b\n        2. \u0421\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0435 JSON \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u043c \u043e\u043a\u043d\u0435 \u0434\u0430\u043d\u043d\u044b\u043c \u0438\u0437 API\n        3. \u0417\u0430\u043a\u0440\u044b\u0442\u0438\u0435 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430\n        \"\"\"\n        # \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u0448\u0430\u0431\u043b\u043e\u043d\u043e\u0432\n        templates_tab = TemplatesTab(browser)\n\n        # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043d\u0430\u043b\u0438\u0447\u0438\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0448\u0430\u0431\u043b\u043e\u043d\u043e\u0432\n        templates_tab.should_be_templates_table()\n\n        # \u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0437\u0430\u0434\u0435\u0440\u0436\u043a\u0443 \u0434\u043b\u044f \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u0434\u0430\u043d\u043d\u044b\u0445\n        browser.wait_for_timeout(5000)\n\n        # \u041e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u043c \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043a\u043d\u043e, \u043a\u043b\u0438\u043a\u0430\u044f \u043d\u0430 \u043f\u0435\u0440\u0432\u0443\u044e \u0441\u0442\u0440\u043e\u043a\u0443 \u0442\u0430\u0431\u043b\u0438\u0446\u044b\n        template_name = templates_tab.open_template_modal(0)\n\n        # \u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0437\u0430\u0434\u0435\u0440\u0436\u043a\u0443 \u0434\u043b\u044f \u043e\u0442\u043a\u0440\u044b\u0442\u0438\u044f \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430\n        browser.wait_for_timeout(2000)\n\n        # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043e\u0442\u043a\u0440\u044b\u0442\u0438\u044f \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430\n        templates_tab.should_be_modal_window()\n\n        # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430 \u0434\u0430\u043d\u043d\u044b\u043c \u0438\u0437 API\n        templates_tab.verify_json_container_content()\n\n        # \u0417\u0430\u043a\u0440\u044b\u0442\u0438\u0435 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430 \u0447\u0435\u0440\u0435\u0437 \u043a\u043d\u043e\u043f\u043a\u0443 \u0437\u0430\u043a\u0440\u044b\u0442\u0438\u044f\n        templates_tab.close_modal_window_by_toolbar_button(template_name)\n\n        # \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c, \u0447\u0442\u043e \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043a\u043d\u043e \u0437\u0430\u043a\u0440\u044b\u043b\u043e\u0441\u044c\n        templates_tab.should_not_be_modal_window()\n
    "},{"location":"tests/e2e/test_templates_tab/#tests.e2e.test_templates_tab.TestTemplatesTab.setup","title":"setup(browser)","text":"

    \u0424\u0438\u043a\u0441\u0442\u0443\u0440\u0430 \u0434\u043b\u044f \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0438 \u0442\u0435\u0441\u0442\u043e\u0432\u043e\u0433\u043e \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f.

    \u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442: 1. \u0410\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u044e \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0435 2. \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u043d\u0430 \u0432\u043a\u043b\u0430\u0434\u043a\u0443 '\u0428\u0430\u0431\u043b\u043e\u043d\u044b' \u0447\u0435\u0440\u0435\u0437 \u043f\u0430\u043d\u0435\u043b\u044c \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438

    Source code in tests\\e2e\\test_templates_tab.py
    @pytest.fixture(scope=\"function\", autouse=True)\ndef setup(self, browser: Page) -> None:\n    \"\"\"\u0424\u0438\u043a\u0441\u0442\u0443\u0440\u0430 \u0434\u043b\u044f \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0438 \u0442\u0435\u0441\u0442\u043e\u0432\u043e\u0433\u043e \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f.\n\n    \u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442:\n    1. \u0410\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u044e \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0435\n    2. \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u043d\u0430 \u0432\u043a\u043b\u0430\u0434\u043a\u0443 '\u0428\u0430\u0431\u043b\u043e\u043d\u044b' \u0447\u0435\u0440\u0435\u0437 \u043f\u0430\u043d\u0435\u043b\u044c \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438\n    \"\"\"\n    # \u0410\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u044f \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0435\n    login_page = LoginPage(browser)\n    login_page.do_login()\n\n    # \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0433\u043b\u0430\u0432\u043d\u043e\u0439 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b\n    main_page = MainPage(browser)\n\n    # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0438 \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u0441 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u043c\u0438 \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438\n    main_page.should_be_navigation_panel()\n    main_page.click_main_navigation_panel_item(\"\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438\")\n    main_page.click_subpanel_item(\"\u0428\u0430\u0431\u043b\u043e\u043d\u044b\")\n
    "},{"location":"tests/e2e/test_templates_tab/#tests.e2e.test_templates_tab.TestTemplatesTab.test_templates_modal_window_api_data_consistency","title":"test_templates_modal_window_api_data_consistency(browser)","text":"

    \u0422\u0435\u0441\u0442 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430 \u0434\u0430\u043d\u043d\u044b\u043c \u0438\u0437 API.

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442: 1. \u041e\u0442\u043a\u0440\u044b\u0442\u0438\u0435 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430 \u043f\u0440\u0438 \u043a\u043b\u0438\u043a\u0435 \u043d\u0430 \u0441\u0442\u0440\u043e\u043a\u0443 \u0442\u0430\u0431\u043b\u0438\u0446\u044b 2. \u0421\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0435 JSON \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u043c \u043e\u043a\u043d\u0435 \u0434\u0430\u043d\u043d\u044b\u043c \u0438\u0437 API 3. \u0417\u0430\u043a\u0440\u044b\u0442\u0438\u0435 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430

    Source code in tests\\e2e\\test_templates_tab.py
    def test_templates_modal_window_api_data_consistency(self, browser: Page) -> None:\n    \"\"\"\u0422\u0435\u0441\u0442 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430 \u0434\u0430\u043d\u043d\u044b\u043c \u0438\u0437 API.\n\n    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442:\n    1. \u041e\u0442\u043a\u0440\u044b\u0442\u0438\u0435 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430 \u043f\u0440\u0438 \u043a\u043b\u0438\u043a\u0435 \u043d\u0430 \u0441\u0442\u0440\u043e\u043a\u0443 \u0442\u0430\u0431\u043b\u0438\u0446\u044b\n    2. \u0421\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0435 JSON \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u043c \u043e\u043a\u043d\u0435 \u0434\u0430\u043d\u043d\u044b\u043c \u0438\u0437 API\n    3. \u0417\u0430\u043a\u0440\u044b\u0442\u0438\u0435 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430\n    \"\"\"\n    # \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u0448\u0430\u0431\u043b\u043e\u043d\u043e\u0432\n    templates_tab = TemplatesTab(browser)\n\n    # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043d\u0430\u043b\u0438\u0447\u0438\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0448\u0430\u0431\u043b\u043e\u043d\u043e\u0432\n    templates_tab.should_be_templates_table()\n\n    # \u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0437\u0430\u0434\u0435\u0440\u0436\u043a\u0443 \u0434\u043b\u044f \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u0434\u0430\u043d\u043d\u044b\u0445\n    browser.wait_for_timeout(5000)\n\n    # \u041e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u043c \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043a\u043d\u043e, \u043a\u043b\u0438\u043a\u0430\u044f \u043d\u0430 \u043f\u0435\u0440\u0432\u0443\u044e \u0441\u0442\u0440\u043e\u043a\u0443 \u0442\u0430\u0431\u043b\u0438\u0446\u044b\n    template_name = templates_tab.open_template_modal(0)\n\n    # \u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0437\u0430\u0434\u0435\u0440\u0436\u043a\u0443 \u0434\u043b\u044f \u043e\u0442\u043a\u0440\u044b\u0442\u0438\u044f \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430\n    browser.wait_for_timeout(2000)\n\n    # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043e\u0442\u043a\u0440\u044b\u0442\u0438\u044f \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430\n    templates_tab.should_be_modal_window()\n\n    # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430 \u0434\u0430\u043d\u043d\u044b\u043c \u0438\u0437 API\n    templates_tab.verify_json_container_content()\n\n    # \u0417\u0430\u043a\u0440\u044b\u0442\u0438\u0435 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430 \u0447\u0435\u0440\u0435\u0437 \u043a\u043d\u043e\u043f\u043a\u0443 \u0437\u0430\u043a\u0440\u044b\u0442\u0438\u044f\n    templates_tab.close_modal_window_by_toolbar_button(template_name)\n\n    # \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c, \u0447\u0442\u043e \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043a\u043d\u043e \u0437\u0430\u043a\u0440\u044b\u043b\u043e\u0441\u044c\n    templates_tab.should_not_be_modal_window()\n
    "},{"location":"tests/e2e/test_templates_tab/#tests.e2e.test_templates_tab.TestTemplatesTab.test_templates_modal_window_content","title":"test_templates_modal_window_content(browser)","text":"

    \u0422\u0435\u0441\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0433\u043e \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430 \u0448\u0430\u0431\u043b\u043e\u043d\u0430.

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442: 1. \u041e\u0442\u043a\u0440\u044b\u0442\u0438\u0435 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430 \u043f\u0440\u0438 \u043a\u043b\u0438\u043a\u0435 \u043d\u0430 \u0441\u0442\u0440\u043e\u043a\u0443 \u0442\u0430\u0431\u043b\u0438\u0446\u044b 2. \u041d\u0430\u043b\u0438\u0447\u0438\u0435 \u0438 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430 3. \u041d\u0430\u043b\u0438\u0447\u0438\u0435 \u0442\u0443\u043b\u0431\u0430\u0440\u0430 \u0432 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u043c \u043e\u043a\u043d\u0435 4. \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043a\u043d\u043e\u043f\u043a\u0438 \u0437\u0430\u043a\u0440\u044b\u0442\u0438\u044f \u0438 \u0435\u0451 \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0438 5. \u0417\u0430\u043a\u0440\u044b\u0442\u0438\u0435 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430

    Source code in tests\\e2e\\test_templates_tab.py
    @pytest.mark.skip(reason=\"\u0412\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u043e \u0438\u0437 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f\")\ndef test_templates_modal_window_content(self, browser: Page) -> None:\n    \"\"\"\u0422\u0435\u0441\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0433\u043e \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430 \u0448\u0430\u0431\u043b\u043e\u043d\u0430.\n\n    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442:\n    1. \u041e\u0442\u043a\u0440\u044b\u0442\u0438\u0435 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430 \u043f\u0440\u0438 \u043a\u043b\u0438\u043a\u0435 \u043d\u0430 \u0441\u0442\u0440\u043e\u043a\u0443 \u0442\u0430\u0431\u043b\u0438\u0446\u044b\n    2. \u041d\u0430\u043b\u0438\u0447\u0438\u0435 \u0438 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430\n    3. \u041d\u0430\u043b\u0438\u0447\u0438\u0435 \u0442\u0443\u043b\u0431\u0430\u0440\u0430 \u0432 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u043c \u043e\u043a\u043d\u0435\n    4. \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043a\u043d\u043e\u043f\u043a\u0438 \u0437\u0430\u043a\u0440\u044b\u0442\u0438\u044f \u0438 \u0435\u0451 \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0438\n    5. \u0417\u0430\u043a\u0440\u044b\u0442\u0438\u0435 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430\n    \"\"\"\n    # \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u0448\u0430\u0431\u043b\u043e\u043d\u043e\u0432\n    templates_tab = TemplatesTab(browser)\n\n    # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043d\u0430\u043b\u0438\u0447\u0438\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0448\u0430\u0431\u043b\u043e\u043d\u043e\u0432\n    templates_tab.should_be_templates_table()\n\n    # \u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0437\u0430\u0434\u0435\u0440\u0436\u043a\u0443 \u0434\u043b\u044f \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u0434\u0430\u043d\u043d\u044b\u0445\n    browser.wait_for_timeout(2000)\n\n    # \u041e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u043c \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043a\u043d\u043e, \u043a\u043b\u0438\u043a\u0430\u044f \u043d\u0430 \u043f\u0435\u0440\u0432\u0443\u044e \u0441\u0442\u0440\u043e\u043a\u0443 \u0442\u0430\u0431\u043b\u0438\u0446\u044b\n    template_name = templates_tab.open_template_modal(0)\n\n    # \u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0437\u0430\u0434\u0435\u0440\u0436\u043a\u0443 \u0434\u043b\u044f \u043e\u0442\u043a\u0440\u044b\u0442\u0438\u044f \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430\n    browser.wait_for_timeout(1000)\n\n    # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043e\u0442\u043a\u0440\u044b\u0442\u0438\u044f \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430\n    templates_tab.should_be_modal_window()\n\n    # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0433\u043e \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430\n    templates_tab.check_templates_modal_content(template_name)\n\n    # \u0417\u0430\u043a\u0440\u044b\u0442\u0438\u0435 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430 \u0447\u0435\u0440\u0435\u0437 \u043a\u043d\u043e\u043f\u043a\u0443 \u0437\u0430\u043a\u0440\u044b\u0442\u0438\u044f\n    templates_tab.close_modal_window_by_toolbar_button(template_name)\n\n    # \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c, \u0447\u0442\u043e \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043a\u043d\u043e \u0437\u0430\u043a\u0440\u044b\u043b\u043e\u0441\u044c\n    templates_tab.should_not_be_modal_window()\n
    "},{"location":"tests/e2e/test_templates_tab/#tests.e2e.test_templates_tab.TestTemplatesTab.test_templates_modal_window_scrolling","title":"test_templates_modal_window_scrolling(browser)","text":"

    \u0422\u0435\u0441\u0442 \u0441\u043a\u0440\u043e\u043b\u043b\u0438\u043d\u0433\u0430 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430 \u0448\u0430\u0431\u043b\u043e\u043d\u0430.

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442: 1. \u041e\u0442\u043a\u0440\u044b\u0442\u0438\u0435 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430 \u043f\u0440\u0438 \u043a\u043b\u0438\u043a\u0435 \u043d\u0430 \u0441\u0442\u0440\u043e\u043a\u0443 \u0442\u0430\u0431\u043b\u0438\u0446\u044b 2. \u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0441\u043a\u0440\u043e\u043b\u043b\u0438\u043d\u0433\u0430 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0433\u043e \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430 3. \u0417\u0430\u043a\u0440\u044b\u0442\u0438\u0435 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430

    Source code in tests\\e2e\\test_templates_tab.py
    @pytest.mark.skip(reason=\"\u0412\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u043e \u0438\u0437 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f\")\ndef test_templates_modal_window_scrolling(self, browser: Page) -> None:\n    \"\"\"\u0422\u0435\u0441\u0442 \u0441\u043a\u0440\u043e\u043b\u043b\u0438\u043d\u0433\u0430 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430 \u0448\u0430\u0431\u043b\u043e\u043d\u0430.\n\n    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442:\n    1. \u041e\u0442\u043a\u0440\u044b\u0442\u0438\u0435 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430 \u043f\u0440\u0438 \u043a\u043b\u0438\u043a\u0435 \u043d\u0430 \u0441\u0442\u0440\u043e\u043a\u0443 \u0442\u0430\u0431\u043b\u0438\u0446\u044b\n    2. \u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0441\u043a\u0440\u043e\u043b\u043b\u0438\u043d\u0433\u0430 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0433\u043e \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430\n    3. \u0417\u0430\u043a\u0440\u044b\u0442\u0438\u0435 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430\n    \"\"\"\n\n    # \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u0448\u0430\u0431\u043b\u043e\u043d\u043e\u0432\n    templates_tab = TemplatesTab(browser)\n\n    # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043d\u0430\u043b\u0438\u0447\u0438\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0448\u0430\u0431\u043b\u043e\u043d\u043e\u0432\n    templates_tab.should_be_templates_table()\n\n    # \u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0437\u0430\u0434\u0435\u0440\u0436\u043a\u0443 \u0434\u043b\u044f \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u0434\u0430\u043d\u043d\u044b\u0445\n    browser.wait_for_timeout(2000)\n\n    # \u041e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u043c \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043a\u043d\u043e, \u043a\u043b\u0438\u043a\u0430\u044f \u043d\u0430 \u043f\u0435\u0440\u0432\u0443\u044e \u0441\u0442\u0440\u043e\u043a\u0443 \u0442\u0430\u0431\u043b\u0438\u0446\u044b\n    template_name = templates_tab.open_template_modal(0)\n\n    # \u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0437\u0430\u0434\u0435\u0440\u0436\u043a\u0443 \u0434\u043b\u044f \u043e\u0442\u043a\u0440\u044b\u0442\u0438\u044f \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430\n    browser.wait_for_timeout(1000)\n\n    # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043e\u0442\u043a\u0440\u044b\u0442\u0438\u044f \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430\n    templates_tab.should_be_modal_window()\n\n    # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0441\u043a\u0440\u043e\u043b\u043b\u0438\u043d\u0433\u0430 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430\n    is_scrollable = templates_tab.check_modal_vertical_scrolling()\n\n    if is_scrollable:\n        print(\"\u041c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043a\u043d\u043e \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u0439 \u0441\u043a\u0440\u043e\u043b\u043b\u0438\u043d\u0433\")\n\n        # \u041f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0430 \u0432\u043d\u0438\u0437\n        templates_tab.scroll_modal_down()\n        browser.wait_for_timeout(1000)\n\n        # \u041f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0430 \u0432\u0432\u0435\u0440\u0445\n        templates_tab.scroll_modal_up()\n        browser.wait_for_timeout(1000)\n    else:\n        print(\"\u041c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043a\u043d\u043e \u043d\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u0439 \u0441\u043a\u0440\u043e\u043b\u043b\u0438\u043d\u0433\")\n\n    # \u0417\u0430\u043a\u0440\u044b\u0442\u0438\u0435 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430 \u0447\u0435\u0440\u0435\u0437 \u043a\u043d\u043e\u043f\u043a\u0443 \u0437\u0430\u043a\u0440\u044b\u0442\u0438\u044f\n    templates_tab.close_modal_window_by_toolbar_button(template_name)\n\n    # \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c, \u0447\u0442\u043e \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043a\u043d\u043e \u0437\u0430\u043a\u0440\u044b\u043b\u043e\u0441\u044c\n    templates_tab.should_not_be_modal_window()\n
    "},{"location":"tests/e2e/test_templates_tab/#tests.e2e.test_templates_tab.TestTemplatesTab.test_templates_tab_content","title":"test_templates_tab_content(browser)","text":"

    \u0422\u0435\u0441\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0433\u043e \u0432\u043a\u043b\u0430\u0434\u043a\u0438 '\u0428\u0430\u0431\u043b\u043e\u043d\u044b'.

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442: 1. \u041d\u0430\u043b\u0438\u0447\u0438\u0435 \u0438 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0441\u0442\u044c \u0442\u0443\u043b\u0431\u0430\u0440\u0430 2. \u041d\u0430\u043b\u0438\u0447\u0438\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0448\u0430\u0431\u043b\u043e\u043d\u043e\u0432 3. \u0421\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0433\u043e \u0442\u0430\u0431\u043b\u0438\u0446\u044b

    Source code in tests\\e2e\\test_templates_tab.py
    @pytest.mark.skip(reason=\"\u0412\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u043e \u0438\u0437 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f\")\ndef test_templates_tab_content(self, browser: Page) -> None:\n    \"\"\"\u0422\u0435\u0441\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0433\u043e \u0432\u043a\u043b\u0430\u0434\u043a\u0438 '\u0428\u0430\u0431\u043b\u043e\u043d\u044b'.\n\n    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442:\n    1. \u041d\u0430\u043b\u0438\u0447\u0438\u0435 \u0438 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0441\u0442\u044c \u0442\u0443\u043b\u0431\u0430\u0440\u0430\n    2. \u041d\u0430\u043b\u0438\u0447\u0438\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0448\u0430\u0431\u043b\u043e\u043d\u043e\u0432\n    3. \u0421\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0433\u043e \u0442\u0430\u0431\u043b\u0438\u0446\u044b\n    \"\"\"\n    # \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u0441\u0435\u0430\u043d\u0441\u043e\u0432\n    templates_tab = TemplatesTab(browser)\n\n    # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0442\u0443\u043b\u0431\u0430\u0440\u0430 \u0432\u043a\u043b\u0430\u0434\u043a\u0438\n    templates_tab.should_be_toolbar()\n\n    # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043d\u0430\u043b\u0438\u0447\u0438\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0448\u0430\u0431\u043b\u043e\u043d\u043e\u0432\n    templates_tab.should_be_templates_table()\n\n    browser.wait_for_timeout(5000)\n\n    # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0433\u043e \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0448\u0430\u0431\u043b\u043e\u043d\u043e\u0432\n    templates_tab.check_templates_table_content()\n
    "},{"location":"tests/e2e/test_templates_tab/#tests.e2e.test_templates_tab.TestTemplatesTab.test_templates_table_row_highlighting","title":"test_templates_table_row_highlighting(browser)","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0441\u0442\u0440\u043e\u043a \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435 \u0448\u0430\u0431\u043b\u043e\u043d\u043e\u0432.

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0441\u0442\u044c \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0441\u0442\u0440\u043e\u043a \u043f\u0440\u0438 \u043a\u043b\u0438\u043a\u0435 \u043d\u0430 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0435 \u043f\u043e\u0437\u0438\u0446\u0438\u0438: 1. \u041f\u0435\u0440\u0432\u0430\u044f \u0441\u0442\u0440\u043e\u043a\u0430 2. \u041f\u043e\u0441\u043b\u0435\u0434\u043d\u044f\u044f \u0441\u0442\u0440\u043e\u043a\u0430 3. \u0421\u0442\u0440\u043e\u043a\u0430 \u0432 \u0441\u0435\u0440\u0435\u0434\u0438\u043d\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u044b

    Source code in tests\\e2e\\test_templates_tab.py
    @pytest.mark.skip(reason=\"\u0412\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u043e \u0438\u0437 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f\")\ndef test_templates_table_row_highlighting(self, browser: Page) -> None:\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0441\u0442\u0440\u043e\u043a \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435 \u0448\u0430\u0431\u043b\u043e\u043d\u043e\u0432.\n\n    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0441\u0442\u044c \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0441\u0442\u0440\u043e\u043a \u043f\u0440\u0438 \u043a\u043b\u0438\u043a\u0435 \u043d\u0430 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0435 \u043f\u043e\u0437\u0438\u0446\u0438\u0438:\n    1. \u041f\u0435\u0440\u0432\u0430\u044f \u0441\u0442\u0440\u043e\u043a\u0430\n    2. \u041f\u043e\u0441\u043b\u0435\u0434\u043d\u044f\u044f \u0441\u0442\u0440\u043e\u043a\u0430\n    3. \u0421\u0442\u0440\u043e\u043a\u0430 \u0432 \u0441\u0435\u0440\u0435\u0434\u0438\u043d\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u044b\n    \"\"\"\n\n    templates_tab = TemplatesTab(browser)\n\n    # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0442\u0443\u043b\u0431\u0430\u0440\u0430 \u0432\u043a\u043b\u0430\u0434\u043a\u0438\n    templates_tab.should_be_toolbar()\n\n    # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043d\u0430\u043b\u0438\u0447\u0438\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0448\u0430\u0431\u043b\u043e\u043d\u043e\u0432\n    templates_tab.should_be_templates_table()\n\n    # \u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0430 \u0441\u0442\u0440\u043e\u043a \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435\n    rows_count = templates_tab.get_rows_count()\n\n    # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0441\u0442\u0440\u043e\u043a\n    templates_tab.check_templates_table_row_highlighting(0)\n    templates_tab.check_templates_table_row_highlighting(rows_count - 1)\n    templates_tab.check_templates_table_row_highlighting(int(rows_count / 2))\n
    "},{"location":"tests/e2e/test_templates_tab/#tests.e2e.test_templates_tab.TestTemplatesTab.test_templates_table_scrolling","title":"test_templates_table_scrolling(browser)","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0441\u043a\u0440\u043e\u043b\u043b\u0438\u043d\u0433\u0430 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0448\u0430\u0431\u043b\u043e\u043d\u043e\u0432.

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442: 1. \u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u0439 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u044b 2. \u0412\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u0441\u0442\u0440\u043e\u043a \u043f\u043e\u0441\u043b\u0435 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0438 \u0432\u043d\u0438\u0437 \u0438 \u0432\u0432\u0435\u0440\u0445 3. \u041a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0441\u0442\u044c \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445 \u043f\u043e\u0441\u043b\u0435 \u0441\u043a\u0440\u043e\u043b\u043b\u0438\u043d\u0433\u0430

    Source code in tests\\e2e\\test_templates_tab.py
    @pytest.mark.skip(reason=\"\u0412\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u043e \u0438\u0437 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f\")\ndef test_templates_table_scrolling(self, browser: Page) -> None:\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0441\u043a\u0440\u043e\u043b\u043b\u0438\u043d\u0433\u0430 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0448\u0430\u0431\u043b\u043e\u043d\u043e\u0432.\n\n    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442:\n    1. \u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u0439 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u044b\n    2. \u0412\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u0441\u0442\u0440\u043e\u043a \u043f\u043e\u0441\u043b\u0435 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0438 \u0432\u043d\u0438\u0437 \u0438 \u0432\u0432\u0435\u0440\u0445\n    3. \u041a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0441\u0442\u044c \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445 \u043f\u043e\u0441\u043b\u0435 \u0441\u043a\u0440\u043e\u043b\u043b\u0438\u043d\u0433\u0430\n    \"\"\"\n\n    templates_tab = TemplatesTab(browser)\n\n    browser.wait_for_timeout(2000)\n\n    # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0441\u043a\u0440\u043e\u043b\u043b\u0438\u043d\u0433\u0430\n    is_scrollable = templates_tab.check_templates_table_verticall_scrolling()\n\n    if is_scrollable:\n        print(\"\u0422\u0430\u0431\u043b\u0438\u0446\u0430 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u0439 \u0441\u043a\u0440\u043e\u043b\u043b\u0438\u043d\u0433\")\n\n        # \u041f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0430 \u0432\u043d\u0438\u0437\n        templates_tab.scroll_templates_table_down()\n\n        browser.wait_for_timeout(1000)\n\n        # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0439 \u0441\u0442\u0440\u043e\u043a\u0438 \u043f\u043e\u0441\u043b\u0435 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0438\n        templates_tab.check_templates_table_last_row_visibility()\n\n        # \u041f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0430 \u0432\u0432\u0435\u0440\u0445\n        templates_tab.scroll_templates_table_up()\n\n        browser.wait_for_timeout(1000)\n\n        # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u043f\u0435\u0440\u0432\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438 \u043f\u043e\u0441\u043b\u0435 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0438\n        templates_tab.check_templates_table_first_row_visibility()\n    else:\n        print(\"\u0422\u0430\u0431\u043b\u0438\u0446\u0430 \u043d\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u0439 \u0441\u043a\u0440\u043e\u043b\u043b\u0438\u043d\u0433 - \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u0431\u0430\u0437\u043e\u0432\u0443\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c\")\n\n        # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u043f\u0435\u0440\u0432\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438\n        templates_tab.check_templates_table_first_row_visibility()\n
    "},{"location":"tests/e2e/test_user_card/","title":"TestUserCard","text":"

    \u041c\u043e\u0434\u0443\u043b\u044c \u0442\u0435\u0441\u0442\u043e\u0432 \u043a\u0430\u0440\u0442\u043e\u0447\u043a\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.

    \u0421\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0442\u0435\u0441\u0442\u044b \u0434\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u043a\u0430\u0440\u0442\u043e\u0447\u043a\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0432 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0438.

    "},{"location":"tests/e2e/test_user_card/#tests.e2e.test_user_card.TestUserCard","title":"TestUserCard","text":"

    \u041a\u043b\u0430\u0441\u0441 \u0442\u0435\u0441\u0442\u043e\u0432 \u0434\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u043a\u0430\u0440\u0442\u043e\u0447\u043a\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.

    \u0422\u0435\u0441\u0442\u044b \u043f\u043e\u043a\u0440\u044b\u0432\u0430\u044e\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0438: 1. test_user_card_content: \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u043a\u0430\u0440\u0442\u043e\u0447\u043a\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f 2. test_open_close_user_settings_window: \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043e\u0442\u043a\u0440\u044b\u0442\u0438\u044f \u0438 \u0437\u0430\u043a\u0440\u044b\u0442\u0438\u044f \u0434\u0438\u0430\u043b\u043e\u0433\u043e\u0432\u043e\u0433\u043e \u043e\u043a\u043d\u0430 \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0430 \u0441\u0435\u0441\u0441\u0438\u043e\u043d\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f 3. test_user_settings_window_content: \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0438 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0441\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0434\u0438\u0430\u043b\u043e\u0433\u043e\u0432\u043e\u0433\u043e \u043e\u043a\u043d\u0430 \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0430 \u0441\u0435\u0441\u0441\u0438\u043e\u043d\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f 4. test_change_password_window_content: \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0438 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0441\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u043e\u043a\u043d\u0430 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u043f\u0430\u0440\u043e\u043b\u044f \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f 5. test_change_password_successful: \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0443\u0441\u043f\u0435\u0448\u043d\u043e\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u043f\u0430\u0440\u043e\u043b\u044f \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f 6. test_change_password_unsuccessful: \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0435\u0443\u0441\u043f\u0435\u0448\u043d\u043e\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u043f\u0430\u0440\u043e\u043b\u044f \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f

    \u0410\u0442\u0440\u0438\u0431\u0443\u0442\u044b

    browser: \u0424\u0438\u043a\u0441\u0442\u0443\u0440\u0430 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u043e\u043c.

    Source code in tests\\e2e\\test_user_card.py
    class TestUserCard:\n    \"\"\"\u041a\u043b\u0430\u0441\u0441 \u0442\u0435\u0441\u0442\u043e\u0432 \u0434\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u043a\u0430\u0440\u0442\u043e\u0447\u043a\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\n\n    \u0422\u0435\u0441\u0442\u044b \u043f\u043e\u043a\u0440\u044b\u0432\u0430\u044e\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0438:\n    1. test_user_card_content: \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u043a\u0430\u0440\u0442\u043e\u0447\u043a\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\n    2. test_open_close_user_settings_window: \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043e\u0442\u043a\u0440\u044b\u0442\u0438\u044f \u0438 \u0437\u0430\u043a\u0440\u044b\u0442\u0438\u044f \u0434\u0438\u0430\u043b\u043e\u0433\u043e\u0432\u043e\u0433\u043e \u043e\u043a\u043d\u0430 \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0430 \u0441\u0435\u0441\u0441\u0438\u043e\u043d\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\n    3. test_user_settings_window_content: \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0438 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0441\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0434\u0438\u0430\u043b\u043e\u0433\u043e\u0432\u043e\u0433\u043e \u043e\u043a\u043d\u0430 \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0430 \u0441\u0435\u0441\u0441\u0438\u043e\u043d\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\n    4. test_change_password_window_content: \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0438 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0441\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u043e\u043a\u043d\u0430 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u043f\u0430\u0440\u043e\u043b\u044f \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\n    5. test_change_password_successful: \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0443\u0441\u043f\u0435\u0448\u043d\u043e\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u043f\u0430\u0440\u043e\u043b\u044f \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\n    6. test_change_password_unsuccessful: \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0435\u0443\u0441\u043f\u0435\u0448\u043d\u043e\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u043f\u0430\u0440\u043e\u043b\u044f \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\n\n    \u0410\u0442\u0440\u0438\u0431\u0443\u0442\u044b:\n        browser: \u0424\u0438\u043a\u0441\u0442\u0443\u0440\u0430 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u043e\u043c.\n    \"\"\"\n\n    @pytest.fixture(scope=\"function\")\n    def create_user(self, browser: Page) -> None:\n        \"\"\"\u0424\u0438\u043a\u0441\u0442\u0443\u0440\u0430 \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0442\u0435\u0441\u0442\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\"\"\"\n\n        lp = LoginPage(browser)\n        lp.do_login()\n\n        mp = MainPage(browser)\n        ut = UsersTab(browser)\n\n        # \u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043d\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\n        mp.click_main_navigation_panel_item(\"\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438\")\n        mp.click_subpanel_item(\"\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438\")\n        ut.open_add_user_window()\n        ut.add_new_user(user_data)\n\n        # \u041e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u0441\u043f\u0438\u0441\u043a\u0430 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 (\u0434\u0432\u043e\u0439\u043d\u043e\u0439 \u043a\u043b\u0438\u043a - \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u0431\u0430\u0433?)\n        mp.click_subpanel_item(\"\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438\")\n        mp.click_subpanel_item(\"\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438\")\n\n        # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043d\u0430\u043b\u0438\u0447\u0438\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435\n        ut.should_be_user_in_table(user_data[\"name\"], user_data[\"role\"])\n\n        # \u0412\u044b\u0445\u043e\u0434 \u0438\u0437 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\n        mp.do_logout()\n\n        yield\n\n    @pytest.fixture(scope=\"function\")\n    def cleanup_user(self, browser: Page) -> None:\n        \"\"\"\u0424\u0438\u043a\u0441\u0442\u0443\u0440\u0430 \u0434\u043b\u044f \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u0442\u0435\u0441\u0442\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u043f\u043e\u0441\u043b\u0435 \u0442\u0435\u0441\u0442\u0430.\"\"\"\n        yield\n\n        # \u0412\u044b\u0445\u043e\u0434 \u0438\u0437 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\n        mp = MainPage(browser)\n        mp.do_logout()\n\n        # \u0410\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u044f \u0430\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440\u043e\u043c \u0434\u043b\u044f \u043e\u0447\u0438\u0441\u0442\u043a\u0438\n        login_page = LoginPage(browser)\n        login_page.do_login()\n\n        # \u0423\u0434\u0430\u043b\u044f\u0435\u043c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\n        mp_admin = MainPage(browser)\n        mp_admin.click_main_navigation_panel_item(\"\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438\")\n        mp_admin.click_subpanel_item(\"\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438\")\n\n        ut = UsersTab(browser)\n        ut.open_edit_user_page_by_user(user_data[\"name\"], user_data[\"role\"])\n        ut.delete_user(user_data[\"name\"])\n\n    # @pytest.mark.develop\n    def test_user_card_content(self, browser: Page) -> None:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0438 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0441\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u043a\u0430\u0440\u0442\u043e\u0447\u043a\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\n\n        Args:\n            browser: \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.\n        \"\"\"\n\n        lp = LoginPage(browser)\n        lp.do_login()\n\n        mp = MainPage(browser)\n\n        user_card = mp.click_user_button()\n        user_card.check_content()\n\n    # @pytest.mark.develop\n    def test_open_close_user_settings_window(self, browser: Page) -> None:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043e\u0442\u043a\u0440\u044b\u0442\u0438\u044f \u0438 \u0437\u0430\u043a\u0440\u044b\u0442\u0438\u044f \u0434\u0438\u0430\u043b\u043e\u0433\u043e\u0432\u043e\u0433\u043e \u043e\u043a\u043d\u0430 \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0430 \u0441\u0435\u0441\u0441\u0438\u043e\u043d\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\n\n        Args:\n            browser: \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.\n        \"\"\"\n\n        lp = LoginPage(browser)\n        lp.do_login()\n\n        mp = MainPage(browser)\n\n        user_card = mp.click_user_button()\n        user_settings_window = user_card.click_settings_button()\n\n        user_settings_window.check_window_visibility()\n        user_settings_window.click_close_button()\n        user_settings_window.check_window_absence()\n\n    # @pytest.mark.develop\n    def test_user_settings_window_content(self, browser: Page) -> None:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0438 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0441\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0434\u0438\u0430\u043b\u043e\u0433\u043e\u0432\u043e\u0433\u043e \u043e\u043a\u043d\u0430 \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0430 \u0441\u0435\u0441\u0441\u0438\u043e\u043d\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\n\n        Args:\n            browser: \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.\n        \"\"\"\n\n        lp = LoginPage(browser)\n        lp.do_login()\n\n        mp = MainPage(browser)\n\n        user_card = mp.click_user_button()\n        user_settings_window = user_card.click_settings_button()\n\n        user_settings_window.check_window_visibility()\n        user_settings_window.check_content()\n\n    # @pytest.mark.develop\n    def test_change_password_window_content(self, browser: Page) -> None:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0438 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0441\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u043e\u043a\u043d\u0430 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u043f\u0430\u0440\u043e\u043b\u044f \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\n\n        Args:\n            browser: \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.\n        \"\"\"\n\n        lp = LoginPage(browser)\n        lp.do_login()\n\n        mp = MainPage(browser)\n\n        user_card = mp.click_user_button()\n        change_password_window = user_card.click_change_password_button()\n        change_password_window.check_content()\n\n    # @pytest.mark.develop\n    def test_change_password_successful(self, browser: Page,\n                                           create_user: None,\n                                           cleanup_user: None) -> None:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0443\u0441\u043f\u0435\u0448\u043d\u043e\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u043f\u0430\u0440\u043e\u043b\u044f \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\n\n        Args:\n            browser: \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.\n        \"\"\"\n\n        # \u0412\u0445\u043e\u0434 \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0443 \u0434\u043b\u044f \u0442\u0435\u0441\u0442\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\n        lp = LoginPage(browser)\n        lp.do_login(username=user_data[\"name\"], password=user_data[\"password\"])\n\n        # \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0433\u043b\u0430\u0432\u043d\u043e\u0439 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b\n        mp = MainPage(browser)\n\n        user_card = mp.click_user_button()\n        change_password_window = user_card.click_change_password_button()\n        is_changed, error = change_password_window.change_password(user_data[\"password\"], user_data[\"new_password\"])\n        assert is_changed, f\"Unsucessful attempt to change password: {error}\"\n\n    # @pytest.mark.develop\n    def test_change_password_unsuccessful(self, browser: Page,\n                                           create_user: None,\n                                           cleanup_user: None) -> None:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0435\u0443\u0441\u043f\u0435\u0448\u043d\u043e\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u043f\u0430\u0440\u043e\u043b\u044f \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\n\n        Args:\n            browser: \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.\n        \"\"\"\n\n        # \u0412\u0445\u043e\u0434 \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0443 \u0434\u043b\u044f \u0442\u0435\u0441\u0442\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\n        lp = LoginPage(browser)\n        lp.do_login(username=user_data[\"name\"], password=user_data[\"password\"])\n\n        # \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0433\u043b\u0430\u0432\u043d\u043e\u0439 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b\n        mp = MainPage(browser)\n\n        # \u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043f\u043e\u043b\u0435\u0439 \u043d\u043e\u0432\u043e\u0433\u043e \u043f\u0430\u0440\u043e\u043b\u044f \u0438 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u044f \u043d\u043e\u0432\u043e\u0433\u043e \u043f\u0430\u0440\u043e\u043b\u044f \u043d\u0435 \u0441\u043e\u0432\u043f\u0430\u0434\u0430\u044e\u0442\n        user_card = mp.click_user_button()\n        change_password_window = user_card.click_change_password_button()\n        password_inputs = change_password_window.get_password_inputs()\n\n        password_inputs[0].input_value(user_data[\"password\"])\n        password_inputs[1].input_value(user_data[\"new_password\"])\n        password_inputs[2].input_value(\"12345\")\n\n        change_password_window.check_error_message(\"\u041f\u0430\u0440\u043e\u043b\u0438 \u043d\u0435 \u0441\u043e\u0432\u043f\u0430\u0434\u0430\u044e\u0442\")\n        change_password_window.click_cancel_button()\n\n        # \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u043d\u0435\u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u044b\u0439 \u0441\u0442\u0430\u0440\u044b\u0439 \u043f\u0430\u0440\u043e\u043b\u044c\n        user_card = mp.click_user_button()\n        change_password_window = user_card.click_change_password_button()\n        is_changed, _ = change_password_window.change_password(\"123456789\", user_data[\"new_password\"])\n        assert not is_changed, \"Sucessful attempt to change password for incorrect old password\"\n        change_password_window.click_cancel_button()\n\n        # \u041f\u0443\u0441\u0442\u043e\u0435 \u043f\u043e\u043b\u0435 \u0432\u0432\u043e\u0434\u0430 \u043f\u0430\u0440\u043e\u043b\u044f \u043d\u0430 \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u043f\u043e\u043b\u044f \u0432\u0432\u043e\u0434\u0430 \u0441\u0442\u0430\u0440\u043e\u0433\u043e \u043f\u0430\u0440\u043e\u043b\u044f\n        user_card = mp.click_user_button()\n        change_password_window = user_card.click_change_password_button()\n        is_changed, error = change_password_window.change_password(\"\", user_data[\"new_password\"])\n        assert not is_changed, \"Sucessful attempt to change password for empty old password input\"\n        err_message = \"\u042d\u0442\u043e \u043f\u043e\u043b\u0435 \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u0434\u043b\u044f \u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f\"\n        assert error != err_message, f\"Expected error message '{err_message}' is not equal '{error}'\"\n        change_password_window.click_cancel_button()\n
    "},{"location":"tests/e2e/test_user_card/#tests.e2e.test_user_card.TestUserCard.cleanup_user","title":"cleanup_user(browser)","text":"

    \u0424\u0438\u043a\u0441\u0442\u0443\u0440\u0430 \u0434\u043b\u044f \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u0442\u0435\u0441\u0442\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u043f\u043e\u0441\u043b\u0435 \u0442\u0435\u0441\u0442\u0430.

    Source code in tests\\e2e\\test_user_card.py
    @pytest.fixture(scope=\"function\")\ndef cleanup_user(self, browser: Page) -> None:\n    \"\"\"\u0424\u0438\u043a\u0441\u0442\u0443\u0440\u0430 \u0434\u043b\u044f \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u0442\u0435\u0441\u0442\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u043f\u043e\u0441\u043b\u0435 \u0442\u0435\u0441\u0442\u0430.\"\"\"\n    yield\n\n    # \u0412\u044b\u0445\u043e\u0434 \u0438\u0437 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\n    mp = MainPage(browser)\n    mp.do_logout()\n\n    # \u0410\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u044f \u0430\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440\u043e\u043c \u0434\u043b\u044f \u043e\u0447\u0438\u0441\u0442\u043a\u0438\n    login_page = LoginPage(browser)\n    login_page.do_login()\n\n    # \u0423\u0434\u0430\u043b\u044f\u0435\u043c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\n    mp_admin = MainPage(browser)\n    mp_admin.click_main_navigation_panel_item(\"\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438\")\n    mp_admin.click_subpanel_item(\"\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438\")\n\n    ut = UsersTab(browser)\n    ut.open_edit_user_page_by_user(user_data[\"name\"], user_data[\"role\"])\n    ut.delete_user(user_data[\"name\"])\n
    "},{"location":"tests/e2e/test_user_card/#tests.e2e.test_user_card.TestUserCard.create_user","title":"create_user(browser)","text":"

    \u0424\u0438\u043a\u0441\u0442\u0443\u0440\u0430 \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0442\u0435\u0441\u0442\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.

    Source code in tests\\e2e\\test_user_card.py
    @pytest.fixture(scope=\"function\")\ndef create_user(self, browser: Page) -> None:\n    \"\"\"\u0424\u0438\u043a\u0441\u0442\u0443\u0440\u0430 \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0442\u0435\u0441\u0442\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\"\"\"\n\n    lp = LoginPage(browser)\n    lp.do_login()\n\n    mp = MainPage(browser)\n    ut = UsersTab(browser)\n\n    # \u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043d\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\n    mp.click_main_navigation_panel_item(\"\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438\")\n    mp.click_subpanel_item(\"\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438\")\n    ut.open_add_user_window()\n    ut.add_new_user(user_data)\n\n    # \u041e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u0441\u043f\u0438\u0441\u043a\u0430 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 (\u0434\u0432\u043e\u0439\u043d\u043e\u0439 \u043a\u043b\u0438\u043a - \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u0431\u0430\u0433?)\n    mp.click_subpanel_item(\"\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438\")\n    mp.click_subpanel_item(\"\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438\")\n\n    # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043d\u0430\u043b\u0438\u0447\u0438\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435\n    ut.should_be_user_in_table(user_data[\"name\"], user_data[\"role\"])\n\n    # \u0412\u044b\u0445\u043e\u0434 \u0438\u0437 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\n    mp.do_logout()\n\n    yield\n
    "},{"location":"tests/e2e/test_user_card/#tests.e2e.test_user_card.TestUserCard.test_change_password_successful","title":"test_change_password_successful(browser, create_user, cleanup_user)","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0443\u0441\u043f\u0435\u0448\u043d\u043e\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u043f\u0430\u0440\u043e\u043b\u044f \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.

    Parameters:

    Name Type Description Default browser Page

    \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.

    required Source code in tests\\e2e\\test_user_card.py
    def test_change_password_successful(self, browser: Page,\n                                       create_user: None,\n                                       cleanup_user: None) -> None:\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0443\u0441\u043f\u0435\u0448\u043d\u043e\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u043f\u0430\u0440\u043e\u043b\u044f \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\n\n    Args:\n        browser: \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.\n    \"\"\"\n\n    # \u0412\u0445\u043e\u0434 \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0443 \u0434\u043b\u044f \u0442\u0435\u0441\u0442\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\n    lp = LoginPage(browser)\n    lp.do_login(username=user_data[\"name\"], password=user_data[\"password\"])\n\n    # \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0433\u043b\u0430\u0432\u043d\u043e\u0439 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b\n    mp = MainPage(browser)\n\n    user_card = mp.click_user_button()\n    change_password_window = user_card.click_change_password_button()\n    is_changed, error = change_password_window.change_password(user_data[\"password\"], user_data[\"new_password\"])\n    assert is_changed, f\"Unsucessful attempt to change password: {error}\"\n
    "},{"location":"tests/e2e/test_user_card/#tests.e2e.test_user_card.TestUserCard.test_change_password_unsuccessful","title":"test_change_password_unsuccessful(browser, create_user, cleanup_user)","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0435\u0443\u0441\u043f\u0435\u0448\u043d\u043e\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u043f\u0430\u0440\u043e\u043b\u044f \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.

    Parameters:

    Name Type Description Default browser Page

    \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.

    required Source code in tests\\e2e\\test_user_card.py
    def test_change_password_unsuccessful(self, browser: Page,\n                                       create_user: None,\n                                       cleanup_user: None) -> None:\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0435\u0443\u0441\u043f\u0435\u0448\u043d\u043e\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u043f\u0430\u0440\u043e\u043b\u044f \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\n\n    Args:\n        browser: \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.\n    \"\"\"\n\n    # \u0412\u0445\u043e\u0434 \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0443 \u0434\u043b\u044f \u0442\u0435\u0441\u0442\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\n    lp = LoginPage(browser)\n    lp.do_login(username=user_data[\"name\"], password=user_data[\"password\"])\n\n    # \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0433\u043b\u0430\u0432\u043d\u043e\u0439 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b\n    mp = MainPage(browser)\n\n    # \u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043f\u043e\u043b\u0435\u0439 \u043d\u043e\u0432\u043e\u0433\u043e \u043f\u0430\u0440\u043e\u043b\u044f \u0438 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u044f \u043d\u043e\u0432\u043e\u0433\u043e \u043f\u0430\u0440\u043e\u043b\u044f \u043d\u0435 \u0441\u043e\u0432\u043f\u0430\u0434\u0430\u044e\u0442\n    user_card = mp.click_user_button()\n    change_password_window = user_card.click_change_password_button()\n    password_inputs = change_password_window.get_password_inputs()\n\n    password_inputs[0].input_value(user_data[\"password\"])\n    password_inputs[1].input_value(user_data[\"new_password\"])\n    password_inputs[2].input_value(\"12345\")\n\n    change_password_window.check_error_message(\"\u041f\u0430\u0440\u043e\u043b\u0438 \u043d\u0435 \u0441\u043e\u0432\u043f\u0430\u0434\u0430\u044e\u0442\")\n    change_password_window.click_cancel_button()\n\n    # \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u043d\u0435\u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u044b\u0439 \u0441\u0442\u0430\u0440\u044b\u0439 \u043f\u0430\u0440\u043e\u043b\u044c\n    user_card = mp.click_user_button()\n    change_password_window = user_card.click_change_password_button()\n    is_changed, _ = change_password_window.change_password(\"123456789\", user_data[\"new_password\"])\n    assert not is_changed, \"Sucessful attempt to change password for incorrect old password\"\n    change_password_window.click_cancel_button()\n\n    # \u041f\u0443\u0441\u0442\u043e\u0435 \u043f\u043e\u043b\u0435 \u0432\u0432\u043e\u0434\u0430 \u043f\u0430\u0440\u043e\u043b\u044f \u043d\u0430 \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u043f\u043e\u043b\u044f \u0432\u0432\u043e\u0434\u0430 \u0441\u0442\u0430\u0440\u043e\u0433\u043e \u043f\u0430\u0440\u043e\u043b\u044f\n    user_card = mp.click_user_button()\n    change_password_window = user_card.click_change_password_button()\n    is_changed, error = change_password_window.change_password(\"\", user_data[\"new_password\"])\n    assert not is_changed, \"Sucessful attempt to change password for empty old password input\"\n    err_message = \"\u042d\u0442\u043e \u043f\u043e\u043b\u0435 \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u0434\u043b\u044f \u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f\"\n    assert error != err_message, f\"Expected error message '{err_message}' is not equal '{error}'\"\n    change_password_window.click_cancel_button()\n
    "},{"location":"tests/e2e/test_user_card/#tests.e2e.test_user_card.TestUserCard.test_change_password_window_content","title":"test_change_password_window_content(browser)","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0438 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0441\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u043e\u043a\u043d\u0430 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u043f\u0430\u0440\u043e\u043b\u044f \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.

    Parameters:

    Name Type Description Default browser Page

    \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.

    required Source code in tests\\e2e\\test_user_card.py
    def test_change_password_window_content(self, browser: Page) -> None:\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0438 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0441\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u043e\u043a\u043d\u0430 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u043f\u0430\u0440\u043e\u043b\u044f \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\n\n    Args:\n        browser: \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.\n    \"\"\"\n\n    lp = LoginPage(browser)\n    lp.do_login()\n\n    mp = MainPage(browser)\n\n    user_card = mp.click_user_button()\n    change_password_window = user_card.click_change_password_button()\n    change_password_window.check_content()\n
    "},{"location":"tests/e2e/test_user_card/#tests.e2e.test_user_card.TestUserCard.test_open_close_user_settings_window","title":"test_open_close_user_settings_window(browser)","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043e\u0442\u043a\u0440\u044b\u0442\u0438\u044f \u0438 \u0437\u0430\u043a\u0440\u044b\u0442\u0438\u044f \u0434\u0438\u0430\u043b\u043e\u0433\u043e\u0432\u043e\u0433\u043e \u043e\u043a\u043d\u0430 \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0430 \u0441\u0435\u0441\u0441\u0438\u043e\u043d\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.

    Parameters:

    Name Type Description Default browser Page

    \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.

    required Source code in tests\\e2e\\test_user_card.py
    def test_open_close_user_settings_window(self, browser: Page) -> None:\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043e\u0442\u043a\u0440\u044b\u0442\u0438\u044f \u0438 \u0437\u0430\u043a\u0440\u044b\u0442\u0438\u044f \u0434\u0438\u0430\u043b\u043e\u0433\u043e\u0432\u043e\u0433\u043e \u043e\u043a\u043d\u0430 \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0430 \u0441\u0435\u0441\u0441\u0438\u043e\u043d\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\n\n    Args:\n        browser: \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.\n    \"\"\"\n\n    lp = LoginPage(browser)\n    lp.do_login()\n\n    mp = MainPage(browser)\n\n    user_card = mp.click_user_button()\n    user_settings_window = user_card.click_settings_button()\n\n    user_settings_window.check_window_visibility()\n    user_settings_window.click_close_button()\n    user_settings_window.check_window_absence()\n
    "},{"location":"tests/e2e/test_user_card/#tests.e2e.test_user_card.TestUserCard.test_user_card_content","title":"test_user_card_content(browser)","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0438 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0441\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u043a\u0430\u0440\u0442\u043e\u0447\u043a\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.

    Parameters:

    Name Type Description Default browser Page

    \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.

    required Source code in tests\\e2e\\test_user_card.py
    def test_user_card_content(self, browser: Page) -> None:\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0438 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0441\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u043a\u0430\u0440\u0442\u043e\u0447\u043a\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\n\n    Args:\n        browser: \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.\n    \"\"\"\n\n    lp = LoginPage(browser)\n    lp.do_login()\n\n    mp = MainPage(browser)\n\n    user_card = mp.click_user_button()\n    user_card.check_content()\n
    "},{"location":"tests/e2e/test_user_card/#tests.e2e.test_user_card.TestUserCard.test_user_settings_window_content","title":"test_user_settings_window_content(browser)","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0438 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0441\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0434\u0438\u0430\u043b\u043e\u0433\u043e\u0432\u043e\u0433\u043e \u043e\u043a\u043d\u0430 \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0430 \u0441\u0435\u0441\u0441\u0438\u043e\u043d\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.

    Parameters:

    Name Type Description Default browser Page

    \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.

    required Source code in tests\\e2e\\test_user_card.py
    def test_user_settings_window_content(self, browser: Page) -> None:\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0438 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0441\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0434\u0438\u0430\u043b\u043e\u0433\u043e\u0432\u043e\u0433\u043e \u043e\u043a\u043d\u0430 \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0430 \u0441\u0435\u0441\u0441\u0438\u043e\u043d\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\n\n    Args:\n        browser: \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.\n    \"\"\"\n\n    lp = LoginPage(browser)\n    lp.do_login()\n\n    mp = MainPage(browser)\n\n    user_card = mp.click_user_button()\n    user_settings_window = user_card.click_settings_button()\n\n    user_settings_window.check_window_visibility()\n    user_settings_window.check_content()\n
    "},{"location":"tests/e2e/test_users_tab/","title":"TestUsersTab","text":"

    \u041c\u043e\u0434\u0443\u043b\u044c \u0442\u0435\u0441\u0442\u043e\u0432 \u0432\u043a\u043b\u0430\u0434\u043a\u0438 '\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438'.

    \u0421\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0442\u0435\u0441\u0442\u044b \u0434\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\u043c\u0438 \u0441\u0438\u0441\u0442\u0435\u043c\u044b.

    "},{"location":"tests/e2e/test_users_tab/#tests.e2e.test_users_tab.TestUsersTab","title":"TestUsersTab","text":"

    \u041a\u043b\u0430\u0441\u0441 \u0442\u0435\u0441\u0442\u043e\u0432 \u0434\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0432\u043a\u043b\u0430\u0434\u043a\u0438 '\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438'.

    \u0422\u0435\u0441\u0442\u044b \u043f\u043e\u043a\u0440\u044b\u0432\u0430\u044e\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0438: 1. test_users_tab_content: \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u0432\u043a\u043b\u0430\u0434\u043a\u0438 '\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438' 2. test_users_tab_toolbar_buttons: \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043a\u043d\u043e\u043f\u043a\u0438 \u043d\u0430 \u043f\u0430\u043d\u0435\u043b\u0438 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432 3. test_add_user_window_content: \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u043e\u043a\u043d\u0430 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f 4. test_add_user_window_close_buttons: \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043a\u043d\u043e\u043f\u043a\u0438 \u0437\u0430\u043a\u0440\u044b\u0442\u0438\u044f \u043e\u043a\u043d\u0430 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f 5 test_edit_user_window_content: \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u043e\u043a\u043d\u0430 \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f 6. test_edit_user_window_close_buttons: \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043a\u043d\u043e\u043f\u043a\u0438 \u0437\u0430\u043a\u0440\u044b\u0442\u0438\u044f \u043e\u043a\u043d\u0430 \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f 7. test_add_and_delete_user: \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0438 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f 8. test_add_AD_user: \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f Active Directory 9. test_reset_password: \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0441\u0431\u0440\u043e\u0441 \u043f\u0430\u0440\u043e\u043b\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f 10.test_edit_user_role: \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u0440\u043e\u043b\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f

    Source code in tests\\e2e\\test_users_tab.py
    class TestUsersTab:\n    \"\"\"\u041a\u043b\u0430\u0441\u0441 \u0442\u0435\u0441\u0442\u043e\u0432 \u0434\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0432\u043a\u043b\u0430\u0434\u043a\u0438 '\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438'.\n\n    \u0422\u0435\u0441\u0442\u044b \u043f\u043e\u043a\u0440\u044b\u0432\u0430\u044e\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0438:\n    1. test_users_tab_content: \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u0432\u043a\u043b\u0430\u0434\u043a\u0438 '\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438'\n    2. test_users_tab_toolbar_buttons: \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043a\u043d\u043e\u043f\u043a\u0438 \u043d\u0430 \u043f\u0430\u043d\u0435\u043b\u0438 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432\n    3. test_add_user_window_content: \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u043e\u043a\u043d\u0430 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\n    4. test_add_user_window_close_buttons: \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043a\u043d\u043e\u043f\u043a\u0438 \u0437\u0430\u043a\u0440\u044b\u0442\u0438\u044f \u043e\u043a\u043d\u0430 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f\n    5 test_edit_user_window_content: \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u043e\u043a\u043d\u0430 \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f\n    6. test_edit_user_window_close_buttons: \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043a\u043d\u043e\u043f\u043a\u0438 \u0437\u0430\u043a\u0440\u044b\u0442\u0438\u044f \u043e\u043a\u043d\u0430 \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f\n    7. test_add_and_delete_user: \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0438 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\n    8. test_add_AD_user: \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f Active Directory\n    9. test_reset_password: \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0441\u0431\u0440\u043e\u0441 \u043f\u0430\u0440\u043e\u043b\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\n    10.test_edit_user_role: \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u0440\u043e\u043b\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\n    \"\"\"\n\n    @pytest.fixture(scope=\"function\", autouse=True)\n    def setup(self, browser: Page) -> None:\n        \"\"\"\u041d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u0442 \u0442\u0435\u0441\u0442\u043e\u0432\u043e\u0435 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0435.\n\n        Args:\n            browser: \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.\n        \"\"\"\n\n        lp = LoginPage(browser)\n        lp.do_login()\n\n        mp = MainPage(browser)\n        mp.should_be_navigation_panel()\n        mp.click_main_navigation_panel_item(\"\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438\")\n        mp.click_subpanel_item(\"\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438\")\n\n    @pytest.fixture(scope=\"function\")\n    def cleanup_users(self, browser: Page) -> None:\n        \"\"\"\u0424\u0438\u043a\u0441\u0442\u0443\u0440\u0430 \u0434\u043b\u044f \u043e\u0447\u0438\u0441\u0442\u043a\u0438 \u0442\u0435\u0441\u0442\u043e\u0432\u044b\u0445 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 \u0438 \u0438\u0445 \u0441\u0435\u0430\u043d\u0441\u043e\u0432 \u043f\u043e\u0441\u043b\u0435 \u0442\u0435\u0441\u0442\u0430.\"\"\"\n        yield\n\n        # \u0412\u044b\u0445\u043e\u0434 \u0438\u0437 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\n        mp = MainPage(browser)\n        mp.do_logout()\n\n        # \u0410\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u044f \u0430\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440\u043e\u043c \u0434\u043b\u044f \u043e\u0447\u0438\u0441\u0442\u043a\u0438\n        login_page = LoginPage(browser)\n        login_page.do_login()\n\n        # \u0423\u0434\u0430\u043b\u044f\u0435\u043c \u0442\u0435\u0441\u0442\u043e\u0432\u044b\u0445 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439\n        self._cleanup_test_users(browser)\n\n    def _cleanup_test_users(self, browser: Page) -> None:\n        \"\"\"\u0423\u0434\u0430\u043b\u044f\u0435\u0442 \u0442\u0435\u0441\u0442\u043e\u0432\u044b\u0445 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439.\"\"\"\n        mp = MainPage(browser)\n        mp.click_main_navigation_panel_item(\"\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438\")\n        mp.click_subpanel_item(\"\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438\")\n        ut = UsersTab(browser)\n\n        # \u0423\u0434\u0430\u043b\u044f\u0435\u043c \u0442\u0435\u0441\u0442\u043e\u0432\u044b\u0445 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439\n        test_users = [\"TestUser\", \"TestUserAutoOperator\", \"TestUserAutoAdmin\"]\n\n        for user_name in test_users:\n            # \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u043b\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u0438 \u0443\u0434\u0430\u043b\u044f\u0435\u043c \u0435\u0433\u043e\n            user_index = ut.find_user_in_table(user_name, \"\u0410\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440\")\n            if user_index != -1:\n                ut.open_edit_user_page_by_user(user_name, \"\u0410\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440\")\n                ut.delete_user(user_name)\n\n\n    def test_users_tab_content(self, browser: Page) -> None:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u0432\u043a\u043b\u0430\u0434\u043a\u0438 '\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438'.\n\n        Args:\n            browser: \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.\n        \"\"\"\n\n        ut = UsersTab(browser)\n        ut.should_be_toolbar()\n        ut.should_be_users_table()\n        ut.check_users_table_content(True)\n\n    def test_users_tab_toolbar_buttons(self, browser: Page) -> None:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043a\u043d\u043e\u043f\u043a\u0438 \u043d\u0430 \u043f\u0430\u043d\u0435\u043b\u0438 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432.\n\n        Args:\n            browser: \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.\n        \"\"\"\n\n        ut = UsersTab(browser)\n        ut.should_be_toolbar_buttons()\n\n    # @pytest.mark.develop\n    def test_add_user_window_content(self, browser: Page) -> None:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u043e\u043a\u043d\u0430 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\n\n        Args:\n            browser: \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.\n        \"\"\"\n\n        ut = UsersTab(browser)\n        ut.open_add_user_window()\n        ut.check_add_user_window_content()\n        ut.transform_to_add_AD_user_window()\n        ut.check_add_AD_user_window_content()\n\n    def test_add_user_window_close_buttons(self, browser: Page) -> None:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043a\u043d\u043e\u043f\u043a\u0438 \u0437\u0430\u043a\u0440\u044b\u0442\u0438\u044f \u043e\u043a\u043d\u0430 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f.\n\n        Args:\n            browser: \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.\n        \"\"\"\n\n        ut = UsersTab(browser)\n        ut.open_add_user_window()\n        ut.close_add_user_window_by_toolbar_button()\n\n        ut.open_add_user_window()\n        ut.close_add_user_window()\n\n        ut.open_add_user_window()\n        ut.transform_to_add_AD_user_window()\n        ut.close_add_AD_user_window_by_toolbar_button()\n\n        ut.open_add_user_window()\n        ut.transform_to_add_AD_user_window()\n        ut.close_add_AD_user_window()\n\n    def test_edit_user_window_content(self, browser: Page) -> None:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u043e\u043a\u043d\u0430 \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f.\n\n        Args:\n            browser: \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.\n        \"\"\"\n\n        ut = UsersTab(browser)\n        user_name, role = ut.open_edit_user_page_by_index(0)\n        ut.check_edit_user_window_content(user_name, role)\n\n    def test_edit_user_window_close_buttons(self, browser: Page) -> None:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043a\u043d\u043e\u043f\u043a\u0438 \u0437\u0430\u043a\u0440\u044b\u0442\u0438\u044f \u043e\u043a\u043d\u0430 \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f.\n\n        Args:\n            browser: \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.\n        \"\"\"\n\n        ut = UsersTab(browser)\n        user_name, _ = ut.open_edit_user_page_by_index(0)\n        ut.close_edit_user_window_by_toolbar_button(user_name)\n        user_name, _ = ut.open_edit_user_page_by_index(0)\n        ut.close_edit_user_window(user_name)\n\n    # @pytest.mark.develop\n    def test_add_and_delete_user(self, browser: Page, cleanup_users: None) -> None:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0438 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\n\n        Args:\n            browser: \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.\n            cleanup_users: \u0424\u0438\u043a\u0441\u0442\u0443\u0440\u0430 \u0434\u043b\u044f \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u043f\u043e\u0441\u043b\u0435 \u0442\u0435\u0441\u0442\u0430.\n        \"\"\"\n\n        user_data: Dict[str, str] = {\"name\": \"TestUser\", \"role\": \"\u0410\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440\", \"password\": \"987654\"}\n\n        mp = MainPage(browser)\n        ut = UsersTab(browser)\n\n        # \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c, \u0435\u0441\u0442\u044c \u043b\u0438 \u0442\u0430\u043a\u043e\u0439 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\n        user_exists = ut.find_user_in_table(user_data[\"name\"], user_data[\"role\"]) != -1\n\n        if not user_exists:\n            # \u0421\u043e\u0437\u0434\u0430\u0435\u043c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0432\u043f\u0435\u0440\u0432\u044b\u0435\n            ut.open_add_user_window()\n            success = ut.add_new_user(user_data)\n\n            if success:\n                # \u0416\u0434\u0435\u043c \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u0439 Playwright\n                browser.wait_for_timeout(2000)\n\n                # \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435\n                user_found = ut.find_user_in_table(user_data[\"name\"], user_data[\"role\"]) != -1\n                if not user_found:\n                    # \u0415\u0441\u043b\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d, \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u0435\u043c \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0443\n                    browser.reload()\n                    browser.wait_for_timeout(2000)\n            else:\n                ut.close_add_user_window()\n\n        # \u041f\u044b\u0442\u0430\u0435\u043c\u0441\u044f \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0442\u0430\u043a\u043e\u0433\u043e \u0436\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0441\u043d\u043e\u0432\u0430\n        ut.open_add_user_window()\n        success_second = ut.add_new_user(user_data)\n\n        # \u0414\u043e\u043b\u0436\u043d\u043e \u0432\u0435\u0440\u043d\u0443\u0442\u044c\u0441\u044f False \u043f\u0440\u0438 \u043f\u043e\u043f\u044b\u0442\u043a\u0435 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\n        assert not success_second, \"\u041e\u0436\u0438\u0434\u0430\u043b\u0430\u0441\u044c \u043e\u0448\u0438\u0431\u043a\u0430 \u043f\u0440\u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0438 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\"\n\n        ut.open_edit_user_page_by_user(user_data[\"name\"], user_data[\"role\"])\n        ut.delete_user(user_data[\"name\"])\n        mp.click_subpanel_item(\"\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438\")\n        mp.click_subpanel_item(\"\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438\")\n        ut.should_not_be_user_in_table(user_data[\"name\"], user_data[\"role\"])\n\n    # @pytest.mark.develop\n    def test_add_AD_user(self, browser: Page, cleanup_users: None) -> None:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f Active Directory.\n\n        Args:\n            browser: \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.\n            cleanup_users: \u0424\u0438\u043a\u0441\u0442\u0443\u0440\u0430 \u0434\u043b\u044f \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u043f\u043e\u0441\u043b\u0435 \u0442\u0435\u0441\u0442\u0430.\n        \"\"\"\n\n        user_data: Dict[str, str] = {\"auth_type\":\"active_directory\",\n                                     \"group\": \"\u0410\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440\u044b\",\n                                     \"name\": \"\u0410\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440\",\n                                     \"role\": \"\u0410\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440\"}\n\n        ut = UsersTab(browser)\n\n        ut.open_add_user_window()\n        ut.add_new_user(user_data)\n\n    def test_reset_password(self, browser: Page, cleanup_users: None) -> None:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0441\u0431\u0440\u043e\u0441 \u043f\u0430\u0440\u043e\u043b\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\n\n        Args:\n            browser: \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.\n            cleanup_users: \u0424\u0438\u043a\u0441\u0442\u0443\u0440\u0430 \u0434\u043b\u044f \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u043f\u043e\u0441\u043b\u0435 \u0442\u0435\u0441\u0442\u0430.\n        \"\"\"\n\n        user_data: Dict[str, str] = {\"name\": \"TestUserAutoAdmin\", \"role\": \"\u0410\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440\", \"password\": \"123456\"}\n\n        mp = MainPage(browser)\n        ut = UsersTab(browser)\n\n        ut.open_add_user_window()\n        ut.add_new_user(user_data)\n        mp.click_subpanel_item(\"\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438\")\n        mp.click_subpanel_item(\"\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438\")\n        ut.open_edit_user_page_by_user(user_data[\"name\"], user_data[\"role\"])\n        new_password = ut.reset_password(user_data[\"name\"])\n\n        if len(new_password) == 0:\n            assert False, \"Unsuccessful password reset\"\n\n        new_lp = LoginPage(browser)\n        new_lp.do_login(username=user_data[\"name\"], password=new_password)\n        new_mp = MainPage(browser)\n        new_mp.do_logout()\n        lp_1 = LoginPage(browser)\n        lp_1.do_login()\n        mp_1 = MainPage(browser)\n        mp_1.should_be_navigation_panel()\n        mp_1.click_main_navigation_panel_item(\"\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438\")\n        mp_1.click_subpanel_item(\"\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438\")\n        ut_1 = UsersTab(browser)\n        ut_1.open_edit_user_page_by_user(user_data[\"name\"], user_data[\"role\"])\n        ut_1.delete_user(user_data[\"name\"])\n        mp_1.click_subpanel_item(\"\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438\")\n        mp_1.click_subpanel_item(\"\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438\")\n        ut_1.should_not_be_user_in_table(user_data[\"name\"], user_data[\"role\"])\n\n    def test_edit_user_role(self, browser: Page, cleanup_users: None) -> None:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u0440\u043e\u043b\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\n\n        Args:\n            browser: \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.\n            cleanup_users: \u0424\u0438\u043a\u0441\u0442\u0443\u0440\u0430 \u0434\u043b\u044f \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u043f\u043e\u0441\u043b\u0435 \u0442\u0435\u0441\u0442\u0430.\n        \"\"\"\n\n        user_data: Dict[str, str] = {\"name\": \"TestUserAutoOperator\", \"role\": \"\u041e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\", \"password\": \"123245\"}\n\n        mp = MainPage(browser)\n        ut = UsersTab(browser)\n\n        ut.open_add_user_window()\n        ut.add_new_user(user_data)\n        mp.click_subpanel_item(\"\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438\")\n        mp.click_subpanel_item(\"\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438\")\n        ut.open_edit_user_page_by_user(user_data[\"name\"], user_data[\"role\"])\n        new_user_data = {\"role\": \"\u041a\u043e\u043d\u0442\u0430\u043a\u0442\u043d\u043e\u0435 \u043b\u0438\u0446\u043e\"}\n        ut.edit_user(user_data[\"name\"], new_user_data)\n        mp.click_subpanel_item(\"\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438\")\n        mp.click_subpanel_item(\"\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438\")\n        ut.should_be_user_in_table(user_data[\"name\"], new_user_data[\"role\"])\n        ut.open_edit_user_page_by_user(user_data[\"name\"], new_user_data[\"role\"])\n        ut.delete_user(user_data[\"name\"])\n        mp.click_subpanel_item(\"\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438\")\n        mp.click_subpanel_item(\"\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438\")\n        ut.should_not_be_user_in_table(user_data[\"name\"], new_user_data[\"role\"])\n
    "},{"location":"tests/e2e/test_users_tab/#tests.e2e.test_users_tab.TestUsersTab.cleanup_users","title":"cleanup_users(browser)","text":"

    \u0424\u0438\u043a\u0441\u0442\u0443\u0440\u0430 \u0434\u043b\u044f \u043e\u0447\u0438\u0441\u0442\u043a\u0438 \u0442\u0435\u0441\u0442\u043e\u0432\u044b\u0445 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 \u0438 \u0438\u0445 \u0441\u0435\u0430\u043d\u0441\u043e\u0432 \u043f\u043e\u0441\u043b\u0435 \u0442\u0435\u0441\u0442\u0430.

    Source code in tests\\e2e\\test_users_tab.py
    @pytest.fixture(scope=\"function\")\ndef cleanup_users(self, browser: Page) -> None:\n    \"\"\"\u0424\u0438\u043a\u0441\u0442\u0443\u0440\u0430 \u0434\u043b\u044f \u043e\u0447\u0438\u0441\u0442\u043a\u0438 \u0442\u0435\u0441\u0442\u043e\u0432\u044b\u0445 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 \u0438 \u0438\u0445 \u0441\u0435\u0430\u043d\u0441\u043e\u0432 \u043f\u043e\u0441\u043b\u0435 \u0442\u0435\u0441\u0442\u0430.\"\"\"\n    yield\n\n    # \u0412\u044b\u0445\u043e\u0434 \u0438\u0437 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\n    mp = MainPage(browser)\n    mp.do_logout()\n\n    # \u0410\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u044f \u0430\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440\u043e\u043c \u0434\u043b\u044f \u043e\u0447\u0438\u0441\u0442\u043a\u0438\n    login_page = LoginPage(browser)\n    login_page.do_login()\n\n    # \u0423\u0434\u0430\u043b\u044f\u0435\u043c \u0442\u0435\u0441\u0442\u043e\u0432\u044b\u0445 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439\n    self._cleanup_test_users(browser)\n
    "},{"location":"tests/e2e/test_users_tab/#tests.e2e.test_users_tab.TestUsersTab.setup","title":"setup(browser)","text":"

    \u041d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u0442 \u0442\u0435\u0441\u0442\u043e\u0432\u043e\u0435 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0435.

    Parameters:

    Name Type Description Default browser Page

    \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.

    required Source code in tests\\e2e\\test_users_tab.py
    @pytest.fixture(scope=\"function\", autouse=True)\ndef setup(self, browser: Page) -> None:\n    \"\"\"\u041d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u0442 \u0442\u0435\u0441\u0442\u043e\u0432\u043e\u0435 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0435.\n\n    Args:\n        browser: \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.\n    \"\"\"\n\n    lp = LoginPage(browser)\n    lp.do_login()\n\n    mp = MainPage(browser)\n    mp.should_be_navigation_panel()\n    mp.click_main_navigation_panel_item(\"\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438\")\n    mp.click_subpanel_item(\"\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438\")\n
    "},{"location":"tests/e2e/test_users_tab/#tests.e2e.test_users_tab.TestUsersTab.test_add_AD_user","title":"test_add_AD_user(browser, cleanup_users)","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f Active Directory.

    Parameters:

    Name Type Description Default browser Page

    \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.

    required cleanup_users None

    \u0424\u0438\u043a\u0441\u0442\u0443\u0440\u0430 \u0434\u043b\u044f \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u043f\u043e\u0441\u043b\u0435 \u0442\u0435\u0441\u0442\u0430.

    required Source code in tests\\e2e\\test_users_tab.py
    def test_add_AD_user(self, browser: Page, cleanup_users: None) -> None:\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f Active Directory.\n\n    Args:\n        browser: \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.\n        cleanup_users: \u0424\u0438\u043a\u0441\u0442\u0443\u0440\u0430 \u0434\u043b\u044f \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u043f\u043e\u0441\u043b\u0435 \u0442\u0435\u0441\u0442\u0430.\n    \"\"\"\n\n    user_data: Dict[str, str] = {\"auth_type\":\"active_directory\",\n                                 \"group\": \"\u0410\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440\u044b\",\n                                 \"name\": \"\u0410\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440\",\n                                 \"role\": \"\u0410\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440\"}\n\n    ut = UsersTab(browser)\n\n    ut.open_add_user_window()\n    ut.add_new_user(user_data)\n
    "},{"location":"tests/e2e/test_users_tab/#tests.e2e.test_users_tab.TestUsersTab.test_add_and_delete_user","title":"test_add_and_delete_user(browser, cleanup_users)","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0438 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.

    Parameters:

    Name Type Description Default browser Page

    \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.

    required cleanup_users None

    \u0424\u0438\u043a\u0441\u0442\u0443\u0440\u0430 \u0434\u043b\u044f \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u043f\u043e\u0441\u043b\u0435 \u0442\u0435\u0441\u0442\u0430.

    required Source code in tests\\e2e\\test_users_tab.py
    def test_add_and_delete_user(self, browser: Page, cleanup_users: None) -> None:\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0438 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\n\n    Args:\n        browser: \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.\n        cleanup_users: \u0424\u0438\u043a\u0441\u0442\u0443\u0440\u0430 \u0434\u043b\u044f \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u043f\u043e\u0441\u043b\u0435 \u0442\u0435\u0441\u0442\u0430.\n    \"\"\"\n\n    user_data: Dict[str, str] = {\"name\": \"TestUser\", \"role\": \"\u0410\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440\", \"password\": \"987654\"}\n\n    mp = MainPage(browser)\n    ut = UsersTab(browser)\n\n    # \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c, \u0435\u0441\u0442\u044c \u043b\u0438 \u0442\u0430\u043a\u043e\u0439 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\n    user_exists = ut.find_user_in_table(user_data[\"name\"], user_data[\"role\"]) != -1\n\n    if not user_exists:\n        # \u0421\u043e\u0437\u0434\u0430\u0435\u043c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0432\u043f\u0435\u0440\u0432\u044b\u0435\n        ut.open_add_user_window()\n        success = ut.add_new_user(user_data)\n\n        if success:\n            # \u0416\u0434\u0435\u043c \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u0439 Playwright\n            browser.wait_for_timeout(2000)\n\n            # \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435\n            user_found = ut.find_user_in_table(user_data[\"name\"], user_data[\"role\"]) != -1\n            if not user_found:\n                # \u0415\u0441\u043b\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d, \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u0435\u043c \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0443\n                browser.reload()\n                browser.wait_for_timeout(2000)\n        else:\n            ut.close_add_user_window()\n\n    # \u041f\u044b\u0442\u0430\u0435\u043c\u0441\u044f \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0442\u0430\u043a\u043e\u0433\u043e \u0436\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0441\u043d\u043e\u0432\u0430\n    ut.open_add_user_window()\n    success_second = ut.add_new_user(user_data)\n\n    # \u0414\u043e\u043b\u0436\u043d\u043e \u0432\u0435\u0440\u043d\u0443\u0442\u044c\u0441\u044f False \u043f\u0440\u0438 \u043f\u043e\u043f\u044b\u0442\u043a\u0435 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\n    assert not success_second, \"\u041e\u0436\u0438\u0434\u0430\u043b\u0430\u0441\u044c \u043e\u0448\u0438\u0431\u043a\u0430 \u043f\u0440\u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0438 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\"\n\n    ut.open_edit_user_page_by_user(user_data[\"name\"], user_data[\"role\"])\n    ut.delete_user(user_data[\"name\"])\n    mp.click_subpanel_item(\"\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438\")\n    mp.click_subpanel_item(\"\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438\")\n    ut.should_not_be_user_in_table(user_data[\"name\"], user_data[\"role\"])\n
    "},{"location":"tests/e2e/test_users_tab/#tests.e2e.test_users_tab.TestUsersTab.test_add_user_window_close_buttons","title":"test_add_user_window_close_buttons(browser)","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043a\u043d\u043e\u043f\u043a\u0438 \u0437\u0430\u043a\u0440\u044b\u0442\u0438\u044f \u043e\u043a\u043d\u0430 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f.

    Parameters:

    Name Type Description Default browser Page

    \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.

    required Source code in tests\\e2e\\test_users_tab.py
    def test_add_user_window_close_buttons(self, browser: Page) -> None:\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043a\u043d\u043e\u043f\u043a\u0438 \u0437\u0430\u043a\u0440\u044b\u0442\u0438\u044f \u043e\u043a\u043d\u0430 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f.\n\n    Args:\n        browser: \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.\n    \"\"\"\n\n    ut = UsersTab(browser)\n    ut.open_add_user_window()\n    ut.close_add_user_window_by_toolbar_button()\n\n    ut.open_add_user_window()\n    ut.close_add_user_window()\n\n    ut.open_add_user_window()\n    ut.transform_to_add_AD_user_window()\n    ut.close_add_AD_user_window_by_toolbar_button()\n\n    ut.open_add_user_window()\n    ut.transform_to_add_AD_user_window()\n    ut.close_add_AD_user_window()\n
    "},{"location":"tests/e2e/test_users_tab/#tests.e2e.test_users_tab.TestUsersTab.test_add_user_window_content","title":"test_add_user_window_content(browser)","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u043e\u043a\u043d\u0430 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.

    Parameters:

    Name Type Description Default browser Page

    \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.

    required Source code in tests\\e2e\\test_users_tab.py
    def test_add_user_window_content(self, browser: Page) -> None:\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u043e\u043a\u043d\u0430 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\n\n    Args:\n        browser: \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.\n    \"\"\"\n\n    ut = UsersTab(browser)\n    ut.open_add_user_window()\n    ut.check_add_user_window_content()\n    ut.transform_to_add_AD_user_window()\n    ut.check_add_AD_user_window_content()\n
    "},{"location":"tests/e2e/test_users_tab/#tests.e2e.test_users_tab.TestUsersTab.test_edit_user_role","title":"test_edit_user_role(browser, cleanup_users)","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u0440\u043e\u043b\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.

    Parameters:

    Name Type Description Default browser Page

    \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.

    required cleanup_users None

    \u0424\u0438\u043a\u0441\u0442\u0443\u0440\u0430 \u0434\u043b\u044f \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u043f\u043e\u0441\u043b\u0435 \u0442\u0435\u0441\u0442\u0430.

    required Source code in tests\\e2e\\test_users_tab.py
    def test_edit_user_role(self, browser: Page, cleanup_users: None) -> None:\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u0440\u043e\u043b\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\n\n    Args:\n        browser: \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.\n        cleanup_users: \u0424\u0438\u043a\u0441\u0442\u0443\u0440\u0430 \u0434\u043b\u044f \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u043f\u043e\u0441\u043b\u0435 \u0442\u0435\u0441\u0442\u0430.\n    \"\"\"\n\n    user_data: Dict[str, str] = {\"name\": \"TestUserAutoOperator\", \"role\": \"\u041e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\", \"password\": \"123245\"}\n\n    mp = MainPage(browser)\n    ut = UsersTab(browser)\n\n    ut.open_add_user_window()\n    ut.add_new_user(user_data)\n    mp.click_subpanel_item(\"\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438\")\n    mp.click_subpanel_item(\"\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438\")\n    ut.open_edit_user_page_by_user(user_data[\"name\"], user_data[\"role\"])\n    new_user_data = {\"role\": \"\u041a\u043e\u043d\u0442\u0430\u043a\u0442\u043d\u043e\u0435 \u043b\u0438\u0446\u043e\"}\n    ut.edit_user(user_data[\"name\"], new_user_data)\n    mp.click_subpanel_item(\"\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438\")\n    mp.click_subpanel_item(\"\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438\")\n    ut.should_be_user_in_table(user_data[\"name\"], new_user_data[\"role\"])\n    ut.open_edit_user_page_by_user(user_data[\"name\"], new_user_data[\"role\"])\n    ut.delete_user(user_data[\"name\"])\n    mp.click_subpanel_item(\"\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438\")\n    mp.click_subpanel_item(\"\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438\")\n    ut.should_not_be_user_in_table(user_data[\"name\"], new_user_data[\"role\"])\n
    "},{"location":"tests/e2e/test_users_tab/#tests.e2e.test_users_tab.TestUsersTab.test_edit_user_window_close_buttons","title":"test_edit_user_window_close_buttons(browser)","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043a\u043d\u043e\u043f\u043a\u0438 \u0437\u0430\u043a\u0440\u044b\u0442\u0438\u044f \u043e\u043a\u043d\u0430 \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f.

    Parameters:

    Name Type Description Default browser Page

    \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.

    required Source code in tests\\e2e\\test_users_tab.py
    def test_edit_user_window_close_buttons(self, browser: Page) -> None:\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043a\u043d\u043e\u043f\u043a\u0438 \u0437\u0430\u043a\u0440\u044b\u0442\u0438\u044f \u043e\u043a\u043d\u0430 \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f.\n\n    Args:\n        browser: \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.\n    \"\"\"\n\n    ut = UsersTab(browser)\n    user_name, _ = ut.open_edit_user_page_by_index(0)\n    ut.close_edit_user_window_by_toolbar_button(user_name)\n    user_name, _ = ut.open_edit_user_page_by_index(0)\n    ut.close_edit_user_window(user_name)\n
    "},{"location":"tests/e2e/test_users_tab/#tests.e2e.test_users_tab.TestUsersTab.test_edit_user_window_content","title":"test_edit_user_window_content(browser)","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u043e\u043a\u043d\u0430 \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f.

    Parameters:

    Name Type Description Default browser Page

    \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.

    required Source code in tests\\e2e\\test_users_tab.py
    def test_edit_user_window_content(self, browser: Page) -> None:\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u043e\u043a\u043d\u0430 \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f.\n\n    Args:\n        browser: \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.\n    \"\"\"\n\n    ut = UsersTab(browser)\n    user_name, role = ut.open_edit_user_page_by_index(0)\n    ut.check_edit_user_window_content(user_name, role)\n
    "},{"location":"tests/e2e/test_users_tab/#tests.e2e.test_users_tab.TestUsersTab.test_reset_password","title":"test_reset_password(browser, cleanup_users)","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0441\u0431\u0440\u043e\u0441 \u043f\u0430\u0440\u043e\u043b\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.

    Parameters:

    Name Type Description Default browser Page

    \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.

    required cleanup_users None

    \u0424\u0438\u043a\u0441\u0442\u0443\u0440\u0430 \u0434\u043b\u044f \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u043f\u043e\u0441\u043b\u0435 \u0442\u0435\u0441\u0442\u0430.

    required Source code in tests\\e2e\\test_users_tab.py
    def test_reset_password(self, browser: Page, cleanup_users: None) -> None:\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0441\u0431\u0440\u043e\u0441 \u043f\u0430\u0440\u043e\u043b\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\n\n    Args:\n        browser: \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.\n        cleanup_users: \u0424\u0438\u043a\u0441\u0442\u0443\u0440\u0430 \u0434\u043b\u044f \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u043f\u043e\u0441\u043b\u0435 \u0442\u0435\u0441\u0442\u0430.\n    \"\"\"\n\n    user_data: Dict[str, str] = {\"name\": \"TestUserAutoAdmin\", \"role\": \"\u0410\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440\", \"password\": \"123456\"}\n\n    mp = MainPage(browser)\n    ut = UsersTab(browser)\n\n    ut.open_add_user_window()\n    ut.add_new_user(user_data)\n    mp.click_subpanel_item(\"\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438\")\n    mp.click_subpanel_item(\"\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438\")\n    ut.open_edit_user_page_by_user(user_data[\"name\"], user_data[\"role\"])\n    new_password = ut.reset_password(user_data[\"name\"])\n\n    if len(new_password) == 0:\n        assert False, \"Unsuccessful password reset\"\n\n    new_lp = LoginPage(browser)\n    new_lp.do_login(username=user_data[\"name\"], password=new_password)\n    new_mp = MainPage(browser)\n    new_mp.do_logout()\n    lp_1 = LoginPage(browser)\n    lp_1.do_login()\n    mp_1 = MainPage(browser)\n    mp_1.should_be_navigation_panel()\n    mp_1.click_main_navigation_panel_item(\"\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438\")\n    mp_1.click_subpanel_item(\"\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438\")\n    ut_1 = UsersTab(browser)\n    ut_1.open_edit_user_page_by_user(user_data[\"name\"], user_data[\"role\"])\n    ut_1.delete_user(user_data[\"name\"])\n    mp_1.click_subpanel_item(\"\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438\")\n    mp_1.click_subpanel_item(\"\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438\")\n    ut_1.should_not_be_user_in_table(user_data[\"name\"], user_data[\"role\"])\n
    "},{"location":"tests/e2e/test_users_tab/#tests.e2e.test_users_tab.TestUsersTab.test_users_tab_content","title":"test_users_tab_content(browser)","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u0432\u043a\u043b\u0430\u0434\u043a\u0438 '\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438'.

    Parameters:

    Name Type Description Default browser Page

    \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.

    required Source code in tests\\e2e\\test_users_tab.py
    def test_users_tab_content(self, browser: Page) -> None:\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u0432\u043a\u043b\u0430\u0434\u043a\u0438 '\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438'.\n\n    Args:\n        browser: \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.\n    \"\"\"\n\n    ut = UsersTab(browser)\n    ut.should_be_toolbar()\n    ut.should_be_users_table()\n    ut.check_users_table_content(True)\n
    "},{"location":"tests/e2e/test_users_tab/#tests.e2e.test_users_tab.TestUsersTab.test_users_tab_toolbar_buttons","title":"test_users_tab_toolbar_buttons(browser)","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043a\u043d\u043e\u043f\u043a\u0438 \u043d\u0430 \u043f\u0430\u043d\u0435\u043b\u0438 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432.

    Parameters:

    Name Type Description Default browser Page

    \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.

    required Source code in tests\\e2e\\test_users_tab.py
    def test_users_tab_toolbar_buttons(self, browser: Page) -> None:\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043a\u043d\u043e\u043f\u043a\u0438 \u043d\u0430 \u043f\u0430\u043d\u0435\u043b\u0438 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432.\n\n    Args:\n        browser: \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.\n    \"\"\"\n\n    ut = UsersTab(browser)\n    ut.should_be_toolbar_buttons()\n
    "},{"location":"tools/fix_python_project/","title":"Python Project Fixer","text":"

    \u041c\u043e\u0434\u0443\u043b\u044c \u0438\u0441\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b Python-\u043f\u0440\u043e\u0435\u043a\u0442\u0430.

    \u0410\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442: 1. \u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 BOM-\u043c\u0430\u0440\u043a\u0435\u0440\u043e\u0432 \u0438\u0437 \u0444\u0430\u0439\u043b\u043e\u0432 2. \u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u044e\u0449\u0438\u0445 init.py 3. \u041b\u043e\u0433\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0432\u0441\u0435\u0445 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439

    \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435: python fix_python_project.py [\u043f\u0443\u0442\u044c_\u043a_\u043f\u0440\u043e\u0435\u043a\u0442\u0443]

    "},{"location":"tools/fix_python_project/#tools.fix_python_project.ProjectFixer","title":"ProjectFixer","text":"

    \u0418\u0441\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 Python-\u043f\u0440\u043e\u0435\u043a\u0442\u0430.

    \u0410\u0442\u0440\u0438\u0431\u0443\u0442\u044b

    root_dir: \u041a\u043e\u0440\u043d\u0435\u0432\u0430\u044f \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044f \u043f\u0440\u043e\u0435\u043a\u0442\u0430. log: \u041b\u043e\u0433 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u043d\u044b\u0445 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439.

    Source code in tools\\fix_python_project.py
    class ProjectFixer:\n    \"\"\"\u0418\u0441\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 Python-\u043f\u0440\u043e\u0435\u043a\u0442\u0430.\n\n    \u0410\u0442\u0440\u0438\u0431\u0443\u0442\u044b:\n        root_dir: \u041a\u043e\u0440\u043d\u0435\u0432\u0430\u044f \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044f \u043f\u0440\u043e\u0435\u043a\u0442\u0430.\n        log: \u041b\u043e\u0433 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u043d\u044b\u0445 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439.\n    \"\"\"\n\n    def __init__(self, root_dir: str = '.'):\n        \"\"\"\u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442 \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 ProjectFixer.\n\n        Args:\n            root_dir: \u041a\u043e\u0440\u043d\u0435\u0432\u0430\u044f \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044f \u043f\u0440\u043e\u0435\u043a\u0442\u0430. \u041f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e '.'.\n        \"\"\"\n\n        self.root_dir = os.path.abspath(root_dir)\n        self.log: List[str] = []\n\n    def remove_bom(self, filepath: str) -> bool:\n        \"\"\"\u0423\u0434\u0430\u043b\u044f\u0435\u0442 BOM-\u043c\u0430\u0440\u043a\u0435\u0440 \u0438\u0437 \u0444\u0430\u0439\u043b\u0430.\n\n        Args:\n            filepath: \u041f\u0443\u0442\u044c \u043a \u0444\u0430\u0439\u043b\u0443.\n\n        Returns:\n            bool: True \u0435\u0441\u043b\u0438 BOM \u0431\u044b\u043b \u0443\u0434\u0430\u043b\u0451\u043d.\n\n        Raises:\n            Exception: \u041f\u0440\u0438 \u043e\u0448\u0438\u0431\u043a\u0435 \u0447\u0442\u0435\u043d\u0438\u044f/\u0437\u0430\u043f\u0438\u0441\u0438.\n        \"\"\"\n\n        try:\n            with open(filepath, 'rb') as f:\n                content = f.read()\n\n            if content.startswith(b'\\xEF\\xBB\\xBF'):\n                with open(filepath, 'wb') as f:\n                    f.write(content[3:])\n                self.log.append(f\"REMOVED BOM: {filepath}\")\n                return True\n        except Exception as e:\n            self.log.append(f\"ERROR processing {filepath}: {str(e)}\")\n        return False\n\n    def should_skip_init(self, dir_path: str) -> bool:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0443\u0436\u043d\u043e \u043b\u0438 \u043f\u0440\u043e\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044e.\n\n        Args:\n            dir_path: \u041f\u0443\u0442\u044c \u043a \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438.\n\n        Returns:\n            bool: True \u0435\u0441\u043b\u0438 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044e \u043d\u0443\u0436\u043d\u043e \u043f\u0440\u043e\u043f\u0443\u0441\u0442\u0438\u0442\u044c.\n        \"\"\"\n\n        dir_name = os.path.basename(dir_path)\n        return (dir_name in INIT_IGNORED_DIRS or\n                dir_name.startswith('.'))\n\n    def needs_init_py(self, dir_path: str) -> bool:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0443\u0436\u043d\u043e \u043b\u0438 \u0441\u043e\u0437\u0434\u0430\u0442\u044c __init__.py.\n\n        Args:\n            dir_path: \u041f\u0443\u0442\u044c \u043a \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438.\n\n        Returns:\n            bool: True \u0435\u0441\u043b\u0438 __init__.py \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f.\n        \"\"\"\n\n        if self.should_skip_init(dir_path):\n            return False\n\n        try:\n            items = os.listdir(dir_path)\n            has_py_files = any(f.endswith('.py') and f != '__init__.py' for f in items)\n            has_init = '__init__.py' in items\n            return has_py_files and not has_init\n        except Exception:\n            return False\n\n    def create_init_py(self, dir_path: str) -> bool:\n        \"\"\"\u0421\u043e\u0437\u0434\u0430\u0451\u0442 \u0444\u0430\u0439\u043b __init__.py.\n\n        Args:\n            dir_path: \u041f\u0443\u0442\u044c \u043a \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438.\n\n        Returns:\n            bool: True \u0435\u0441\u043b\u0438 \u0444\u0430\u0439\u043b \u0441\u043e\u0437\u0434\u0430\u043d.\n\n        Raises:\n            Exception: \u041f\u0440\u0438 \u043e\u0448\u0438\u0431\u043a\u0435 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f.\n        \"\"\"\n\n        init_path = os.path.join(dir_path, '__init__.py')\n        try:\n            with open(init_path, 'w', encoding='utf-8') as f:\n                f.write(INIT_TEMPLATE)\n            self.log.append(f\"CREATED INIT: {init_path}\")\n            return True\n        except Exception as e:\n            self.log.append(f\"ERROR creating {init_path}: {str(e)}\")\n            return False\n\n    def process_directory(self):\n        \"\"\"\u0420\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u043e \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442 \u043f\u0440\u043e\u0435\u043a\u0442.\"\"\"\n\n        for root, dirs, files in os.walk(self.root_dir):\n            # \u041e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0444\u0430\u0439\u043b\u043e\u0432 \u0441 \u0446\u0435\u043b\u0435\u0432\u044b\u043c\u0438 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f\u043c\u0438\n            for file in files:\n                if file.endswith(TARGET_EXTENSIONS):\n                    self.remove_bom(os.path.join(root, file))\n\n            # \u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 __init__.py \u0433\u0434\u0435 \u044d\u0442\u043e \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\n            if self.needs_init_py(root):\n                self.create_init_py(root)\n\n    def save_log(self, log_file: str = 'project_fix.log'):\n        \"\"\"\u0421\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u0442 \u043b\u043e\u0433 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 \u0432 \u0444\u0430\u0439\u043b.\n\n        Args:\n            log_file: \u0418\u043c\u044f \u0444\u0430\u0439\u043b\u0430 \u043b\u043e\u0433\u0430. \u041f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e 'project_fix.log'.\n        \"\"\"\n\n        with open(log_file, 'w', encoding='utf-8') as f:\n            f.write(\"\\n\".join(self.log))\n
    "},{"location":"tools/fix_python_project/#tools.fix_python_project.ProjectFixer.__init__","title":"__init__(root_dir='.')","text":"

    \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442 \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 ProjectFixer.

    Parameters:

    Name Type Description Default root_dir str

    \u041a\u043e\u0440\u043d\u0435\u0432\u0430\u044f \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044f \u043f\u0440\u043e\u0435\u043a\u0442\u0430. \u041f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e '.'.

    '.' Source code in tools\\fix_python_project.py
    def __init__(self, root_dir: str = '.'):\n    \"\"\"\u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442 \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 ProjectFixer.\n\n    Args:\n        root_dir: \u041a\u043e\u0440\u043d\u0435\u0432\u0430\u044f \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044f \u043f\u0440\u043e\u0435\u043a\u0442\u0430. \u041f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e '.'.\n    \"\"\"\n\n    self.root_dir = os.path.abspath(root_dir)\n    self.log: List[str] = []\n
    "},{"location":"tools/fix_python_project/#tools.fix_python_project.ProjectFixer.create_init_py","title":"create_init_py(dir_path)","text":"

    \u0421\u043e\u0437\u0434\u0430\u0451\u0442 \u0444\u0430\u0439\u043b init.py.

    Parameters:

    Name Type Description Default dir_path str

    \u041f\u0443\u0442\u044c \u043a \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438.

    required

    Returns:

    Name Type Description bool bool

    True \u0435\u0441\u043b\u0438 \u0444\u0430\u0439\u043b \u0441\u043e\u0437\u0434\u0430\u043d.

    Raises:

    Type Description Exception

    \u041f\u0440\u0438 \u043e\u0448\u0438\u0431\u043a\u0435 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f.

    Source code in tools\\fix_python_project.py
    def create_init_py(self, dir_path: str) -> bool:\n    \"\"\"\u0421\u043e\u0437\u0434\u0430\u0451\u0442 \u0444\u0430\u0439\u043b __init__.py.\n\n    Args:\n        dir_path: \u041f\u0443\u0442\u044c \u043a \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438.\n\n    Returns:\n        bool: True \u0435\u0441\u043b\u0438 \u0444\u0430\u0439\u043b \u0441\u043e\u0437\u0434\u0430\u043d.\n\n    Raises:\n        Exception: \u041f\u0440\u0438 \u043e\u0448\u0438\u0431\u043a\u0435 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f.\n    \"\"\"\n\n    init_path = os.path.join(dir_path, '__init__.py')\n    try:\n        with open(init_path, 'w', encoding='utf-8') as f:\n            f.write(INIT_TEMPLATE)\n        self.log.append(f\"CREATED INIT: {init_path}\")\n        return True\n    except Exception as e:\n        self.log.append(f\"ERROR creating {init_path}: {str(e)}\")\n        return False\n
    "},{"location":"tools/fix_python_project/#tools.fix_python_project.ProjectFixer.needs_init_py","title":"needs_init_py(dir_path)","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0443\u0436\u043d\u043e \u043b\u0438 \u0441\u043e\u0437\u0434\u0430\u0442\u044c init.py.

    Parameters:

    Name Type Description Default dir_path str

    \u041f\u0443\u0442\u044c \u043a \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438.

    required

    Returns:

    Name Type Description bool bool

    True \u0435\u0441\u043b\u0438 init.py \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f.

    Source code in tools\\fix_python_project.py
    def needs_init_py(self, dir_path: str) -> bool:\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0443\u0436\u043d\u043e \u043b\u0438 \u0441\u043e\u0437\u0434\u0430\u0442\u044c __init__.py.\n\n    Args:\n        dir_path: \u041f\u0443\u0442\u044c \u043a \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438.\n\n    Returns:\n        bool: True \u0435\u0441\u043b\u0438 __init__.py \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f.\n    \"\"\"\n\n    if self.should_skip_init(dir_path):\n        return False\n\n    try:\n        items = os.listdir(dir_path)\n        has_py_files = any(f.endswith('.py') and f != '__init__.py' for f in items)\n        has_init = '__init__.py' in items\n        return has_py_files and not has_init\n    except Exception:\n        return False\n
    "},{"location":"tools/fix_python_project/#tools.fix_python_project.ProjectFixer.process_directory","title":"process_directory()","text":"

    \u0420\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u043e \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442 \u043f\u0440\u043e\u0435\u043a\u0442.

    Source code in tools\\fix_python_project.py
    def process_directory(self):\n    \"\"\"\u0420\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u043e \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442 \u043f\u0440\u043e\u0435\u043a\u0442.\"\"\"\n\n    for root, dirs, files in os.walk(self.root_dir):\n        # \u041e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0444\u0430\u0439\u043b\u043e\u0432 \u0441 \u0446\u0435\u043b\u0435\u0432\u044b\u043c\u0438 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f\u043c\u0438\n        for file in files:\n            if file.endswith(TARGET_EXTENSIONS):\n                self.remove_bom(os.path.join(root, file))\n\n        # \u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 __init__.py \u0433\u0434\u0435 \u044d\u0442\u043e \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\n        if self.needs_init_py(root):\n            self.create_init_py(root)\n
    "},{"location":"tools/fix_python_project/#tools.fix_python_project.ProjectFixer.remove_bom","title":"remove_bom(filepath)","text":"

    \u0423\u0434\u0430\u043b\u044f\u0435\u0442 BOM-\u043c\u0430\u0440\u043a\u0435\u0440 \u0438\u0437 \u0444\u0430\u0439\u043b\u0430.

    Parameters:

    Name Type Description Default filepath str

    \u041f\u0443\u0442\u044c \u043a \u0444\u0430\u0439\u043b\u0443.

    required

    Returns:

    Name Type Description bool bool

    True \u0435\u0441\u043b\u0438 BOM \u0431\u044b\u043b \u0443\u0434\u0430\u043b\u0451\u043d.

    Raises:

    Type Description Exception

    \u041f\u0440\u0438 \u043e\u0448\u0438\u0431\u043a\u0435 \u0447\u0442\u0435\u043d\u0438\u044f/\u0437\u0430\u043f\u0438\u0441\u0438.

    Source code in tools\\fix_python_project.py
    def remove_bom(self, filepath: str) -> bool:\n    \"\"\"\u0423\u0434\u0430\u043b\u044f\u0435\u0442 BOM-\u043c\u0430\u0440\u043a\u0435\u0440 \u0438\u0437 \u0444\u0430\u0439\u043b\u0430.\n\n    Args:\n        filepath: \u041f\u0443\u0442\u044c \u043a \u0444\u0430\u0439\u043b\u0443.\n\n    Returns:\n        bool: True \u0435\u0441\u043b\u0438 BOM \u0431\u044b\u043b \u0443\u0434\u0430\u043b\u0451\u043d.\n\n    Raises:\n        Exception: \u041f\u0440\u0438 \u043e\u0448\u0438\u0431\u043a\u0435 \u0447\u0442\u0435\u043d\u0438\u044f/\u0437\u0430\u043f\u0438\u0441\u0438.\n    \"\"\"\n\n    try:\n        with open(filepath, 'rb') as f:\n            content = f.read()\n\n        if content.startswith(b'\\xEF\\xBB\\xBF'):\n            with open(filepath, 'wb') as f:\n                f.write(content[3:])\n            self.log.append(f\"REMOVED BOM: {filepath}\")\n            return True\n    except Exception as e:\n        self.log.append(f\"ERROR processing {filepath}: {str(e)}\")\n    return False\n
    "},{"location":"tools/fix_python_project/#tools.fix_python_project.ProjectFixer.save_log","title":"save_log(log_file='project_fix.log')","text":"

    \u0421\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u0442 \u043b\u043e\u0433 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 \u0432 \u0444\u0430\u0439\u043b.

    Parameters:

    Name Type Description Default log_file str

    \u0418\u043c\u044f \u0444\u0430\u0439\u043b\u0430 \u043b\u043e\u0433\u0430. \u041f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e 'project_fix.log'.

    'project_fix.log' Source code in tools\\fix_python_project.py
    def save_log(self, log_file: str = 'project_fix.log'):\n    \"\"\"\u0421\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u0442 \u043b\u043e\u0433 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 \u0432 \u0444\u0430\u0439\u043b.\n\n    Args:\n        log_file: \u0418\u043c\u044f \u0444\u0430\u0439\u043b\u0430 \u043b\u043e\u0433\u0430. \u041f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e 'project_fix.log'.\n    \"\"\"\n\n    with open(log_file, 'w', encoding='utf-8') as f:\n        f.write(\"\\n\".join(self.log))\n
    "},{"location":"tools/fix_python_project/#tools.fix_python_project.ProjectFixer.should_skip_init","title":"should_skip_init(dir_path)","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0443\u0436\u043d\u043e \u043b\u0438 \u043f\u0440\u043e\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044e.

    Parameters:

    Name Type Description Default dir_path str

    \u041f\u0443\u0442\u044c \u043a \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438.

    required

    Returns:

    Name Type Description bool bool

    True \u0435\u0441\u043b\u0438 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044e \u043d\u0443\u0436\u043d\u043e \u043f\u0440\u043e\u043f\u0443\u0441\u0442\u0438\u0442\u044c.

    Source code in tools\\fix_python_project.py
    def should_skip_init(self, dir_path: str) -> bool:\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0443\u0436\u043d\u043e \u043b\u0438 \u043f\u0440\u043e\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044e.\n\n    Args:\n        dir_path: \u041f\u0443\u0442\u044c \u043a \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438.\n\n    Returns:\n        bool: True \u0435\u0441\u043b\u0438 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044e \u043d\u0443\u0436\u043d\u043e \u043f\u0440\u043e\u043f\u0443\u0441\u0442\u0438\u0442\u044c.\n    \"\"\"\n\n    dir_name = os.path.basename(dir_path)\n    return (dir_name in INIT_IGNORED_DIRS or\n            dir_name.startswith('.'))\n
    "},{"location":"tools/logger/","title":"Logging","text":"

    \u041c\u043e\u0434\u0443\u043b\u044c \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u043b\u043e\u0433\u0433\u0435\u0440\u0430.

    \u0421\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0438 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u043b\u043e\u0433\u0433\u0435\u0440\u0430 \u0441 \u0432\u044b\u0432\u043e\u0434\u043e\u043c \u0432 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0439 \u043f\u043e\u0442\u043e\u043a.

    "},{"location":"tools/logger/#tools.logger.get_logger","title":"get_logger(name)","text":"

    \u0421\u043e\u0437\u0434\u0430\u0451\u0442 \u0438 \u043d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u0442 \u043b\u043e\u0433\u0433\u0435\u0440.

    Parameters:

    Name Type Description Default name str

    \u0418\u043c\u044f \u043b\u043e\u0433\u0433\u0435\u0440\u0430 (\u043e\u0431\u044b\u0447\u043d\u043e name \u043c\u043e\u0434\u0443\u043b\u044f).

    required

    Returns:

    Type Description Logger

    logging.Logger: \u041d\u0430\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0439 \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u043b\u043e\u0433\u0433\u0435\u0440\u0430.

    \u041f\u0440\u0438\u043c\u0435\u0440

    logger = get_logger(name) logger.debug(\"\u0422\u0435\u0441\u0442\u043e\u0432\u043e\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435\")

    Source code in tools\\logger.py
    def get_logger(name: str) -> logging.Logger:\n    \"\"\"\u0421\u043e\u0437\u0434\u0430\u0451\u0442 \u0438 \u043d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u0442 \u043b\u043e\u0433\u0433\u0435\u0440.\n\n    Args:\n        name: \u0418\u043c\u044f \u043b\u043e\u0433\u0433\u0435\u0440\u0430 (\u043e\u0431\u044b\u0447\u043d\u043e __name__ \u043c\u043e\u0434\u0443\u043b\u044f).\n\n    Returns:\n        logging.Logger: \u041d\u0430\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0439 \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u043b\u043e\u0433\u0433\u0435\u0440\u0430.\n\n    \u041f\u0440\u0438\u043c\u0435\u0440:\n        logger = get_logger(__name__)\n        logger.debug(\"\u0422\u0435\u0441\u0442\u043e\u0432\u043e\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435\")\n    \"\"\"\n\n    logger = logging.getLogger(name)\n    logger.setLevel(logging.DEBUG)\n\n    # \u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430 \u0434\u043b\u044f \u0432\u044b\u0432\u043e\u0434\u0430 \u0432 \u043a\u043e\u043d\u0441\u043e\u043b\u044c\n    handler = logging.StreamHandler()\n    handler.setLevel(logging.DEBUG)\n\n    # \u0424\u043e\u0440\u043c\u0430\u0442 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439: \u0432\u0440\u0435\u043c\u044f | \u0438\u043c\u044f \u043b\u043e\u0433\u0433\u0435\u0440\u0430 | \u0443\u0440\u043e\u0432\u0435\u043d\u044c | \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435\n    formatter = logging.Formatter('%(asctime)s | %(name)s | %(levelname)s | %(message)s')\n    handler.setFormatter(formatter)\n\n    logger.addHandler(handler)\n\n    return logger\n
    "}]} \ No newline at end of file +{"config":{"lang":["en"],"separator":"[\\s\\-]+","pipeline":["stopWordFilter"]},"docs":[{"location":"","title":"\u0414\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f \u0442\u0435\u0441\u0442\u043e\u0432\u043e\u0433\u043e \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u0430 eNODE-\u041c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043d\u0433","text":"

    \u0410\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u0430\u044f \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f \u0434\u043b\u044f \u0442\u0435\u0441\u0442\u043e\u0432\u043e\u0433\u043e \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u0430, \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0430\u043d\u043d\u043e\u0433\u043e \u0434\u043b\u044f \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f eNODE-\u043c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043d\u0433.

    "},{"location":"#_1","title":"\u041e\u0431\u0437\u043e\u0440 \u043f\u0440\u043e\u0435\u043a\u0442\u0430","text":"

    \u0424\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0430\u043d \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c:

    • Playwright - \u0434\u043b\u044f \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0430\u0446\u0438\u0438 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0430

    • Pytest - \u043a\u0430\u043a \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u0442\u0435\u0441\u0442\u043e\u0432\u044b\u0439 \u0434\u0432\u0438\u0436\u043e\u043a

    • Page Object Model - \u043f\u0430\u0442\u0442\u0435\u0440\u043d \u0434\u043b\u044f \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u0430\u0446\u0438\u0438 \u0442\u0435\u0441\u0442\u043e\u0432\u043e\u0433\u043e \u043a\u043e\u0434\u0430

    • MkDocs - \u0434\u043b\u044f \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438

    • Python 3.8+ - \u044f\u0437\u044b\u043a \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438

    "},{"location":"#_2","title":"\u0414\u0435\u0442\u0430\u043b\u044c\u043d\u0430\u044f \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u043f\u0440\u043e\u0435\u043a\u0442\u0430","text":""},{"location":"#_3","title":"\u041a\u043e\u0440\u043d\u0435\u0432\u0430\u044f \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044f","text":"
    • .env - \u0444\u0430\u0439\u043b \u0441 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u043c\u0438 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f
    • conftest.py - \u0444\u0438\u043a\u0441\u0442\u0443\u0440\u044b Pytest, \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438
    • mkdocs.yml - \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438
    • pytest.ini - \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f \u0442\u0435\u0441\u0442\u043e\u0432 (\u043c\u0430\u0440\u043a\u0435\u0440\u044b, \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b)
    • requirements.txt - \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 Python
    • setup.py - \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f \u043f\u0430\u043a\u0435\u0442\u0430
    "},{"location":"#_4","title":"\u041e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u043c\u043e\u0434\u0443\u043b\u0438","text":""},{"location":"#1-components","title":"1. components/","text":"

    \u0411\u0430\u0437\u043e\u0432\u044b\u0435 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u044b UI: - alert_component.py - \u0440\u0430\u0431\u043e\u0442\u0430 \u0441 alert-\u043e\u043a\u043d\u0430\u043c\u0438 (\u043e\u0448\u0438\u0431\u043a\u0438, \u0443\u0441\u043f\u0435\u0445, \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f) -

    "},{"location":"#2-data","title":"2. data/","text":"

    \u0414\u0430\u043d\u043d\u044b\u0435 \u0438 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438: - constants.py - \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u044b (\u043b\u043e\u0433\u0438\u043d\u044b, \u043f\u0430\u0440\u043e\u043b\u0438) - environment.py - \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f (test/develop) - roles_dict.py - \u0441\u043b\u043e\u0432\u0430\u0440\u044c \u0440\u043e\u043b\u0435\u0439 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 -

    "},{"location":"#3-docs","title":"3. docs/","text":"

    \u0414\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f: - tests/ - \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f \u0442\u0435\u0441\u0442\u043e\u0432 - config/ - \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 \u043f\u043e \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0435 - index.md

    "},{"location":"#4-elements","title":"4. elements/","text":"

    UI-\u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b: - base_element.py - \u0431\u0430\u0437\u043e\u0432\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 - button_element.py - \u043a\u043d\u043e\u043f\u043a\u0438 - checkbox_element.py - \u0447\u0435\u043a\u0431\u043e\u043a\u0441\u044b - text_element.py - \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u044b\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b - text_input_element.py - \u043f\u043e\u043b\u044f \u0432\u0432\u043e\u0434\u0430 - toolbar_button_element.py - \u043a\u043d\u043e\u043f\u043a\u0438 \u0442\u0443\u043b\u0431\u0430\u0440\u0430

    "},{"location":"#5-fixtures","title":"5. fixtures/","text":"

    \u0424\u0438\u043a\u0441\u0442\u0443\u0440\u044b Pytest: - pages.py - \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u043e\u0432, \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u043e\u0432

    "},{"location":"#6-locators","title":"6. locators/","text":"

    \u041b\u043e\u043a\u0430\u0442\u043e\u0440\u044b \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432: - \u041b\u043e\u043a\u0430\u0442\u043e\u0440\u044b \u0434\u043b\u044f \u0432\u0441\u0435\u0445 \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0445 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043e\u0432 (confirm, modal windows, tables \u0438 \u0442.\u0434.)

    "},{"location":"#7-modal_windows","title":"7. modal_windows/","text":"

    \u0421\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u044b\u0435 \u043e\u043a\u043d\u0430: - modal_add_user.py - \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f - modal_edit_user.py - \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f

    "},{"location":"#8-pages","title":"8. pages/","text":"

    \u0421\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f: - base_page.py - \u0431\u0430\u0437\u043e\u0432\u044b\u0439 \u043a\u043b\u0430\u0441\u0441 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b - login_page.py - \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0430 \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u0438 - main_page.py - \u0433\u043b\u0430\u0432\u043d\u0430\u044f \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0430 - \u0422\u0430\u0431\u044b: service_status_tab.py, session_tab.py, users_tab.py

    "},{"location":"#9-tests","title":"9. tests/","text":"

    \u0422\u0435\u0441\u0442\u044b: - \u041e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u0442\u0435\u0441\u0442\u044b (test_login.py, test_session_tab.py \u0438 \u0434\u0440.) - \u041f\u043e\u0434\u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438: - components/ - \u0442\u0435\u0441\u0442\u044b \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043e\u0432 - e2e/ - end-to-end \u0442\u0435\u0441\u0442\u044b

    "},{"location":"#10-tools","title":"10. tools/","text":"

    \u0423\u0442\u0438\u043b\u0438\u0442\u044b: - logger.py - \u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u043b\u043e\u0433\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f

    "},{"location":"#_5","title":"\u0412\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043e\u0432","text":"
    1. \u0422\u0435\u0441\u0442\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b (pages)
    2. \u0421\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u0441\u043e\u0441\u0442\u043e\u044f\u0442 \u0438\u0437 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043e\u0432 (components)
    3. \u041a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u044b \u0441\u043e\u0441\u0442\u043e\u044f\u0442 \u0438\u0437 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 (elements)
    4. \u042d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442 \u043b\u043e\u043a\u0430\u0442\u043e\u0440\u044b \u0438\u0437 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0445 \u0444\u0430\u0439\u043b\u043e\u0432
    5. \u0412\u0441\u0435 \u043c\u043e\u0434\u0443\u043b\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442:
    6. \u041e\u0431\u0449\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0438\u0437 data/
    7. \u041b\u043e\u0433\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0447\u0435\u0440\u0435\u0437 tools/logger.py
    8. \u0424\u0438\u043a\u0441\u0442\u0443\u0440\u044b \u0438\u0437 fixtures/
    "},{"location":"#_6","title":"\u041a\u0430\u043a \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c","text":""},{"location":"#_7","title":"\u0423\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438:","text":"

    bash pip install -e . \u0417\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u0435 \u0442\u0435\u0441\u0442\u044b:

    bash

    "},{"location":"#_8","title":"\u0412\u0441\u0435 \u0442\u0435\u0441\u0442\u044b","text":"

    pytest tests/ -v

    "},{"location":"#smoke-","title":"\u0422\u043e\u043b\u044c\u043a\u043e smoke-\u0442\u0435\u0441\u0442\u044b","text":"

    pytest tests/ -m smoke -v

    "},{"location":"#_9","title":"\u0421\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0439\u0442\u0435 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044e:","text":"

    bash

    mkdocs serve

    "},{"location":"#_10","title":"\u041f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u043c\u044b\u0435 \u0442\u0435\u0441\u0442\u044b","text":"

    \u0410\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u044f (\u0443\u0441\u043f\u0435\u0448\u043d\u0430\u044f/\u043d\u0435\u0443\u0434\u0430\u0447\u043d\u0430\u044f)

    \u0423\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0441\u0435\u0441\u0441\u0438\u044f\u043c\u0438:

    • \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0442\u0430\u0431\u043b\u0438\u0446\u044b

    • \u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u0441\u0435\u0441\u0441\u0438\u0439

    • \u041c\u043e\u0434\u0430\u043b\u044c\u043d\u044b\u0435 \u043e\u043a\u043d\u0430

    \u0423\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\u043c\u0438:

    • \u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435/\u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0435

    • \u0418\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u0440\u043e\u043b\u0435\u0439

    • \u0421\u0431\u0440\u043e\u0441 \u043f\u0430\u0440\u043e\u043b\u0435\u0439

    "},{"location":"#_11","title":"\u0421\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0435 \u0442\u0435\u0441\u0442\u044b:","text":"
    • \u0421\u0442\u0430\u0442\u0443\u0441 \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432

    • \u041b\u0438\u0446\u0435\u043d\u0437\u0438\u0438

    "},{"location":"components/alert_component/","title":"AlertComponent","text":"

    \u041c\u043e\u0434\u0443\u043b\u044c \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043e\u043c alert-\u043e\u043a\u043d\u0430 \u0432 Playwright.

    \u0421\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043a\u043b\u0430\u0441\u0441 AlertComponent \u0434\u043b\u044f \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0441 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u043c\u0438 \u0442\u0438\u043f\u0430\u043c\u0438 alert-\u043e\u043a\u043e\u043d (error, success, info, warning) \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0438\u0445 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f.

    "},{"location":"components/alert_component/#components.alert_component.AlertComponent","title":"AlertComponent","text":"

    Bases: BaseComponent

    \u041a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 alert-\u043e\u043a\u043d\u0430\u043c\u0438 Playwright.

    \u041f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u0442\u0438\u043f\u044b: error, success, info, warning. \u041f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0442\u044c \u043d\u0430\u043b\u0438\u0447\u0438\u0435, \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u0435 \u0438 \u0442\u0435\u043a\u0441\u0442 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439.

    Source code in components\\alert_component.py
    class AlertComponent(BaseComponent):\n    \"\"\"\u041a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 alert-\u043e\u043a\u043d\u0430\u043c\u0438 Playwright.\n\n    \u041f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u0442\u0438\u043f\u044b: error, success, info, warning.\n    \u041f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0442\u044c \u043d\u0430\u043b\u0438\u0447\u0438\u0435, \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u0435 \u0438 \u0442\u0435\u043a\u0441\u0442 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439.\n    \"\"\"\n\n    def __init__(self, page: Page):\n        \"\"\"\u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 alert-\u043e\u043a\u043d\u0430.\n\n        Args:\n            page: \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.\n        \"\"\"\n\n        super().__init__(page)\n\n        self.text = Text(page, \"//div[contains(@class,'v-alert')]/div\", \"Alert message\")\n\n    # \u0414\u0435\u0439\u0441\u0442\u0432\u0438\u044f:\n    def get_alert_type(self) -> str:\n        \"\"\"\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0442\u0438\u043f alert-\u043e\u043a\u043d\u0430.\n\n        Returns:\n            str: \u0422\u0438\u043f alert-\u043e\u043a\u043d\u0430.\n\n        Raises:\n            ValueError: \u0415\u0441\u043b\u0438 \u043f\u043e\u043b\u0443\u0447\u0435\u043d \u043d\u0435\u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u043c\u044b\u0439 \u0442\u0438\u043f alert-\u043e\u043a\u043d\u0430.\n        \"\"\"\n\n        class_attr = self.page.get_by_role(\"alert\").locator('>div').get_attribute('class')\n\n        alert_type = None\n        if 'v-alert' in class_attr:\n            alert_type = class_attr.replace(\"v-alert \", \"\")\n\n        alert_types = [\"error\", \"success\", \"info\", \"warning\"]\n        if alert_type not in alert_types:\n            raise ValueError(\"Unsupported type of alert window\")\n\n        return alert_type\n\n    def get_text(self) -> str:\n        \"\"\"\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0442\u0435\u043a\u0441\u0442 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0438\u0437 alert-\u043e\u043a\u043d\u0430.\n\n        Returns:\n            str: \u0422\u0435\u043a\u0441\u0442 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f.\n        \"\"\"\n\n        return self.text.get_text(0)\n\n    # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0438:\n    def check_alert_presence(self, text: str):\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 alert-\u043e\u043a\u043d\u0430 \u0441 \u0437\u0430\u0434\u0430\u043d\u043d\u044b\u043c \u0442\u0435\u043a\u0441\u0442\u043e\u043c.\n\n        Args:\n            text: \u0422\u0435\u043a\u0441\u0442 \u0434\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438. \u0415\u0441\u043b\u0438 \u043f\u0443\u0441\u0442\u0430\u044f \u0441\u0442\u0440\u043e\u043a\u0430 - \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e\n                  \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u043e\u043a\u043d\u0430.\n\n        Raises:\n            AssertionError: \u0415\u0441\u043b\u0438 alert-\u043e\u043a\u043d\u043e \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u043e.\n        \"\"\"\n\n        msg = \"Alert window is missing\"\n        if text == \"\":\n            expect(self.page.get_by_role(\"alert\")).to_be_visible(), msg\n        else:\n            expect(self.page.get_by_role(\"alert\").filter(has_text=text)).to_be_visible(), msg\n\n    def check_alert_absence(self, text: str, timeout: int = 30000):\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u0435 alert-\u043e\u043a\u043d\u0430 \u0441 \u0437\u0430\u0434\u0430\u043d\u043d\u044b\u043c \u0442\u0435\u043a\u0441\u0442\u043e\u043c.\n\n        Args:\n            text: \u0422\u0435\u043a\u0441\u0442 \u0434\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438.\n            timeout: \u0412\u0440\u0435\u043c\u044f \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u044f \u0438\u0441\u0447\u0435\u0437\u043d\u043e\u0432\u0435\u043d\u0438\u044f (\u043c\u0441).\n\n        Raises:\n            AssertionError: \u0415\u0441\u043b\u0438 \u043e\u043a\u043d\u043e \u043d\u0435 \u0438\u0441\u0447\u0435\u0437\u0430\u0435\u0442 \u0432 \u0442\u0435\u0447\u0435\u043d\u0438\u0435 \u0437\u0430\u0434\u0430\u043d\u043d\u043e\u0433\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438.\n        \"\"\"\n\n        seconds = int(timeout/1000)\n        msg = f\"Alert window should disappear after {seconds} seconds\"\n        expect(self.page.get_by_role(\"alert\").filter(has_text=text)).to_be_hidden(timeout=timeout), msg\n\n    def check_text(self, alert_text: str):\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0442\u043e\u0447\u043d\u043e\u0435 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0435 \u0442\u0435\u043a\u0441\u0442\u0430 \u0432 alert-\u043e\u043a\u043d\u0435.\n\n        Args:\n            alert_text: \u041e\u0436\u0438\u0434\u0430\u0435\u043c\u044b\u0439 \u0442\u0435\u043a\u0441\u0442 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f.\n\n        Raises:\n            AssertionError: \u0415\u0441\u043b\u0438 \u0442\u0435\u043a\u0441\u0442 \u043d\u0435 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u043e\u0436\u0438\u0434\u0430\u0435\u043c\u043e\u043c\u0443.\n        \"\"\"\n\n        self.text.check_have_text(alert_text,\n                                  \"Unexpected message in alert window\")\n
    "},{"location":"components/alert_component/#components.alert_component.AlertComponent.__init__","title":"__init__(page)","text":"

    \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 alert-\u043e\u043a\u043d\u0430.

    Parameters:

    Name Type Description Default page Page

    \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.

    required Source code in components\\alert_component.py
    def __init__(self, page: Page):\n    \"\"\"\u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 alert-\u043e\u043a\u043d\u0430.\n\n    Args:\n        page: \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.\n    \"\"\"\n\n    super().__init__(page)\n\n    self.text = Text(page, \"//div[contains(@class,'v-alert')]/div\", \"Alert message\")\n
    "},{"location":"components/alert_component/#components.alert_component.AlertComponent.check_alert_absence","title":"check_alert_absence(text, timeout=30000)","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u0435 alert-\u043e\u043a\u043d\u0430 \u0441 \u0437\u0430\u0434\u0430\u043d\u043d\u044b\u043c \u0442\u0435\u043a\u0441\u0442\u043e\u043c.

    Parameters:

    Name Type Description Default text str

    \u0422\u0435\u043a\u0441\u0442 \u0434\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438.

    required timeout int

    \u0412\u0440\u0435\u043c\u044f \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u044f \u0438\u0441\u0447\u0435\u0437\u043d\u043e\u0432\u0435\u043d\u0438\u044f (\u043c\u0441).

    30000

    Raises:

    Type Description AssertionError

    \u0415\u0441\u043b\u0438 \u043e\u043a\u043d\u043e \u043d\u0435 \u0438\u0441\u0447\u0435\u0437\u0430\u0435\u0442 \u0432 \u0442\u0435\u0447\u0435\u043d\u0438\u0435 \u0437\u0430\u0434\u0430\u043d\u043d\u043e\u0433\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438.

    Source code in components\\alert_component.py
    def check_alert_absence(self, text: str, timeout: int = 30000):\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u0435 alert-\u043e\u043a\u043d\u0430 \u0441 \u0437\u0430\u0434\u0430\u043d\u043d\u044b\u043c \u0442\u0435\u043a\u0441\u0442\u043e\u043c.\n\n    Args:\n        text: \u0422\u0435\u043a\u0441\u0442 \u0434\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438.\n        timeout: \u0412\u0440\u0435\u043c\u044f \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u044f \u0438\u0441\u0447\u0435\u0437\u043d\u043e\u0432\u0435\u043d\u0438\u044f (\u043c\u0441).\n\n    Raises:\n        AssertionError: \u0415\u0441\u043b\u0438 \u043e\u043a\u043d\u043e \u043d\u0435 \u0438\u0441\u0447\u0435\u0437\u0430\u0435\u0442 \u0432 \u0442\u0435\u0447\u0435\u043d\u0438\u0435 \u0437\u0430\u0434\u0430\u043d\u043d\u043e\u0433\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438.\n    \"\"\"\n\n    seconds = int(timeout/1000)\n    msg = f\"Alert window should disappear after {seconds} seconds\"\n    expect(self.page.get_by_role(\"alert\").filter(has_text=text)).to_be_hidden(timeout=timeout), msg\n
    "},{"location":"components/alert_component/#components.alert_component.AlertComponent.check_alert_presence","title":"check_alert_presence(text)","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 alert-\u043e\u043a\u043d\u0430 \u0441 \u0437\u0430\u0434\u0430\u043d\u043d\u044b\u043c \u0442\u0435\u043a\u0441\u0442\u043e\u043c.

    Parameters:

    Name Type Description Default text str

    \u0422\u0435\u043a\u0441\u0442 \u0434\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438. \u0415\u0441\u043b\u0438 \u043f\u0443\u0441\u0442\u0430\u044f \u0441\u0442\u0440\u043e\u043a\u0430 - \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u043e\u043a\u043d\u0430.

    required

    Raises:

    Type Description AssertionError

    \u0415\u0441\u043b\u0438 alert-\u043e\u043a\u043d\u043e \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u043e.

    Source code in components\\alert_component.py
    def check_alert_presence(self, text: str):\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 alert-\u043e\u043a\u043d\u0430 \u0441 \u0437\u0430\u0434\u0430\u043d\u043d\u044b\u043c \u0442\u0435\u043a\u0441\u0442\u043e\u043c.\n\n    Args:\n        text: \u0422\u0435\u043a\u0441\u0442 \u0434\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438. \u0415\u0441\u043b\u0438 \u043f\u0443\u0441\u0442\u0430\u044f \u0441\u0442\u0440\u043e\u043a\u0430 - \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e\n              \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u043e\u043a\u043d\u0430.\n\n    Raises:\n        AssertionError: \u0415\u0441\u043b\u0438 alert-\u043e\u043a\u043d\u043e \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u043e.\n    \"\"\"\n\n    msg = \"Alert window is missing\"\n    if text == \"\":\n        expect(self.page.get_by_role(\"alert\")).to_be_visible(), msg\n    else:\n        expect(self.page.get_by_role(\"alert\").filter(has_text=text)).to_be_visible(), msg\n
    "},{"location":"components/alert_component/#components.alert_component.AlertComponent.check_text","title":"check_text(alert_text)","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0442\u043e\u0447\u043d\u043e\u0435 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0435 \u0442\u0435\u043a\u0441\u0442\u0430 \u0432 alert-\u043e\u043a\u043d\u0435.

    Parameters:

    Name Type Description Default alert_text str

    \u041e\u0436\u0438\u0434\u0430\u0435\u043c\u044b\u0439 \u0442\u0435\u043a\u0441\u0442 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f.

    required

    Raises:

    Type Description AssertionError

    \u0415\u0441\u043b\u0438 \u0442\u0435\u043a\u0441\u0442 \u043d\u0435 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u043e\u0436\u0438\u0434\u0430\u0435\u043c\u043e\u043c\u0443.

    Source code in components\\alert_component.py
    def check_text(self, alert_text: str):\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0442\u043e\u0447\u043d\u043e\u0435 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0435 \u0442\u0435\u043a\u0441\u0442\u0430 \u0432 alert-\u043e\u043a\u043d\u0435.\n\n    Args:\n        alert_text: \u041e\u0436\u0438\u0434\u0430\u0435\u043c\u044b\u0439 \u0442\u0435\u043a\u0441\u0442 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f.\n\n    Raises:\n        AssertionError: \u0415\u0441\u043b\u0438 \u0442\u0435\u043a\u0441\u0442 \u043d\u0435 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u043e\u0436\u0438\u0434\u0430\u0435\u043c\u043e\u043c\u0443.\n    \"\"\"\n\n    self.text.check_have_text(alert_text,\n                              \"Unexpected message in alert window\")\n
    "},{"location":"components/alert_component/#components.alert_component.AlertComponent.get_alert_type","title":"get_alert_type()","text":"

    \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0442\u0438\u043f alert-\u043e\u043a\u043d\u0430.

    Returns:

    Name Type Description str str

    \u0422\u0438\u043f alert-\u043e\u043a\u043d\u0430.

    Raises:

    Type Description ValueError

    \u0415\u0441\u043b\u0438 \u043f\u043e\u043b\u0443\u0447\u0435\u043d \u043d\u0435\u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u043c\u044b\u0439 \u0442\u0438\u043f alert-\u043e\u043a\u043d\u0430.

    Source code in components\\alert_component.py
    def get_alert_type(self) -> str:\n    \"\"\"\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0442\u0438\u043f alert-\u043e\u043a\u043d\u0430.\n\n    Returns:\n        str: \u0422\u0438\u043f alert-\u043e\u043a\u043d\u0430.\n\n    Raises:\n        ValueError: \u0415\u0441\u043b\u0438 \u043f\u043e\u043b\u0443\u0447\u0435\u043d \u043d\u0435\u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u043c\u044b\u0439 \u0442\u0438\u043f alert-\u043e\u043a\u043d\u0430.\n    \"\"\"\n\n    class_attr = self.page.get_by_role(\"alert\").locator('>div').get_attribute('class')\n\n    alert_type = None\n    if 'v-alert' in class_attr:\n        alert_type = class_attr.replace(\"v-alert \", \"\")\n\n    alert_types = [\"error\", \"success\", \"info\", \"warning\"]\n    if alert_type not in alert_types:\n        raise ValueError(\"Unsupported type of alert window\")\n\n    return alert_type\n
    "},{"location":"components/alert_component/#components.alert_component.AlertComponent.get_text","title":"get_text()","text":"

    \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0442\u0435\u043a\u0441\u0442 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0438\u0437 alert-\u043e\u043a\u043d\u0430.

    Returns:

    Name Type Description str str

    \u0422\u0435\u043a\u0441\u0442 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f.

    Source code in components\\alert_component.py
    def get_text(self) -> str:\n    \"\"\"\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0442\u0435\u043a\u0441\u0442 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0438\u0437 alert-\u043e\u043a\u043d\u0430.\n\n    Returns:\n        str: \u0422\u0435\u043a\u0441\u0442 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f.\n    \"\"\"\n\n    return self.text.get_text(0)\n
    "},{"location":"components/base_component/","title":"BaseComponent","text":"

    \u0411\u0430\u0437\u043e\u0432\u044b\u0439 \u043c\u043e\u0434\u0443\u043b\u044c \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430\u043c\u0438 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b.

    \u0421\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0431\u0430\u0437\u043e\u0432\u044b\u0439 \u043a\u043b\u0430\u0441\u0441 \u0434\u043b\u044f \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0441 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u043c\u0438 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u0447\u0435\u0440\u0435\u0437 Playwright.

    "},{"location":"components/base_component/#components.base_component.BaseComponent","title":"BaseComponent","text":"

    \u0411\u0430\u0437\u043e\u0432\u044b\u0439 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u043c\u0438 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b.

    \u041f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u043e\u0431\u0449\u0438\u0435 \u043c\u0435\u0442\u043e\u0434\u044b \u0434\u043b\u044f \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0441 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u043c\u0438: - \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u043b\u043e\u043a\u0430\u0442\u043e\u0440\u043e\u0432 - \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 - \u0440\u0430\u0431\u043e\u0442\u0430 \u0441 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u043e\u0439

    Source code in components\\base_component.py
    class BaseComponent:\n    \"\"\"\u0411\u0430\u0437\u043e\u0432\u044b\u0439 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u043c\u0438 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b.\n\n    \u041f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u043e\u0431\u0449\u0438\u0435 \u043c\u0435\u0442\u043e\u0434\u044b \u0434\u043b\u044f \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0441 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u043c\u0438:\n    - \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u043b\u043e\u043a\u0430\u0442\u043e\u0440\u043e\u0432\n    - \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432\n    - \u0440\u0430\u0431\u043e\u0442\u0430 \u0441 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u043e\u0439\n    \"\"\"\n\n    def __init__(self, page: Page):\n        \"\"\"\u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0431\u0430\u0437\u043e\u0432\u043e\u0433\u043e \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430.\n\n        Args:\n            page: \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.\n        \"\"\"\n\n        self.page = page\n\n    # \u0414\u0435\u0439\u0441\u0442\u0432\u0438\u044f:\n    def get_locator(self, locator: str | Locator) -> Locator:\n        \"\"\"\u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u0430 Locator \u0438\u0437 \u0441\u0442\u0440\u043e\u043a\u0438 \u0438\u043b\u0438 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0433\u043e Locator.\n\n        Args:\n            locator: \u0441\u0442\u0440\u043e\u043a\u0430 \u0441 CSS/XPath \u0441\u0435\u043b\u0435\u043a\u0442\u043e\u0440\u043e\u043c \u0438\u043b\u0438 \u043e\u0431\u044a\u0435\u043a\u0442 Locator.\n\n        Returns:\n            Locator: \u043e\u0431\u044a\u0435\u043a\u0442 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u043c.\n\n        Raises:\n            TypeError: \u0435\u0441\u043b\u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u043d \u043d\u0435\u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u044b\u0439 \u0442\u0438\u043f \u043b\u043e\u043a\u0430\u0442\u043e\u0440\u0430.\n        \"\"\"\n\n        if isinstance(locator, Locator):\n            return locator\n        elif isinstance(locator, str):\n            return self.page.locator(locator)\n        else:\n            raise TypeError(\"locator value should be string type or Locator type\")\n\n    # \u0417\u0430\u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u043a\u043e\u0434 \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d \u0431\u0435\u0437 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439\n    # def wait_for_all_elements(self, locator: Locator, timeout=5000):\n    #     loc = self.get_locator(locator)\n    #     elements = self.page.locator(loc).all()\n    #\n    #     for element in elements:\n    #         self.page.locator(loc).wait_for(timeout=timeout)\n    #\n    #     return elements\n\n    # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0438:\n    def check_absence(self, locator: str | Locator, msg: str) -> None:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u044f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u043d\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435.\n\n        Args:\n            locator: \u043b\u043e\u043a\u0430\u0442\u043e\u0440 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 (\u0441\u0442\u0440\u043e\u043a\u0430 \u0438\u043b\u0438 \u043e\u0431\u044a\u0435\u043a\u0442 Locator).\n            msg: \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u043e\u0431 \u043e\u0448\u0438\u0431\u043a\u0435 \u043f\u0440\u0438 \u043d\u0435\u0443\u0434\u0430\u0447\u043d\u043e\u0439 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0435.\n\n        Raises:\n            AssertionError: \u0435\u0441\u043b\u0438 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0432\u0438\u0434\u0435\u043d \u043d\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435.\n        \"\"\"\n\n        loc = self.get_locator(locator)\n        expect(loc).to_be_hidden(timeout=12000), msg\n\n    def check_visibility(self, locator: str | Locator, msg: str) -> None:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u043d\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435.\n\n        Args:\n            locator: \u043b\u043e\u043a\u0430\u0442\u043e\u0440 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 (\u0441\u0442\u0440\u043e\u043a\u0430 \u0438\u043b\u0438 \u043e\u0431\u044a\u0435\u043a\u0442 Locator).\n            msg: \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u043e\u0431 \u043e\u0448\u0438\u0431\u043a\u0435 \u043f\u0440\u0438 \u043d\u0435\u0443\u0434\u0430\u0447\u043d\u043e\u0439 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0435.\n\n        Raises:\n            AssertionError: \u0435\u0441\u043b\u0438 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043d\u0435 \u0432\u0438\u0434\u0435\u043d \u043d\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435.\n        \"\"\"\n\n        loc = self.get_locator(locator)\n        expect(loc).to_be_visible(visible=True, timeout=12000), msg\n\n    def is_scrollable_vertically(self, locator: str | Locator) -> bool:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u0439 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0438 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430.\n\n        Args:\n            locator: \u043b\u043e\u043a\u0430\u0442\u043e\u0440 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430.\n\n        Returns:\n            bool: True \u0435\u0441\u043b\u0438 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u0438\u0442\u044c \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u043e.\n        \"\"\"\n\n        loc = self.get_locator(locator)\n        return loc.evaluate(\"el => el.scrollHeight > el.clientHeight\")\n\n    def is_scrollable_horizontally(self, locator: str | Locator) -> bool:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0433\u043e\u0440\u0438\u0437\u043e\u043d\u0442\u0430\u043b\u044c\u043d\u043e\u0439 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0438 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430.\n\n        Args:\n            locator: \u043b\u043e\u043a\u0430\u0442\u043e\u0440 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430.\n\n        Returns:\n            bool: True \u0435\u0441\u043b\u0438 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u0438\u0442\u044c \u0433\u043e\u0440\u0438\u0437\u043e\u043d\u0442\u0430\u043b\u044c\u043d\u043e.\n        \"\"\"\n\n        loc = self.get_locator(locator)\n        return loc.evaluate(\"el => el.scrollWidth > el.clientWidth\")\n\n    # \u041c\u0435\u0442\u043e\u0434\u044b \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0438:\n    def scroll_up(self, locator: str | Locator) -> None:\n        \"\"\"\u041f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0430 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0432\u0432\u0435\u0440\u0445.\n\n        Args:\n            locator: \u043b\u043e\u043a\u0430\u0442\u043e\u0440 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430.\n\n        Raises:\n            AssertionError: \u0435\u0441\u043b\u0438 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0430 \u043d\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0430 \u0434\u043e \u043a\u043e\u043d\u0446\u0430.\n        \"\"\"\n\n        loc = self.get_locator(locator)\n        loc.evaluate(\"el => el.scrollTo(0, 0)\")\n        loc.wait_for(timeout=2000)\n\n        # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043f\u043e\u0437\u0438\u0446\u0438\u0438 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0438\n        scroll_position = loc.evaluate(\"el => el.scrollTop\")\n        assert scroll_position == 0, \"Invalid postion after scroll up\"\n\n    def scroll_down(self, locator: str | Locator) -> None:\n        \"\"\"\u041f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0430 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0432\u043d\u0438\u0437.\n\n        Args:\n            locator: \u043b\u043e\u043a\u0430\u0442\u043e\u0440 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430.\n\n        Raises:\n            AssertionError: \u0435\u0441\u043b\u0438 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0430 \u043d\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0430 \u0434\u043e \u043a\u043e\u043d\u0446\u0430.\n        \"\"\"\n\n        loc = self.get_locator(locator)\n        loc.evaluate(\"el => el.scrollTo(0, el.scrollHeight)\")\n        loc.wait_for(timeout=2000)\n\n        # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043f\u043e\u0437\u0438\u0446\u0438\u0438 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0438\n        scroll_position = loc.evaluate(\"el => el.scrollTop\")\n        assert scroll_position > 0, \"Invalid postion after scroll down\"\n\n    def scroll_left(self, locator: str | Locator) -> None:\n        \"\"\"\u041f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0430 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0432\u043b\u0435\u0432\u043e.\n\n        Args:\n            locator: \u043b\u043e\u043a\u0430\u0442\u043e\u0440 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430.\n\n        Raises:\n            AssertionError: \u0435\u0441\u043b\u0438 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0430 \u043d\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0430 \u0434\u043e \u043a\u043e\u043d\u0446\u0430.\n        \"\"\"\n\n        loc = self.get_locator(locator)\n\n        loc.evaluate(\"el => el.scrollBy(-el.scrollWidth, 0)\")\n\n        loc.wait_for(timeout=2000)\n\n        # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043f\u043e\u0437\u0438\u0446\u0438\u0438 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0438\n        scroll_position = loc.evaluate(\"el => el.scrollLeft\")\n        assert scroll_position == 0, \"Invalid postion after scroll left\"\n\n    def scroll_right(self, locator: str | Locator) -> None:\n        \"\"\"\u041f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0430 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0432\u043f\u0440\u0430\u0432\u043e.\n\n        Args:\n            locator: \u043b\u043e\u043a\u0430\u0442\u043e\u0440 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430.\n\n        Raises:\n            AssertionError: \u0435\u0441\u043b\u0438 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0430 \u043d\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0430 \u0434\u043e \u043a\u043e\u043d\u0446\u0430.\n        \"\"\"\n\n        loc = self.get_locator(locator)\n\n        loc.evaluate(\"el => el.scrollBy(el.scrollWidth, 0)\")\n\n        loc.wait_for(timeout=2000)\n\n        # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043f\u043e\u0437\u0438\u0446\u0438\u0438 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0438\n        scroll_position = loc.evaluate(\"el => el.scrollLeft\")\n        max_scroll_x = loc.evaluate(\"el => el.scrollWidth - el.clientWidth\")\n        assert scroll_position >= max_scroll_x, \"Invalid postion after scroll right\"\n
    "},{"location":"components/base_component/#components.base_component.BaseComponent.__init__","title":"__init__(page)","text":"

    \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0431\u0430\u0437\u043e\u0432\u043e\u0433\u043e \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430.

    Parameters:

    Name Type Description Default page Page

    \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.

    required Source code in components\\base_component.py
    def __init__(self, page: Page):\n    \"\"\"\u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0431\u0430\u0437\u043e\u0432\u043e\u0433\u043e \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430.\n\n    Args:\n        page: \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.\n    \"\"\"\n\n    self.page = page\n
    "},{"location":"components/base_component/#components.base_component.BaseComponent.check_absence","title":"check_absence(locator, msg)","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u044f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u043d\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435.

    Parameters:

    Name Type Description Default locator str | Locator

    \u043b\u043e\u043a\u0430\u0442\u043e\u0440 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 (\u0441\u0442\u0440\u043e\u043a\u0430 \u0438\u043b\u0438 \u043e\u0431\u044a\u0435\u043a\u0442 Locator).

    required msg str

    \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u043e\u0431 \u043e\u0448\u0438\u0431\u043a\u0435 \u043f\u0440\u0438 \u043d\u0435\u0443\u0434\u0430\u0447\u043d\u043e\u0439 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0435.

    required

    Raises:

    Type Description AssertionError

    \u0435\u0441\u043b\u0438 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0432\u0438\u0434\u0435\u043d \u043d\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435.

    Source code in components\\base_component.py
    def check_absence(self, locator: str | Locator, msg: str) -> None:\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u044f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u043d\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435.\n\n    Args:\n        locator: \u043b\u043e\u043a\u0430\u0442\u043e\u0440 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 (\u0441\u0442\u0440\u043e\u043a\u0430 \u0438\u043b\u0438 \u043e\u0431\u044a\u0435\u043a\u0442 Locator).\n        msg: \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u043e\u0431 \u043e\u0448\u0438\u0431\u043a\u0435 \u043f\u0440\u0438 \u043d\u0435\u0443\u0434\u0430\u0447\u043d\u043e\u0439 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0435.\n\n    Raises:\n        AssertionError: \u0435\u0441\u043b\u0438 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0432\u0438\u0434\u0435\u043d \u043d\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435.\n    \"\"\"\n\n    loc = self.get_locator(locator)\n    expect(loc).to_be_hidden(timeout=12000), msg\n
    "},{"location":"components/base_component/#components.base_component.BaseComponent.check_visibility","title":"check_visibility(locator, msg)","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u043d\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435.

    Parameters:

    Name Type Description Default locator str | Locator

    \u043b\u043e\u043a\u0430\u0442\u043e\u0440 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 (\u0441\u0442\u0440\u043e\u043a\u0430 \u0438\u043b\u0438 \u043e\u0431\u044a\u0435\u043a\u0442 Locator).

    required msg str

    \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u043e\u0431 \u043e\u0448\u0438\u0431\u043a\u0435 \u043f\u0440\u0438 \u043d\u0435\u0443\u0434\u0430\u0447\u043d\u043e\u0439 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0435.

    required

    Raises:

    Type Description AssertionError

    \u0435\u0441\u043b\u0438 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043d\u0435 \u0432\u0438\u0434\u0435\u043d \u043d\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435.

    Source code in components\\base_component.py
    def check_visibility(self, locator: str | Locator, msg: str) -> None:\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u043d\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435.\n\n    Args:\n        locator: \u043b\u043e\u043a\u0430\u0442\u043e\u0440 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 (\u0441\u0442\u0440\u043e\u043a\u0430 \u0438\u043b\u0438 \u043e\u0431\u044a\u0435\u043a\u0442 Locator).\n        msg: \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u043e\u0431 \u043e\u0448\u0438\u0431\u043a\u0435 \u043f\u0440\u0438 \u043d\u0435\u0443\u0434\u0430\u0447\u043d\u043e\u0439 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0435.\n\n    Raises:\n        AssertionError: \u0435\u0441\u043b\u0438 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043d\u0435 \u0432\u0438\u0434\u0435\u043d \u043d\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435.\n    \"\"\"\n\n    loc = self.get_locator(locator)\n    expect(loc).to_be_visible(visible=True, timeout=12000), msg\n
    "},{"location":"components/base_component/#components.base_component.BaseComponent.get_locator","title":"get_locator(locator)","text":"

    \u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u0430 Locator \u0438\u0437 \u0441\u0442\u0440\u043e\u043a\u0438 \u0438\u043b\u0438 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0433\u043e Locator.

    Parameters:

    Name Type Description Default locator str | Locator

    \u0441\u0442\u0440\u043e\u043a\u0430 \u0441 CSS/XPath \u0441\u0435\u043b\u0435\u043a\u0442\u043e\u0440\u043e\u043c \u0438\u043b\u0438 \u043e\u0431\u044a\u0435\u043a\u0442 Locator.

    required

    Returns:

    Name Type Description Locator Locator

    \u043e\u0431\u044a\u0435\u043a\u0442 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u043c.

    Raises:

    Type Description TypeError

    \u0435\u0441\u043b\u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u043d \u043d\u0435\u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u044b\u0439 \u0442\u0438\u043f \u043b\u043e\u043a\u0430\u0442\u043e\u0440\u0430.

    Source code in components\\base_component.py
    def get_locator(self, locator: str | Locator) -> Locator:\n    \"\"\"\u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u0430 Locator \u0438\u0437 \u0441\u0442\u0440\u043e\u043a\u0438 \u0438\u043b\u0438 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0433\u043e Locator.\n\n    Args:\n        locator: \u0441\u0442\u0440\u043e\u043a\u0430 \u0441 CSS/XPath \u0441\u0435\u043b\u0435\u043a\u0442\u043e\u0440\u043e\u043c \u0438\u043b\u0438 \u043e\u0431\u044a\u0435\u043a\u0442 Locator.\n\n    Returns:\n        Locator: \u043e\u0431\u044a\u0435\u043a\u0442 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u043c.\n\n    Raises:\n        TypeError: \u0435\u0441\u043b\u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u043d \u043d\u0435\u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u044b\u0439 \u0442\u0438\u043f \u043b\u043e\u043a\u0430\u0442\u043e\u0440\u0430.\n    \"\"\"\n\n    if isinstance(locator, Locator):\n        return locator\n    elif isinstance(locator, str):\n        return self.page.locator(locator)\n    else:\n        raise TypeError(\"locator value should be string type or Locator type\")\n
    "},{"location":"components/base_component/#components.base_component.BaseComponent.is_scrollable_horizontally","title":"is_scrollable_horizontally(locator)","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0433\u043e\u0440\u0438\u0437\u043e\u043d\u0442\u0430\u043b\u044c\u043d\u043e\u0439 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0438 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430.

    Parameters:

    Name Type Description Default locator str | Locator

    \u043b\u043e\u043a\u0430\u0442\u043e\u0440 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430.

    required

    Returns:

    Name Type Description bool bool

    True \u0435\u0441\u043b\u0438 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u0438\u0442\u044c \u0433\u043e\u0440\u0438\u0437\u043e\u043d\u0442\u0430\u043b\u044c\u043d\u043e.

    Source code in components\\base_component.py
    def is_scrollable_horizontally(self, locator: str | Locator) -> bool:\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0433\u043e\u0440\u0438\u0437\u043e\u043d\u0442\u0430\u043b\u044c\u043d\u043e\u0439 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0438 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430.\n\n    Args:\n        locator: \u043b\u043e\u043a\u0430\u0442\u043e\u0440 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430.\n\n    Returns:\n        bool: True \u0435\u0441\u043b\u0438 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u0438\u0442\u044c \u0433\u043e\u0440\u0438\u0437\u043e\u043d\u0442\u0430\u043b\u044c\u043d\u043e.\n    \"\"\"\n\n    loc = self.get_locator(locator)\n    return loc.evaluate(\"el => el.scrollWidth > el.clientWidth\")\n
    "},{"location":"components/base_component/#components.base_component.BaseComponent.is_scrollable_vertically","title":"is_scrollable_vertically(locator)","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u0439 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0438 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430.

    Parameters:

    Name Type Description Default locator str | Locator

    \u043b\u043e\u043a\u0430\u0442\u043e\u0440 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430.

    required

    Returns:

    Name Type Description bool bool

    True \u0435\u0441\u043b\u0438 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u0438\u0442\u044c \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u043e.

    Source code in components\\base_component.py
    def is_scrollable_vertically(self, locator: str | Locator) -> bool:\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u0439 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0438 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430.\n\n    Args:\n        locator: \u043b\u043e\u043a\u0430\u0442\u043e\u0440 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430.\n\n    Returns:\n        bool: True \u0435\u0441\u043b\u0438 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u0438\u0442\u044c \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u043e.\n    \"\"\"\n\n    loc = self.get_locator(locator)\n    return loc.evaluate(\"el => el.scrollHeight > el.clientHeight\")\n
    "},{"location":"components/base_component/#components.base_component.BaseComponent.scroll_down","title":"scroll_down(locator)","text":"

    \u041f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0430 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0432\u043d\u0438\u0437.

    Parameters:

    Name Type Description Default locator str | Locator

    \u043b\u043e\u043a\u0430\u0442\u043e\u0440 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430.

    required

    Raises:

    Type Description AssertionError

    \u0435\u0441\u043b\u0438 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0430 \u043d\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0430 \u0434\u043e \u043a\u043e\u043d\u0446\u0430.

    Source code in components\\base_component.py
    def scroll_down(self, locator: str | Locator) -> None:\n    \"\"\"\u041f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0430 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0432\u043d\u0438\u0437.\n\n    Args:\n        locator: \u043b\u043e\u043a\u0430\u0442\u043e\u0440 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430.\n\n    Raises:\n        AssertionError: \u0435\u0441\u043b\u0438 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0430 \u043d\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0430 \u0434\u043e \u043a\u043e\u043d\u0446\u0430.\n    \"\"\"\n\n    loc = self.get_locator(locator)\n    loc.evaluate(\"el => el.scrollTo(0, el.scrollHeight)\")\n    loc.wait_for(timeout=2000)\n\n    # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043f\u043e\u0437\u0438\u0446\u0438\u0438 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0438\n    scroll_position = loc.evaluate(\"el => el.scrollTop\")\n    assert scroll_position > 0, \"Invalid postion after scroll down\"\n
    "},{"location":"components/base_component/#components.base_component.BaseComponent.scroll_left","title":"scroll_left(locator)","text":"

    \u041f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0430 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0432\u043b\u0435\u0432\u043e.

    Parameters:

    Name Type Description Default locator str | Locator

    \u043b\u043e\u043a\u0430\u0442\u043e\u0440 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430.

    required

    Raises:

    Type Description AssertionError

    \u0435\u0441\u043b\u0438 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0430 \u043d\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0430 \u0434\u043e \u043a\u043e\u043d\u0446\u0430.

    Source code in components\\base_component.py
    def scroll_left(self, locator: str | Locator) -> None:\n    \"\"\"\u041f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0430 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0432\u043b\u0435\u0432\u043e.\n\n    Args:\n        locator: \u043b\u043e\u043a\u0430\u0442\u043e\u0440 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430.\n\n    Raises:\n        AssertionError: \u0435\u0441\u043b\u0438 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0430 \u043d\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0430 \u0434\u043e \u043a\u043e\u043d\u0446\u0430.\n    \"\"\"\n\n    loc = self.get_locator(locator)\n\n    loc.evaluate(\"el => el.scrollBy(-el.scrollWidth, 0)\")\n\n    loc.wait_for(timeout=2000)\n\n    # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043f\u043e\u0437\u0438\u0446\u0438\u0438 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0438\n    scroll_position = loc.evaluate(\"el => el.scrollLeft\")\n    assert scroll_position == 0, \"Invalid postion after scroll left\"\n
    "},{"location":"components/base_component/#components.base_component.BaseComponent.scroll_right","title":"scroll_right(locator)","text":"

    \u041f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0430 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0432\u043f\u0440\u0430\u0432\u043e.

    Parameters:

    Name Type Description Default locator str | Locator

    \u043b\u043e\u043a\u0430\u0442\u043e\u0440 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430.

    required

    Raises:

    Type Description AssertionError

    \u0435\u0441\u043b\u0438 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0430 \u043d\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0430 \u0434\u043e \u043a\u043e\u043d\u0446\u0430.

    Source code in components\\base_component.py
    def scroll_right(self, locator: str | Locator) -> None:\n    \"\"\"\u041f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0430 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0432\u043f\u0440\u0430\u0432\u043e.\n\n    Args:\n        locator: \u043b\u043e\u043a\u0430\u0442\u043e\u0440 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430.\n\n    Raises:\n        AssertionError: \u0435\u0441\u043b\u0438 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0430 \u043d\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0430 \u0434\u043e \u043a\u043e\u043d\u0446\u0430.\n    \"\"\"\n\n    loc = self.get_locator(locator)\n\n    loc.evaluate(\"el => el.scrollBy(el.scrollWidth, 0)\")\n\n    loc.wait_for(timeout=2000)\n\n    # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043f\u043e\u0437\u0438\u0446\u0438\u0438 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0438\n    scroll_position = loc.evaluate(\"el => el.scrollLeft\")\n    max_scroll_x = loc.evaluate(\"el => el.scrollWidth - el.clientWidth\")\n    assert scroll_position >= max_scroll_x, \"Invalid postion after scroll right\"\n
    "},{"location":"components/base_component/#components.base_component.BaseComponent.scroll_up","title":"scroll_up(locator)","text":"

    \u041f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0430 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0432\u0432\u0435\u0440\u0445.

    Parameters:

    Name Type Description Default locator str | Locator

    \u043b\u043e\u043a\u0430\u0442\u043e\u0440 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430.

    required

    Raises:

    Type Description AssertionError

    \u0435\u0441\u043b\u0438 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0430 \u043d\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0430 \u0434\u043e \u043a\u043e\u043d\u0446\u0430.

    Source code in components\\base_component.py
    def scroll_up(self, locator: str | Locator) -> None:\n    \"\"\"\u041f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0430 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0432\u0432\u0435\u0440\u0445.\n\n    Args:\n        locator: \u043b\u043e\u043a\u0430\u0442\u043e\u0440 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430.\n\n    Raises:\n        AssertionError: \u0435\u0441\u043b\u0438 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0430 \u043d\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0430 \u0434\u043e \u043a\u043e\u043d\u0446\u0430.\n    \"\"\"\n\n    loc = self.get_locator(locator)\n    loc.evaluate(\"el => el.scrollTo(0, 0)\")\n    loc.wait_for(timeout=2000)\n\n    # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043f\u043e\u0437\u0438\u0446\u0438\u0438 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0438\n    scroll_position = loc.evaluate(\"el => el.scrollTop\")\n    assert scroll_position == 0, \"Invalid postion after scroll up\"\n
    "},{"location":"components/card_component/","title":"CardComponent","text":"

    \u041c\u043e\u0434\u0443\u043b\u044c \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430 \u043a\u0430\u0440\u0442\u043e\u0447\u043a\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.

    \u0421\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043a\u043b\u0430\u0441\u0441 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u043a\u0430\u0440\u0442\u043e\u0447\u043a\u043e\u0439 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0447\u0435\u0440\u0435\u0437 Playwright.

    "},{"location":"components/card_component/#components.card_component.CardComponent","title":"CardComponent","text":"

    Bases: BaseComponent

    \u041a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 \u043a\u0430\u0440\u0442\u043e\u0447\u043a\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.

    \u041f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u043c\u0435\u0442\u043e\u0434\u044b \u0434\u043b\u044f \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0441 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u043c\u0438 \u043a\u0430\u0440\u0442\u043e\u0447\u043a\u0438.

    Source code in components\\card_component.py
    class CardComponent(BaseComponent):\n    \"\"\"\u041a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 \u043a\u0430\u0440\u0442\u043e\u0447\u043a\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\n\n    \u041f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u043c\u0435\u0442\u043e\u0434\u044b \u0434\u043b\u044f \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0441 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u043c\u0438 \u043a\u0430\u0440\u0442\u043e\u0447\u043a\u0438.\n    \"\"\"\n\n    def __init__(self, page: Page):\n        \"\"\"\u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 \u043a\u0430\u0440\u0442\u043e\u0447\u043a\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\n\n        Args:\n            page: \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.\n        \"\"\"\n\n        super().__init__(page)\n\n        self.logout_button = Button(\n            page,\n            page.get_by_role(\"button\", name=\"\u0412\u044b\u0439\u0442\u0438\"),\n            \"logout button\"\n        )\n\n    # \u0414\u0435\u0439\u0441\u0442\u0432\u0438\u044f:\n    def click_logout_button(self):\n        \"\"\"\u041d\u0430\u0436\u0438\u043c\u0430\u0435\u0442 \u043a\u043d\u043e\u043f\u043a\u0443 \u0432\u044b\u0445\u043e\u0434\u0430 \u0438\u0437 \u0441\u0438\u0441\u0442\u0435\u043c\u044b.\n\n        \u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u043a\u043b\u0438\u043a \u043f\u043e \u043a\u043d\u043e\u043f\u043a\u0435 '\u0412\u044b\u0439\u0442\u0438' \u0432 \u043a\u0430\u0440\u0442\u043e\u0447\u043a\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\n        \"\"\"\n\n        self.logout_button.click()\n
    "},{"location":"components/card_component/#components.card_component.CardComponent.__init__","title":"__init__(page)","text":"

    \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 \u043a\u0430\u0440\u0442\u043e\u0447\u043a\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.

    Parameters:

    Name Type Description Default page Page

    \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.

    required Source code in components\\card_component.py
    def __init__(self, page: Page):\n    \"\"\"\u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 \u043a\u0430\u0440\u0442\u043e\u0447\u043a\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\n\n    Args:\n        page: \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.\n    \"\"\"\n\n    super().__init__(page)\n\n    self.logout_button = Button(\n        page,\n        page.get_by_role(\"button\", name=\"\u0412\u044b\u0439\u0442\u0438\"),\n        \"logout button\"\n    )\n
    "},{"location":"components/card_component/#components.card_component.CardComponent.click_logout_button","title":"click_logout_button()","text":"

    \u041d\u0430\u0436\u0438\u043c\u0430\u0435\u0442 \u043a\u043d\u043e\u043f\u043a\u0443 \u0432\u044b\u0445\u043e\u0434\u0430 \u0438\u0437 \u0441\u0438\u0441\u0442\u0435\u043c\u044b.

    \u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u043a\u043b\u0438\u043a \u043f\u043e \u043a\u043d\u043e\u043f\u043a\u0435 '\u0412\u044b\u0439\u0442\u0438' \u0432 \u043a\u0430\u0440\u0442\u043e\u0447\u043a\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.

    Source code in components\\card_component.py
    def click_logout_button(self):\n    \"\"\"\u041d\u0430\u0436\u0438\u043c\u0430\u0435\u0442 \u043a\u043d\u043e\u043f\u043a\u0443 \u0432\u044b\u0445\u043e\u0434\u0430 \u0438\u0437 \u0441\u0438\u0441\u0442\u0435\u043c\u044b.\n\n    \u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u043a\u043b\u0438\u043a \u043f\u043e \u043a\u043d\u043e\u043f\u043a\u0435 '\u0412\u044b\u0439\u0442\u0438' \u0432 \u043a\u0430\u0440\u0442\u043e\u0447\u043a\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\n    \"\"\"\n\n    self.logout_button.click()\n
    "},{"location":"components/confirm_component/","title":"ConfirmComponent","text":"

    \u041c\u043e\u0434\u0443\u043b\u044c \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430 \u043e\u043a\u043d\u0430 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u044f \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439.

    \u0421\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043a\u043b\u0430\u0441\u0441 ConfirmComponent \u0434\u043b\u044f \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0441 \u043e\u043a\u043d\u043e\u043c \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u044f, \u0432\u043a\u043b\u044e\u0447\u0430\u044f \u043a\u043d\u043e\u043f\u043a\u0438 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u044f, \u043e\u0442\u043c\u0435\u043d\u044b \u0438 \u0437\u0430\u043a\u0440\u044b\u0442\u0438\u044f, \u0430 \u0442\u0430\u043a\u0436\u0435 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0442\u0435\u043a\u0441\u0442\u0430.

    "},{"location":"components/confirm_component/#components.confirm_component.ConfirmComponent","title":"ConfirmComponent","text":"

    Bases: BaseComponent

    \u041a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 \u043e\u043a\u043d\u0430 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u044f \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439.

    Source code in components\\confirm_component.py
    class ConfirmComponent(BaseComponent):\n    \"\"\"\u041a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 \u043e\u043a\u043d\u0430 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u044f \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439.\"\"\"\n\n    def __init__(self, page: Page, cancel_button_text: str, allow_button_text: str):\n        \"\"\"\u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430.\n\n        Args:\n            page: \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.\n            cancel_button_text: \u0422\u0435\u043a\u0441\u0442 \u043a\u043d\u043e\u043f\u043a\u0438 \u043e\u0442\u043c\u0435\u043d\u044b.\n            allow_button_text: \u0422\u0435\u043a\u0441\u0442 \u043a\u043d\u043e\u043f\u043a\u0438 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u044f.\n        \"\"\"\n\n        super().__init__(page)\n\n        self.title = Text(page, ConfirmLocators.TITLE, \"confirm title\")\n        self.text = Text(page, ConfirmLocators.TEXT, \"confirm text\")\n\n        self.close_button = Button(page, ConfirmLocators.BUTTON_CLOSE, \"confirm close button\")\n        self.cancel_button = Button(\n            page,\n            page.get_by_role(\"button\", name=cancel_button_text).first,\n            \"confirm cancel button\"\n        )\n        self.allow_button = Button(\n            page,\n            page.get_by_role(\"button\", name=allow_button_text).first,\n            \"confirm allow button\"\n        )\n\n    # \u0414\u0435\u0439\u0441\u0442\u0432\u0438\u044f:\n    def click_allow_button(self) -> None:\n        \"\"\"\u041d\u0430\u0436\u0438\u043c\u0430\u0435\u0442 \u043a\u043d\u043e\u043f\u043a\u0443 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u044f \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f.\"\"\"\n\n        self.allow_button.click()\n\n    def click_cancel_button(self) -> None:\n        \"\"\"\u041d\u0430\u0436\u0438\u043c\u0430\u0435\u0442 \u043a\u043d\u043e\u043f\u043a\u0443 \u043e\u0442\u043c\u0435\u043d\u044b \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f.\"\"\"\n\n        self.cancel_button.click()\n\n    def click_close_button(self) -> None:\n        \"\"\"\u041d\u0430\u0436\u0438\u043c\u0430\u0435\u0442 \u043a\u043d\u043e\u043f\u043a\u0443 \u0437\u0430\u043a\u0440\u044b\u0442\u0438\u044f \u043e\u043a\u043d\u0430 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u044f.\"\"\"\n\n        self.close_button.click()\n\n    def scroll_window_left(self) -> None:\n        \"\"\"\u041f\u0440\u043e\u043a\u0440\u0443\u0447\u0438\u0432\u0430\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u043e\u043a\u043d\u0430 \u0432\u043b\u0435\u0432\u043e.\"\"\"\n\n        self.scroll_left(ConfirmLocators.CONFIRM)\n\n    def scroll_window_right(self) -> None:\n        \"\"\"\u041f\u0440\u043e\u043a\u0440\u0443\u0447\u0438\u0432\u0430\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u043e\u043a\u043d\u0430 \u0432\u043f\u0440\u0430\u0432\u043e.\"\"\"\n\n        self.scroll_right(ConfirmLocators.CONFIRM)\n\n    # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0438:\n    def check_title(self, title: str, msg: str) -> None:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0442\u0435\u043a\u0441\u0442 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430 \u043e\u043a\u043d\u0430 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u044f.\n\n        Args:\n            title: \u041e\u0436\u0438\u0434\u0430\u0435\u043c\u044b\u0439 \u0442\u0435\u043a\u0441\u0442 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430.\n            msg: \u0421\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u043f\u0440\u0438 \u043e\u0448\u0438\u0431\u043a\u0435.\n        \"\"\"\n\n        self.title.check_have_text(title, msg)\n\n    def check_text(self, text: str, msg: str) -> None:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0442\u0435\u043a\u0441\u0442 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0432 \u043e\u043a\u043d\u0435 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u044f.\n\n        Args:\n            text: \u041e\u0436\u0438\u0434\u0430\u0435\u043c\u044b\u0439 \u0442\u0435\u043a\u0441\u0442 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f.\n            msg: \u0421\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u043f\u0440\u0438 \u043e\u0448\u0438\u0431\u043a\u0435.\n        \"\"\"\n\n        self.text.check_have_text(text, msg)\n\n    def check_window_horizontal_scrolling(self) -> bool:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0433\u043e\u0440\u0438\u0437\u043e\u043d\u0442\u0430\u043b\u044c\u043d\u043e\u0439 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0438 \u043e\u043a\u043d\u0430.\"\"\"\n\n        return self.is_scrollable_horizontally(ConfirmLocators.CONFIRM)\n\n    def should_be_cancel_button(self) -> None:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0438 \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u043a\u043d\u043e\u043f\u043a\u0438 \u041e\u0442\u043c\u0435\u043d\u044b.\"\"\"\n        self.cancel_button.check_visibility(\"Cancel button is missing\")\n\n    def should_be_allow_button(self) -> None:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0438 \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u043a\u043d\u043e\u043f\u043a\u0438 \u041f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u044f.\"\"\"\n        self.allow_button.check_visibility(\"Allow button is missing\")\n\n    def check_cancel_button_text(self, expected_text: str) -> None:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0442\u0435\u043a\u0441\u0442 \u043a\u043d\u043e\u043f\u043a\u0438 \u041e\u0442\u043c\u0435\u043d\u044b.\"\"\"\n        self.cancel_button.check_have_text(expected_text, \"Cancel button text doesn't match expected\")\n\n    def check_allow_button_text(self, expected_text: str) -> None:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0442\u0435\u043a\u0441\u0442 \u043a\u043d\u043e\u043f\u043a\u0438 \u041f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u044f.\"\"\"\n        self.allow_button.check_have_text(expected_text, \"Allow button text doesn't match expected\")\n
    "},{"location":"components/confirm_component/#components.confirm_component.ConfirmComponent.__init__","title":"__init__(page, cancel_button_text, allow_button_text)","text":"

    \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430.

    Parameters:

    Name Type Description Default page Page

    \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.

    required cancel_button_text str

    \u0422\u0435\u043a\u0441\u0442 \u043a\u043d\u043e\u043f\u043a\u0438 \u043e\u0442\u043c\u0435\u043d\u044b.

    required allow_button_text str

    \u0422\u0435\u043a\u0441\u0442 \u043a\u043d\u043e\u043f\u043a\u0438 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u044f.

    required Source code in components\\confirm_component.py
    def __init__(self, page: Page, cancel_button_text: str, allow_button_text: str):\n    \"\"\"\u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430.\n\n    Args:\n        page: \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.\n        cancel_button_text: \u0422\u0435\u043a\u0441\u0442 \u043a\u043d\u043e\u043f\u043a\u0438 \u043e\u0442\u043c\u0435\u043d\u044b.\n        allow_button_text: \u0422\u0435\u043a\u0441\u0442 \u043a\u043d\u043e\u043f\u043a\u0438 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u044f.\n    \"\"\"\n\n    super().__init__(page)\n\n    self.title = Text(page, ConfirmLocators.TITLE, \"confirm title\")\n    self.text = Text(page, ConfirmLocators.TEXT, \"confirm text\")\n\n    self.close_button = Button(page, ConfirmLocators.BUTTON_CLOSE, \"confirm close button\")\n    self.cancel_button = Button(\n        page,\n        page.get_by_role(\"button\", name=cancel_button_text).first,\n        \"confirm cancel button\"\n    )\n    self.allow_button = Button(\n        page,\n        page.get_by_role(\"button\", name=allow_button_text).first,\n        \"confirm allow button\"\n    )\n
    "},{"location":"components/confirm_component/#components.confirm_component.ConfirmComponent.check_allow_button_text","title":"check_allow_button_text(expected_text)","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0442\u0435\u043a\u0441\u0442 \u043a\u043d\u043e\u043f\u043a\u0438 \u041f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u044f.

    Source code in components\\confirm_component.py
    def check_allow_button_text(self, expected_text: str) -> None:\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0442\u0435\u043a\u0441\u0442 \u043a\u043d\u043e\u043f\u043a\u0438 \u041f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u044f.\"\"\"\n    self.allow_button.check_have_text(expected_text, \"Allow button text doesn't match expected\")\n
    "},{"location":"components/confirm_component/#components.confirm_component.ConfirmComponent.check_cancel_button_text","title":"check_cancel_button_text(expected_text)","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0442\u0435\u043a\u0441\u0442 \u043a\u043d\u043e\u043f\u043a\u0438 \u041e\u0442\u043c\u0435\u043d\u044b.

    Source code in components\\confirm_component.py
    def check_cancel_button_text(self, expected_text: str) -> None:\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0442\u0435\u043a\u0441\u0442 \u043a\u043d\u043e\u043f\u043a\u0438 \u041e\u0442\u043c\u0435\u043d\u044b.\"\"\"\n    self.cancel_button.check_have_text(expected_text, \"Cancel button text doesn't match expected\")\n
    "},{"location":"components/confirm_component/#components.confirm_component.ConfirmComponent.check_text","title":"check_text(text, msg)","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0442\u0435\u043a\u0441\u0442 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0432 \u043e\u043a\u043d\u0435 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u044f.

    Parameters:

    Name Type Description Default text str

    \u041e\u0436\u0438\u0434\u0430\u0435\u043c\u044b\u0439 \u0442\u0435\u043a\u0441\u0442 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f.

    required msg str

    \u0421\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u043f\u0440\u0438 \u043e\u0448\u0438\u0431\u043a\u0435.

    required Source code in components\\confirm_component.py
    def check_text(self, text: str, msg: str) -> None:\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0442\u0435\u043a\u0441\u0442 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0432 \u043e\u043a\u043d\u0435 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u044f.\n\n    Args:\n        text: \u041e\u0436\u0438\u0434\u0430\u0435\u043c\u044b\u0439 \u0442\u0435\u043a\u0441\u0442 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f.\n        msg: \u0421\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u043f\u0440\u0438 \u043e\u0448\u0438\u0431\u043a\u0435.\n    \"\"\"\n\n    self.text.check_have_text(text, msg)\n
    "},{"location":"components/confirm_component/#components.confirm_component.ConfirmComponent.check_title","title":"check_title(title, msg)","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0442\u0435\u043a\u0441\u0442 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430 \u043e\u043a\u043d\u0430 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u044f.

    Parameters:

    Name Type Description Default title str

    \u041e\u0436\u0438\u0434\u0430\u0435\u043c\u044b\u0439 \u0442\u0435\u043a\u0441\u0442 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430.

    required msg str

    \u0421\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u043f\u0440\u0438 \u043e\u0448\u0438\u0431\u043a\u0435.

    required Source code in components\\confirm_component.py
    def check_title(self, title: str, msg: str) -> None:\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0442\u0435\u043a\u0441\u0442 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430 \u043e\u043a\u043d\u0430 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u044f.\n\n    Args:\n        title: \u041e\u0436\u0438\u0434\u0430\u0435\u043c\u044b\u0439 \u0442\u0435\u043a\u0441\u0442 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430.\n        msg: \u0421\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u043f\u0440\u0438 \u043e\u0448\u0438\u0431\u043a\u0435.\n    \"\"\"\n\n    self.title.check_have_text(title, msg)\n
    "},{"location":"components/confirm_component/#components.confirm_component.ConfirmComponent.check_window_horizontal_scrolling","title":"check_window_horizontal_scrolling()","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0433\u043e\u0440\u0438\u0437\u043e\u043d\u0442\u0430\u043b\u044c\u043d\u043e\u0439 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0438 \u043e\u043a\u043d\u0430.

    Source code in components\\confirm_component.py
    def check_window_horizontal_scrolling(self) -> bool:\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0433\u043e\u0440\u0438\u0437\u043e\u043d\u0442\u0430\u043b\u044c\u043d\u043e\u0439 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0438 \u043e\u043a\u043d\u0430.\"\"\"\n\n    return self.is_scrollable_horizontally(ConfirmLocators.CONFIRM)\n
    "},{"location":"components/confirm_component/#components.confirm_component.ConfirmComponent.click_allow_button","title":"click_allow_button()","text":"

    \u041d\u0430\u0436\u0438\u043c\u0430\u0435\u0442 \u043a\u043d\u043e\u043f\u043a\u0443 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u044f \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f.

    Source code in components\\confirm_component.py
    def click_allow_button(self) -> None:\n    \"\"\"\u041d\u0430\u0436\u0438\u043c\u0430\u0435\u0442 \u043a\u043d\u043e\u043f\u043a\u0443 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u044f \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f.\"\"\"\n\n    self.allow_button.click()\n
    "},{"location":"components/confirm_component/#components.confirm_component.ConfirmComponent.click_cancel_button","title":"click_cancel_button()","text":"

    \u041d\u0430\u0436\u0438\u043c\u0430\u0435\u0442 \u043a\u043d\u043e\u043f\u043a\u0443 \u043e\u0442\u043c\u0435\u043d\u044b \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f.

    Source code in components\\confirm_component.py
    def click_cancel_button(self) -> None:\n    \"\"\"\u041d\u0430\u0436\u0438\u043c\u0430\u0435\u0442 \u043a\u043d\u043e\u043f\u043a\u0443 \u043e\u0442\u043c\u0435\u043d\u044b \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f.\"\"\"\n\n    self.cancel_button.click()\n
    "},{"location":"components/confirm_component/#components.confirm_component.ConfirmComponent.click_close_button","title":"click_close_button()","text":"

    \u041d\u0430\u0436\u0438\u043c\u0430\u0435\u0442 \u043a\u043d\u043e\u043f\u043a\u0443 \u0437\u0430\u043a\u0440\u044b\u0442\u0438\u044f \u043e\u043a\u043d\u0430 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u044f.

    Source code in components\\confirm_component.py
    def click_close_button(self) -> None:\n    \"\"\"\u041d\u0430\u0436\u0438\u043c\u0430\u0435\u0442 \u043a\u043d\u043e\u043f\u043a\u0443 \u0437\u0430\u043a\u0440\u044b\u0442\u0438\u044f \u043e\u043a\u043d\u0430 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u044f.\"\"\"\n\n    self.close_button.click()\n
    "},{"location":"components/confirm_component/#components.confirm_component.ConfirmComponent.scroll_window_left","title":"scroll_window_left()","text":"

    \u041f\u0440\u043e\u043a\u0440\u0443\u0447\u0438\u0432\u0430\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u043e\u043a\u043d\u0430 \u0432\u043b\u0435\u0432\u043e.

    Source code in components\\confirm_component.py
    def scroll_window_left(self) -> None:\n    \"\"\"\u041f\u0440\u043e\u043a\u0440\u0443\u0447\u0438\u0432\u0430\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u043e\u043a\u043d\u0430 \u0432\u043b\u0435\u0432\u043e.\"\"\"\n\n    self.scroll_left(ConfirmLocators.CONFIRM)\n
    "},{"location":"components/confirm_component/#components.confirm_component.ConfirmComponent.scroll_window_right","title":"scroll_window_right()","text":"

    \u041f\u0440\u043e\u043a\u0440\u0443\u0447\u0438\u0432\u0430\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u043e\u043a\u043d\u0430 \u0432\u043f\u0440\u0430\u0432\u043e.

    Source code in components\\confirm_component.py
    def scroll_window_right(self) -> None:\n    \"\"\"\u041f\u0440\u043e\u043a\u0440\u0443\u0447\u0438\u0432\u0430\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u043e\u043a\u043d\u0430 \u0432\u043f\u0440\u0430\u0432\u043e.\"\"\"\n\n    self.scroll_right(ConfirmLocators.CONFIRM)\n
    "},{"location":"components/confirm_component/#components.confirm_component.ConfirmComponent.should_be_allow_button","title":"should_be_allow_button()","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0438 \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u043a\u043d\u043e\u043f\u043a\u0438 \u041f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u044f.

    Source code in components\\confirm_component.py
    def should_be_allow_button(self) -> None:\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0438 \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u043a\u043d\u043e\u043f\u043a\u0438 \u041f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u044f.\"\"\"\n    self.allow_button.check_visibility(\"Allow button is missing\")\n
    "},{"location":"components/confirm_component/#components.confirm_component.ConfirmComponent.should_be_cancel_button","title":"should_be_cancel_button()","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0438 \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u043a\u043d\u043e\u043f\u043a\u0438 \u041e\u0442\u043c\u0435\u043d\u044b.

    Source code in components\\confirm_component.py
    def should_be_cancel_button(self) -> None:\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0438 \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u043a\u043d\u043e\u043f\u043a\u0438 \u041e\u0442\u043c\u0435\u043d\u044b.\"\"\"\n    self.cancel_button.check_visibility(\"Cancel button is missing\")\n
    "},{"location":"components/dropdown_list_component/","title":"DropdownList","text":"

    \u041c\u043e\u0434\u0443\u043b\u044c dropdown_list_component \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043a\u043b\u0430\u0441\u0441 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0432\u044b\u043f\u0430\u0434\u0430\u044e\u0449\u0438\u043c\u0438 \u0441\u043f\u0438\u0441\u043a\u0430\u043c\u0438.

    \u041a\u043b\u0430\u0441\u0441 DropdownList \u043d\u0430\u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u0431\u0430\u0437\u043e\u0432\u044b\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b BaseComponent \u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u043c\u0435\u0442\u043e\u0434\u044b \u0434\u043b\u044f \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0441 \u0432\u044b\u043f\u0430\u0434\u0430\u044e\u0449\u0438\u043c\u0438 \u0441\u043f\u0438\u0441\u043a\u0430\u043c\u0438 \u043d\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435.

    "},{"location":"components/dropdown_list_component/#components.dropdown_list_component.DropdownList","title":"DropdownList","text":"

    Bases: BaseComponent

    \u041a\u043b\u0430\u0441\u0441 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0432\u044b\u043f\u0430\u0434\u0430\u044e\u0449\u0438\u043c\u0438 \u0441\u043f\u0438\u0441\u043a\u0430\u043c\u0438.

    \u041d\u0430\u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c BaseElement \u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u0447\u043d\u044b\u0435 \u043c\u0435\u0442\u043e\u0434\u044b \u0434\u043b\u044f \u0432\u044b\u0431\u043e\u0440\u0430 \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0441\u043f\u0438\u0441\u043a\u0430.

    Source code in components\\dropdown_list_component.py
    class DropdownList(BaseComponent):\n    \"\"\"\u041a\u043b\u0430\u0441\u0441 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0432\u044b\u043f\u0430\u0434\u0430\u044e\u0449\u0438\u043c\u0438 \u0441\u043f\u0438\u0441\u043a\u0430\u043c\u0438.\n\n    \u041d\u0430\u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c BaseElement \u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u0447\u043d\u044b\u0435\n    \u043c\u0435\u0442\u043e\u0434\u044b \u0434\u043b\u044f \u0432\u044b\u0431\u043e\u0440\u0430 \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0441\u043f\u0438\u0441\u043a\u0430.\n    \"\"\"\n\n    def __init__(self, page: Page):\n        \"\"\"\u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 \u0432\u044b\u043f\u0430\u0434\u0430\u044e\u0449\u0435\u0433\u043e \u0441\u043f\u0438\u0441\u043a\u0430.\n\n        Args:\n           page: \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.\n        \"\"\"\n\n        super().__init__(page)\n\n    # \u0414\u0435\u0439\u0441\u0442\u0432\u0438\u044f:\n    def click_item_with_text(self, text: str) -> None:\n        \"\"\"\u0412\u044b\u0431\u0438\u0440\u0430\u0435\u0442 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0441\u043f\u0438\u0441\u043a\u0430 \u043f\u043e \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u043e\u043c\u0443 \u0442\u0435\u043a\u0441\u0442\u0443.\n\n        Args:\n            text (str): \u0422\u0435\u043a\u0441\u0442 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0434\u043b\u044f \u0432\u044b\u0431\u043e\u0440\u0430.\n        \"\"\"\n\n        element = self.page.get_by_role(\"listitem\").filter(has_text=text)\n        if element.count() > 1:\n            rtext = f\"^{text}$\"\n            element = self.page.get_by_role(\"listitem\").filter(has_text=re.compile(rtext))\n        element.click()\n\n    def get_item_names(self, locator: str | Locator) -> list[str]:\n        \"\"\"\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0442\u0435\u043a\u0441\u0442\u044b \u0432\u0441\u0435\u0445 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u043f\u043e \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u043e\u043c\u0443 \u043b\u043e\u043a\u0430\u0442\u043e\u0440\u0443.\n\n        Args:\n            locator: \u041b\u043e\u043a\u0430\u0442\u043e\u0440 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0438\u043b\u0438 \u0441\u0442\u0440\u043e\u043a\u0430 \u0441 CSS/XPath.\n\n        Returns:\n            \u0421\u043f\u0438\u0441\u043e\u043a \u0442\u0435\u043a\u0441\u0442\u043e\u0432 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432.\n        \"\"\"\n\n        loc = self.get_locator(locator)\n        texts = loc.all_inner_texts()\n        return texts[0].splitlines()\n\n    def scroll_until_end(self, locator: str | Locator) -> None:\n        \"\"\"\n        \u0421\u043a\u0440\u043e\u043b\u043b\u0438\u0442 \u0441\u043f\u0438\u0441\u043e\u043a \u0434\u043e \u0442\u0435\u0445 \u043f\u043e\u0440, \u043f\u043e\u043a\u0430 \u043d\u0435 \u043f\u0435\u0440\u0435\u0441\u0442\u0430\u043d\u0443\u0442 \u043f\u043e\u0434\u0433\u0440\u0443\u0436\u0430\u0442\u044c\u0441\u044f \u043d\u043e\u0432\u044b\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b.\n\n        Args:\n            locator: \u041b\u043e\u043a\u0430\u0442\u043e\u0440 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0438\u043b\u0438 \u0441\u0442\u0440\u043e\u043a\u0430 \u0441 CSS/XPath.\n        \"\"\"\n\n        loc = self.get_locator(locator)\n\n        items_count = 0\n        attempts = 0\n        max_attempts = 3\n        last_item_name = \"\"\n\n        while attempts < max_attempts:\n            self.page.wait_for_timeout(300)\n\n            item_names = self.get_item_names(loc)\n            current_count = len(item_names)\n\n            if current_count == items_count:\n                attempts += 1\n            else:\n                items_count = current_count\n                attempts = 0\n\n            last_item_name = item_names[current_count-1]\n            element = self.page.get_by_role(\"listitem\").filter(has_text=last_item_name)\n            element.scroll_into_view_if_needed()\n\n        self.page.wait_for_timeout(300)\n        self.check_item_with_text(last_item_name)\n\n    # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0438:\n    def check_item_with_text(self, text: str) -> None:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0438 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u043e\u0441\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0441\u043f\u0438\u0441\u043a\u0430.\n\n        Args:\n            text (str): \u0422\u0435\u043a\u0441\u0442 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0434\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438.\n\n        Raises:\n            AssertionError: \u0415\u0441\u043b\u0438 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u0438\u043b\u0438 \u043d\u0435\u0434\u043e\u0441\u0442\u0443\u043f\u0435\u043d.\n        \"\"\"\n\n        element = self.page.get_by_role(\"listitem\").filter(has_text=text)\n        if element.count() > 1:\n            rtext = f\"^{text}$\"\n            element = self.page.get_by_role(\"listitem\").filter(has_text=re.compile(rtext))\n        enabled = element.is_enabled()\n        if not enabled:\n            assert False, f\"Dropdown list item '{text}' is missing or disabled\"\n\n    def check_vertical_scrolling(self, locator: str | Locator) -> bool:\n        \"\"\"\n        \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0441\u043a\u0440\u043e\u043b\u043b\u0438\u043d\u0433\u0430 \u0441\u043f\u0438\u0441\u043a\u0430.\n\n        Args:\n            locator: \u041b\u043e\u043a\u0430\u0442\u043e\u0440 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0438\u043b\u0438 \u0441\u0442\u0440\u043e\u043a\u0430 \u0441 CSS/XPath.\n\n        Returns:\n            True \u0438\u043b\u0438 False \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0432 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u0441\u043a\u0440\u043e\u043b\u043b\u0438\u0440\u0443\u0435\u043c\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a \u0438\u043b\u0438 \u043d\u0435\u0442.\n        \"\"\"\n\n        loc = self.get_locator(locator)\n\n        is_scrollable_vertically = self.is_scrollable_vertically(loc)\n        if  is_scrollable_vertically:\n            self.scroll_until_end(loc)\n\n            item_names = self.get_item_names(loc)\n            first_item_name = item_names[0]\n\n            self.scroll_up(loc)\n            self.page.wait_for_timeout(300)\n            self.check_item_with_text(first_item_name)\n\n        return is_scrollable_vertically\n
    "},{"location":"components/dropdown_list_component/#components.dropdown_list_component.DropdownList.__init__","title":"__init__(page)","text":"

    \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 \u0432\u044b\u043f\u0430\u0434\u0430\u044e\u0449\u0435\u0433\u043e \u0441\u043f\u0438\u0441\u043a\u0430.

    Parameters:

    Name Type Description Default page Page

    \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.

    required Source code in components\\dropdown_list_component.py
    def __init__(self, page: Page):\n    \"\"\"\u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 \u0432\u044b\u043f\u0430\u0434\u0430\u044e\u0449\u0435\u0433\u043e \u0441\u043f\u0438\u0441\u043a\u0430.\n\n    Args:\n       page: \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.\n    \"\"\"\n\n    super().__init__(page)\n
    "},{"location":"components/dropdown_list_component/#components.dropdown_list_component.DropdownList.check_item_with_text","title":"check_item_with_text(text)","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0438 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u043e\u0441\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0441\u043f\u0438\u0441\u043a\u0430.

    Parameters:

    Name Type Description Default text str

    \u0422\u0435\u043a\u0441\u0442 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0434\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438.

    required

    Raises:

    Type Description AssertionError

    \u0415\u0441\u043b\u0438 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u0438\u043b\u0438 \u043d\u0435\u0434\u043e\u0441\u0442\u0443\u043f\u0435\u043d.

    Source code in components\\dropdown_list_component.py
    def check_item_with_text(self, text: str) -> None:\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0438 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u043e\u0441\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0441\u043f\u0438\u0441\u043a\u0430.\n\n    Args:\n        text (str): \u0422\u0435\u043a\u0441\u0442 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0434\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438.\n\n    Raises:\n        AssertionError: \u0415\u0441\u043b\u0438 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u0438\u043b\u0438 \u043d\u0435\u0434\u043e\u0441\u0442\u0443\u043f\u0435\u043d.\n    \"\"\"\n\n    element = self.page.get_by_role(\"listitem\").filter(has_text=text)\n    if element.count() > 1:\n        rtext = f\"^{text}$\"\n        element = self.page.get_by_role(\"listitem\").filter(has_text=re.compile(rtext))\n    enabled = element.is_enabled()\n    if not enabled:\n        assert False, f\"Dropdown list item '{text}' is missing or disabled\"\n
    "},{"location":"components/dropdown_list_component/#components.dropdown_list_component.DropdownList.check_vertical_scrolling","title":"check_vertical_scrolling(locator)","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0441\u043a\u0440\u043e\u043b\u043b\u0438\u043d\u0433\u0430 \u0441\u043f\u0438\u0441\u043a\u0430.

    Parameters:

    Name Type Description Default locator str | Locator

    \u041b\u043e\u043a\u0430\u0442\u043e\u0440 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0438\u043b\u0438 \u0441\u0442\u0440\u043e\u043a\u0430 \u0441 CSS/XPath.

    required

    Returns:

    Type Description bool

    True \u0438\u043b\u0438 False \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0432 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u0441\u043a\u0440\u043e\u043b\u043b\u0438\u0440\u0443\u0435\u043c\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a \u0438\u043b\u0438 \u043d\u0435\u0442.

    Source code in components\\dropdown_list_component.py
    def check_vertical_scrolling(self, locator: str | Locator) -> bool:\n    \"\"\"\n    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0441\u043a\u0440\u043e\u043b\u043b\u0438\u043d\u0433\u0430 \u0441\u043f\u0438\u0441\u043a\u0430.\n\n    Args:\n        locator: \u041b\u043e\u043a\u0430\u0442\u043e\u0440 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0438\u043b\u0438 \u0441\u0442\u0440\u043e\u043a\u0430 \u0441 CSS/XPath.\n\n    Returns:\n        True \u0438\u043b\u0438 False \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0432 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u0441\u043a\u0440\u043e\u043b\u043b\u0438\u0440\u0443\u0435\u043c\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a \u0438\u043b\u0438 \u043d\u0435\u0442.\n    \"\"\"\n\n    loc = self.get_locator(locator)\n\n    is_scrollable_vertically = self.is_scrollable_vertically(loc)\n    if  is_scrollable_vertically:\n        self.scroll_until_end(loc)\n\n        item_names = self.get_item_names(loc)\n        first_item_name = item_names[0]\n\n        self.scroll_up(loc)\n        self.page.wait_for_timeout(300)\n        self.check_item_with_text(first_item_name)\n\n    return is_scrollable_vertically\n
    "},{"location":"components/dropdown_list_component/#components.dropdown_list_component.DropdownList.click_item_with_text","title":"click_item_with_text(text)","text":"

    \u0412\u044b\u0431\u0438\u0440\u0430\u0435\u0442 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0441\u043f\u0438\u0441\u043a\u0430 \u043f\u043e \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u043e\u043c\u0443 \u0442\u0435\u043a\u0441\u0442\u0443.

    Parameters:

    Name Type Description Default text str

    \u0422\u0435\u043a\u0441\u0442 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0434\u043b\u044f \u0432\u044b\u0431\u043e\u0440\u0430.

    required Source code in components\\dropdown_list_component.py
    def click_item_with_text(self, text: str) -> None:\n    \"\"\"\u0412\u044b\u0431\u0438\u0440\u0430\u0435\u0442 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0441\u043f\u0438\u0441\u043a\u0430 \u043f\u043e \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u043e\u043c\u0443 \u0442\u0435\u043a\u0441\u0442\u0443.\n\n    Args:\n        text (str): \u0422\u0435\u043a\u0441\u0442 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0434\u043b\u044f \u0432\u044b\u0431\u043e\u0440\u0430.\n    \"\"\"\n\n    element = self.page.get_by_role(\"listitem\").filter(has_text=text)\n    if element.count() > 1:\n        rtext = f\"^{text}$\"\n        element = self.page.get_by_role(\"listitem\").filter(has_text=re.compile(rtext))\n    element.click()\n
    "},{"location":"components/dropdown_list_component/#components.dropdown_list_component.DropdownList.get_item_names","title":"get_item_names(locator)","text":"

    \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0442\u0435\u043a\u0441\u0442\u044b \u0432\u0441\u0435\u0445 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u043f\u043e \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u043e\u043c\u0443 \u043b\u043e\u043a\u0430\u0442\u043e\u0440\u0443.

    Parameters:

    Name Type Description Default locator str | Locator

    \u041b\u043e\u043a\u0430\u0442\u043e\u0440 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0438\u043b\u0438 \u0441\u0442\u0440\u043e\u043a\u0430 \u0441 CSS/XPath.

    required

    Returns:

    Type Description list[str]

    \u0421\u043f\u0438\u0441\u043e\u043a \u0442\u0435\u043a\u0441\u0442\u043e\u0432 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432.

    Source code in components\\dropdown_list_component.py
    def get_item_names(self, locator: str | Locator) -> list[str]:\n    \"\"\"\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0442\u0435\u043a\u0441\u0442\u044b \u0432\u0441\u0435\u0445 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u043f\u043e \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u043e\u043c\u0443 \u043b\u043e\u043a\u0430\u0442\u043e\u0440\u0443.\n\n    Args:\n        locator: \u041b\u043e\u043a\u0430\u0442\u043e\u0440 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0438\u043b\u0438 \u0441\u0442\u0440\u043e\u043a\u0430 \u0441 CSS/XPath.\n\n    Returns:\n        \u0421\u043f\u0438\u0441\u043e\u043a \u0442\u0435\u043a\u0441\u0442\u043e\u0432 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432.\n    \"\"\"\n\n    loc = self.get_locator(locator)\n    texts = loc.all_inner_texts()\n    return texts[0].splitlines()\n
    "},{"location":"components/dropdown_list_component/#components.dropdown_list_component.DropdownList.scroll_until_end","title":"scroll_until_end(locator)","text":"

    \u0421\u043a\u0440\u043e\u043b\u043b\u0438\u0442 \u0441\u043f\u0438\u0441\u043e\u043a \u0434\u043e \u0442\u0435\u0445 \u043f\u043e\u0440, \u043f\u043e\u043a\u0430 \u043d\u0435 \u043f\u0435\u0440\u0435\u0441\u0442\u0430\u043d\u0443\u0442 \u043f\u043e\u0434\u0433\u0440\u0443\u0436\u0430\u0442\u044c\u0441\u044f \u043d\u043e\u0432\u044b\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b.

    Parameters:

    Name Type Description Default locator str | Locator

    \u041b\u043e\u043a\u0430\u0442\u043e\u0440 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0438\u043b\u0438 \u0441\u0442\u0440\u043e\u043a\u0430 \u0441 CSS/XPath.

    required Source code in components\\dropdown_list_component.py
    def scroll_until_end(self, locator: str | Locator) -> None:\n    \"\"\"\n    \u0421\u043a\u0440\u043e\u043b\u043b\u0438\u0442 \u0441\u043f\u0438\u0441\u043e\u043a \u0434\u043e \u0442\u0435\u0445 \u043f\u043e\u0440, \u043f\u043e\u043a\u0430 \u043d\u0435 \u043f\u0435\u0440\u0435\u0441\u0442\u0430\u043d\u0443\u0442 \u043f\u043e\u0434\u0433\u0440\u0443\u0436\u0430\u0442\u044c\u0441\u044f \u043d\u043e\u0432\u044b\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b.\n\n    Args:\n        locator: \u041b\u043e\u043a\u0430\u0442\u043e\u0440 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0438\u043b\u0438 \u0441\u0442\u0440\u043e\u043a\u0430 \u0441 CSS/XPath.\n    \"\"\"\n\n    loc = self.get_locator(locator)\n\n    items_count = 0\n    attempts = 0\n    max_attempts = 3\n    last_item_name = \"\"\n\n    while attempts < max_attempts:\n        self.page.wait_for_timeout(300)\n\n        item_names = self.get_item_names(loc)\n        current_count = len(item_names)\n\n        if current_count == items_count:\n            attempts += 1\n        else:\n            items_count = current_count\n            attempts = 0\n\n        last_item_name = item_names[current_count-1]\n        element = self.page.get_by_role(\"listitem\").filter(has_text=last_item_name)\n        element.scroll_into_view_if_needed()\n\n    self.page.wait_for_timeout(300)\n    self.check_item_with_text(last_item_name)\n
    "},{"location":"components/eventbar_component/","title":"EventPanelComponent","text":"

    \u041c\u043e\u0434\u0443\u043b\u044c \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430 \u043f\u0430\u043d\u0435\u043b\u0438 \u0441\u043e\u0431\u044b\u0442\u0438\u0439. \u0421\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043a\u043b\u0430\u0441\u0441 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u043c\u0438 \u043f\u0430\u043d\u0435\u043b\u0438.

    "},{"location":"components/eventbar_component/#components.eventbar_component.EventPanelComponent","title":"EventPanelComponent","text":"

    Bases: BaseComponent

    \u041a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 \u043f\u0430\u043d\u0435\u043b\u0438 \u0441\u043e\u0431\u044b\u0442\u0438\u0439. \u041f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u043c\u0435\u0442\u043e\u0434\u044b \u0434\u043b\u044f \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0441 \u043d\u0435\u0439.

    Source code in components\\eventbar_component.py
    class EventPanelComponent(BaseComponent):\n    \"\"\"\u041a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 \u043f\u0430\u043d\u0435\u043b\u0438 \u0441\u043e\u0431\u044b\u0442\u0438\u0439. \u041f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u043c\u0435\u0442\u043e\u0434\u044b \u0434\u043b\u044f \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0441 \u043d\u0435\u0439.\"\"\"\n\n    def __init__(self, page: Page):\n        \"\"\"\u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 \u043f\u0430\u043d\u0435\u043b\u0438 \u0441\u043e\u0431\u044b\u0442\u0438\u0439.\n\n        Args:\n            page: \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.\n        \"\"\"\n\n        super().__init__(page)\n\n        self.states_tab = TabButton(page, self.page.locator(EventPanelLocators.TAB_STATES), \"states_tab\")\n        self.actions_tab = TabButton(page, self.page.locator(EventPanelLocators.TAB_ACTIONS), \"actions_tab\")\n        self.events_tab = TabButton(page, self.page.locator(EventPanelLocators.TAB_EVENTS), \"events_tab\")\n        self.maintenance_tab = TabButton(page, self.page.locator(EventPanelLocators.TAB_MAINTENANCE), \"maintenance_tab\")\n        self.system_log_tab = TabButton(page, self.page.locator(EventPanelLocators.TAB_SYSTEM_LOG), \"system_log_tab\")\n\n        self.unknown_reason_button = TooltipButton(page, self.page.locator(EventPanelLocators.BUTTONS_EVENT).nth(0), \"unknown_reason_button\")\n        self.warning_button = TooltipButton(page, self.page.locator(EventPanelLocators.BUTTONS_EVENT).nth(1), \"warning_button\")\n        self.damage_button = TooltipButton(page, self.page.locator(EventPanelLocators.BUTTONS_EVENT).nth(2), \"damage_button\")\n        self.failure_button = TooltipButton(page, self.page.locator(EventPanelLocators.BUTTONS_EVENT).nth(3), \"failure_button\")\n\n        buttons_service_locators = self.page.locator(EventPanelLocators.BUTTONS_SERVICE).get_by_role(\"button\").all()\n        self.search_button = Button(page, buttons_service_locators[0], \"search_button\")\n        self.user_button = Button(page, buttons_service_locators[1], \"user_button\")\n\n    # \u0414\u0435\u0439\u0441\u0442\u0432\u0438\u044f:\n    def click_expand_less_button(self) -> None:\n        \"\"\"\u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u043d\u0430\u0436\u0430\u0442\u0438\u0435 \u043a\u043d\u043e\u043f\u043a\u0438 \u0433\u0430\u043b\u043e\u0447\u043a\u0430 \u0432\u0432\u0435\u0440\u0445.\"\"\"\n\n        button_locator = self.page.locator(EventPanelLocators.TAB_EXPAND_BUTTONS).\\\n                         get_by_role(\"button\").filter(has_text='expand_less')\n        button_locator.click()\n\n    def click_expand_more_button(self) -> None:\n        \"\"\"\u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u043d\u0430\u0436\u0430\u0442\u0438\u0435 \u043a\u043d\u043e\u043f\u043a\u0438 \u0433\u0430\u043b\u043e\u0447\u043a\u0430 \u0432\u043d\u0438\u0437.\"\"\"\n\n        button_locator = self.page.locator(EventPanelLocators.TAB_EXPAND_BUTTONS).\\\n                         get_by_role(\"button\").filter(has_text='expand_more')\n        button_locator.click()\n\n    def click_system_log_tab(self) -> SystemLogEventsContainer:\n        \"\"\"\u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u043d\u0430\u0436\u0430\u0442\u0438\u0435 tab-\u043a\u043d\u043e\u043f\u043a\u0438 \u0421\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0439 \u0436\u0443\u0440\u043d\u0430\u043b.\"\"\"\n\n        self.system_log_tab.check_visibility(\"System log tab button is missing on event panel\")\n        self.system_log_tab.click()\n\n        system_log_events = SystemLogEventsContainer(self.page, EventPanelLocators.CONTAINER_SYSTEM_LOG_EVENTS)\n        return system_log_events\n\n    def click_user_button(self) -> UserCard:\n        \"\"\"\u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u043d\u0430\u0436\u0430\u0442\u0438\u0435 \u043a\u043d\u043e\u043f\u043a\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\"\"\"\n\n        self.should_be_user_button()\n        self.user_button.click()\n\n        user_card = UserCard(self.page)\n        return user_card\n\n    def do_logout(self) -> None:\n        \"\"\"\u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u0432\u044b\u0445\u043e\u0434 \u0438\u0437 \u0441\u0438\u0441\u0442\u0435\u043c\u044b.\"\"\"\n\n        user_card = self.click_user_button()\n        user_card.click_logout_button()\n\n    def get_event_tooltip_texts(self) -> []:\n        \"\"\"\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0441\u043f\u0438\u0441\u043e\u043a \u0442\u0435\u043a\u0441\u0442\u043e\u0432 \u0432\u0441\u043f\u043b\u044b\u0432\u0430\u044e\u0449\u0438\u0445 \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043e\u043a \u043a\u043d\u043e\u043f\u043e\u043a \u0441\u0447\u0435\u0442\u0447\u0438\u043a\u043e\u0432 \u0441\u043e\u0431\u044b\u0442\u0438\u0439.\"\"\"\n\n        tooltip_texts = []\n\n        tooltip_texts.append(self.unknown_reason_button.get_tooltip_text())\n        tooltip_texts.append(self.warning_button.get_tooltip_text())\n        tooltip_texts.append(self.damage_button.get_tooltip_text())\n        tooltip_texts.append(self.failure_button.get_tooltip_text())\n\n        return tooltip_texts\n\n    def get_event_button_values(self) -> {}:\n        \"\"\"\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043d\u0430\u0431\u043e\u0440 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u043a\u043d\u043e\u043f\u043e\u043a \u0441\u0447\u0435\u0442\u0447\u0438\u043a\u043e\u0432 \u0441\u043e\u0431\u044b\u0442\u0438\u0439.\"\"\"\n\n        event_buttons_texts = {}\n\n        event_buttons_texts['\u041d\u0435\u0438\u0437\u0432\u0435\u0441\u0442\u043d\u043e'] = self.unknown_reason_button.get_text(0)\n        event_buttons_texts['\u041f\u0440\u0435\u0434\u0443\u043f\u0440\u0435\u0436\u0434\u0435\u043d\u0438\u0435'] = self.warning_button.get_text(0)\n        event_buttons_texts['\u041f\u043e\u0432\u0440\u0435\u0436\u0434\u0435\u043d\u0438\u0435'] = self.damage_button.get_text(0)\n        event_buttons_texts['\u0410\u0432\u0430\u0440\u0438\u044f'] = self.failure_button.get_text(0)\n\n        return event_buttons_texts\n\n    def get_panel_position(self) -> str:\n        \"\"\"\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0442\u0435\u043a\u0443\u0449\u0435\u0435 \u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043f\u0430\u043d\u0435\u043b\u0438 \u0441\u043e\u0431\u044b\u0442\u0438\u0439 \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b: \"top\", \"center\",\"bottom\".\"\"\"\n\n        style_attr = self.page.locator(EventPanelLocators.AREA_EVENTS).get_attribute(\"style\")\n        position = \"bottom\"\n\n        if style_attr.find(\"display: none;\") == -1:\n            height = style_attr.replace(\"height: \",\"\").replace(\";\", \"\")\n            if height == \"100%\":\n                position = \"top\"\n            else:\n                position = \"center\"\n\n        return position\n\n    # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0438:\n    def check_expand_less_button(self) -> bool:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u043a\u043d\u043e\u043f\u043a\u0438 \u0433\u0430\u043b\u043e\u0447\u043a\u0430 \u0432\u0432\u0435\u0440\u0445.\"\"\"\n\n        try:\n            _ = self.page.locator(EventPanelLocators.TAB_EXPAND_BUTTONS).\\\n                          get_by_role(\"button\").filter(has_text='expand_less')\n        except TimeoutError:\n            return False\n        return True\n\n    def check_expand_more_button(self) -> bool:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u043a\u043d\u043e\u043f\u043a\u0438 \u0433\u0430\u043b\u043e\u0447\u043a\u0430 \u0432\u043d\u0438\u0437\"\"\"\n\n        try:\n            _ = self.page.locator(EventPanelLocators.TAB_EXPAND_BUTTONS).\\\n                          get_by_role(\"button\").filter(has_text='expand_more')\n        except TimeoutError:\n            return False\n        return True\n\n    def should_be_user_button(self) -> None:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u043a\u043d\u043e\u043f\u043a\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\"\"\"\n\n        self.user_button.check_visibility(\"User button is missing on event panel\")\n\n    def should_be_search_button(self) -> None:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u043a\u043d\u043e\u043f\u043a\u0438 \u043f\u043e\u0438\u0441\u043a\u0430.\"\"\"\n\n        self.search_button.check_visibility(\"Search button is missing on event panel\")\n\n    def should_be_tab_buttons(self) -> None:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0431\u043b\u043e\u043a\u0430 tab-\u043a\u043d\u043e\u043f\u043e\u043a \u0421\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f, \u0414\u0435\u0439\u0441\u0442\u0432\u0438\u044f, \u0421\u043e\u0431\u044b\u0442\u0438\u044f, \u041e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u043d\u0438\u0435, \u0421\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0439 \u0436\u0443\u0440\u043d\u0430\u043b.\"\"\"\n\n        self.states_tab.check_have_text('\u0421\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f', \"Tab button with text \u0421\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f is missing on event panel\")\n        self.actions_tab.check_have_text('\u0414\u0435\u0439\u0441\u0442\u0432\u0438\u044f',\"Tab button with text \u0414\u0435\u0439\u0441\u0442\u0432\u0438\u044f is missing on event panel\")\n        self.events_tab.check_have_text('\u0421\u043e\u0431\u044b\u0442\u0438\u044f', \"Tab button with text \u0421\u043e\u0431\u044b\u0442\u0438\u044f is missing on event panel\")\n        self.maintenance_tab.check_have_text('\u041e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u043d\u0438\u0435', \"Tab button with text \u041e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u043d\u0438\u0435 is missing on event panel\")\n        self.system_log_tab.check_have_text('\u0421\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0439 \u0436\u0443\u0440\u043d\u0430\u043b', \"Tab button with text \u0421\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0439 \u0436\u0443\u0440\u043d\u0430\u043b is missing on event panel\")\n\n    def should_be_event_buttons(self) -> None:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0431\u043b\u043e\u043a\u0430 \u043a\u043d\u043e\u043f\u043e\u043a-\u0441\u0447\u0435\u0442\u0447\u0438\u043a\u043e\u0432 \u0441\u043e\u0431\u044b\u0442\u0438\u0439.\"\"\"\n\n        self.unknown_reason_button.check_visibility(\"Unknown reason event button is missing on event panel\")\n        self.warning_button.check_visibility(\"Warning event button is missing on event panel\")\n        self.damage_button.check_visibility(\"Damage event button is missing on event panel\")\n        self.failure_button.check_visibility(\"Failure event button is missing on event panel\")\n
    "},{"location":"components/eventbar_component/#components.eventbar_component.EventPanelComponent.__init__","title":"__init__(page)","text":"

    \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 \u043f\u0430\u043d\u0435\u043b\u0438 \u0441\u043e\u0431\u044b\u0442\u0438\u0439.

    Parameters:

    Name Type Description Default page Page

    \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.

    required Source code in components\\eventbar_component.py
    def __init__(self, page: Page):\n    \"\"\"\u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 \u043f\u0430\u043d\u0435\u043b\u0438 \u0441\u043e\u0431\u044b\u0442\u0438\u0439.\n\n    Args:\n        page: \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.\n    \"\"\"\n\n    super().__init__(page)\n\n    self.states_tab = TabButton(page, self.page.locator(EventPanelLocators.TAB_STATES), \"states_tab\")\n    self.actions_tab = TabButton(page, self.page.locator(EventPanelLocators.TAB_ACTIONS), \"actions_tab\")\n    self.events_tab = TabButton(page, self.page.locator(EventPanelLocators.TAB_EVENTS), \"events_tab\")\n    self.maintenance_tab = TabButton(page, self.page.locator(EventPanelLocators.TAB_MAINTENANCE), \"maintenance_tab\")\n    self.system_log_tab = TabButton(page, self.page.locator(EventPanelLocators.TAB_SYSTEM_LOG), \"system_log_tab\")\n\n    self.unknown_reason_button = TooltipButton(page, self.page.locator(EventPanelLocators.BUTTONS_EVENT).nth(0), \"unknown_reason_button\")\n    self.warning_button = TooltipButton(page, self.page.locator(EventPanelLocators.BUTTONS_EVENT).nth(1), \"warning_button\")\n    self.damage_button = TooltipButton(page, self.page.locator(EventPanelLocators.BUTTONS_EVENT).nth(2), \"damage_button\")\n    self.failure_button = TooltipButton(page, self.page.locator(EventPanelLocators.BUTTONS_EVENT).nth(3), \"failure_button\")\n\n    buttons_service_locators = self.page.locator(EventPanelLocators.BUTTONS_SERVICE).get_by_role(\"button\").all()\n    self.search_button = Button(page, buttons_service_locators[0], \"search_button\")\n    self.user_button = Button(page, buttons_service_locators[1], \"user_button\")\n
    "},{"location":"components/eventbar_component/#components.eventbar_component.EventPanelComponent.check_expand_less_button","title":"check_expand_less_button()","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u043a\u043d\u043e\u043f\u043a\u0438 \u0433\u0430\u043b\u043e\u0447\u043a\u0430 \u0432\u0432\u0435\u0440\u0445.

    Source code in components\\eventbar_component.py
    def check_expand_less_button(self) -> bool:\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u043a\u043d\u043e\u043f\u043a\u0438 \u0433\u0430\u043b\u043e\u0447\u043a\u0430 \u0432\u0432\u0435\u0440\u0445.\"\"\"\n\n    try:\n        _ = self.page.locator(EventPanelLocators.TAB_EXPAND_BUTTONS).\\\n                      get_by_role(\"button\").filter(has_text='expand_less')\n    except TimeoutError:\n        return False\n    return True\n
    "},{"location":"components/eventbar_component/#components.eventbar_component.EventPanelComponent.check_expand_more_button","title":"check_expand_more_button()","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u043a\u043d\u043e\u043f\u043a\u0438 \u0433\u0430\u043b\u043e\u0447\u043a\u0430 \u0432\u043d\u0438\u0437

    Source code in components\\eventbar_component.py
    def check_expand_more_button(self) -> bool:\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u043a\u043d\u043e\u043f\u043a\u0438 \u0433\u0430\u043b\u043e\u0447\u043a\u0430 \u0432\u043d\u0438\u0437\"\"\"\n\n    try:\n        _ = self.page.locator(EventPanelLocators.TAB_EXPAND_BUTTONS).\\\n                      get_by_role(\"button\").filter(has_text='expand_more')\n    except TimeoutError:\n        return False\n    return True\n
    "},{"location":"components/eventbar_component/#components.eventbar_component.EventPanelComponent.click_expand_less_button","title":"click_expand_less_button()","text":"

    \u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u043d\u0430\u0436\u0430\u0442\u0438\u0435 \u043a\u043d\u043e\u043f\u043a\u0438 \u0433\u0430\u043b\u043e\u0447\u043a\u0430 \u0432\u0432\u0435\u0440\u0445.

    Source code in components\\eventbar_component.py
    def click_expand_less_button(self) -> None:\n    \"\"\"\u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u043d\u0430\u0436\u0430\u0442\u0438\u0435 \u043a\u043d\u043e\u043f\u043a\u0438 \u0433\u0430\u043b\u043e\u0447\u043a\u0430 \u0432\u0432\u0435\u0440\u0445.\"\"\"\n\n    button_locator = self.page.locator(EventPanelLocators.TAB_EXPAND_BUTTONS).\\\n                     get_by_role(\"button\").filter(has_text='expand_less')\n    button_locator.click()\n
    "},{"location":"components/eventbar_component/#components.eventbar_component.EventPanelComponent.click_expand_more_button","title":"click_expand_more_button()","text":"

    \u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u043d\u0430\u0436\u0430\u0442\u0438\u0435 \u043a\u043d\u043e\u043f\u043a\u0438 \u0433\u0430\u043b\u043e\u0447\u043a\u0430 \u0432\u043d\u0438\u0437.

    Source code in components\\eventbar_component.py
    def click_expand_more_button(self) -> None:\n    \"\"\"\u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u043d\u0430\u0436\u0430\u0442\u0438\u0435 \u043a\u043d\u043e\u043f\u043a\u0438 \u0433\u0430\u043b\u043e\u0447\u043a\u0430 \u0432\u043d\u0438\u0437.\"\"\"\n\n    button_locator = self.page.locator(EventPanelLocators.TAB_EXPAND_BUTTONS).\\\n                     get_by_role(\"button\").filter(has_text='expand_more')\n    button_locator.click()\n
    "},{"location":"components/eventbar_component/#components.eventbar_component.EventPanelComponent.click_system_log_tab","title":"click_system_log_tab()","text":"

    \u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u043d\u0430\u0436\u0430\u0442\u0438\u0435 tab-\u043a\u043d\u043e\u043f\u043a\u0438 \u0421\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0439 \u0436\u0443\u0440\u043d\u0430\u043b.

    Source code in components\\eventbar_component.py
    def click_system_log_tab(self) -> SystemLogEventsContainer:\n    \"\"\"\u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u043d\u0430\u0436\u0430\u0442\u0438\u0435 tab-\u043a\u043d\u043e\u043f\u043a\u0438 \u0421\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0439 \u0436\u0443\u0440\u043d\u0430\u043b.\"\"\"\n\n    self.system_log_tab.check_visibility(\"System log tab button is missing on event panel\")\n    self.system_log_tab.click()\n\n    system_log_events = SystemLogEventsContainer(self.page, EventPanelLocators.CONTAINER_SYSTEM_LOG_EVENTS)\n    return system_log_events\n
    "},{"location":"components/eventbar_component/#components.eventbar_component.EventPanelComponent.click_user_button","title":"click_user_button()","text":"

    \u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u043d\u0430\u0436\u0430\u0442\u0438\u0435 \u043a\u043d\u043e\u043f\u043a\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.

    Source code in components\\eventbar_component.py
    def click_user_button(self) -> UserCard:\n    \"\"\"\u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u043d\u0430\u0436\u0430\u0442\u0438\u0435 \u043a\u043d\u043e\u043f\u043a\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\"\"\"\n\n    self.should_be_user_button()\n    self.user_button.click()\n\n    user_card = UserCard(self.page)\n    return user_card\n
    "},{"location":"components/eventbar_component/#components.eventbar_component.EventPanelComponent.do_logout","title":"do_logout()","text":"

    \u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u0432\u044b\u0445\u043e\u0434 \u0438\u0437 \u0441\u0438\u0441\u0442\u0435\u043c\u044b.

    Source code in components\\eventbar_component.py
    def do_logout(self) -> None:\n    \"\"\"\u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u0432\u044b\u0445\u043e\u0434 \u0438\u0437 \u0441\u0438\u0441\u0442\u0435\u043c\u044b.\"\"\"\n\n    user_card = self.click_user_button()\n    user_card.click_logout_button()\n
    "},{"location":"components/eventbar_component/#components.eventbar_component.EventPanelComponent.get_event_button_values","title":"get_event_button_values()","text":"

    \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043d\u0430\u0431\u043e\u0440 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u043a\u043d\u043e\u043f\u043e\u043a \u0441\u0447\u0435\u0442\u0447\u0438\u043a\u043e\u0432 \u0441\u043e\u0431\u044b\u0442\u0438\u0439.

    Source code in components\\eventbar_component.py
    def get_event_button_values(self) -> {}:\n    \"\"\"\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043d\u0430\u0431\u043e\u0440 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u043a\u043d\u043e\u043f\u043e\u043a \u0441\u0447\u0435\u0442\u0447\u0438\u043a\u043e\u0432 \u0441\u043e\u0431\u044b\u0442\u0438\u0439.\"\"\"\n\n    event_buttons_texts = {}\n\n    event_buttons_texts['\u041d\u0435\u0438\u0437\u0432\u0435\u0441\u0442\u043d\u043e'] = self.unknown_reason_button.get_text(0)\n    event_buttons_texts['\u041f\u0440\u0435\u0434\u0443\u043f\u0440\u0435\u0436\u0434\u0435\u043d\u0438\u0435'] = self.warning_button.get_text(0)\n    event_buttons_texts['\u041f\u043e\u0432\u0440\u0435\u0436\u0434\u0435\u043d\u0438\u0435'] = self.damage_button.get_text(0)\n    event_buttons_texts['\u0410\u0432\u0430\u0440\u0438\u044f'] = self.failure_button.get_text(0)\n\n    return event_buttons_texts\n
    "},{"location":"components/eventbar_component/#components.eventbar_component.EventPanelComponent.get_event_tooltip_texts","title":"get_event_tooltip_texts()","text":"

    \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0441\u043f\u0438\u0441\u043e\u043a \u0442\u0435\u043a\u0441\u0442\u043e\u0432 \u0432\u0441\u043f\u043b\u044b\u0432\u0430\u044e\u0449\u0438\u0445 \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043e\u043a \u043a\u043d\u043e\u043f\u043e\u043a \u0441\u0447\u0435\u0442\u0447\u0438\u043a\u043e\u0432 \u0441\u043e\u0431\u044b\u0442\u0438\u0439.

    Source code in components\\eventbar_component.py
    def get_event_tooltip_texts(self) -> []:\n    \"\"\"\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0441\u043f\u0438\u0441\u043e\u043a \u0442\u0435\u043a\u0441\u0442\u043e\u0432 \u0432\u0441\u043f\u043b\u044b\u0432\u0430\u044e\u0449\u0438\u0445 \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043e\u043a \u043a\u043d\u043e\u043f\u043e\u043a \u0441\u0447\u0435\u0442\u0447\u0438\u043a\u043e\u0432 \u0441\u043e\u0431\u044b\u0442\u0438\u0439.\"\"\"\n\n    tooltip_texts = []\n\n    tooltip_texts.append(self.unknown_reason_button.get_tooltip_text())\n    tooltip_texts.append(self.warning_button.get_tooltip_text())\n    tooltip_texts.append(self.damage_button.get_tooltip_text())\n    tooltip_texts.append(self.failure_button.get_tooltip_text())\n\n    return tooltip_texts\n
    "},{"location":"components/eventbar_component/#components.eventbar_component.EventPanelComponent.get_panel_position","title":"get_panel_position()","text":"

    \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0442\u0435\u043a\u0443\u0449\u0435\u0435 \u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043f\u0430\u043d\u0435\u043b\u0438 \u0441\u043e\u0431\u044b\u0442\u0438\u0439 \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b: \"top\", \"center\",\"bottom\".

    Source code in components\\eventbar_component.py
    def get_panel_position(self) -> str:\n    \"\"\"\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0442\u0435\u043a\u0443\u0449\u0435\u0435 \u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043f\u0430\u043d\u0435\u043b\u0438 \u0441\u043e\u0431\u044b\u0442\u0438\u0439 \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b: \"top\", \"center\",\"bottom\".\"\"\"\n\n    style_attr = self.page.locator(EventPanelLocators.AREA_EVENTS).get_attribute(\"style\")\n    position = \"bottom\"\n\n    if style_attr.find(\"display: none;\") == -1:\n        height = style_attr.replace(\"height: \",\"\").replace(\";\", \"\")\n        if height == \"100%\":\n            position = \"top\"\n        else:\n            position = \"center\"\n\n    return position\n
    "},{"location":"components/eventbar_component/#components.eventbar_component.EventPanelComponent.should_be_event_buttons","title":"should_be_event_buttons()","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0431\u043b\u043e\u043a\u0430 \u043a\u043d\u043e\u043f\u043e\u043a-\u0441\u0447\u0435\u0442\u0447\u0438\u043a\u043e\u0432 \u0441\u043e\u0431\u044b\u0442\u0438\u0439.

    Source code in components\\eventbar_component.py
    def should_be_event_buttons(self) -> None:\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0431\u043b\u043e\u043a\u0430 \u043a\u043d\u043e\u043f\u043e\u043a-\u0441\u0447\u0435\u0442\u0447\u0438\u043a\u043e\u0432 \u0441\u043e\u0431\u044b\u0442\u0438\u0439.\"\"\"\n\n    self.unknown_reason_button.check_visibility(\"Unknown reason event button is missing on event panel\")\n    self.warning_button.check_visibility(\"Warning event button is missing on event panel\")\n    self.damage_button.check_visibility(\"Damage event button is missing on event panel\")\n    self.failure_button.check_visibility(\"Failure event button is missing on event panel\")\n
    "},{"location":"components/eventbar_component/#components.eventbar_component.EventPanelComponent.should_be_search_button","title":"should_be_search_button()","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u043a\u043d\u043e\u043f\u043a\u0438 \u043f\u043e\u0438\u0441\u043a\u0430.

    Source code in components\\eventbar_component.py
    def should_be_search_button(self) -> None:\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u043a\u043d\u043e\u043f\u043a\u0438 \u043f\u043e\u0438\u0441\u043a\u0430.\"\"\"\n\n    self.search_button.check_visibility(\"Search button is missing on event panel\")\n
    "},{"location":"components/eventbar_component/#components.eventbar_component.EventPanelComponent.should_be_tab_buttons","title":"should_be_tab_buttons()","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0431\u043b\u043e\u043a\u0430 tab-\u043a\u043d\u043e\u043f\u043e\u043a \u0421\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f, \u0414\u0435\u0439\u0441\u0442\u0432\u0438\u044f, \u0421\u043e\u0431\u044b\u0442\u0438\u044f, \u041e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u043d\u0438\u0435, \u0421\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0439 \u0436\u0443\u0440\u043d\u0430\u043b.

    Source code in components\\eventbar_component.py
    def should_be_tab_buttons(self) -> None:\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0431\u043b\u043e\u043a\u0430 tab-\u043a\u043d\u043e\u043f\u043e\u043a \u0421\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f, \u0414\u0435\u0439\u0441\u0442\u0432\u0438\u044f, \u0421\u043e\u0431\u044b\u0442\u0438\u044f, \u041e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u043d\u0438\u0435, \u0421\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0439 \u0436\u0443\u0440\u043d\u0430\u043b.\"\"\"\n\n    self.states_tab.check_have_text('\u0421\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f', \"Tab button with text \u0421\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f is missing on event panel\")\n    self.actions_tab.check_have_text('\u0414\u0435\u0439\u0441\u0442\u0432\u0438\u044f',\"Tab button with text \u0414\u0435\u0439\u0441\u0442\u0432\u0438\u044f is missing on event panel\")\n    self.events_tab.check_have_text('\u0421\u043e\u0431\u044b\u0442\u0438\u044f', \"Tab button with text \u0421\u043e\u0431\u044b\u0442\u0438\u044f is missing on event panel\")\n    self.maintenance_tab.check_have_text('\u041e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u043d\u0438\u0435', \"Tab button with text \u041e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u043d\u0438\u0435 is missing on event panel\")\n    self.system_log_tab.check_have_text('\u0421\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0439 \u0436\u0443\u0440\u043d\u0430\u043b', \"Tab button with text \u0421\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0439 \u0436\u0443\u0440\u043d\u0430\u043b is missing on event panel\")\n
    "},{"location":"components/eventbar_component/#components.eventbar_component.EventPanelComponent.should_be_user_button","title":"should_be_user_button()","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u043a\u043d\u043e\u043f\u043a\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.

    Source code in components\\eventbar_component.py
    def should_be_user_button(self) -> None:\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u043a\u043d\u043e\u043f\u043a\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\"\"\"\n\n    self.user_button.check_visibility(\"User button is missing on event panel\")\n
    "},{"location":"components/events_container_component/","title":"EventsContainerComponent","text":"

    \u041c\u043e\u0434\u0443\u043b\u044c \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430 \u0441 \u043f\u0435\u0440\u0435\u0447\u043d\u0435\u043c \u0441\u043e\u0431\u044b\u0442\u0438\u0439. \u0421\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043a\u043b\u0430\u0441\u0441 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430\u043c\u0438, \u0438\u0445 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u043c\u0438 \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430\u043c\u0438.

    "},{"location":"components/events_container_component/#components.events_container_component.EventsContainerComponent","title":"EventsContainerComponent","text":"

    Bases: BaseComponent

    \u041a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430 \u0441 \u043f\u0435\u0440\u0435\u0447\u043d\u0435\u043c \u0441\u043e\u0431\u044b\u0442\u0438\u0439. \u041f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u043c\u0435\u0442\u043e\u0434\u044b \u0434\u043b\u044f \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0441 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u043e\u043c, \u0435\u0433\u043e \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u044b\u043c \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u043e\u043a.

    Source code in components\\events_container_component.py
    class EventsContainerComponent(BaseComponent):\n    \"\"\"\u041a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430 \u0441 \u043f\u0435\u0440\u0435\u0447\u043d\u0435\u043c \u0441\u043e\u0431\u044b\u0442\u0438\u0439. \u041f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u043c\u0435\u0442\u043e\u0434\u044b \u0434\u043b\u044f \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0441 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u043e\u043c,\n    \u0435\u0433\u043e \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u044b\u043c \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u043e\u043a.\"\"\"\n\n    def __init__(self, page: Page, locator: str | Locator):\n        \"\"\"\u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442 \u0431\u0430\u0437\u043e\u0432\u044b\u0439 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440.\n\n        Args:\n            page: \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright\n            locator: \u041b\u043e\u043a\u0430\u0442\u043e\u0440 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430 (\u0441\u0442\u0440\u043e\u043a\u0430 \u0438\u043b\u0438 \u043e\u0431\u044a\u0435\u043a\u0442 Locator)\n        \"\"\"\n        super().__init__(page)\n\n        self.container_locator = self.get_locator(locator)\n\n        # \u0442\u0443\u043b\u0431\u0430\u0440\n        self.toolbar = ToolbarComponent(page, \"\")\n        filter_button_locator = self.container_locator.locator(ToolbarLocators.TITLE).\\\n                                get_by_role(\"button\")\n        self.toolbar.add_button(filter_button_locator, \"filter_button\")\n\n        export_buttons = self.container_locator.locator(ToolbarLocators.ITEMS).\\\n                                get_by_role(\"button\").all()\n        self.toolbar.add_tooltip_button(export_buttons[1], \"export_to_csv_button\")\n        self.toolbar.add_tooltip_button(export_buttons[0], \"export_to_pdf_button\")\n\n        # \u0422\u0430\u0431\u043b\u0438\u0446\u0430 \u0441\u043e\u0431\u044b\u0442\u0438\u0439\n        self.events_table = TableComponent(page)\n        self.table_locator = \"//div[@class='scrolltable']/div/table\"\n\n        # \u041a\u043d\u043e\u043f\u043a\u0438 \u043f\u0430\u0433\u0438\u043d\u0430\u0446\u0438\u0438 \u0432 \u043d\u0438\u0436\u043d\u0435\u0439 \u0447\u0430\u0441\u0442\u0438 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430\n        self.chevron_left = Button(page,\n                                   self.container_locator.get_by_role(\"button\").filter(has_text='chevron_left'),\n                                   \"chevron_left\")\n        self.chevron_right = Button(page,\n                                   self.container_locator.get_by_role(\"button\").filter(has_text='chevron_right'),\n                                   \"chevron_right\")\n\n        loc = self.container_locator.get_by_role(\"button\").filter(has_text='chevron_left').\\\n              locator(\"xpath=..\").get_by_role(\"button\").nth(1)\n        self.data_set_number = Button(page, loc, \"data_set_number\")\n\n    # \u0414\u0435\u0439\u0441\u0442\u0432\u0438\u044f:\n    def add_tab_to_toolbar(self, locator: str | Locator, name: str) -> None:\n        \"\"\"\u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043a\u043d\u043e\u043f\u043a\u0438 \u0442\u0438\u043f\u0430 v-tabs \u043a \u0442\u0443\u043b\u0431\u0430\u0440\u0443\"\"\"\n\n        tabs_locator = self.get_locator(locator)\n        self.toolbar.add_tab_button(self.container_locator.locator(tabs_locator), name)\n\n    def click_chevron_left(self) -> None:\n        \"\"\"\u041d\u0430\u0436\u0430\u0442\u0438\u0435 \u043a\u043d\u043e\u043f\u043a\u0438 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0433\u043e \u043d\u0430\u0431\u043e\u0440\u0430 \u0434\u0430\u043d\u043d\u044b\u0445\"\"\"\n\n        self.chevron_left.click()\n\n    def click_chevron_right(self) -> None:\n        \"\"\"\u041d\u0430\u0436\u0430\u0442\u0438\u0435 \u043a\u043d\u043e\u043f\u043a\u0438 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0433\u043e \u043d\u0430\u0431\u043e\u0440\u0430 \u0434\u0430\u043d\u043d\u044b\u0445\"\"\"\n\n        self.chevron_right.click()\n\n    def click_event_table_header_arrow(self, index: int) -> None:\n        \"\"\" \u041d\u0430\u0436\u0430\u0442\u0438\u0435 \u043a\u043d\u043e\u043f\u043a\u0438-\u0441\u0442\u0440\u0435\u043b\u043e\u0447\u043a\u0438 \u0432\u0432\u0435\u0440\u0445/\u0432\u043d\u0438\u0437 \u0432 \u044f\u0447\u0435\u0439\u043a\u0435 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430 \u0442\u0430\u0431\u043b\u0438\u0446\u044b\n\n        Args:\n            index: \u0418\u043d\u0434\u0435\u043a\u0441 \u044f\u0447\u0435\u0439\u043a\u0438 \u0432 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0435.\n        \"\"\"\n        loc = self.container_locator.locator(self.table_locator)\n        self.events_table.click_arrow_button(loc, index)\n\n    def datetime2timestamp(self, date_string: str) -> float:\n        \"\"\" \u041a\u043e\u043d\u0432\u0435\u0440\u0442\u0430\u0446\u0438\u044f \u0441\u0442\u0440\u043e\u043a\u043e\u0432\u043e\u0433\u043e \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0434\u0430\u0442\u044b \u0438 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0432 Unix timestamp \"\"\"\n\n        # \u0424\u043e\u0440\u043c\u0430\u0442, \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 \u0441\u0442\u0440\u043e\u043a\u0435 \u0441 \u0434\u0430\u0442\u043e\u0439 \u0438 \u0432\u0440\u0435\u043c\u0435\u043d\u0435\u043c\n        format_string = \"%d.%m.%Y %H:%M:%S\"\n\n        date_object = datetime.strptime(date_string, format_string)\n        return date_object.timestamp()\n\n    def get_current_data_set_number(self) -> int:\n        \"\"\"\u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u043d\u043e\u043c\u0435\u0440\u0430 \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u043d\u0430\u0431\u043e\u0440\u0430 \u0434\u0430\u043d\u043d\u044b\u0445\"\"\"\n\n        try:\n            data_set_number = int(self.data_set_number.get_text(0))\n        except ValueError as e:\n            assert False, f\"Value Error: {e}\"\n\n        return data_set_number\n\n    def get_arrow_button_state(self, index: int) -> str:\n        \"\"\" \u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u043a\u043d\u043e\u043f\u043a\u0438-\u0441\u0442\u0440\u0435\u043b\u043e\u0447\u043a\u0438 \u0432\u0432\u0435\u0440\u0445/\u0432\u043d\u0438\u0437 \u0432 \u044f\u0447\u0435\u0439\u043a\u0435 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430 \u0442\u0430\u0431\u043b\u0438\u0446\u044b\n\n        Args:\n            index: \u0418\u043d\u0434\u0435\u043a\u0441 \u044f\u0447\u0435\u0439\u043a\u0438 \u0432 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0435.\n\n        Returns:\n            up, \u0435\u0441\u043b\u0438 \u044d\u0442\u043e \u0441\u0442\u0440\u0435\u043b\u043e\u0447\u043a\u0430 \u0432\u0432\u0435\u0440\u0445. down, \u0435\u0441\u043b\u0438 \u044d\u0442\u043e \u0441\u0442\u0440\u0435\u043b\u043e\u0447\u043a\u0430 \u0432\u043d\u0438\u0437.\n        \"\"\"\n        loc = self.container_locator.locator(self.table_locator)\n        return self.events_table.get_arrow_button_state(loc, index)\n\n    def get_events_table_content(self) -> list[list[str]]:\n        \"\"\"\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u044b, \u0432\u043a\u043b\u044e\u0447\u0430\u044f \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0438.\n\n        Returns:\n            \u0414\u0432\u0443\u043c\u0435\u0440\u043d\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a \u0441 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u044b\u043c \u0442\u0430\u0431\u043b\u0438\u0446\u044b.\n        \"\"\"\n\n        loc = self.container_locator.locator(self.table_locator)\n        return self.events_table.read(loc)\n\n    def get_events_table_rows_count(self) -> int:\n        \"\"\"\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0441\u0442\u0440\u043e\u043a \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435 (\u0431\u0435\u0437 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430).\n\n        Returns:\n            int: \u041a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0441\u0442\u0440\u043e\u043a \u0441 \u0434\u0430\u043d\u043d\u044b\u043c\u0438.\n\n        Raises:\n            AssertionError: \u0415\u0441\u043b\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u043f\u0443\u0441\u0442\u0430.\n        \"\"\"\n\n        loc = self.container_locator.locator(self.table_locator)\n        return self.events_table.get_rows_count(loc)\n\n    def get_toolbar_filter_button(self) -> Button:\n        \"\"\"\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043a\u043d\u043e\u043f\u043a\u0443 \u0444\u0438\u043b\u044c\u0442\u0440\u0430\u0446\u0438\u0438.\"\"\"\n\n        return self.toolbar.get_button_by_name(\"filter_button\")\n\n    def get_toolbar_export_to_csv_button(self) -> TooltipButton:\n        \"\"\"\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043a\u043d\u043e\u043f\u043a\u0443 \u044d\u043a\u0441\u043f\u043e\u0440\u0442\u0430 \u0432 csv.\"\"\"\n\n        return self.toolbar.get_button_by_name(\"export_to_csv_button\")\n\n    def get_toolbar_export_to_pdf_button(self) -> TooltipButton:\n        \"\"\"\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043a\u043d\u043e\u043f\u043a\u0443 \u044d\u043a\u0441\u043f\u043e\u0440\u0442\u0430 \u0432 pdf.\"\"\"\n\n        return self.toolbar.get_button_by_name(\"export_to_pdf_button\")\n\n    def get_toolbar_tab_button(self, name: str) -> TabButton:\n        \"\"\"\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043a\u043d\u043e\u043f\u043a\u0443 \u0442\u0438\u043f\u0430 v-tabs \u043f\u043e \u0438\u043c\u0435\u043d\u0438.\"\"\"\n\n        return self.toolbar.get_button_by_name(name)\n\n    def scroll_events_table_up(self) -> None:\n        \"\"\"\u041f\u0440\u043e\u043a\u0440\u0443\u0447\u0438\u0432\u0430\u0435\u0442 \u0442\u0430\u0431\u043b\u0438\u0446\u0443 \u0441\u043e\u0431\u044b\u0442\u0438\u0439 \u0432\u0432\u0435\u0440\u0445.\"\"\"\n\n        loc = self.container_locator.locator(\"//div[@class='scrolltable']//table/tbody\")\n        self.events_table.scroll_up(loc)\n\n    def scroll_events_table_down(self) -> None:\n        \"\"\"\u041f\u0440\u043e\u043a\u0440\u0443\u0447\u0438\u0432\u0430\u0435\u0442 \u0442\u0430\u0431\u043b\u0438\u0446\u0443 \u0441\u043e\u0431\u044b\u0442\u0438\u0439 \u0432\u043d\u0438\u0437.\"\"\"\n\n        loc = self.container_locator.locator(\"//div[@class='scrolltable']//table/tbody\")\n        self.events_table.scroll_down(loc)\n\n    # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0438:\n    def check_events_table_headers(self, actual_headers, expected_headers) -> None:\n        \"\"\" \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u044f \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u043e\u0436\u0438\u0434\u0430\u0435\u043c\u043e\u043c\u0443\"\"\"\n\n        self.events_table.check_table_headers(actual_headers, expected_headers)\n\n    def check_events_table_column_descending_order(self,\n                                                       index: int) -> bool:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430, \u0447\u0442\u043e \u0437\u0430\u0434\u0430\u043d\u043d\u044b\u0439 \u0441\u0442\u043e\u043b\u0431\u0435\u0446 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0443\u043f\u043e\u0440\u044f\u0434\u043e\u0447\u0435\u043d \u043f\u043e \u0443\u0431\u044b\u0432\u0430\u043d\u0438\u044e.\n\n        Args:\n            index: \u0418\u043d\u0434\u0435\u043a\u0441 \u0441\u0442\u043e\u043b\u0431\u0446\u0430.\n\n        Returns:\n            True, \u0435\u0441\u043b\u0438 \u0441\u0442\u043e\u043b\u0431\u0435\u0446 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0443\u043f\u043e\u0440\u044f\u0434\u043e\u0447\u0435\u043d \u043f\u043e \u0443\u0431\u044b\u0432\u0430\u043d\u0438\u044e. \u0418\u043d\u0430\u0447\u0435: False\n        \"\"\"\n\n        loc = self.container_locator.locator(self.table_locator)\n        return self.events_table.check_column_descending_order(loc, index)\n\n    def check_events_table_row_highlighting(self, row_index: int) -> None:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u044b.\n\n        Args:\n            row_index: \u0418\u043d\u0434\u0435\u043a\u0441 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438.\n\n        Raises:\n            AssertionError: \u0415\u0441\u043b\u0438 \u0441\u0442\u0440\u043e\u043a\u0430 \u043d\u0435 \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u0430.\n        \"\"\"\n\n        loc = self.container_locator.locator(self.table_locator)\n        self.events_table.check_row_highlighting(loc, row_index)\n\n    def check_events_table_first_row_visibility(self) -> None:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u043f\u0435\u0440\u0432\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u044b.\n\n        Raises:\n            AssertionError: \u0415\u0441\u043b\u0438 \u0441\u0442\u0440\u043e\u043a\u0430 \u043d\u0435 \u0432\u0438\u0434\u043d\u0430.\n        \"\"\"\n\n        loc = self.container_locator.locator(self.table_locator)\n        self.events_table.check_first_row_visibility(loc)\n\n    def check_events_table_last_row_visibility(self) -> None:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0439 \u0441\u0442\u0440\u043e\u043a\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u044b.\n\n        Raises:\n            AssertionError: \u0415\u0441\u043b\u0438 \u0441\u0442\u0440\u043e\u043a\u0430 \u043d\u0435 \u0432\u0438\u0434\u043d\u0430.\n        \"\"\"\n\n        loc = self.container_locator.locator(self.table_locator)\n        self.events_table.check_last_row_visibility(loc)\n\n    def check_events_table_verticall_scrolling(self) -> bool:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u0439 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u044b.\n\n        Returns:\n            bool: True \u0435\u0441\u043b\u0438 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0430 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u0430, \u0438\u043d\u0430\u0447\u0435 False.\n        \"\"\"\n\n        loc = self.container_locator.locator(\"//div[@class='scrolltable']//table/tbody\")\n        return self.events_table.is_scrollable_vertically(loc)\n\n    def is_chevron_left_disabled(self) -> bool:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u043a\u043d\u043e\u043f\u043a\u0438 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0433\u043e \u043d\u0430\u0431\u043e\u0440\u0430 \u0434\u0430\u043d\u043d\u044b\u0445\"\"\"\n\n        return self.chevron_left.is_disabled()\n\n    def is_chevron_right_disabled(self) -> bool:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u043a\u043d\u043e\u043f\u043a\u0438 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0433\u043e \u043d\u0430\u0431\u043e\u0440\u0430 \u0434\u0430\u043d\u043d\u044b\u0445\"\"\"\n\n        return self.chevron_right.is_disabled()\n\n    def should_be_events_table(self) -> None:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0441\u043e\u0431\u044b\u0442\u0438\u0439.\n\n        Raises:\n            AssertionError: \u0415\u0441\u043b\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442.\n        \"\"\"\n\n        loc = self.container_locator.locator(self.table_locator)\n        self.events_table.check_visibility(loc,\n            \"Events table is missing\"\n        )\n\n    def should_be_toolbar(self) -> None:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043d\u0430\u043b\u0438\u0447\u0438\u044f \u0442\u0443\u043b\u0431\u0430\u0440\u0430\"\"\"\n\n        loc = self.container_locator.locator(\"//nav[contains(@class, 'v-toolbar')]\").nth(0)\n        self.toolbar.check_toolbar_presence_by_locator(loc, \"Toolbar is missing\")\n\n    def should_be_base_toolbar_buttons(self) -> None:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0438 \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u0431\u0430\u0437\u043e\u0432\u044b\u0445 \u043a\u043d\u043e\u043f\u043e\u043a \u0442\u0443\u043b\u0431\u0430\u0440\u0430.\"\"\"\n\n        self.toolbar.check_button_visibility(\"filter_button\")\n        self.toolbar.check_button_visibility(\"export_to_pdf_button\")\n        self.toolbar.check_button_tooltip(\"export_to_pdf_button\", \"\u0421\u043a\u0430\u0447\u0430\u0442\u044c \u0432 \u0444\u043e\u0440\u043c\u0430\u0442\u0435 PDF\")\n        self.toolbar.check_button_visibility(\"export_to_csv_button\")\n        self.toolbar.check_button_tooltip(\"export_to_csv_button\", \"\u0421\u043a\u0430\u0447\u0430\u0442\u044c \u0432 \u0444\u043e\u0440\u043c\u0430\u0442\u0435 CSV\")\n\n\n    def should_be_pagination_buttons(self) -> None:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0438 \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u043a\u043d\u043e\u043f\u043e\u043a \u043f\u0430\u0433\u0438\u043d\u0430\u0446\u0438\u0438.\"\"\"\n\n        self.chevron_left.check_visibility(\"Pagination button 'chevron left' is missing\")\n        self.data_set_number.check_visibility(\"Pagination button 'data set number' is missing\")\n        self.chevron_right.check_visibility(\"Pagination button 'chevron right' is missing\")\n
    "},{"location":"components/events_container_component/#components.events_container_component.EventsContainerComponent.__init__","title":"__init__(page, locator)","text":"

    \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442 \u0431\u0430\u0437\u043e\u0432\u044b\u0439 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440.

    Parameters:

    Name Type Description Default page Page

    \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright

    required locator str | Locator

    \u041b\u043e\u043a\u0430\u0442\u043e\u0440 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430 (\u0441\u0442\u0440\u043e\u043a\u0430 \u0438\u043b\u0438 \u043e\u0431\u044a\u0435\u043a\u0442 Locator)

    required Source code in components\\events_container_component.py
    def __init__(self, page: Page, locator: str | Locator):\n    \"\"\"\u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442 \u0431\u0430\u0437\u043e\u0432\u044b\u0439 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440.\n\n    Args:\n        page: \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright\n        locator: \u041b\u043e\u043a\u0430\u0442\u043e\u0440 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430 (\u0441\u0442\u0440\u043e\u043a\u0430 \u0438\u043b\u0438 \u043e\u0431\u044a\u0435\u043a\u0442 Locator)\n    \"\"\"\n    super().__init__(page)\n\n    self.container_locator = self.get_locator(locator)\n\n    # \u0442\u0443\u043b\u0431\u0430\u0440\n    self.toolbar = ToolbarComponent(page, \"\")\n    filter_button_locator = self.container_locator.locator(ToolbarLocators.TITLE).\\\n                            get_by_role(\"button\")\n    self.toolbar.add_button(filter_button_locator, \"filter_button\")\n\n    export_buttons = self.container_locator.locator(ToolbarLocators.ITEMS).\\\n                            get_by_role(\"button\").all()\n    self.toolbar.add_tooltip_button(export_buttons[1], \"export_to_csv_button\")\n    self.toolbar.add_tooltip_button(export_buttons[0], \"export_to_pdf_button\")\n\n    # \u0422\u0430\u0431\u043b\u0438\u0446\u0430 \u0441\u043e\u0431\u044b\u0442\u0438\u0439\n    self.events_table = TableComponent(page)\n    self.table_locator = \"//div[@class='scrolltable']/div/table\"\n\n    # \u041a\u043d\u043e\u043f\u043a\u0438 \u043f\u0430\u0433\u0438\u043d\u0430\u0446\u0438\u0438 \u0432 \u043d\u0438\u0436\u043d\u0435\u0439 \u0447\u0430\u0441\u0442\u0438 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430\n    self.chevron_left = Button(page,\n                               self.container_locator.get_by_role(\"button\").filter(has_text='chevron_left'),\n                               \"chevron_left\")\n    self.chevron_right = Button(page,\n                               self.container_locator.get_by_role(\"button\").filter(has_text='chevron_right'),\n                               \"chevron_right\")\n\n    loc = self.container_locator.get_by_role(\"button\").filter(has_text='chevron_left').\\\n          locator(\"xpath=..\").get_by_role(\"button\").nth(1)\n    self.data_set_number = Button(page, loc, \"data_set_number\")\n
    "},{"location":"components/events_container_component/#components.events_container_component.EventsContainerComponent.add_tab_to_toolbar","title":"add_tab_to_toolbar(locator, name)","text":"

    \u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043a\u043d\u043e\u043f\u043a\u0438 \u0442\u0438\u043f\u0430 v-tabs \u043a \u0442\u0443\u043b\u0431\u0430\u0440\u0443

    Source code in components\\events_container_component.py
    def add_tab_to_toolbar(self, locator: str | Locator, name: str) -> None:\n    \"\"\"\u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043a\u043d\u043e\u043f\u043a\u0438 \u0442\u0438\u043f\u0430 v-tabs \u043a \u0442\u0443\u043b\u0431\u0430\u0440\u0443\"\"\"\n\n    tabs_locator = self.get_locator(locator)\n    self.toolbar.add_tab_button(self.container_locator.locator(tabs_locator), name)\n
    "},{"location":"components/events_container_component/#components.events_container_component.EventsContainerComponent.check_events_table_column_descending_order","title":"check_events_table_column_descending_order(index)","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430, \u0447\u0442\u043e \u0437\u0430\u0434\u0430\u043d\u043d\u044b\u0439 \u0441\u0442\u043e\u043b\u0431\u0435\u0446 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0443\u043f\u043e\u0440\u044f\u0434\u043e\u0447\u0435\u043d \u043f\u043e \u0443\u0431\u044b\u0432\u0430\u043d\u0438\u044e.

    Parameters:

    Name Type Description Default index int

    \u0418\u043d\u0434\u0435\u043a\u0441 \u0441\u0442\u043e\u043b\u0431\u0446\u0430.

    required

    Returns:

    Type Description bool

    True, \u0435\u0441\u043b\u0438 \u0441\u0442\u043e\u043b\u0431\u0435\u0446 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0443\u043f\u043e\u0440\u044f\u0434\u043e\u0447\u0435\u043d \u043f\u043e \u0443\u0431\u044b\u0432\u0430\u043d\u0438\u044e. \u0418\u043d\u0430\u0447\u0435: False

    Source code in components\\events_container_component.py
    def check_events_table_column_descending_order(self,\n                                                   index: int) -> bool:\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430, \u0447\u0442\u043e \u0437\u0430\u0434\u0430\u043d\u043d\u044b\u0439 \u0441\u0442\u043e\u043b\u0431\u0435\u0446 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0443\u043f\u043e\u0440\u044f\u0434\u043e\u0447\u0435\u043d \u043f\u043e \u0443\u0431\u044b\u0432\u0430\u043d\u0438\u044e.\n\n    Args:\n        index: \u0418\u043d\u0434\u0435\u043a\u0441 \u0441\u0442\u043e\u043b\u0431\u0446\u0430.\n\n    Returns:\n        True, \u0435\u0441\u043b\u0438 \u0441\u0442\u043e\u043b\u0431\u0435\u0446 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0443\u043f\u043e\u0440\u044f\u0434\u043e\u0447\u0435\u043d \u043f\u043e \u0443\u0431\u044b\u0432\u0430\u043d\u0438\u044e. \u0418\u043d\u0430\u0447\u0435: False\n    \"\"\"\n\n    loc = self.container_locator.locator(self.table_locator)\n    return self.events_table.check_column_descending_order(loc, index)\n
    "},{"location":"components/events_container_component/#components.events_container_component.EventsContainerComponent.check_events_table_first_row_visibility","title":"check_events_table_first_row_visibility()","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u043f\u0435\u0440\u0432\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u044b.

    Raises:

    Type Description AssertionError

    \u0415\u0441\u043b\u0438 \u0441\u0442\u0440\u043e\u043a\u0430 \u043d\u0435 \u0432\u0438\u0434\u043d\u0430.

    Source code in components\\events_container_component.py
    def check_events_table_first_row_visibility(self) -> None:\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u043f\u0435\u0440\u0432\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u044b.\n\n    Raises:\n        AssertionError: \u0415\u0441\u043b\u0438 \u0441\u0442\u0440\u043e\u043a\u0430 \u043d\u0435 \u0432\u0438\u0434\u043d\u0430.\n    \"\"\"\n\n    loc = self.container_locator.locator(self.table_locator)\n    self.events_table.check_first_row_visibility(loc)\n
    "},{"location":"components/events_container_component/#components.events_container_component.EventsContainerComponent.check_events_table_headers","title":"check_events_table_headers(actual_headers, expected_headers)","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u044f \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u043e\u0436\u0438\u0434\u0430\u0435\u043c\u043e\u043c\u0443

    Source code in components\\events_container_component.py
    def check_events_table_headers(self, actual_headers, expected_headers) -> None:\n    \"\"\" \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u044f \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u043e\u0436\u0438\u0434\u0430\u0435\u043c\u043e\u043c\u0443\"\"\"\n\n    self.events_table.check_table_headers(actual_headers, expected_headers)\n
    "},{"location":"components/events_container_component/#components.events_container_component.EventsContainerComponent.check_events_table_last_row_visibility","title":"check_events_table_last_row_visibility()","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0439 \u0441\u0442\u0440\u043e\u043a\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u044b.

    Raises:

    Type Description AssertionError

    \u0415\u0441\u043b\u0438 \u0441\u0442\u0440\u043e\u043a\u0430 \u043d\u0435 \u0432\u0438\u0434\u043d\u0430.

    Source code in components\\events_container_component.py
    def check_events_table_last_row_visibility(self) -> None:\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0439 \u0441\u0442\u0440\u043e\u043a\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u044b.\n\n    Raises:\n        AssertionError: \u0415\u0441\u043b\u0438 \u0441\u0442\u0440\u043e\u043a\u0430 \u043d\u0435 \u0432\u0438\u0434\u043d\u0430.\n    \"\"\"\n\n    loc = self.container_locator.locator(self.table_locator)\n    self.events_table.check_last_row_visibility(loc)\n
    "},{"location":"components/events_container_component/#components.events_container_component.EventsContainerComponent.check_events_table_row_highlighting","title":"check_events_table_row_highlighting(row_index)","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u044b.

    Parameters:

    Name Type Description Default row_index int

    \u0418\u043d\u0434\u0435\u043a\u0441 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438.

    required

    Raises:

    Type Description AssertionError

    \u0415\u0441\u043b\u0438 \u0441\u0442\u0440\u043e\u043a\u0430 \u043d\u0435 \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u0430.

    Source code in components\\events_container_component.py
    def check_events_table_row_highlighting(self, row_index: int) -> None:\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u044b.\n\n    Args:\n        row_index: \u0418\u043d\u0434\u0435\u043a\u0441 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438.\n\n    Raises:\n        AssertionError: \u0415\u0441\u043b\u0438 \u0441\u0442\u0440\u043e\u043a\u0430 \u043d\u0435 \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u0430.\n    \"\"\"\n\n    loc = self.container_locator.locator(self.table_locator)\n    self.events_table.check_row_highlighting(loc, row_index)\n
    "},{"location":"components/events_container_component/#components.events_container_component.EventsContainerComponent.check_events_table_verticall_scrolling","title":"check_events_table_verticall_scrolling()","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u0439 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u044b.

    Returns:

    Name Type Description bool bool

    True \u0435\u0441\u043b\u0438 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0430 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u0430, \u0438\u043d\u0430\u0447\u0435 False.

    Source code in components\\events_container_component.py
    def check_events_table_verticall_scrolling(self) -> bool:\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u0439 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u044b.\n\n    Returns:\n        bool: True \u0435\u0441\u043b\u0438 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0430 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u0430, \u0438\u043d\u0430\u0447\u0435 False.\n    \"\"\"\n\n    loc = self.container_locator.locator(\"//div[@class='scrolltable']//table/tbody\")\n    return self.events_table.is_scrollable_vertically(loc)\n
    "},{"location":"components/events_container_component/#components.events_container_component.EventsContainerComponent.click_chevron_left","title":"click_chevron_left()","text":"

    \u041d\u0430\u0436\u0430\u0442\u0438\u0435 \u043a\u043d\u043e\u043f\u043a\u0438 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0433\u043e \u043d\u0430\u0431\u043e\u0440\u0430 \u0434\u0430\u043d\u043d\u044b\u0445

    Source code in components\\events_container_component.py
    def click_chevron_left(self) -> None:\n    \"\"\"\u041d\u0430\u0436\u0430\u0442\u0438\u0435 \u043a\u043d\u043e\u043f\u043a\u0438 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0433\u043e \u043d\u0430\u0431\u043e\u0440\u0430 \u0434\u0430\u043d\u043d\u044b\u0445\"\"\"\n\n    self.chevron_left.click()\n
    "},{"location":"components/events_container_component/#components.events_container_component.EventsContainerComponent.click_chevron_right","title":"click_chevron_right()","text":"

    \u041d\u0430\u0436\u0430\u0442\u0438\u0435 \u043a\u043d\u043e\u043f\u043a\u0438 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0433\u043e \u043d\u0430\u0431\u043e\u0440\u0430 \u0434\u0430\u043d\u043d\u044b\u0445

    Source code in components\\events_container_component.py
    def click_chevron_right(self) -> None:\n    \"\"\"\u041d\u0430\u0436\u0430\u0442\u0438\u0435 \u043a\u043d\u043e\u043f\u043a\u0438 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0433\u043e \u043d\u0430\u0431\u043e\u0440\u0430 \u0434\u0430\u043d\u043d\u044b\u0445\"\"\"\n\n    self.chevron_right.click()\n
    "},{"location":"components/events_container_component/#components.events_container_component.EventsContainerComponent.click_event_table_header_arrow","title":"click_event_table_header_arrow(index)","text":"

    \u041d\u0430\u0436\u0430\u0442\u0438\u0435 \u043a\u043d\u043e\u043f\u043a\u0438-\u0441\u0442\u0440\u0435\u043b\u043e\u0447\u043a\u0438 \u0432\u0432\u0435\u0440\u0445/\u0432\u043d\u0438\u0437 \u0432 \u044f\u0447\u0435\u0439\u043a\u0435 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430 \u0442\u0430\u0431\u043b\u0438\u0446\u044b

    Parameters:

    Name Type Description Default index int

    \u0418\u043d\u0434\u0435\u043a\u0441 \u044f\u0447\u0435\u0439\u043a\u0438 \u0432 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0435.

    required Source code in components\\events_container_component.py
    def click_event_table_header_arrow(self, index: int) -> None:\n    \"\"\" \u041d\u0430\u0436\u0430\u0442\u0438\u0435 \u043a\u043d\u043e\u043f\u043a\u0438-\u0441\u0442\u0440\u0435\u043b\u043e\u0447\u043a\u0438 \u0432\u0432\u0435\u0440\u0445/\u0432\u043d\u0438\u0437 \u0432 \u044f\u0447\u0435\u0439\u043a\u0435 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430 \u0442\u0430\u0431\u043b\u0438\u0446\u044b\n\n    Args:\n        index: \u0418\u043d\u0434\u0435\u043a\u0441 \u044f\u0447\u0435\u0439\u043a\u0438 \u0432 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0435.\n    \"\"\"\n    loc = self.container_locator.locator(self.table_locator)\n    self.events_table.click_arrow_button(loc, index)\n
    "},{"location":"components/events_container_component/#components.events_container_component.EventsContainerComponent.datetime2timestamp","title":"datetime2timestamp(date_string)","text":"

    \u041a\u043e\u043d\u0432\u0435\u0440\u0442\u0430\u0446\u0438\u044f \u0441\u0442\u0440\u043e\u043a\u043e\u0432\u043e\u0433\u043e \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0434\u0430\u0442\u044b \u0438 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0432 Unix timestamp

    Source code in components\\events_container_component.py
    def datetime2timestamp(self, date_string: str) -> float:\n    \"\"\" \u041a\u043e\u043d\u0432\u0435\u0440\u0442\u0430\u0446\u0438\u044f \u0441\u0442\u0440\u043e\u043a\u043e\u0432\u043e\u0433\u043e \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0434\u0430\u0442\u044b \u0438 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0432 Unix timestamp \"\"\"\n\n    # \u0424\u043e\u0440\u043c\u0430\u0442, \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 \u0441\u0442\u0440\u043e\u043a\u0435 \u0441 \u0434\u0430\u0442\u043e\u0439 \u0438 \u0432\u0440\u0435\u043c\u0435\u043d\u0435\u043c\n    format_string = \"%d.%m.%Y %H:%M:%S\"\n\n    date_object = datetime.strptime(date_string, format_string)\n    return date_object.timestamp()\n
    "},{"location":"components/events_container_component/#components.events_container_component.EventsContainerComponent.get_arrow_button_state","title":"get_arrow_button_state(index)","text":"

    \u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u043a\u043d\u043e\u043f\u043a\u0438-\u0441\u0442\u0440\u0435\u043b\u043e\u0447\u043a\u0438 \u0432\u0432\u0435\u0440\u0445/\u0432\u043d\u0438\u0437 \u0432 \u044f\u0447\u0435\u0439\u043a\u0435 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430 \u0442\u0430\u0431\u043b\u0438\u0446\u044b

    Parameters:

    Name Type Description Default index int

    \u0418\u043d\u0434\u0435\u043a\u0441 \u044f\u0447\u0435\u0439\u043a\u0438 \u0432 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0435.

    required

    Returns:

    Type Description str

    up, \u0435\u0441\u043b\u0438 \u044d\u0442\u043e \u0441\u0442\u0440\u0435\u043b\u043e\u0447\u043a\u0430 \u0432\u0432\u0435\u0440\u0445. down, \u0435\u0441\u043b\u0438 \u044d\u0442\u043e \u0441\u0442\u0440\u0435\u043b\u043e\u0447\u043a\u0430 \u0432\u043d\u0438\u0437.

    Source code in components\\events_container_component.py
    def get_arrow_button_state(self, index: int) -> str:\n    \"\"\" \u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u043a\u043d\u043e\u043f\u043a\u0438-\u0441\u0442\u0440\u0435\u043b\u043e\u0447\u043a\u0438 \u0432\u0432\u0435\u0440\u0445/\u0432\u043d\u0438\u0437 \u0432 \u044f\u0447\u0435\u0439\u043a\u0435 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430 \u0442\u0430\u0431\u043b\u0438\u0446\u044b\n\n    Args:\n        index: \u0418\u043d\u0434\u0435\u043a\u0441 \u044f\u0447\u0435\u0439\u043a\u0438 \u0432 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0435.\n\n    Returns:\n        up, \u0435\u0441\u043b\u0438 \u044d\u0442\u043e \u0441\u0442\u0440\u0435\u043b\u043e\u0447\u043a\u0430 \u0432\u0432\u0435\u0440\u0445. down, \u0435\u0441\u043b\u0438 \u044d\u0442\u043e \u0441\u0442\u0440\u0435\u043b\u043e\u0447\u043a\u0430 \u0432\u043d\u0438\u0437.\n    \"\"\"\n    loc = self.container_locator.locator(self.table_locator)\n    return self.events_table.get_arrow_button_state(loc, index)\n
    "},{"location":"components/events_container_component/#components.events_container_component.EventsContainerComponent.get_current_data_set_number","title":"get_current_data_set_number()","text":"

    \u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u043d\u043e\u043c\u0435\u0440\u0430 \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u043d\u0430\u0431\u043e\u0440\u0430 \u0434\u0430\u043d\u043d\u044b\u0445

    Source code in components\\events_container_component.py
    def get_current_data_set_number(self) -> int:\n    \"\"\"\u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u043d\u043e\u043c\u0435\u0440\u0430 \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u043d\u0430\u0431\u043e\u0440\u0430 \u0434\u0430\u043d\u043d\u044b\u0445\"\"\"\n\n    try:\n        data_set_number = int(self.data_set_number.get_text(0))\n    except ValueError as e:\n        assert False, f\"Value Error: {e}\"\n\n    return data_set_number\n
    "},{"location":"components/events_container_component/#components.events_container_component.EventsContainerComponent.get_events_table_content","title":"get_events_table_content()","text":"

    \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u044b, \u0432\u043a\u043b\u044e\u0447\u0430\u044f \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0438.

    Returns:

    Type Description list[list[str]]

    \u0414\u0432\u0443\u043c\u0435\u0440\u043d\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a \u0441 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u044b\u043c \u0442\u0430\u0431\u043b\u0438\u0446\u044b.

    Source code in components\\events_container_component.py
    def get_events_table_content(self) -> list[list[str]]:\n    \"\"\"\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u044b, \u0432\u043a\u043b\u044e\u0447\u0430\u044f \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0438.\n\n    Returns:\n        \u0414\u0432\u0443\u043c\u0435\u0440\u043d\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a \u0441 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u044b\u043c \u0442\u0430\u0431\u043b\u0438\u0446\u044b.\n    \"\"\"\n\n    loc = self.container_locator.locator(self.table_locator)\n    return self.events_table.read(loc)\n
    "},{"location":"components/events_container_component/#components.events_container_component.EventsContainerComponent.get_events_table_rows_count","title":"get_events_table_rows_count()","text":"

    \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0441\u0442\u0440\u043e\u043a \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435 (\u0431\u0435\u0437 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430).

    Returns:

    Name Type Description int int

    \u041a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0441\u0442\u0440\u043e\u043a \u0441 \u0434\u0430\u043d\u043d\u044b\u043c\u0438.

    Raises:

    Type Description AssertionError

    \u0415\u0441\u043b\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u043f\u0443\u0441\u0442\u0430.

    Source code in components\\events_container_component.py
    def get_events_table_rows_count(self) -> int:\n    \"\"\"\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0441\u0442\u0440\u043e\u043a \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435 (\u0431\u0435\u0437 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430).\n\n    Returns:\n        int: \u041a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0441\u0442\u0440\u043e\u043a \u0441 \u0434\u0430\u043d\u043d\u044b\u043c\u0438.\n\n    Raises:\n        AssertionError: \u0415\u0441\u043b\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u043f\u0443\u0441\u0442\u0430.\n    \"\"\"\n\n    loc = self.container_locator.locator(self.table_locator)\n    return self.events_table.get_rows_count(loc)\n
    "},{"location":"components/events_container_component/#components.events_container_component.EventsContainerComponent.get_toolbar_export_to_csv_button","title":"get_toolbar_export_to_csv_button()","text":"

    \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043a\u043d\u043e\u043f\u043a\u0443 \u044d\u043a\u0441\u043f\u043e\u0440\u0442\u0430 \u0432 csv.

    Source code in components\\events_container_component.py
    def get_toolbar_export_to_csv_button(self) -> TooltipButton:\n    \"\"\"\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043a\u043d\u043e\u043f\u043a\u0443 \u044d\u043a\u0441\u043f\u043e\u0440\u0442\u0430 \u0432 csv.\"\"\"\n\n    return self.toolbar.get_button_by_name(\"export_to_csv_button\")\n
    "},{"location":"components/events_container_component/#components.events_container_component.EventsContainerComponent.get_toolbar_export_to_pdf_button","title":"get_toolbar_export_to_pdf_button()","text":"

    \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043a\u043d\u043e\u043f\u043a\u0443 \u044d\u043a\u0441\u043f\u043e\u0440\u0442\u0430 \u0432 pdf.

    Source code in components\\events_container_component.py
    def get_toolbar_export_to_pdf_button(self) -> TooltipButton:\n    \"\"\"\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043a\u043d\u043e\u043f\u043a\u0443 \u044d\u043a\u0441\u043f\u043e\u0440\u0442\u0430 \u0432 pdf.\"\"\"\n\n    return self.toolbar.get_button_by_name(\"export_to_pdf_button\")\n
    "},{"location":"components/events_container_component/#components.events_container_component.EventsContainerComponent.get_toolbar_filter_button","title":"get_toolbar_filter_button()","text":"

    \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043a\u043d\u043e\u043f\u043a\u0443 \u0444\u0438\u043b\u044c\u0442\u0440\u0430\u0446\u0438\u0438.

    Source code in components\\events_container_component.py
    def get_toolbar_filter_button(self) -> Button:\n    \"\"\"\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043a\u043d\u043e\u043f\u043a\u0443 \u0444\u0438\u043b\u044c\u0442\u0440\u0430\u0446\u0438\u0438.\"\"\"\n\n    return self.toolbar.get_button_by_name(\"filter_button\")\n
    "},{"location":"components/events_container_component/#components.events_container_component.EventsContainerComponent.get_toolbar_tab_button","title":"get_toolbar_tab_button(name)","text":"

    \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043a\u043d\u043e\u043f\u043a\u0443 \u0442\u0438\u043f\u0430 v-tabs \u043f\u043e \u0438\u043c\u0435\u043d\u0438.

    Source code in components\\events_container_component.py
    def get_toolbar_tab_button(self, name: str) -> TabButton:\n    \"\"\"\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043a\u043d\u043e\u043f\u043a\u0443 \u0442\u0438\u043f\u0430 v-tabs \u043f\u043e \u0438\u043c\u0435\u043d\u0438.\"\"\"\n\n    return self.toolbar.get_button_by_name(name)\n
    "},{"location":"components/events_container_component/#components.events_container_component.EventsContainerComponent.is_chevron_left_disabled","title":"is_chevron_left_disabled()","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u043a\u043d\u043e\u043f\u043a\u0438 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0433\u043e \u043d\u0430\u0431\u043e\u0440\u0430 \u0434\u0430\u043d\u043d\u044b\u0445

    Source code in components\\events_container_component.py
    def is_chevron_left_disabled(self) -> bool:\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u043a\u043d\u043e\u043f\u043a\u0438 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0433\u043e \u043d\u0430\u0431\u043e\u0440\u0430 \u0434\u0430\u043d\u043d\u044b\u0445\"\"\"\n\n    return self.chevron_left.is_disabled()\n
    "},{"location":"components/events_container_component/#components.events_container_component.EventsContainerComponent.is_chevron_right_disabled","title":"is_chevron_right_disabled()","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u043a\u043d\u043e\u043f\u043a\u0438 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0433\u043e \u043d\u0430\u0431\u043e\u0440\u0430 \u0434\u0430\u043d\u043d\u044b\u0445

    Source code in components\\events_container_component.py
    def is_chevron_right_disabled(self) -> bool:\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u043a\u043d\u043e\u043f\u043a\u0438 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0433\u043e \u043d\u0430\u0431\u043e\u0440\u0430 \u0434\u0430\u043d\u043d\u044b\u0445\"\"\"\n\n    return self.chevron_right.is_disabled()\n
    "},{"location":"components/events_container_component/#components.events_container_component.EventsContainerComponent.scroll_events_table_down","title":"scroll_events_table_down()","text":"

    \u041f\u0440\u043e\u043a\u0440\u0443\u0447\u0438\u0432\u0430\u0435\u0442 \u0442\u0430\u0431\u043b\u0438\u0446\u0443 \u0441\u043e\u0431\u044b\u0442\u0438\u0439 \u0432\u043d\u0438\u0437.

    Source code in components\\events_container_component.py
    def scroll_events_table_down(self) -> None:\n    \"\"\"\u041f\u0440\u043e\u043a\u0440\u0443\u0447\u0438\u0432\u0430\u0435\u0442 \u0442\u0430\u0431\u043b\u0438\u0446\u0443 \u0441\u043e\u0431\u044b\u0442\u0438\u0439 \u0432\u043d\u0438\u0437.\"\"\"\n\n    loc = self.container_locator.locator(\"//div[@class='scrolltable']//table/tbody\")\n    self.events_table.scroll_down(loc)\n
    "},{"location":"components/events_container_component/#components.events_container_component.EventsContainerComponent.scroll_events_table_up","title":"scroll_events_table_up()","text":"

    \u041f\u0440\u043e\u043a\u0440\u0443\u0447\u0438\u0432\u0430\u0435\u0442 \u0442\u0430\u0431\u043b\u0438\u0446\u0443 \u0441\u043e\u0431\u044b\u0442\u0438\u0439 \u0432\u0432\u0435\u0440\u0445.

    Source code in components\\events_container_component.py
    def scroll_events_table_up(self) -> None:\n    \"\"\"\u041f\u0440\u043e\u043a\u0440\u0443\u0447\u0438\u0432\u0430\u0435\u0442 \u0442\u0430\u0431\u043b\u0438\u0446\u0443 \u0441\u043e\u0431\u044b\u0442\u0438\u0439 \u0432\u0432\u0435\u0440\u0445.\"\"\"\n\n    loc = self.container_locator.locator(\"//div[@class='scrolltable']//table/tbody\")\n    self.events_table.scroll_up(loc)\n
    "},{"location":"components/events_container_component/#components.events_container_component.EventsContainerComponent.should_be_base_toolbar_buttons","title":"should_be_base_toolbar_buttons()","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0438 \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u0431\u0430\u0437\u043e\u0432\u044b\u0445 \u043a\u043d\u043e\u043f\u043e\u043a \u0442\u0443\u043b\u0431\u0430\u0440\u0430.

    Source code in components\\events_container_component.py
    def should_be_base_toolbar_buttons(self) -> None:\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0438 \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u0431\u0430\u0437\u043e\u0432\u044b\u0445 \u043a\u043d\u043e\u043f\u043e\u043a \u0442\u0443\u043b\u0431\u0430\u0440\u0430.\"\"\"\n\n    self.toolbar.check_button_visibility(\"filter_button\")\n    self.toolbar.check_button_visibility(\"export_to_pdf_button\")\n    self.toolbar.check_button_tooltip(\"export_to_pdf_button\", \"\u0421\u043a\u0430\u0447\u0430\u0442\u044c \u0432 \u0444\u043e\u0440\u043c\u0430\u0442\u0435 PDF\")\n    self.toolbar.check_button_visibility(\"export_to_csv_button\")\n    self.toolbar.check_button_tooltip(\"export_to_csv_button\", \"\u0421\u043a\u0430\u0447\u0430\u0442\u044c \u0432 \u0444\u043e\u0440\u043c\u0430\u0442\u0435 CSV\")\n
    "},{"location":"components/events_container_component/#components.events_container_component.EventsContainerComponent.should_be_events_table","title":"should_be_events_table()","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0441\u043e\u0431\u044b\u0442\u0438\u0439.

    Raises:

    Type Description AssertionError

    \u0415\u0441\u043b\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442.

    Source code in components\\events_container_component.py
    def should_be_events_table(self) -> None:\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0441\u043e\u0431\u044b\u0442\u0438\u0439.\n\n    Raises:\n        AssertionError: \u0415\u0441\u043b\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442.\n    \"\"\"\n\n    loc = self.container_locator.locator(self.table_locator)\n    self.events_table.check_visibility(loc,\n        \"Events table is missing\"\n    )\n
    "},{"location":"components/events_container_component/#components.events_container_component.EventsContainerComponent.should_be_pagination_buttons","title":"should_be_pagination_buttons()","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0438 \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u043a\u043d\u043e\u043f\u043e\u043a \u043f\u0430\u0433\u0438\u043d\u0430\u0446\u0438\u0438.

    Source code in components\\events_container_component.py
    def should_be_pagination_buttons(self) -> None:\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0438 \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u043a\u043d\u043e\u043f\u043e\u043a \u043f\u0430\u0433\u0438\u043d\u0430\u0446\u0438\u0438.\"\"\"\n\n    self.chevron_left.check_visibility(\"Pagination button 'chevron left' is missing\")\n    self.data_set_number.check_visibility(\"Pagination button 'data set number' is missing\")\n    self.chevron_right.check_visibility(\"Pagination button 'chevron right' is missing\")\n
    "},{"location":"components/events_container_component/#components.events_container_component.EventsContainerComponent.should_be_toolbar","title":"should_be_toolbar()","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043d\u0430\u043b\u0438\u0447\u0438\u044f \u0442\u0443\u043b\u0431\u0430\u0440\u0430

    Source code in components\\events_container_component.py
    def should_be_toolbar(self) -> None:\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043d\u0430\u043b\u0438\u0447\u0438\u044f \u0442\u0443\u043b\u0431\u0430\u0440\u0430\"\"\"\n\n    loc = self.container_locator.locator(\"//nav[contains(@class, 'v-toolbar')]\").nth(0)\n    self.toolbar.check_toolbar_presence_by_locator(loc, \"Toolbar is missing\")\n
    "},{"location":"components/json_container_component/","title":"JsonContainerComponent","text":"

    \u041c\u043e\u0434\u0443\u043b\u044c \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 JSON-\u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430\u043c\u0438 \u043d\u0430 \u0432\u0435\u0431-\u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0430\u0445.

    \u0421\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 \u0434\u043b\u044f \u0447\u0442\u0435\u043d\u0438\u044f \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 JSON-\u0434\u0430\u043d\u043d\u044b\u0445 \u0432 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430\u0445. \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 playwright \u0434\u043b\u044f \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0441 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u043c\u0438 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b.

    "},{"location":"components/json_container_component/#components.json_container_component.JsonContainerComponent","title":"JsonContainerComponent","text":"

    Bases: BaseComponent

    \u041a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 JSON-\u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u043d\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435.

    \u041f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u043c\u0435\u0442\u043e\u0434\u044b \u0447\u0442\u0435\u043d\u0438\u044f \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 JSON-\u0434\u0430\u043d\u043d\u044b\u0445 \u0432 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430\u0445.

    Source code in components\\json_container_component.py
    class JsonContainerComponent(BaseComponent):\n    \"\"\"\u041a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 JSON-\u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u043d\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435.\n\n    \u041f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u043c\u0435\u0442\u043e\u0434\u044b \u0447\u0442\u0435\u043d\u0438\u044f \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 JSON-\u0434\u0430\u043d\u043d\u044b\u0445 \u0432 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430\u0445.\n    \"\"\"\n\n    def __init__(self, page: Page) -> None:\n        \"\"\"\u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442 JSON-\u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440.\n\n        Args:\n            page: \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.\n        \"\"\"\n        self.page = page\n\n    def format_json_string(self, json_string: str) -> str:\n        \"\"\"\u0424\u043e\u0440\u043c\u0430\u0442\u0438\u0440\u0443\u0435\u0442 \u0441\u0442\u0440\u043e\u043a\u0443 JSON \u0434\u043b\u044f \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0433\u043e \u043f\u0430\u0440\u0441\u0438\u043d\u0433\u0430.\n\n        Args:\n            json_string: \u0421\u044b\u0440\u0430\u044f \u0441\u0442\u0440\u043e\u043a\u0430 \u0441 JSON-\u0434\u0430\u043d\u043d\u044b\u043c\u0438.\n\n        Returns:\n            str: \u041e\u0442\u0444\u043e\u0440\u043c\u0430\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u0430\u044f \u0441\u0442\u0440\u043e\u043a\u0430 JSON.\n        \"\"\"\n        lines = json_string.splitlines()\n        formatted_lines = []\n        stack = []  # \u0421\u0442\u0435\u043a \u0434\u043b\u044f \u043e\u0442\u0441\u043b\u0435\u0436\u0438\u0432\u0430\u043d\u0438\u044f \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u043e\u0441\u0442\u0438\n        current_indent = 0\n\n        for line in lines:\n            line = line.strip()\n            if not line:\n                continue\n\n            # \u041e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u043c \u0442\u0438\u043f \u0442\u0435\u043a\u0443\u0449\u0435\u0439 \u0441\u0442\u0440\u043e\u043a\u0438\n            if line in ['{', '[']:\n                formatted_lines.append('  ' * current_indent + line)\n                stack.append(line)\n                current_indent += 1\n            elif line in ['}', ']']:\n                current_indent -= 1\n                if stack and stack[-1] in ['{', '[']:\n                    stack.pop()\n                formatted_lines.append('  ' * current_indent + line)\n            elif re.match(r'^\\d+:\\{', line):\n                formatted_lines.append('  ' * current_indent + '{')\n                stack.append('{')\n                current_indent += 1\n            elif ':' in line:\n                key, value = line.split(':', 1)\n                key = key.strip()\n                value = value.strip()\n\n                if not (key.startswith('\"') and key.endswith('\"')):\n                    key = f'\"{key}\"'\n\n                if value in ['{', '[']:\n                    formatted_line = f'{key}: {value}'\n                    formatted_lines.append('  ' * current_indent + formatted_line)\n                    stack.append(value)\n                    current_indent += 1\n                elif value in ['}', ']']:\n                    current_indent -= 1\n                    formatted_line = f'{key}: {value}'\n                    formatted_lines.append('  ' * current_indent + formatted_line)\n                    if stack:\n                        stack.pop()\n                else:\n                    if (value and not value.isdigit() and\n                        not value.replace('.', '', 1).isdigit() and\n                        value not in ['true', 'false', 'null'] and\n                        not value.startswith('\"') and not value.endswith('\"') and\n                        not value.startswith('{') and not value.startswith('[')):\n                        value = f'\"{value}\"'\n\n                    formatted_line = f'{key}: {value}'\n                    formatted_lines.append('  ' * current_indent + formatted_line)\n            else:\n                formatted_lines.append('  ' * current_indent + line)\n\n        # \u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0437\u0430\u043f\u044f\u0442\u044b\u0435 \u0433\u0434\u0435 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\n        result = []\n        total_lines = len(formatted_lines)\n\n        for i, current_line in enumerate(formatted_lines):\n            if i < total_lines - 1:\n                next_line = formatted_lines[i + 1]\n                in_array = any(bracket == '[' for bracket in stack)\n\n                # \u0423\u043f\u0440\u043e\u0449\u0435\u043d\u043d\u0430\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0443\u0441\u043b\u043e\u0432\u0438\u0439 \u0434\u043b\u044f \u0437\u0430\u043f\u044f\u0442\u043e\u0439\n                no_comma_condition1 = current_line.endswith(('{', '[', ','))\n                no_comma_condition2 = next_line.strip().endswith(('}', ']'))\n                no_comma_condition3 = next_line.strip().startswith(('}', ']'))\n                no_comma_condition4 = in_array and next_line.strip() == ']'\n\n                should_add_comma = not (no_comma_condition1 or no_comma_condition2 or\n                                      no_comma_condition3 or no_comma_condition4)\n\n                # \u0421\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0439 \u0441\u043b\u0443\u0447\u0430\u0439 \u0434\u043b\u044f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u043c\u0430\u0441\u0441\u0438\u0432\u0430\n                if (in_array and current_line.strip() == '}' and\n                    next_line.strip() != ']' and not next_line.strip().startswith('}')):\n                    should_add_comma = True\n\n                if should_add_comma:\n                    current_line += ','\n\n            result.append(current_line)\n\n        return '\\n'.join(result)\n\n    def read_data(self, locator: Any) -> Dict:\n        \"\"\"\u0427\u0438\u0442\u0430\u0435\u0442 \u0438 \u0444\u043e\u0440\u043c\u0430\u0442\u0438\u0440\u0443\u0435\u0442 JSON-\u0434\u0430\u043d\u043d\u044b\u0435 \u0438\u0437 \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u043e\u0433\u043e \u043b\u043e\u043a\u0430\u0442\u043e\u0440\u0430.\n\n        Args:\n            locator: \u041b\u043e\u043a\u0430\u0442\u043e\u0440 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0441 JSON-\u0434\u0430\u043d\u043d\u044b\u043c\u0438.\n\n        Returns:\n            dict: \u0420\u0430\u0441\u043f\u0430\u0440\u0441\u0435\u043d\u043d\u044b\u0439 JSON-\u043e\u0431\u044a\u0435\u043a\u0442.\n\n        Raises:\n            json.JSONDecodeError: \u0415\u0441\u043b\u0438 \u0434\u0430\u043d\u043d\u044b\u0435 \u043d\u0435 \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u044b \u0432 JSON.\n        \"\"\"\n        loc = self.get_locator(locator)\n        json_string = loc.inner_text()\n        print(json_string)\n\n        formatted_json_string = self.format_json_string(json_string)\n        print(formatted_json_string)\n\n        try:\n            data = json.loads(formatted_json_string)\n        except json.JSONDecodeError as e:\n            logger.error(\"JSON decode error: %s\", e)\n            logger.error(\"Formatted JSON: %s\", formatted_json_string)\n            assert False, f\"Invalid json content. Error: {e}\"\n\n        return data\n\n    def check_json_equals(self, actual: Any, expected: Any, msg: str) -> None:\n        \"\"\"\u0421\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u0435\u0442 JSON-\u043e\u0431\u044a\u0435\u043a\u0442\u044b \u043d\u0430 \u0438\u0434\u0435\u043d\u0442\u0438\u0447\u043d\u043e\u0441\u0442\u044c.\n\n        Args:\n            actual: \u0424\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 JSON-\u043e\u0431\u044a\u0435\u043a\u0442.\n            expected: \u041e\u0436\u0438\u0434\u0430\u0435\u043c\u044b\u0439 JSON-\u043e\u0431\u044a\u0435\u043a\u0442.\n            msg: \u0421\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u043e\u0431 \u043e\u0448\u0438\u0431\u043a\u0435.\n\n        Raises:\n            AssertionError: \u0415\u0441\u043b\u0438 \u043e\u0431\u044a\u0435\u043a\u0442\u044b \u043d\u0435 \u0438\u0434\u0435\u043d\u0442\u0438\u0447\u043d\u044b.\n        \"\"\"\n        diff = jsondiff.diff(expected, actual, syntax='symmetric')\n        assert len(diff) == 0, f\"{msg}. DIFF is {diff}\"\n
    "},{"location":"components/json_container_component/#components.json_container_component.JsonContainerComponent.__init__","title":"__init__(page)","text":"

    \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442 JSON-\u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440.

    Parameters:

    Name Type Description Default page Page

    \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.

    required Source code in components\\json_container_component.py
    def __init__(self, page: Page) -> None:\n    \"\"\"\u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442 JSON-\u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440.\n\n    Args:\n        page: \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.\n    \"\"\"\n    self.page = page\n
    "},{"location":"components/json_container_component/#components.json_container_component.JsonContainerComponent.check_json_equals","title":"check_json_equals(actual, expected, msg)","text":"

    \u0421\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u0435\u0442 JSON-\u043e\u0431\u044a\u0435\u043a\u0442\u044b \u043d\u0430 \u0438\u0434\u0435\u043d\u0442\u0438\u0447\u043d\u043e\u0441\u0442\u044c.

    Parameters:

    Name Type Description Default actual Any

    \u0424\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 JSON-\u043e\u0431\u044a\u0435\u043a\u0442.

    required expected Any

    \u041e\u0436\u0438\u0434\u0430\u0435\u043c\u044b\u0439 JSON-\u043e\u0431\u044a\u0435\u043a\u0442.

    required msg str

    \u0421\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u043e\u0431 \u043e\u0448\u0438\u0431\u043a\u0435.

    required

    Raises:

    Type Description AssertionError

    \u0415\u0441\u043b\u0438 \u043e\u0431\u044a\u0435\u043a\u0442\u044b \u043d\u0435 \u0438\u0434\u0435\u043d\u0442\u0438\u0447\u043d\u044b.

    Source code in components\\json_container_component.py
    def check_json_equals(self, actual: Any, expected: Any, msg: str) -> None:\n    \"\"\"\u0421\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u0435\u0442 JSON-\u043e\u0431\u044a\u0435\u043a\u0442\u044b \u043d\u0430 \u0438\u0434\u0435\u043d\u0442\u0438\u0447\u043d\u043e\u0441\u0442\u044c.\n\n    Args:\n        actual: \u0424\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 JSON-\u043e\u0431\u044a\u0435\u043a\u0442.\n        expected: \u041e\u0436\u0438\u0434\u0430\u0435\u043c\u044b\u0439 JSON-\u043e\u0431\u044a\u0435\u043a\u0442.\n        msg: \u0421\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u043e\u0431 \u043e\u0448\u0438\u0431\u043a\u0435.\n\n    Raises:\n        AssertionError: \u0415\u0441\u043b\u0438 \u043e\u0431\u044a\u0435\u043a\u0442\u044b \u043d\u0435 \u0438\u0434\u0435\u043d\u0442\u0438\u0447\u043d\u044b.\n    \"\"\"\n    diff = jsondiff.diff(expected, actual, syntax='symmetric')\n    assert len(diff) == 0, f\"{msg}. DIFF is {diff}\"\n
    "},{"location":"components/json_container_component/#components.json_container_component.JsonContainerComponent.format_json_string","title":"format_json_string(json_string)","text":"

    \u0424\u043e\u0440\u043c\u0430\u0442\u0438\u0440\u0443\u0435\u0442 \u0441\u0442\u0440\u043e\u043a\u0443 JSON \u0434\u043b\u044f \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0433\u043e \u043f\u0430\u0440\u0441\u0438\u043d\u0433\u0430.

    Parameters:

    Name Type Description Default json_string str

    \u0421\u044b\u0440\u0430\u044f \u0441\u0442\u0440\u043e\u043a\u0430 \u0441 JSON-\u0434\u0430\u043d\u043d\u044b\u043c\u0438.

    required

    Returns:

    Name Type Description str str

    \u041e\u0442\u0444\u043e\u0440\u043c\u0430\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u0430\u044f \u0441\u0442\u0440\u043e\u043a\u0430 JSON.

    Source code in components\\json_container_component.py
    def format_json_string(self, json_string: str) -> str:\n    \"\"\"\u0424\u043e\u0440\u043c\u0430\u0442\u0438\u0440\u0443\u0435\u0442 \u0441\u0442\u0440\u043e\u043a\u0443 JSON \u0434\u043b\u044f \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0433\u043e \u043f\u0430\u0440\u0441\u0438\u043d\u0433\u0430.\n\n    Args:\n        json_string: \u0421\u044b\u0440\u0430\u044f \u0441\u0442\u0440\u043e\u043a\u0430 \u0441 JSON-\u0434\u0430\u043d\u043d\u044b\u043c\u0438.\n\n    Returns:\n        str: \u041e\u0442\u0444\u043e\u0440\u043c\u0430\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u0430\u044f \u0441\u0442\u0440\u043e\u043a\u0430 JSON.\n    \"\"\"\n    lines = json_string.splitlines()\n    formatted_lines = []\n    stack = []  # \u0421\u0442\u0435\u043a \u0434\u043b\u044f \u043e\u0442\u0441\u043b\u0435\u0436\u0438\u0432\u0430\u043d\u0438\u044f \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u043e\u0441\u0442\u0438\n    current_indent = 0\n\n    for line in lines:\n        line = line.strip()\n        if not line:\n            continue\n\n        # \u041e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u043c \u0442\u0438\u043f \u0442\u0435\u043a\u0443\u0449\u0435\u0439 \u0441\u0442\u0440\u043e\u043a\u0438\n        if line in ['{', '[']:\n            formatted_lines.append('  ' * current_indent + line)\n            stack.append(line)\n            current_indent += 1\n        elif line in ['}', ']']:\n            current_indent -= 1\n            if stack and stack[-1] in ['{', '[']:\n                stack.pop()\n            formatted_lines.append('  ' * current_indent + line)\n        elif re.match(r'^\\d+:\\{', line):\n            formatted_lines.append('  ' * current_indent + '{')\n            stack.append('{')\n            current_indent += 1\n        elif ':' in line:\n            key, value = line.split(':', 1)\n            key = key.strip()\n            value = value.strip()\n\n            if not (key.startswith('\"') and key.endswith('\"')):\n                key = f'\"{key}\"'\n\n            if value in ['{', '[']:\n                formatted_line = f'{key}: {value}'\n                formatted_lines.append('  ' * current_indent + formatted_line)\n                stack.append(value)\n                current_indent += 1\n            elif value in ['}', ']']:\n                current_indent -= 1\n                formatted_line = f'{key}: {value}'\n                formatted_lines.append('  ' * current_indent + formatted_line)\n                if stack:\n                    stack.pop()\n            else:\n                if (value and not value.isdigit() and\n                    not value.replace('.', '', 1).isdigit() and\n                    value not in ['true', 'false', 'null'] and\n                    not value.startswith('\"') and not value.endswith('\"') and\n                    not value.startswith('{') and not value.startswith('[')):\n                    value = f'\"{value}\"'\n\n                formatted_line = f'{key}: {value}'\n                formatted_lines.append('  ' * current_indent + formatted_line)\n        else:\n            formatted_lines.append('  ' * current_indent + line)\n\n    # \u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0437\u0430\u043f\u044f\u0442\u044b\u0435 \u0433\u0434\u0435 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\n    result = []\n    total_lines = len(formatted_lines)\n\n    for i, current_line in enumerate(formatted_lines):\n        if i < total_lines - 1:\n            next_line = formatted_lines[i + 1]\n            in_array = any(bracket == '[' for bracket in stack)\n\n            # \u0423\u043f\u0440\u043e\u0449\u0435\u043d\u043d\u0430\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0443\u0441\u043b\u043e\u0432\u0438\u0439 \u0434\u043b\u044f \u0437\u0430\u043f\u044f\u0442\u043e\u0439\n            no_comma_condition1 = current_line.endswith(('{', '[', ','))\n            no_comma_condition2 = next_line.strip().endswith(('}', ']'))\n            no_comma_condition3 = next_line.strip().startswith(('}', ']'))\n            no_comma_condition4 = in_array and next_line.strip() == ']'\n\n            should_add_comma = not (no_comma_condition1 or no_comma_condition2 or\n                                  no_comma_condition3 or no_comma_condition4)\n\n            # \u0421\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0439 \u0441\u043b\u0443\u0447\u0430\u0439 \u0434\u043b\u044f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u043c\u0430\u0441\u0441\u0438\u0432\u0430\n            if (in_array and current_line.strip() == '}' and\n                next_line.strip() != ']' and not next_line.strip().startswith('}')):\n                should_add_comma = True\n\n            if should_add_comma:\n                current_line += ','\n\n        result.append(current_line)\n\n    return '\\n'.join(result)\n
    "},{"location":"components/json_container_component/#components.json_container_component.JsonContainerComponent.read_data","title":"read_data(locator)","text":"

    \u0427\u0438\u0442\u0430\u0435\u0442 \u0438 \u0444\u043e\u0440\u043c\u0430\u0442\u0438\u0440\u0443\u0435\u0442 JSON-\u0434\u0430\u043d\u043d\u044b\u0435 \u0438\u0437 \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u043e\u0433\u043e \u043b\u043e\u043a\u0430\u0442\u043e\u0440\u0430.

    Parameters:

    Name Type Description Default locator Any

    \u041b\u043e\u043a\u0430\u0442\u043e\u0440 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0441 JSON-\u0434\u0430\u043d\u043d\u044b\u043c\u0438.

    required

    Returns:

    Name Type Description dict Dict

    \u0420\u0430\u0441\u043f\u0430\u0440\u0441\u0435\u043d\u043d\u044b\u0439 JSON-\u043e\u0431\u044a\u0435\u043a\u0442.

    Raises:

    Type Description JSONDecodeError

    \u0415\u0441\u043b\u0438 \u0434\u0430\u043d\u043d\u044b\u0435 \u043d\u0435 \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u044b \u0432 JSON.

    Source code in components\\json_container_component.py
    def read_data(self, locator: Any) -> Dict:\n    \"\"\"\u0427\u0438\u0442\u0430\u0435\u0442 \u0438 \u0444\u043e\u0440\u043c\u0430\u0442\u0438\u0440\u0443\u0435\u0442 JSON-\u0434\u0430\u043d\u043d\u044b\u0435 \u0438\u0437 \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u043e\u0433\u043e \u043b\u043e\u043a\u0430\u0442\u043e\u0440\u0430.\n\n    Args:\n        locator: \u041b\u043e\u043a\u0430\u0442\u043e\u0440 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0441 JSON-\u0434\u0430\u043d\u043d\u044b\u043c\u0438.\n\n    Returns:\n        dict: \u0420\u0430\u0441\u043f\u0430\u0440\u0441\u0435\u043d\u043d\u044b\u0439 JSON-\u043e\u0431\u044a\u0435\u043a\u0442.\n\n    Raises:\n        json.JSONDecodeError: \u0415\u0441\u043b\u0438 \u0434\u0430\u043d\u043d\u044b\u0435 \u043d\u0435 \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u044b \u0432 JSON.\n    \"\"\"\n    loc = self.get_locator(locator)\n    json_string = loc.inner_text()\n    print(json_string)\n\n    formatted_json_string = self.format_json_string(json_string)\n    print(formatted_json_string)\n\n    try:\n        data = json.loads(formatted_json_string)\n    except json.JSONDecodeError as e:\n        logger.error(\"JSON decode error: %s\", e)\n        logger.error(\"Formatted JSON: %s\", formatted_json_string)\n        assert False, f\"Invalid json content. Error: {e}\"\n\n    return data\n
    "},{"location":"components/modal_window_component/","title":"ModalWindowComponent","text":"

    \u041c\u043e\u0434\u0443\u043b\u044c \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430. \u0421\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043a\u043b\u0430\u0441\u0441 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u044b\u043c\u0438 \u043e\u043a\u043d\u0430\u043c\u0438, \u0438\u0445 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u043c\u0438 \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430\u043c\u0438.

    "},{"location":"components/modal_window_component/#components.modal_window_component.ModalWindowComponent","title":"ModalWindowComponent","text":"

    Bases: BaseComponent

    \u041a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430. \u041f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u043c\u0435\u0442\u043e\u0434\u044b \u0434\u043b\u044f \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0441 \u043e\u043a\u043d\u043e\u043c, \u0435\u0433\u043e \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u044b\u043c \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430\u043c\u0438.

    Source code in components\\modal_window_component.py
    class ModalWindowComponent(BaseComponent):\n    \"\"\"\u041a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430. \u041f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u043c\u0435\u0442\u043e\u0434\u044b \u0434\u043b\u044f \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0441 \u043e\u043a\u043d\u043e\u043c,\n    \u0435\u0433\u043e \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u044b\u043c \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430\u043c\u0438.\"\"\"\n\n    def __init__(self, page: Page):\n        super().__init__(page)\n        self.toolbar = ToolbarComponent(page, \"\")\n        self.content_items = {}\n        self.buttons = []\n\n    # \u0414\u0435\u0439\u0441\u0442\u0432\u0438\u044f:\n    def add_content_item(self, name: str, item: object) -> None:\n        \"\"\"\u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0433\u043e \u0432 \u043e\u043a\u043d\u043e \u043f\u043e \u0437\u0430\u0434\u0430\u043d\u043d\u043e\u043c\u0443 \u0438\u043c\u0435\u043d\u0438.\"\"\"\n        self.content_items[name] = item\n\n    def get_content_item(self, name: str) -> object | None:\n        \"\"\"\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0433\u043e \u043f\u043e \u0438\u043c\u0435\u043d\u0438 \u0438\u043b\u0438 None, \u0435\u0441\u043b\u0438 \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d.\"\"\"\n        return self.content_items.get(name)\n\n    def add_toolbar_title(self, title: str) -> None:\n        \"\"\"\u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a \u0432 \u043f\u0430\u043d\u0435\u043b\u044c \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430.\"\"\"\n        self.toolbar.add_title(title)\n\n    def add_toolbar_button(self, locator: str, name: str) -> None:\n        \"\"\"\u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u043a\u043d\u043e\u043f\u043a\u0443 \u0432 \u043f\u0430\u043d\u0435\u043b\u044c \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430.\"\"\"\n        self.toolbar.add_tooltip_button(locator, name)\n\n    def add_button(self, locator: str, name: str) -> None:\n        \"\"\"\u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u043a\u043d\u043e\u043f\u043a\u0443 \u0432 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043a\u043d\u043e.\"\"\"\n        self.buttons.append(Button(self.page, locator, name))\n\n    def get_button_by_name(self, name: str) -> Button | None:\n        \"\"\"\u0418\u0449\u0435\u0442 \u0438 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043a\u043d\u043e\u043f\u043a\u0443 \u043f\u043e \u0438\u043c\u0435\u043d\u0438 \u0438\u043b\u0438 None, \u0435\u0441\u043b\u0438 \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u0430.\"\"\"\n        for button in self.buttons:\n            if button.name == name:\n                return button\n        return None\n\n    def click_button(self, name: str) -> None:\n        \"\"\"\u041a\u043b\u0438\u043a\u0430\u0435\u0442 \u043f\u043e \u043a\u043d\u043e\u043f\u043a\u0435 \u0441 \u0437\u0430\u0434\u0430\u043d\u043d\u044b\u043c \u0438\u043c\u0435\u043d\u0435\u043c. \u0412\u044b\u0437\u044b\u0432\u0430\u0435\u0442 \u043e\u0448\u0438\u0431\u043a\u0443, \u0435\u0441\u043b\u0438 \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u0430.\"\"\"\n        button = self.get_button_by_name(name)\n        if button is None:\n            assert False, f\"Button with name '{name}' not found\"\n        button.click()\n\n    def click_toolbar_close_button(self) -> None:\n        \"\"\"\u041a\u043b\u0438\u043a\u0430\u0435\u0442 \u043f\u043e \u043a\u043d\u043e\u043f\u043a\u0435 \u0437\u0430\u043a\u0440\u044b\u0442\u0438\u044f \u0432 \u043f\u0430\u043d\u0435\u043b\u0438 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432.\"\"\"\n        self.toolbar.click_button(\"close\")\n\n    def scroll_window_down(self) -> None:\n        \"\"\"\u041f\u0440\u043e\u043a\u0440\u0443\u0447\u0438\u0432\u0430\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u043e\u043a\u043d\u0430 \u0432\u043d\u0438\u0437.\"\"\"\n        self.scroll_down(ModalWindowLocators.MODAL_WINDOW)\n\n    def scroll_window_up(self) -> None:\n        \"\"\"\u041f\u0440\u043e\u043a\u0440\u0443\u0447\u0438\u0432\u0430\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u043e\u043a\u043d\u0430 \u0432\u0432\u0435\u0440\u0445.\"\"\"\n        self.scroll_up(ModalWindowLocators.MODAL_WINDOW)\n\n    def scroll_window_left(self) -> None:\n        \"\"\"\u041f\u0440\u043e\u043a\u0440\u0443\u0447\u0438\u0432\u0430\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u043e\u043a\u043d\u0430 \u0432\u043b\u0435\u0432\u043e.\"\"\"\n        self.scroll_left(ModalWindowLocators.MODAL_WINDOW)\n\n    def scroll_window_right(self) -> None:\n        \"\"\"\u041f\u0440\u043e\u043a\u0440\u0443\u0447\u0438\u0432\u0430\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u043e\u043a\u043d\u0430 \u0432\u043f\u0440\u0430\u0432\u043e.\"\"\"\n        self.scroll_right(ModalWindowLocators.MODAL_WINDOW)\n\n    # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0438:\n    def check_window_vertical_scrolling(self) -> bool:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u0439 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0438 \u043e\u043a\u043d\u0430.\"\"\"\n        return self.is_scrollable_vertically(ModalWindowLocators.MODAL_WINDOW)\n\n    def check_window_horizontal_scrolling(self) -> bool:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0433\u043e\u0440\u0438\u0437\u043e\u043d\u0442\u0430\u043b\u044c\u043d\u043e\u0439 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0438 \u043e\u043a\u043d\u0430.\"\"\"\n        return self.is_scrollable_horizontally(ModalWindowLocators.MODAL_WINDOW)\n\n    def check_by_window_title(self) -> None:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u043e\u043a\u043d\u0430 \u043f\u043e \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0443.\"\"\"\n        self.toolbar.check_toolbar_presence(\n            f\"Modal window with '{self.toolbar.title}' is missing\"\n        )\n\n    def check_button_visibility(self, name: str) -> None:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u043a\u043d\u043e\u043f\u043a\u0438 \u043f\u043e \u0438\u043c\u0435\u043d\u0438. \u0412\u044b\u0437\u044b\u0432\u0430\u0435\u0442 \u043e\u0448\u0438\u0431\u043a\u0443, \u0435\u0441\u043b\u0438 \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u0430.\"\"\"\n        button = self.get_button_by_name(name)\n        if button is None:\n            assert False, f\"Button with name '{name}' not found\"\n        button.check_visibility(f\"Button with name '{name}' is missing\")\n\n    def check_toolbar_button_visibility(self, name: str) -> None:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u043a\u043d\u043e\u043f\u043a\u0438 \u0432 \u043f\u0430\u043d\u0435\u043b\u0438 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432.\"\"\"\n        self.toolbar.check_button_visibility(name)\n\n    def check_toolbar_button_tooltip(self, name: str, tooltip: str) -> None:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0443 \u0443 \u043a\u043d\u043e\u043f\u043a\u0438 \u0432 \u043f\u0430\u043d\u0435\u043b\u0438 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432.\"\"\"\n        self.toolbar.check_button_tooltip(name, tooltip)\n
    "},{"location":"components/modal_window_component/#components.modal_window_component.ModalWindowComponent.add_button","title":"add_button(locator, name)","text":"

    \u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u043a\u043d\u043e\u043f\u043a\u0443 \u0432 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043a\u043d\u043e.

    Source code in components\\modal_window_component.py
    def add_button(self, locator: str, name: str) -> None:\n    \"\"\"\u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u043a\u043d\u043e\u043f\u043a\u0443 \u0432 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043a\u043d\u043e.\"\"\"\n    self.buttons.append(Button(self.page, locator, name))\n
    "},{"location":"components/modal_window_component/#components.modal_window_component.ModalWindowComponent.add_content_item","title":"add_content_item(name, item)","text":"

    \u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0433\u043e \u0432 \u043e\u043a\u043d\u043e \u043f\u043e \u0437\u0430\u0434\u0430\u043d\u043d\u043e\u043c\u0443 \u0438\u043c\u0435\u043d\u0438.

    Source code in components\\modal_window_component.py
    def add_content_item(self, name: str, item: object) -> None:\n    \"\"\"\u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0433\u043e \u0432 \u043e\u043a\u043d\u043e \u043f\u043e \u0437\u0430\u0434\u0430\u043d\u043d\u043e\u043c\u0443 \u0438\u043c\u0435\u043d\u0438.\"\"\"\n    self.content_items[name] = item\n
    "},{"location":"components/modal_window_component/#components.modal_window_component.ModalWindowComponent.add_toolbar_button","title":"add_toolbar_button(locator, name)","text":"

    \u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u043a\u043d\u043e\u043f\u043a\u0443 \u0432 \u043f\u0430\u043d\u0435\u043b\u044c \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430.

    Source code in components\\modal_window_component.py
    def add_toolbar_button(self, locator: str, name: str) -> None:\n    \"\"\"\u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u043a\u043d\u043e\u043f\u043a\u0443 \u0432 \u043f\u0430\u043d\u0435\u043b\u044c \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430.\"\"\"\n    self.toolbar.add_tooltip_button(locator, name)\n
    "},{"location":"components/modal_window_component/#components.modal_window_component.ModalWindowComponent.add_toolbar_title","title":"add_toolbar_title(title)","text":"

    \u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a \u0432 \u043f\u0430\u043d\u0435\u043b\u044c \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430.

    Source code in components\\modal_window_component.py
    def add_toolbar_title(self, title: str) -> None:\n    \"\"\"\u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a \u0432 \u043f\u0430\u043d\u0435\u043b\u044c \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430.\"\"\"\n    self.toolbar.add_title(title)\n
    "},{"location":"components/modal_window_component/#components.modal_window_component.ModalWindowComponent.check_button_visibility","title":"check_button_visibility(name)","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u043a\u043d\u043e\u043f\u043a\u0438 \u043f\u043e \u0438\u043c\u0435\u043d\u0438. \u0412\u044b\u0437\u044b\u0432\u0430\u0435\u0442 \u043e\u0448\u0438\u0431\u043a\u0443, \u0435\u0441\u043b\u0438 \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u0430.

    Source code in components\\modal_window_component.py
    def check_button_visibility(self, name: str) -> None:\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u043a\u043d\u043e\u043f\u043a\u0438 \u043f\u043e \u0438\u043c\u0435\u043d\u0438. \u0412\u044b\u0437\u044b\u0432\u0430\u0435\u0442 \u043e\u0448\u0438\u0431\u043a\u0443, \u0435\u0441\u043b\u0438 \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u0430.\"\"\"\n    button = self.get_button_by_name(name)\n    if button is None:\n        assert False, f\"Button with name '{name}' not found\"\n    button.check_visibility(f\"Button with name '{name}' is missing\")\n
    "},{"location":"components/modal_window_component/#components.modal_window_component.ModalWindowComponent.check_by_window_title","title":"check_by_window_title()","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u043e\u043a\u043d\u0430 \u043f\u043e \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0443.

    Source code in components\\modal_window_component.py
    def check_by_window_title(self) -> None:\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u043e\u043a\u043d\u0430 \u043f\u043e \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0443.\"\"\"\n    self.toolbar.check_toolbar_presence(\n        f\"Modal window with '{self.toolbar.title}' is missing\"\n    )\n
    "},{"location":"components/modal_window_component/#components.modal_window_component.ModalWindowComponent.check_toolbar_button_tooltip","title":"check_toolbar_button_tooltip(name, tooltip)","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0443 \u0443 \u043a\u043d\u043e\u043f\u043a\u0438 \u0432 \u043f\u0430\u043d\u0435\u043b\u0438 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432.

    Source code in components\\modal_window_component.py
    def check_toolbar_button_tooltip(self, name: str, tooltip: str) -> None:\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0443 \u0443 \u043a\u043d\u043e\u043f\u043a\u0438 \u0432 \u043f\u0430\u043d\u0435\u043b\u0438 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432.\"\"\"\n    self.toolbar.check_button_tooltip(name, tooltip)\n
    "},{"location":"components/modal_window_component/#components.modal_window_component.ModalWindowComponent.check_toolbar_button_visibility","title":"check_toolbar_button_visibility(name)","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u043a\u043d\u043e\u043f\u043a\u0438 \u0432 \u043f\u0430\u043d\u0435\u043b\u0438 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432.

    Source code in components\\modal_window_component.py
    def check_toolbar_button_visibility(self, name: str) -> None:\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u043a\u043d\u043e\u043f\u043a\u0438 \u0432 \u043f\u0430\u043d\u0435\u043b\u0438 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432.\"\"\"\n    self.toolbar.check_button_visibility(name)\n
    "},{"location":"components/modal_window_component/#components.modal_window_component.ModalWindowComponent.check_window_horizontal_scrolling","title":"check_window_horizontal_scrolling()","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0433\u043e\u0440\u0438\u0437\u043e\u043d\u0442\u0430\u043b\u044c\u043d\u043e\u0439 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0438 \u043e\u043a\u043d\u0430.

    Source code in components\\modal_window_component.py
    def check_window_horizontal_scrolling(self) -> bool:\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0433\u043e\u0440\u0438\u0437\u043e\u043d\u0442\u0430\u043b\u044c\u043d\u043e\u0439 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0438 \u043e\u043a\u043d\u0430.\"\"\"\n    return self.is_scrollable_horizontally(ModalWindowLocators.MODAL_WINDOW)\n
    "},{"location":"components/modal_window_component/#components.modal_window_component.ModalWindowComponent.check_window_vertical_scrolling","title":"check_window_vertical_scrolling()","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u0439 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0438 \u043e\u043a\u043d\u0430.

    Source code in components\\modal_window_component.py
    def check_window_vertical_scrolling(self) -> bool:\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u0439 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0438 \u043e\u043a\u043d\u0430.\"\"\"\n    return self.is_scrollable_vertically(ModalWindowLocators.MODAL_WINDOW)\n
    "},{"location":"components/modal_window_component/#components.modal_window_component.ModalWindowComponent.click_button","title":"click_button(name)","text":"

    \u041a\u043b\u0438\u043a\u0430\u0435\u0442 \u043f\u043e \u043a\u043d\u043e\u043f\u043a\u0435 \u0441 \u0437\u0430\u0434\u0430\u043d\u043d\u044b\u043c \u0438\u043c\u0435\u043d\u0435\u043c. \u0412\u044b\u0437\u044b\u0432\u0430\u0435\u0442 \u043e\u0448\u0438\u0431\u043a\u0443, \u0435\u0441\u043b\u0438 \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u0430.

    Source code in components\\modal_window_component.py
    def click_button(self, name: str) -> None:\n    \"\"\"\u041a\u043b\u0438\u043a\u0430\u0435\u0442 \u043f\u043e \u043a\u043d\u043e\u043f\u043a\u0435 \u0441 \u0437\u0430\u0434\u0430\u043d\u043d\u044b\u043c \u0438\u043c\u0435\u043d\u0435\u043c. \u0412\u044b\u0437\u044b\u0432\u0430\u0435\u0442 \u043e\u0448\u0438\u0431\u043a\u0443, \u0435\u0441\u043b\u0438 \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u0430.\"\"\"\n    button = self.get_button_by_name(name)\n    if button is None:\n        assert False, f\"Button with name '{name}' not found\"\n    button.click()\n
    "},{"location":"components/modal_window_component/#components.modal_window_component.ModalWindowComponent.click_toolbar_close_button","title":"click_toolbar_close_button()","text":"

    \u041a\u043b\u0438\u043a\u0430\u0435\u0442 \u043f\u043e \u043a\u043d\u043e\u043f\u043a\u0435 \u0437\u0430\u043a\u0440\u044b\u0442\u0438\u044f \u0432 \u043f\u0430\u043d\u0435\u043b\u0438 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432.

    Source code in components\\modal_window_component.py
    def click_toolbar_close_button(self) -> None:\n    \"\"\"\u041a\u043b\u0438\u043a\u0430\u0435\u0442 \u043f\u043e \u043a\u043d\u043e\u043f\u043a\u0435 \u0437\u0430\u043a\u0440\u044b\u0442\u0438\u044f \u0432 \u043f\u0430\u043d\u0435\u043b\u0438 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432.\"\"\"\n    self.toolbar.click_button(\"close\")\n
    "},{"location":"components/modal_window_component/#components.modal_window_component.ModalWindowComponent.get_button_by_name","title":"get_button_by_name(name)","text":"

    \u0418\u0449\u0435\u0442 \u0438 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043a\u043d\u043e\u043f\u043a\u0443 \u043f\u043e \u0438\u043c\u0435\u043d\u0438 \u0438\u043b\u0438 None, \u0435\u0441\u043b\u0438 \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u0430.

    Source code in components\\modal_window_component.py
    def get_button_by_name(self, name: str) -> Button | None:\n    \"\"\"\u0418\u0449\u0435\u0442 \u0438 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043a\u043d\u043e\u043f\u043a\u0443 \u043f\u043e \u0438\u043c\u0435\u043d\u0438 \u0438\u043b\u0438 None, \u0435\u0441\u043b\u0438 \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u0430.\"\"\"\n    for button in self.buttons:\n        if button.name == name:\n            return button\n    return None\n
    "},{"location":"components/modal_window_component/#components.modal_window_component.ModalWindowComponent.get_content_item","title":"get_content_item(name)","text":"

    \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0433\u043e \u043f\u043e \u0438\u043c\u0435\u043d\u0438 \u0438\u043b\u0438 None, \u0435\u0441\u043b\u0438 \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d.

    Source code in components\\modal_window_component.py
    def get_content_item(self, name: str) -> object | None:\n    \"\"\"\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0433\u043e \u043f\u043e \u0438\u043c\u0435\u043d\u0438 \u0438\u043b\u0438 None, \u0435\u0441\u043b\u0438 \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d.\"\"\"\n    return self.content_items.get(name)\n
    "},{"location":"components/modal_window_component/#components.modal_window_component.ModalWindowComponent.scroll_window_down","title":"scroll_window_down()","text":"

    \u041f\u0440\u043e\u043a\u0440\u0443\u0447\u0438\u0432\u0430\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u043e\u043a\u043d\u0430 \u0432\u043d\u0438\u0437.

    Source code in components\\modal_window_component.py
    def scroll_window_down(self) -> None:\n    \"\"\"\u041f\u0440\u043e\u043a\u0440\u0443\u0447\u0438\u0432\u0430\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u043e\u043a\u043d\u0430 \u0432\u043d\u0438\u0437.\"\"\"\n    self.scroll_down(ModalWindowLocators.MODAL_WINDOW)\n
    "},{"location":"components/modal_window_component/#components.modal_window_component.ModalWindowComponent.scroll_window_left","title":"scroll_window_left()","text":"

    \u041f\u0440\u043e\u043a\u0440\u0443\u0447\u0438\u0432\u0430\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u043e\u043a\u043d\u0430 \u0432\u043b\u0435\u0432\u043e.

    Source code in components\\modal_window_component.py
    def scroll_window_left(self) -> None:\n    \"\"\"\u041f\u0440\u043e\u043a\u0440\u0443\u0447\u0438\u0432\u0430\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u043e\u043a\u043d\u0430 \u0432\u043b\u0435\u0432\u043e.\"\"\"\n    self.scroll_left(ModalWindowLocators.MODAL_WINDOW)\n
    "},{"location":"components/modal_window_component/#components.modal_window_component.ModalWindowComponent.scroll_window_right","title":"scroll_window_right()","text":"

    \u041f\u0440\u043e\u043a\u0440\u0443\u0447\u0438\u0432\u0430\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u043e\u043a\u043d\u0430 \u0432\u043f\u0440\u0430\u0432\u043e.

    Source code in components\\modal_window_component.py
    def scroll_window_right(self) -> None:\n    \"\"\"\u041f\u0440\u043e\u043a\u0440\u0443\u0447\u0438\u0432\u0430\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u043e\u043a\u043d\u0430 \u0432\u043f\u0440\u0430\u0432\u043e.\"\"\"\n    self.scroll_right(ModalWindowLocators.MODAL_WINDOW)\n
    "},{"location":"components/modal_window_component/#components.modal_window_component.ModalWindowComponent.scroll_window_up","title":"scroll_window_up()","text":"

    \u041f\u0440\u043e\u043a\u0440\u0443\u0447\u0438\u0432\u0430\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u043e\u043a\u043d\u0430 \u0432\u0432\u0435\u0440\u0445.

    Source code in components\\modal_window_component.py
    def scroll_window_up(self) -> None:\n    \"\"\"\u041f\u0440\u043e\u043a\u0440\u0443\u0447\u0438\u0432\u0430\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u043e\u043a\u043d\u0430 \u0432\u0432\u0435\u0440\u0445.\"\"\"\n    self.scroll_up(ModalWindowLocators.MODAL_WINDOW)\n
    "},{"location":"components/navbar_component/","title":"NavigationPanelComponent","text":"

    \u041c\u043e\u0434\u0443\u043b\u044c \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430 \u043f\u0430\u043d\u0435\u043b\u0438 \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438. \u0421\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043a\u043b\u0430\u0441\u0441 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u043c\u0438 \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438.

    "},{"location":"components/navbar_component/#components.navbar_component.NavigationPanelComponent","title":"NavigationPanelComponent","text":"

    Bases: BaseComponent

    \u041a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 \u043f\u0430\u043d\u0435\u043b\u0438 \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438. \u041f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u043c\u0435\u0442\u043e\u0434\u044b \u0434\u043b\u044f \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0441 \u043d\u0435\u0439.

    Source code in components\\navbar_component.py
    class NavigationPanelComponent(BaseComponent):\n    \"\"\"\u041a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 \u043f\u0430\u043d\u0435\u043b\u0438 \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438. \u041f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u043c\u0435\u0442\u043e\u0434\u044b \u0434\u043b\u044f \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0441 \u043d\u0435\u0439.\"\"\"\n\n    def __init__(self, page: Page):\n        \"\"\"\u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 \u043f\u0430\u043d\u0435\u043b\u0438 \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438.\n\n        Args:\n            page: \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.\n        \"\"\"\n\n        super().__init__(page)\n\n    # \u0414\u0435\u0439\u0441\u0442\u0432\u0438\u044f:\n    def get_item_names(self, locator: str | Locator) -> list[str]:\n        \"\"\"\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0442\u0435\u043a\u0441\u0442\u044b \u0432\u0441\u0435\u0445 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u043f\u043e \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u043e\u043c\u0443 \u043b\u043e\u043a\u0430\u0442\u043e\u0440\u0443.\n\n        Args:\n            locator: \u041b\u043e\u043a\u0430\u0442\u043e\u0440 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0438\u043b\u0438 \u0441\u0442\u0440\u043e\u043a\u0430 \u0441 CSS/XPath.\n\n        Returns:\n            \u0421\u043f\u0438\u0441\u043e\u043a \u0442\u0435\u043a\u0441\u0442\u043e\u0432 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432.\n        \"\"\"\n\n        loc = self.get_locator(locator)\n        return loc.all_inner_texts()\n\n\n    def click_item(self, locator: str | Locator, item_name: str) -> None:\n        \"\"\"\u041a\u043b\u0438\u043a\u0430\u0435\u0442 \u043f\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0443 \u0441 \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u044b\u043c \u0442\u0435\u043a\u0441\u0442\u043e\u043c.\n\n        Args:\n            locator: \u041b\u043e\u043a\u0430\u0442\u043e\u0440 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0438\u043b\u0438 \u0441\u0442\u0440\u043e\u043a\u0430 \u0441 CSS/XPath.\n            item_name: \u0422\u0435\u043a\u0441\u0442 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0434\u043b\u044f \u043a\u043b\u0438\u043a\u0430.\n        \"\"\"\n\n        loc = self.get_locator(locator)\n        loc.get_by_text(item_name).click()\n\n    def click_sub_item(self, node_root_locator: str | Locator, item_name: str, parent: None|str) -> None:\n        \"\"\"\u041a\u043b\u0438\u043a\u0430\u0435\u0442 \u043f\u043e \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u043e\u043c\u0443 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0443 \u0441 \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u044b\u043c \u0442\u0435\u043a\u0441\u0442\u043e\u043c.\n\n        Args:\n            node_root_locator: \u041b\u043e\u043a\u0430\u0442\u043e\u0440 \u0434\u043b\u044f \u043f\u043e\u0438\u0441\u043a\u0430 \u043a\u043e\u0440\u043d\u0435\u0432\u044b\u0445 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0434\u0435\u0440\u0435\u0432\u0430 (\u041b\u043e\u043a\u0430\u0442\u043e\u0440 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0438\u043b\u0438 \u0441\u0442\u0440\u043e\u043a\u0430 \u0441 CSS/XPath).\n            item_name: \u0422\u0435\u043a\u0441\u0442 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0434\u043b\u044f \u043a\u043b\u0438\u043a\u0430.\n        \"\"\"\n\n        def find_and_click_item(page, root_locator, item_name: str, parent: None|str) -> bool:\n            # \u041d\u0430\u0445\u043e\u0434\u0438\u043c \u0432\u0441\u0435 \u043b\u043e\u043a\u0430\u0442\u043e\u0440\u044b \u043a\u043e\u0440\u043d\u0435\u0432\u044b\u0445 \u0443\u0437\u043b\u043e\u0432 \u043d\u0430 \u0442\u0435\u043a\u0443\u0449\u0435\u043c \u0443\u0440\u043e\u0432\u043d\u0435\n            root_node = root_locator.locator('>div.v-treeview-node')\n            # \u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0441\u043f\u0438\u0441\u043e\u043a \u0442\u0435\u043a\u0441\u0442\u043e\u0432\n            root_node_texts = root_node.all_inner_texts()\n\n            # \u0415\u0441\u043b\u0438 \u0438\u0441\u043a\u043e\u043c\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u043d\u0430 \u0434\u0430\u043d\u043d\u043e\u043c \u0443\u0440\u043e\u0432\u043d\u0435, \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u0435\u043c \u043b\u043e\u043a\u0430\u0442\u043e\u0440 \u0438 \u0434\u0435\u043b\u0430\u0435\u043c \u043a\u043b\u0438\u043a\n            if parent is None:\n                for index, node_text in enumerate(root_node_texts):\n                    node_text = node_text.replace(\"expand_more\\n\", \"\")\n                    if item_name == node_text:\n                        root_node.nth(index).click()\n                        return True\n\n            # \u0415\u0441\u043b\u0438 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u043d\u0435\u0442, \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u043e \u0438\u0449\u0435\u043c \u0434\u0430\u043b\u044c\u0448\u0435\n            nodes_count = root_locator.locator('>div.v-treeview-node').count()\n\n            for index in range(nodes_count):\n                node = root_locator.locator(f\">div:nth-child({index + 1})\").first\n\n                # \u0418\u0437\u0432\u043b\u0435\u043a\u0430\u0435\u043c \u0430\u0442\u0442\u0440\u0438\u0431\u0443\u0442\u044b \u0438\u0437 \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0433\u043e \u0443\u0437\u043b\u0430\n                node_class_attr = node.get_attribute('class')\n\n                is_expanded = False\n                has_children = False\n\n                # \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u043b\u0438\u0441\u0442 \u044d\u0442\u043e \u0438\u043b\u0438 \u043d\u0430\u0447\u0430\u043b\u043e \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u0430\n                if \"v-treeview-node--leaf\" not in node_class_attr:\n                    # \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c, \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043b\u0438 \u0443\u0437\u0435\u043b \u0440\u0430\u0441\u043a\u0440\u044b\u0442\u044b\u043c\n                    class_attr = node.locator(NavigationPanelLocators.TOGGLE_BUTTON).get_attribute('class')\n                    if \"v-treeview-node__toggle--open\" in class_attr:\n                        is_expanded = True\n\n                    # \u0415\u0441\u043b\u0438 \u0443\u0437\u0435\u043b \u0437\u0430\u043a\u0440\u044b\u0442 \u043c\u043e\u0436\u0435\u043c \u0435\u0433\u043e \u0440\u0430\u0441\u043a\u0440\u044b\u0442\u044c\n                    if is_expanded is False:\n                        toggle_button = node.locator(NavigationPanelLocators.TOGGLE_BUTTON)\n                        toggle_button.click()\n                        # \u0416\u0434\u0435\u043c, \u043f\u043e\u043a\u0430 \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u043f\u0440\u043e\u0433\u0440\u0443\u0437\u044f\u0442\u0441\u044f/\u043f\u043e\u044f\u0432\u044f\u0442\u0441\u044f\n                        page.wait_for_timeout(300)\n                        is_expanded = True\n\n                    # \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c, \u0438\u043c\u0435\u0435\u0442 \u043b\u0438 \u0443\u0437\u0435\u043b  \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b\n                    children_count = node.locator('>div.v-treeview-node__children').count()\n                    content = node.locator('>div.v-treeview-node__children').inner_html()\n                    if children_count > 0 and len(content) != 0:\n                        has_children = True\n\n                    # \u0420\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u044b\u0439 \u0432\u044b\u0437\u043e\u0432 \u0434\u043b\u044f \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0445 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432\n                    # \u0418\u0449\u0435\u043c \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b *\u0432\u043d\u0443\u0442\u0440\u0438* \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u0443\u0437\u043b\u0430\n                    if has_children and is_expanded:\n                        child_nodes_locator = root_locator.locator(f\">div:nth-child({index + 1})\").locator('>div.v-treeview-node__children')\n                        is_found = find_and_click_item(page, child_nodes_locator, item_name, parent=None)\n                        if is_found:\n                            if parent is None:\n                                return True\n                            else:\n                                root_texts = root_locator.locator(f\">div:nth-child({index + 1})\").inner_text().splitlines()\n                                if parent in root_texts:\n                                    return True\n\n                    # \u0437\u0430\u043a\u0440\u044b\u0432\u0430\u0435\u043c \u0443\u0437\u0435\u043b, \u0435\u0441\u043b\u0438 \u0432 \u043d\u0435\u043c \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u043d\u0430\u0448\u043b\u0438\n                    if is_expanded:\n                        toggle_button = node.locator(NavigationPanelLocators.TOGGLE_BUTTON)\n                        toggle_button.click()\n\n            # \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0441 \u0437\u0430\u0434\u0430\u043d\u043d\u044b\u043c \u0438\u043c\u0435\u043d\u0435\u043c \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\n            return False\n\n        root_locator = self.get_locator(node_root_locator)\n        found = find_and_click_item(self.page, root_locator, item_name, parent)\n        assert found, f\"Navigation panel item {item_name} is missing\"\n\n    def traverse_panel_tree(self, node_root_locator: str | Locator, level=0, debug=False):\n        \"\"\"\n        \u0420\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u043e \u043e\u0431\u0445\u043e\u0434\u0438\u0442 \u0434\u0435\u0440\u0435\u0432\u043e v-treeview \u0438 \u0432\u044b\u0432\u043e\u0434\u0438\u0442 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e\u0431 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u0445 \u0432 \u0440\u0435\u0436\u0438\u043c\u0435 \u043e\u0442\u043b\u0430\u0434\u043a\u0438 (debug=True).\n\n        Args:\n            node_root_locator: \u041b\u043e\u043a\u0430\u0442\u043e\u0440 \u0434\u043b\u044f \u043f\u043e\u0438\u0441\u043a\u0430 \u043a\u043e\u0440\u043d\u0435\u0432\u044b\u0445 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0434\u0435\u0440\u0435\u0432\u0430 (\u041b\u043e\u043a\u0430\u0442\u043e\u0440 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0438\u043b\u0438 \u0441\u0442\u0440\u043e\u043a\u0430 \u0441 CSS/XPath).\n        \"\"\"\n        def traverse_tree(page, root_locator, level=0, debug=False):\n            # \u041d\u0430\u0445\u043e\u0434\u0438\u043c \u0432\u0441\u0435 \u043b\u043e\u043a\u0430\u0442\u043e\u0440\u044b \u043a\u043e\u0440\u043d\u0435\u0432\u044b\u0445 \u0443\u0437\u043b\u043e\u0432 \u043d\u0430 \u0442\u0435\u043a\u0443\u0449\u0435\u043c \u0443\u0440\u043e\u0432\u043d\u0435\n            nodes_count = root_locator.locator('>div.v-treeview-node').count()\n\n            for index in range(nodes_count):\n                node = root_locator.locator(f\">div:nth-child({index + 1})\").first\n\n                # \u0418\u0437\u0432\u043b\u0435\u043a\u0430\u0435\u043c \u0442\u0435\u043a\u0441\u0442 \u0438 \u0430\u0442\u0442\u0440\u0438\u0431\u0443\u0442\u044b \u0438\u0437 \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0433\u043e \u0443\u0437\u043b\u0430\n                node_text = node.inner_text()\n                node_class_attr = node.get_attribute('class')\n\n                is_expanded = False\n                has_children = False\n\n                # \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u043b\u0438\u0441\u0442 \u044d\u0442\u043e \u0438\u043b\u0438 \u043d\u0430\u0447\u0430\u043b\u043e \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u0430\n                if \"v-treeview-node--leaf\" in node_class_attr:\n                    if debug:\n                        print(f'[{level}][{index}] {node_text} (LEAF, Expanded: {is_expanded}, Has Children: {has_children})')\n                        print(\"-----------------------------------------\")\n                else:\n                    # \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c, \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043b\u0438 \u0443\u0437\u0435\u043b \u0440\u0430\u0441\u043a\u0440\u044b\u0442\u044b\u043c\n                    class_attr = node.locator(NavigationPanelLocators.TOGGLE_BUTTON).get_attribute('class')\n\n                    if \"v-treeview-node__toggle--open\" in class_attr:\n                        is_expanded = True\n\n                    # \u0415\u0441\u043b\u0438 \u0443\u0437\u0435\u043b \u0437\u0430\u043a\u0440\u044b\u0442 \u043c\u043e\u0436\u0435\u043c \u0435\u0433\u043e \u0440\u0430\u0441\u043a\u0440\u044b\u0442\u044c\n                    if is_expanded is False:\n                        toggle_button = node.locator(NavigationPanelLocators.TOGGLE_BUTTON)\n                        toggle_button.click()\n                        # \u0416\u0434\u0435\u043c, \u043f\u043e\u043a\u0430 \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u043f\u0440\u043e\u0433\u0440\u0443\u0437\u044f\u0442\u0441\u044f/\u043f\u043e\u044f\u0432\u044f\u0442\u0441\u044f\n                        page.wait_for_timeout(300)\n                        is_expanded = True\n\n                    # \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c, \u0438\u043c\u0435\u0435\u0442 \u043b\u0438 \u0443\u0437\u0435\u043b  \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b\n                    children_count = node.locator('>div.v-treeview-node__children').count()\n                    content = node.locator('>div.v-treeview-node__children').inner_html()\n                    if children_count > 0 and len(content) != 0:\n                        has_children = True\n\n                    edited_node_text = node_text.replace(\"expand_more\\n\", \"\")\n\n                    if debug:\n                        # \u0412\u044b\u0432\u043e\u0434\u0438\u043c \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e\u0431 \u0443\u0437\u043b\u0435\n                        print(f'[{level}][{index}] {edited_node_text} (NODE, Expanded: {is_expanded}, Has Children: {has_children})')\n                        print(\"-----------------------------------------\")\n\n                    # \u0420\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u044b\u0439 \u0432\u044b\u0437\u043e\u0432 \u0434\u043b\u044f \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0445 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432\n                    # \u0418\u0449\u0435\u043c \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b *\u0432\u043d\u0443\u0442\u0440\u0438* \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u0443\u0437\u043b\u0430\n                    if has_children and is_expanded:\n                        child_nodes_locator = root_locator.locator(f\">div:nth-child({index + 1})\").locator('>div.v-treeview-node__children')\n                        traverse_tree(page, child_nodes_locator, level+1, debug)\n\n        root_locator = self.get_locator(node_root_locator)\n        traverse_tree(self.page, root_locator, level=level, debug=debug)\n\n    # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0438:\n    def check_item_visibility(self, locator: str | Locator, item_name: str) -> None:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0441 \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u044b\u043c \u0442\u0435\u043a\u0441\u0442\u043e\u043c.\n\n        Args:\n            locator: \u041b\u043e\u043a\u0430\u0442\u043e\u0440 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0438\u043b\u0438 \u0441\u0442\u0440\u043e\u043a\u0430 \u0441 CSS/XPath.\n            item_name: \u0422\u0435\u043a\u0441\u0442 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0434\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438.\n\n        Note:\n            \u0412\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0434\u043b\u044f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0441 \u0442\u0435\u043a\u0441\u0442\u043e\u043c '\u0428\u0430\u0431\u043b\u043e\u043d\u044b'.\n        \"\"\"\n\n        msg = f\"Navigation panel item '{item_name}' is not visible\"\n\n        ## \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e: \u0432 \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u043e\u043d\u043d\u043e\u0439 \u043f\u0430\u043d\u0435\u043b\u0438 \u0435\u0441\u0442\u044c \u0434\u0432\u0435 \u043f\u0430\u043d\u0435\u043b\u0438 \u0441 \u0438\u043c\u0435\u043d\u0435\u043c \u0428\u0430\u0431\u043b\u043e\u043d\u044b\n        ## \u0434\u043b\u044f \u0438\u0445 \u0440\u0430\u0437\u043b\u0438\u0447\u0438\u044f \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u044b \u0438\u043d\u0434\u0435\u043a\u0441\u044b \u0428\u0430\u0431\u043b\u043e\u043d\u044b_1 \u0434\u043b\u044f \u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438/\u0428\u0430\u0431\u043b\u043e\u043d\u044b\n        ## \u0428\u0430\u0431\u043b\u043e\u043d\u044b_2 \u0434\u043b\u044f \u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438/ZTP/\u0428\u0430\u0431\u043b\u043e\u043d\u044b\n        loc = self.get_locator(locator)\n        if item_name == \"\u0428\u0430\u0431\u043b\u043e\u043d\u044b_1\":\n            loc = loc.get_by_text(\"\u0428\u0430\u0431\u043b\u043e\u043d\u044b\").first\n        elif item_name == \"\u0428\u0430\u0431\u043b\u043e\u043d\u044b_2\":\n            loc = loc.get_by_text(\"\u0428\u0430\u0431\u043b\u043e\u043d\u044b\").nth(1)\n        else:\n            loc = loc.get_by_text(item_name)\n        self.check_visibility(loc, msg)\n
    "},{"location":"components/navbar_component/#components.navbar_component.NavigationPanelComponent.__init__","title":"__init__(page)","text":"

    \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 \u043f\u0430\u043d\u0435\u043b\u0438 \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438.

    Parameters:

    Name Type Description Default page Page

    \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.

    required Source code in components\\navbar_component.py
    def __init__(self, page: Page):\n    \"\"\"\u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 \u043f\u0430\u043d\u0435\u043b\u0438 \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438.\n\n    Args:\n        page: \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.\n    \"\"\"\n\n    super().__init__(page)\n
    "},{"location":"components/navbar_component/#components.navbar_component.NavigationPanelComponent.check_item_visibility","title":"check_item_visibility(locator, item_name)","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0441 \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u044b\u043c \u0442\u0435\u043a\u0441\u0442\u043e\u043c.

    Parameters:

    Name Type Description Default locator str | Locator

    \u041b\u043e\u043a\u0430\u0442\u043e\u0440 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0438\u043b\u0438 \u0441\u0442\u0440\u043e\u043a\u0430 \u0441 CSS/XPath.

    required item_name str

    \u0422\u0435\u043a\u0441\u0442 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0434\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438.

    required Note

    \u0412\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0434\u043b\u044f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0441 \u0442\u0435\u043a\u0441\u0442\u043e\u043c '\u0428\u0430\u0431\u043b\u043e\u043d\u044b'.

    Source code in components\\navbar_component.py
    def check_item_visibility(self, locator: str | Locator, item_name: str) -> None:\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0441 \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u044b\u043c \u0442\u0435\u043a\u0441\u0442\u043e\u043c.\n\n    Args:\n        locator: \u041b\u043e\u043a\u0430\u0442\u043e\u0440 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0438\u043b\u0438 \u0441\u0442\u0440\u043e\u043a\u0430 \u0441 CSS/XPath.\n        item_name: \u0422\u0435\u043a\u0441\u0442 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0434\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438.\n\n    Note:\n        \u0412\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0434\u043b\u044f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0441 \u0442\u0435\u043a\u0441\u0442\u043e\u043c '\u0428\u0430\u0431\u043b\u043e\u043d\u044b'.\n    \"\"\"\n\n    msg = f\"Navigation panel item '{item_name}' is not visible\"\n\n    ## \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e: \u0432 \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u043e\u043d\u043d\u043e\u0439 \u043f\u0430\u043d\u0435\u043b\u0438 \u0435\u0441\u0442\u044c \u0434\u0432\u0435 \u043f\u0430\u043d\u0435\u043b\u0438 \u0441 \u0438\u043c\u0435\u043d\u0435\u043c \u0428\u0430\u0431\u043b\u043e\u043d\u044b\n    ## \u0434\u043b\u044f \u0438\u0445 \u0440\u0430\u0437\u043b\u0438\u0447\u0438\u044f \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u044b \u0438\u043d\u0434\u0435\u043a\u0441\u044b \u0428\u0430\u0431\u043b\u043e\u043d\u044b_1 \u0434\u043b\u044f \u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438/\u0428\u0430\u0431\u043b\u043e\u043d\u044b\n    ## \u0428\u0430\u0431\u043b\u043e\u043d\u044b_2 \u0434\u043b\u044f \u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438/ZTP/\u0428\u0430\u0431\u043b\u043e\u043d\u044b\n    loc = self.get_locator(locator)\n    if item_name == \"\u0428\u0430\u0431\u043b\u043e\u043d\u044b_1\":\n        loc = loc.get_by_text(\"\u0428\u0430\u0431\u043b\u043e\u043d\u044b\").first\n    elif item_name == \"\u0428\u0430\u0431\u043b\u043e\u043d\u044b_2\":\n        loc = loc.get_by_text(\"\u0428\u0430\u0431\u043b\u043e\u043d\u044b\").nth(1)\n    else:\n        loc = loc.get_by_text(item_name)\n    self.check_visibility(loc, msg)\n
    "},{"location":"components/navbar_component/#components.navbar_component.NavigationPanelComponent.click_item","title":"click_item(locator, item_name)","text":"

    \u041a\u043b\u0438\u043a\u0430\u0435\u0442 \u043f\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0443 \u0441 \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u044b\u043c \u0442\u0435\u043a\u0441\u0442\u043e\u043c.

    Parameters:

    Name Type Description Default locator str | Locator

    \u041b\u043e\u043a\u0430\u0442\u043e\u0440 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0438\u043b\u0438 \u0441\u0442\u0440\u043e\u043a\u0430 \u0441 CSS/XPath.

    required item_name str

    \u0422\u0435\u043a\u0441\u0442 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0434\u043b\u044f \u043a\u043b\u0438\u043a\u0430.

    required Source code in components\\navbar_component.py
    def click_item(self, locator: str | Locator, item_name: str) -> None:\n    \"\"\"\u041a\u043b\u0438\u043a\u0430\u0435\u0442 \u043f\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0443 \u0441 \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u044b\u043c \u0442\u0435\u043a\u0441\u0442\u043e\u043c.\n\n    Args:\n        locator: \u041b\u043e\u043a\u0430\u0442\u043e\u0440 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0438\u043b\u0438 \u0441\u0442\u0440\u043e\u043a\u0430 \u0441 CSS/XPath.\n        item_name: \u0422\u0435\u043a\u0441\u0442 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0434\u043b\u044f \u043a\u043b\u0438\u043a\u0430.\n    \"\"\"\n\n    loc = self.get_locator(locator)\n    loc.get_by_text(item_name).click()\n
    "},{"location":"components/navbar_component/#components.navbar_component.NavigationPanelComponent.click_sub_item","title":"click_sub_item(node_root_locator, item_name, parent)","text":"

    \u041a\u043b\u0438\u043a\u0430\u0435\u0442 \u043f\u043e \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u043e\u043c\u0443 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0443 \u0441 \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u044b\u043c \u0442\u0435\u043a\u0441\u0442\u043e\u043c.

    Parameters:

    Name Type Description Default node_root_locator str | Locator

    \u041b\u043e\u043a\u0430\u0442\u043e\u0440 \u0434\u043b\u044f \u043f\u043e\u0438\u0441\u043a\u0430 \u043a\u043e\u0440\u043d\u0435\u0432\u044b\u0445 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0434\u0435\u0440\u0435\u0432\u0430 (\u041b\u043e\u043a\u0430\u0442\u043e\u0440 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0438\u043b\u0438 \u0441\u0442\u0440\u043e\u043a\u0430 \u0441 CSS/XPath).

    required item_name str

    \u0422\u0435\u043a\u0441\u0442 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0434\u043b\u044f \u043a\u043b\u0438\u043a\u0430.

    required Source code in components\\navbar_component.py
    def click_sub_item(self, node_root_locator: str | Locator, item_name: str, parent: None|str) -> None:\n    \"\"\"\u041a\u043b\u0438\u043a\u0430\u0435\u0442 \u043f\u043e \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u043e\u043c\u0443 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0443 \u0441 \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u044b\u043c \u0442\u0435\u043a\u0441\u0442\u043e\u043c.\n\n    Args:\n        node_root_locator: \u041b\u043e\u043a\u0430\u0442\u043e\u0440 \u0434\u043b\u044f \u043f\u043e\u0438\u0441\u043a\u0430 \u043a\u043e\u0440\u043d\u0435\u0432\u044b\u0445 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0434\u0435\u0440\u0435\u0432\u0430 (\u041b\u043e\u043a\u0430\u0442\u043e\u0440 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0438\u043b\u0438 \u0441\u0442\u0440\u043e\u043a\u0430 \u0441 CSS/XPath).\n        item_name: \u0422\u0435\u043a\u0441\u0442 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0434\u043b\u044f \u043a\u043b\u0438\u043a\u0430.\n    \"\"\"\n\n    def find_and_click_item(page, root_locator, item_name: str, parent: None|str) -> bool:\n        # \u041d\u0430\u0445\u043e\u0434\u0438\u043c \u0432\u0441\u0435 \u043b\u043e\u043a\u0430\u0442\u043e\u0440\u044b \u043a\u043e\u0440\u043d\u0435\u0432\u044b\u0445 \u0443\u0437\u043b\u043e\u0432 \u043d\u0430 \u0442\u0435\u043a\u0443\u0449\u0435\u043c \u0443\u0440\u043e\u0432\u043d\u0435\n        root_node = root_locator.locator('>div.v-treeview-node')\n        # \u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0441\u043f\u0438\u0441\u043e\u043a \u0442\u0435\u043a\u0441\u0442\u043e\u0432\n        root_node_texts = root_node.all_inner_texts()\n\n        # \u0415\u0441\u043b\u0438 \u0438\u0441\u043a\u043e\u043c\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u043d\u0430 \u0434\u0430\u043d\u043d\u043e\u043c \u0443\u0440\u043e\u0432\u043d\u0435, \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u0435\u043c \u043b\u043e\u043a\u0430\u0442\u043e\u0440 \u0438 \u0434\u0435\u043b\u0430\u0435\u043c \u043a\u043b\u0438\u043a\n        if parent is None:\n            for index, node_text in enumerate(root_node_texts):\n                node_text = node_text.replace(\"expand_more\\n\", \"\")\n                if item_name == node_text:\n                    root_node.nth(index).click()\n                    return True\n\n        # \u0415\u0441\u043b\u0438 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u043d\u0435\u0442, \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u043e \u0438\u0449\u0435\u043c \u0434\u0430\u043b\u044c\u0448\u0435\n        nodes_count = root_locator.locator('>div.v-treeview-node').count()\n\n        for index in range(nodes_count):\n            node = root_locator.locator(f\">div:nth-child({index + 1})\").first\n\n            # \u0418\u0437\u0432\u043b\u0435\u043a\u0430\u0435\u043c \u0430\u0442\u0442\u0440\u0438\u0431\u0443\u0442\u044b \u0438\u0437 \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0433\u043e \u0443\u0437\u043b\u0430\n            node_class_attr = node.get_attribute('class')\n\n            is_expanded = False\n            has_children = False\n\n            # \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u043b\u0438\u0441\u0442 \u044d\u0442\u043e \u0438\u043b\u0438 \u043d\u0430\u0447\u0430\u043b\u043e \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u0430\n            if \"v-treeview-node--leaf\" not in node_class_attr:\n                # \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c, \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043b\u0438 \u0443\u0437\u0435\u043b \u0440\u0430\u0441\u043a\u0440\u044b\u0442\u044b\u043c\n                class_attr = node.locator(NavigationPanelLocators.TOGGLE_BUTTON).get_attribute('class')\n                if \"v-treeview-node__toggle--open\" in class_attr:\n                    is_expanded = True\n\n                # \u0415\u0441\u043b\u0438 \u0443\u0437\u0435\u043b \u0437\u0430\u043a\u0440\u044b\u0442 \u043c\u043e\u0436\u0435\u043c \u0435\u0433\u043e \u0440\u0430\u0441\u043a\u0440\u044b\u0442\u044c\n                if is_expanded is False:\n                    toggle_button = node.locator(NavigationPanelLocators.TOGGLE_BUTTON)\n                    toggle_button.click()\n                    # \u0416\u0434\u0435\u043c, \u043f\u043e\u043a\u0430 \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u043f\u0440\u043e\u0433\u0440\u0443\u0437\u044f\u0442\u0441\u044f/\u043f\u043e\u044f\u0432\u044f\u0442\u0441\u044f\n                    page.wait_for_timeout(300)\n                    is_expanded = True\n\n                # \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c, \u0438\u043c\u0435\u0435\u0442 \u043b\u0438 \u0443\u0437\u0435\u043b  \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b\n                children_count = node.locator('>div.v-treeview-node__children').count()\n                content = node.locator('>div.v-treeview-node__children').inner_html()\n                if children_count > 0 and len(content) != 0:\n                    has_children = True\n\n                # \u0420\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u044b\u0439 \u0432\u044b\u0437\u043e\u0432 \u0434\u043b\u044f \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0445 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432\n                # \u0418\u0449\u0435\u043c \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b *\u0432\u043d\u0443\u0442\u0440\u0438* \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u0443\u0437\u043b\u0430\n                if has_children and is_expanded:\n                    child_nodes_locator = root_locator.locator(f\">div:nth-child({index + 1})\").locator('>div.v-treeview-node__children')\n                    is_found = find_and_click_item(page, child_nodes_locator, item_name, parent=None)\n                    if is_found:\n                        if parent is None:\n                            return True\n                        else:\n                            root_texts = root_locator.locator(f\">div:nth-child({index + 1})\").inner_text().splitlines()\n                            if parent in root_texts:\n                                return True\n\n                # \u0437\u0430\u043a\u0440\u044b\u0432\u0430\u0435\u043c \u0443\u0437\u0435\u043b, \u0435\u0441\u043b\u0438 \u0432 \u043d\u0435\u043c \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u043d\u0430\u0448\u043b\u0438\n                if is_expanded:\n                    toggle_button = node.locator(NavigationPanelLocators.TOGGLE_BUTTON)\n                    toggle_button.click()\n\n        # \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0441 \u0437\u0430\u0434\u0430\u043d\u043d\u044b\u043c \u0438\u043c\u0435\u043d\u0435\u043c \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\n        return False\n\n    root_locator = self.get_locator(node_root_locator)\n    found = find_and_click_item(self.page, root_locator, item_name, parent)\n    assert found, f\"Navigation panel item {item_name} is missing\"\n
    "},{"location":"components/navbar_component/#components.navbar_component.NavigationPanelComponent.get_item_names","title":"get_item_names(locator)","text":"

    \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0442\u0435\u043a\u0441\u0442\u044b \u0432\u0441\u0435\u0445 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u043f\u043e \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u043e\u043c\u0443 \u043b\u043e\u043a\u0430\u0442\u043e\u0440\u0443.

    Parameters:

    Name Type Description Default locator str | Locator

    \u041b\u043e\u043a\u0430\u0442\u043e\u0440 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0438\u043b\u0438 \u0441\u0442\u0440\u043e\u043a\u0430 \u0441 CSS/XPath.

    required

    Returns:

    Type Description list[str]

    \u0421\u043f\u0438\u0441\u043e\u043a \u0442\u0435\u043a\u0441\u0442\u043e\u0432 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432.

    Source code in components\\navbar_component.py
    def get_item_names(self, locator: str | Locator) -> list[str]:\n    \"\"\"\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0442\u0435\u043a\u0441\u0442\u044b \u0432\u0441\u0435\u0445 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u043f\u043e \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u043e\u043c\u0443 \u043b\u043e\u043a\u0430\u0442\u043e\u0440\u0443.\n\n    Args:\n        locator: \u041b\u043e\u043a\u0430\u0442\u043e\u0440 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0438\u043b\u0438 \u0441\u0442\u0440\u043e\u043a\u0430 \u0441 CSS/XPath.\n\n    Returns:\n        \u0421\u043f\u0438\u0441\u043e\u043a \u0442\u0435\u043a\u0441\u0442\u043e\u0432 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432.\n    \"\"\"\n\n    loc = self.get_locator(locator)\n    return loc.all_inner_texts()\n
    "},{"location":"components/navbar_component/#components.navbar_component.NavigationPanelComponent.traverse_panel_tree","title":"traverse_panel_tree(node_root_locator, level=0, debug=False)","text":"

    \u0420\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u043e \u043e\u0431\u0445\u043e\u0434\u0438\u0442 \u0434\u0435\u0440\u0435\u0432\u043e v-treeview \u0438 \u0432\u044b\u0432\u043e\u0434\u0438\u0442 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e\u0431 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u0445 \u0432 \u0440\u0435\u0436\u0438\u043c\u0435 \u043e\u0442\u043b\u0430\u0434\u043a\u0438 (debug=True).

    Parameters:

    Name Type Description Default node_root_locator str | Locator

    \u041b\u043e\u043a\u0430\u0442\u043e\u0440 \u0434\u043b\u044f \u043f\u043e\u0438\u0441\u043a\u0430 \u043a\u043e\u0440\u043d\u0435\u0432\u044b\u0445 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0434\u0435\u0440\u0435\u0432\u0430 (\u041b\u043e\u043a\u0430\u0442\u043e\u0440 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0438\u043b\u0438 \u0441\u0442\u0440\u043e\u043a\u0430 \u0441 CSS/XPath).

    required Source code in components\\navbar_component.py
    def traverse_panel_tree(self, node_root_locator: str | Locator, level=0, debug=False):\n    \"\"\"\n    \u0420\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u043e \u043e\u0431\u0445\u043e\u0434\u0438\u0442 \u0434\u0435\u0440\u0435\u0432\u043e v-treeview \u0438 \u0432\u044b\u0432\u043e\u0434\u0438\u0442 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e\u0431 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u0445 \u0432 \u0440\u0435\u0436\u0438\u043c\u0435 \u043e\u0442\u043b\u0430\u0434\u043a\u0438 (debug=True).\n\n    Args:\n        node_root_locator: \u041b\u043e\u043a\u0430\u0442\u043e\u0440 \u0434\u043b\u044f \u043f\u043e\u0438\u0441\u043a\u0430 \u043a\u043e\u0440\u043d\u0435\u0432\u044b\u0445 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0434\u0435\u0440\u0435\u0432\u0430 (\u041b\u043e\u043a\u0430\u0442\u043e\u0440 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0438\u043b\u0438 \u0441\u0442\u0440\u043e\u043a\u0430 \u0441 CSS/XPath).\n    \"\"\"\n    def traverse_tree(page, root_locator, level=0, debug=False):\n        # \u041d\u0430\u0445\u043e\u0434\u0438\u043c \u0432\u0441\u0435 \u043b\u043e\u043a\u0430\u0442\u043e\u0440\u044b \u043a\u043e\u0440\u043d\u0435\u0432\u044b\u0445 \u0443\u0437\u043b\u043e\u0432 \u043d\u0430 \u0442\u0435\u043a\u0443\u0449\u0435\u043c \u0443\u0440\u043e\u0432\u043d\u0435\n        nodes_count = root_locator.locator('>div.v-treeview-node').count()\n\n        for index in range(nodes_count):\n            node = root_locator.locator(f\">div:nth-child({index + 1})\").first\n\n            # \u0418\u0437\u0432\u043b\u0435\u043a\u0430\u0435\u043c \u0442\u0435\u043a\u0441\u0442 \u0438 \u0430\u0442\u0442\u0440\u0438\u0431\u0443\u0442\u044b \u0438\u0437 \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0433\u043e \u0443\u0437\u043b\u0430\n            node_text = node.inner_text()\n            node_class_attr = node.get_attribute('class')\n\n            is_expanded = False\n            has_children = False\n\n            # \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u043b\u0438\u0441\u0442 \u044d\u0442\u043e \u0438\u043b\u0438 \u043d\u0430\u0447\u0430\u043b\u043e \u043f\u043e\u0434\u0434\u0435\u0440\u0435\u0432\u0430\n            if \"v-treeview-node--leaf\" in node_class_attr:\n                if debug:\n                    print(f'[{level}][{index}] {node_text} (LEAF, Expanded: {is_expanded}, Has Children: {has_children})')\n                    print(\"-----------------------------------------\")\n            else:\n                # \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c, \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043b\u0438 \u0443\u0437\u0435\u043b \u0440\u0430\u0441\u043a\u0440\u044b\u0442\u044b\u043c\n                class_attr = node.locator(NavigationPanelLocators.TOGGLE_BUTTON).get_attribute('class')\n\n                if \"v-treeview-node__toggle--open\" in class_attr:\n                    is_expanded = True\n\n                # \u0415\u0441\u043b\u0438 \u0443\u0437\u0435\u043b \u0437\u0430\u043a\u0440\u044b\u0442 \u043c\u043e\u0436\u0435\u043c \u0435\u0433\u043e \u0440\u0430\u0441\u043a\u0440\u044b\u0442\u044c\n                if is_expanded is False:\n                    toggle_button = node.locator(NavigationPanelLocators.TOGGLE_BUTTON)\n                    toggle_button.click()\n                    # \u0416\u0434\u0435\u043c, \u043f\u043e\u043a\u0430 \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u043f\u0440\u043e\u0433\u0440\u0443\u0437\u044f\u0442\u0441\u044f/\u043f\u043e\u044f\u0432\u044f\u0442\u0441\u044f\n                    page.wait_for_timeout(300)\n                    is_expanded = True\n\n                # \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c, \u0438\u043c\u0435\u0435\u0442 \u043b\u0438 \u0443\u0437\u0435\u043b  \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b\n                children_count = node.locator('>div.v-treeview-node__children').count()\n                content = node.locator('>div.v-treeview-node__children').inner_html()\n                if children_count > 0 and len(content) != 0:\n                    has_children = True\n\n                edited_node_text = node_text.replace(\"expand_more\\n\", \"\")\n\n                if debug:\n                    # \u0412\u044b\u0432\u043e\u0434\u0438\u043c \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e\u0431 \u0443\u0437\u043b\u0435\n                    print(f'[{level}][{index}] {edited_node_text} (NODE, Expanded: {is_expanded}, Has Children: {has_children})')\n                    print(\"-----------------------------------------\")\n\n                # \u0420\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u044b\u0439 \u0432\u044b\u0437\u043e\u0432 \u0434\u043b\u044f \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0445 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432\n                # \u0418\u0449\u0435\u043c \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b *\u0432\u043d\u0443\u0442\u0440\u0438* \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u0443\u0437\u043b\u0430\n                if has_children and is_expanded:\n                    child_nodes_locator = root_locator.locator(f\">div:nth-child({index + 1})\").locator('>div.v-treeview-node__children')\n                    traverse_tree(page, child_nodes_locator, level+1, debug)\n\n    root_locator = self.get_locator(node_root_locator)\n    traverse_tree(self.page, root_locator, level=level, debug=debug)\n
    "},{"location":"components/table_component/","title":"TableComponent","text":"

    \u041c\u043e\u0434\u0443\u043b\u044c \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430 \u0442\u0430\u0431\u043b\u0438\u0446\u044b. \u0421\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043a\u043b\u0430\u0441\u0441 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0442\u0430\u0431\u043b\u0438\u0447\u043d\u044b\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u043c\u0438.

    "},{"location":"components/table_component/#components.table_component.TableComponent","title":"TableComponent","text":"

    Bases: BaseComponent

    \u041a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 \u0442\u0430\u0431\u043b\u0438\u0446\u044b. \u041f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u043c\u0435\u0442\u043e\u0434\u044b \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0442\u0430\u0431\u043b\u0438\u0447\u043d\u044b\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u043c\u0438.

    Source code in components\\table_component.py
    class TableComponent(BaseComponent):\n    \"\"\"\u041a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 \u0442\u0430\u0431\u043b\u0438\u0446\u044b. \u041f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u043c\u0435\u0442\u043e\u0434\u044b \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0442\u0430\u0431\u043b\u0438\u0447\u043d\u044b\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u043c\u0438.\"\"\"\n\n    def __init__(self, page: Page):\n        \"\"\"\u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 \u0442\u0430\u0431\u043b\u0438\u0446\u044b.\n\n        Args:\n            page: \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.\n        \"\"\"\n\n        super().__init__(page)\n\n    # \u0414\u0435\u0439\u0441\u0442\u0432\u0438\u044f:\n    def click_arrow_button(self, table_locator: str | Locator, index: int) -> None:\n        \"\"\" \u041d\u0430\u0436\u0430\u0442\u0438\u0435 \u043a\u043d\u043e\u043f\u043a\u0438-\u0441\u0442\u0440\u0435\u043b\u043e\u0447\u043a\u0438 \u0432\u0432\u0435\u0440\u0445/\u0432\u043d\u0438\u0437 \u0432 \u044f\u0447\u0435\u0439\u043a\u0435 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430 \u0442\u0430\u0431\u043b\u0438\u0446\u044b\n\n        Args:\n            table_locator: \u041b\u043e\u043a\u0430\u0442\u043e\u0440 \u0442\u0430\u0431\u043b\u0438\u0446\u044b.\n            index: \u0418\u043d\u0434\u0435\u043a\u0441 \u044f\u0447\u0435\u0439\u043a\u0438 \u0432 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0435.\n        \"\"\"\n\n        table = self.get_locator(table_locator)\n        header_cells_count = table.locator(\"//thead/tr/th\").count()\n        assert index in range(header_cells_count), \"Header cell index is out of range\"\n\n        arrow_button = table.locator(\"//thead/tr/th\").nth(index).get_by_role(\"button\")\n        assert arrow_button.is_enabled(), f\"Arrow button is missing in {index} header cell\"\n        arrow_button.click()\n\n    def get_arrow_button_state(self, table_locator: str | Locator, index: int) -> str:\n        \"\"\" \u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u043a\u043d\u043e\u043f\u043a\u0438-\u0441\u0442\u0440\u0435\u043b\u043e\u0447\u043a\u0438 \u0432\u0432\u0435\u0440\u0445/\u0432\u043d\u0438\u0437 \u0432 \u044f\u0447\u0435\u0439\u043a\u0435 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430 \u0442\u0430\u0431\u043b\u0438\u0446\u044b\n\n        Args:\n            table_locator: \u041b\u043e\u043a\u0430\u0442\u043e\u0440 \u0442\u0430\u0431\u043b\u0438\u0446\u044b.\n            index: \u0418\u043d\u0434\u0435\u043a\u0441 \u044f\u0447\u0435\u0439\u043a\u0438 \u0432 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0435.\n\n        Returns:\n            up, \u0435\u0441\u043b\u0438 \u044d\u0442\u043e \u0441\u0442\u0440\u0435\u043b\u043e\u0447\u043a\u0430 \u0432\u0432\u0435\u0440\u0445. down, \u0435\u0441\u043b\u0438 \u044d\u0442\u043e \u0441\u0442\u0440\u0435\u043b\u043e\u0447\u043a\u0430 \u0432\u043d\u0438\u0437.\n        \"\"\"\n\n        table = self.get_locator(table_locator)\n        header_cells_count = table.locator(\"//thead/tr/th\").count()\n        assert index in range(header_cells_count), \"Header cell index is out of range\"\n\n        arrow_button = table.locator(\"//thead/tr/th\").nth(index).get_by_role(\"button\")\n        assert arrow_button.is_enabled(), f\"Arrow button is missing in {index} header cell\"\n\n        state = arrow_button.inner_text()\n        if state == \"keyboard_arrow_up\":\n            return \"up\"\n        elif state == \"keyboard_arrow_down\":\n            return \"down\"\n        else:\n            assert False, f\"Got unsupported arrow state: {state}\"\n\n    def get_row_locator(self, table_locator: str | Locator, row_index: int) -> Locator | None:\n        \"\"\"\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043b\u043e\u043a\u0430\u0442\u043e\u0440 \u0441\u0442\u0440\u043e\u043a\u0438 \u043f\u043e \u0438\u043d\u0434\u0435\u043a\u0441\u0443.\n\n        Args:\n            table_locator: \u041b\u043e\u043a\u0430\u0442\u043e\u0440 \u0442\u0430\u0431\u043b\u0438\u0446\u044b.\n            row_index: \u0418\u043d\u0434\u0435\u043a\u0441 \u0441\u0442\u0440\u043e\u043a\u0438.\n\n        Returns:\n            \u041b\u043e\u043a\u0430\u0442\u043e\u0440 \u0441\u0442\u0440\u043e\u043a\u0438 \u0438\u043b\u0438 None, \u0435\u0441\u043b\u0438 \u0438\u043d\u0434\u0435\u043a\u0441 \u0432\u043d\u0435 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0430.\n        \"\"\"\n\n        table = self.get_locator(table_locator)\n\n        rows = table.locator(\"//tbody/tr\")\n\n        if row_index in range(rows.count()):\n            return rows.nth(row_index)\n        else:\n            return None\n\n    def get_rows_count(self, locator: str | Locator) -> int:\n        \"\"\"\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0441\u0442\u0440\u043e\u043a \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435 (\u0431\u0435\u0437 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430).\n\n        Returns:\n            int: \u041a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0441\u0442\u0440\u043e\u043a \u0441 \u0434\u0430\u043d\u043d\u044b\u043c\u0438.\n\n        Raises:\n            AssertionError: \u0415\u0441\u043b\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u043f\u0443\u0441\u0442\u0430.\n        \"\"\"\n\n        table_content = self.read(locator)\n        rows_count = len(table_content)\n\n        if rows_count == 0:\n            assert False, \"The contents of the table are missing\"\n\n        return rows_count - 1\n\n\n    def read(self, locator: str | Locator) -> list[list[str]]:\n        \"\"\"\u0427\u0438\u0442\u0430\u0435\u0442 \u0434\u0430\u043d\u043d\u044b\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u044b, \u0432\u043a\u043b\u044e\u0447\u0430\u044f \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0438.\n\n        Args:\n            locator: \u041b\u043e\u043a\u0430\u0442\u043e\u0440 \u0442\u0430\u0431\u043b\u0438\u0446\u044b.\n\n        Returns:\n            \u0414\u0432\u0443\u043c\u0435\u0440\u043d\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a \u0441 \u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u044b.\n        \"\"\"\n\n        table_data = []\n        table = self.get_locator(locator)\n\n        # \u0427\u0442\u0435\u043d\u0438\u0435 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430 \u0442\u0430\u0431\u043b\u0438\u0446\u044b\n        header_cells = table.locator(\"//thead/tr\")\n        header_cell_text = header_cells.nth(0).inner_text()\n        header_data = header_cell_text.split('\\n')\n        table_data.append(header_data)\n\n        # \u0427\u0442\u0435\u043d\u0438\u0435 \u044f\u0447\u0435\u0435\u043a \u0442\u0430\u0431\u043b\u0438\u0446\u044b\n        rows = table.locator(\"//tbody/tr\")\n        for i in range(rows.count()):\n            row = rows.nth(i)\n            cells = row.locator(\"td\")\n            row_data = []\n            for j in range(cells.count()):\n                cell_text = cells.nth(j).inner_text()\n                row_data.append(cell_text)\n            table_data.append(row_data)\n\n        return table_data\n\n    # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0438:\n    def check_table_headers(self, actual_headers, expected_headers) -> None:\n        \"\"\" \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u044f \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u043e\u0436\u0438\u0434\u0430\u0435\u043c\u043e\u043c\u0443\"\"\"\n\n        is_equals = True\n\n        arrow_state = [\"keyboard_arrow_down\", \"keyboard_arrow_up\"]\n\n        for item in actual_headers:\n            item = item.strip()\n\n            if item in arrow_state:\n                continue\n\n            if item not in expected_headers:\n                is_equals = False\n\n        assert is_equals, \\\n            f\"Expected events table headers {expected_headers} are not equal {actual_headers}\"\n\n    def check_content(self,\n                      locator: str | Locator,\n                      expected_headers: list[str]) -> None:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u044b.\n\n        \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0438 \u0438 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435.\n\n        Raises:\n            AssertionError: \u0415\u0441\u043b\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u043f\u0443\u0441\u0442\u0430 \u0438\u043b\u0438 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0438 \u043d\u0435\u0432\u0435\u0440\u043d\u044b.\n        \"\"\"\n\n        table_content = self.read(locator)\n\n        if len(table_content) == 0:\n            assert False, \"The contents of the table are missing\"\n\n        self.check_table_headers(table_content[0], expected_headers)\n\n        if len(table_content) == 1:\n            assert False, \"Table body is missing\"\n\n    def check_column_descending_order(self,\n                                         locator: str | Locator,\n                                         index: int) -> bool:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430, \u0447\u0442\u043e \u0437\u0430\u0434\u0430\u043d\u043d\u044b\u0439 \u0441\u0442\u043e\u043b\u0431\u0435\u0446 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0443\u043f\u043e\u0440\u044f\u0434\u043e\u0447\u0435\u043d \u043f\u043e \u0443\u0431\u044b\u0432\u0430\u043d\u0438\u044e.\n\n        Args:\n            locator: \u041b\u043e\u043a\u0430\u0442\u043e\u0440 \u0442\u0430\u0431\u043b\u0438\u0446\u044b.\n            index: \u0418\u043d\u0434\u0435\u043a\u0441 \u0441\u0442\u043e\u043b\u0431\u0446\u0430.\n\n        Returns:\n            True, \u0435\u0441\u043b\u0438 \u0441\u0442\u043e\u043b\u0431\u0435\u0446 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0443\u043f\u043e\u0440\u044f\u0434\u043e\u0447\u0435\u043d \u043f\u043e \u0443\u0431\u044b\u0432\u0430\u043d\u0438\u044e. \u0418\u043d\u0430\u0447\u0435: False\n        \"\"\"\n\n        table_content = self.read(locator)\n\n        if len(table_content) == 0:\n            assert False, \"The contents of the table are missing\"\n\n        del table_content[0]\n\n        assert index in range(len(table_content[0])), \\\n                            \"Column index is out of range\"\n        column = []\n        for i in range(len(table_content)):\n            column.append(table_content[i][index])\n\n        return all([x > y for x, y in zip(column, column[1:])])\n\n    def check_first_row_visibility(self, locator: str | Locator) -> None:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u043f\u0435\u0440\u0432\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u044b.\n\n        Args:\n            locator: \u041b\u043e\u043a\u0430\u0442\u043e\u0440 \u0442\u0430\u0431\u043b\u0438\u0446\u044b.\n        \"\"\"\n\n        table = self.get_locator(locator)\n        first_row = table.locator(\"//tbody/tr\").first\n        expect(first_row).to_be_visible(), \"The first table row is not visible\"\n\n    def check_last_row_visibility(self, locator: str | Locator) -> None:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0439 \u0441\u0442\u0440\u043e\u043a\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u044b.\n\n        Args:\n            locator: \u041b\u043e\u043a\u0430\u0442\u043e\u0440 \u0442\u0430\u0431\u043b\u0438\u0446\u044b.\n        \"\"\"\n\n        table = self.get_locator(locator)\n        last_row = table.locator(\"//tbody/tr\").last\n        expect(last_row).to_be_visible(), \"The last table row is not visible\"\n\n    def check_row_highlighting(self, locator: str | Locator, row_index: int) -> None:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u0446\u0432\u0435\u0442\u0430 \u0441\u0442\u0440\u043e\u043a\u0438 \u043f\u0440\u0438 \u043d\u0430\u0432\u0435\u0434\u0435\u043d\u0438\u0438.\n\n        Args:\n            locator: \u041b\u043e\u043a\u0430\u0442\u043e\u0440 \u0442\u0430\u0431\u043b\u0438\u0446\u044b.\n            row_index: \u0418\u043d\u0434\u0435\u043a\u0441 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438.\n        \"\"\"\n\n        table = self.get_locator(locator)\n        row = table.locator(\"//tbody/tr\").nth(row_index)\n\n        row.scroll_into_view_if_needed()\n        hover_element = row.locator(\".body-row-hover\")\n        initial_color = hover_element.evaluate(\"el => window.getComputedStyle(el).backgroundColor\")\n\n        row.hover()\n        self.page.wait_for_timeout(300)\n\n        new_color = hover_element.evaluate(\"el => window.getComputedStyle(el).backgroundColor\")\n        assert initial_color != new_color, \"Color of row did not change when hovering the cursor\"\n
    "},{"location":"components/table_component/#components.table_component.TableComponent.__init__","title":"__init__(page)","text":"

    \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 \u0442\u0430\u0431\u043b\u0438\u0446\u044b.

    Parameters:

    Name Type Description Default page Page

    \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.

    required Source code in components\\table_component.py
    def __init__(self, page: Page):\n    \"\"\"\u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 \u0442\u0430\u0431\u043b\u0438\u0446\u044b.\n\n    Args:\n        page: \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.\n    \"\"\"\n\n    super().__init__(page)\n
    "},{"location":"components/table_component/#components.table_component.TableComponent.check_column_descending_order","title":"check_column_descending_order(locator, index)","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430, \u0447\u0442\u043e \u0437\u0430\u0434\u0430\u043d\u043d\u044b\u0439 \u0441\u0442\u043e\u043b\u0431\u0435\u0446 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0443\u043f\u043e\u0440\u044f\u0434\u043e\u0447\u0435\u043d \u043f\u043e \u0443\u0431\u044b\u0432\u0430\u043d\u0438\u044e.

    Parameters:

    Name Type Description Default locator str | Locator

    \u041b\u043e\u043a\u0430\u0442\u043e\u0440 \u0442\u0430\u0431\u043b\u0438\u0446\u044b.

    required index int

    \u0418\u043d\u0434\u0435\u043a\u0441 \u0441\u0442\u043e\u043b\u0431\u0446\u0430.

    required

    Returns:

    Type Description bool

    True, \u0435\u0441\u043b\u0438 \u0441\u0442\u043e\u043b\u0431\u0435\u0446 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0443\u043f\u043e\u0440\u044f\u0434\u043e\u0447\u0435\u043d \u043f\u043e \u0443\u0431\u044b\u0432\u0430\u043d\u0438\u044e. \u0418\u043d\u0430\u0447\u0435: False

    Source code in components\\table_component.py
    def check_column_descending_order(self,\n                                     locator: str | Locator,\n                                     index: int) -> bool:\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430, \u0447\u0442\u043e \u0437\u0430\u0434\u0430\u043d\u043d\u044b\u0439 \u0441\u0442\u043e\u043b\u0431\u0435\u0446 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0443\u043f\u043e\u0440\u044f\u0434\u043e\u0447\u0435\u043d \u043f\u043e \u0443\u0431\u044b\u0432\u0430\u043d\u0438\u044e.\n\n    Args:\n        locator: \u041b\u043e\u043a\u0430\u0442\u043e\u0440 \u0442\u0430\u0431\u043b\u0438\u0446\u044b.\n        index: \u0418\u043d\u0434\u0435\u043a\u0441 \u0441\u0442\u043e\u043b\u0431\u0446\u0430.\n\n    Returns:\n        True, \u0435\u0441\u043b\u0438 \u0441\u0442\u043e\u043b\u0431\u0435\u0446 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0443\u043f\u043e\u0440\u044f\u0434\u043e\u0447\u0435\u043d \u043f\u043e \u0443\u0431\u044b\u0432\u0430\u043d\u0438\u044e. \u0418\u043d\u0430\u0447\u0435: False\n    \"\"\"\n\n    table_content = self.read(locator)\n\n    if len(table_content) == 0:\n        assert False, \"The contents of the table are missing\"\n\n    del table_content[0]\n\n    assert index in range(len(table_content[0])), \\\n                        \"Column index is out of range\"\n    column = []\n    for i in range(len(table_content)):\n        column.append(table_content[i][index])\n\n    return all([x > y for x, y in zip(column, column[1:])])\n
    "},{"location":"components/table_component/#components.table_component.TableComponent.check_content","title":"check_content(locator, expected_headers)","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u044b.

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0438 \u0438 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435.

    Raises:

    Type Description AssertionError

    \u0415\u0441\u043b\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u043f\u0443\u0441\u0442\u0430 \u0438\u043b\u0438 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0438 \u043d\u0435\u0432\u0435\u0440\u043d\u044b.

    Source code in components\\table_component.py
    def check_content(self,\n                  locator: str | Locator,\n                  expected_headers: list[str]) -> None:\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u044b.\n\n    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0438 \u0438 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435.\n\n    Raises:\n        AssertionError: \u0415\u0441\u043b\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u043f\u0443\u0441\u0442\u0430 \u0438\u043b\u0438 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0438 \u043d\u0435\u0432\u0435\u0440\u043d\u044b.\n    \"\"\"\n\n    table_content = self.read(locator)\n\n    if len(table_content) == 0:\n        assert False, \"The contents of the table are missing\"\n\n    self.check_table_headers(table_content[0], expected_headers)\n\n    if len(table_content) == 1:\n        assert False, \"Table body is missing\"\n
    "},{"location":"components/table_component/#components.table_component.TableComponent.check_first_row_visibility","title":"check_first_row_visibility(locator)","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u043f\u0435\u0440\u0432\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u044b.

    Parameters:

    Name Type Description Default locator str | Locator

    \u041b\u043e\u043a\u0430\u0442\u043e\u0440 \u0442\u0430\u0431\u043b\u0438\u0446\u044b.

    required Source code in components\\table_component.py
    def check_first_row_visibility(self, locator: str | Locator) -> None:\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u043f\u0435\u0440\u0432\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u044b.\n\n    Args:\n        locator: \u041b\u043e\u043a\u0430\u0442\u043e\u0440 \u0442\u0430\u0431\u043b\u0438\u0446\u044b.\n    \"\"\"\n\n    table = self.get_locator(locator)\n    first_row = table.locator(\"//tbody/tr\").first\n    expect(first_row).to_be_visible(), \"The first table row is not visible\"\n
    "},{"location":"components/table_component/#components.table_component.TableComponent.check_last_row_visibility","title":"check_last_row_visibility(locator)","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0439 \u0441\u0442\u0440\u043e\u043a\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u044b.

    Parameters:

    Name Type Description Default locator str | Locator

    \u041b\u043e\u043a\u0430\u0442\u043e\u0440 \u0442\u0430\u0431\u043b\u0438\u0446\u044b.

    required Source code in components\\table_component.py
    def check_last_row_visibility(self, locator: str | Locator) -> None:\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0439 \u0441\u0442\u0440\u043e\u043a\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u044b.\n\n    Args:\n        locator: \u041b\u043e\u043a\u0430\u0442\u043e\u0440 \u0442\u0430\u0431\u043b\u0438\u0446\u044b.\n    \"\"\"\n\n    table = self.get_locator(locator)\n    last_row = table.locator(\"//tbody/tr\").last\n    expect(last_row).to_be_visible(), \"The last table row is not visible\"\n
    "},{"location":"components/table_component/#components.table_component.TableComponent.check_row_highlighting","title":"check_row_highlighting(locator, row_index)","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u0446\u0432\u0435\u0442\u0430 \u0441\u0442\u0440\u043e\u043a\u0438 \u043f\u0440\u0438 \u043d\u0430\u0432\u0435\u0434\u0435\u043d\u0438\u0438.

    Parameters:

    Name Type Description Default locator str | Locator

    \u041b\u043e\u043a\u0430\u0442\u043e\u0440 \u0442\u0430\u0431\u043b\u0438\u0446\u044b.

    required row_index int

    \u0418\u043d\u0434\u0435\u043a\u0441 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438.

    required Source code in components\\table_component.py
    def check_row_highlighting(self, locator: str | Locator, row_index: int) -> None:\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u0446\u0432\u0435\u0442\u0430 \u0441\u0442\u0440\u043e\u043a\u0438 \u043f\u0440\u0438 \u043d\u0430\u0432\u0435\u0434\u0435\u043d\u0438\u0438.\n\n    Args:\n        locator: \u041b\u043e\u043a\u0430\u0442\u043e\u0440 \u0442\u0430\u0431\u043b\u0438\u0446\u044b.\n        row_index: \u0418\u043d\u0434\u0435\u043a\u0441 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438.\n    \"\"\"\n\n    table = self.get_locator(locator)\n    row = table.locator(\"//tbody/tr\").nth(row_index)\n\n    row.scroll_into_view_if_needed()\n    hover_element = row.locator(\".body-row-hover\")\n    initial_color = hover_element.evaluate(\"el => window.getComputedStyle(el).backgroundColor\")\n\n    row.hover()\n    self.page.wait_for_timeout(300)\n\n    new_color = hover_element.evaluate(\"el => window.getComputedStyle(el).backgroundColor\")\n    assert initial_color != new_color, \"Color of row did not change when hovering the cursor\"\n
    "},{"location":"components/table_component/#components.table_component.TableComponent.check_table_headers","title":"check_table_headers(actual_headers, expected_headers)","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u044f \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u043e\u0436\u0438\u0434\u0430\u0435\u043c\u043e\u043c\u0443

    Source code in components\\table_component.py
    def check_table_headers(self, actual_headers, expected_headers) -> None:\n    \"\"\" \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u044f \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u043e\u0436\u0438\u0434\u0430\u0435\u043c\u043e\u043c\u0443\"\"\"\n\n    is_equals = True\n\n    arrow_state = [\"keyboard_arrow_down\", \"keyboard_arrow_up\"]\n\n    for item in actual_headers:\n        item = item.strip()\n\n        if item in arrow_state:\n            continue\n\n        if item not in expected_headers:\n            is_equals = False\n\n    assert is_equals, \\\n        f\"Expected events table headers {expected_headers} are not equal {actual_headers}\"\n
    "},{"location":"components/table_component/#components.table_component.TableComponent.click_arrow_button","title":"click_arrow_button(table_locator, index)","text":"

    \u041d\u0430\u0436\u0430\u0442\u0438\u0435 \u043a\u043d\u043e\u043f\u043a\u0438-\u0441\u0442\u0440\u0435\u043b\u043e\u0447\u043a\u0438 \u0432\u0432\u0435\u0440\u0445/\u0432\u043d\u0438\u0437 \u0432 \u044f\u0447\u0435\u0439\u043a\u0435 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430 \u0442\u0430\u0431\u043b\u0438\u0446\u044b

    Parameters:

    Name Type Description Default table_locator str | Locator

    \u041b\u043e\u043a\u0430\u0442\u043e\u0440 \u0442\u0430\u0431\u043b\u0438\u0446\u044b.

    required index int

    \u0418\u043d\u0434\u0435\u043a\u0441 \u044f\u0447\u0435\u0439\u043a\u0438 \u0432 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0435.

    required Source code in components\\table_component.py
    def click_arrow_button(self, table_locator: str | Locator, index: int) -> None:\n    \"\"\" \u041d\u0430\u0436\u0430\u0442\u0438\u0435 \u043a\u043d\u043e\u043f\u043a\u0438-\u0441\u0442\u0440\u0435\u043b\u043e\u0447\u043a\u0438 \u0432\u0432\u0435\u0440\u0445/\u0432\u043d\u0438\u0437 \u0432 \u044f\u0447\u0435\u0439\u043a\u0435 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430 \u0442\u0430\u0431\u043b\u0438\u0446\u044b\n\n    Args:\n        table_locator: \u041b\u043e\u043a\u0430\u0442\u043e\u0440 \u0442\u0430\u0431\u043b\u0438\u0446\u044b.\n        index: \u0418\u043d\u0434\u0435\u043a\u0441 \u044f\u0447\u0435\u0439\u043a\u0438 \u0432 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0435.\n    \"\"\"\n\n    table = self.get_locator(table_locator)\n    header_cells_count = table.locator(\"//thead/tr/th\").count()\n    assert index in range(header_cells_count), \"Header cell index is out of range\"\n\n    arrow_button = table.locator(\"//thead/tr/th\").nth(index).get_by_role(\"button\")\n    assert arrow_button.is_enabled(), f\"Arrow button is missing in {index} header cell\"\n    arrow_button.click()\n
    "},{"location":"components/table_component/#components.table_component.TableComponent.get_arrow_button_state","title":"get_arrow_button_state(table_locator, index)","text":"

    \u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u043a\u043d\u043e\u043f\u043a\u0438-\u0441\u0442\u0440\u0435\u043b\u043e\u0447\u043a\u0438 \u0432\u0432\u0435\u0440\u0445/\u0432\u043d\u0438\u0437 \u0432 \u044f\u0447\u0435\u0439\u043a\u0435 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430 \u0442\u0430\u0431\u043b\u0438\u0446\u044b

    Parameters:

    Name Type Description Default table_locator str | Locator

    \u041b\u043e\u043a\u0430\u0442\u043e\u0440 \u0442\u0430\u0431\u043b\u0438\u0446\u044b.

    required index int

    \u0418\u043d\u0434\u0435\u043a\u0441 \u044f\u0447\u0435\u0439\u043a\u0438 \u0432 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0435.

    required

    Returns:

    Type Description str

    up, \u0435\u0441\u043b\u0438 \u044d\u0442\u043e \u0441\u0442\u0440\u0435\u043b\u043e\u0447\u043a\u0430 \u0432\u0432\u0435\u0440\u0445. down, \u0435\u0441\u043b\u0438 \u044d\u0442\u043e \u0441\u0442\u0440\u0435\u043b\u043e\u0447\u043a\u0430 \u0432\u043d\u0438\u0437.

    Source code in components\\table_component.py
    def get_arrow_button_state(self, table_locator: str | Locator, index: int) -> str:\n    \"\"\" \u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u043a\u043d\u043e\u043f\u043a\u0438-\u0441\u0442\u0440\u0435\u043b\u043e\u0447\u043a\u0438 \u0432\u0432\u0435\u0440\u0445/\u0432\u043d\u0438\u0437 \u0432 \u044f\u0447\u0435\u0439\u043a\u0435 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430 \u0442\u0430\u0431\u043b\u0438\u0446\u044b\n\n    Args:\n        table_locator: \u041b\u043e\u043a\u0430\u0442\u043e\u0440 \u0442\u0430\u0431\u043b\u0438\u0446\u044b.\n        index: \u0418\u043d\u0434\u0435\u043a\u0441 \u044f\u0447\u0435\u0439\u043a\u0438 \u0432 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0435.\n\n    Returns:\n        up, \u0435\u0441\u043b\u0438 \u044d\u0442\u043e \u0441\u0442\u0440\u0435\u043b\u043e\u0447\u043a\u0430 \u0432\u0432\u0435\u0440\u0445. down, \u0435\u0441\u043b\u0438 \u044d\u0442\u043e \u0441\u0442\u0440\u0435\u043b\u043e\u0447\u043a\u0430 \u0432\u043d\u0438\u0437.\n    \"\"\"\n\n    table = self.get_locator(table_locator)\n    header_cells_count = table.locator(\"//thead/tr/th\").count()\n    assert index in range(header_cells_count), \"Header cell index is out of range\"\n\n    arrow_button = table.locator(\"//thead/tr/th\").nth(index).get_by_role(\"button\")\n    assert arrow_button.is_enabled(), f\"Arrow button is missing in {index} header cell\"\n\n    state = arrow_button.inner_text()\n    if state == \"keyboard_arrow_up\":\n        return \"up\"\n    elif state == \"keyboard_arrow_down\":\n        return \"down\"\n    else:\n        assert False, f\"Got unsupported arrow state: {state}\"\n
    "},{"location":"components/table_component/#components.table_component.TableComponent.get_row_locator","title":"get_row_locator(table_locator, row_index)","text":"

    \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043b\u043e\u043a\u0430\u0442\u043e\u0440 \u0441\u0442\u0440\u043e\u043a\u0438 \u043f\u043e \u0438\u043d\u0434\u0435\u043a\u0441\u0443.

    Parameters:

    Name Type Description Default table_locator str | Locator

    \u041b\u043e\u043a\u0430\u0442\u043e\u0440 \u0442\u0430\u0431\u043b\u0438\u0446\u044b.

    required row_index int

    \u0418\u043d\u0434\u0435\u043a\u0441 \u0441\u0442\u0440\u043e\u043a\u0438.

    required

    Returns:

    Type Description Locator | None

    \u041b\u043e\u043a\u0430\u0442\u043e\u0440 \u0441\u0442\u0440\u043e\u043a\u0438 \u0438\u043b\u0438 None, \u0435\u0441\u043b\u0438 \u0438\u043d\u0434\u0435\u043a\u0441 \u0432\u043d\u0435 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0430.

    Source code in components\\table_component.py
    def get_row_locator(self, table_locator: str | Locator, row_index: int) -> Locator | None:\n    \"\"\"\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043b\u043e\u043a\u0430\u0442\u043e\u0440 \u0441\u0442\u0440\u043e\u043a\u0438 \u043f\u043e \u0438\u043d\u0434\u0435\u043a\u0441\u0443.\n\n    Args:\n        table_locator: \u041b\u043e\u043a\u0430\u0442\u043e\u0440 \u0442\u0430\u0431\u043b\u0438\u0446\u044b.\n        row_index: \u0418\u043d\u0434\u0435\u043a\u0441 \u0441\u0442\u0440\u043e\u043a\u0438.\n\n    Returns:\n        \u041b\u043e\u043a\u0430\u0442\u043e\u0440 \u0441\u0442\u0440\u043e\u043a\u0438 \u0438\u043b\u0438 None, \u0435\u0441\u043b\u0438 \u0438\u043d\u0434\u0435\u043a\u0441 \u0432\u043d\u0435 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0430.\n    \"\"\"\n\n    table = self.get_locator(table_locator)\n\n    rows = table.locator(\"//tbody/tr\")\n\n    if row_index in range(rows.count()):\n        return rows.nth(row_index)\n    else:\n        return None\n
    "},{"location":"components/table_component/#components.table_component.TableComponent.get_rows_count","title":"get_rows_count(locator)","text":"

    \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0441\u0442\u0440\u043e\u043a \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435 (\u0431\u0435\u0437 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430).

    Returns:

    Name Type Description int int

    \u041a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0441\u0442\u0440\u043e\u043a \u0441 \u0434\u0430\u043d\u043d\u044b\u043c\u0438.

    Raises:

    Type Description AssertionError

    \u0415\u0441\u043b\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u043f\u0443\u0441\u0442\u0430.

    Source code in components\\table_component.py
    def get_rows_count(self, locator: str | Locator) -> int:\n    \"\"\"\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0441\u0442\u0440\u043e\u043a \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435 (\u0431\u0435\u0437 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430).\n\n    Returns:\n        int: \u041a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0441\u0442\u0440\u043e\u043a \u0441 \u0434\u0430\u043d\u043d\u044b\u043c\u0438.\n\n    Raises:\n        AssertionError: \u0415\u0441\u043b\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u043f\u0443\u0441\u0442\u0430.\n    \"\"\"\n\n    table_content = self.read(locator)\n    rows_count = len(table_content)\n\n    if rows_count == 0:\n        assert False, \"The contents of the table are missing\"\n\n    return rows_count - 1\n
    "},{"location":"components/table_component/#components.table_component.TableComponent.read","title":"read(locator)","text":"

    \u0427\u0438\u0442\u0430\u0435\u0442 \u0434\u0430\u043d\u043d\u044b\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u044b, \u0432\u043a\u043b\u044e\u0447\u0430\u044f \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0438.

    Parameters:

    Name Type Description Default locator str | Locator

    \u041b\u043e\u043a\u0430\u0442\u043e\u0440 \u0442\u0430\u0431\u043b\u0438\u0446\u044b.

    required

    Returns:

    Type Description list[list[str]]

    \u0414\u0432\u0443\u043c\u0435\u0440\u043d\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a \u0441 \u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u044b.

    Source code in components\\table_component.py
    def read(self, locator: str | Locator) -> list[list[str]]:\n    \"\"\"\u0427\u0438\u0442\u0430\u0435\u0442 \u0434\u0430\u043d\u043d\u044b\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u044b, \u0432\u043a\u043b\u044e\u0447\u0430\u044f \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0438.\n\n    Args:\n        locator: \u041b\u043e\u043a\u0430\u0442\u043e\u0440 \u0442\u0430\u0431\u043b\u0438\u0446\u044b.\n\n    Returns:\n        \u0414\u0432\u0443\u043c\u0435\u0440\u043d\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a \u0441 \u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u044b.\n    \"\"\"\n\n    table_data = []\n    table = self.get_locator(locator)\n\n    # \u0427\u0442\u0435\u043d\u0438\u0435 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430 \u0442\u0430\u0431\u043b\u0438\u0446\u044b\n    header_cells = table.locator(\"//thead/tr\")\n    header_cell_text = header_cells.nth(0).inner_text()\n    header_data = header_cell_text.split('\\n')\n    table_data.append(header_data)\n\n    # \u0427\u0442\u0435\u043d\u0438\u0435 \u044f\u0447\u0435\u0435\u043a \u0442\u0430\u0431\u043b\u0438\u0446\u044b\n    rows = table.locator(\"//tbody/tr\")\n    for i in range(rows.count()):\n        row = rows.nth(i)\n        cells = row.locator(\"td\")\n        row_data = []\n        for j in range(cells.count()):\n            cell_text = cells.nth(j).inner_text()\n            row_data.append(cell_text)\n        table_data.append(row_data)\n\n    return table_data\n
    "},{"location":"components/toolbar_component/","title":"ToolbarComponent","text":"

    \u041c\u043e\u0434\u0443\u043b\u044c \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430 \u0442\u0443\u043b\u0431\u0430\u0440\u0430 (\u043f\u0430\u043d\u0435\u043b\u0438 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432).

    \u0421\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043a\u043b\u0430\u0441\u0441 ToolbarComponent \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u043c\u0438 \u0442\u0443\u043b\u0431\u0430\u0440\u0430: - \u0423\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043a\u043d\u043e\u043f\u043a\u0430\u043c\u0438 \u0438 \u0438\u0445 \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0430\u043c\u0438 - \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 - \u0412\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u0441 \u043f\u0430\u043d\u0435\u043b\u044c\u044e \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432

    "},{"location":"components/toolbar_component/#components.toolbar_component.ToolbarComponent","title":"ToolbarComponent","text":"

    Bases: BaseComponent

    \u041a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 \u0442\u0443\u043b\u0431\u0430\u0440\u0430. \u041f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u043c\u0435\u0442\u043e\u0434\u044b \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u043f\u0430\u043d\u0435\u043b\u044c\u044e \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432.

    Parameters:

    Name Type Description Default page Page

    \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright

    required title str

    \u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a \u0442\u0443\u043b\u0431\u0430\u0440\u0430

    required Source code in components\\toolbar_component.py
    class ToolbarComponent(BaseComponent):\n    \"\"\"\u041a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 \u0442\u0443\u043b\u0431\u0430\u0440\u0430. \u041f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u043c\u0435\u0442\u043e\u0434\u044b \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u043f\u0430\u043d\u0435\u043b\u044c\u044e \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432.\n\n    Args:\n        page (Page): \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright\n        title (str): \u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a \u0442\u0443\u043b\u0431\u0430\u0440\u0430\n    \"\"\"\n\n    def __init__(self, page: Page, title: str):\n        \"\"\"\u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 \u0442\u0443\u043b\u0431\u0430\u0440\u0430 \u0441 \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u044b\u043c \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u043e\u043c.\"\"\"\n        super().__init__(page)\n        self.title = title\n        self.buttons = []\n\n    def add_title(self, title: str) -> None:\n        \"\"\"\u0423\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442 \u043d\u043e\u0432\u044b\u0439 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a \u0442\u0443\u043b\u0431\u0430\u0440\u0430.\n\n        Args:\n            title (str): \u041d\u043e\u0432\u044b\u0439 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a\n        \"\"\"\n        self.title = title\n\n    def add_tooltip_button(self, locator: Locator, name: str) -> None:\n        \"\"\"\u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u043a\u043d\u043e\u043f\u043a\u0443 \u0441 \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u043e\u0439 \u0432 \u0442\u0443\u043b\u0431\u0430\u0440.\n\n        Args:\n            locator (Locator): \u041b\u043e\u043a\u0430\u0442\u043e\u0440 \u043a\u043d\u043e\u043f\u043a\u0438\n            name (str): \u0423\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u0435 \u0438\u043c\u044f \u043a\u043d\u043e\u043f\u043a\u0438\n        \"\"\"\n        self.buttons.append(TooltipButton(self.page, locator, name))\n\n    def add_tab_button(self, locator: Locator, name: str) -> None:\n        \"\"\"\u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u043a\u043d\u043e\u043f\u043a\u0443 \u0442\u0438\u043f\u0430 v-tab \u0432 \u0442\u0443\u043b\u0431\u0430\u0440.\n\n        Args:\n            locator (Locator): \u041b\u043e\u043a\u0430\u0442\u043e\u0440 \u043a\u043d\u043e\u043f\u043a\u0438\n            name (str): \u0423\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u0435 \u0438\u043c\u044f \u043a\u043d\u043e\u043f\u043a\u0438\n        \"\"\"\n        self.buttons.append(TabButton(self.page, locator, name))\n\n    def add_button(self, locator: Locator, name: str) -> None:\n        \"\"\"\u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u043a\u043d\u043e\u043f\u043a\u0443 \u0432 \u0442\u0443\u043b\u0431\u0430\u0440.\n\n        Args:\n            locator (Locator): \u041b\u043e\u043a\u0430\u0442\u043e\u0440 \u043a\u043d\u043e\u043f\u043a\u0438\n            name (str): \u0423\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u0435 \u0438\u043c\u044f \u043a\u043d\u043e\u043f\u043a\u0438\n        \"\"\"\n        self.buttons.append(Button(self.page, locator, name))\n\n    def get_button_by_name(self, name: str) -> TooltipButton | TabButton | Button | None:\n        \"\"\"\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043a\u043d\u043e\u043f\u043a\u0443 \u043f\u043e \u0438\u043c\u0435\u043d\u0438.\n\n        Args:\n            name (str): \u0418\u043c\u044f \u043a\u043d\u043e\u043f\u043a\u0438\n\n        Returns:\n            TooltipButton | TabButton | Button | None: \u041d\u0430\u0439\u0434\u0435\u043d\u043d\u0430\u044f \u043a\u043d\u043e\u043f\u043a\u0430 \u0438\u043b\u0438 None\n        \"\"\"\n        for button in self.buttons:\n            if button.name == name:\n                return button\n        return None\n\n    def click_button(self, name: str) -> None:\n        \"\"\"\u041a\u043b\u0438\u043a\u0430\u0435\u0442 \u043f\u043e \u043a\u043d\u043e\u043f\u043a\u0435 \u0442\u0443\u043b\u0431\u0430\u0440\u0430.\n\n        Args:\n            name (str): \u0418\u043c\u044f \u043a\u043d\u043e\u043f\u043a\u0438\n\n        Raises:\n            AssertionError: \u0415\u0441\u043b\u0438 \u043a\u043d\u043e\u043f\u043a\u0430 \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u0430\n        \"\"\"\n        button = self.get_button_by_name(name)\n        if button is None:\n            raise AssertionError(f\"Unsupported button name {name}\")\n        button.click()\n\n    def get_toolbar_title_text(self, locator: str = 'ToolbarLocators.TITLE',\n                              filter_text: str = None, timeout: int = 5000) -> str:\n        \"\"\"\u041f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a \u0442\u0443\u043b\u0431\u0430\u0440\u0430 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430.\n\n        Args:\n            locator: \u041b\u043e\u043a\u0430\u0442\u043e\u0440 \u0434\u043b\u044f \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430 \u0442\u0443\u043b\u0431\u0430\u0440\u0430 (\u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e 'ToolbarLocators.TITLE')\n            filter_text: \u0422\u0435\u043a\u0441\u0442 \u0434\u043b\u044f \u0444\u0438\u043b\u044c\u0442\u0440\u0430\u0446\u0438\u0438 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430 (\u043e\u043f\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e)\n            timeout: \u0422\u0430\u0439\u043c\u0430\u0443\u0442 \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u044f \u0432 \u043c\u0438\u043b\u043b\u0438\u0441\u0435\u043a\u0443\u043d\u0434\u0430\u0445\n\n        Returns:\n            str: \u0422\u0435\u043a\u0441\u0442 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430 \u0442\u0443\u043b\u0431\u0430\u0440\u0430\n\n        Raises:\n            Exception: \u0415\u0441\u043b\u0438 \u043d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a\n        \"\"\"\n        # \u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u043b\u043e\u043a\u0430\u0442\u043e\u0440 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430\n        title_locator = self.get_locator(locator)\n\n        # \u0424\u0438\u043b\u044c\u0442\u0440\u0443\u0435\u043c \u043f\u043e \u0442\u0435\u043a\u0441\u0442\u0443 \u0435\u0441\u043b\u0438 \u0443\u043a\u0430\u0437\u0430\u043d\n        if filter_text:\n            title_locator = title_locator.filter(has_text=filter_text)\n\n        # \u0416\u0434\u0435\u043c \u043f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u044f \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e expect\n        expect(title_locator).to_be_visible(timeout=timeout)\n\n        # \u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0442\u0435\u043a\u0441\u0442 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430\n        title_text = title_locator.text_content().strip()\n        logger.info(\"\u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a \u0442\u0443\u043b\u0431\u0430\u0440\u0430: '%s'\", title_text)\n\n        return title_text\n\n    def is_button_present(self, name: str) -> bool:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u043a\u043d\u043e\u043f\u043a\u0438.\n\n        Args:\n            name (str): \u0418\u043c\u044f \u043a\u043d\u043e\u043f\u043a\u0438\n\n        Returns:\n            bool: True \u0435\u0441\u043b\u0438 \u043a\u043d\u043e\u043f\u043a\u0430 \u043f\u0440\u0438\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442\n\n        Raises:\n            AssertionError: \u0415\u0441\u043b\u0438 \u0438\u043c\u044f \u043a\u043d\u043e\u043f\u043a\u0438 \u043d\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442\u0441\u044f\n        \"\"\"\n        button = self.get_button_by_name(name)\n        if button is None:\n            raise AssertionError(f\"Unsupported button name {name}\")\n        return button.is_present(timeout=1000)  # \u041e\u0436\u0438\u0434\u0430\u043d\u0438\u0435 1 \u0441\u0435\u043a\u0443\u043d\u0434\u0430\n\n    def is_button_not_present(self, name: str) -> bool:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u0435 \u043a\u043d\u043e\u043f\u043a\u0438.\n\n        Args:\n            name (str): \u0418\u043c\u044f \u043a\u043d\u043e\u043f\u043a\u0438\n\n        Returns:\n            bool: True \u0435\u0441\u043b\u0438 \u043a\u043d\u043e\u043f\u043a\u0430 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442\n\n        Raises:\n            AssertionError: \u0415\u0441\u043b\u0438 \u0438\u043c\u044f \u043a\u043d\u043e\u043f\u043a\u0438 \u043d\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442\u0441\u044f\n        \"\"\"\n        button = self.get_button_by_name(name)\n        if button is None:\n            raise AssertionError(f\"Unsupported button name {name}\")\n        return button.is_not_present(timeout=1000)  # \u041e\u0436\u0438\u0434\u0430\u043d\u0438\u0435 1 \u0441\u0435\u043a\u0443\u043d\u0434\u0430\n\n    def check_toolbar_presence(self, message: str) -> None:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u0442\u0443\u043b\u0431\u0430\u0440\u0430.\n\n        Args:\n            message (str): \u0421\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u043e\u0431 \u043e\u0448\u0438\u0431\u043a\u0435 \u0435\u0441\u043b\u0438 \u0442\u0443\u043b\u0431\u0430\u0440 \u043d\u0435 \u0432\u0438\u0434\u0435\u043d\n        \"\"\"\n\n        locator = self.get_locator(ToolbarLocators.TITLE).filter(has_text=self.title)\n        expect(locator).to_be_visible(), message\n\n    def check_toolbar_presence_by_locator(self, locator: str|Locator, message: str) -> None:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u0442\u0443\u043b\u0431\u0430\u0440\u0430.\n\n        Args:\n            message (str): \u0421\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u043e\u0431 \u043e\u0448\u0438\u0431\u043a\u0435 \u0435\u0441\u043b\u0438 \u0442\u0443\u043b\u0431\u0430\u0440 \u043d\u0435 \u0432\u0438\u0434\u0435\u043d\n        \"\"\"\n\n        locator = self.get_locator(locator)\n        expect(locator).to_be_visible(), message\n\n    def check_button_visibility(self, name: str) -> None:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0438 \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u043a\u043d\u043e\u043f\u043a\u0438 \u0441 \u043f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0439 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u043e\u0439 \u043a \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0443.\n\n        Args:\n            name (str): \u0418\u043c\u044f \u043a\u043d\u043e\u043f\u043a\u0438\n\n        Raises:\n            AssertionError: \u0415\u0441\u043b\u0438 \u043a\u043d\u043e\u043f\u043a\u0430 \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u0430 \u0438\u043b\u0438 \u043d\u0435 \u0432\u0438\u0434\u043d\u0430\n        \"\"\"\n        button = self.get_button_by_name(name)\n\n        if button is None:\n            raise AssertionError(f\"Unsupported button name {name}\")\n\n        button.locator.scroll_into_view_if_needed()\n        button.check_visibility(f\"Button with name {name} is missing\")\n\n    def check_button_tooltip(self, name: str, tooltip: str) -> None:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0442\u0435\u043a\u0441\u0442 \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0438 \u043a\u043d\u043e\u043f\u043a\u0438.\n\n        Args:\n            name (str): \u0418\u043c\u044f \u043a\u043d\u043e\u043f\u043a\u0438\n            tooltip (str): \u041e\u0436\u0438\u0434\u0430\u0435\u043c\u044b\u0439 \u0442\u0435\u043a\u0441\u0442 \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0438\n\n        Raises:\n            AssertionError: \u0415\u0441\u043b\u0438 \u0442\u0435\u043a\u0441\u0442 \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0438 \u043d\u0435 \u0441\u043e\u0432\u043f\u0430\u0434\u0430\u0435\u0442\n        \"\"\"\n        button = self.get_button_by_name(name)\n        if button is None:\n            raise AssertionError(f\"Unsupported button name {name}\")\n        button.check_tooltip_with_text(tooltip)\n
    "},{"location":"components/toolbar_component/#components.toolbar_component.ToolbarComponent.__init__","title":"__init__(page, title)","text":"

    \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 \u0442\u0443\u043b\u0431\u0430\u0440\u0430 \u0441 \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u044b\u043c \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u043e\u043c.

    Source code in components\\toolbar_component.py
    def __init__(self, page: Page, title: str):\n    \"\"\"\u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 \u0442\u0443\u043b\u0431\u0430\u0440\u0430 \u0441 \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u044b\u043c \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u043e\u043c.\"\"\"\n    super().__init__(page)\n    self.title = title\n    self.buttons = []\n
    "},{"location":"components/toolbar_component/#components.toolbar_component.ToolbarComponent.add_button","title":"add_button(locator, name)","text":"

    \u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u043a\u043d\u043e\u043f\u043a\u0443 \u0432 \u0442\u0443\u043b\u0431\u0430\u0440.

    Parameters:

    Name Type Description Default locator Locator

    \u041b\u043e\u043a\u0430\u0442\u043e\u0440 \u043a\u043d\u043e\u043f\u043a\u0438

    required name str

    \u0423\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u0435 \u0438\u043c\u044f \u043a\u043d\u043e\u043f\u043a\u0438

    required Source code in components\\toolbar_component.py
    def add_button(self, locator: Locator, name: str) -> None:\n    \"\"\"\u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u043a\u043d\u043e\u043f\u043a\u0443 \u0432 \u0442\u0443\u043b\u0431\u0430\u0440.\n\n    Args:\n        locator (Locator): \u041b\u043e\u043a\u0430\u0442\u043e\u0440 \u043a\u043d\u043e\u043f\u043a\u0438\n        name (str): \u0423\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u0435 \u0438\u043c\u044f \u043a\u043d\u043e\u043f\u043a\u0438\n    \"\"\"\n    self.buttons.append(Button(self.page, locator, name))\n
    "},{"location":"components/toolbar_component/#components.toolbar_component.ToolbarComponent.add_tab_button","title":"add_tab_button(locator, name)","text":"

    \u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u043a\u043d\u043e\u043f\u043a\u0443 \u0442\u0438\u043f\u0430 v-tab \u0432 \u0442\u0443\u043b\u0431\u0430\u0440.

    Parameters:

    Name Type Description Default locator Locator

    \u041b\u043e\u043a\u0430\u0442\u043e\u0440 \u043a\u043d\u043e\u043f\u043a\u0438

    required name str

    \u0423\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u0435 \u0438\u043c\u044f \u043a\u043d\u043e\u043f\u043a\u0438

    required Source code in components\\toolbar_component.py
    def add_tab_button(self, locator: Locator, name: str) -> None:\n    \"\"\"\u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u043a\u043d\u043e\u043f\u043a\u0443 \u0442\u0438\u043f\u0430 v-tab \u0432 \u0442\u0443\u043b\u0431\u0430\u0440.\n\n    Args:\n        locator (Locator): \u041b\u043e\u043a\u0430\u0442\u043e\u0440 \u043a\u043d\u043e\u043f\u043a\u0438\n        name (str): \u0423\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u0435 \u0438\u043c\u044f \u043a\u043d\u043e\u043f\u043a\u0438\n    \"\"\"\n    self.buttons.append(TabButton(self.page, locator, name))\n
    "},{"location":"components/toolbar_component/#components.toolbar_component.ToolbarComponent.add_title","title":"add_title(title)","text":"

    \u0423\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442 \u043d\u043e\u0432\u044b\u0439 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a \u0442\u0443\u043b\u0431\u0430\u0440\u0430.

    Parameters:

    Name Type Description Default title str

    \u041d\u043e\u0432\u044b\u0439 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a

    required Source code in components\\toolbar_component.py
    def add_title(self, title: str) -> None:\n    \"\"\"\u0423\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442 \u043d\u043e\u0432\u044b\u0439 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a \u0442\u0443\u043b\u0431\u0430\u0440\u0430.\n\n    Args:\n        title (str): \u041d\u043e\u0432\u044b\u0439 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a\n    \"\"\"\n    self.title = title\n
    "},{"location":"components/toolbar_component/#components.toolbar_component.ToolbarComponent.add_tooltip_button","title":"add_tooltip_button(locator, name)","text":"

    \u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u043a\u043d\u043e\u043f\u043a\u0443 \u0441 \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u043e\u0439 \u0432 \u0442\u0443\u043b\u0431\u0430\u0440.

    Parameters:

    Name Type Description Default locator Locator

    \u041b\u043e\u043a\u0430\u0442\u043e\u0440 \u043a\u043d\u043e\u043f\u043a\u0438

    required name str

    \u0423\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u0435 \u0438\u043c\u044f \u043a\u043d\u043e\u043f\u043a\u0438

    required Source code in components\\toolbar_component.py
    def add_tooltip_button(self, locator: Locator, name: str) -> None:\n    \"\"\"\u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u043a\u043d\u043e\u043f\u043a\u0443 \u0441 \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u043e\u0439 \u0432 \u0442\u0443\u043b\u0431\u0430\u0440.\n\n    Args:\n        locator (Locator): \u041b\u043e\u043a\u0430\u0442\u043e\u0440 \u043a\u043d\u043e\u043f\u043a\u0438\n        name (str): \u0423\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u0435 \u0438\u043c\u044f \u043a\u043d\u043e\u043f\u043a\u0438\n    \"\"\"\n    self.buttons.append(TooltipButton(self.page, locator, name))\n
    "},{"location":"components/toolbar_component/#components.toolbar_component.ToolbarComponent.check_button_tooltip","title":"check_button_tooltip(name, tooltip)","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0442\u0435\u043a\u0441\u0442 \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0438 \u043a\u043d\u043e\u043f\u043a\u0438.

    Parameters:

    Name Type Description Default name str

    \u0418\u043c\u044f \u043a\u043d\u043e\u043f\u043a\u0438

    required tooltip str

    \u041e\u0436\u0438\u0434\u0430\u0435\u043c\u044b\u0439 \u0442\u0435\u043a\u0441\u0442 \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0438

    required

    Raises:

    Type Description AssertionError

    \u0415\u0441\u043b\u0438 \u0442\u0435\u043a\u0441\u0442 \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0438 \u043d\u0435 \u0441\u043e\u0432\u043f\u0430\u0434\u0430\u0435\u0442

    Source code in components\\toolbar_component.py
    def check_button_tooltip(self, name: str, tooltip: str) -> None:\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0442\u0435\u043a\u0441\u0442 \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0438 \u043a\u043d\u043e\u043f\u043a\u0438.\n\n    Args:\n        name (str): \u0418\u043c\u044f \u043a\u043d\u043e\u043f\u043a\u0438\n        tooltip (str): \u041e\u0436\u0438\u0434\u0430\u0435\u043c\u044b\u0439 \u0442\u0435\u043a\u0441\u0442 \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0438\n\n    Raises:\n        AssertionError: \u0415\u0441\u043b\u0438 \u0442\u0435\u043a\u0441\u0442 \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0438 \u043d\u0435 \u0441\u043e\u0432\u043f\u0430\u0434\u0430\u0435\u0442\n    \"\"\"\n    button = self.get_button_by_name(name)\n    if button is None:\n        raise AssertionError(f\"Unsupported button name {name}\")\n    button.check_tooltip_with_text(tooltip)\n
    "},{"location":"components/toolbar_component/#components.toolbar_component.ToolbarComponent.check_button_visibility","title":"check_button_visibility(name)","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0438 \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u043a\u043d\u043e\u043f\u043a\u0438 \u0441 \u043f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0439 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u043e\u0439 \u043a \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0443.

    Parameters:

    Name Type Description Default name str

    \u0418\u043c\u044f \u043a\u043d\u043e\u043f\u043a\u0438

    required

    Raises:

    Type Description AssertionError

    \u0415\u0441\u043b\u0438 \u043a\u043d\u043e\u043f\u043a\u0430 \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u0430 \u0438\u043b\u0438 \u043d\u0435 \u0432\u0438\u0434\u043d\u0430

    Source code in components\\toolbar_component.py
    def check_button_visibility(self, name: str) -> None:\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0438 \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u043a\u043d\u043e\u043f\u043a\u0438 \u0441 \u043f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0439 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u043e\u0439 \u043a \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0443.\n\n    Args:\n        name (str): \u0418\u043c\u044f \u043a\u043d\u043e\u043f\u043a\u0438\n\n    Raises:\n        AssertionError: \u0415\u0441\u043b\u0438 \u043a\u043d\u043e\u043f\u043a\u0430 \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u0430 \u0438\u043b\u0438 \u043d\u0435 \u0432\u0438\u0434\u043d\u0430\n    \"\"\"\n    button = self.get_button_by_name(name)\n\n    if button is None:\n        raise AssertionError(f\"Unsupported button name {name}\")\n\n    button.locator.scroll_into_view_if_needed()\n    button.check_visibility(f\"Button with name {name} is missing\")\n
    "},{"location":"components/toolbar_component/#components.toolbar_component.ToolbarComponent.check_toolbar_presence","title":"check_toolbar_presence(message)","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u0442\u0443\u043b\u0431\u0430\u0440\u0430.

    Parameters:

    Name Type Description Default message str

    \u0421\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u043e\u0431 \u043e\u0448\u0438\u0431\u043a\u0435 \u0435\u0441\u043b\u0438 \u0442\u0443\u043b\u0431\u0430\u0440 \u043d\u0435 \u0432\u0438\u0434\u0435\u043d

    required Source code in components\\toolbar_component.py
    def check_toolbar_presence(self, message: str) -> None:\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u0442\u0443\u043b\u0431\u0430\u0440\u0430.\n\n    Args:\n        message (str): \u0421\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u043e\u0431 \u043e\u0448\u0438\u0431\u043a\u0435 \u0435\u0441\u043b\u0438 \u0442\u0443\u043b\u0431\u0430\u0440 \u043d\u0435 \u0432\u0438\u0434\u0435\u043d\n    \"\"\"\n\n    locator = self.get_locator(ToolbarLocators.TITLE).filter(has_text=self.title)\n    expect(locator).to_be_visible(), message\n
    "},{"location":"components/toolbar_component/#components.toolbar_component.ToolbarComponent.check_toolbar_presence_by_locator","title":"check_toolbar_presence_by_locator(locator, message)","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u0442\u0443\u043b\u0431\u0430\u0440\u0430.

    Parameters:

    Name Type Description Default message str

    \u0421\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u043e\u0431 \u043e\u0448\u0438\u0431\u043a\u0435 \u0435\u0441\u043b\u0438 \u0442\u0443\u043b\u0431\u0430\u0440 \u043d\u0435 \u0432\u0438\u0434\u0435\u043d

    required Source code in components\\toolbar_component.py
    def check_toolbar_presence_by_locator(self, locator: str|Locator, message: str) -> None:\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u0442\u0443\u043b\u0431\u0430\u0440\u0430.\n\n    Args:\n        message (str): \u0421\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u043e\u0431 \u043e\u0448\u0438\u0431\u043a\u0435 \u0435\u0441\u043b\u0438 \u0442\u0443\u043b\u0431\u0430\u0440 \u043d\u0435 \u0432\u0438\u0434\u0435\u043d\n    \"\"\"\n\n    locator = self.get_locator(locator)\n    expect(locator).to_be_visible(), message\n
    "},{"location":"components/toolbar_component/#components.toolbar_component.ToolbarComponent.click_button","title":"click_button(name)","text":"

    \u041a\u043b\u0438\u043a\u0430\u0435\u0442 \u043f\u043e \u043a\u043d\u043e\u043f\u043a\u0435 \u0442\u0443\u043b\u0431\u0430\u0440\u0430.

    Parameters:

    Name Type Description Default name str

    \u0418\u043c\u044f \u043a\u043d\u043e\u043f\u043a\u0438

    required

    Raises:

    Type Description AssertionError

    \u0415\u0441\u043b\u0438 \u043a\u043d\u043e\u043f\u043a\u0430 \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u0430

    Source code in components\\toolbar_component.py
    def click_button(self, name: str) -> None:\n    \"\"\"\u041a\u043b\u0438\u043a\u0430\u0435\u0442 \u043f\u043e \u043a\u043d\u043e\u043f\u043a\u0435 \u0442\u0443\u043b\u0431\u0430\u0440\u0430.\n\n    Args:\n        name (str): \u0418\u043c\u044f \u043a\u043d\u043e\u043f\u043a\u0438\n\n    Raises:\n        AssertionError: \u0415\u0441\u043b\u0438 \u043a\u043d\u043e\u043f\u043a\u0430 \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u0430\n    \"\"\"\n    button = self.get_button_by_name(name)\n    if button is None:\n        raise AssertionError(f\"Unsupported button name {name}\")\n    button.click()\n
    "},{"location":"components/toolbar_component/#components.toolbar_component.ToolbarComponent.get_button_by_name","title":"get_button_by_name(name)","text":"

    \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043a\u043d\u043e\u043f\u043a\u0443 \u043f\u043e \u0438\u043c\u0435\u043d\u0438.

    Parameters:

    Name Type Description Default name str

    \u0418\u043c\u044f \u043a\u043d\u043e\u043f\u043a\u0438

    required

    Returns:

    Type Description TooltipButton | TabButton | Button | None

    TooltipButton | TabButton | Button | None: \u041d\u0430\u0439\u0434\u0435\u043d\u043d\u0430\u044f \u043a\u043d\u043e\u043f\u043a\u0430 \u0438\u043b\u0438 None

    Source code in components\\toolbar_component.py
    def get_button_by_name(self, name: str) -> TooltipButton | TabButton | Button | None:\n    \"\"\"\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043a\u043d\u043e\u043f\u043a\u0443 \u043f\u043e \u0438\u043c\u0435\u043d\u0438.\n\n    Args:\n        name (str): \u0418\u043c\u044f \u043a\u043d\u043e\u043f\u043a\u0438\n\n    Returns:\n        TooltipButton | TabButton | Button | None: \u041d\u0430\u0439\u0434\u0435\u043d\u043d\u0430\u044f \u043a\u043d\u043e\u043f\u043a\u0430 \u0438\u043b\u0438 None\n    \"\"\"\n    for button in self.buttons:\n        if button.name == name:\n            return button\n    return None\n
    "},{"location":"components/toolbar_component/#components.toolbar_component.ToolbarComponent.get_toolbar_title_text","title":"get_toolbar_title_text(locator='ToolbarLocators.TITLE', filter_text=None, timeout=5000)","text":"

    \u041f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a \u0442\u0443\u043b\u0431\u0430\u0440\u0430 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430.

    Parameters:

    Name Type Description Default locator str

    \u041b\u043e\u043a\u0430\u0442\u043e\u0440 \u0434\u043b\u044f \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430 \u0442\u0443\u043b\u0431\u0430\u0440\u0430 (\u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e 'ToolbarLocators.TITLE')

    'ToolbarLocators.TITLE' filter_text str

    \u0422\u0435\u043a\u0441\u0442 \u0434\u043b\u044f \u0444\u0438\u043b\u044c\u0442\u0440\u0430\u0446\u0438\u0438 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430 (\u043e\u043f\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e)

    None timeout int

    \u0422\u0430\u0439\u043c\u0430\u0443\u0442 \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u044f \u0432 \u043c\u0438\u043b\u043b\u0438\u0441\u0435\u043a\u0443\u043d\u0434\u0430\u0445

    5000

    Returns:

    Name Type Description str str

    \u0422\u0435\u043a\u0441\u0442 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430 \u0442\u0443\u043b\u0431\u0430\u0440\u0430

    Raises:

    Type Description Exception

    \u0415\u0441\u043b\u0438 \u043d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a

    Source code in components\\toolbar_component.py
    def get_toolbar_title_text(self, locator: str = 'ToolbarLocators.TITLE',\n                          filter_text: str = None, timeout: int = 5000) -> str:\n    \"\"\"\u041f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a \u0442\u0443\u043b\u0431\u0430\u0440\u0430 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430.\n\n    Args:\n        locator: \u041b\u043e\u043a\u0430\u0442\u043e\u0440 \u0434\u043b\u044f \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430 \u0442\u0443\u043b\u0431\u0430\u0440\u0430 (\u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e 'ToolbarLocators.TITLE')\n        filter_text: \u0422\u0435\u043a\u0441\u0442 \u0434\u043b\u044f \u0444\u0438\u043b\u044c\u0442\u0440\u0430\u0446\u0438\u0438 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430 (\u043e\u043f\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e)\n        timeout: \u0422\u0430\u0439\u043c\u0430\u0443\u0442 \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u044f \u0432 \u043c\u0438\u043b\u043b\u0438\u0441\u0435\u043a\u0443\u043d\u0434\u0430\u0445\n\n    Returns:\n        str: \u0422\u0435\u043a\u0441\u0442 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430 \u0442\u0443\u043b\u0431\u0430\u0440\u0430\n\n    Raises:\n        Exception: \u0415\u0441\u043b\u0438 \u043d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a\n    \"\"\"\n    # \u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u043b\u043e\u043a\u0430\u0442\u043e\u0440 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430\n    title_locator = self.get_locator(locator)\n\n    # \u0424\u0438\u043b\u044c\u0442\u0440\u0443\u0435\u043c \u043f\u043e \u0442\u0435\u043a\u0441\u0442\u0443 \u0435\u0441\u043b\u0438 \u0443\u043a\u0430\u0437\u0430\u043d\n    if filter_text:\n        title_locator = title_locator.filter(has_text=filter_text)\n\n    # \u0416\u0434\u0435\u043c \u043f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u044f \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e expect\n    expect(title_locator).to_be_visible(timeout=timeout)\n\n    # \u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0442\u0435\u043a\u0441\u0442 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430\n    title_text = title_locator.text_content().strip()\n    logger.info(\"\u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a \u0442\u0443\u043b\u0431\u0430\u0440\u0430: '%s'\", title_text)\n\n    return title_text\n
    "},{"location":"components/toolbar_component/#components.toolbar_component.ToolbarComponent.is_button_not_present","title":"is_button_not_present(name)","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u0435 \u043a\u043d\u043e\u043f\u043a\u0438.

    Parameters:

    Name Type Description Default name str

    \u0418\u043c\u044f \u043a\u043d\u043e\u043f\u043a\u0438

    required

    Returns:

    Name Type Description bool bool

    True \u0435\u0441\u043b\u0438 \u043a\u043d\u043e\u043f\u043a\u0430 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442

    Raises:

    Type Description AssertionError

    \u0415\u0441\u043b\u0438 \u0438\u043c\u044f \u043a\u043d\u043e\u043f\u043a\u0438 \u043d\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442\u0441\u044f

    Source code in components\\toolbar_component.py
    def is_button_not_present(self, name: str) -> bool:\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u0435 \u043a\u043d\u043e\u043f\u043a\u0438.\n\n    Args:\n        name (str): \u0418\u043c\u044f \u043a\u043d\u043e\u043f\u043a\u0438\n\n    Returns:\n        bool: True \u0435\u0441\u043b\u0438 \u043a\u043d\u043e\u043f\u043a\u0430 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442\n\n    Raises:\n        AssertionError: \u0415\u0441\u043b\u0438 \u0438\u043c\u044f \u043a\u043d\u043e\u043f\u043a\u0438 \u043d\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442\u0441\u044f\n    \"\"\"\n    button = self.get_button_by_name(name)\n    if button is None:\n        raise AssertionError(f\"Unsupported button name {name}\")\n    return button.is_not_present(timeout=1000)  # \u041e\u0436\u0438\u0434\u0430\u043d\u0438\u0435 1 \u0441\u0435\u043a\u0443\u043d\u0434\u0430\n
    "},{"location":"components/toolbar_component/#components.toolbar_component.ToolbarComponent.is_button_present","title":"is_button_present(name)","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u043a\u043d\u043e\u043f\u043a\u0438.

    Parameters:

    Name Type Description Default name str

    \u0418\u043c\u044f \u043a\u043d\u043e\u043f\u043a\u0438

    required

    Returns:

    Name Type Description bool bool

    True \u0435\u0441\u043b\u0438 \u043a\u043d\u043e\u043f\u043a\u0430 \u043f\u0440\u0438\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442

    Raises:

    Type Description AssertionError

    \u0415\u0441\u043b\u0438 \u0438\u043c\u044f \u043a\u043d\u043e\u043f\u043a\u0438 \u043d\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442\u0441\u044f

    Source code in components\\toolbar_component.py
    def is_button_present(self, name: str) -> bool:\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u043a\u043d\u043e\u043f\u043a\u0438.\n\n    Args:\n        name (str): \u0418\u043c\u044f \u043a\u043d\u043e\u043f\u043a\u0438\n\n    Returns:\n        bool: True \u0435\u0441\u043b\u0438 \u043a\u043d\u043e\u043f\u043a\u0430 \u043f\u0440\u0438\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442\n\n    Raises:\n        AssertionError: \u0415\u0441\u043b\u0438 \u0438\u043c\u044f \u043a\u043d\u043e\u043f\u043a\u0438 \u043d\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442\u0441\u044f\n    \"\"\"\n    button = self.get_button_by_name(name)\n    if button is None:\n        raise AssertionError(f\"Unsupported button name {name}\")\n    return button.is_present(timeout=1000)  # \u041e\u0436\u0438\u0434\u0430\u043d\u0438\u0435 1 \u0441\u0435\u043a\u0443\u043d\u0434\u0430\n
    "},{"location":"components_derived/container_system_log_events/","title":"SystemLogEventsContainer","text":"

    \u041c\u043e\u0434\u0443\u043b\u044c \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430 \u0434\u043b\u044f \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0441\u043e\u0431\u044b\u0442\u0438\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u043e\u0433\u043e \u0436\u0443\u0440\u043d\u0430\u043b\u0430.

    \u0421\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043a\u043b\u0430\u0441\u0441 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u043e\u043c \u0434\u043b\u044f \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0441\u043e\u0431\u044b\u0442\u0438\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u043e\u0433\u043e \u0436\u0443\u0440\u043d\u0430\u043b\u0430 \u0447\u0435\u0440\u0435\u0437 Playwright.

    "},{"location":"components_derived/container_system_log_events/#components_derived.container_system_log_events.SystemLogEventsContainer","title":"SystemLogEventsContainer","text":"

    Bases: EventsContainerComponent

    \u041a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430 \u0434\u043b\u044f \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0441\u043e\u0431\u044b\u0442\u0438\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u043e\u0433\u043e \u0436\u0443\u0440\u043d\u0430\u043b\u0430.

    \u041f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u043c\u0435\u0442\u043e\u0434\u044b \u0434\u043b\u044f \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0441 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u043c\u0438 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430 \u0434\u043b\u044f \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0441\u043e\u0431\u044b\u0442\u0438\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u043e\u0433\u043e \u0436\u0443\u0440\u043d\u0430\u043b\u0430.

    Source code in components_derived\\container_system_log_events.py
    class SystemLogEventsContainer(EventsContainerComponent):\n    \"\"\"\u041a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430 \u0434\u043b\u044f \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0441\u043e\u0431\u044b\u0442\u0438\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u043e\u0433\u043e \u0436\u0443\u0440\u043d\u0430\u043b\u0430.\n\n    \u041f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u043c\u0435\u0442\u043e\u0434\u044b \u0434\u043b\u044f \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0441 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u043c\u0438\n    \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430 \u0434\u043b\u044f \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0441\u043e\u0431\u044b\u0442\u0438\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u043e\u0433\u043e \u0436\u0443\u0440\u043d\u0430\u043b\u0430.\n    \"\"\"\n\n    def __init__(self, page: Page, locator: str | Locator):\n        \"\"\"\u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430 \u0434\u043b\u044f \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0441\u043e\u0431\u044b\u0442\u0438\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u043e\u0433\u043e \u0436\u0443\u0440\u043d\u0430\u043b\u0430.\n\n        Args:\n            page: \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.\n        \"\"\"\n\n        super().__init__(page, locator)\n\n        self.add_tab_to_toolbar(ToolbarLocators.TABS, \"events\")\n    # \u0414\u0435\u0439\u0441\u0442\u0432\u0438\u044f:\n    # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0438:\n    def check_content(self) -> None:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430 \u0434\u043b\u044f \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0441\u043e\u0431\u044b\u0442\u0438\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u043e\u0433\u043e \u0436\u0443\u0440\u043d\u0430\u043b\u0430.\"\"\"\n\n        expected_headers = ['\u0422\u0418\u041f', '\u0412\u0420\u0415\u041c\u042f', '\u0421\u0422\u0420\u041e\u0413\u041e\u0421\u0422\u042c', '\u0425\u041e\u0421\u0422', '\u041e\u041f\u0418\u0421\u0410\u041d\u0418\u0415']\n\n        self.should_be_toolbar()\n        self.should_be_base_toolbar_buttons()\n\n        events_tab = self.get_toolbar_tab_button(\"events\")\n        events_tab_text = events_tab.get_text(0)\n        assert events_tab_text.find(\"chevron_right\") != -1, \"Should be icon 'chevron_right'\"\n        assert events_tab_text.find(\"\u0421\u043e\u0431\u044b\u0442\u0438\u044f\") != -1, \"Tab button with text \u0421\u043e\u0431\u044b\u0442\u0438\u044f is missing on toolbar\"\n\n        self.should_be_events_table()\n        events_table = self.get_events_table_content()\n\n        if len(events_table) == 0:\n            assert False, \"The contents of the events table are missing\"\n\n        self.check_events_table_headers(events_table[0], expected_headers)\n\n        if len(events_table) == 1:\n            assert False, \"Table body is missing\"\n\n        self.should_be_pagination_buttons()\n
    "},{"location":"components_derived/container_system_log_events/#components_derived.container_system_log_events.SystemLogEventsContainer.__init__","title":"__init__(page, locator)","text":"

    \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430 \u0434\u043b\u044f \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0441\u043e\u0431\u044b\u0442\u0438\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u043e\u0433\u043e \u0436\u0443\u0440\u043d\u0430\u043b\u0430.

    Parameters:

    Name Type Description Default page Page

    \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.

    required Source code in components_derived\\container_system_log_events.py
    def __init__(self, page: Page, locator: str | Locator):\n    \"\"\"\u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430 \u0434\u043b\u044f \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0441\u043e\u0431\u044b\u0442\u0438\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u043e\u0433\u043e \u0436\u0443\u0440\u043d\u0430\u043b\u0430.\n\n    Args:\n        page: \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.\n    \"\"\"\n\n    super().__init__(page, locator)\n\n    self.add_tab_to_toolbar(ToolbarLocators.TABS, \"events\")\n
    "},{"location":"components_derived/container_system_log_events/#components_derived.container_system_log_events.SystemLogEventsContainer.check_content","title":"check_content()","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430 \u0434\u043b\u044f \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0441\u043e\u0431\u044b\u0442\u0438\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u043e\u0433\u043e \u0436\u0443\u0440\u043d\u0430\u043b\u0430.

    Source code in components_derived\\container_system_log_events.py
    def check_content(self) -> None:\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430 \u0434\u043b\u044f \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0441\u043e\u0431\u044b\u0442\u0438\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u043e\u0433\u043e \u0436\u0443\u0440\u043d\u0430\u043b\u0430.\"\"\"\n\n    expected_headers = ['\u0422\u0418\u041f', '\u0412\u0420\u0415\u041c\u042f', '\u0421\u0422\u0420\u041e\u0413\u041e\u0421\u0422\u042c', '\u0425\u041e\u0421\u0422', '\u041e\u041f\u0418\u0421\u0410\u041d\u0418\u0415']\n\n    self.should_be_toolbar()\n    self.should_be_base_toolbar_buttons()\n\n    events_tab = self.get_toolbar_tab_button(\"events\")\n    events_tab_text = events_tab.get_text(0)\n    assert events_tab_text.find(\"chevron_right\") != -1, \"Should be icon 'chevron_right'\"\n    assert events_tab_text.find(\"\u0421\u043e\u0431\u044b\u0442\u0438\u044f\") != -1, \"Tab button with text \u0421\u043e\u0431\u044b\u0442\u0438\u044f is missing on toolbar\"\n\n    self.should_be_events_table()\n    events_table = self.get_events_table_content()\n\n    if len(events_table) == 0:\n        assert False, \"The contents of the events table are missing\"\n\n    self.check_events_table_headers(events_table[0], expected_headers)\n\n    if len(events_table) == 1:\n        assert False, \"Table body is missing\"\n\n    self.should_be_pagination_buttons()\n
    "},{"location":"components_derived/dialog_user_settings/","title":"UserSettingsDialogWindow","text":"

    \u041c\u043e\u0434\u0443\u043b\u044c \u0434\u0438\u0430\u043b\u043e\u0433\u043e\u0432\u043e\u0433\u043e \u043e\u043a\u043d\u0430 \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0430 \u0441\u0435\u0441\u0441\u0438\u043e\u043d\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.

    \u0421\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043a\u043b\u0430\u0441\u0441 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0434\u0438\u0430\u043b\u043e\u0433\u043e\u0432\u044b\u043c \u043e\u043a\u043d\u043e\u043c \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0430 \u0441\u0435\u0441\u0441\u0438\u043e\u043d\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0447\u0435\u0440\u0435\u0437 Playwright.

    "},{"location":"components_derived/dialog_user_settings/#components_derived.dialog_user_settings.UserSettingsDialogWindow","title":"UserSettingsDialogWindow","text":"

    Bases: BaseComponent

    \u041a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 \u0434\u0438\u0430\u043b\u043e\u0433\u043e\u0432\u043e\u0435 \u043e\u043a\u043d\u043e \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0430 \u0441\u0435\u0441\u0441\u0438\u043e\u043d\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.

    \u041f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u043c\u0435\u0442\u043e\u0434\u044b \u0434\u043b\u044f \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0441 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u043c\u0438 \u0434\u0438\u0430\u043b\u043e\u0433\u043e\u0432\u043e\u0433\u043e \u043e\u043a\u043d\u0430 \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0430 \u0441\u0435\u0441\u0441\u0438\u043e\u043d\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b.

    Source code in components_derived\\dialog_user_settings.py
    class UserSettingsDialogWindow(BaseComponent):\n    \"\"\"\u041a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 \u0434\u0438\u0430\u043b\u043e\u0433\u043e\u0432\u043e\u0435 \u043e\u043a\u043d\u043e \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0430 \u0441\u0435\u0441\u0441\u0438\u043e\u043d\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\n\n    \u041f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u043c\u0435\u0442\u043e\u0434\u044b \u0434\u043b\u044f \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0441 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u043c\u0438\n    \u0434\u0438\u0430\u043b\u043e\u0433\u043e\u0432\u043e\u0433\u043e \u043e\u043a\u043d\u0430 \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0430 \u0441\u0435\u0441\u0441\u0438\u043e\u043d\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b.\n    \"\"\"\n\n    def __init__(self, page: Page):\n        \"\"\"\u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 \u0434\u0438\u0430\u043b\u043e\u0433\u043e\u0432\u043e\u0435 \u043e\u043a\u043d\u043e \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0430 \u0441\u0435\u0441\u0441\u0438\u043e\u043d\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b.\n\n        Args:\n            page: \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.\n        \"\"\"\n\n        super().__init__(page)\n\n        dialog_window_locator = page.locator(UserCardLocators.DIALOG_USER_SETTINGS)\n\n        self.dialog_window_title = Text(page,\n                                        dialog_window_locator.\\\n                                        locator(UserCardLocators.TITLE_DIALOG_USER_SETTINGS),\n                                        \"dialog window title\")\n        self.close_button = Button(page,\n                                   dialog_window_locator.\\\n                                   locator(UserCardLocators.HEADER_DIALOG_USER_SETTINGS). \\\n                                   get_by_role(\"button\"),\n                                   \"close button\")\n\n        self.user_settings_table = TableComponent(page)\n\n    # \u0414\u0435\u0439\u0441\u0442\u0432\u0438\u044f:\n    def click_close_button(self):\n        \"\"\"\u041d\u0430\u0436\u0438\u043c\u0430\u0435\u0442 \u043a\u043d\u043e\u043f\u043a\u0443 \u0437\u0430\u043a\u0440\u044b\u0442\u0438\u044f \u043e\u043a\u043d\u0430.\n\n        \u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u043a\u043b\u0438\u043a \u043f\u043e \u043a\u043d\u043e\u043f\u043a\u0435 '\u0417\u0430\u043a\u0440\u044b\u0442\u044c' \u043d\u0430 \u0441\u0442\u0440\u043e\u043a\u0435 \u0441 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u043e\u043c \u043e\u043a\u043d\u0430.\n        \"\"\"\n\n        self.close_button.click()\n\n    def get_delete_button_from_row(self, row_index: int) -> TooltipButton:\n        \"\"\"\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043a\u043d\u043e\u043f\u043a\u0443 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u0441\u0435\u0430\u043d\u0441\u0430 \u0434\u043b\u044f \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438.\n\n        Args:\n            row_index: \u0418\u043d\u0434\u0435\u043a\u0441 \u0441\u0442\u0440\u043e\u043a\u0438 \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435.\n\n        Returns:\n            TooltipButton: \u041a\u043d\u043e\u043f\u043a\u0430 \u0441 \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u043e\u0439.\n\n        Raises:\n            AssertionError: \u0415\u0441\u043b\u0438 \u0441\u0442\u0440\u043e\u043a\u0430 \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u0430.\n        \"\"\"\n\n        row_locator = self.user_settings_table.get_row_locator(\n            UserCardLocators.TABLE_WORK_AREA,\n            row_index\n        )\n        assert isinstance(row_locator, Locator), f\"Row with index {row_index} is missing\"\n\n        button_locator = row_locator.get_by_role(\"button\")\n        return TooltipButton(self.page, button_locator, \"delete_button\")\n\n    # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0438:\n    def check_content(self) -> None:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u043e\u043a\u043d\u043e \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0430 \u0441\u0435\u0441\u0441\u0438\u043e\u043d\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\"\"\"\n\n        self.dialog_window_title.check_have_text(\"\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438\", \\\n                                                 \"Title '\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438' is missing on user settings window top\")\n        self.close_button.check_visibility(\"Close button is missing on user settings window top\")\n\n        self.should_be_user_settings_table()\n        self.check_user_settings_table_content()\n\n    def check_window_absence(self) -> None:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u044f \u043e\u043a\u043d\u0430 \u043d\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435.\n\n        Raises:\n            AssertionError: \u0435\u0441\u043b\u0438 \u043e\u043a\u043do \u043f\u0440\u0438\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u043d\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435.\n        \"\"\"\n\n        self.check_absence(UserCardLocators.DIALOG_USER_SETTINGS, \\\n                           \"User settings dialog window is present\")\n\n    def check_window_visibility(self) -> None:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u043a\u043d\u0430 \u043d\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435.\n\n        Raises:\n            AssertionError: \u0435\u0441\u043b\u0438 \u043e\u043a\u043do \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u043d\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435.\n        \"\"\"\n\n        self.check_visibility(UserCardLocators.DIALOG_USER_SETTINGS, \\\n                              \"User settings dialog window is missing\")\n\n\n    def check_user_settings_table_content(self) -> None:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0441\u0435\u0441\u0441\u0438\u043e\u043d\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\n\n\n        Raises:\n            AssertionError: \u0415\u0441\u043b\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u043f\u0443\u0441\u0442\u0430 \u0438\u043b\u0438 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0438 \u043d\u0435\u0432\u0435\u0440\u043d\u044b.\n        \"\"\"\n\n        expected_headers = [\n            '\u041f\u041e\u041b\u042c\u0417\u041e\u0412\u0410\u0422\u0415\u041b\u042c',\n            'IP \u0410\u0414\u0420\u0415\u0421',\n            '\u0412\u0420\u0415\u041c\u042f \u041d\u0410\u0427\u0410\u041b\u0410 \u0421\u0415\u0421\u0421\u0418\u0418',\n            '\u0414\u0415\u0419\u0421\u0422\u0412\u0418\u042f'\n        ]\n\n        table_content = self.user_settings_table.read(UserCardLocators.TABLE_WORK_AREA)\n        len_table_content = len(table_content)\n\n        if len_table_content == 0:\n            assert False, \"The contents of the table are missing\"\n\n        actual_headers = table_content[0]\n\n        assert actual_headers == expected_headers,\\\n               f\"Expected table headers {expected_headers} are not equal {actual_headers}\"\n\n        if len_table_content == 1:\n            assert False, \"Table body is missing\"\n\n        for index in range(len_table_content - 1):\n            self.should_be_delete_button_on_user_settings_table_row(index, \"\u0423\u0434\u0430\u043b\u0438\u0442\u044c\")\n\n    def should_be_user_settings_table(self) -> None:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0441\u0435\u0441\u0441\u0438\u043e\u043d\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\n\n        Raises:\n            AssertionError: \u0415\u0441\u043b\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442.\n        \"\"\"\n\n        self.user_settings_table.check_visibility(\n                            UserCardLocators.TABLE_WORK_AREA,\n                            \"User settings table is missing\")\n\n    def should_be_delete_button_on_user_settings_table_row(self,\n                                                                row_index: int,\n                                                                tooltip: str\n                                                               ) -> None:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u043a\u043d\u043e\u043f\u043a\u0438 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u0432 \u0441\u0442\u0440\u043e\u043a\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u044b.\n\n        Args:\n            row_index: \u0418\u043d\u0434\u0435\u043a\u0441 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438.\n            tooltip: \u041e\u0436\u0438\u0434\u0430\u0435\u043c\u044b\u0439 \u0442\u0435\u043a\u0441\u0442 \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0438.\n\n        Raises:\n            AssertionError: \u0415\u0441\u043b\u0438 \u043a\u043d\u043e\u043f\u043a\u0430 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u0438\u043b\u0438 \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0430 \u043d\u0435\u0432\u0435\u0440\u043d\u0430.\n        \"\"\"\n\n        delete_button = self.get_delete_button_from_row(row_index)\n\n        # \u041e\u0436\u0438\u0434\u0430\u0435\u043c \u0438\u0441\u0447\u0435\u0437\u043d\u043e\u0432\u0435\u043d\u0438\u044f \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0445 \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043e\u043a \u043f\u0435\u0440\u0435\u0434 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u043e\u0439\n        delete_button.wait_for_tooltip_to_disappear()\n\n        delete_button.check_visibility(\n            f\"Delete session button is missing on {row_index} row\"\n        )\n        delete_button.check_tooltip_with_text(tooltip)\n\n        # \u041e\u0436\u0438\u0434\u0430\u0435\u043c \u0438\u0441\u0447\u0435\u0437\u043d\u043e\u0432\u0435\u043d\u0438\u044f \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0438 \u043f\u043e\u0441\u043b\u0435 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438\n        delete_button.wait_for_tooltip_to_disappear()\n
    "},{"location":"components_derived/dialog_user_settings/#components_derived.dialog_user_settings.UserSettingsDialogWindow.__init__","title":"__init__(page)","text":"

    \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 \u0434\u0438\u0430\u043b\u043e\u0433\u043e\u0432\u043e\u0435 \u043e\u043a\u043d\u043e \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0430 \u0441\u0435\u0441\u0441\u0438\u043e\u043d\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b.

    Parameters:

    Name Type Description Default page Page

    \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.

    required Source code in components_derived\\dialog_user_settings.py
    def __init__(self, page: Page):\n    \"\"\"\u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 \u0434\u0438\u0430\u043b\u043e\u0433\u043e\u0432\u043e\u0435 \u043e\u043a\u043d\u043e \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0430 \u0441\u0435\u0441\u0441\u0438\u043e\u043d\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b.\n\n    Args:\n        page: \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.\n    \"\"\"\n\n    super().__init__(page)\n\n    dialog_window_locator = page.locator(UserCardLocators.DIALOG_USER_SETTINGS)\n\n    self.dialog_window_title = Text(page,\n                                    dialog_window_locator.\\\n                                    locator(UserCardLocators.TITLE_DIALOG_USER_SETTINGS),\n                                    \"dialog window title\")\n    self.close_button = Button(page,\n                               dialog_window_locator.\\\n                               locator(UserCardLocators.HEADER_DIALOG_USER_SETTINGS). \\\n                               get_by_role(\"button\"),\n                               \"close button\")\n\n    self.user_settings_table = TableComponent(page)\n
    "},{"location":"components_derived/dialog_user_settings/#components_derived.dialog_user_settings.UserSettingsDialogWindow.check_content","title":"check_content()","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u043e\u043a\u043d\u043e \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0430 \u0441\u0435\u0441\u0441\u0438\u043e\u043d\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.

    Source code in components_derived\\dialog_user_settings.py
    def check_content(self) -> None:\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u043e\u043a\u043d\u043e \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0430 \u0441\u0435\u0441\u0441\u0438\u043e\u043d\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\"\"\"\n\n    self.dialog_window_title.check_have_text(\"\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438\", \\\n                                             \"Title '\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438' is missing on user settings window top\")\n    self.close_button.check_visibility(\"Close button is missing on user settings window top\")\n\n    self.should_be_user_settings_table()\n    self.check_user_settings_table_content()\n
    "},{"location":"components_derived/dialog_user_settings/#components_derived.dialog_user_settings.UserSettingsDialogWindow.check_user_settings_table_content","title":"check_user_settings_table_content()","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0441\u0435\u0441\u0441\u0438\u043e\u043d\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.

    Raises:

    Type Description AssertionError

    \u0415\u0441\u043b\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u043f\u0443\u0441\u0442\u0430 \u0438\u043b\u0438 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0438 \u043d\u0435\u0432\u0435\u0440\u043d\u044b.

    Source code in components_derived\\dialog_user_settings.py
    def check_user_settings_table_content(self) -> None:\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0441\u0435\u0441\u0441\u0438\u043e\u043d\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\n\n\n    Raises:\n        AssertionError: \u0415\u0441\u043b\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u043f\u0443\u0441\u0442\u0430 \u0438\u043b\u0438 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0438 \u043d\u0435\u0432\u0435\u0440\u043d\u044b.\n    \"\"\"\n\n    expected_headers = [\n        '\u041f\u041e\u041b\u042c\u0417\u041e\u0412\u0410\u0422\u0415\u041b\u042c',\n        'IP \u0410\u0414\u0420\u0415\u0421',\n        '\u0412\u0420\u0415\u041c\u042f \u041d\u0410\u0427\u0410\u041b\u0410 \u0421\u0415\u0421\u0421\u0418\u0418',\n        '\u0414\u0415\u0419\u0421\u0422\u0412\u0418\u042f'\n    ]\n\n    table_content = self.user_settings_table.read(UserCardLocators.TABLE_WORK_AREA)\n    len_table_content = len(table_content)\n\n    if len_table_content == 0:\n        assert False, \"The contents of the table are missing\"\n\n    actual_headers = table_content[0]\n\n    assert actual_headers == expected_headers,\\\n           f\"Expected table headers {expected_headers} are not equal {actual_headers}\"\n\n    if len_table_content == 1:\n        assert False, \"Table body is missing\"\n\n    for index in range(len_table_content - 1):\n        self.should_be_delete_button_on_user_settings_table_row(index, \"\u0423\u0434\u0430\u043b\u0438\u0442\u044c\")\n
    "},{"location":"components_derived/dialog_user_settings/#components_derived.dialog_user_settings.UserSettingsDialogWindow.check_window_absence","title":"check_window_absence()","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u044f \u043e\u043a\u043d\u0430 \u043d\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435.

    Raises:

    Type Description AssertionError

    \u0435\u0441\u043b\u0438 \u043e\u043a\u043do \u043f\u0440\u0438\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u043d\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435.

    Source code in components_derived\\dialog_user_settings.py
    def check_window_absence(self) -> None:\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u044f \u043e\u043a\u043d\u0430 \u043d\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435.\n\n    Raises:\n        AssertionError: \u0435\u0441\u043b\u0438 \u043e\u043a\u043do \u043f\u0440\u0438\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u043d\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435.\n    \"\"\"\n\n    self.check_absence(UserCardLocators.DIALOG_USER_SETTINGS, \\\n                       \"User settings dialog window is present\")\n
    "},{"location":"components_derived/dialog_user_settings/#components_derived.dialog_user_settings.UserSettingsDialogWindow.check_window_visibility","title":"check_window_visibility()","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u043a\u043d\u0430 \u043d\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435.

    Raises:

    Type Description AssertionError

    \u0435\u0441\u043b\u0438 \u043e\u043a\u043do \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u043d\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435.

    Source code in components_derived\\dialog_user_settings.py
    def check_window_visibility(self) -> None:\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u043a\u043d\u0430 \u043d\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435.\n\n    Raises:\n        AssertionError: \u0435\u0441\u043b\u0438 \u043e\u043a\u043do \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u043d\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435.\n    \"\"\"\n\n    self.check_visibility(UserCardLocators.DIALOG_USER_SETTINGS, \\\n                          \"User settings dialog window is missing\")\n
    "},{"location":"components_derived/dialog_user_settings/#components_derived.dialog_user_settings.UserSettingsDialogWindow.click_close_button","title":"click_close_button()","text":"

    \u041d\u0430\u0436\u0438\u043c\u0430\u0435\u0442 \u043a\u043d\u043e\u043f\u043a\u0443 \u0437\u0430\u043a\u0440\u044b\u0442\u0438\u044f \u043e\u043a\u043d\u0430.

    \u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u043a\u043b\u0438\u043a \u043f\u043e \u043a\u043d\u043e\u043f\u043a\u0435 '\u0417\u0430\u043a\u0440\u044b\u0442\u044c' \u043d\u0430 \u0441\u0442\u0440\u043e\u043a\u0435 \u0441 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u043e\u043c \u043e\u043a\u043d\u0430.

    Source code in components_derived\\dialog_user_settings.py
    def click_close_button(self):\n    \"\"\"\u041d\u0430\u0436\u0438\u043c\u0430\u0435\u0442 \u043a\u043d\u043e\u043f\u043a\u0443 \u0437\u0430\u043a\u0440\u044b\u0442\u0438\u044f \u043e\u043a\u043d\u0430.\n\n    \u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u043a\u043b\u0438\u043a \u043f\u043e \u043a\u043d\u043e\u043f\u043a\u0435 '\u0417\u0430\u043a\u0440\u044b\u0442\u044c' \u043d\u0430 \u0441\u0442\u0440\u043e\u043a\u0435 \u0441 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u043e\u043c \u043e\u043a\u043d\u0430.\n    \"\"\"\n\n    self.close_button.click()\n
    "},{"location":"components_derived/dialog_user_settings/#components_derived.dialog_user_settings.UserSettingsDialogWindow.get_delete_button_from_row","title":"get_delete_button_from_row(row_index)","text":"

    \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043a\u043d\u043e\u043f\u043a\u0443 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u0441\u0435\u0430\u043d\u0441\u0430 \u0434\u043b\u044f \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438.

    Parameters:

    Name Type Description Default row_index int

    \u0418\u043d\u0434\u0435\u043a\u0441 \u0441\u0442\u0440\u043e\u043a\u0438 \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435.

    required

    Returns:

    Name Type Description TooltipButton TooltipButton

    \u041a\u043d\u043e\u043f\u043a\u0430 \u0441 \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u043e\u0439.

    Raises:

    Type Description AssertionError

    \u0415\u0441\u043b\u0438 \u0441\u0442\u0440\u043e\u043a\u0430 \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u0430.

    Source code in components_derived\\dialog_user_settings.py
    def get_delete_button_from_row(self, row_index: int) -> TooltipButton:\n    \"\"\"\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043a\u043d\u043e\u043f\u043a\u0443 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u0441\u0435\u0430\u043d\u0441\u0430 \u0434\u043b\u044f \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438.\n\n    Args:\n        row_index: \u0418\u043d\u0434\u0435\u043a\u0441 \u0441\u0442\u0440\u043e\u043a\u0438 \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435.\n\n    Returns:\n        TooltipButton: \u041a\u043d\u043e\u043f\u043a\u0430 \u0441 \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u043e\u0439.\n\n    Raises:\n        AssertionError: \u0415\u0441\u043b\u0438 \u0441\u0442\u0440\u043e\u043a\u0430 \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u0430.\n    \"\"\"\n\n    row_locator = self.user_settings_table.get_row_locator(\n        UserCardLocators.TABLE_WORK_AREA,\n        row_index\n    )\n    assert isinstance(row_locator, Locator), f\"Row with index {row_index} is missing\"\n\n    button_locator = row_locator.get_by_role(\"button\")\n    return TooltipButton(self.page, button_locator, \"delete_button\")\n
    "},{"location":"components_derived/dialog_user_settings/#components_derived.dialog_user_settings.UserSettingsDialogWindow.should_be_delete_button_on_user_settings_table_row","title":"should_be_delete_button_on_user_settings_table_row(row_index, tooltip)","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u043a\u043d\u043e\u043f\u043a\u0438 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u0432 \u0441\u0442\u0440\u043e\u043a\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u044b.

    Parameters:

    Name Type Description Default row_index int

    \u0418\u043d\u0434\u0435\u043a\u0441 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438.

    required tooltip str

    \u041e\u0436\u0438\u0434\u0430\u0435\u043c\u044b\u0439 \u0442\u0435\u043a\u0441\u0442 \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0438.

    required

    Raises:

    Type Description AssertionError

    \u0415\u0441\u043b\u0438 \u043a\u043d\u043e\u043f\u043a\u0430 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u0438\u043b\u0438 \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0430 \u043d\u0435\u0432\u0435\u0440\u043d\u0430.

    Source code in components_derived\\dialog_user_settings.py
    def should_be_delete_button_on_user_settings_table_row(self,\n                                                            row_index: int,\n                                                            tooltip: str\n                                                           ) -> None:\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u043a\u043d\u043e\u043f\u043a\u0438 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u0432 \u0441\u0442\u0440\u043e\u043a\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u044b.\n\n    Args:\n        row_index: \u0418\u043d\u0434\u0435\u043a\u0441 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438.\n        tooltip: \u041e\u0436\u0438\u0434\u0430\u0435\u043c\u044b\u0439 \u0442\u0435\u043a\u0441\u0442 \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0438.\n\n    Raises:\n        AssertionError: \u0415\u0441\u043b\u0438 \u043a\u043d\u043e\u043f\u043a\u0430 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u0438\u043b\u0438 \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0430 \u043d\u0435\u0432\u0435\u0440\u043d\u0430.\n    \"\"\"\n\n    delete_button = self.get_delete_button_from_row(row_index)\n\n    # \u041e\u0436\u0438\u0434\u0430\u0435\u043c \u0438\u0441\u0447\u0435\u0437\u043d\u043e\u0432\u0435\u043d\u0438\u044f \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0445 \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043e\u043a \u043f\u0435\u0440\u0435\u0434 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u043e\u0439\n    delete_button.wait_for_tooltip_to_disappear()\n\n    delete_button.check_visibility(\n        f\"Delete session button is missing on {row_index} row\"\n    )\n    delete_button.check_tooltip_with_text(tooltip)\n\n    # \u041e\u0436\u0438\u0434\u0430\u0435\u043c \u0438\u0441\u0447\u0435\u0437\u043d\u043e\u0432\u0435\u043d\u0438\u044f \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0438 \u043f\u043e\u0441\u043b\u0435 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438\n    delete_button.wait_for_tooltip_to_disappear()\n
    "},{"location":"components_derived/dialog_user_settings/#components_derived.dialog_user_settings.UserSettingsDialogWindow.should_be_user_settings_table","title":"should_be_user_settings_table()","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0441\u0435\u0441\u0441\u0438\u043e\u043d\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.

    Raises:

    Type Description AssertionError

    \u0415\u0441\u043b\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442.

    Source code in components_derived\\dialog_user_settings.py
    def should_be_user_settings_table(self) -> None:\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0441\u0435\u0441\u0441\u0438\u043e\u043d\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\n\n    Raises:\n        AssertionError: \u0415\u0441\u043b\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442.\n    \"\"\"\n\n    self.user_settings_table.check_visibility(\n                        UserCardLocators.TABLE_WORK_AREA,\n                        \"User settings table is missing\")\n
    "},{"location":"components_derived/modal_add_AD_user/","title":"AddADUserModalWindow","text":"

    \u041c\u043e\u0434\u0443\u043b\u044c modal_add_user \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043a\u043b\u0430\u0441\u0441 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u044b\u043c \u043e\u043a\u043d\u043e\u043c \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.

    \u041a\u043b\u0430\u0441\u0441 AddUserModalWindow \u043d\u0430\u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u0431\u0430\u0437\u043e\u0432\u044b\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b ModalWindowComponent \u0438 \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u0442 \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u0447\u043d\u044b\u0435 \u043c\u0435\u0442\u043e\u0434\u044b \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0444\u043e\u0440\u043c\u0430\u043c\u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439.

    "},{"location":"components_derived/modal_add_AD_user/#components_derived.modal_add_AD_user.AddADUserModalWindow","title":"AddADUserModalWindow","text":"

    Bases: ModalWindowComponent

    \u041c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043a\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043d\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.

    \u041d\u0430\u0441\u043b\u0435\u0434\u0443\u0435\u0442 ModalWindowComponent \u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0444\u043e\u0440\u043c\u044b: - \u041f\u043e\u043b\u044f \u0432\u0432\u043e\u0434\u0430 (\u0438\u043c\u044f, \u043f\u0430\u0440\u043e\u043b\u044c, email \u0438 \u0434\u0440.) - \u0427\u0435\u043a\u0431\u043e\u043a\u0441\u044b (Active Directory, Push-\u0443\u0432\u0435\u0434\u043e\u043c\u043b\u0435\u043d\u0438\u044f) - \u0412\u044b\u043f\u0430\u0434\u0430\u044e\u0449\u0438\u0435 \u0441\u043f\u0438\u0441\u043a\u0438 \u0433\u0440\u0443\u043f\u043f, \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 AD, \u0440\u043e\u043b\u0435\u0439 - \u041a\u043d\u043e\u043f\u043a\u0438 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439

    Source code in components_derived\\modal_add_AD_user.py
    class AddADUserModalWindow(ModalWindowComponent):\n    \"\"\"\u041c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043a\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043d\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\n\n    \u041d\u0430\u0441\u043b\u0435\u0434\u0443\u0435\u0442 ModalWindowComponent \u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0444\u043e\u0440\u043c\u044b:\n    - \u041f\u043e\u043b\u044f \u0432\u0432\u043e\u0434\u0430 (\u0438\u043c\u044f, \u043f\u0430\u0440\u043e\u043b\u044c, email \u0438 \u0434\u0440.)\n    - \u0427\u0435\u043a\u0431\u043e\u043a\u0441\u044b (Active Directory, Push-\u0443\u0432\u0435\u0434\u043e\u043c\u043b\u0435\u043d\u0438\u044f)\n    - \u0412\u044b\u043f\u0430\u0434\u0430\u044e\u0449\u0438\u0435 \u0441\u043f\u0438\u0441\u043a\u0438 \u0433\u0440\u0443\u043f\u043f, \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 AD, \u0440\u043e\u043b\u0435\u0439\n    - \u041a\u043d\u043e\u043f\u043a\u0438 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439\n    \"\"\"\n\n    def __init__(self, page: Page):\n        \"\"\"\u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0444\u043e\u0440\u043c\u044b \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\"\"\"\n\n        super().__init__(page)\n\n        # \u041b\u043e\u043a\u0430\u0442\u043e\u0440\u044b \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0444\u043e\u0440\u043c\u044b\n        input_form_locator = page.locator(ModalWindowLocators.INPUT_FORM_USER_DATA)\n        text_field_locator = ModalWindowLocators.TEXT_FIELD_INPUT_FORM_USER_DATA\n        label_locator = ModalWindowLocators.LABEL_INPUT_FORM_USER_DATA\n\n        # \u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430 \u0438 \u043a\u043d\u043e\u043f\u043a\u0438 \u0437\u0430\u043a\u0440\u044b\u0442\u0438\u044f \u0442\u0443\u043b\u0431\u0430\u0440\u0430\n        self.window_title = \"\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043d\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\"\n        locator_button_toolbar_close = self.page.get_by_role(\"navigation\").filter(\n            has_text=re.compile(self.window_title)\n        ).get_by_role(\"button\")\n\n        self.add_toolbar_title(self.window_title)\n        self.add_toolbar_button(locator_button_toolbar_close, \"close\")\n\n        # \u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0444\u043e\u0440\u043c\u044b\n        checkbox_1 = Checkbox(\n            page,\n            self.page.get_by_role(\"checkbox\").nth(0),\n            \"active_directory\"\n        )\n        self.add_content_item(\"active_directory_checkbox\", checkbox_1)\n\n        label_1 = Text(\n            page,\n            self.page.locator(label_locator).nth(0),\n            \"active_directory_checkbox_label\"\n        )\n        self.add_content_item(\"active_directory_checkbox_label\", label_1)\n\n        # \u041d\u0430\u0447\u0430\u043b\u044c\u043d\u044b\u0439 \u043d\u0430\u0431\u043e\u0440 \u043f\u043e\u043b\u0435\u0439 \u0444\u043e\u0440\u043c\u044b\n        group_loc = input_form_locator.get_by_role(\"combobox\").nth(0)\n        group_input = TextInput(page, group_loc, \"group_input\")\n        self.add_content_item(\"group_input\", group_input)\n        self.add_content_item(\n            \"group_list\",\n            DropdownList(page)\n        )\n\n        locator_button_search = self.page.get_by_role(\"button\", name=\"\u041f\u043e\u0438\u0441\u043a\")\n        self.add_button(locator_button_search, \"search\")\n\n        loc = input_form_locator.locator(\"xpath=div[3]\").locator(text_field_locator)\n        name_input = TextInput(page, loc, \"name_input\")\n        self.add_content_item(\"name_input\", name_input)\n\n        role_loc = input_form_locator.get_by_role(\"combobox\").nth(1)\n        role_input = TextInput(page, role_loc, \"role_input\")\n        self.add_content_item(\"role_input\", role_input)\n        self.add_content_item(\n            \"roles_list\",\n            DropdownList(page)\n        )\n\n        loc = input_form_locator.locator(\"xpath=div[6]\").locator(text_field_locator)\n        commentary_input = TextInput(page, loc, \"commentary_input\")\n        self.add_content_item(\"commentary_input\", commentary_input)\n\n        loc = input_form_locator.locator(\"xpath=div[7]\").locator(text_field_locator)\n        email_input = TextInput(page, loc, \"email_input\")\n        self.add_content_item(\"email_input\", email_input)\n\n        loc = input_form_locator.locator(\"xpath=div[8]\").locator(text_field_locator)\n        phone_input = TextInput(page, loc, \"phone_input\")\n        self.add_content_item(\"phone_input\", phone_input)\n\n        checkbox_2 = Checkbox(\n            page,\n            page.get_by_role(\"checkbox\").nth(1),\n            \"push_notification\"\n        )\n        self.add_content_item(\"push_notification_checkbox\", checkbox_2)\n\n        label_2 = Text(\n            page,\n            self.page.locator(label_locator).nth(1),\n            \"push_notification_checkbox_label\"\n        )\n        self.add_content_item(\"push_notification_checkbox_label\", label_2)\n\n        # \u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043a\u043d\u043e\u043f\u043e\u043a \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439\n        locator_button_add = self.page.get_by_role(\"button\", name=\"\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c\")\n        self.add_button(locator_button_add, \"add\")\n\n        locator_button_close = self.page.get_by_role(\"button\", name=\"\u0417\u0430\u043a\u0440\u044b\u0442\u044c\")\n        self.add_button(locator_button_close, \"close\")\n\n        self.new_user_confirm = ConfirmComponent(page, \" \u041e\u0442\u043c\u0435\u043d\u0430 \", \" \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \")\n\n    # \u0414\u0435\u0439\u0441\u0442\u0432\u0438\u044f:\n    def check_active_directory_checkbox(self):\n        \"\"\"\u0412\u043a\u043b\u044e\u0447\u0430\u0435\u0442 \u0447\u0435\u043a-\u0431\u043e\u043a\u0441 Active Directory. \"\"\"\n\n        self.get_content_item(\"active_directory_checkbox\").check(force=True)\n\n    def uncheck_active_directory_checkbox(self):\n        \"\"\"\u0412\u044b\u043a\u043b\u044e\u0447\u0430\u0435\u0442 \u0447\u0435\u043a-\u0431\u043e\u043a\u0441 Active Directory. \"\"\"\n\n        self.get_content_item(\"active_directory_checkbox\").uncheck(force=True)\n\n    def update_input_form_fields(self, expand):\n        \"\"\"\u041f\u0435\u0440\u0441\u0447\u0438\u0442\u044b\u0432\u0430\u0435\u0442 \u043b\u043e\u043a\u0430\u0442\u043e\u0440\u044b \u043f\u043e\u043b\u0435\u0439 \u0444\u043e\u0440\u043c\u044b \u0432\u0432\u043e\u0434\u0430 \u043f\u0440\u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0438/\u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0438 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u043f\u043e\u043b\u044f. \"\"\"\n\n        input_form_locator = self.page.locator(ModalWindowLocators.INPUT_FORM_USER_DATA)\n        text_field_locator = ModalWindowLocators.TEXT_FIELD_INPUT_FORM_USER_DATA\n\n        if expand:\n            new_loc = input_form_locator.locator(\"xpath=div[4]\").locator(text_field_locator)\n            self.get_content_item(\"name_input\").update_locator(new_loc)\n\n            new_loc = input_form_locator.locator(\"xpath=div[7]\").locator(text_field_locator)\n            self.get_content_item(\"commentary_input\").update_locator(new_loc)\n\n            new_loc = input_form_locator.locator(\"xpath=div[8]\").locator(text_field_locator)\n            self.get_content_item(\"email_input\").update_locator(new_loc)\n\n            new_loc = input_form_locator.locator(\"xpath=div[9]\").locator(text_field_locator)\n            self.get_content_item(\"phone_input\").update_locator(new_loc)\n\n            role_loc = input_form_locator.get_by_role(\"combobox\").nth(2)\n            self.get_content_item(\"role_input\").update_locator(role_loc)\n        else:\n            new_loc = input_form_locator.locator(\"xpath=div[3]\").locator(text_field_locator)\n            self.get_content_item(\"name_input\").update_locator(new_loc)\n\n            new_loc = input_form_locator.locator(\"xpath=div[6]\").locator(text_field_locator)\n            self.get_content_item(\"commentary_input\").update_locator(new_loc)\n\n            new_loc = input_form_locator.locator(\"xpath=div[7]\").locator(text_field_locator)\n            self.get_content_item(\"email_input\").update_locator(new_loc)\n\n            new_loc = input_form_locator.locator(\"xpath=div[8]\").locator(text_field_locator)\n            self.get_content_item(\"phone_input\").update_locator(new_loc)\n\n            role_loc = input_form_locator.get_by_role(\"combobox\").nth(1)\n            self.get_content_item(\"role_input\").update_locator(role_loc)\n\n    def new_user(self, user_data):\n        \"\"\"\u0417\u0430\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u0444\u043e\u0440\u043c\u0443 \u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u043d\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\n\n        Args:\n            user_data (dict): \u0414\u0430\u043d\u043d\u044b\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f (\u0438\u043c\u044f, \u0440\u043e\u043b\u044c, \u043f\u0430\u0440\u043e\u043b\u044c \u0438 \u0434\u0440.)\n        \"\"\"\n\n        menu_locator = self.page.locator(ModalWindowLocators.MENU_INPUT_FORM_USER_DATA)\n        input_form_locator = self.page.locator(ModalWindowLocators.INPUT_FORM_USER_DATA)\n\n        group_name = user_data.get(\"group\")\n        if group_name is None:\n            assert False, \"Value of 'group' is missing\"\n\n        name = user_data.get(\"name\")\n        if name is None:\n            assert False, \"Value of 'name' is missing\"\n\n        role = user_data.get(\"role\")\n        if role is None:\n            assert False, \"Value of 'role' is missing\"\n\n        group_field = self.get_content_item(\"group_input\")\n        group_field.click()\n\n        group_list = self.get_content_item(\"group_list\")\n        group_list.scroll_until_end(menu_locator)\n        group_names = group_list.get_item_names(menu_locator)\n        if group_name not in group_names:\n            assert False, f\"Required group name {group_name} is missing\"\n\n        group_list.check_item_with_text(group_name)\n        group_list.click_item_with_text(group_name)\n\n        search_button = self.get_button_by_name(\"search\")\n        search_button.click()\n\n        count = input_form_locator.get_by_role(\"combobox\").count()\n        if count == 2:\n            assert False, f\"Selected group {group_name} is empty. Use another group.\"\n\n        user_AD_loc = input_form_locator.get_by_role(\"combobox\").nth(1)\n        user_AD_input = TextInput(self.page, user_AD_loc, \"user_AD_input\")\n        self.add_content_item(\"user_AD_input\", user_AD_input)\n        self.add_content_item(\n            \"user_AD_list\",\n            DropdownList(self.page)\n        )\n\n        user_AD_input.click()\n        user_AD_list = self.get_content_item(\"user_AD_list\")\n        user_AD_list.scroll_until_end(menu_locator)\n        user_AD_names = group_list.get_item_names(menu_locator)\n        if name not in user_AD_names:\n            assert False, f\"Required user name {name} is missing\"\n\n        user_AD_list.check_item_with_text(name)\n        user_AD_list.click_item_with_text(name)\n\n        role_field = self.get_content_item(\"role_input\")\n        role_field.click()\n\n        roles_list = self.get_content_item(\"roles_list\")\n        roles_list.check_item_with_text(user_data[\"role\"])\n        roles_list.click_item_with_text(user_data[\"role\"])\n\n        # \u041e\u0442\u043f\u0440\u0430\u0432\u043a\u0430 \u0444\u043e\u0440\u043c\u044b\n        add_button = self.get_button_by_name(\"add\")\n        add_button.click()\n\n        # \u041f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f\n        title = \"\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043d\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\"\n        self.new_user_confirm.check_title(\n            title,\n            f\"Confirmation dialog window with title '{title}' is missing\"\n        )\n\n        # \u041d\u0430 \u043f\u0435\u0440\u0432\u043e\u043c \u044d\u0442\u0430\u043f\u0435 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u043d\u0435 \u0441\u043e\u0437\u0434\u0430\u0435\u043c\n        self.new_user_confirm.click_cancel_button()\n        self.close_window()\n\n    def close_window(self):\n        \"\"\"\u0417\u0430\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043a\u043d\u043e \u0447\u0435\u0440\u0435\u0437 \u043a\u043d\u043e\u043f\u043a\u0443 '\u0417\u0430\u043a\u0440\u044b\u0442\u044c'.\"\"\"\n\n        close_button = self.get_button_by_name(\"close\")\n        close_button.click()\n\n    def close_window_by_toolbar_button(self):\n        \"\"\"\u0417\u0430\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043a\u043d\u043e \u0447\u0435\u0440\u0435\u0437 \u043a\u043d\u043e\u043f\u043a\u0443 \u0432 \u0442\u0443\u043b\u0431\u0430\u0440\u0435.\"\"\"\n\n        self.click_toolbar_close_button()\n\n    # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0438:\n    def check_content(self):\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0438 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0441\u0442\u044c \u0432\u0441\u0435\u0445 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0444\u043e\u0440\u043c\u044b.\"\"\"\n\n        input_form_locator = self.page.locator(ModalWindowLocators.INPUT_FORM_USER_DATA)\n        menu_locator = self.page.locator(ModalWindowLocators.MENU_INPUT_FORM_USER_DATA)\n\n        self.check_by_window_title()\n\n        is_checked = self.get_content_item(\"active_directory_checkbox\").is_checked()\n        if not is_checked:\n            assert False, \\\n            \"The checkbox 'Active Directory'should be checked for the add user from Active Directory window\"\n\n        self.check_toolbar_button_visibility(\"close\")\n        self.check_toolbar_button_tooltip(\"close\", \"\u0417\u0430\u043a\u0440\u044b\u0442\u044c\")\n\n        no_op_names = [\"roles_list\", \"group_list\"]\n\n        for name in self.content_items.keys():\n            item = self.get_content_item(name)\n\n            if name == \"active_directory_checkbox_label\":\n                item.check_have_text(\n                    \"Active Directory\",\n                    \"Label 'Active Directory' is missing\"\n                )\n            elif name == \"push_notification_checkbox_label\":\n                item.check_have_text(\n                    \"\u041f\u043e\u0434\u043f\u0438\u0441\u043a\u0430 \u043d\u0430 Push-\u0443\u0432\u0435\u0434\u043e\u043c\u043b\u0435\u043d\u0438\u044f\",\n                    \"Label '\u041f\u043e\u0434\u043f\u0438\u0441\u043a\u0430 \u043d\u0430 Push-\u0443\u0432\u0435\u0434\u043e\u043c\u043b\u0435\u043d\u0438\u044f' is missing\"\n                )\n            elif name == \"group_input\":\n                item.click()\n                group_list = self.get_content_item(\"group_list\")\n                group_list.check_visibility(menu_locator,\n                                          \"Groups list is missing\")\n\n                is_scrollable_vertically = group_list.check_vertical_scrolling(menu_locator)\n                assert is_scrollable_vertically, \"Groups list should be scrollable_vertically\"\n                self.page.keyboard.press(\"Escape\")\n            elif name == \"role_input\":\n                item.click()\n                roles_list = self.get_content_item(\"roles_list\")\n                roles_list.check_visibility(menu_locator,\n                                          \"Roles list is missing\")\n\n                is_scrollable_vertically = roles_list.check_vertical_scrolling(menu_locator)\n                assert not is_scrollable_vertically, \\\n                            \"Roles list should not be scrollable_vertically\"\n\n                for role in roles_dict.values():\n                    # \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e, \u043f\u043e\u043a\u0430 \u0435\u0441\u0442\u044c \u043d\u0435\u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0435 \u0441\u043e \u0441\u043f\u0438\u0441\u043a\u043e\u043c \u0440\u043e\u043b\u0435\u0439 \u0432 \u0432\u043a\u043b\u0430\u0434\u043a\u0435 \u0421\u0435\u0441\u0441\u0438\u0438\n                    if role == \"\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\":\n                        continue\n                    roles_list.check_item_with_text(role)\n                self.page.keyboard.press(\"Escape\")\n            elif name in no_op_names:\n                continue\n            else:\n                item.check_visibility(\n                    f\"Modal window content item with name '{name}' is missing\"\n                )\n\n        self.check_button_visibility(\"search\")\n        self.check_button_visibility(\"add\")\n        self.check_button_visibility(\"close\")\n\n        search_button = self.get_button_by_name(\"search\")\n        search_button.click()\n\n        user_AD_loc = input_form_locator.get_by_role(\"combobox\").nth(1)\n        user_AD_input = TextInput(self.page, user_AD_loc, \"user_AD_input\")\n        self.add_content_item(\"user_AD_input\", user_AD_input)\n        self.add_content_item(\n            \"user_AD_list\",\n            DropdownList(self.page)\n        )\n\n        user_AD_input.click()\n        user_AD_list = self.get_content_item(\"user_AD_list\")\n        user_AD_list.check_visibility(menu_locator,\n                                  \"Users AD list is missing\")\n        is_scrollable_vertically = user_AD_list.check_vertical_scrolling(menu_locator)\n        assert is_scrollable_vertically, \"Users AD list should be scrollable_vertically\"\n        self.page.keyboard.press(\"Escape\")\n\n        self.update_input_form_fields(expand=True)\n\n        self.get_content_item(\"name_input\").check_visibility(\n                                           \"Modal window content item with name 'name_input' is missing\")\n        self.get_content_item(\"role_input\").check_visibility(\n                                           \"Modal window content item with name 'role_input' is missing\")\n        self.get_content_item(\"commentary_input\").check_visibility(\n                                           \"Modal window content item with name 'commentary_input' is missing\")\n        self.get_content_item(\"email_input\").check_visibility(\n                                           \"Modal window content item with name 'email_input' is missing\")\n        self.get_content_item(\"phone_input\").check_visibility(\n                                           \"Modal window content item with name 'phone_input' is missing\")\n
    "},{"location":"components_derived/modal_add_AD_user/#components_derived.modal_add_AD_user.AddADUserModalWindow.__init__","title":"__init__(page)","text":"

    \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0444\u043e\u0440\u043c\u044b \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.

    Source code in components_derived\\modal_add_AD_user.py
    def __init__(self, page: Page):\n    \"\"\"\u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0444\u043e\u0440\u043c\u044b \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\"\"\"\n\n    super().__init__(page)\n\n    # \u041b\u043e\u043a\u0430\u0442\u043e\u0440\u044b \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0444\u043e\u0440\u043c\u044b\n    input_form_locator = page.locator(ModalWindowLocators.INPUT_FORM_USER_DATA)\n    text_field_locator = ModalWindowLocators.TEXT_FIELD_INPUT_FORM_USER_DATA\n    label_locator = ModalWindowLocators.LABEL_INPUT_FORM_USER_DATA\n\n    # \u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430 \u0438 \u043a\u043d\u043e\u043f\u043a\u0438 \u0437\u0430\u043a\u0440\u044b\u0442\u0438\u044f \u0442\u0443\u043b\u0431\u0430\u0440\u0430\n    self.window_title = \"\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043d\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\"\n    locator_button_toolbar_close = self.page.get_by_role(\"navigation\").filter(\n        has_text=re.compile(self.window_title)\n    ).get_by_role(\"button\")\n\n    self.add_toolbar_title(self.window_title)\n    self.add_toolbar_button(locator_button_toolbar_close, \"close\")\n\n    # \u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0444\u043e\u0440\u043c\u044b\n    checkbox_1 = Checkbox(\n        page,\n        self.page.get_by_role(\"checkbox\").nth(0),\n        \"active_directory\"\n    )\n    self.add_content_item(\"active_directory_checkbox\", checkbox_1)\n\n    label_1 = Text(\n        page,\n        self.page.locator(label_locator).nth(0),\n        \"active_directory_checkbox_label\"\n    )\n    self.add_content_item(\"active_directory_checkbox_label\", label_1)\n\n    # \u041d\u0430\u0447\u0430\u043b\u044c\u043d\u044b\u0439 \u043d\u0430\u0431\u043e\u0440 \u043f\u043e\u043b\u0435\u0439 \u0444\u043e\u0440\u043c\u044b\n    group_loc = input_form_locator.get_by_role(\"combobox\").nth(0)\n    group_input = TextInput(page, group_loc, \"group_input\")\n    self.add_content_item(\"group_input\", group_input)\n    self.add_content_item(\n        \"group_list\",\n        DropdownList(page)\n    )\n\n    locator_button_search = self.page.get_by_role(\"button\", name=\"\u041f\u043e\u0438\u0441\u043a\")\n    self.add_button(locator_button_search, \"search\")\n\n    loc = input_form_locator.locator(\"xpath=div[3]\").locator(text_field_locator)\n    name_input = TextInput(page, loc, \"name_input\")\n    self.add_content_item(\"name_input\", name_input)\n\n    role_loc = input_form_locator.get_by_role(\"combobox\").nth(1)\n    role_input = TextInput(page, role_loc, \"role_input\")\n    self.add_content_item(\"role_input\", role_input)\n    self.add_content_item(\n        \"roles_list\",\n        DropdownList(page)\n    )\n\n    loc = input_form_locator.locator(\"xpath=div[6]\").locator(text_field_locator)\n    commentary_input = TextInput(page, loc, \"commentary_input\")\n    self.add_content_item(\"commentary_input\", commentary_input)\n\n    loc = input_form_locator.locator(\"xpath=div[7]\").locator(text_field_locator)\n    email_input = TextInput(page, loc, \"email_input\")\n    self.add_content_item(\"email_input\", email_input)\n\n    loc = input_form_locator.locator(\"xpath=div[8]\").locator(text_field_locator)\n    phone_input = TextInput(page, loc, \"phone_input\")\n    self.add_content_item(\"phone_input\", phone_input)\n\n    checkbox_2 = Checkbox(\n        page,\n        page.get_by_role(\"checkbox\").nth(1),\n        \"push_notification\"\n    )\n    self.add_content_item(\"push_notification_checkbox\", checkbox_2)\n\n    label_2 = Text(\n        page,\n        self.page.locator(label_locator).nth(1),\n        \"push_notification_checkbox_label\"\n    )\n    self.add_content_item(\"push_notification_checkbox_label\", label_2)\n\n    # \u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043a\u043d\u043e\u043f\u043e\u043a \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439\n    locator_button_add = self.page.get_by_role(\"button\", name=\"\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c\")\n    self.add_button(locator_button_add, \"add\")\n\n    locator_button_close = self.page.get_by_role(\"button\", name=\"\u0417\u0430\u043a\u0440\u044b\u0442\u044c\")\n    self.add_button(locator_button_close, \"close\")\n\n    self.new_user_confirm = ConfirmComponent(page, \" \u041e\u0442\u043c\u0435\u043d\u0430 \", \" \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \")\n
    "},{"location":"components_derived/modal_add_AD_user/#components_derived.modal_add_AD_user.AddADUserModalWindow.check_active_directory_checkbox","title":"check_active_directory_checkbox()","text":"

    \u0412\u043a\u043b\u044e\u0447\u0430\u0435\u0442 \u0447\u0435\u043a-\u0431\u043e\u043a\u0441 Active Directory.

    Source code in components_derived\\modal_add_AD_user.py
    def check_active_directory_checkbox(self):\n    \"\"\"\u0412\u043a\u043b\u044e\u0447\u0430\u0435\u0442 \u0447\u0435\u043a-\u0431\u043e\u043a\u0441 Active Directory. \"\"\"\n\n    self.get_content_item(\"active_directory_checkbox\").check(force=True)\n
    "},{"location":"components_derived/modal_add_AD_user/#components_derived.modal_add_AD_user.AddADUserModalWindow.check_content","title":"check_content()","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0438 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0441\u0442\u044c \u0432\u0441\u0435\u0445 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0444\u043e\u0440\u043c\u044b.

    Source code in components_derived\\modal_add_AD_user.py
    def check_content(self):\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0438 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0441\u0442\u044c \u0432\u0441\u0435\u0445 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0444\u043e\u0440\u043c\u044b.\"\"\"\n\n    input_form_locator = self.page.locator(ModalWindowLocators.INPUT_FORM_USER_DATA)\n    menu_locator = self.page.locator(ModalWindowLocators.MENU_INPUT_FORM_USER_DATA)\n\n    self.check_by_window_title()\n\n    is_checked = self.get_content_item(\"active_directory_checkbox\").is_checked()\n    if not is_checked:\n        assert False, \\\n        \"The checkbox 'Active Directory'should be checked for the add user from Active Directory window\"\n\n    self.check_toolbar_button_visibility(\"close\")\n    self.check_toolbar_button_tooltip(\"close\", \"\u0417\u0430\u043a\u0440\u044b\u0442\u044c\")\n\n    no_op_names = [\"roles_list\", \"group_list\"]\n\n    for name in self.content_items.keys():\n        item = self.get_content_item(name)\n\n        if name == \"active_directory_checkbox_label\":\n            item.check_have_text(\n                \"Active Directory\",\n                \"Label 'Active Directory' is missing\"\n            )\n        elif name == \"push_notification_checkbox_label\":\n            item.check_have_text(\n                \"\u041f\u043e\u0434\u043f\u0438\u0441\u043a\u0430 \u043d\u0430 Push-\u0443\u0432\u0435\u0434\u043e\u043c\u043b\u0435\u043d\u0438\u044f\",\n                \"Label '\u041f\u043e\u0434\u043f\u0438\u0441\u043a\u0430 \u043d\u0430 Push-\u0443\u0432\u0435\u0434\u043e\u043c\u043b\u0435\u043d\u0438\u044f' is missing\"\n            )\n        elif name == \"group_input\":\n            item.click()\n            group_list = self.get_content_item(\"group_list\")\n            group_list.check_visibility(menu_locator,\n                                      \"Groups list is missing\")\n\n            is_scrollable_vertically = group_list.check_vertical_scrolling(menu_locator)\n            assert is_scrollable_vertically, \"Groups list should be scrollable_vertically\"\n            self.page.keyboard.press(\"Escape\")\n        elif name == \"role_input\":\n            item.click()\n            roles_list = self.get_content_item(\"roles_list\")\n            roles_list.check_visibility(menu_locator,\n                                      \"Roles list is missing\")\n\n            is_scrollable_vertically = roles_list.check_vertical_scrolling(menu_locator)\n            assert not is_scrollable_vertically, \\\n                        \"Roles list should not be scrollable_vertically\"\n\n            for role in roles_dict.values():\n                # \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e, \u043f\u043e\u043a\u0430 \u0435\u0441\u0442\u044c \u043d\u0435\u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0435 \u0441\u043e \u0441\u043f\u0438\u0441\u043a\u043e\u043c \u0440\u043e\u043b\u0435\u0439 \u0432 \u0432\u043a\u043b\u0430\u0434\u043a\u0435 \u0421\u0435\u0441\u0441\u0438\u0438\n                if role == \"\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\":\n                    continue\n                roles_list.check_item_with_text(role)\n            self.page.keyboard.press(\"Escape\")\n        elif name in no_op_names:\n            continue\n        else:\n            item.check_visibility(\n                f\"Modal window content item with name '{name}' is missing\"\n            )\n\n    self.check_button_visibility(\"search\")\n    self.check_button_visibility(\"add\")\n    self.check_button_visibility(\"close\")\n\n    search_button = self.get_button_by_name(\"search\")\n    search_button.click()\n\n    user_AD_loc = input_form_locator.get_by_role(\"combobox\").nth(1)\n    user_AD_input = TextInput(self.page, user_AD_loc, \"user_AD_input\")\n    self.add_content_item(\"user_AD_input\", user_AD_input)\n    self.add_content_item(\n        \"user_AD_list\",\n        DropdownList(self.page)\n    )\n\n    user_AD_input.click()\n    user_AD_list = self.get_content_item(\"user_AD_list\")\n    user_AD_list.check_visibility(menu_locator,\n                              \"Users AD list is missing\")\n    is_scrollable_vertically = user_AD_list.check_vertical_scrolling(menu_locator)\n    assert is_scrollable_vertically, \"Users AD list should be scrollable_vertically\"\n    self.page.keyboard.press(\"Escape\")\n\n    self.update_input_form_fields(expand=True)\n\n    self.get_content_item(\"name_input\").check_visibility(\n                                       \"Modal window content item with name 'name_input' is missing\")\n    self.get_content_item(\"role_input\").check_visibility(\n                                       \"Modal window content item with name 'role_input' is missing\")\n    self.get_content_item(\"commentary_input\").check_visibility(\n                                       \"Modal window content item with name 'commentary_input' is missing\")\n    self.get_content_item(\"email_input\").check_visibility(\n                                       \"Modal window content item with name 'email_input' is missing\")\n    self.get_content_item(\"phone_input\").check_visibility(\n                                       \"Modal window content item with name 'phone_input' is missing\")\n
    "},{"location":"components_derived/modal_add_AD_user/#components_derived.modal_add_AD_user.AddADUserModalWindow.close_window","title":"close_window()","text":"

    \u0417\u0430\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043a\u043d\u043e \u0447\u0435\u0440\u0435\u0437 \u043a\u043d\u043e\u043f\u043a\u0443 '\u0417\u0430\u043a\u0440\u044b\u0442\u044c'.

    Source code in components_derived\\modal_add_AD_user.py
    def close_window(self):\n    \"\"\"\u0417\u0430\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043a\u043d\u043e \u0447\u0435\u0440\u0435\u0437 \u043a\u043d\u043e\u043f\u043a\u0443 '\u0417\u0430\u043a\u0440\u044b\u0442\u044c'.\"\"\"\n\n    close_button = self.get_button_by_name(\"close\")\n    close_button.click()\n
    "},{"location":"components_derived/modal_add_AD_user/#components_derived.modal_add_AD_user.AddADUserModalWindow.close_window_by_toolbar_button","title":"close_window_by_toolbar_button()","text":"

    \u0417\u0430\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043a\u043d\u043e \u0447\u0435\u0440\u0435\u0437 \u043a\u043d\u043e\u043f\u043a\u0443 \u0432 \u0442\u0443\u043b\u0431\u0430\u0440\u0435.

    Source code in components_derived\\modal_add_AD_user.py
    def close_window_by_toolbar_button(self):\n    \"\"\"\u0417\u0430\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043a\u043d\u043e \u0447\u0435\u0440\u0435\u0437 \u043a\u043d\u043e\u043f\u043a\u0443 \u0432 \u0442\u0443\u043b\u0431\u0430\u0440\u0435.\"\"\"\n\n    self.click_toolbar_close_button()\n
    "},{"location":"components_derived/modal_add_AD_user/#components_derived.modal_add_AD_user.AddADUserModalWindow.new_user","title":"new_user(user_data)","text":"

    \u0417\u0430\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u0444\u043e\u0440\u043c\u0443 \u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u043d\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.

    Parameters:

    Name Type Description Default user_data dict

    \u0414\u0430\u043d\u043d\u044b\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f (\u0438\u043c\u044f, \u0440\u043e\u043b\u044c, \u043f\u0430\u0440\u043e\u043b\u044c \u0438 \u0434\u0440.)

    required Source code in components_derived\\modal_add_AD_user.py
    def new_user(self, user_data):\n    \"\"\"\u0417\u0430\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u0444\u043e\u0440\u043c\u0443 \u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u043d\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\n\n    Args:\n        user_data (dict): \u0414\u0430\u043d\u043d\u044b\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f (\u0438\u043c\u044f, \u0440\u043e\u043b\u044c, \u043f\u0430\u0440\u043e\u043b\u044c \u0438 \u0434\u0440.)\n    \"\"\"\n\n    menu_locator = self.page.locator(ModalWindowLocators.MENU_INPUT_FORM_USER_DATA)\n    input_form_locator = self.page.locator(ModalWindowLocators.INPUT_FORM_USER_DATA)\n\n    group_name = user_data.get(\"group\")\n    if group_name is None:\n        assert False, \"Value of 'group' is missing\"\n\n    name = user_data.get(\"name\")\n    if name is None:\n        assert False, \"Value of 'name' is missing\"\n\n    role = user_data.get(\"role\")\n    if role is None:\n        assert False, \"Value of 'role' is missing\"\n\n    group_field = self.get_content_item(\"group_input\")\n    group_field.click()\n\n    group_list = self.get_content_item(\"group_list\")\n    group_list.scroll_until_end(menu_locator)\n    group_names = group_list.get_item_names(menu_locator)\n    if group_name not in group_names:\n        assert False, f\"Required group name {group_name} is missing\"\n\n    group_list.check_item_with_text(group_name)\n    group_list.click_item_with_text(group_name)\n\n    search_button = self.get_button_by_name(\"search\")\n    search_button.click()\n\n    count = input_form_locator.get_by_role(\"combobox\").count()\n    if count == 2:\n        assert False, f\"Selected group {group_name} is empty. Use another group.\"\n\n    user_AD_loc = input_form_locator.get_by_role(\"combobox\").nth(1)\n    user_AD_input = TextInput(self.page, user_AD_loc, \"user_AD_input\")\n    self.add_content_item(\"user_AD_input\", user_AD_input)\n    self.add_content_item(\n        \"user_AD_list\",\n        DropdownList(self.page)\n    )\n\n    user_AD_input.click()\n    user_AD_list = self.get_content_item(\"user_AD_list\")\n    user_AD_list.scroll_until_end(menu_locator)\n    user_AD_names = group_list.get_item_names(menu_locator)\n    if name not in user_AD_names:\n        assert False, f\"Required user name {name} is missing\"\n\n    user_AD_list.check_item_with_text(name)\n    user_AD_list.click_item_with_text(name)\n\n    role_field = self.get_content_item(\"role_input\")\n    role_field.click()\n\n    roles_list = self.get_content_item(\"roles_list\")\n    roles_list.check_item_with_text(user_data[\"role\"])\n    roles_list.click_item_with_text(user_data[\"role\"])\n\n    # \u041e\u0442\u043f\u0440\u0430\u0432\u043a\u0430 \u0444\u043e\u0440\u043c\u044b\n    add_button = self.get_button_by_name(\"add\")\n    add_button.click()\n\n    # \u041f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f\n    title = \"\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043d\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\"\n    self.new_user_confirm.check_title(\n        title,\n        f\"Confirmation dialog window with title '{title}' is missing\"\n    )\n\n    # \u041d\u0430 \u043f\u0435\u0440\u0432\u043e\u043c \u044d\u0442\u0430\u043f\u0435 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u043d\u0435 \u0441\u043e\u0437\u0434\u0430\u0435\u043c\n    self.new_user_confirm.click_cancel_button()\n    self.close_window()\n
    "},{"location":"components_derived/modal_add_AD_user/#components_derived.modal_add_AD_user.AddADUserModalWindow.uncheck_active_directory_checkbox","title":"uncheck_active_directory_checkbox()","text":"

    \u0412\u044b\u043a\u043b\u044e\u0447\u0430\u0435\u0442 \u0447\u0435\u043a-\u0431\u043e\u043a\u0441 Active Directory.

    Source code in components_derived\\modal_add_AD_user.py
    def uncheck_active_directory_checkbox(self):\n    \"\"\"\u0412\u044b\u043a\u043b\u044e\u0447\u0430\u0435\u0442 \u0447\u0435\u043a-\u0431\u043e\u043a\u0441 Active Directory. \"\"\"\n\n    self.get_content_item(\"active_directory_checkbox\").uncheck(force=True)\n
    "},{"location":"components_derived/modal_add_AD_user/#components_derived.modal_add_AD_user.AddADUserModalWindow.update_input_form_fields","title":"update_input_form_fields(expand)","text":"

    \u041f\u0435\u0440\u0441\u0447\u0438\u0442\u044b\u0432\u0430\u0435\u0442 \u043b\u043e\u043a\u0430\u0442\u043e\u0440\u044b \u043f\u043e\u043b\u0435\u0439 \u0444\u043e\u0440\u043c\u044b \u0432\u0432\u043e\u0434\u0430 \u043f\u0440\u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0438/\u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0438 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u043f\u043e\u043b\u044f.

    Source code in components_derived\\modal_add_AD_user.py
    def update_input_form_fields(self, expand):\n    \"\"\"\u041f\u0435\u0440\u0441\u0447\u0438\u0442\u044b\u0432\u0430\u0435\u0442 \u043b\u043e\u043a\u0430\u0442\u043e\u0440\u044b \u043f\u043e\u043b\u0435\u0439 \u0444\u043e\u0440\u043c\u044b \u0432\u0432\u043e\u0434\u0430 \u043f\u0440\u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0438/\u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0438 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u043f\u043e\u043b\u044f. \"\"\"\n\n    input_form_locator = self.page.locator(ModalWindowLocators.INPUT_FORM_USER_DATA)\n    text_field_locator = ModalWindowLocators.TEXT_FIELD_INPUT_FORM_USER_DATA\n\n    if expand:\n        new_loc = input_form_locator.locator(\"xpath=div[4]\").locator(text_field_locator)\n        self.get_content_item(\"name_input\").update_locator(new_loc)\n\n        new_loc = input_form_locator.locator(\"xpath=div[7]\").locator(text_field_locator)\n        self.get_content_item(\"commentary_input\").update_locator(new_loc)\n\n        new_loc = input_form_locator.locator(\"xpath=div[8]\").locator(text_field_locator)\n        self.get_content_item(\"email_input\").update_locator(new_loc)\n\n        new_loc = input_form_locator.locator(\"xpath=div[9]\").locator(text_field_locator)\n        self.get_content_item(\"phone_input\").update_locator(new_loc)\n\n        role_loc = input_form_locator.get_by_role(\"combobox\").nth(2)\n        self.get_content_item(\"role_input\").update_locator(role_loc)\n    else:\n        new_loc = input_form_locator.locator(\"xpath=div[3]\").locator(text_field_locator)\n        self.get_content_item(\"name_input\").update_locator(new_loc)\n\n        new_loc = input_form_locator.locator(\"xpath=div[6]\").locator(text_field_locator)\n        self.get_content_item(\"commentary_input\").update_locator(new_loc)\n\n        new_loc = input_form_locator.locator(\"xpath=div[7]\").locator(text_field_locator)\n        self.get_content_item(\"email_input\").update_locator(new_loc)\n\n        new_loc = input_form_locator.locator(\"xpath=div[8]\").locator(text_field_locator)\n        self.get_content_item(\"phone_input\").update_locator(new_loc)\n\n        role_loc = input_form_locator.get_by_role(\"combobox\").nth(1)\n        self.get_content_item(\"role_input\").update_locator(role_loc)\n
    "},{"location":"components_derived/modal_add_local_user/","title":"AddLocalUserModalWindow","text":"

    \u041c\u043e\u0434\u0443\u043b\u044c modal_add_local_user \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043a\u043b\u0430\u0441\u0441 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u044b\u043c \u043e\u043a\u043d\u043e\u043c \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.

    \u041a\u043b\u0430\u0441\u0441 AddLocalUserModalWindow \u043d\u0430\u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u0431\u0430\u0437\u043e\u0432\u044b\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b ModalWindowComponent \u0438 \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u0442 \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u0447\u043d\u044b\u0435 \u043c\u0435\u0442\u043e\u0434\u044b \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0444\u043e\u0440\u043c\u0430\u043c\u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439.

    "},{"location":"components_derived/modal_add_local_user/#components_derived.modal_add_local_user.AddLocalUserModalWindow","title":"AddLocalUserModalWindow","text":"

    Bases: ModalWindowComponent

    \u041c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043a\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043d\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.

    \u041d\u0430\u0441\u043b\u0435\u0434\u0443\u0435\u0442 ModalWindowComponent \u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0444\u043e\u0440\u043c\u044b: - \u041f\u043e\u043b\u044f \u0432\u0432\u043e\u0434\u0430 (\u0438\u043c\u044f, \u043f\u0430\u0440\u043e\u043b\u044c, email \u0438 \u0434\u0440.) - \u0427\u0435\u043a\u0431\u043e\u043a\u0441\u044b (Active Directory, Push-\u0443\u0432\u0435\u0434\u043e\u043c\u043b\u0435\u043d\u0438\u044f) - \u0412\u044b\u043f\u0430\u0434\u0430\u044e\u0449\u0438\u0439 \u0441\u043f\u0438\u0441\u043e\u043a \u0440\u043e\u043b\u0435\u0439 - \u041a\u043d\u043e\u043f\u043a\u0438 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439

    Source code in components_derived\\modal_add_local_user.py
    class AddLocalUserModalWindow(ModalWindowComponent):\n    \"\"\"\u041c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043a\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043d\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\n\n    \u041d\u0430\u0441\u043b\u0435\u0434\u0443\u0435\u0442 ModalWindowComponent \u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0444\u043e\u0440\u043c\u044b:\n    - \u041f\u043e\u043b\u044f \u0432\u0432\u043e\u0434\u0430 (\u0438\u043c\u044f, \u043f\u0430\u0440\u043e\u043b\u044c, email \u0438 \u0434\u0440.)\n    - \u0427\u0435\u043a\u0431\u043e\u043a\u0441\u044b (Active Directory, Push-\u0443\u0432\u0435\u0434\u043e\u043c\u043b\u0435\u043d\u0438\u044f)\n    - \u0412\u044b\u043f\u0430\u0434\u0430\u044e\u0449\u0438\u0439 \u0441\u043f\u0438\u0441\u043e\u043a \u0440\u043e\u043b\u0435\u0439\n    - \u041a\u043d\u043e\u043f\u043a\u0438 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439\n    \"\"\"\n\n    def __init__(self, page: Page):\n        \"\"\"\u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0444\u043e\u0440\u043c\u044b \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\"\"\"\n\n        super().__init__(page)\n\n        # \u041b\u043e\u043a\u0430\u0442\u043e\u0440\u044b \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0444\u043e\u0440\u043c\u044b\n        text_field_locator = ModalWindowLocators.TEXT_FIELD_INPUT_FORM_USER_DATA\n        input_form_locator = ModalWindowLocators.INPUT_FORM_USER_DATA\n        label_locator = ModalWindowLocators.LABEL_INPUT_FORM_USER_DATA\n\n        # \u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430 \u0438 \u043a\u043d\u043e\u043f\u043a\u0438 \u0437\u0430\u043a\u0440\u044b\u0442\u0438\u044f \u0442\u0443\u043b\u0431\u0430\u0440\u0430\n        self.window_title = \"\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043d\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\"\n        locator_button_toolbar_close = self.page.get_by_role(\"navigation\").filter(\n            has_text=re.compile(self.window_title)\n        ).get_by_role(\"button\")\n\n        self.add_toolbar_title(self.window_title)\n        self.add_toolbar_button(locator_button_toolbar_close, \"close\")\n\n        # \u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0444\u043e\u0440\u043c\u044b\n        checkbox_1 = Checkbox(\n            page,\n            self.page.locator(input_form_locator).get_by_role(\"checkbox\").nth(0),\n            \"active_directory\"\n        )\n\n        self.add_content_item(\"active_directory_checkbox\", checkbox_1)\n\n        label_1 = Text(\n            page,\n            self.page.locator(label_locator).nth(0),\n            \"active_directory_checkbox_label\"\n        )\n        self.add_content_item(\"active_directory_checkbox_label\", label_1)\n\n        loc = self.page.locator(input_form_locator).locator(\"xpath=div[2]\").locator(text_field_locator)\n        name_input = TextInput(page, loc, \"name_input\")\n        self.add_content_item(\"name_input\", name_input)\n\n        role_loc = self.page.locator(input_form_locator).get_by_role(\"combobox\").nth(0)\n        role_input = TextInput(page, role_loc, \"role_input\")\n        self.add_content_item(\"role_input\", role_input)\n        self.add_content_item(\n            \"roles_list\",\n            DropdownList(page)\n        )\n\n        loc = self.page.locator(input_form_locator).locator(\"xpath=div[4]\").locator(text_field_locator)\n        password_input = TextInput(page, loc, \"password_input\")\n        self.add_content_item(\"password_input\", password_input)\n\n        loc = self.page.locator(input_form_locator).locator(\"xpath=div[5]\").locator(text_field_locator)\n        commentary_input = TextInput(page, loc, \"commentary_input\")\n        self.add_content_item(\"commentary_input\", commentary_input)\n\n        loc = self.page.locator(input_form_locator).locator(\"xpath=div[6]\").locator(text_field_locator)\n        email_input = TextInput(page, loc, \"email_input\")\n        self.add_content_item(\"email_input\", email_input)\n\n        loc = self.page.locator(input_form_locator).locator(\"xpath=div[7]\").locator(text_field_locator)\n        phone_input = TextInput(page, loc, \"phone_input\")\n        self.add_content_item(\"phone_input\", phone_input)\n\n        checkbox_2 = Checkbox(\n            page,\n            self.page.locator(input_form_locator).get_by_role(\"checkbox\").nth(1),\n            \"push_notification\"\n        )\n        self.add_content_item(\"push_notification_checkbox\", checkbox_2)\n\n        label_2 = Text(\n            page,\n            self.page.locator(label_locator).nth(1),\n            \"push_notification_checkbox_label\"\n        )\n        self.add_content_item(\"push_notification_checkbox_label\", label_2)\n\n        # \u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043a\u043d\u043e\u043f\u043e\u043a \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439\n        locator_button_add = self.page.get_by_role(\"button\", name=\"\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c\")\n        self.add_button(locator_button_add, \"add\")\n\n        locator_button_close = self.page.get_by_role(\"button\", name=\"\u0417\u0430\u043a\u0440\u044b\u0442\u044c\")\n        self.add_button(locator_button_close, \"close\")\n\n        self.new_user_confirm = ConfirmComponent(page, \" \u041e\u0442\u043c\u0435\u043d\u0430 \", \" \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \")\n\n     # \u0414\u0435\u0439\u0441\u0442\u0432\u0438\u044f:\n    def check_active_directory_checkbox(self):\n        \"\"\"\u0412\u043a\u043b\u044e\u0447\u0430\u0435\u0442 \u0447\u0435\u043a-\u0431\u043e\u043a\u0441 Active Directory. \"\"\"\n\n        self.get_content_item(\"active_directory_checkbox\").check(force=True)\n\n    def uncheck_active_directory_checkbox(self):\n        \"\"\"\u0412\u044b\u043a\u043b\u044e\u0447\u0430\u0435\u0442 \u0447\u0435\u043a-\u0431\u043e\u043a\u0441 Active Directory. \"\"\"\n\n        self.get_content_item(\"active_directory_checkbox\").uncheck(force=True)\n\n    def new_user(self, user_data):\n        \"\"\"\u0417\u0430\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u0444\u043e\u0440\u043c\u0443 \u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u043d\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\n\n        Args:\n            user_data (dict): \u0414\u0430\u043d\u043d\u044b\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f (\u0438\u043c\u044f, \u0440\u043e\u043b\u044c, \u043f\u0430\u0440\u043e\u043b\u044c \u0438 \u0434\u0440.)\n        \"\"\"\n\n        fields = user_data.keys()\n\n        if \"name\" in fields:\n            input_field = self.get_content_item(\"name_input\")\n            input_field.input_value(user_data[\"name\"])\n\n        if \"role\" in fields:\n            role_field = self.get_content_item(\"role_input\")\n            role_field.click()\n\n            roles_list = self.get_content_item(\"roles_list\")\n            roles_list.check_item_with_text(user_data[\"role\"])\n            roles_list.click_item_with_text(user_data[\"role\"])\n\n        if \"password\" in fields:\n            input_field = self.get_content_item(\"password_input\")\n            input_field.input_value(user_data[\"password\"])\n\n        if \"commentary\" in fields:\n            input_field = self.get_content_item(\"commentary_input\")\n            input_field.input_value(user_data[\"commentary\"])\n\n        if \"email\" in fields:\n            input_field = self.get_content_item(\"email_input\")\n            input_field.input_value(user_data[\"email\"])\n\n        if \"phone_number\" in fields:\n            input_field = self.get_content_item(\"phone_input\")\n            input_field.input_value(user_data[\"phone_number\"])\n\n        if \"push_notification_checked\" in fields:\n            checkbox = self.get_content_item(\"push_notification_checkbox\")\n            if user_data[\"push_notification_checked\"]:\n                checkbox.check()\n            else:\n                checkbox.uncheck()\n\n        # \u041e\u0442\u043f\u0440\u0430\u0432\u043a\u0430 \u0444\u043e\u0440\u043c\u044b\n        add_button = self.get_button_by_name(\"add\")\n        add_button.click()\n\n        # \u041f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f\n        title = \"\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043d\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\"\n        self.new_user_confirm.check_title(\n            title,\n            f\"Confirmation dialog window with title '{title}' is missing\"\n        )\n        self.new_user_confirm.click_allow_button()\n\n    def close_window(self):\n        \"\"\"\u0417\u0430\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043a\u043d\u043e \u0447\u0435\u0440\u0435\u0437 \u043a\u043d\u043e\u043f\u043a\u0443 '\u0417\u0430\u043a\u0440\u044b\u0442\u044c'.\"\"\"\n\n        close_button = self.get_button_by_name(\"close\")\n        close_button.click()\n\n    def close_window_by_toolbar_button(self):\n        \"\"\"\u0417\u0430\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043a\u043d\u043e \u0447\u0435\u0440\u0435\u0437 \u043a\u043d\u043e\u043f\u043a\u0443 \u0432 \u0442\u0443\u043b\u0431\u0430\u0440\u0435.\"\"\"\n\n        self.click_toolbar_close_button()\n\n    # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0438:\n    def check_content(self):\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0438 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0441\u0442\u044c \u0432\u0441\u0435\u0445 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0444\u043e\u0440\u043c\u044b.\"\"\"\n\n        menu_locator = self.page.locator(ModalWindowLocators.MENU_INPUT_FORM_USER_DATA)\n\n        self.check_by_window_title()\n\n        is_checked = self.get_content_item(\"active_directory_checkbox\").is_checked()\n        if is_checked:\n            assert False, \\\n                \"The checkbox 'Active Directory'should not be checked for the add local user window\"\n\n        self.check_toolbar_button_visibility(\"close\")\n        self.check_toolbar_button_tooltip(\"close\", \"\u0417\u0430\u043a\u0440\u044b\u0442\u044c\")\n\n        for name in self.content_items.keys():\n            item = self.get_content_item(name)\n\n            if name == \"active_directory_checkbox_label\":\n                item.check_have_text(\n                    \"Active Directory\",\n                    \"Label 'Active Directory' is missing\"\n                )\n            elif name == \"push_notification_checkbox_label\":\n                item.check_have_text(\n                    \"\u041f\u043e\u0434\u043f\u0438\u0441\u043a\u0430 \u043d\u0430 Push-\u0443\u0432\u0435\u0434\u043e\u043c\u043b\u0435\u043d\u0438\u044f\",\n                    \"Label '\u041f\u043e\u0434\u043f\u0438\u0441\u043a\u0430 \u043d\u0430 Push-\u0443\u0432\u0435\u0434\u043e\u043c\u043b\u0435\u043d\u0438\u044f' is missing\"\n                )\n            elif name == \"role_input\":\n                item.click()\n                roles_list = self.get_content_item(\"roles_list\")\n                roles_list.check_visibility(menu_locator,\n                                          \"Roles list is missing\")\n\n                is_scrollable_vertically = roles_list.check_vertical_scrolling(menu_locator)\n                assert not is_scrollable_vertically, \\\n                    \"Roles list should not be scrollable_vertically\"\n\n                for role in roles_dict.values():\n                    # \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e, \u043f\u043e\u043a\u0430 \u0435\u0441\u0442\u044c \u043d\u0435\u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0435 \u0441\u043e \u0441\u043f\u0438\u0441\u043a\u043e\u043c \u0440\u043e\u043b\u0435\u0439 \u0432 \u0432\u043a\u043b\u0430\u0434\u043a\u0435 \u0421\u0435\u0441\u0441\u0438\u0438\n                    if role == \"\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\":\n                        continue\n                    roles_list.check_item_with_text(role)\n            elif name == \"roles_list\":\n                continue\n            else:\n                item.check_visibility(\n                    f\"Modal window content item with name '{name}' is missing\"\n                )\n\n        self.check_button_visibility(\"add\")\n        self.check_button_visibility(\"close\")\n
    "},{"location":"components_derived/modal_add_local_user/#components_derived.modal_add_local_user.AddLocalUserModalWindow.__init__","title":"__init__(page)","text":"

    \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0444\u043e\u0440\u043c\u044b \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.

    Source code in components_derived\\modal_add_local_user.py
    def __init__(self, page: Page):\n    \"\"\"\u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0444\u043e\u0440\u043c\u044b \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\"\"\"\n\n    super().__init__(page)\n\n    # \u041b\u043e\u043a\u0430\u0442\u043e\u0440\u044b \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0444\u043e\u0440\u043c\u044b\n    text_field_locator = ModalWindowLocators.TEXT_FIELD_INPUT_FORM_USER_DATA\n    input_form_locator = ModalWindowLocators.INPUT_FORM_USER_DATA\n    label_locator = ModalWindowLocators.LABEL_INPUT_FORM_USER_DATA\n\n    # \u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430 \u0438 \u043a\u043d\u043e\u043f\u043a\u0438 \u0437\u0430\u043a\u0440\u044b\u0442\u0438\u044f \u0442\u0443\u043b\u0431\u0430\u0440\u0430\n    self.window_title = \"\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043d\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\"\n    locator_button_toolbar_close = self.page.get_by_role(\"navigation\").filter(\n        has_text=re.compile(self.window_title)\n    ).get_by_role(\"button\")\n\n    self.add_toolbar_title(self.window_title)\n    self.add_toolbar_button(locator_button_toolbar_close, \"close\")\n\n    # \u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0444\u043e\u0440\u043c\u044b\n    checkbox_1 = Checkbox(\n        page,\n        self.page.locator(input_form_locator).get_by_role(\"checkbox\").nth(0),\n        \"active_directory\"\n    )\n\n    self.add_content_item(\"active_directory_checkbox\", checkbox_1)\n\n    label_1 = Text(\n        page,\n        self.page.locator(label_locator).nth(0),\n        \"active_directory_checkbox_label\"\n    )\n    self.add_content_item(\"active_directory_checkbox_label\", label_1)\n\n    loc = self.page.locator(input_form_locator).locator(\"xpath=div[2]\").locator(text_field_locator)\n    name_input = TextInput(page, loc, \"name_input\")\n    self.add_content_item(\"name_input\", name_input)\n\n    role_loc = self.page.locator(input_form_locator).get_by_role(\"combobox\").nth(0)\n    role_input = TextInput(page, role_loc, \"role_input\")\n    self.add_content_item(\"role_input\", role_input)\n    self.add_content_item(\n        \"roles_list\",\n        DropdownList(page)\n    )\n\n    loc = self.page.locator(input_form_locator).locator(\"xpath=div[4]\").locator(text_field_locator)\n    password_input = TextInput(page, loc, \"password_input\")\n    self.add_content_item(\"password_input\", password_input)\n\n    loc = self.page.locator(input_form_locator).locator(\"xpath=div[5]\").locator(text_field_locator)\n    commentary_input = TextInput(page, loc, \"commentary_input\")\n    self.add_content_item(\"commentary_input\", commentary_input)\n\n    loc = self.page.locator(input_form_locator).locator(\"xpath=div[6]\").locator(text_field_locator)\n    email_input = TextInput(page, loc, \"email_input\")\n    self.add_content_item(\"email_input\", email_input)\n\n    loc = self.page.locator(input_form_locator).locator(\"xpath=div[7]\").locator(text_field_locator)\n    phone_input = TextInput(page, loc, \"phone_input\")\n    self.add_content_item(\"phone_input\", phone_input)\n\n    checkbox_2 = Checkbox(\n        page,\n        self.page.locator(input_form_locator).get_by_role(\"checkbox\").nth(1),\n        \"push_notification\"\n    )\n    self.add_content_item(\"push_notification_checkbox\", checkbox_2)\n\n    label_2 = Text(\n        page,\n        self.page.locator(label_locator).nth(1),\n        \"push_notification_checkbox_label\"\n    )\n    self.add_content_item(\"push_notification_checkbox_label\", label_2)\n\n    # \u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043a\u043d\u043e\u043f\u043e\u043a \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439\n    locator_button_add = self.page.get_by_role(\"button\", name=\"\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c\")\n    self.add_button(locator_button_add, \"add\")\n\n    locator_button_close = self.page.get_by_role(\"button\", name=\"\u0417\u0430\u043a\u0440\u044b\u0442\u044c\")\n    self.add_button(locator_button_close, \"close\")\n\n    self.new_user_confirm = ConfirmComponent(page, \" \u041e\u0442\u043c\u0435\u043d\u0430 \", \" \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \")\n
    "},{"location":"components_derived/modal_add_local_user/#components_derived.modal_add_local_user.AddLocalUserModalWindow.check_active_directory_checkbox","title":"check_active_directory_checkbox()","text":"

    \u0412\u043a\u043b\u044e\u0447\u0430\u0435\u0442 \u0447\u0435\u043a-\u0431\u043e\u043a\u0441 Active Directory.

    Source code in components_derived\\modal_add_local_user.py
    def check_active_directory_checkbox(self):\n    \"\"\"\u0412\u043a\u043b\u044e\u0447\u0430\u0435\u0442 \u0447\u0435\u043a-\u0431\u043e\u043a\u0441 Active Directory. \"\"\"\n\n    self.get_content_item(\"active_directory_checkbox\").check(force=True)\n
    "},{"location":"components_derived/modal_add_local_user/#components_derived.modal_add_local_user.AddLocalUserModalWindow.check_content","title":"check_content()","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0438 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0441\u0442\u044c \u0432\u0441\u0435\u0445 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0444\u043e\u0440\u043c\u044b.

    Source code in components_derived\\modal_add_local_user.py
    def check_content(self):\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0438 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0441\u0442\u044c \u0432\u0441\u0435\u0445 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0444\u043e\u0440\u043c\u044b.\"\"\"\n\n    menu_locator = self.page.locator(ModalWindowLocators.MENU_INPUT_FORM_USER_DATA)\n\n    self.check_by_window_title()\n\n    is_checked = self.get_content_item(\"active_directory_checkbox\").is_checked()\n    if is_checked:\n        assert False, \\\n            \"The checkbox 'Active Directory'should not be checked for the add local user window\"\n\n    self.check_toolbar_button_visibility(\"close\")\n    self.check_toolbar_button_tooltip(\"close\", \"\u0417\u0430\u043a\u0440\u044b\u0442\u044c\")\n\n    for name in self.content_items.keys():\n        item = self.get_content_item(name)\n\n        if name == \"active_directory_checkbox_label\":\n            item.check_have_text(\n                \"Active Directory\",\n                \"Label 'Active Directory' is missing\"\n            )\n        elif name == \"push_notification_checkbox_label\":\n            item.check_have_text(\n                \"\u041f\u043e\u0434\u043f\u0438\u0441\u043a\u0430 \u043d\u0430 Push-\u0443\u0432\u0435\u0434\u043e\u043c\u043b\u0435\u043d\u0438\u044f\",\n                \"Label '\u041f\u043e\u0434\u043f\u0438\u0441\u043a\u0430 \u043d\u0430 Push-\u0443\u0432\u0435\u0434\u043e\u043c\u043b\u0435\u043d\u0438\u044f' is missing\"\n            )\n        elif name == \"role_input\":\n            item.click()\n            roles_list = self.get_content_item(\"roles_list\")\n            roles_list.check_visibility(menu_locator,\n                                      \"Roles list is missing\")\n\n            is_scrollable_vertically = roles_list.check_vertical_scrolling(menu_locator)\n            assert not is_scrollable_vertically, \\\n                \"Roles list should not be scrollable_vertically\"\n\n            for role in roles_dict.values():\n                # \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e, \u043f\u043e\u043a\u0430 \u0435\u0441\u0442\u044c \u043d\u0435\u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0435 \u0441\u043e \u0441\u043f\u0438\u0441\u043a\u043e\u043c \u0440\u043e\u043b\u0435\u0439 \u0432 \u0432\u043a\u043b\u0430\u0434\u043a\u0435 \u0421\u0435\u0441\u0441\u0438\u0438\n                if role == \"\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\":\n                    continue\n                roles_list.check_item_with_text(role)\n        elif name == \"roles_list\":\n            continue\n        else:\n            item.check_visibility(\n                f\"Modal window content item with name '{name}' is missing\"\n            )\n\n    self.check_button_visibility(\"add\")\n    self.check_button_visibility(\"close\")\n
    "},{"location":"components_derived/modal_add_local_user/#components_derived.modal_add_local_user.AddLocalUserModalWindow.close_window","title":"close_window()","text":"

    \u0417\u0430\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043a\u043d\u043e \u0447\u0435\u0440\u0435\u0437 \u043a\u043d\u043e\u043f\u043a\u0443 '\u0417\u0430\u043a\u0440\u044b\u0442\u044c'.

    Source code in components_derived\\modal_add_local_user.py
    def close_window(self):\n    \"\"\"\u0417\u0430\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043a\u043d\u043e \u0447\u0435\u0440\u0435\u0437 \u043a\u043d\u043e\u043f\u043a\u0443 '\u0417\u0430\u043a\u0440\u044b\u0442\u044c'.\"\"\"\n\n    close_button = self.get_button_by_name(\"close\")\n    close_button.click()\n
    "},{"location":"components_derived/modal_add_local_user/#components_derived.modal_add_local_user.AddLocalUserModalWindow.close_window_by_toolbar_button","title":"close_window_by_toolbar_button()","text":"

    \u0417\u0430\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043a\u043d\u043e \u0447\u0435\u0440\u0435\u0437 \u043a\u043d\u043e\u043f\u043a\u0443 \u0432 \u0442\u0443\u043b\u0431\u0430\u0440\u0435.

    Source code in components_derived\\modal_add_local_user.py
    def close_window_by_toolbar_button(self):\n    \"\"\"\u0417\u0430\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043a\u043d\u043e \u0447\u0435\u0440\u0435\u0437 \u043a\u043d\u043e\u043f\u043a\u0443 \u0432 \u0442\u0443\u043b\u0431\u0430\u0440\u0435.\"\"\"\n\n    self.click_toolbar_close_button()\n
    "},{"location":"components_derived/modal_add_local_user/#components_derived.modal_add_local_user.AddLocalUserModalWindow.new_user","title":"new_user(user_data)","text":"

    \u0417\u0430\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u0444\u043e\u0440\u043c\u0443 \u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u043d\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.

    Parameters:

    Name Type Description Default user_data dict

    \u0414\u0430\u043d\u043d\u044b\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f (\u0438\u043c\u044f, \u0440\u043e\u043b\u044c, \u043f\u0430\u0440\u043e\u043b\u044c \u0438 \u0434\u0440.)

    required Source code in components_derived\\modal_add_local_user.py
    def new_user(self, user_data):\n    \"\"\"\u0417\u0430\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u0444\u043e\u0440\u043c\u0443 \u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u043d\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\n\n    Args:\n        user_data (dict): \u0414\u0430\u043d\u043d\u044b\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f (\u0438\u043c\u044f, \u0440\u043e\u043b\u044c, \u043f\u0430\u0440\u043e\u043b\u044c \u0438 \u0434\u0440.)\n    \"\"\"\n\n    fields = user_data.keys()\n\n    if \"name\" in fields:\n        input_field = self.get_content_item(\"name_input\")\n        input_field.input_value(user_data[\"name\"])\n\n    if \"role\" in fields:\n        role_field = self.get_content_item(\"role_input\")\n        role_field.click()\n\n        roles_list = self.get_content_item(\"roles_list\")\n        roles_list.check_item_with_text(user_data[\"role\"])\n        roles_list.click_item_with_text(user_data[\"role\"])\n\n    if \"password\" in fields:\n        input_field = self.get_content_item(\"password_input\")\n        input_field.input_value(user_data[\"password\"])\n\n    if \"commentary\" in fields:\n        input_field = self.get_content_item(\"commentary_input\")\n        input_field.input_value(user_data[\"commentary\"])\n\n    if \"email\" in fields:\n        input_field = self.get_content_item(\"email_input\")\n        input_field.input_value(user_data[\"email\"])\n\n    if \"phone_number\" in fields:\n        input_field = self.get_content_item(\"phone_input\")\n        input_field.input_value(user_data[\"phone_number\"])\n\n    if \"push_notification_checked\" in fields:\n        checkbox = self.get_content_item(\"push_notification_checkbox\")\n        if user_data[\"push_notification_checked\"]:\n            checkbox.check()\n        else:\n            checkbox.uncheck()\n\n    # \u041e\u0442\u043f\u0440\u0430\u0432\u043a\u0430 \u0444\u043e\u0440\u043c\u044b\n    add_button = self.get_button_by_name(\"add\")\n    add_button.click()\n\n    # \u041f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f\n    title = \"\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043d\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\"\n    self.new_user_confirm.check_title(\n        title,\n        f\"Confirmation dialog window with title '{title}' is missing\"\n    )\n    self.new_user_confirm.click_allow_button()\n
    "},{"location":"components_derived/modal_add_local_user/#components_derived.modal_add_local_user.AddLocalUserModalWindow.uncheck_active_directory_checkbox","title":"uncheck_active_directory_checkbox()","text":"

    \u0412\u044b\u043a\u043b\u044e\u0447\u0430\u0435\u0442 \u0447\u0435\u043a-\u0431\u043e\u043a\u0441 Active Directory.

    Source code in components_derived\\modal_add_local_user.py
    def uncheck_active_directory_checkbox(self):\n    \"\"\"\u0412\u044b\u043a\u043b\u044e\u0447\u0430\u0435\u0442 \u0447\u0435\u043a-\u0431\u043e\u043a\u0441 Active Directory. \"\"\"\n\n    self.get_content_item(\"active_directory_checkbox\").uncheck(force=True)\n
    "},{"location":"components_derived/modal_change_password/","title":"ChangePasswordModalWindow","text":"

    \u041c\u043e\u0434\u0443\u043b\u044c modal_change_password \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043a\u043b\u0430\u0441\u0441 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u043e\u043a\u043d\u043e\u043c \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u043f\u0430\u0440\u043e\u043b\u044f \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.

    \u041a\u043b\u0430\u0441\u0441 ChangePasswordModalWindow \u043d\u0430\u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u0431\u0430\u0437\u043e\u0432\u044b\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b ModalWindowComponent \u0438 \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u0442 \u043c\u0435\u0442\u043e\u0434\u044b \u0434\u043b\u044f \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u043f\u0430\u0440\u043e\u043b\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.

    "},{"location":"components_derived/modal_change_password/#components_derived.modal_change_password.ChangePasswordModalWindow","title":"ChangePasswordModalWindow","text":"

    Bases: ModalWindowComponent

    \u041c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043a\u043d\u043e \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u043f\u0430\u0440\u043e\u043b\u044f \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.

    \u041d\u0430\u0441\u043b\u0435\u0434\u0443\u0435\u0442 ModalWindowComponent \u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442: - \u041f\u043e\u043b\u044f \u0437\u0430\u0434\u0430\u043d\u0438\u044f \u043f\u0430\u0440\u043e\u043b\u044f - \u041a\u043d\u043e\u043f\u043a\u0438 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439 (\u0421\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c, \u041e\u0442\u043c\u0435\u043d\u0438\u0442\u044c)

    Source code in components_derived\\modal_change_password.py
    class ChangePasswordModalWindow(ModalWindowComponent):\n    \"\"\"\u041c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043a\u043d\u043e \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u043f\u0430\u0440\u043e\u043b\u044f \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\n\n    \u041d\u0430\u0441\u043b\u0435\u0434\u0443\u0435\u0442 ModalWindowComponent \u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442:\n    - \u041f\u043e\u043b\u044f \u0437\u0430\u0434\u0430\u043d\u0438\u044f \u043f\u0430\u0440\u043e\u043b\u044f\n    - \u041a\u043d\u043e\u043f\u043a\u0438 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439 (\u0421\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c, \u041e\u0442\u043c\u0435\u043d\u0438\u0442\u044c)\n    \"\"\"\n\n    def __init__(self, page: Page):\n        \"\"\"\u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0444\u043e\u0440\u043c\u044b \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\"\"\"\n\n        super().__init__(page)\n\n        modal_window_locator = page.locator(ModalWindowLocators.MODAL_WINDOW)\n\n        # \u0422\u0443\u043b\u0431\u0430\u0440 \u0441 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u043e\u043c\n        user_name = host.get_current_user_name()\n        self.add_toolbar_title(f\"\u0418\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u043f\u0430\u0440\u043e\u043b\u044c \u0434\u043b\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f {user_name}?\")\n\n        # \u041f\u043e\u043b\u044f \u0432\u0432\u043e\u0434\u0430 \u043f\u0430\u0440\u043e\u043b\u044f\n        loc = modal_window_locator.get_by_label(\"\u0412\u0432\u0435\u0434\u0438\u0442\u0435 \u0442\u0435\u043a\u0443\u0449\u0438\u0439 \u043f\u0430\u0440\u043e\u043b\u044c *\")\n        old_password_input = TextInput(page, loc, \"old_password_input\")\n        self.add_content_item(\"old_password_input\", old_password_input)\n\n        icon_locator = loc.locator(\"xpath=../..\").locator(TextInputLocators.ICON_PASSWORD_HIDING)\n        old_password_hidden_icon = Icon(page, icon_locator,\n                                         \"old password hidden icon\")\n        self.add_content_item(\"old_password_hidden_icon\", old_password_hidden_icon)\n\n        loc = modal_window_locator.get_by_label(\"\u0412\u0432\u0435\u0434\u0438\u0442\u0435 \u043d\u043e\u0432\u044b\u0439 \u043f\u0430\u0440\u043e\u043b\u044c *\")\n        new_password_input = TextInput(page, loc, \"new_password_input\")\n        self.add_content_item(\"new_password_input\", new_password_input)\n\n        icon_locator = loc.locator(\"xpath=../..\").locator(TextInputLocators.ICON_PASSWORD_HIDING)\n        new_password_hidden_icon = Icon(page, icon_locator,\n                                         \"new password hidden icon\")\n        self.add_content_item(\"new_password_hidden_icon\", new_password_hidden_icon)\n\n        loc = modal_window_locator.get_by_label(\"\u0412\u0432\u0435\u0434\u0438\u0442\u0435 \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u043e \u043d\u043e\u0432\u044b\u0439 \u043f\u0430\u0440\u043e\u043b\u044c *\")\n        confirm_password_input = TextInput(page, loc, \"confirm_password_input\")\n        self.add_content_item(\"confirm_password_input\", confirm_password_input)\n\n        icon_locator = loc.locator(\"xpath=../..\").locator(TextInputLocators.ICON_PASSWORD_HIDING)\n        confirm_password_hidden_icon = Icon(page, icon_locator,\n                                           \"confirm password hidden icon\")\n        self.add_content_item(\"confirm_password_hidden_icon\", confirm_password_hidden_icon)\n\n        input_form_error_message = Text(page,\n                                       modal_window_locator.locator(TextInputLocators.INPUT_FORM_MESSAGE),\n                                       \"input form error message\")\n        self.add_content_item(\"input_form_error_message\", input_form_error_message)\n\n        # \u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043a\u043d\u043e\u043f\u043e\u043a \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439\n        locator_button_save = self.page.get_by_role(\"button\", name=\"\u0421\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c\")\n        self.add_button(locator_button_save, \"save\")\n\n        locator_button_cancel = self.page.get_by_role(\"button\", name=\"\u041e\u0442\u043c\u0435\u043d\u0438\u0442\u044c\")\n        self.add_button(locator_button_cancel, \"cancel\")\n\n        # Alert \u043f\u0440\u0438 \u0443\u0441\u043f\u0435\u0448\u043d\u043e\u043c \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\n        self.alert = AlertComponent(page)\n\n    # \u0414\u0435\u0439\u0441\u0442\u0432\u0438\u044f:\n    def click_cancel_button(self) -> None:\n        \"\"\"\u041d\u0430\u0436\u0438\u043c\u0430\u0435\u0442 \u043a\u043d\u043e\u043f\u043a\u0443 '\u041e\u0442\u043c\u0435\u043d\u0438\u0442\u044c'\"\"\"\n\n        self.get_button_by_name(\"cancel\").click()\n\n    def click_old_password_hidden_icon(self) -> None:\n        \"\"\"\u041d\u0430\u0436\u0430\u0442\u0438\u0435 \u043d\u0430 \u0438\u043a\u043e\u043d\u043a\u0443 \u0441\u043a\u0440\u044b\u0442\u0438\u044f \u0441\u0442\u0430\u0440\u043e\u0433\u043e \u043f\u0430\u0440\u043e\u043b\u044f.\"\"\"\n\n        self.get_content_item(\"old_password_hidden_icon\").click()\n\n    def click_new_password_hidden_icon(self) -> None:\n        \"\"\"\u041d\u0430\u0436\u0430\u0442\u0438\u0435 \u043d\u0430 \u0438\u043a\u043e\u043d\u043a\u0443 \u0441\u043a\u0440\u044b\u0442\u0438\u044f \u043d\u043e\u0432\u043e\u0433\u043e \u043f\u0430\u0440\u043e\u043b\u044f.\"\"\"\n\n        self.get_content_item(\"new_password_hidden_icon\").click()\n\n    def click_confirm_password_hidden_icon(self) -> None:\n        \"\"\"\u041d\u0430\u0436\u0430\u0442\u0438\u0435 \u043d\u0430 \u0438\u043a\u043e\u043d\u043a\u0443 \u0441\u043a\u0440\u044b\u0442\u0438\u044f \u043f\u0430\u0440\u043e\u043b\u044f \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u044f.\"\"\"\n\n        self.get_content_item(\"confirm_password_hidden_icon\").click()\n\n    def change_password(self, old_password: str, new_password: str):\n        \"\"\"\u0417\u0430\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0444\u043e\u0440\u043c\u044b, \u043d\u0430\u0436\u0438\u043c\u0430\u0435\u0442 \u043a\u043d\u043e\u043f\u043a\u0443 '\u0421\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c'\"\"\"\n\n        error = \"\"\n\n        self.get_content_item(\"old_password_input\").input_value(old_password)\n        self.get_content_item(\"new_password_input\").input_value(new_password)\n        self.get_content_item(\"confirm_password_input\").input_value(new_password)\n\n        button_save = self.get_button_by_name(\"save\")\n\n        if button_save.is_disabled():\n            error_message = self.get_content_item(\"input_form_error_message\")\n            error = error_message.get_text(0)\n            return False, error\n\n        button_save.click()\n\n        is_changed = False\n\n        alert_type = self.alert.get_alert_type()\n        if alert_type == \"success\":\n            self.alert.check_alert_presence(' \u041f\u0430\u0440\u043e\u043b\u044c \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u0438\u0437\u043c\u0435\u043d\u0451\u043d ')\n            self.alert.check_alert_absence(' \u041f\u0430\u0440\u043e\u043b\u044c \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u0438\u0437\u043c\u0435\u043d\u0451\u043d ')\n            is_changed = True\n        elif alert_type == \"error\":\n            # to do: fix message after translation\n            self.alert.check_alert_presence(' Old password not equal ')\n            self.alert.check_alert_absence(' Old password not equal ')\n\n            error = \"Old password is not equal real password\"\n        else:\n            error = f\"Got unexpected alert type {alert_type}\"\n\n        return is_changed, error\n\n    def get_password_inputs(self) -> []:\n        \"\"\"\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0441\u043f\u0438\u0441\u043e\u043a \u043f\u043e\u043b\u0435\u0439 \u0432\u0432\u043e\u0434\u0430 \u043f\u0430\u0440\u043e\u043b\u044f (\u0434\u043b\u044f \u0442\u0435\u0441\u0442\u043e\u0432\u044b\u0445 \u0446\u0435\u043b\u0435\u0439).\"\"\"\n\n        text_inputs = []\n        text_inputs.append(self.get_content_item(\"old_password_input\"))\n        text_inputs.append(self.get_content_item(\"new_password_input\"))\n        text_inputs.append(self.get_content_item(\"confirm_password_input\"))\n        return text_inputs\n\n    # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0438:\n    def check_content(self):\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0438 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0441\u0442\u044c \u0432\u0441\u0435\u0445 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0444\u043e\u0440\u043c\u044b.\"\"\"\n\n        self.check_by_window_title()\n\n        self.get_content_item(\"old_password_input\").check_visibility(\n                                  \"Old password input form is missing\"\n                             )\n        old_password_hidden_icon = self.get_content_item(\"old_password_hidden_icon\") \n        old_password_hidden_icon.check_visibility(\n                                  \"Old password hidden icon is missing\"\n                             )\n        is_hidden_state = old_password_hidden_icon.is_password_hidden()\n        assert is_hidden_state, \"Old password hidden icon should be in hidden state\"\n\n        self.get_content_item(\"new_password_input\").check_visibility(\n                                  \"New password input form is missing\"\n                             )\n        new_password_hidden_icon = self.get_content_item(\"new_password_hidden_icon\") \n        new_password_hidden_icon.check_visibility(\n                                  \"New password hidden icon is missing\"\n                             )\n        is_hidden_state = new_password_hidden_icon.is_password_hidden()\n        assert is_hidden_state, \"New password hidden icon should be in hidden state\"\n\n        self.get_content_item(\"confirm_password_input\").check_visibility(\n                                  \"Confirm password input form is missing\"\n                             )\n        confirm_password_hidden_icon = self.get_content_item(\"confirm_password_hidden_icon\") \n        confirm_password_hidden_icon.check_visibility(\n                                  \"Confirm password hidden icon is missing\"\n                             )\n        is_hidden_state = confirm_password_hidden_icon.is_password_hidden()\n        assert is_hidden_state, \"Confirm password hidden icon should be in hidden state\"\n\n        self.check_button_visibility(\"cancel\")\n\n        button_save = self.get_button_by_name(\"save\")\n        is_disabled = button_save.is_disabled()\n        assert is_disabled, \"Button '\u0421\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c' should be hidden\"\n\n    def check_error_message(self, text: str) -> None:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u043e\u0431 \u043e\u0448\u0438\u0431\u043a\u0435, \u0432\u043e\u0437\u043d\u0438\u043a\u0448\u0435\u0435 \u043f\u0440\u0438 \u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0438 \u043f\u043e\u043b\u0435\u0439 \u0444\u043e\u0440\u043c\u044b.\"\"\"\n\n        error_message = self.get_content_item(\"input_form_error_message\")\n        error_message.check_have_text(text, \"Unexpected error message\")\n
    "},{"location":"components_derived/modal_change_password/#components_derived.modal_change_password.ChangePasswordModalWindow.__init__","title":"__init__(page)","text":"

    \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0444\u043e\u0440\u043c\u044b \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.

    Source code in components_derived\\modal_change_password.py
    def __init__(self, page: Page):\n    \"\"\"\u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0444\u043e\u0440\u043c\u044b \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\"\"\"\n\n    super().__init__(page)\n\n    modal_window_locator = page.locator(ModalWindowLocators.MODAL_WINDOW)\n\n    # \u0422\u0443\u043b\u0431\u0430\u0440 \u0441 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u043e\u043c\n    user_name = host.get_current_user_name()\n    self.add_toolbar_title(f\"\u0418\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u043f\u0430\u0440\u043e\u043b\u044c \u0434\u043b\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f {user_name}?\")\n\n    # \u041f\u043e\u043b\u044f \u0432\u0432\u043e\u0434\u0430 \u043f\u0430\u0440\u043e\u043b\u044f\n    loc = modal_window_locator.get_by_label(\"\u0412\u0432\u0435\u0434\u0438\u0442\u0435 \u0442\u0435\u043a\u0443\u0449\u0438\u0439 \u043f\u0430\u0440\u043e\u043b\u044c *\")\n    old_password_input = TextInput(page, loc, \"old_password_input\")\n    self.add_content_item(\"old_password_input\", old_password_input)\n\n    icon_locator = loc.locator(\"xpath=../..\").locator(TextInputLocators.ICON_PASSWORD_HIDING)\n    old_password_hidden_icon = Icon(page, icon_locator,\n                                     \"old password hidden icon\")\n    self.add_content_item(\"old_password_hidden_icon\", old_password_hidden_icon)\n\n    loc = modal_window_locator.get_by_label(\"\u0412\u0432\u0435\u0434\u0438\u0442\u0435 \u043d\u043e\u0432\u044b\u0439 \u043f\u0430\u0440\u043e\u043b\u044c *\")\n    new_password_input = TextInput(page, loc, \"new_password_input\")\n    self.add_content_item(\"new_password_input\", new_password_input)\n\n    icon_locator = loc.locator(\"xpath=../..\").locator(TextInputLocators.ICON_PASSWORD_HIDING)\n    new_password_hidden_icon = Icon(page, icon_locator,\n                                     \"new password hidden icon\")\n    self.add_content_item(\"new_password_hidden_icon\", new_password_hidden_icon)\n\n    loc = modal_window_locator.get_by_label(\"\u0412\u0432\u0435\u0434\u0438\u0442\u0435 \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u043e \u043d\u043e\u0432\u044b\u0439 \u043f\u0430\u0440\u043e\u043b\u044c *\")\n    confirm_password_input = TextInput(page, loc, \"confirm_password_input\")\n    self.add_content_item(\"confirm_password_input\", confirm_password_input)\n\n    icon_locator = loc.locator(\"xpath=../..\").locator(TextInputLocators.ICON_PASSWORD_HIDING)\n    confirm_password_hidden_icon = Icon(page, icon_locator,\n                                       \"confirm password hidden icon\")\n    self.add_content_item(\"confirm_password_hidden_icon\", confirm_password_hidden_icon)\n\n    input_form_error_message = Text(page,\n                                   modal_window_locator.locator(TextInputLocators.INPUT_FORM_MESSAGE),\n                                   \"input form error message\")\n    self.add_content_item(\"input_form_error_message\", input_form_error_message)\n\n    # \u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043a\u043d\u043e\u043f\u043e\u043a \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439\n    locator_button_save = self.page.get_by_role(\"button\", name=\"\u0421\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c\")\n    self.add_button(locator_button_save, \"save\")\n\n    locator_button_cancel = self.page.get_by_role(\"button\", name=\"\u041e\u0442\u043c\u0435\u043d\u0438\u0442\u044c\")\n    self.add_button(locator_button_cancel, \"cancel\")\n\n    # Alert \u043f\u0440\u0438 \u0443\u0441\u043f\u0435\u0448\u043d\u043e\u043c \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\n    self.alert = AlertComponent(page)\n
    "},{"location":"components_derived/modal_change_password/#components_derived.modal_change_password.ChangePasswordModalWindow.change_password","title":"change_password(old_password, new_password)","text":"

    \u0417\u0430\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0444\u043e\u0440\u043c\u044b, \u043d\u0430\u0436\u0438\u043c\u0430\u0435\u0442 \u043a\u043d\u043e\u043f\u043a\u0443 '\u0421\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c'

    Source code in components_derived\\modal_change_password.py
    def change_password(self, old_password: str, new_password: str):\n    \"\"\"\u0417\u0430\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0444\u043e\u0440\u043c\u044b, \u043d\u0430\u0436\u0438\u043c\u0430\u0435\u0442 \u043a\u043d\u043e\u043f\u043a\u0443 '\u0421\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c'\"\"\"\n\n    error = \"\"\n\n    self.get_content_item(\"old_password_input\").input_value(old_password)\n    self.get_content_item(\"new_password_input\").input_value(new_password)\n    self.get_content_item(\"confirm_password_input\").input_value(new_password)\n\n    button_save = self.get_button_by_name(\"save\")\n\n    if button_save.is_disabled():\n        error_message = self.get_content_item(\"input_form_error_message\")\n        error = error_message.get_text(0)\n        return False, error\n\n    button_save.click()\n\n    is_changed = False\n\n    alert_type = self.alert.get_alert_type()\n    if alert_type == \"success\":\n        self.alert.check_alert_presence(' \u041f\u0430\u0440\u043e\u043b\u044c \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u0438\u0437\u043c\u0435\u043d\u0451\u043d ')\n        self.alert.check_alert_absence(' \u041f\u0430\u0440\u043e\u043b\u044c \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u0438\u0437\u043c\u0435\u043d\u0451\u043d ')\n        is_changed = True\n    elif alert_type == \"error\":\n        # to do: fix message after translation\n        self.alert.check_alert_presence(' Old password not equal ')\n        self.alert.check_alert_absence(' Old password not equal ')\n\n        error = \"Old password is not equal real password\"\n    else:\n        error = f\"Got unexpected alert type {alert_type}\"\n\n    return is_changed, error\n
    "},{"location":"components_derived/modal_change_password/#components_derived.modal_change_password.ChangePasswordModalWindow.check_content","title":"check_content()","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0438 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0441\u0442\u044c \u0432\u0441\u0435\u0445 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0444\u043e\u0440\u043c\u044b.

    Source code in components_derived\\modal_change_password.py
    def check_content(self):\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0438 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0441\u0442\u044c \u0432\u0441\u0435\u0445 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0444\u043e\u0440\u043c\u044b.\"\"\"\n\n    self.check_by_window_title()\n\n    self.get_content_item(\"old_password_input\").check_visibility(\n                              \"Old password input form is missing\"\n                         )\n    old_password_hidden_icon = self.get_content_item(\"old_password_hidden_icon\") \n    old_password_hidden_icon.check_visibility(\n                              \"Old password hidden icon is missing\"\n                         )\n    is_hidden_state = old_password_hidden_icon.is_password_hidden()\n    assert is_hidden_state, \"Old password hidden icon should be in hidden state\"\n\n    self.get_content_item(\"new_password_input\").check_visibility(\n                              \"New password input form is missing\"\n                         )\n    new_password_hidden_icon = self.get_content_item(\"new_password_hidden_icon\") \n    new_password_hidden_icon.check_visibility(\n                              \"New password hidden icon is missing\"\n                         )\n    is_hidden_state = new_password_hidden_icon.is_password_hidden()\n    assert is_hidden_state, \"New password hidden icon should be in hidden state\"\n\n    self.get_content_item(\"confirm_password_input\").check_visibility(\n                              \"Confirm password input form is missing\"\n                         )\n    confirm_password_hidden_icon = self.get_content_item(\"confirm_password_hidden_icon\") \n    confirm_password_hidden_icon.check_visibility(\n                              \"Confirm password hidden icon is missing\"\n                         )\n    is_hidden_state = confirm_password_hidden_icon.is_password_hidden()\n    assert is_hidden_state, \"Confirm password hidden icon should be in hidden state\"\n\n    self.check_button_visibility(\"cancel\")\n\n    button_save = self.get_button_by_name(\"save\")\n    is_disabled = button_save.is_disabled()\n    assert is_disabled, \"Button '\u0421\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c' should be hidden\"\n
    "},{"location":"components_derived/modal_change_password/#components_derived.modal_change_password.ChangePasswordModalWindow.check_error_message","title":"check_error_message(text)","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u043e\u0431 \u043e\u0448\u0438\u0431\u043a\u0435, \u0432\u043e\u0437\u043d\u0438\u043a\u0448\u0435\u0435 \u043f\u0440\u0438 \u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0438 \u043f\u043e\u043b\u0435\u0439 \u0444\u043e\u0440\u043c\u044b.

    Source code in components_derived\\modal_change_password.py
    def check_error_message(self, text: str) -> None:\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u043e\u0431 \u043e\u0448\u0438\u0431\u043a\u0435, \u0432\u043e\u0437\u043d\u0438\u043a\u0448\u0435\u0435 \u043f\u0440\u0438 \u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0438 \u043f\u043e\u043b\u0435\u0439 \u0444\u043e\u0440\u043c\u044b.\"\"\"\n\n    error_message = self.get_content_item(\"input_form_error_message\")\n    error_message.check_have_text(text, \"Unexpected error message\")\n
    "},{"location":"components_derived/modal_change_password/#components_derived.modal_change_password.ChangePasswordModalWindow.click_cancel_button","title":"click_cancel_button()","text":"

    \u041d\u0430\u0436\u0438\u043c\u0430\u0435\u0442 \u043a\u043d\u043e\u043f\u043a\u0443 '\u041e\u0442\u043c\u0435\u043d\u0438\u0442\u044c'

    Source code in components_derived\\modal_change_password.py
    def click_cancel_button(self) -> None:\n    \"\"\"\u041d\u0430\u0436\u0438\u043c\u0430\u0435\u0442 \u043a\u043d\u043e\u043f\u043a\u0443 '\u041e\u0442\u043c\u0435\u043d\u0438\u0442\u044c'\"\"\"\n\n    self.get_button_by_name(\"cancel\").click()\n
    "},{"location":"components_derived/modal_change_password/#components_derived.modal_change_password.ChangePasswordModalWindow.click_confirm_password_hidden_icon","title":"click_confirm_password_hidden_icon()","text":"

    \u041d\u0430\u0436\u0430\u0442\u0438\u0435 \u043d\u0430 \u0438\u043a\u043e\u043d\u043a\u0443 \u0441\u043a\u0440\u044b\u0442\u0438\u044f \u043f\u0430\u0440\u043e\u043b\u044f \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u044f.

    Source code in components_derived\\modal_change_password.py
    def click_confirm_password_hidden_icon(self) -> None:\n    \"\"\"\u041d\u0430\u0436\u0430\u0442\u0438\u0435 \u043d\u0430 \u0438\u043a\u043e\u043d\u043a\u0443 \u0441\u043a\u0440\u044b\u0442\u0438\u044f \u043f\u0430\u0440\u043e\u043b\u044f \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u044f.\"\"\"\n\n    self.get_content_item(\"confirm_password_hidden_icon\").click()\n
    "},{"location":"components_derived/modal_change_password/#components_derived.modal_change_password.ChangePasswordModalWindow.click_new_password_hidden_icon","title":"click_new_password_hidden_icon()","text":"

    \u041d\u0430\u0436\u0430\u0442\u0438\u0435 \u043d\u0430 \u0438\u043a\u043e\u043d\u043a\u0443 \u0441\u043a\u0440\u044b\u0442\u0438\u044f \u043d\u043e\u0432\u043e\u0433\u043e \u043f\u0430\u0440\u043e\u043b\u044f.

    Source code in components_derived\\modal_change_password.py
    def click_new_password_hidden_icon(self) -> None:\n    \"\"\"\u041d\u0430\u0436\u0430\u0442\u0438\u0435 \u043d\u0430 \u0438\u043a\u043e\u043d\u043a\u0443 \u0441\u043a\u0440\u044b\u0442\u0438\u044f \u043d\u043e\u0432\u043e\u0433\u043e \u043f\u0430\u0440\u043e\u043b\u044f.\"\"\"\n\n    self.get_content_item(\"new_password_hidden_icon\").click()\n
    "},{"location":"components_derived/modal_change_password/#components_derived.modal_change_password.ChangePasswordModalWindow.click_old_password_hidden_icon","title":"click_old_password_hidden_icon()","text":"

    \u041d\u0430\u0436\u0430\u0442\u0438\u0435 \u043d\u0430 \u0438\u043a\u043e\u043d\u043a\u0443 \u0441\u043a\u0440\u044b\u0442\u0438\u044f \u0441\u0442\u0430\u0440\u043e\u0433\u043e \u043f\u0430\u0440\u043e\u043b\u044f.

    Source code in components_derived\\modal_change_password.py
    def click_old_password_hidden_icon(self) -> None:\n    \"\"\"\u041d\u0430\u0436\u0430\u0442\u0438\u0435 \u043d\u0430 \u0438\u043a\u043e\u043d\u043a\u0443 \u0441\u043a\u0440\u044b\u0442\u0438\u044f \u0441\u0442\u0430\u0440\u043e\u0433\u043e \u043f\u0430\u0440\u043e\u043b\u044f.\"\"\"\n\n    self.get_content_item(\"old_password_hidden_icon\").click()\n
    "},{"location":"components_derived/modal_change_password/#components_derived.modal_change_password.ChangePasswordModalWindow.get_password_inputs","title":"get_password_inputs()","text":"

    \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0441\u043f\u0438\u0441\u043e\u043a \u043f\u043e\u043b\u0435\u0439 \u0432\u0432\u043e\u0434\u0430 \u043f\u0430\u0440\u043e\u043b\u044f (\u0434\u043b\u044f \u0442\u0435\u0441\u0442\u043e\u0432\u044b\u0445 \u0446\u0435\u043b\u0435\u0439).

    Source code in components_derived\\modal_change_password.py
    def get_password_inputs(self) -> []:\n    \"\"\"\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0441\u043f\u0438\u0441\u043e\u043a \u043f\u043e\u043b\u0435\u0439 \u0432\u0432\u043e\u0434\u0430 \u043f\u0430\u0440\u043e\u043b\u044f (\u0434\u043b\u044f \u0442\u0435\u0441\u0442\u043e\u0432\u044b\u0445 \u0446\u0435\u043b\u0435\u0439).\"\"\"\n\n    text_inputs = []\n    text_inputs.append(self.get_content_item(\"old_password_input\"))\n    text_inputs.append(self.get_content_item(\"new_password_input\"))\n    text_inputs.append(self.get_content_item(\"confirm_password_input\"))\n    return text_inputs\n
    "},{"location":"components_derived/modal_edit_user/","title":"EditUserModalWindow","text":"

    \u041c\u043e\u0434\u0443\u043b\u044c modal_edit_user \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043a\u043b\u0430\u0441\u0441 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u043e\u043a\u043d\u043e\u043c \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.

    \u041a\u043b\u0430\u0441\u0441 EditUserModalWindow \u043d\u0430\u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u0431\u0430\u0437\u043e\u0432\u044b\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b ModalWindowComponent \u0438 \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u0442 \u043c\u0435\u0442\u043e\u0434\u044b \u0434\u043b\u044f \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.

    "},{"location":"components_derived/modal_edit_user/#components_derived.modal_edit_user.EditUserModalWindow","title":"EditUserModalWindow","text":"

    Bases: ModalWindowComponent

    \u041c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043a\u043d\u043e \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.

    \u041d\u0430\u0441\u043b\u0435\u0434\u0443\u0435\u0442 ModalWindowComponent \u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442: - \u041f\u043e\u043b\u044f \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445 - \u0427\u0435\u043a\u0431\u043e\u043a\u0441\u044b \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043a - \u0412\u044b\u043f\u0430\u0434\u0430\u044e\u0449\u0438\u0439 \u0441\u043f\u0438\u0441\u043e\u043a \u0440\u043e\u043b\u0435\u0439 - \u041a\u043d\u043e\u043f\u043a\u0438 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439 (\u0421\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c, \u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0438 \u0434\u0440.)

    Source code in components_derived\\modal_edit_user.py
    class EditUserModalWindow(ModalWindowComponent):\n    \"\"\"\u041c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043a\u043d\u043e \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\n\n    \u041d\u0430\u0441\u043b\u0435\u0434\u0443\u0435\u0442 ModalWindowComponent \u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442:\n    - \u041f\u043e\u043b\u044f \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445\n    - \u0427\u0435\u043a\u0431\u043e\u043a\u0441\u044b \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043a\n    - \u0412\u044b\u043f\u0430\u0434\u0430\u044e\u0449\u0438\u0439 \u0441\u043f\u0438\u0441\u043e\u043a \u0440\u043e\u043b\u0435\u0439\n    - \u041a\u043d\u043e\u043f\u043a\u0438 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439 (\u0421\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c, \u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0438 \u0434\u0440.)\n    \"\"\"\n\n    def __init__(self, page: Page, user_name: str):\n        \"\"\"\u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0444\u043e\u0440\u043c\u044b \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\"\"\"\n\n        super().__init__(page)\n\n        # \u041b\u043e\u043a\u0430\u0442\u043e\u0440\u044b \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0444\u043e\u0440\u043c\u044b\n        text_field_locator = ModalWindowLocators.TEXT_FIELD_INPUT_FORM_USER_DATA\n        input_form_locator = ModalWindowLocators.INPUT_FORM_USER_DATA\n        label_locator = ModalWindowLocators.LABEL_INPUT_FORM_USER_DATA\n\n        # \u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430 \u0438 \u043a\u043d\u043e\u043f\u043a\u0438 \u0437\u0430\u043a\u0440\u044b\u0442\u0438\u044f\n        self.window_title = user_name\n        locator_button_toolbar_close = self.page.get_by_role(\"navigation\").filter(\n            has_text=re.compile(self.window_title)\n        ).get_by_role(\"button\")\n\n        self.add_toolbar_title(self.window_title)\n        self.add_toolbar_button(locator_button_toolbar_close, \"close\")\n\n        # \u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043f\u043e\u043b\u0435\u0439 \u0444\u043e\u0440\u043c\u044b\n        loc = self.page.locator(input_form_locator).locator(\"xpath=div[1]\").locator(text_field_locator)\n        name_input = TextInput(page, loc, \"name_input\")\n        self.add_content_item(\"name_input\", name_input)\n\n        role_loc = self.page.locator(input_form_locator).get_by_role(\"combobox\").nth(0)\n        role_input = TextInput(page, role_loc, \"role_input\")\n        self.add_content_item(\"role_input\", role_input)\n        self.add_content_item(\n            \"roles_list\",\n            DropdownList(page)\n        )\n\n        loc = self.page.locator(input_form_locator).locator(\"xpath=div[3]\").locator(text_field_locator)\n        commentary_input = TextInput(page, loc, \"commentary_input\")\n        self.add_content_item(\"commentary_input\", commentary_input)\n\n        loc = self.page.locator(input_form_locator).locator(\"xpath=div[4]\").locator(text_field_locator)\n        email_input = TextInput(page, loc, \"email_input\")\n        self.add_content_item(\"email_input\", email_input)\n\n        loc = self.page.locator(input_form_locator).locator(\"xpath=div[5]\").locator(text_field_locator)\n        phone_input = TextInput(page, loc, \"phone_input\")\n        self.add_content_item(\"phone_input\", phone_input)\n\n        # \u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0447\u0435\u043a\u0431\u043e\u043a\u0441\u043e\u0432 \u0438 \u0438\u0445 \u043c\u0435\u0442\u043e\u043a\n        checkbox_2 = Checkbox(\n            page,\n            page.get_by_role(\"checkbox\").nth(0),\n            \"push_notification\"\n        )\n        self.add_content_item(\"push_notification_checkbox\", checkbox_2)\n\n        label_2 = Text(\n            page,\n            self.page.locator(label_locator).nth(0),\n            \"push_notification_checkbox_label\"\n        )\n        self.add_content_item(\"push_notification_checkbox_label\", label_2)\n\n        # \u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043a\u043d\u043e\u043f\u043e\u043a \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439\n        locator_button_save = self.page.get_by_role(\"button\", name=\"\u0421\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c\")\n        self.add_button(locator_button_save, \"save\")\n\n        locator_button_delete = self.page.get_by_role(\"button\", name=\"\u0423\u0434\u0430\u043b\u0438\u0442\u044c\")\n        self.add_button(locator_button_delete, \"delete\")\n\n        locator_button_reset = self.page.get_by_role(\"button\", name=\"\u0421\u0431\u0440\u043e\u0441\u0438\u0442\u044c \u043f\u0430\u0440\u043e\u043b\u044c\")\n        self.add_button(locator_button_reset, \"reset_password\")\n\n        locator_button_close = self.page.get_by_role(\"button\", name=\"\u0417\u0430\u043a\u0440\u044b\u0442\u044c\")\n        self.add_button(locator_button_close, \"close\")\n\n        # \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043e\u0432 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u044f\n        self.save_user_confirm = ConfirmComponent(page, \" \u041e\u0442\u043c\u0435\u043d\u0430 \", \" \u0421\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \")\n        self.delete_user_confirm = ConfirmComponent(page, \" \u041e\u0442\u043c\u0435\u043d\u0430 \", \" \u0423\u0434\u0430\u043b\u0438\u0442\u044c \")\n\n    def close_window(self):\n        \"\"\"\u0417\u0430\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u043e\u043a\u043d\u043e \u0447\u0435\u0440\u0435\u0437 \u043a\u043d\u043e\u043f\u043a\u0443 '\u0417\u0430\u043a\u0440\u044b\u0442\u044c'.\"\"\"\n\n        close_button = self.get_button_by_name(\"close\")\n        close_button.click()\n\n    def close_window_by_toolbar_button(self):\n        \"\"\"\u0417\u0430\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u043e\u043a\u043d\u043e \u0447\u0435\u0440\u0435\u0437 \u043a\u043d\u043e\u043f\u043a\u0443 \u0432 \u0442\u0443\u043b\u0431\u0430\u0440\u0435.\"\"\"\n\n        self.click_toolbar_close_button()\n\n    def delete_user(self):\n        \"\"\"\u0423\u0434\u0430\u043b\u044f\u0435\u0442 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0441 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u0435\u043c.\"\"\"\n\n        delete_button = self.get_button_by_name(\"delete\")\n        delete_button.click()\n\n        title = \"\u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435\"\n        self.delete_user_confirm.check_title(\n            title,\n            f\"Confirmation dialog window with title '{title}' is missing\"\n        )\n        self.delete_user_confirm.click_allow_button()\n\n    def edit_user(self, user_data):\n        \"\"\"\u0420\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u0443\u0435\u0442 \u0434\u0430\u043d\u043d\u044b\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\n\n        Args:\n            user_data (dict): \u0414\u0430\u043d\u043d\u044b\u0435 \u0434\u043b\u044f \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f (\u0438\u043c\u044f, \u0440\u043e\u043b\u044c \u0438 \u0434\u0440.)\n        \"\"\"\n\n        fields = user_data.keys()\n\n        if \"name\" in fields:\n            input_field = self.get_content_item(\"name_input\")\n            input_field.input_value(user_data[\"name\"])\n\n        if \"role\" in fields:\n            role_field = self.get_content_item(\"role_input\")\n            role_field.click()\n\n            roles_list = self.get_content_item(\"roles_list\")\n            roles_list.check_item_with_text(user_data[\"role\"])\n            roles_list.click_item_with_text(user_data[\"role\"])\n\n        if \"commentary\" in fields:\n            input_field = self.get_content_item(\"commentary_input\")\n            input_field.input_value(user_data[\"commentary\"])\n\n        if \"email\" in fields:\n            input_field = self.get_content_item(\"email_input\")\n            input_field.input_value(user_data[\"email\"])\n\n        if \"phone_number\" in fields:\n            input_field = self.get_content_item(\"phone_input\")\n            input_field.input_value(user_data[\"phone_number\"])\n\n        if \"push_notification_checked\" in fields:\n            checkbox = self.get_content_item(\"push_notification_checkbox\")\n            if user_data[\"push_notification_checked\"]:\n                checkbox.check()\n            else:\n                checkbox.uncheck()\n\n        save_button = self.get_button_by_name(\"save\")\n        save_button.click()\n\n        title = \"\u0421\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435\"\n        self.save_user_confirm.check_title(\n            title,\n            f\"Confirmation dialog window with title '{title}' is missing\"\n        )\n        self.save_user_confirm.click_allow_button()\n\n    def reset_password(self):\n        \"\"\"\u0418\u043d\u0438\u0446\u0438\u0438\u0440\u0443\u0435\u0442 \u0441\u0431\u0440\u043e\u0441 \u043f\u0430\u0440\u043e\u043b\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\"\"\"\n\n        reset_password_button = self.get_button_by_name(\"reset_password\")\n        reset_password_button.click()\n\n    def check_content(self, user_name, role):\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0438 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0441\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u043e\u043a\u043d\u0430.\n\n        Args:\n            user_name (str): \u041e\u0436\u0438\u0434\u0430\u0435\u043c\u043e\u0435 \u0438\u043c\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\n            role (str): \u041e\u0436\u0438\u0434\u0430\u0435\u043c\u0430\u044f \u0440\u043e\u043b\u044c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\n        \"\"\"\n\n        menu_locator = self.page.locator(ModalWindowLocators.MENU_INPUT_FORM_USER_DATA)\n\n        self.check_by_window_title()\n        self.check_toolbar_button_visibility(\"close\")\n        self.check_toolbar_button_tooltip(\"close\", \"\u0417\u0430\u043a\u0440\u044b\u0442\u044c\")\n\n        for name in self.content_items.keys():\n            item = self.get_content_item(name)\n\n            if name == \"push_notification_checkbox_label\":\n                item.check_have_text(\n                    \"\u041f\u043e\u0434\u043f\u0438\u0441\u043a\u0430 \u043d\u0430 Push-\u0443\u0432\u0435\u0434\u043e\u043c\u043b\u0435\u043d\u0438\u044f\",\n                    \"Label '\u041f\u043e\u0434\u043f\u0438\u0441\u043a\u0430 \u043d\u0430 Push-\u0443\u0432\u0435\u0434\u043e\u043c\u043b\u0435\u043d\u0438\u044f' is missing\"\n                )\n            elif name == \"name_input\":\n                name = self.get_content_item(\"name_input\")\n                text_value = name.get_input_value()\n                assert text_value == user_name, (\n                    f\"Expected user name '{user_name}' is not equal real user name '{text_value}'\"\n                )\n            elif name == \"role_input\":\n                item.click()\n                roles_list = self.get_content_item(\"roles_list\")\n                roles_list.check_visibility(menu_locator,\n                                          \"Roles list is missing\")\n                roles_list.check_item_with_text(role)\n            elif name == \"roles_list\":\n                continue\n            else:\n                item.check_visibility(\n                    f\"Modal window content item with name '{name}' is missing\"\n                )\n\n        self.check_button_visibility(\"save\")\n        self.check_button_visibility(\"delete\")\n        self.check_button_visibility(\"reset_password\")\n        self.check_button_visibility(\"close\")\n
    "},{"location":"components_derived/modal_edit_user/#components_derived.modal_edit_user.EditUserModalWindow.__init__","title":"__init__(page, user_name)","text":"

    \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0444\u043e\u0440\u043c\u044b \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.

    Source code in components_derived\\modal_edit_user.py
    def __init__(self, page: Page, user_name: str):\n    \"\"\"\u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0444\u043e\u0440\u043c\u044b \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\"\"\"\n\n    super().__init__(page)\n\n    # \u041b\u043e\u043a\u0430\u0442\u043e\u0440\u044b \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0444\u043e\u0440\u043c\u044b\n    text_field_locator = ModalWindowLocators.TEXT_FIELD_INPUT_FORM_USER_DATA\n    input_form_locator = ModalWindowLocators.INPUT_FORM_USER_DATA\n    label_locator = ModalWindowLocators.LABEL_INPUT_FORM_USER_DATA\n\n    # \u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430 \u0438 \u043a\u043d\u043e\u043f\u043a\u0438 \u0437\u0430\u043a\u0440\u044b\u0442\u0438\u044f\n    self.window_title = user_name\n    locator_button_toolbar_close = self.page.get_by_role(\"navigation\").filter(\n        has_text=re.compile(self.window_title)\n    ).get_by_role(\"button\")\n\n    self.add_toolbar_title(self.window_title)\n    self.add_toolbar_button(locator_button_toolbar_close, \"close\")\n\n    # \u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043f\u043e\u043b\u0435\u0439 \u0444\u043e\u0440\u043c\u044b\n    loc = self.page.locator(input_form_locator).locator(\"xpath=div[1]\").locator(text_field_locator)\n    name_input = TextInput(page, loc, \"name_input\")\n    self.add_content_item(\"name_input\", name_input)\n\n    role_loc = self.page.locator(input_form_locator).get_by_role(\"combobox\").nth(0)\n    role_input = TextInput(page, role_loc, \"role_input\")\n    self.add_content_item(\"role_input\", role_input)\n    self.add_content_item(\n        \"roles_list\",\n        DropdownList(page)\n    )\n\n    loc = self.page.locator(input_form_locator).locator(\"xpath=div[3]\").locator(text_field_locator)\n    commentary_input = TextInput(page, loc, \"commentary_input\")\n    self.add_content_item(\"commentary_input\", commentary_input)\n\n    loc = self.page.locator(input_form_locator).locator(\"xpath=div[4]\").locator(text_field_locator)\n    email_input = TextInput(page, loc, \"email_input\")\n    self.add_content_item(\"email_input\", email_input)\n\n    loc = self.page.locator(input_form_locator).locator(\"xpath=div[5]\").locator(text_field_locator)\n    phone_input = TextInput(page, loc, \"phone_input\")\n    self.add_content_item(\"phone_input\", phone_input)\n\n    # \u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0447\u0435\u043a\u0431\u043e\u043a\u0441\u043e\u0432 \u0438 \u0438\u0445 \u043c\u0435\u0442\u043e\u043a\n    checkbox_2 = Checkbox(\n        page,\n        page.get_by_role(\"checkbox\").nth(0),\n        \"push_notification\"\n    )\n    self.add_content_item(\"push_notification_checkbox\", checkbox_2)\n\n    label_2 = Text(\n        page,\n        self.page.locator(label_locator).nth(0),\n        \"push_notification_checkbox_label\"\n    )\n    self.add_content_item(\"push_notification_checkbox_label\", label_2)\n\n    # \u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043a\u043d\u043e\u043f\u043e\u043a \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439\n    locator_button_save = self.page.get_by_role(\"button\", name=\"\u0421\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c\")\n    self.add_button(locator_button_save, \"save\")\n\n    locator_button_delete = self.page.get_by_role(\"button\", name=\"\u0423\u0434\u0430\u043b\u0438\u0442\u044c\")\n    self.add_button(locator_button_delete, \"delete\")\n\n    locator_button_reset = self.page.get_by_role(\"button\", name=\"\u0421\u0431\u0440\u043e\u0441\u0438\u0442\u044c \u043f\u0430\u0440\u043e\u043b\u044c\")\n    self.add_button(locator_button_reset, \"reset_password\")\n\n    locator_button_close = self.page.get_by_role(\"button\", name=\"\u0417\u0430\u043a\u0440\u044b\u0442\u044c\")\n    self.add_button(locator_button_close, \"close\")\n\n    # \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043e\u0432 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u044f\n    self.save_user_confirm = ConfirmComponent(page, \" \u041e\u0442\u043c\u0435\u043d\u0430 \", \" \u0421\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \")\n    self.delete_user_confirm = ConfirmComponent(page, \" \u041e\u0442\u043c\u0435\u043d\u0430 \", \" \u0423\u0434\u0430\u043b\u0438\u0442\u044c \")\n
    "},{"location":"components_derived/modal_edit_user/#components_derived.modal_edit_user.EditUserModalWindow.check_content","title":"check_content(user_name, role)","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0438 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0441\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u043e\u043a\u043d\u0430.

    Parameters:

    Name Type Description Default user_name str

    \u041e\u0436\u0438\u0434\u0430\u0435\u043c\u043e\u0435 \u0438\u043c\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f

    required role str

    \u041e\u0436\u0438\u0434\u0430\u0435\u043c\u0430\u044f \u0440\u043e\u043b\u044c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f

    required Source code in components_derived\\modal_edit_user.py
    def check_content(self, user_name, role):\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0438 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0441\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u043e\u043a\u043d\u0430.\n\n    Args:\n        user_name (str): \u041e\u0436\u0438\u0434\u0430\u0435\u043c\u043e\u0435 \u0438\u043c\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\n        role (str): \u041e\u0436\u0438\u0434\u0430\u0435\u043c\u0430\u044f \u0440\u043e\u043b\u044c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\n    \"\"\"\n\n    menu_locator = self.page.locator(ModalWindowLocators.MENU_INPUT_FORM_USER_DATA)\n\n    self.check_by_window_title()\n    self.check_toolbar_button_visibility(\"close\")\n    self.check_toolbar_button_tooltip(\"close\", \"\u0417\u0430\u043a\u0440\u044b\u0442\u044c\")\n\n    for name in self.content_items.keys():\n        item = self.get_content_item(name)\n\n        if name == \"push_notification_checkbox_label\":\n            item.check_have_text(\n                \"\u041f\u043e\u0434\u043f\u0438\u0441\u043a\u0430 \u043d\u0430 Push-\u0443\u0432\u0435\u0434\u043e\u043c\u043b\u0435\u043d\u0438\u044f\",\n                \"Label '\u041f\u043e\u0434\u043f\u0438\u0441\u043a\u0430 \u043d\u0430 Push-\u0443\u0432\u0435\u0434\u043e\u043c\u043b\u0435\u043d\u0438\u044f' is missing\"\n            )\n        elif name == \"name_input\":\n            name = self.get_content_item(\"name_input\")\n            text_value = name.get_input_value()\n            assert text_value == user_name, (\n                f\"Expected user name '{user_name}' is not equal real user name '{text_value}'\"\n            )\n        elif name == \"role_input\":\n            item.click()\n            roles_list = self.get_content_item(\"roles_list\")\n            roles_list.check_visibility(menu_locator,\n                                      \"Roles list is missing\")\n            roles_list.check_item_with_text(role)\n        elif name == \"roles_list\":\n            continue\n        else:\n            item.check_visibility(\n                f\"Modal window content item with name '{name}' is missing\"\n            )\n\n    self.check_button_visibility(\"save\")\n    self.check_button_visibility(\"delete\")\n    self.check_button_visibility(\"reset_password\")\n    self.check_button_visibility(\"close\")\n
    "},{"location":"components_derived/modal_edit_user/#components_derived.modal_edit_user.EditUserModalWindow.close_window","title":"close_window()","text":"

    \u0417\u0430\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u043e\u043a\u043d\u043e \u0447\u0435\u0440\u0435\u0437 \u043a\u043d\u043e\u043f\u043a\u0443 '\u0417\u0430\u043a\u0440\u044b\u0442\u044c'.

    Source code in components_derived\\modal_edit_user.py
    def close_window(self):\n    \"\"\"\u0417\u0430\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u043e\u043a\u043d\u043e \u0447\u0435\u0440\u0435\u0437 \u043a\u043d\u043e\u043f\u043a\u0443 '\u0417\u0430\u043a\u0440\u044b\u0442\u044c'.\"\"\"\n\n    close_button = self.get_button_by_name(\"close\")\n    close_button.click()\n
    "},{"location":"components_derived/modal_edit_user/#components_derived.modal_edit_user.EditUserModalWindow.close_window_by_toolbar_button","title":"close_window_by_toolbar_button()","text":"

    \u0417\u0430\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u043e\u043a\u043d\u043e \u0447\u0435\u0440\u0435\u0437 \u043a\u043d\u043e\u043f\u043a\u0443 \u0432 \u0442\u0443\u043b\u0431\u0430\u0440\u0435.

    Source code in components_derived\\modal_edit_user.py
    def close_window_by_toolbar_button(self):\n    \"\"\"\u0417\u0430\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u043e\u043a\u043d\u043e \u0447\u0435\u0440\u0435\u0437 \u043a\u043d\u043e\u043f\u043a\u0443 \u0432 \u0442\u0443\u043b\u0431\u0430\u0440\u0435.\"\"\"\n\n    self.click_toolbar_close_button()\n
    "},{"location":"components_derived/modal_edit_user/#components_derived.modal_edit_user.EditUserModalWindow.delete_user","title":"delete_user()","text":"

    \u0423\u0434\u0430\u043b\u044f\u0435\u0442 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0441 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u0435\u043c.

    Source code in components_derived\\modal_edit_user.py
    def delete_user(self):\n    \"\"\"\u0423\u0434\u0430\u043b\u044f\u0435\u0442 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0441 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u0435\u043c.\"\"\"\n\n    delete_button = self.get_button_by_name(\"delete\")\n    delete_button.click()\n\n    title = \"\u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435\"\n    self.delete_user_confirm.check_title(\n        title,\n        f\"Confirmation dialog window with title '{title}' is missing\"\n    )\n    self.delete_user_confirm.click_allow_button()\n
    "},{"location":"components_derived/modal_edit_user/#components_derived.modal_edit_user.EditUserModalWindow.edit_user","title":"edit_user(user_data)","text":"

    \u0420\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u0443\u0435\u0442 \u0434\u0430\u043d\u043d\u044b\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.

    Parameters:

    Name Type Description Default user_data dict

    \u0414\u0430\u043d\u043d\u044b\u0435 \u0434\u043b\u044f \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f (\u0438\u043c\u044f, \u0440\u043e\u043b\u044c \u0438 \u0434\u0440.)

    required Source code in components_derived\\modal_edit_user.py
    def edit_user(self, user_data):\n    \"\"\"\u0420\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u0443\u0435\u0442 \u0434\u0430\u043d\u043d\u044b\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\n\n    Args:\n        user_data (dict): \u0414\u0430\u043d\u043d\u044b\u0435 \u0434\u043b\u044f \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f (\u0438\u043c\u044f, \u0440\u043e\u043b\u044c \u0438 \u0434\u0440.)\n    \"\"\"\n\n    fields = user_data.keys()\n\n    if \"name\" in fields:\n        input_field = self.get_content_item(\"name_input\")\n        input_field.input_value(user_data[\"name\"])\n\n    if \"role\" in fields:\n        role_field = self.get_content_item(\"role_input\")\n        role_field.click()\n\n        roles_list = self.get_content_item(\"roles_list\")\n        roles_list.check_item_with_text(user_data[\"role\"])\n        roles_list.click_item_with_text(user_data[\"role\"])\n\n    if \"commentary\" in fields:\n        input_field = self.get_content_item(\"commentary_input\")\n        input_field.input_value(user_data[\"commentary\"])\n\n    if \"email\" in fields:\n        input_field = self.get_content_item(\"email_input\")\n        input_field.input_value(user_data[\"email\"])\n\n    if \"phone_number\" in fields:\n        input_field = self.get_content_item(\"phone_input\")\n        input_field.input_value(user_data[\"phone_number\"])\n\n    if \"push_notification_checked\" in fields:\n        checkbox = self.get_content_item(\"push_notification_checkbox\")\n        if user_data[\"push_notification_checked\"]:\n            checkbox.check()\n        else:\n            checkbox.uncheck()\n\n    save_button = self.get_button_by_name(\"save\")\n    save_button.click()\n\n    title = \"\u0421\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435\"\n    self.save_user_confirm.check_title(\n        title,\n        f\"Confirmation dialog window with title '{title}' is missing\"\n    )\n    self.save_user_confirm.click_allow_button()\n
    "},{"location":"components_derived/modal_edit_user/#components_derived.modal_edit_user.EditUserModalWindow.reset_password","title":"reset_password()","text":"

    \u0418\u043d\u0438\u0446\u0438\u0438\u0440\u0443\u0435\u0442 \u0441\u0431\u0440\u043e\u0441 \u043f\u0430\u0440\u043e\u043b\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.

    Source code in components_derived\\modal_edit_user.py
    def reset_password(self):\n    \"\"\"\u0418\u043d\u0438\u0446\u0438\u0438\u0440\u0443\u0435\u0442 \u0441\u0431\u0440\u043e\u0441 \u043f\u0430\u0440\u043e\u043b\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\"\"\"\n\n    reset_password_button = self.get_button_by_name(\"reset_password\")\n    reset_password_button.click()\n
    "},{"location":"components_derived/modal_view_template/","title":"ViewTemplateModalWindow","text":"

    \u041c\u043e\u0434\u0443\u043b\u044c modal_view_template \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043a\u043b\u0430\u0441\u0441 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u044b\u043c \u043e\u043a\u043d\u043e\u043c \u0448\u0430\u0431\u043b\u043e\u043d\u0430.

    \u041a\u043b\u0430\u0441\u0441 ViewTemplateModalWindow \u043d\u0430\u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u0431\u0430\u0437\u043e\u0432\u044b\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b ModalWindowComponent \u0438 \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u0442 \u043c\u0435\u0442\u043e\u0434\u044b \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0430 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430 \u0448\u0430\u0431\u043b\u043e\u043d\u0430.

    "},{"location":"components_derived/modal_view_template/#components_derived.modal_view_template.ViewTemplateModalWindow","title":"ViewTemplateModalWindow","text":"

    Bases: ModalWindowComponent

    \u041c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043a\u043d\u043e \u0448\u0430\u0431\u043b\u043e\u043d\u0430.

    \u041d\u0430\u0441\u043b\u0435\u0434\u0443\u0435\u0442 ModalWindowComponent \u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b \u0434\u043b\u044f: 1. \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430 \u0441 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u043c \u0448\u0430\u0431\u043b\u043e\u043d\u043e\u043c 2. \u0417\u0430\u043a\u0440\u044b\u0442\u0438\u044f \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430 3. \u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u0448\u0430\u0431\u043b\u043e\u043d\u0430 4. \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0433\u043e \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430

    Source code in components_derived\\modal_view_template.py
    class ViewTemplateModalWindow(ModalWindowComponent):\n    \"\"\"\u041c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043a\u043d\u043e \u0448\u0430\u0431\u043b\u043e\u043d\u0430.\n\n    \u041d\u0430\u0441\u043b\u0435\u0434\u0443\u0435\u0442 ModalWindowComponent \u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b \u0434\u043b\u044f:\n    1. \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430 \u0441 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u043c \u0448\u0430\u0431\u043b\u043e\u043d\u043e\u043c\n    2. \u0417\u0430\u043a\u0440\u044b\u0442\u0438\u044f \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430\n    3. \u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u0448\u0430\u0431\u043b\u043e\u043d\u0430\n    4. \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0433\u043e \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430\n    \"\"\"\n\n    def __init__(self, page: Page, template_name: str):\n        \"\"\"\u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0444\u043e\u0440\u043c\u044b \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430 \u0448\u0430\u0431\u043b\u043e\u043d\u0430.\"\"\"\n        super().__init__(page)\n\n        # \u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430 \u0438 \u043a\u043d\u043e\u043f\u043a\u0438 \u0437\u0430\u043a\u0440\u044b\u0442\u0438\u044f\n        self.window_title = template_name\n        locator_button_toolbar_close = self.page.get_by_role(\"navigation\").filter(\n            has_text=re.compile(self.window_title)\n        ).get_by_role(\"button\")\n\n        self.add_toolbar_title(self.window_title)\n        self.add_toolbar_button(locator_button_toolbar_close, \"close\")\n\n    def close_window(self) -> None:\n        \"\"\"\u0417\u0430\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u043e\u043a\u043d\u043e \u0447\u0435\u0440\u0435\u0437 \u043a\u043d\u043e\u043f\u043a\u0443 '\u0417\u0430\u043a\u0440\u044b\u0442\u044c'.\"\"\"\n        close_button = self.get_button_by_name(\"close\")\n        close_button.click()\n\n    def check_content(self) -> None:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0438 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0441\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u043e\u043a\u043d\u0430.\n\n        \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442:\n        1. \u041d\u0430\u043b\u0438\u0447\u0438\u0435 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430 \u043e\u043a\u043d\u0430 \u0441 \u0438\u043c\u0435\u043d\u0435\u043c \u0448\u0430\u0431\u043b\u043e\u043d\u0430\n        2. \u0412\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u043a\u043d\u043e\u043f\u043a\u0438 \u0437\u0430\u043a\u0440\u044b\u0442\u0438\u044f\n        3. \u041f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0443 \u043a\u043d\u043e\u043f\u043a\u0438 \u0437\u0430\u043a\u0440\u044b\u0442\u0438\u044f\n        \"\"\"\n        self.check_by_window_title()\n        self.check_toolbar_button_visibility(\"close\")\n        self.check_toolbar_button_tooltip(\"close\", \"\u0417\u0430\u043a\u0440\u044b\u0442\u044c\")\n\n    def get_modal_window_data(self) -> dict:\n        \"\"\"\u0418\u0437\u0432\u043b\u0435\u043a\u0430\u0435\u0442 \u0434\u0430\u043d\u043d\u044b\u0435 \u0438\u0437 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430 \u0448\u0430\u0431\u043b\u043e\u043d\u0430 \u0438 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0438\u0440\u0443\u0435\u0442 \u043f\u043e \u043a\u043e\u0434\u0430\u043c \u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f\u043c.\n\n        Returns:\n            dict: \u0414\u0430\u043d\u043d\u044b\u0435 \u0432 \u0444\u043e\u0440\u043c\u0430\u0442\u0435 {'\u043a\u043e\u0434': '\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435'} \u043a\u0430\u043a \u0432 API\n        \"\"\"\n        modal_data = {}\n\n        # \u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0432\u0441\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0438\u0437 input \u043f\u043e\u043b\u0435\u0439\n        input_locator = self.get_locator(ModalWindowLocators.MODAL_WINDOW_TEXT_FIELD_INPUT)\n\n        # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043d\u0430\u043b\u0438\u0447\u0438\u044f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432\n        input_count = input_locator.count()\n        if input_count == 0:\n            logger.warning(\"\u041f\u043e\u043b\u044f \u0432\u0432\u043e\u0434\u0430 \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u044b \u0432 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u043c \u043e\u043a\u043d\u0435\")\n            return modal_data\n\n        all_values = []\n\n        # \u041e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u043c \u043a\u0430\u0436\u0434\u043e\u0435 \u043f\u043e\u043b\u0435 \u0441 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u043e\u0439 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0445 \u043e\u0448\u0438\u0431\u043e\u043a\n        for i in range(input_count):\n            input_field = input_locator.nth(i)\n\n            # \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c, \u0447\u0442\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0432\u0438\u0434\u0438\u043c \u0438 \u0434\u043e\u0441\u0442\u0443\u043f\u0435\u043d\n            if not input_field.is_visible():\n                logger.debug(\"\u041f\u043e\u043b\u0435 %s \u043d\u0435 \u0432\u0438\u0434\u0438\u043c\u043e, \u043f\u0440\u043e\u043f\u0443\u0441\u043a\u0430\u0435\u043c\", i)\n                continue\n\n            # \u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0441 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u043e\u0439 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0445 \u043e\u0448\u0438\u0431\u043e\u043a \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\n            if input_field.is_visible():\n                value = input_field.input_value().strip()\n                if value:  # \u0418\u0433\u043d\u043e\u0440\u0438\u0440\u0443\u0435\u043c \u043f\u0443\u0441\u0442\u044b\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f\n                    all_values.append(value)\n            else:\n                logger.debug(\"\u041f\u043e\u043b\u0435 %s \u0441\u0442\u0430\u043b\u043e \u043d\u0435\u0432\u0438\u0434\u0438\u043c\u044b\u043c \u043f\u043e\u0441\u043b\u0435 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438, \u043f\u0440\u043e\u043f\u0443\u0441\u043a\u0430\u0435\u043c\", i)\n\n        logger.info(\"\u0412\u0441\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0438\u0437 \u043f\u043e\u043b\u0435\u0439: %s\", all_values)\n\n        # \u0410\u043d\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u043c \u043f\u0430\u0440\u044b \u043a\u043e\u0434-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\n        i = 0\n        while i < len(all_values) - 1:\n            current_value = all_values[i]\n            next_value = all_values[i + 1]\n\n            # \u041e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u043c, \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043b\u0438 \u0442\u0435\u043a\u0443\u0449\u0435\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043a\u043e\u0434\u043e\u043c (\u0447\u0438\u0441\u043b\u043e)\n            if current_value.isdigit():\n                # \u0422\u0435\u043a\u0443\u0449\u0435\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 - \u043a\u043e\u0434, \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0435 - \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\n                modal_data[current_value] = next_value\n                i += 2  # \u041f\u0435\u0440\u0435\u0441\u043a\u0430\u043a\u0438\u0432\u0430\u0435\u043c \u0447\u0435\u0440\u0435\u0437 \u043f\u0430\u0440\u0443\n            else:\n                # \u0415\u0441\u043b\u0438 \u0442\u0435\u043a\u0443\u0449\u0435\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043d\u0435 \u0447\u0438\u0441\u043b\u043e, \u0438\u0449\u0435\u043c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0443\u044e \u043f\u0430\u0440\u0443\n                i += 1\n\n        # \u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0438\u043c\u044f \u0448\u0430\u0431\u043b\u043e\u043d\u0430 \u0441 \u043a\u043b\u044e\u0447\u043e\u043c '\u0428\u0430\u0431\u043b\u043e\u043d' \u0432\u043c\u0435\u0441\u0442\u043e 'template'\n        if all_values:\n            modal_data['\u0428\u0430\u0431\u043b\u043e\u043d'] = all_values[-1]\n\n        logger.info(\"\u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0438\u0437 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430: %s\", modal_data)\n        return modal_data\n\n    def compare_modal_with_api_data(self, modal_data: dict, api_data: dict,\n                                   template_name: str) -> None:\n        \"\"\"\u0421\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u0435\u0442 \u0434\u0430\u043d\u043d\u044b\u0435 \u0438\u0437 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430 \u0441 \u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u0438\u0437 API.\"\"\"\n        errors = []\n\n        # \u0421\u043e\u0437\u0434\u0430\u0435\u043c \u043a\u043e\u043f\u0438\u044e API \u0434\u0430\u043d\u043d\u044b\u0445 \u0441 \u0437\u0430\u043c\u0435\u043d\u043e\u0439 'template' \u043d\u0430 '\u0428\u0430\u0431\u043b\u043e\u043d'\n        api_data_adapted = api_data.copy()\n        if 'template' in api_data_adapted:\n            api_data_adapted['\u0428\u0430\u0431\u043b\u043e\u043d'] = api_data_adapted.pop('template')\n\n        # \u0421\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u0435\u043c \u0432\u0441\u0435 \u043f\u043e\u043b\u044f\n        for code, expected_value in api_data_adapted.items():\n            if code in modal_data:\n                actual_value = modal_data[code]\n                if actual_value != expected_value:\n                    error_msg = (\n                        f\"\u0420\u0430\u0441\u0445\u043e\u0436\u0434\u0435\u043d\u0438\u0435 \u0434\u043b\u044f \u043a\u043e\u0434\u0430 {code}: \"\n                        f\"\u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043a\u043d\u043e='{actual_value}', API='{expected_value}'\"\n                    )\n                    logger.error(error_msg)\n                    errors.append(error_msg)\n            else:\n                error_msg = f\"\u041a\u043e\u0434 {code} \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d \u0432 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u043c \u043e\u043a\u043d\u0435\"\n                logger.error(error_msg)\n                errors.append(error_msg)\n\n        # \u0414\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0438\u043c\u0435\u043d\u0438 \u0448\u0430\u0431\u043b\u043e\u043d\u0430\n        modal_template = modal_data.get('\u0428\u0430\u0431\u043b\u043e\u043d', '')\n        if modal_template != template_name:\n            error_msg = (\n                f\"\u0420\u0430\u0441\u0445\u043e\u0436\u0434\u0435\u043d\u0438\u0435 \u0432 \u0438\u043c\u0435\u043d\u0438 \u0448\u0430\u0431\u043b\u043e\u043d\u0430: \"\n                f\"\u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043a\u043d\u043e='{modal_template}', \u043e\u0436\u0438\u0434\u0430\u0435\u0442\u0441\u044f='{template_name}'\"\n            )\n            logger.error(error_msg)\n            errors.append(error_msg)\n\n        # \u0415\u0441\u043b\u0438 \u0435\u0441\u0442\u044c \u0440\u0430\u0441\u0445\u043e\u0436\u0434\u0435\u043d\u0438\u044f, \u0432\u044b\u0431\u0440\u0430\u0441\u044b\u0432\u0430\u0435\u043c \u043e\u0448\u0438\u0431\u043a\u0443\n        if errors:\n            error_details = \"\\n\".join(errors)\n            assert False, (\n                f\"\u041e\u0431\u043d\u0430\u0440\u0443\u0436\u0435\u043d\u044b \u0440\u0430\u0441\u0445\u043e\u0436\u0434\u0435\u043d\u0438\u044f \u0434\u043b\u044f \u0448\u0430\u0431\u043b\u043e\u043d\u0430 '{template_name}':\\n{error_details}\"\n            )\n\n        logger.info(\"\u0414\u0430\u043d\u043d\u044b\u0435 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0442 API \u0434\u043b\u044f \u0448\u0430\u0431\u043b\u043e\u043d\u0430 '%s'\", template_name)\n
    "},{"location":"components_derived/modal_view_template/#components_derived.modal_view_template.ViewTemplateModalWindow.__init__","title":"__init__(page, template_name)","text":"

    \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0444\u043e\u0440\u043c\u044b \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430 \u0448\u0430\u0431\u043b\u043e\u043d\u0430.

    Source code in components_derived\\modal_view_template.py
    def __init__(self, page: Page, template_name: str):\n    \"\"\"\u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0444\u043e\u0440\u043c\u044b \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430 \u0448\u0430\u0431\u043b\u043e\u043d\u0430.\"\"\"\n    super().__init__(page)\n\n    # \u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430 \u0438 \u043a\u043d\u043e\u043f\u043a\u0438 \u0437\u0430\u043a\u0440\u044b\u0442\u0438\u044f\n    self.window_title = template_name\n    locator_button_toolbar_close = self.page.get_by_role(\"navigation\").filter(\n        has_text=re.compile(self.window_title)\n    ).get_by_role(\"button\")\n\n    self.add_toolbar_title(self.window_title)\n    self.add_toolbar_button(locator_button_toolbar_close, \"close\")\n
    "},{"location":"components_derived/modal_view_template/#components_derived.modal_view_template.ViewTemplateModalWindow.check_content","title":"check_content()","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0438 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0441\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u043e\u043a\u043d\u0430.

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442: 1. \u041d\u0430\u043b\u0438\u0447\u0438\u0435 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430 \u043e\u043a\u043d\u0430 \u0441 \u0438\u043c\u0435\u043d\u0435\u043c \u0448\u0430\u0431\u043b\u043e\u043d\u0430 2. \u0412\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u043a\u043d\u043e\u043f\u043a\u0438 \u0437\u0430\u043a\u0440\u044b\u0442\u0438\u044f 3. \u041f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0443 \u043a\u043d\u043e\u043f\u043a\u0438 \u0437\u0430\u043a\u0440\u044b\u0442\u0438\u044f

    Source code in components_derived\\modal_view_template.py
    def check_content(self) -> None:\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0438 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0441\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u043e\u043a\u043d\u0430.\n\n    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442:\n    1. \u041d\u0430\u043b\u0438\u0447\u0438\u0435 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430 \u043e\u043a\u043d\u0430 \u0441 \u0438\u043c\u0435\u043d\u0435\u043c \u0448\u0430\u0431\u043b\u043e\u043d\u0430\n    2. \u0412\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u043a\u043d\u043e\u043f\u043a\u0438 \u0437\u0430\u043a\u0440\u044b\u0442\u0438\u044f\n    3. \u041f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0443 \u043a\u043d\u043e\u043f\u043a\u0438 \u0437\u0430\u043a\u0440\u044b\u0442\u0438\u044f\n    \"\"\"\n    self.check_by_window_title()\n    self.check_toolbar_button_visibility(\"close\")\n    self.check_toolbar_button_tooltip(\"close\", \"\u0417\u0430\u043a\u0440\u044b\u0442\u044c\")\n
    "},{"location":"components_derived/modal_view_template/#components_derived.modal_view_template.ViewTemplateModalWindow.close_window","title":"close_window()","text":"

    \u0417\u0430\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u043e\u043a\u043d\u043e \u0447\u0435\u0440\u0435\u0437 \u043a\u043d\u043e\u043f\u043a\u0443 '\u0417\u0430\u043a\u0440\u044b\u0442\u044c'.

    Source code in components_derived\\modal_view_template.py
    def close_window(self) -> None:\n    \"\"\"\u0417\u0430\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u043e\u043a\u043d\u043e \u0447\u0435\u0440\u0435\u0437 \u043a\u043d\u043e\u043f\u043a\u0443 '\u0417\u0430\u043a\u0440\u044b\u0442\u044c'.\"\"\"\n    close_button = self.get_button_by_name(\"close\")\n    close_button.click()\n
    "},{"location":"components_derived/modal_view_template/#components_derived.modal_view_template.ViewTemplateModalWindow.compare_modal_with_api_data","title":"compare_modal_with_api_data(modal_data, api_data, template_name)","text":"

    \u0421\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u0435\u0442 \u0434\u0430\u043d\u043d\u044b\u0435 \u0438\u0437 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430 \u0441 \u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u0438\u0437 API.

    Source code in components_derived\\modal_view_template.py
    def compare_modal_with_api_data(self, modal_data: dict, api_data: dict,\n                               template_name: str) -> None:\n    \"\"\"\u0421\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u0435\u0442 \u0434\u0430\u043d\u043d\u044b\u0435 \u0438\u0437 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430 \u0441 \u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u0438\u0437 API.\"\"\"\n    errors = []\n\n    # \u0421\u043e\u0437\u0434\u0430\u0435\u043c \u043a\u043e\u043f\u0438\u044e API \u0434\u0430\u043d\u043d\u044b\u0445 \u0441 \u0437\u0430\u043c\u0435\u043d\u043e\u0439 'template' \u043d\u0430 '\u0428\u0430\u0431\u043b\u043e\u043d'\n    api_data_adapted = api_data.copy()\n    if 'template' in api_data_adapted:\n        api_data_adapted['\u0428\u0430\u0431\u043b\u043e\u043d'] = api_data_adapted.pop('template')\n\n    # \u0421\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u0435\u043c \u0432\u0441\u0435 \u043f\u043e\u043b\u044f\n    for code, expected_value in api_data_adapted.items():\n        if code in modal_data:\n            actual_value = modal_data[code]\n            if actual_value != expected_value:\n                error_msg = (\n                    f\"\u0420\u0430\u0441\u0445\u043e\u0436\u0434\u0435\u043d\u0438\u0435 \u0434\u043b\u044f \u043a\u043e\u0434\u0430 {code}: \"\n                    f\"\u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043a\u043d\u043e='{actual_value}', API='{expected_value}'\"\n                )\n                logger.error(error_msg)\n                errors.append(error_msg)\n        else:\n            error_msg = f\"\u041a\u043e\u0434 {code} \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d \u0432 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u043c \u043e\u043a\u043d\u0435\"\n            logger.error(error_msg)\n            errors.append(error_msg)\n\n    # \u0414\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0438\u043c\u0435\u043d\u0438 \u0448\u0430\u0431\u043b\u043e\u043d\u0430\n    modal_template = modal_data.get('\u0428\u0430\u0431\u043b\u043e\u043d', '')\n    if modal_template != template_name:\n        error_msg = (\n            f\"\u0420\u0430\u0441\u0445\u043e\u0436\u0434\u0435\u043d\u0438\u0435 \u0432 \u0438\u043c\u0435\u043d\u0438 \u0448\u0430\u0431\u043b\u043e\u043d\u0430: \"\n            f\"\u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043a\u043d\u043e='{modal_template}', \u043e\u0436\u0438\u0434\u0430\u0435\u0442\u0441\u044f='{template_name}'\"\n        )\n        logger.error(error_msg)\n        errors.append(error_msg)\n\n    # \u0415\u0441\u043b\u0438 \u0435\u0441\u0442\u044c \u0440\u0430\u0441\u0445\u043e\u0436\u0434\u0435\u043d\u0438\u044f, \u0432\u044b\u0431\u0440\u0430\u0441\u044b\u0432\u0430\u0435\u043c \u043e\u0448\u0438\u0431\u043a\u0443\n    if errors:\n        error_details = \"\\n\".join(errors)\n        assert False, (\n            f\"\u041e\u0431\u043d\u0430\u0440\u0443\u0436\u0435\u043d\u044b \u0440\u0430\u0441\u0445\u043e\u0436\u0434\u0435\u043d\u0438\u044f \u0434\u043b\u044f \u0448\u0430\u0431\u043b\u043e\u043d\u0430 '{template_name}':\\n{error_details}\"\n        )\n\n    logger.info(\"\u0414\u0430\u043d\u043d\u044b\u0435 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0442 API \u0434\u043b\u044f \u0448\u0430\u0431\u043b\u043e\u043d\u0430 '%s'\", template_name)\n
    "},{"location":"components_derived/modal_view_template/#components_derived.modal_view_template.ViewTemplateModalWindow.get_modal_window_data","title":"get_modal_window_data()","text":"

    \u0418\u0437\u0432\u043b\u0435\u043a\u0430\u0435\u0442 \u0434\u0430\u043d\u043d\u044b\u0435 \u0438\u0437 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430 \u0448\u0430\u0431\u043b\u043e\u043d\u0430 \u0438 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0438\u0440\u0443\u0435\u0442 \u043f\u043e \u043a\u043e\u0434\u0430\u043c \u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f\u043c.

    Returns:

    Name Type Description dict dict

    \u0414\u0430\u043d\u043d\u044b\u0435 \u0432 \u0444\u043e\u0440\u043c\u0430\u0442\u0435 {'\u043a\u043e\u0434': '\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435'} \u043a\u0430\u043a \u0432 API

    Source code in components_derived\\modal_view_template.py
    def get_modal_window_data(self) -> dict:\n    \"\"\"\u0418\u0437\u0432\u043b\u0435\u043a\u0430\u0435\u0442 \u0434\u0430\u043d\u043d\u044b\u0435 \u0438\u0437 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430 \u0448\u0430\u0431\u043b\u043e\u043d\u0430 \u0438 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0438\u0440\u0443\u0435\u0442 \u043f\u043e \u043a\u043e\u0434\u0430\u043c \u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f\u043c.\n\n    Returns:\n        dict: \u0414\u0430\u043d\u043d\u044b\u0435 \u0432 \u0444\u043e\u0440\u043c\u0430\u0442\u0435 {'\u043a\u043e\u0434': '\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435'} \u043a\u0430\u043a \u0432 API\n    \"\"\"\n    modal_data = {}\n\n    # \u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0432\u0441\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0438\u0437 input \u043f\u043e\u043b\u0435\u0439\n    input_locator = self.get_locator(ModalWindowLocators.MODAL_WINDOW_TEXT_FIELD_INPUT)\n\n    # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043d\u0430\u043b\u0438\u0447\u0438\u044f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432\n    input_count = input_locator.count()\n    if input_count == 0:\n        logger.warning(\"\u041f\u043e\u043b\u044f \u0432\u0432\u043e\u0434\u0430 \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u044b \u0432 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u043c \u043e\u043a\u043d\u0435\")\n        return modal_data\n\n    all_values = []\n\n    # \u041e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u043c \u043a\u0430\u0436\u0434\u043e\u0435 \u043f\u043e\u043b\u0435 \u0441 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u043e\u0439 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0445 \u043e\u0448\u0438\u0431\u043e\u043a\n    for i in range(input_count):\n        input_field = input_locator.nth(i)\n\n        # \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c, \u0447\u0442\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0432\u0438\u0434\u0438\u043c \u0438 \u0434\u043e\u0441\u0442\u0443\u043f\u0435\u043d\n        if not input_field.is_visible():\n            logger.debug(\"\u041f\u043e\u043b\u0435 %s \u043d\u0435 \u0432\u0438\u0434\u0438\u043c\u043e, \u043f\u0440\u043e\u043f\u0443\u0441\u043a\u0430\u0435\u043c\", i)\n            continue\n\n        # \u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0441 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u043e\u0439 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0445 \u043e\u0448\u0438\u0431\u043e\u043a \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\n        if input_field.is_visible():\n            value = input_field.input_value().strip()\n            if value:  # \u0418\u0433\u043d\u043e\u0440\u0438\u0440\u0443\u0435\u043c \u043f\u0443\u0441\u0442\u044b\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f\n                all_values.append(value)\n        else:\n            logger.debug(\"\u041f\u043e\u043b\u0435 %s \u0441\u0442\u0430\u043b\u043e \u043d\u0435\u0432\u0438\u0434\u0438\u043c\u044b\u043c \u043f\u043e\u0441\u043b\u0435 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438, \u043f\u0440\u043e\u043f\u0443\u0441\u043a\u0430\u0435\u043c\", i)\n\n    logger.info(\"\u0412\u0441\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0438\u0437 \u043f\u043e\u043b\u0435\u0439: %s\", all_values)\n\n    # \u0410\u043d\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u043c \u043f\u0430\u0440\u044b \u043a\u043e\u0434-\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\n    i = 0\n    while i < len(all_values) - 1:\n        current_value = all_values[i]\n        next_value = all_values[i + 1]\n\n        # \u041e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u043c, \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043b\u0438 \u0442\u0435\u043a\u0443\u0449\u0435\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043a\u043e\u0434\u043e\u043c (\u0447\u0438\u0441\u043b\u043e)\n        if current_value.isdigit():\n            # \u0422\u0435\u043a\u0443\u0449\u0435\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 - \u043a\u043e\u0434, \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0435 - \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\n            modal_data[current_value] = next_value\n            i += 2  # \u041f\u0435\u0440\u0435\u0441\u043a\u0430\u043a\u0438\u0432\u0430\u0435\u043c \u0447\u0435\u0440\u0435\u0437 \u043f\u0430\u0440\u0443\n        else:\n            # \u0415\u0441\u043b\u0438 \u0442\u0435\u043a\u0443\u0449\u0435\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043d\u0435 \u0447\u0438\u0441\u043b\u043e, \u0438\u0449\u0435\u043c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0443\u044e \u043f\u0430\u0440\u0443\n            i += 1\n\n    # \u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0438\u043c\u044f \u0448\u0430\u0431\u043b\u043e\u043d\u0430 \u0441 \u043a\u043b\u044e\u0447\u043e\u043c '\u0428\u0430\u0431\u043b\u043e\u043d' \u0432\u043c\u0435\u0441\u0442\u043e 'template'\n    if all_values:\n        modal_data['\u0428\u0430\u0431\u043b\u043e\u043d'] = all_values[-1]\n\n    logger.info(\"\u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0438\u0437 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430: %s\", modal_data)\n    return modal_data\n
    "},{"location":"components_derived/user_card/","title":"UserCard","text":"

    \u041c\u043e\u0434\u0443\u043b\u044c \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430 \u043a\u0430\u0440\u0442\u043e\u0447\u043a\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.

    \u0421\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043a\u043b\u0430\u0441\u0441 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u043a\u0430\u0440\u0442\u043e\u0447\u043a\u043e\u0439 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0447\u0435\u0440\u0435\u0437 Playwright.

    "},{"location":"components_derived/user_card/#components_derived.user_card.UserCard","title":"UserCard","text":"

    Bases: BaseComponent

    \u041a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 \u043a\u0430\u0440\u0442\u043e\u0447\u043a\u0430.

    \u041f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u043c\u0435\u0442\u043e\u0434\u044b \u0434\u043b\u044f \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0441 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u043c\u0438 \u043a\u0430\u0440\u0442\u043e\u0447\u043a\u0438.

    Source code in components_derived\\user_card.py
    class UserCard(BaseComponent):\n    \"\"\"\u041a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 \u043a\u0430\u0440\u0442\u043e\u0447\u043a\u0430.\n\n    \u041f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u043c\u0435\u0442\u043e\u0434\u044b \u0434\u043b\u044f \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0441 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u043c\u0438 \u043a\u0430\u0440\u0442\u043e\u0447\u043a\u0438.\n    \"\"\"\n\n    def __init__(self, page: Page):\n        \"\"\"\u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 \u043a\u0430\u0440\u0442\u043e\u0447\u043a\u0438.\n\n        Args:\n            page: \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.\n        \"\"\"\n\n        super().__init__(page)\n\n        card_locator = page.locator(UserCardLocators.CARD_USER)\n\n        self.current_user_name = Text(page,\n                                      card_locator.locator(\"xpath=/div/div[2]\"),\n                                      \"current user name\")\n        self.current_user_role = Text(page,\n                                      card_locator.locator(\"xpath=/div/div[3]\"),\n                                      \"current user role\")\n        self.login_time = Text(page,\n                               card_locator.locator(\"xpath=/div/div[4]\"),\n                               \"login time\")\n        self.session_time = Text(page,\n                                 card_locator.locator(\"xpath=/div/div[5]\"),\n                                 \"current user name\")\n        self.logout_button = Button(\n            page,\n            page.get_by_role(\"button\", name=\"\u0412\u044b\u0439\u0442\u0438\"),\n            \"logout button\"\n        )\n        self.change_password_button = Button(\n            page,\n            page.get_by_role(\"button\", name=\"\u0418\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u043f\u0430\u0440\u043e\u043b\u044c\"),\n            \"change password button\"\n        )\n        self.settings_button = Button(\n            page,\n            page.get_by_role(\"button\", name=\"\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438\"),\n            \"settings button\"\n        )\n\n        # self.close_button = Button(\n        #     page,\n        #     page.get_by_role(\"button\", name=\"\u0417\u0430\u043a\u0440\u044b\u0442\u044c\"),\n        #     \"close button\"\n        # )\n\n        # \u043e\u043a\u043d\u0430, \u043e\u0442\u0440\u044b\u0432\u0430\u0435\u043c\u044b\u0435 \u043f\u043e\u0441\u043b\u0435 \u043d\u0430\u0436\u0430\u0442\u0438\u044f \u043a\u043d\u043e\u043f\u043e\u043a\n        self.user_settings_dialog_window = UserSettingsDialogWindow(page)\n        self.change_password_modal_window = ChangePasswordModalWindow(page)\n\n    # \u0414\u0435\u0439\u0441\u0442\u0432\u0438\u044f:\n    # def click_close_button(self):\n    #     \"\"\"\u041d\u0430\u0436\u0438\u043c\u0430\u0435\u0442 \u043a\u043d\u043e\u043f\u043a\u0443 \u0432\u044b\u0445\u043e\u0434\u0430 \u0438\u0437 \u043a\u0430\u0440\u0442\u043e\u0447\u043a\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\n\n    #     \u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u043a\u043b\u0438\u043a \u043f\u043e \u043a\u043d\u043e\u043f\u043a\u0435 '\u0417\u0430\u043a\u0440\u044b\u0442\u044c' \u0432 \u043a\u0430\u0440\u0442\u043e\u0447\u043a\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\n    #     \"\"\"\n\n    #     self.close_button.click()\n\n    def click_change_password_button(self) -> ChangePasswordModalWindow:\n        \"\"\"\u041d\u0430\u0436\u0438\u043c\u0430\u0435\u0442 \u043a\u043d\u043e\u043f\u043a\u0443 \u043e\u0442\u043a\u0440\u044b\u0442\u0438\u044f \u043e\u043a\u043d\u0430 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u043f\u0430\u0440\u043e\u043b\u044f.\n\n        \u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u043a\u043b\u0438\u043a \u043f\u043e \u043a\u043d\u043e\u043f\u043a\u0435 '\u0418\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u043f\u0430\u0440\u043e\u043b\u044c' \u0432 \u043a\u0430\u0440\u0442\u043e\u0447\u043a\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\n        \"\"\"\n\n        self.change_password_button.click()\n        return self.change_password_modal_window\n\n    def click_logout_button(self) -> None:\n        \"\"\"\u041d\u0430\u0436\u0438\u043c\u0430\u0435\u0442 \u043a\u043d\u043e\u043f\u043a\u0443 \u0432\u044b\u0445\u043e\u0434\u0430 \u0438\u0437 \u0441\u0438\u0441\u0442\u0435\u043c\u044b.\n\n        \u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u043a\u043b\u0438\u043a \u043f\u043e \u043a\u043d\u043e\u043f\u043a\u0435 '\u0412\u044b\u0439\u0442\u0438' \u0432 \u043a\u0430\u0440\u0442\u043e\u0447\u043a\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\n        \"\"\"\n\n        self.logout_button.click()\n\n    def click_settings_button(self) -> UserSettingsDialogWindow:\n        \"\"\"\u041d\u0430\u0436\u0438\u043c\u0430\u0435\u0442 \u043a\u043d\u043e\u043f\u043a\u0443 \u043e\u0442\u043a\u0440\u044b\u0442\u0438\u044f \u043e\u043a\u043d\u0430 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0445 \u0441\u0435\u0441\u0441\u0438\u0439.\n\n        \u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u043a\u043b\u0438\u043a \u043f\u043e \u043a\u043d\u043e\u043f\u043a\u0435 '\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438' \u0432 \u043a\u0430\u0440\u0442\u043e\u0447\u043a\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\n        \"\"\"\n\n        self.settings_button.click()\n        return self.user_settings_dialog_window\n\n    # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0438:\n    def check_content(self) -> None:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0438 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0441\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u043a\u0430\u0440\u0442\u043e\u0447\u043a\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\n           \u0432 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u0435\u0433\u043e \u0440\u043e\u043b\u0438 \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0435.\"\"\"\n\n        current_user_credential = host.get_current_user_credential()\n\n        name = current_user_credential[\"login\"]\n        text_to_check = f\"\u0418\u043c\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f: {name}\"\n        self.current_user_name.check_have_text(text_to_check,\n                                               f\"Expected text {text_to_check} is missing in user card\")\n\n        role = roles_dict.get(current_user_credential[\"role\"])\n        if role is None:\n            assert False, \"Unknown user role in current user credential\"\n        text_to_check = f\"\u0420\u043e\u043b\u044c: {role}\"\n        self.current_user_role.check_have_text(text_to_check,\n                                               f\"Expected text {text_to_check} is missing in user card\")\n\n        login_time_str = self.login_time.get_text(0)\n        assert login_time_str.find(\"\u0412\u0440\u0435\u043c\u044f \u0432\u0445\u043e\u0434\u0430:\")!= -1, \\\n               \"Expected text '\u0412\u0440\u0435\u043c\u044f \u0432\u0445\u043e\u0434\u0430:' is missing in user card\"\n        session_time_str = self.session_time.get_text(0)\n        assert session_time_str.find(\"\u0412\u0440\u0435\u043c\u044f \u0441\u0435\u0441\u0441\u0438\u0438:\")!= -1, \\\n               \"Expected text '\u0412\u0440\u0435\u043c\u044f \u0441\u0435\u0441\u0441\u0438\u0438:' is missing in user card\"\n\n        self.logout_button.check_visibility(\"Logout button is missing on user card\")\n        self.change_password_button.check_visibility(\"Change password button is missing on user card\")\n        # self.close_button.check_visibility(\"Close button is missing on user card\")\n\n        admin_roles = [\"\u0410\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440\",\n                       \"\u0421\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0441\u0442 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u043e\u043d\u043d\u043e\u0439 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u0438\"]\n        if role in admin_roles:\n            self.settings_button.check_visibility(\"Settings button is missing on user card\")\n
    "},{"location":"components_derived/user_card/#components_derived.user_card.UserCard.__init__","title":"__init__(page)","text":"

    \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 \u043a\u0430\u0440\u0442\u043e\u0447\u043a\u0438.

    Parameters:

    Name Type Description Default page Page

    \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.

    required Source code in components_derived\\user_card.py
    def __init__(self, page: Page):\n    \"\"\"\u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 \u043a\u0430\u0440\u0442\u043e\u0447\u043a\u0438.\n\n    Args:\n        page: \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.\n    \"\"\"\n\n    super().__init__(page)\n\n    card_locator = page.locator(UserCardLocators.CARD_USER)\n\n    self.current_user_name = Text(page,\n                                  card_locator.locator(\"xpath=/div/div[2]\"),\n                                  \"current user name\")\n    self.current_user_role = Text(page,\n                                  card_locator.locator(\"xpath=/div/div[3]\"),\n                                  \"current user role\")\n    self.login_time = Text(page,\n                           card_locator.locator(\"xpath=/div/div[4]\"),\n                           \"login time\")\n    self.session_time = Text(page,\n                             card_locator.locator(\"xpath=/div/div[5]\"),\n                             \"current user name\")\n    self.logout_button = Button(\n        page,\n        page.get_by_role(\"button\", name=\"\u0412\u044b\u0439\u0442\u0438\"),\n        \"logout button\"\n    )\n    self.change_password_button = Button(\n        page,\n        page.get_by_role(\"button\", name=\"\u0418\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u043f\u0430\u0440\u043e\u043b\u044c\"),\n        \"change password button\"\n    )\n    self.settings_button = Button(\n        page,\n        page.get_by_role(\"button\", name=\"\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438\"),\n        \"settings button\"\n    )\n\n    # self.close_button = Button(\n    #     page,\n    #     page.get_by_role(\"button\", name=\"\u0417\u0430\u043a\u0440\u044b\u0442\u044c\"),\n    #     \"close button\"\n    # )\n\n    # \u043e\u043a\u043d\u0430, \u043e\u0442\u0440\u044b\u0432\u0430\u0435\u043c\u044b\u0435 \u043f\u043e\u0441\u043b\u0435 \u043d\u0430\u0436\u0430\u0442\u0438\u044f \u043a\u043d\u043e\u043f\u043e\u043a\n    self.user_settings_dialog_window = UserSettingsDialogWindow(page)\n    self.change_password_modal_window = ChangePasswordModalWindow(page)\n
    "},{"location":"components_derived/user_card/#components_derived.user_card.UserCard.check_content","title":"check_content()","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0438 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0441\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u043a\u0430\u0440\u0442\u043e\u0447\u043a\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0432 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u0435\u0433\u043e \u0440\u043e\u043b\u0438 \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0435.

    Source code in components_derived\\user_card.py
    def check_content(self) -> None:\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0438 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0441\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u043a\u0430\u0440\u0442\u043e\u0447\u043a\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\n       \u0432 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u0435\u0433\u043e \u0440\u043e\u043b\u0438 \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0435.\"\"\"\n\n    current_user_credential = host.get_current_user_credential()\n\n    name = current_user_credential[\"login\"]\n    text_to_check = f\"\u0418\u043c\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f: {name}\"\n    self.current_user_name.check_have_text(text_to_check,\n                                           f\"Expected text {text_to_check} is missing in user card\")\n\n    role = roles_dict.get(current_user_credential[\"role\"])\n    if role is None:\n        assert False, \"Unknown user role in current user credential\"\n    text_to_check = f\"\u0420\u043e\u043b\u044c: {role}\"\n    self.current_user_role.check_have_text(text_to_check,\n                                           f\"Expected text {text_to_check} is missing in user card\")\n\n    login_time_str = self.login_time.get_text(0)\n    assert login_time_str.find(\"\u0412\u0440\u0435\u043c\u044f \u0432\u0445\u043e\u0434\u0430:\")!= -1, \\\n           \"Expected text '\u0412\u0440\u0435\u043c\u044f \u0432\u0445\u043e\u0434\u0430:' is missing in user card\"\n    session_time_str = self.session_time.get_text(0)\n    assert session_time_str.find(\"\u0412\u0440\u0435\u043c\u044f \u0441\u0435\u0441\u0441\u0438\u0438:\")!= -1, \\\n           \"Expected text '\u0412\u0440\u0435\u043c\u044f \u0441\u0435\u0441\u0441\u0438\u0438:' is missing in user card\"\n\n    self.logout_button.check_visibility(\"Logout button is missing on user card\")\n    self.change_password_button.check_visibility(\"Change password button is missing on user card\")\n    # self.close_button.check_visibility(\"Close button is missing on user card\")\n\n    admin_roles = [\"\u0410\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440\",\n                   \"\u0421\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0441\u0442 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u043e\u043d\u043d\u043e\u0439 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u0438\"]\n    if role in admin_roles:\n        self.settings_button.check_visibility(\"Settings button is missing on user card\")\n
    "},{"location":"components_derived/user_card/#components_derived.user_card.UserCard.click_change_password_button","title":"click_change_password_button()","text":"

    \u041d\u0430\u0436\u0438\u043c\u0430\u0435\u0442 \u043a\u043d\u043e\u043f\u043a\u0443 \u043e\u0442\u043a\u0440\u044b\u0442\u0438\u044f \u043e\u043a\u043d\u0430 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u043f\u0430\u0440\u043e\u043b\u044f.

    \u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u043a\u043b\u0438\u043a \u043f\u043e \u043a\u043d\u043e\u043f\u043a\u0435 '\u0418\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u043f\u0430\u0440\u043e\u043b\u044c' \u0432 \u043a\u0430\u0440\u0442\u043e\u0447\u043a\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.

    Source code in components_derived\\user_card.py
    def click_change_password_button(self) -> ChangePasswordModalWindow:\n    \"\"\"\u041d\u0430\u0436\u0438\u043c\u0430\u0435\u0442 \u043a\u043d\u043e\u043f\u043a\u0443 \u043e\u0442\u043a\u0440\u044b\u0442\u0438\u044f \u043e\u043a\u043d\u0430 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u043f\u0430\u0440\u043e\u043b\u044f.\n\n    \u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u043a\u043b\u0438\u043a \u043f\u043e \u043a\u043d\u043e\u043f\u043a\u0435 '\u0418\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u043f\u0430\u0440\u043e\u043b\u044c' \u0432 \u043a\u0430\u0440\u0442\u043e\u0447\u043a\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\n    \"\"\"\n\n    self.change_password_button.click()\n    return self.change_password_modal_window\n
    "},{"location":"components_derived/user_card/#components_derived.user_card.UserCard.click_logout_button","title":"click_logout_button()","text":"

    \u041d\u0430\u0436\u0438\u043c\u0430\u0435\u0442 \u043a\u043d\u043e\u043f\u043a\u0443 \u0432\u044b\u0445\u043e\u0434\u0430 \u0438\u0437 \u0441\u0438\u0441\u0442\u0435\u043c\u044b.

    \u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u043a\u043b\u0438\u043a \u043f\u043e \u043a\u043d\u043e\u043f\u043a\u0435 '\u0412\u044b\u0439\u0442\u0438' \u0432 \u043a\u0430\u0440\u0442\u043e\u0447\u043a\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.

    Source code in components_derived\\user_card.py
    def click_logout_button(self) -> None:\n    \"\"\"\u041d\u0430\u0436\u0438\u043c\u0430\u0435\u0442 \u043a\u043d\u043e\u043f\u043a\u0443 \u0432\u044b\u0445\u043e\u0434\u0430 \u0438\u0437 \u0441\u0438\u0441\u0442\u0435\u043c\u044b.\n\n    \u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u043a\u043b\u0438\u043a \u043f\u043e \u043a\u043d\u043e\u043f\u043a\u0435 '\u0412\u044b\u0439\u0442\u0438' \u0432 \u043a\u0430\u0440\u0442\u043e\u0447\u043a\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\n    \"\"\"\n\n    self.logout_button.click()\n
    "},{"location":"components_derived/user_card/#components_derived.user_card.UserCard.click_settings_button","title":"click_settings_button()","text":"

    \u041d\u0430\u0436\u0438\u043c\u0430\u0435\u0442 \u043a\u043d\u043e\u043f\u043a\u0443 \u043e\u0442\u043a\u0440\u044b\u0442\u0438\u044f \u043e\u043a\u043d\u0430 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0445 \u0441\u0435\u0441\u0441\u0438\u0439.

    \u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u043a\u043b\u0438\u043a \u043f\u043e \u043a\u043d\u043e\u043f\u043a\u0435 '\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438' \u0432 \u043a\u0430\u0440\u0442\u043e\u0447\u043a\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.

    Source code in components_derived\\user_card.py
    def click_settings_button(self) -> UserSettingsDialogWindow:\n    \"\"\"\u041d\u0430\u0436\u0438\u043c\u0430\u0435\u0442 \u043a\u043d\u043e\u043f\u043a\u0443 \u043e\u0442\u043a\u0440\u044b\u0442\u0438\u044f \u043e\u043a\u043d\u0430 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0445 \u0441\u0435\u0441\u0441\u0438\u0439.\n\n    \u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u043a\u043b\u0438\u043a \u043f\u043e \u043a\u043d\u043e\u043f\u043a\u0435 '\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438' \u0432 \u043a\u0430\u0440\u0442\u043e\u0447\u043a\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\n    \"\"\"\n\n    self.settings_button.click()\n    return self.user_settings_dialog_window\n
    "},{"location":"config/add_docstring/","title":"\u0422\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u044f \u043f\u0440\u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0438 docstring","text":"

    \u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 Docstring

    "},{"location":"config/add_docstring/#_1","title":"\u0418\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u0441\u043e\u0431\u043b\u044e\u0434\u0430\u044f \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u044f:","text":"
    1. \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u044e\u0449\u0438\u0435 \u0438 \u0443\u043b\u0443\u0447\u0448\u0438\u0442\u044c \u0438\u043c\u0435\u044e\u0449\u0438\u0435\u0441\u044f docstrings \u044f\u0437\u044b\u043a \u0440\u0443\u0441\u0441\u043a\u0438\u0439.

    2. \u0421\u0434\u0435\u043b\u0430\u0442\u044c docstring \u0431\u043e\u043b\u0435\u0435 \u043a\u043e\u043c\u043f\u0430\u043a\u0442\u043d\u044b\u043c\u0438, \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0432 \u0432\u0441\u044e \u0432\u0430\u0436\u043d\u0443\u044e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e.

    3. \u041e\u0433\u0440\u0430\u043d\u0438\u0447\u0438\u0442\u044c \u0432 docstring \u0434\u043b\u0438\u043d\u0443 \u0441\u0442\u0440\u043e\u043a 79 \u0441\u0438\u043c\u0432\u043e\u043b\u0430\u043c\u0438.

    4. \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c docstring \u043f\u0435\u0440\u0435\u0434 \u0438\u043c\u043f\u043e\u0440\u0442\u0430\u043c\u0438.

    5. \u0414\u043e\u043b\u0436\u043d\u0430 \u0431\u044b\u0442\u044c \u043f\u0443\u0441\u0442\u0430\u044f \u0441\u0442\u0440\u043e\u043a\u0430 \u043f\u043e\u0441\u043b\u0435 \u043a\u0430\u0436\u0434\u043e\u0433\u043e docstring.

    6. \u0421\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0432\u0441\u0435 \u0442\u0435\u043a\u0443\u0449\u0438\u0435 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0438.

    7. \u0417\u0430\u043f\u0440\u0435\u0449\u0435\u043d\u043e \u0438\u0437\u043c\u0435\u043d\u044f\u0442\u044c \u043a\u043e\u0434 (\u0438\u0437\u043c\u0435\u043d\u044f\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e docstring).

    8. \u041d\u0435 \u0443\u0434\u0430\u043b\u044f\u0442\u044c \u043f\u0443\u0441\u0442\u044b\u0435 \u0441\u0442\u0440\u043e\u043a\u0438.

    9. \u0412 \u043a\u043e\u043d\u0446\u0435 \u043a\u043e\u0434\u0430 \u0434\u043e\u043b\u0436\u043d\u0430 \u0431\u044b\u0442\u044c \u043e\u0434\u043d\u0430 \u043f\u0443\u0441\u0442\u0430\u044f \u0441\u0442\u0440\u043e\u043a\u0430.

    "},{"location":"config/add_docstring/#docstring-deepseek","title":"\u041f\u0440\u0438\u043c\u0435\u0440 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f Docstring \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0418\u0418 \"DeepSeek\":","text":"
    • \u0417\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c: DeepSeek \u0444\u0430\u0439\u043b \u043f\u0440\u043e\u0435\u043a\u0442\u0430 my_name.py \u0438 docs/config/add_docstring.md.
    • \u0417\u0430\u043f\u0440\u043e\u0441\u0438\u0442\u044c: \u0418\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u0441\u0442\u0440\u043e\u0433\u043e \u0441\u043e\u0431\u043b\u044e\u0434\u0430\u044f \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u044f,\u0432\u044b\u0432\u0435\u0441\u0442\u0438 \u043f\u043e\u043b\u043d\u044b\u0439 \u0438\u0437\u043c\u0435\u043d\u0451\u043d\u043d\u044b\u0439 \u043a\u043e\u0434 \u0438 \u043e\u0442\u0447\u0435\u0442 \u043e \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0438 \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u0439.
    • \u041f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435\u043c \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439 \u0441\u0434\u0435\u043b\u0430\u043d\u043d\u044b\u043c\u0438 \u0432 \u043a\u043e\u0434\u0435 \u0418\u0418 \"DeepSeek\" \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e notepad++.
    "},{"location":"config/code_development_process/","title":"\u041f\u0440\u043e\u0446\u0435\u0441\u0441 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u043a\u043e\u0434\u0430","text":"

    \u0414\u043e\u043a\u0443\u043c\u0435\u043d\u0442 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c

    "},{"location":"config/mkdocs_guide/","title":"\u0414\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f \u043f\u0440\u043e\u0435\u043a\u0442\u0430: \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 MkDocs \u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438 \u041a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430 UI \"alert_component.py\"","text":""},{"location":"config/mkdocs_guide/#1","title":"1 \u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u043f\u0440\u043e\u0435\u043a\u0442\u0430","text":"
    nms_tests/\n\u251c\u2500\u2500 docs/\n\u2502 \u251c\u2500\u2500 components/\n\u2502 \u2502 \u2514\u2500\u2500 alert_component.md\n\u2502 \u2514\u2500\u2500 index.md\n\u251c\n\u251c\u2500\u2500 components/\n\u2502 \u2514\u2500\u2500 alert_component.py\n\u2514\u2500\u2500 mkdocs.yml\n
    "},{"location":"config/mkdocs_guide/#2-mkdocs","title":"2 \u0418\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f \u043f\u043e \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0435 MkDocs","text":""},{"location":"config/mkdocs_guide/#21","title":"2.1 \u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439","text":"

    powershell pip install mkdocs mkdocs-material mkdocstrings mkdocstrings-python

    "},{"location":"config/mkdocs_guide/#22","title":"2.2 \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043f\u0440\u043e\u0435\u043a\u0442\u0430","text":"

    powershell mkdocs new .

    "},{"location":"config/mkdocs_guide/#3","title":"3 \u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438","text":""},{"location":"config/mkdocs_guide/#31-docstrings-alert-alert_componentpy","title":"3.1 \u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0435\u0432 docstrings \u0432 \u041a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 Alert (alert_component.py)","text":"
    python\n\"\"\"\u041c\u043e\u0434\u0443\u043b\u044c \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043e\u043c alert-\u043e\u043a\u043d\u0430 \u0432 Playwright.\n\n\u0421\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043a\u043b\u0430\u0441\u0441 AlertComponent \u0434\u043b\u044f \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0441 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u043c\u0438 \u0442\u0438\u043f\u0430\u043c\u0438\nalert-\u043e\u043a\u043e\u043d (error, success, info, warning) \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0438\u0445 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f.\n\"\"\"\n\nfrom playwright.sync_api import Page, expect\nfrom tools.logger import get_logger\nfrom elements.text_element import Text\nfrom components.base_component import BaseComponent\n\nlogger = get_logger(\"ALERT\")\n\nclass AlertComponent(BaseComponent):\n    \"\"\"\u041a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 alert-\u043e\u043a\u043d\u0430\u043c\u0438 Playwright.\n\n    \u041f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u0442\u0438\u043f\u044b: error, success, info, warning.\n    \u041f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0442\u044c \u043d\u0430\u043b\u0438\u0447\u0438\u0435, \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u0435 \u0438 \u0442\u0435\u043a\u0441\u0442 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439.\n    \"\"\"\n\n    # ... (\u043f\u043e\u043b\u043d\u044b\u0439 \u043a\u043e\u0434 \u043a\u043b\u0430\u0441\u0441\u0430 \u0438\u0437 \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0433\u043e \u0444\u0430\u0439\u043b\u0430)\n
    "},{"location":"config/mkdocs_guide/#32-mkdocs-mkdocsyml","title":"3.2 \u041a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f MkDocs (mkdocs.yml)","text":"
    yaml\nsite_name: \u0414\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f \u0442\u0435\u0441\u0442\u043e\u0432\ntheme:\n  name: material\n\nplugins:\n  - search\n  - mkdocstrings:\n      default_handler: python\n      handlers:\n        python:\n          paths: [\".\", \"pages\"]\n          options:\n            show_source: true\n\nnav:\n  - \u0413\u043b\u0430\u0432\u043d\u0430\u044f: index.md\n  - \u041a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u044b UI:\n    - AlertComponent: components/alert_component.md\n  # ... (\u043e\u0441\u0442\u0430\u043b\u044c\u043d\u0430\u044f \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438)\n
    "},{"location":"config/mkdocs_guide/#33-alert","title":"3.3 \u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0444\u0430\u0439\u043b\u0430 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u041a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430 Alert","text":"

    docs/components/alert_component.md:

    markdown\n# AlertComponent\n\n::: components.alert_component:AlertComponent\n    handler: python\n    options:\n      show_source: true\n      heading_level: 2\n
    "},{"location":"config/mkdocs_guide/#4","title":"4 \u0420\u0430\u0431\u043e\u0442\u0430 \u0441 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0435\u0439.","text":""},{"location":"config/mkdocs_guide/#41","title":"4.1 \u041f\u0440\u043e\u0441\u043c\u043e\u0442\u0440 \u0432 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u043c \u0432\u0440\u0435\u043c\u0435\u043d\u0438","text":"

    bash

    mkdocs serve

    "},{"location":"config/mkdocs_guide/#42","title":"4.2 \u0421\u0431\u043e\u0440\u043a\u0430 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438","text":"

    bash

    rmdir /s /q site # \u041e\u0447\u0438\u0441\u0442\u043a\u0430 \u043a\u044d\u0448\u0430

    mkdocs build # \u041f\u0435\u0440\u0435\u0441\u0431\u043e\u0440\u043a\u0430

    "},{"location":"config/mkdocs_guide/#5","title":"5 \u0427\u0430\u0441\u0442\u044b\u0435 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u0438 \u0440\u0435\u0448\u0435\u043d\u0438\u044f","text":"

    \u041e\u0448\u0438\u0431\u043a\u0438 \u0438\u043c\u043f\u043e\u0440\u0442\u0430:

    • \u0423\u0431\u0435\u0434\u0438\u0442\u0435\u0441\u044c \u0432 \u043d\u0430\u043b\u0438\u0447\u0438\u0438 init.py \u0432 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044f\u0445.

    • \u041f\u0440\u043e\u0432\u0435\u0440\u044c\u0442\u0435 \u043f\u0443\u0442\u0438 \u0432 mkdocs.yml.

    \u041f\u0440\u0435\u0434\u0443\u043f\u0440\u0435\u0436\u0434\u0435\u043d\u0438\u044f \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u0438 \u0442\u0438\u043f\u043e\u0432 \u0434\u043b\u044f \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430:

    \u0423\u0431\u0435\u0434\u0438\u0442\u0435\u0441\u044c \u0432 \u043d\u0430\u043b\u0438\u0447\u0438\u0438 \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u0438 \u0442\u0438\u043f\u043e\u0432 \u0434\u043b\u044f \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430.

    "},{"location":"config/mkdocs_guide/#6","title":"6 \u0417\u0430\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435","text":"

    \u0414\u043b\u044f \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438 \u043f\u043e\u0441\u043b\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439 \u0432 \u043a\u043e\u0434\u0435:

    • \u0412\u043d\u0435\u0441\u0438\u0442\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0432 docstrings Python-\u043a\u043e\u0434\u0430.

    • \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u0435 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435 .md-\u0444\u0430\u0439\u043b\u044b.

    • \u041f\u0435\u0440\u0435\u0441\u043e\u0431\u0435\u0440\u0438\u0442\u0435 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044e.

    "},{"location":"data/constants/","title":"Constants","text":"

    \u041c\u043e\u0434\u0443\u043b\u044c constants \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0438 \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u044b \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f.

    \u041e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u043a\u043b\u0430\u0441\u0441 Constants \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u043c \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u043c \u0434\u043b\u044f \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 \u0438 \u0434\u0440\u0443\u0433\u0438\u0445 \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043a.

    "},{"location":"data/constants/#data.constants.Constants","title":"Constants","text":"

    \u0425\u0440\u0430\u043d\u0438\u0442 \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u044b \u0438 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f.

    \u041f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0438\u0437 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f. \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438.

    \u0410\u0442\u0440\u0438\u0431\u0443\u0442\u044b

    login (str): \u041b\u043e\u0433\u0438\u043d \u0434\u043b\u044f \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438. password (str): \u041f\u0430\u0440\u043e\u043b\u044c \u0434\u043b\u044f \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438.

    Source code in data\\constants.py
    class Constants:\n    \"\"\"\u0425\u0440\u0430\u043d\u0438\u0442 \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u044b \u0438 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f.\n\n\n    \u041f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0438\u0437 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f. \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438.\n\n    \u0410\u0442\u0440\u0438\u0431\u0443\u0442\u044b:\n        login (str): \u041b\u043e\u0433\u0438\u043d \u0434\u043b\u044f \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438.\n        password (str): \u041f\u0430\u0440\u043e\u043b\u044c \u0434\u043b\u044f \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438.\n    \"\"\"\n\n    try:\n        login = os.getenv('AUTH_LOGIN')\n        password = os.getenv('AUTH_PASSWORD')\n    except KeyError:\n        print(\"LOGIN OR PASSWORD WASN'T FOUND\")\n
    "},{"location":"data/environment/","title":"Environment","text":"

    \u041c\u043e\u0434\u0443\u043b\u044c environment \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f \u0438 URL-\u0430\u0434\u0440\u0435\u0441\u043e\u0432.

    \u041a\u043b\u0430\u0441\u0441 Environment \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u043c\u0435\u0442\u043e\u0434\u044b \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0435\u043c, \u0442\u043e\u043a\u0435\u043d\u0430\u043c\u0438 \u0438 URL-\u0430\u0434\u0440\u0435\u0441\u0430\u043c\u0438 API.

    "},{"location":"data/environment/#data.environment.Environment","title":"Environment","text":"

    \u0423\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0435\u043c, URL-\u0430\u0434\u0440\u0435\u0441\u0430\u043c\u0438 \u0438 \u0442\u043e\u043a\u0435\u043d\u0430\u043c\u0438.

    \u0410\u0442\u0440\u0438\u0431\u0443\u0442\u044b \u043a\u043b\u0430\u0441\u0441\u0430

    TEST (str): \u041a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u0430 \u0434\u043b\u044f \u0442\u0435\u0441\u0442\u043e\u0432\u043e\u0433\u043e \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f. DEVELOP (str): \u041a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u0430 \u0434\u043b\u044f dev-\u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f. URLS (Dict[str, str]): \u0421\u043b\u043e\u0432\u0430\u0440\u044c URL \u0434\u043b\u044f \u0440\u0430\u0437\u043d\u044b\u0445 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0439.

    Source code in data\\environment.py
    class Environment:\n    \"\"\"\u0423\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0435\u043c, URL-\u0430\u0434\u0440\u0435\u0441\u0430\u043c\u0438 \u0438 \u0442\u043e\u043a\u0435\u043d\u0430\u043c\u0438.\n\n    \u0410\u0442\u0440\u0438\u0431\u0443\u0442\u044b \u043a\u043b\u0430\u0441\u0441\u0430:\n        TEST (str): \u041a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u0430 \u0434\u043b\u044f \u0442\u0435\u0441\u0442\u043e\u0432\u043e\u0433\u043e \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f.\n        DEVELOP (str): \u041a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u0430 \u0434\u043b\u044f dev-\u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f.\n        URLS (Dict[str, str]): \u0421\u043b\u043e\u0432\u0430\u0440\u044c URL \u0434\u043b\u044f \u0440\u0430\u0437\u043d\u044b\u0445 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0439.\n    \"\"\"\n\n    TEST: str = 'test'\n    DEVELOP: str = 'develop'\n\n    URLS: Dict[str, str] = {\n        TEST: 'http://192.168.2.76/',\n        DEVELOP: 'http://192.168.2.69/'\n    }\n\n    def __init__(self) -> None:\n        \"\"\"\u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442 \u043e\u0431\u044a\u0435\u043a\u0442 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f \u0438 \u0442\u043e\u043a\u0435\u043d\u044b.\"\"\"\n\n        try:\n            self.env: str = os.getenv('ENV', self.TEST)\n            self.current_user_credential = {}\n        except KeyError:\n            self.env: str = self.TEST\n\n    def get_base_url(self) -> str:\n        \"\"\"\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0431\u0430\u0437\u043e\u0432\u044b\u0439 URL \u0434\u043b\u044f \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f.\n\n        \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442:\n            str: \u0411\u0430\u0437\u043e\u0432\u044b\u0439 URL \u0441 \u043f\u0443\u0442\u0435\u043c \u0434\u043b\u044f \u0442\u0435\u0441\u0442\u0430 \u0438\u043b\u0438 \u0431\u0435\u0437 \u043d\u0435\u0433\u043e.\n        \"\"\"\n\n        if self.env in self.URLS:\n            if self.env == self.TEST:\n                return self.URLS[self.env] + \"e-nms-ui/\"\n            return self.URLS[self.env]\n        raise Exception(f\"Unknown value of ENV variable {self.env}\")\n\n    def get_env_name(self) -> str:\n        \"\"\"\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0438\u043c\u044f \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f.\n\n        \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442:\n            str: \u0438\u043c\u044f \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f.\n        \"\"\"\n        return self.env\n\n    def get_request_url(self) -> str:\n        \"\"\"\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 URL \u0434\u043b\u044f API-\u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432.\n\n        \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442:\n            str: URL \u0434\u043b\u044f API-\u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432.\n        \"\"\"\n\n        if self.env in self.URLS:\n            return self.URLS[self.env]\n        raise Exception(f\"Unknown value of ENV variable {self.env}\")\n\n    def set_current_user_credential(self, credential: {}) -> None:\n        \"\"\"\u0421\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u0442 \u0443\u0447\u0435\u0442\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\n\n        \u0410\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u044b:\n            credential ({}): \u0423\u0447\u0435\u0442\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\n        \"\"\"\n\n        self.current_user_credential = credential\n\n    def get_access_token(self) -> str:\n        \"\"\"\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0442\u0435\u043a\u0443\u0449\u0438\u0439 \u0442\u043e\u043a\u0435\u043d \u0434\u043e\u0441\u0442\u0443\u043f\u0430.\n\n        \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442:\n            str: \u0422\u0435\u043a\u0443\u0449\u0438\u0439 \u0442\u043e\u043a\u0435\u043d \u0434\u043e\u0441\u0442\u0443\u043f\u0430.\n        \"\"\"\n\n        return self.current_user_credential.get(\"access_token\")\n\n    def get_current_user_name(self) -> str:\n        \"\"\"\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0438\u043c\u044f \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\n\n        \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442:\n            str: \u0418\u043c\u044f \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\n        \"\"\"\n\n        return self.current_user_credential.get(\"login\")\n\n    def get_current_user_role(self) -> str:\n        \"\"\"\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0440\u043e\u043b\u044c \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\n\n        \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442:\n            str: \u0420\u043e\u043b\u044c \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\n        \"\"\"\n\n        return self.current_user_credential.get(\"role\")\n\n    def get_current_user_id(self) -> str:\n        \"\"\"\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 id \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\n\n        \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442:\n            str: id \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\n        \"\"\"\n\n        return self.current_user_credential.get(\"$id\")\n\n    def get_current_user_credential(self) -> {}:\n        \"\"\"\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0443\u0447\u0435\u0442\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\"\"\"\n\n        return self.current_user_credential\n
    "},{"location":"data/environment/#data.environment.Environment.__init__","title":"__init__()","text":"

    \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442 \u043e\u0431\u044a\u0435\u043a\u0442 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f \u0438 \u0442\u043e\u043a\u0435\u043d\u044b.

    Source code in data\\environment.py
    def __init__(self) -> None:\n    \"\"\"\u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442 \u043e\u0431\u044a\u0435\u043a\u0442 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f \u0438 \u0442\u043e\u043a\u0435\u043d\u044b.\"\"\"\n\n    try:\n        self.env: str = os.getenv('ENV', self.TEST)\n        self.current_user_credential = {}\n    except KeyError:\n        self.env: str = self.TEST\n
    "},{"location":"data/environment/#data.environment.Environment.get_access_token","title":"get_access_token()","text":"

    \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0442\u0435\u043a\u0443\u0449\u0438\u0439 \u0442\u043e\u043a\u0435\u043d \u0434\u043e\u0441\u0442\u0443\u043f\u0430.

    \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442

    str: \u0422\u0435\u043a\u0443\u0449\u0438\u0439 \u0442\u043e\u043a\u0435\u043d \u0434\u043e\u0441\u0442\u0443\u043f\u0430.

    Source code in data\\environment.py
    def get_access_token(self) -> str:\n    \"\"\"\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0442\u0435\u043a\u0443\u0449\u0438\u0439 \u0442\u043e\u043a\u0435\u043d \u0434\u043e\u0441\u0442\u0443\u043f\u0430.\n\n    \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442:\n        str: \u0422\u0435\u043a\u0443\u0449\u0438\u0439 \u0442\u043e\u043a\u0435\u043d \u0434\u043e\u0441\u0442\u0443\u043f\u0430.\n    \"\"\"\n\n    return self.current_user_credential.get(\"access_token\")\n
    "},{"location":"data/environment/#data.environment.Environment.get_base_url","title":"get_base_url()","text":"

    \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0431\u0430\u0437\u043e\u0432\u044b\u0439 URL \u0434\u043b\u044f \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f.

    \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442

    str: \u0411\u0430\u0437\u043e\u0432\u044b\u0439 URL \u0441 \u043f\u0443\u0442\u0435\u043c \u0434\u043b\u044f \u0442\u0435\u0441\u0442\u0430 \u0438\u043b\u0438 \u0431\u0435\u0437 \u043d\u0435\u0433\u043e.

    Source code in data\\environment.py
    def get_base_url(self) -> str:\n    \"\"\"\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0431\u0430\u0437\u043e\u0432\u044b\u0439 URL \u0434\u043b\u044f \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f.\n\n    \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442:\n        str: \u0411\u0430\u0437\u043e\u0432\u044b\u0439 URL \u0441 \u043f\u0443\u0442\u0435\u043c \u0434\u043b\u044f \u0442\u0435\u0441\u0442\u0430 \u0438\u043b\u0438 \u0431\u0435\u0437 \u043d\u0435\u0433\u043e.\n    \"\"\"\n\n    if self.env in self.URLS:\n        if self.env == self.TEST:\n            return self.URLS[self.env] + \"e-nms-ui/\"\n        return self.URLS[self.env]\n    raise Exception(f\"Unknown value of ENV variable {self.env}\")\n
    "},{"location":"data/environment/#data.environment.Environment.get_current_user_credential","title":"get_current_user_credential()","text":"

    \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0443\u0447\u0435\u0442\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.

    Source code in data\\environment.py
    def get_current_user_credential(self) -> {}:\n    \"\"\"\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0443\u0447\u0435\u0442\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\"\"\"\n\n    return self.current_user_credential\n
    "},{"location":"data/environment/#data.environment.Environment.get_current_user_id","title":"get_current_user_id()","text":"

    \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 id \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.

    \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442

    str: id \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.

    Source code in data\\environment.py
    def get_current_user_id(self) -> str:\n    \"\"\"\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 id \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\n\n    \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442:\n        str: id \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\n    \"\"\"\n\n    return self.current_user_credential.get(\"$id\")\n
    "},{"location":"data/environment/#data.environment.Environment.get_current_user_name","title":"get_current_user_name()","text":"

    \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0438\u043c\u044f \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.

    \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442

    str: \u0418\u043c\u044f \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.

    Source code in data\\environment.py
    def get_current_user_name(self) -> str:\n    \"\"\"\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0438\u043c\u044f \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\n\n    \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442:\n        str: \u0418\u043c\u044f \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\n    \"\"\"\n\n    return self.current_user_credential.get(\"login\")\n
    "},{"location":"data/environment/#data.environment.Environment.get_current_user_role","title":"get_current_user_role()","text":"

    \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0440\u043e\u043b\u044c \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.

    \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442

    str: \u0420\u043e\u043b\u044c \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.

    Source code in data\\environment.py
    def get_current_user_role(self) -> str:\n    \"\"\"\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0440\u043e\u043b\u044c \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\n\n    \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442:\n        str: \u0420\u043e\u043b\u044c \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\n    \"\"\"\n\n    return self.current_user_credential.get(\"role\")\n
    "},{"location":"data/environment/#data.environment.Environment.get_env_name","title":"get_env_name()","text":"

    \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0438\u043c\u044f \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f.

    \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442

    str: \u0438\u043c\u044f \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f.

    Source code in data\\environment.py
    def get_env_name(self) -> str:\n    \"\"\"\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0438\u043c\u044f \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f.\n\n    \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442:\n        str: \u0438\u043c\u044f \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f.\n    \"\"\"\n    return self.env\n
    "},{"location":"data/environment/#data.environment.Environment.get_request_url","title":"get_request_url()","text":"

    \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 URL \u0434\u043b\u044f API-\u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432.

    \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442

    str: URL \u0434\u043b\u044f API-\u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432.

    Source code in data\\environment.py
    def get_request_url(self) -> str:\n    \"\"\"\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 URL \u0434\u043b\u044f API-\u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432.\n\n    \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442:\n        str: URL \u0434\u043b\u044f API-\u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432.\n    \"\"\"\n\n    if self.env in self.URLS:\n        return self.URLS[self.env]\n    raise Exception(f\"Unknown value of ENV variable {self.env}\")\n
    "},{"location":"data/environment/#data.environment.Environment.set_current_user_credential","title":"set_current_user_credential(credential)","text":"

    \u0421\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u0442 \u0443\u0447\u0435\u0442\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.

    \u0410\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u044b

    credential ({}): \u0423\u0447\u0435\u0442\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.

    Source code in data\\environment.py
    def set_current_user_credential(self, credential: {}) -> None:\n    \"\"\"\u0421\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u0442 \u0443\u0447\u0435\u0442\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\n\n    \u0410\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u044b:\n        credential ({}): \u0423\u0447\u0435\u0442\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\n    \"\"\"\n\n    self.current_user_credential = credential\n
    "},{"location":"data/roles_dict/","title":"Roles_dict","text":"

    \u041c\u043e\u0434\u0443\u043b\u044c roles_dict \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0441\u043b\u043e\u0432\u0430\u0440\u044c \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u044f \u0440\u043e\u043b\u0435\u0439.

    \u0421\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0441\u043e\u043f\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0445 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0439 \u0440\u043e\u043b\u0435\u0439 \u0441 \u0438\u0445 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0435\u043c\u044b\u043c\u0438 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u044f\u043c\u0438.

    "},{"location":"elements/base_element/","title":"BaseElement","text":"

    \u041c\u043e\u0434\u0443\u043b\u044c base_element \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0431\u0430\u0437\u043e\u0432\u044b\u0439 \u043a\u043b\u0430\u0441\u0441 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u043c\u0438 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b.

    \u041a\u043b\u0430\u0441\u0441 BaseElement \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u043c\u0435\u0442\u043e\u0434\u044b \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0441 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u043c\u0438 \u0438 \u0438\u0445 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0447\u0435\u0440\u0435\u0437 Playwright.

    "},{"location":"elements/base_element/#elements.base_element.BaseElement","title":"BaseElement","text":"

    \u0411\u0430\u0437\u043e\u0432\u044b\u0439 \u043a\u043b\u0430\u0441\u0441 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u043c\u0438 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u0447\u0435\u0440\u0435\u0437 Playwright.

    \u041f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u043c\u0435\u0442\u043e\u0434\u044b \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0441 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u043c\u0438: \u043a\u043b\u0438\u043a\u0438, \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0442\u0435\u043a\u0441\u0442\u0430, \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u0435 \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f.

    Source code in elements\\base_element.py
    class BaseElement:\n    \"\"\"\u0411\u0430\u0437\u043e\u0432\u044b\u0439 \u043a\u043b\u0430\u0441\u0441 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u043c\u0438 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u0447\u0435\u0440\u0435\u0437 Playwright.\n\n    \u041f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u043c\u0435\u0442\u043e\u0434\u044b \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0441 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u043c\u0438:\n    \u043a\u043b\u0438\u043a\u0438, \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0442\u0435\u043a\u0441\u0442\u0430, \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u0435 \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f.\n    \"\"\"\n\n    def __init__(self, page: Page, locator: str | Locator, name: str) -> None:\n        \"\"\"\u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442 \u0431\u0430\u0437\u043e\u0432\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b.\n\n        Args:\n            page: \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright\n            locator: \u041b\u043e\u043a\u0430\u0442\u043e\u0440 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 (\u0441\u0442\u0440\u043e\u043a\u0430 \u0438\u043b\u0438 \u043e\u0431\u044a\u0435\u043a\u0442 Locator)\n            name: \u0418\u043c\u044f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0434\u043b\u044f \u043b\u043e\u0433\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f\n        \"\"\"\n\n        self.page = page\n        self.name = name\n        self.locator: Locator\n\n        if isinstance(locator, Locator):\n            self.locator = locator\n        elif isinstance(locator, str):\n            self.locator = self.page.locator(locator)\n        else:\n            raise TypeError(\"locator value should be string type or Locator type\")\n\n    @property\n    def type_of(self) -> str:\n        \"\"\"\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0442\u0438\u043f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 (\u0434\u043b\u044f \u043b\u043e\u0433\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f).\"\"\"\n\n        return \"base element\"\n\n    # \u0414\u0435\u0439\u0441\u0442\u0432\u0438\u044f:\n    def click(self) -> None:\n        \"\"\"\u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u043a\u043b\u0438\u043a \u043f\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0443.\"\"\"\n\n        logger.info(f\"Clicking {self.type_of} '{self.name}'\")\n        self.locator.click()\n\n    def get_text(self, index: int) -> str:\n        \"\"\"\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0442\u0435\u043a\u0441\u0442 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u043f\u043e \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u043e\u043c\u0443 \u0438\u043d\u0434\u0435\u043a\u0441\u0443.\"\"\"\n\n        logger.info(f\"Get text for {self.type_of} '{self.name}'\")\n        return self.locator.nth(index).text_content()\n\n    def update_locator(self, new_locator: Locator) -> None:\n        \"\"\"\u041c\u0435\u043d\u044f\u0435\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043b\u043e\u043a\u0430\u0442\u043e\u0440\u0430 \u0434\u043b\u044f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\"\"\"\n\n        logger.info(f\"Update locator for {self.type_of} '{self.name}'\")\n        self.locator = new_locator\n\n    def wait_for_element(self, timeout: int = 12000) -> None:\n        \"\"\"\u041e\u0436\u0438\u0434\u0430\u0435\u0442 \u043f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0432 \u0442\u0435\u0447\u0435\u043d\u0438\u0435 \u0437\u0430\u0434\u0430\u043d\u043d\u043e\u0433\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438.\"\"\"\n\n        logger.info(f\"Wait for {self.type_of} '{self.name}'\")\n        self.locator.wait_for(timeout=timeout)\n\n    # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0438:\n    def check_have_text(self, text: str, msg: str) -> None:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u043e\u0433\u043e \u0442\u0435\u043a\u0441\u0442\u0430 \u0432 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0435.\"\"\"\n\n        logger.info(f\"Check that {self.type_of} '{self.name}' has text '{text}'\")\n        expect(self.locator).to_have_text(text), msg\n\n    def check_visibility(self, msg: str) -> None:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u043d\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435.\"\"\"\n\n        logger.info(f\"Check that {self.type_of} '{self.name}' is present\")\n        print(self.locator)\n        expect(self.locator).to_be_visible(visible=True, timeout=12000), msg\n\n    def is_present(self, timeout: int = 5000) -> bool:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0432 \u0442\u0435\u0447\u0435\u043d\u0438\u0435 \u0437\u0430\u0434\u0430\u043d\u043d\u043e\u0433\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438.\"\"\"\n\n        logger.info(f\"Check that {self.type_of} '{self.name}' is present\")\n        try:\n            self.locator.wait_for(timeout=timeout)\n        except TimeoutError:\n            return False\n        return True\n\n    def is_not_present(self, timeout: int = 5000) -> bool:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0432 \u0442\u0435\u0447\u0435\u043d\u0438\u0435 \u0437\u0430\u0434\u0430\u043d\u043d\u043e\u0433\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438.\"\"\"\n\n        logger.info(f\"Check that {self.type_of} '{self.name}' is missing\")\n        try:\n            self.locator.wait_for(timeout=timeout)\n        except TimeoutError:\n            return True\n        return False\n
    "},{"location":"elements/base_element/#elements.base_element.BaseElement.type_of","title":"type_of property","text":"

    \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0442\u0438\u043f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 (\u0434\u043b\u044f \u043b\u043e\u0433\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f).

    "},{"location":"elements/base_element/#elements.base_element.BaseElement.__init__","title":"__init__(page, locator, name)","text":"

    \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442 \u0431\u0430\u0437\u043e\u0432\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b.

    Parameters:

    Name Type Description Default page Page

    \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright

    required locator str | Locator

    \u041b\u043e\u043a\u0430\u0442\u043e\u0440 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 (\u0441\u0442\u0440\u043e\u043a\u0430 \u0438\u043b\u0438 \u043e\u0431\u044a\u0435\u043a\u0442 Locator)

    required name str

    \u0418\u043c\u044f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0434\u043b\u044f \u043b\u043e\u0433\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f

    required Source code in elements\\base_element.py
    def __init__(self, page: Page, locator: str | Locator, name: str) -> None:\n    \"\"\"\u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442 \u0431\u0430\u0437\u043e\u0432\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b.\n\n    Args:\n        page: \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright\n        locator: \u041b\u043e\u043a\u0430\u0442\u043e\u0440 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 (\u0441\u0442\u0440\u043e\u043a\u0430 \u0438\u043b\u0438 \u043e\u0431\u044a\u0435\u043a\u0442 Locator)\n        name: \u0418\u043c\u044f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0434\u043b\u044f \u043b\u043e\u0433\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f\n    \"\"\"\n\n    self.page = page\n    self.name = name\n    self.locator: Locator\n\n    if isinstance(locator, Locator):\n        self.locator = locator\n    elif isinstance(locator, str):\n        self.locator = self.page.locator(locator)\n    else:\n        raise TypeError(\"locator value should be string type or Locator type\")\n
    "},{"location":"elements/base_element/#elements.base_element.BaseElement.check_have_text","title":"check_have_text(text, msg)","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u043e\u0433\u043e \u0442\u0435\u043a\u0441\u0442\u0430 \u0432 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0435.

    Source code in elements\\base_element.py
    def check_have_text(self, text: str, msg: str) -> None:\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u043e\u0433\u043e \u0442\u0435\u043a\u0441\u0442\u0430 \u0432 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0435.\"\"\"\n\n    logger.info(f\"Check that {self.type_of} '{self.name}' has text '{text}'\")\n    expect(self.locator).to_have_text(text), msg\n
    "},{"location":"elements/base_element/#elements.base_element.BaseElement.check_visibility","title":"check_visibility(msg)","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u043d\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435.

    Source code in elements\\base_element.py
    def check_visibility(self, msg: str) -> None:\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u043d\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435.\"\"\"\n\n    logger.info(f\"Check that {self.type_of} '{self.name}' is present\")\n    print(self.locator)\n    expect(self.locator).to_be_visible(visible=True, timeout=12000), msg\n
    "},{"location":"elements/base_element/#elements.base_element.BaseElement.click","title":"click()","text":"

    \u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u043a\u043b\u0438\u043a \u043f\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0443.

    Source code in elements\\base_element.py
    def click(self) -> None:\n    \"\"\"\u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u043a\u043b\u0438\u043a \u043f\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0443.\"\"\"\n\n    logger.info(f\"Clicking {self.type_of} '{self.name}'\")\n    self.locator.click()\n
    "},{"location":"elements/base_element/#elements.base_element.BaseElement.get_text","title":"get_text(index)","text":"

    \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0442\u0435\u043a\u0441\u0442 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u043f\u043e \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u043e\u043c\u0443 \u0438\u043d\u0434\u0435\u043a\u0441\u0443.

    Source code in elements\\base_element.py
    def get_text(self, index: int) -> str:\n    \"\"\"\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0442\u0435\u043a\u0441\u0442 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u043f\u043e \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u043e\u043c\u0443 \u0438\u043d\u0434\u0435\u043a\u0441\u0443.\"\"\"\n\n    logger.info(f\"Get text for {self.type_of} '{self.name}'\")\n    return self.locator.nth(index).text_content()\n
    "},{"location":"elements/base_element/#elements.base_element.BaseElement.is_not_present","title":"is_not_present(timeout=5000)","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0432 \u0442\u0435\u0447\u0435\u043d\u0438\u0435 \u0437\u0430\u0434\u0430\u043d\u043d\u043e\u0433\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438.

    Source code in elements\\base_element.py
    def is_not_present(self, timeout: int = 5000) -> bool:\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0432 \u0442\u0435\u0447\u0435\u043d\u0438\u0435 \u0437\u0430\u0434\u0430\u043d\u043d\u043e\u0433\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438.\"\"\"\n\n    logger.info(f\"Check that {self.type_of} '{self.name}' is missing\")\n    try:\n        self.locator.wait_for(timeout=timeout)\n    except TimeoutError:\n        return True\n    return False\n
    "},{"location":"elements/base_element/#elements.base_element.BaseElement.is_present","title":"is_present(timeout=5000)","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0432 \u0442\u0435\u0447\u0435\u043d\u0438\u0435 \u0437\u0430\u0434\u0430\u043d\u043d\u043e\u0433\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438.

    Source code in elements\\base_element.py
    def is_present(self, timeout: int = 5000) -> bool:\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0432 \u0442\u0435\u0447\u0435\u043d\u0438\u0435 \u0437\u0430\u0434\u0430\u043d\u043d\u043e\u0433\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438.\"\"\"\n\n    logger.info(f\"Check that {self.type_of} '{self.name}' is present\")\n    try:\n        self.locator.wait_for(timeout=timeout)\n    except TimeoutError:\n        return False\n    return True\n
    "},{"location":"elements/base_element/#elements.base_element.BaseElement.update_locator","title":"update_locator(new_locator)","text":"

    \u041c\u0435\u043d\u044f\u0435\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043b\u043e\u043a\u0430\u0442\u043e\u0440\u0430 \u0434\u043b\u044f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430

    Source code in elements\\base_element.py
    def update_locator(self, new_locator: Locator) -> None:\n    \"\"\"\u041c\u0435\u043d\u044f\u0435\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043b\u043e\u043a\u0430\u0442\u043e\u0440\u0430 \u0434\u043b\u044f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\"\"\"\n\n    logger.info(f\"Update locator for {self.type_of} '{self.name}'\")\n    self.locator = new_locator\n
    "},{"location":"elements/base_element/#elements.base_element.BaseElement.wait_for_element","title":"wait_for_element(timeout=12000)","text":"

    \u041e\u0436\u0438\u0434\u0430\u0435\u0442 \u043f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0432 \u0442\u0435\u0447\u0435\u043d\u0438\u0435 \u0437\u0430\u0434\u0430\u043d\u043d\u043e\u0433\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438.

    Source code in elements\\base_element.py
    def wait_for_element(self, timeout: int = 12000) -> None:\n    \"\"\"\u041e\u0436\u0438\u0434\u0430\u0435\u0442 \u043f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0432 \u0442\u0435\u0447\u0435\u043d\u0438\u0435 \u0437\u0430\u0434\u0430\u043d\u043d\u043e\u0433\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438.\"\"\"\n\n    logger.info(f\"Wait for {self.type_of} '{self.name}'\")\n    self.locator.wait_for(timeout=timeout)\n
    "},{"location":"elements/button_element/","title":"Button","text":"

    \u041c\u043e\u0434\u0443\u043b\u044c button_element \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043a\u043b\u0430\u0441\u0441 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u043a\u043d\u043e\u043f\u043a\u0430\u043c\u0438 \u043d\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435.

    \u041a\u043b\u0430\u0441\u0441 Button \u043d\u0430\u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u0431\u0430\u0437\u043e\u0432\u044b\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b BaseElement \u0438 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u0447\u043d\u044b\u0435 \u043c\u0435\u0442\u043e\u0434\u044b \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u043c\u0438 \u0442\u0438\u043f\u0430 '\u043a\u043d\u043e\u043f\u043a\u0430'.

    "},{"location":"elements/button_element/#elements.button_element.Button","title":"Button","text":"

    Bases: BaseElement

    \u041a\u043b\u0430\u0441\u0441 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u043a\u043d\u043e\u043f\u043a\u0430\u043c\u0438 \u043d\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435.

    \u041d\u0430\u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c BaseElement \u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u0447\u043d\u044b\u0435 \u0434\u043b\u044f \u043a\u043d\u043e\u043f\u043e\u043a \u043c\u0435\u0442\u043e\u0434\u044b \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438.

    Source code in elements\\button_element.py
    class Button(BaseElement):\n    \"\"\"\u041a\u043b\u0430\u0441\u0441 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u043a\u043d\u043e\u043f\u043a\u0430\u043c\u0438 \u043d\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435.\n\n    \u041d\u0430\u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c BaseElement \u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u0447\u043d\u044b\u0435\n    \u0434\u043b\u044f \u043a\u043d\u043e\u043f\u043e\u043a \u043c\u0435\u0442\u043e\u0434\u044b \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438.\n    \"\"\"\n\n    @property\n    def type_of(self) -> str:\n        \"\"\"\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0442\u0438\u043f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 ('\u043a\u043d\u043e\u043f\u043a\u0430').\n\n        Returns:\n            str: \u0422\u0438\u043f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 - '\u043a\u043d\u043e\u043f\u043a\u0430'.\n        \"\"\"\n\n        return \"button\"\n\n   # \u0414\u0435\u0439\u0441\u0442\u0432\u0438\u044f:\n    # (\u041c\u0435\u0442\u043e\u0434\u044b \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439 \u0431\u0443\u0434\u0443\u0442 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u044b \u043f\u043e \u043c\u0435\u0440\u0435 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438)\n\n    # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0438:\n    def is_disabled(self) -> bool:\n        \"\"\" \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435, \u043e\u0442\u043a\u043b\u044e\u0447\u0435\u043d\u0430 \u043b\u0438 \u043a\u043d\u043e\u043f\u043a\u0430 (\u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0441\u043a\u0440\u044b\u0442\u043e\u0439) \"\"\"\n\n        return self.locator.is_disabled()\n
    "},{"location":"elements/button_element/#elements.button_element.Button.type_of","title":"type_of property","text":"

    \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0442\u0438\u043f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 ('\u043a\u043d\u043e\u043f\u043a\u0430').

    Returns:

    Name Type Description str str

    \u0422\u0438\u043f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 - '\u043a\u043d\u043e\u043f\u043a\u0430'.

    "},{"location":"elements/button_element/#elements.button_element.Button.is_disabled","title":"is_disabled()","text":"

    \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435, \u043e\u0442\u043a\u043b\u044e\u0447\u0435\u043d\u0430 \u043b\u0438 \u043a\u043d\u043e\u043f\u043a\u0430 (\u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0441\u043a\u0440\u044b\u0442\u043e\u0439)

    Source code in elements\\button_element.py
    def is_disabled(self) -> bool:\n    \"\"\" \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435, \u043e\u0442\u043a\u043b\u044e\u0447\u0435\u043d\u0430 \u043b\u0438 \u043a\u043d\u043e\u043f\u043a\u0430 (\u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0441\u043a\u0440\u044b\u0442\u043e\u0439) \"\"\"\n\n    return self.locator.is_disabled()\n
    "},{"location":"elements/checkbox_element/","title":"Checkbox","text":"

    \u041c\u043e\u0434\u0443\u043b\u044c checkbox_element \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043a\u043b\u0430\u0441\u0441 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0447\u0435\u043a\u0431\u043e\u043a\u0441\u0430\u043c\u0438.

    \u041a\u043b\u0430\u0441\u0441 Checkbox \u043d\u0430\u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u0431\u0430\u0437\u043e\u0432\u044b\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b BaseElement \u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u0447\u043d\u044b\u0435 \u043c\u0435\u0442\u043e\u0434\u044b \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u043c\u0438 \u0442\u0438\u043f\u0430 '\u0447\u0435\u043a\u0431\u043e\u043a\u0441'.

    "},{"location":"elements/checkbox_element/#elements.checkbox_element.Checkbox","title":"Checkbox","text":"

    Bases: BaseElement

    \u041a\u043b\u0430\u0441\u0441 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0447\u0435\u043a\u0431\u043e\u043a\u0441\u0430\u043c\u0438 \u043d\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435.

    \u041d\u0430\u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c BaseElement \u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u043c\u0435\u0442\u043e\u0434\u044b \u0434\u043b\u044f \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0441 \u0447\u0435\u043a\u0431\u043e\u043a\u0441\u0430\u043c\u0438 \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0438\u0445 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f.

    Source code in elements\\checkbox_element.py
    class Checkbox(BaseElement):\n    \"\"\"\u041a\u043b\u0430\u0441\u0441 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0447\u0435\u043a\u0431\u043e\u043a\u0441\u0430\u043c\u0438 \u043d\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435.\n\n    \u041d\u0430\u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c BaseElement \u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u043c\u0435\u0442\u043e\u0434\u044b \u0434\u043b\u044f\n    \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0441 \u0447\u0435\u043a\u0431\u043e\u043a\u0441\u0430\u043c\u0438 \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0438\u0445 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f.\n    \"\"\"\n\n    @property\n    def type_of(self) -> str:\n        \"\"\"\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0442\u0438\u043f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 ('\u0447\u0435\u043a\u0431\u043e\u043a\u0441').\n\n        Returns:\n            str: \u0422\u0438\u043f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 - '\u0447\u0435\u043a\u0431\u043e\u043a\u0441'.\n        \"\"\"\n\n        return \"checkbox\"\n\n    # \u0414\u0435\u0439\u0441\u0442\u0432\u0438\u044f:\n    def check(self, force=False) -> None:\n        \"\"\"\u041e\u0442\u043c\u0435\u0447\u0430\u0435\u0442 \u0447\u0435\u043a\u0431\u043e\u043a\u0441 (\u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442 \u0433\u0430\u043b\u043e\u0447\u043a\u0443).\"\"\"\n\n        logger.info(f\"Checking checkbox '{self.name}'\")\n        if force:\n            self.locator.check(force=True)\n        else:\n            self.locator.check()\n\n    def uncheck(self, force=False) -> None:\n        \"\"\"\u0421\u043d\u0438\u043c\u0430\u0435\u0442 \u043e\u0442\u043c\u0435\u0442\u043a\u0443 \u0441 \u0447\u0435\u043a\u0431\u043e\u043a\u0441\u0430 (\u0443\u0431\u0438\u0440\u0430\u0435\u0442 \u0433\u0430\u043b\u043e\u0447\u043a\u0443).\"\"\"\n\n        logger.info(f\"Unchecking checkbox '{self.name}'\")\n        if force:\n            self.locator.uncheck(force=True)\n        else:\n            self.locator.uncheck()\n\n    # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0438:\n    def is_checked(self) -> bool:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442, \u043e\u0442\u043c\u0435\u0447\u0435\u043d \u043b\u0438 \u0447\u0435\u043a\u0431\u043e\u043a\u0441.\n\n        Returns:\n            bool: True \u0435\u0441\u043b\u0438 \u043e\u0442\u043c\u0435\u0447\u0435\u043d, False \u0435\u0441\u043b\u0438 \u043d\u0435\u0442.\n        \"\"\"\n\n        logger.info(f\"Checking if checkbox '{self.name}' is checked\")\n        return self.locator.is_checked()\n
    "},{"location":"elements/checkbox_element/#elements.checkbox_element.Checkbox.type_of","title":"type_of property","text":"

    \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0442\u0438\u043f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 ('\u0447\u0435\u043a\u0431\u043e\u043a\u0441').

    Returns:

    Name Type Description str str

    \u0422\u0438\u043f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 - '\u0447\u0435\u043a\u0431\u043e\u043a\u0441'.

    "},{"location":"elements/checkbox_element/#elements.checkbox_element.Checkbox.check","title":"check(force=False)","text":"

    \u041e\u0442\u043c\u0435\u0447\u0430\u0435\u0442 \u0447\u0435\u043a\u0431\u043e\u043a\u0441 (\u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442 \u0433\u0430\u043b\u043e\u0447\u043a\u0443).

    Source code in elements\\checkbox_element.py
    def check(self, force=False) -> None:\n    \"\"\"\u041e\u0442\u043c\u0435\u0447\u0430\u0435\u0442 \u0447\u0435\u043a\u0431\u043e\u043a\u0441 (\u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442 \u0433\u0430\u043b\u043e\u0447\u043a\u0443).\"\"\"\n\n    logger.info(f\"Checking checkbox '{self.name}'\")\n    if force:\n        self.locator.check(force=True)\n    else:\n        self.locator.check()\n
    "},{"location":"elements/checkbox_element/#elements.checkbox_element.Checkbox.is_checked","title":"is_checked()","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442, \u043e\u0442\u043c\u0435\u0447\u0435\u043d \u043b\u0438 \u0447\u0435\u043a\u0431\u043e\u043a\u0441.

    Returns:

    Name Type Description bool bool

    True \u0435\u0441\u043b\u0438 \u043e\u0442\u043c\u0435\u0447\u0435\u043d, False \u0435\u0441\u043b\u0438 \u043d\u0435\u0442.

    Source code in elements\\checkbox_element.py
    def is_checked(self) -> bool:\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442, \u043e\u0442\u043c\u0435\u0447\u0435\u043d \u043b\u0438 \u0447\u0435\u043a\u0431\u043e\u043a\u0441.\n\n    Returns:\n        bool: True \u0435\u0441\u043b\u0438 \u043e\u0442\u043c\u0435\u0447\u0435\u043d, False \u0435\u0441\u043b\u0438 \u043d\u0435\u0442.\n    \"\"\"\n\n    logger.info(f\"Checking if checkbox '{self.name}' is checked\")\n    return self.locator.is_checked()\n
    "},{"location":"elements/checkbox_element/#elements.checkbox_element.Checkbox.uncheck","title":"uncheck(force=False)","text":"

    \u0421\u043d\u0438\u043c\u0430\u0435\u0442 \u043e\u0442\u043c\u0435\u0442\u043a\u0443 \u0441 \u0447\u0435\u043a\u0431\u043e\u043a\u0441\u0430 (\u0443\u0431\u0438\u0440\u0430\u0435\u0442 \u0433\u0430\u043b\u043e\u0447\u043a\u0443).

    Source code in elements\\checkbox_element.py
    def uncheck(self, force=False) -> None:\n    \"\"\"\u0421\u043d\u0438\u043c\u0430\u0435\u0442 \u043e\u0442\u043c\u0435\u0442\u043a\u0443 \u0441 \u0447\u0435\u043a\u0431\u043e\u043a\u0441\u0430 (\u0443\u0431\u0438\u0440\u0430\u0435\u0442 \u0433\u0430\u043b\u043e\u0447\u043a\u0443).\"\"\"\n\n    logger.info(f\"Unchecking checkbox '{self.name}'\")\n    if force:\n        self.locator.uncheck(force=True)\n    else:\n        self.locator.uncheck()\n
    "},{"location":"elements/icon_element/","title":"Icon","text":"

    \u041c\u043e\u0434\u0443\u043b\u044c icon_element \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043a\u043b\u0430\u0441\u0441 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u043c \u0442\u0438\u043f\u0430 \u0438\u043a\u043e\u043d\u043a\u0430.

    \u041a\u043b\u0430\u0441\u0441 Icon \u043d\u0430\u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u0431\u0430\u0437\u043e\u0432\u044b\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b BaseElement \u0438 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u043c\u0435\u0442\u043e\u0434\u044b \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u044b\u043c\u0438 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u043c\u0438 \u043d\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435.

    "},{"location":"elements/icon_element/#elements.icon_element.Icon","title":"Icon","text":"

    Bases: BaseElement

    \u041a\u043b\u0430\u0441\u0441 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u043c \u0442\u0438\u043f\u0430 \u0438\u043a\u043e\u043d\u043a\u0430.

    \u041d\u0430\u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c BaseElement \u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u0447\u043d\u044b\u0435 \u043c\u0435\u0442\u043e\u0434\u044b \u0434\u043b\u044f \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0441 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u043c \u0442\u0438\u043f\u0430 \u0438\u043a\u043e\u043d\u043a\u0430.

    Source code in elements\\icon_element.py
    class Icon(BaseElement):\n    \"\"\"\u041a\u043b\u0430\u0441\u0441 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u043c \u0442\u0438\u043f\u0430 \u0438\u043a\u043e\u043d\u043a\u0430.\n\n    \u041d\u0430\u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c BaseElement \u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u0447\u043d\u044b\u0435\n    \u043c\u0435\u0442\u043e\u0434\u044b \u0434\u043b\u044f \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0441 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u043c \u0442\u0438\u043f\u0430 \u0438\u043a\u043e\u043d\u043a\u0430.\n    \"\"\"\n\n    @property\n    def type_of(self) -> str:\n        \"\"\"\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0442\u0438\u043f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 ('\u0438\u043a\u043e\u043d\u043a\u0430').\n\n        Returns:\n            str: \u0422\u0438\u043f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 - '\u0438\u043a\u043e\u043d\u043a\u0430'.\n        \"\"\"\n\n        return \"icon\"\n\n    # \u0414\u0435\u0439\u0441\u0442\u0432\u0438\u044f:\n    # (\u041c\u0435\u0442\u043e\u0434\u044b \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439 \u0431\u0443\u0434\u0443\u0442 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u044b \u043f\u043e \u043c\u0435\u0440\u0435 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438)\n\n    # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0438:\n    def is_password_hidden(self) -> bool:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0438\u043a\u043e\u043d\u043a\u0438 \u0441\u043a\u0440\u044b\u0442\u0438\u044f \u043f\u0430\u0440\u043e\u043b\u044f.\"\"\"\n\n        state_text = self.locator.text_content()\n        state = True\n        if state_text == \"visibility\":\n            state = False\n        return state\n
    "},{"location":"elements/icon_element/#elements.icon_element.Icon.type_of","title":"type_of property","text":"

    \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0442\u0438\u043f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 ('\u0438\u043a\u043e\u043d\u043a\u0430').

    Returns:

    Name Type Description str str

    \u0422\u0438\u043f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 - '\u0438\u043a\u043e\u043d\u043a\u0430'.

    "},{"location":"elements/icon_element/#elements.icon_element.Icon.is_password_hidden","title":"is_password_hidden()","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0438\u043a\u043e\u043d\u043a\u0438 \u0441\u043a\u0440\u044b\u0442\u0438\u044f \u043f\u0430\u0440\u043e\u043b\u044f.

    Source code in elements\\icon_element.py
    def is_password_hidden(self) -> bool:\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0438\u043a\u043e\u043d\u043a\u0438 \u0441\u043a\u0440\u044b\u0442\u0438\u044f \u043f\u0430\u0440\u043e\u043b\u044f.\"\"\"\n\n    state_text = self.locator.text_content()\n    state = True\n    if state_text == \"visibility\":\n        state = False\n    return state\n
    "},{"location":"elements/tab_button_element/","title":"TabButton","text":"

    \u041c\u043e\u0434\u0443\u043b\u044c tab_button_element \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043a\u043b\u0430\u0441\u0441 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u043a\u043d\u043e\u043f\u043a\u0430\u043c\u0438 \u0442\u0438\u043f\u0430 v-tabs \u043d\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435.

    \u041a\u043b\u0430\u0441\u0441 TabButton \u043d\u0430\u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u0431\u0430\u0437\u043e\u0432\u044b\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b BaseElement \u0438 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u0447\u043d\u044b\u0435 \u043c\u0435\u0442\u043e\u0434\u044b \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u043c\u0438.

    "},{"location":"elements/tab_button_element/#elements.tab_button_element.TabButton","title":"TabButton","text":"

    Bases: BaseElement

    \u041a\u043b\u0430\u0441\u0441 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u043a\u043d\u043e\u043f\u043a\u0430\u043c\u0438 \u0442\u0438\u043f\u0430 v-tabs \u043d\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435.

    \u041d\u0430\u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c BaseElement \u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u0447\u043d\u044b\u0435 \u0434\u043b\u044f \u043a\u043d\u043e\u043f\u043e\u043a \u043c\u0435\u0442\u043e\u0434\u044b \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438.

    Source code in elements\\tab_button_element.py
    class TabButton(BaseElement):\n    \"\"\"\u041a\u043b\u0430\u0441\u0441 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u043a\u043d\u043e\u043f\u043a\u0430\u043c\u0438 \u0442\u0438\u043f\u0430 v-tabs \u043d\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435.\n\n    \u041d\u0430\u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c BaseElement \u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u0447\u043d\u044b\u0435\n    \u0434\u043b\u044f \u043a\u043d\u043e\u043f\u043e\u043a \u043c\u0435\u0442\u043e\u0434\u044b \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438.\n    \"\"\"\n\n    @property\n    def type_of(self) -> str:\n        \"\"\"\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0442\u0438\u043f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 ('\u043a\u043d\u043e\u043f\u043a\u0430-tab').\n\n        Returns:\n            str: \u0422\u0438\u043f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 - '\u043a\u043d\u043e\u043f\u043a\u0430-tab'.\n        \"\"\"\n\n        return \"button_tab\"\n
    "},{"location":"elements/tab_button_element/#elements.tab_button_element.TabButton.type_of","title":"type_of property","text":"

    \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0442\u0438\u043f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 ('\u043a\u043d\u043e\u043f\u043a\u0430-tab').

    Returns:

    Name Type Description str str

    \u0422\u0438\u043f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 - '\u043a\u043d\u043e\u043f\u043a\u0430-tab'.

    "},{"location":"elements/text_element/","title":"Text","text":"

    \u041c\u043e\u0434\u0443\u043b\u044c text_element \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043a\u043b\u0430\u0441\u0441 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u044b\u043c\u0438 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u043c\u0438.

    \u041a\u043b\u0430\u0441\u0441 Text \u043d\u0430\u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u0431\u0430\u0437\u043e\u0432\u044b\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b BaseElement \u0438 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u043c\u0435\u0442\u043e\u0434\u044b \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u044b\u043c\u0438 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u043c\u0438 \u043d\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435.

    "},{"location":"elements/text_element/#elements.text_element.Text","title":"Text","text":"

    Bases: BaseElement

    \u041a\u043b\u0430\u0441\u0441 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u044b\u043c\u0438 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u043c\u0438 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b.

    \u041d\u0430\u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c BaseElement \u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u0447\u043d\u044b\u0435 \u043c\u0435\u0442\u043e\u0434\u044b \u0434\u043b\u044f \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0441 \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u044b\u043c\u0438 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u043c\u0438.

    Source code in elements\\text_element.py
    class Text(BaseElement):\n    \"\"\"\u041a\u043b\u0430\u0441\u0441 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u044b\u043c\u0438 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u043c\u0438 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b.\n\n    \u041d\u0430\u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c BaseElement \u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u0447\u043d\u044b\u0435\n    \u043c\u0435\u0442\u043e\u0434\u044b \u0434\u043b\u044f \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0441 \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u044b\u043c\u0438 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u043c\u0438.\n    \"\"\"\n\n    @property\n    def type_of(self) -> str:\n        \"\"\"\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0442\u0438\u043f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 ('\u0442\u0435\u043a\u0441\u0442').\n\n        Returns:\n            str: \u0422\u0438\u043f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 - '\u0442\u0435\u043a\u0441\u0442'.\n        \"\"\"\n\n        return \"text\"\n
    "},{"location":"elements/text_element/#elements.text_element.Text.type_of","title":"type_of property","text":"

    \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0442\u0438\u043f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 ('\u0442\u0435\u043a\u0441\u0442').

    Returns:

    Name Type Description str str

    \u0422\u0438\u043f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 - '\u0442\u0435\u043a\u0441\u0442'.

    "},{"location":"elements/text_input_element/","title":"TextInput","text":"

    \u041c\u043e\u0434\u0443\u043b\u044c text_input_element \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043a\u043b\u0430\u0441\u0441 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u044b\u043c\u0438 \u043f\u043e\u043b\u044f\u043c\u0438 \u0432\u0432\u043e\u0434\u0430.

    \u041a\u043b\u0430\u0441\u0441 TextInput \u043d\u0430\u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u0431\u0430\u0437\u043e\u0432\u044b\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b BaseElement \u0438 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u043c\u0435\u0442\u043e\u0434\u044b \u0434\u043b\u044f \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0441 \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u044b\u043c\u0438 \u043f\u043e\u043b\u044f\u043c\u0438 \u0432\u0432\u043e\u0434\u0430 \u043d\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435.

    "},{"location":"elements/text_input_element/#elements.text_input_element.TextInput","title":"TextInput","text":"

    Bases: BaseElement

    \u041a\u043b\u0430\u0441\u0441 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u044b\u043c\u0438 \u043f\u043e\u043b\u044f\u043c\u0438 \u0432\u0432\u043e\u0434\u0430.

    \u041d\u0430\u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c BaseElement \u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u043c\u0435\u0442\u043e\u0434\u044b \u0434\u043b\u044f \u0432\u0432\u043e\u0434\u0430, \u043e\u0447\u0438\u0441\u0442\u043a\u0438 \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u044b\u0445 \u043f\u043e\u043b\u0435\u0439.

    Source code in elements\\text_input_element.py
    class TextInput(BaseElement):\n    \"\"\"\u041a\u043b\u0430\u0441\u0441 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u044b\u043c\u0438 \u043f\u043e\u043b\u044f\u043c\u0438 \u0432\u0432\u043e\u0434\u0430.\n\n    \u041d\u0430\u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c BaseElement \u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u043c\u0435\u0442\u043e\u0434\u044b\n    \u0434\u043b\u044f \u0432\u0432\u043e\u0434\u0430, \u043e\u0447\u0438\u0441\u0442\u043a\u0438 \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u044b\u0445 \u043f\u043e\u043b\u0435\u0439.\n    \"\"\"\n\n    @property\n    def type_of(self) -> str:\n        \"\"\"\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0442\u0438\u043f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 ('\u0442\u0435\u043a\u0441\u0442\u043e\u0432\u043e\u0435 \u043f\u043e\u043b\u0435 \u0432\u0432\u043e\u0434\u0430').\n\n        Returns:\n            str: \u0422\u0438\u043f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 - '\u0442\u0435\u043a\u0441\u0442\u043e\u0432\u043e\u0435 \u043f\u043e\u043b\u0435 \u0432\u0432\u043e\u0434\u0430'.\n        \"\"\"\n\n        return \"text input\"\n\n    # \u0414\u0435\u0439\u0441\u0442\u0432\u0438\u044f:\n    def get_input_value(self) -> str:\n        \"\"\"\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0442\u0435\u043a\u0443\u0449\u0435\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043f\u043e\u043b\u044f \u0432\u0432\u043e\u0434\u0430.\n\n        Returns:\n            str: \u0422\u0435\u043a\u0443\u0449\u0435\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0432 \u043f\u043e\u043b\u0435.\n        \"\"\"\n\n        logger.info(f'Getting value from text input \"{self.name}\"')\n        return self.locator.input_value()\n\n    def get_input_type(self) -> str:\n        \"\"\"\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0430\u0442\u0442\u0440\u0438\u0431\u0443\u0442\u0430 type \u043f\u043e\u043b\u044f \u0432\u0432\u043e\u0434\u0430.\n\n        Returns:\n            str: \u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0430\u0442\u0442\u0440\u0438\u0431\u0443\u0442\u0430 type.\n        \"\"\"\n\n        return self.locator.get_attribute(\"type\")\n\n    def input_value(self, value: str) -> None:\n        \"\"\"\u0412\u0432\u043e\u0434\u0438\u0442 \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0432 \u043f\u043e\u043b\u0435.\n\n        Args:\n            value (str): \u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0434\u043b\u044f \u0432\u0432\u043e\u0434\u0430.\n        \"\"\"\n\n        logger.info(f'Inputting value \"{value}\" to text input \"{self.name}\"')\n        self.locator.fill(value)\n\n    def clear(self) -> None:\n        \"\"\"\u041e\u0447\u0438\u0449\u0430\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u043b\u044f.\"\"\"\n\n        logger.info(f'Clearing text input \"{self.name}\"')\n        self.locator.press('Control+A')\n        self.locator.press('Backspace')\n\n    # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0438:\n    def check_empty_input(self, msg: str) -> None:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442, \u0447\u0442\u043e \u043f\u043e\u043b\u0435 \u0432\u0432\u043e\u0434\u0430 \u043f\u0443\u0441\u0442\u043e\u0435.\n\n        Args:\n            msg (str): \u0421\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u043e\u0431 \u043e\u0448\u0438\u0431\u043a\u0435 \u043f\u0440\u0438 \u043d\u0435\u0443\u0434\u0430\u0447\u043d\u043e\u0439 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0435.\n\n        Raises:\n            AssertionError: \u0415\u0441\u043b\u0438 \u043f\u043e\u043b\u0435 \u043d\u0435 \u043f\u0443\u0441\u0442\u043e\u0435.\n        \"\"\"\n\n        logger.info(f'Checking that text input \"{self.name}\" is empty')\n        expect(self.locator).to_be_empty(), msg\n
    "},{"location":"elements/text_input_element/#elements.text_input_element.TextInput.type_of","title":"type_of property","text":"

    \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0442\u0438\u043f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 ('\u0442\u0435\u043a\u0441\u0442\u043e\u0432\u043e\u0435 \u043f\u043e\u043b\u0435 \u0432\u0432\u043e\u0434\u0430').

    Returns:

    Name Type Description str str

    \u0422\u0438\u043f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 - '\u0442\u0435\u043a\u0441\u0442\u043e\u0432\u043e\u0435 \u043f\u043e\u043b\u0435 \u0432\u0432\u043e\u0434\u0430'.

    "},{"location":"elements/text_input_element/#elements.text_input_element.TextInput.check_empty_input","title":"check_empty_input(msg)","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442, \u0447\u0442\u043e \u043f\u043e\u043b\u0435 \u0432\u0432\u043e\u0434\u0430 \u043f\u0443\u0441\u0442\u043e\u0435.

    Parameters:

    Name Type Description Default msg str

    \u0421\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u043e\u0431 \u043e\u0448\u0438\u0431\u043a\u0435 \u043f\u0440\u0438 \u043d\u0435\u0443\u0434\u0430\u0447\u043d\u043e\u0439 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0435.

    required

    Raises:

    Type Description AssertionError

    \u0415\u0441\u043b\u0438 \u043f\u043e\u043b\u0435 \u043d\u0435 \u043f\u0443\u0441\u0442\u043e\u0435.

    Source code in elements\\text_input_element.py
    def check_empty_input(self, msg: str) -> None:\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442, \u0447\u0442\u043e \u043f\u043e\u043b\u0435 \u0432\u0432\u043e\u0434\u0430 \u043f\u0443\u0441\u0442\u043e\u0435.\n\n    Args:\n        msg (str): \u0421\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u043e\u0431 \u043e\u0448\u0438\u0431\u043a\u0435 \u043f\u0440\u0438 \u043d\u0435\u0443\u0434\u0430\u0447\u043d\u043e\u0439 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0435.\n\n    Raises:\n        AssertionError: \u0415\u0441\u043b\u0438 \u043f\u043e\u043b\u0435 \u043d\u0435 \u043f\u0443\u0441\u0442\u043e\u0435.\n    \"\"\"\n\n    logger.info(f'Checking that text input \"{self.name}\" is empty')\n    expect(self.locator).to_be_empty(), msg\n
    "},{"location":"elements/text_input_element/#elements.text_input_element.TextInput.clear","title":"clear()","text":"

    \u041e\u0447\u0438\u0449\u0430\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u043b\u044f.

    Source code in elements\\text_input_element.py
    def clear(self) -> None:\n    \"\"\"\u041e\u0447\u0438\u0449\u0430\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u043b\u044f.\"\"\"\n\n    logger.info(f'Clearing text input \"{self.name}\"')\n    self.locator.press('Control+A')\n    self.locator.press('Backspace')\n
    "},{"location":"elements/text_input_element/#elements.text_input_element.TextInput.get_input_type","title":"get_input_type()","text":"

    \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0430\u0442\u0442\u0440\u0438\u0431\u0443\u0442\u0430 type \u043f\u043e\u043b\u044f \u0432\u0432\u043e\u0434\u0430.

    Returns:

    Name Type Description str str

    \u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0430\u0442\u0442\u0440\u0438\u0431\u0443\u0442\u0430 type.

    Source code in elements\\text_input_element.py
    def get_input_type(self) -> str:\n    \"\"\"\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0430\u0442\u0442\u0440\u0438\u0431\u0443\u0442\u0430 type \u043f\u043e\u043b\u044f \u0432\u0432\u043e\u0434\u0430.\n\n    Returns:\n        str: \u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0430\u0442\u0442\u0440\u0438\u0431\u0443\u0442\u0430 type.\n    \"\"\"\n\n    return self.locator.get_attribute(\"type\")\n
    "},{"location":"elements/text_input_element/#elements.text_input_element.TextInput.get_input_value","title":"get_input_value()","text":"

    \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0442\u0435\u043a\u0443\u0449\u0435\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043f\u043e\u043b\u044f \u0432\u0432\u043e\u0434\u0430.

    Returns:

    Name Type Description str str

    \u0422\u0435\u043a\u0443\u0449\u0435\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0432 \u043f\u043e\u043b\u0435.

    Source code in elements\\text_input_element.py
    def get_input_value(self) -> str:\n    \"\"\"\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0442\u0435\u043a\u0443\u0449\u0435\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043f\u043e\u043b\u044f \u0432\u0432\u043e\u0434\u0430.\n\n    Returns:\n        str: \u0422\u0435\u043a\u0443\u0449\u0435\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0432 \u043f\u043e\u043b\u0435.\n    \"\"\"\n\n    logger.info(f'Getting value from text input \"{self.name}\"')\n    return self.locator.input_value()\n
    "},{"location":"elements/text_input_element/#elements.text_input_element.TextInput.input_value","title":"input_value(value)","text":"

    \u0412\u0432\u043e\u0434\u0438\u0442 \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0432 \u043f\u043e\u043b\u0435.

    Parameters:

    Name Type Description Default value str

    \u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0434\u043b\u044f \u0432\u0432\u043e\u0434\u0430.

    required Source code in elements\\text_input_element.py
    def input_value(self, value: str) -> None:\n    \"\"\"\u0412\u0432\u043e\u0434\u0438\u0442 \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0432 \u043f\u043e\u043b\u0435.\n\n    Args:\n        value (str): \u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0434\u043b\u044f \u0432\u0432\u043e\u0434\u0430.\n    \"\"\"\n\n    logger.info(f'Inputting value \"{value}\" to text input \"{self.name}\"')\n    self.locator.fill(value)\n
    "},{"location":"elements/tooltip_button_element/","title":"TooltipButton","text":"

    \u041c\u043e\u0434\u0443\u043b\u044c tooltip_button_element \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043a\u043b\u0430\u0441\u0441 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u043a\u043d\u043e\u043f\u043a\u0430\u043c\u0438 \u0441 \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0430\u043c\u0438.

    \u041a\u043b\u0430\u0441\u0441 TooltipButton \u043d\u0430\u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u0431\u0430\u0437\u043e\u0432\u044b\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b BaseElement \u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u043c\u0435\u0442\u043e\u0434\u044b \u0434\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0432\u0441\u043f\u043b\u044b\u0432\u0430\u044e\u0449\u0438\u0445 \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043e\u043a \u0443 \u043a\u043d\u043e\u043f\u043e\u043a.

    "},{"location":"elements/tooltip_button_element/#elements.tooltip_button_element.TooltipButton","title":"TooltipButton","text":"

    Bases: BaseElement

    \u041a\u043b\u0430\u0441\u0441 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u043a\u043d\u043e\u043f\u043a\u0430\u043c\u0438, \u0438\u043c\u0435\u044e\u0449\u0438\u043c\u0438 \u0432\u0441\u043f\u043b\u044b\u0432\u0430\u044e\u0449\u0438\u0435 \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0438.

    \u041d\u0430\u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c BaseElement \u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u043c\u0435\u0442\u043e\u0434\u044b \u0434\u043b\u044f \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0441 \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0430\u043c\u0438 \u043a\u043d\u043e\u043f\u043e\u043a.

    Source code in elements\\tooltip_button_element.py
    class TooltipButton(BaseElement):\n    \"\"\"\u041a\u043b\u0430\u0441\u0441 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u043a\u043d\u043e\u043f\u043a\u0430\u043c\u0438, \u0438\u043c\u0435\u044e\u0449\u0438\u043c\u0438 \u0432\u0441\u043f\u043b\u044b\u0432\u0430\u044e\u0449\u0438\u0435 \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0438.\n\n    \u041d\u0430\u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c BaseElement \u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u043c\u0435\u0442\u043e\u0434\u044b\n    \u0434\u043b\u044f \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0441 \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0430\u043c\u0438 \u043a\u043d\u043e\u043f\u043e\u043a.\n    \"\"\"\n\n    @property\n    def type_of(self) -> str:\n        \"\"\"\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0442\u0438\u043f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 ('tooltip_button').\n\n        Returns:\n            str: \u0422\u0438\u043f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 - \u043a\u043d\u043e\u043f\u043a\u0430 \u0441 \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u043e\u0439.\n        \"\"\"\n\n        return \"tooltip_button\"\n\n    # \u0414\u0435\u0439\u0441\u0442\u0432\u0438\u044f:\n    def get_tooltip_text(self) -> str:\n        \"\"\"\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0442\u0435\u043a\u0441\u0442 \u0432\u0441\u043f\u043b\u044b\u0432\u0430\u044e\u0449\u0435\u0439 \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0438.\n\n        Returns:\n            str: \u0422\u0435\u043a\u0441\u0442 \u0432\u0441\u043f\u043b\u044b\u0432\u0430\u044e\u0449\u0435\u0439 \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0438.\n\n        \"\"\"\n\n        # \u041d\u0430\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u043d\u0430 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0434\u043b\u044f \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0438\n        self.locator.hover()\n\n        # \u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0438\n        tooltip = self.page.locator(ButtonLocators.TOOLTIP)\n\n        tooltip.wait_for(state=\"visible\", timeout=5000)\n\n        self.page.wait_for_timeout(300)\n        return tooltip.text_content().strip()\n\n    def wait_for_tooltip_to_disappear(self, timeout: int = 5000) -> None:\n        \"\"\"\u041e\u0436\u0438\u0434\u0430\u0435\u0442 \u0438\u0441\u0447\u0435\u0437\u043d\u043e\u0432\u0435\u043d\u0438\u044f \u0432\u0441\u0435\u0445 \u0430\u043a\u0442\u0438\u0432\u043d\u044b\u0445 \u0432\u0441\u043f\u043b\u044b\u0432\u0430\u044e\u0449\u0438\u0445 \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043e\u043a.\"\"\"\n\n        self.page.mouse.click(10, 10)\n        tooltip_locator = self.page.locator(\".v-tooltip__content.menuable__content__active\")\n\n        tooltip_locator.wait_for(state=\"hidden\", timeout=timeout)\n\n    # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0438:\n    def check_tooltip_with_text(self, expected_text: str) -> None:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0435 \u0442\u0435\u043a\u0441\u0442\u0430 \u0432\u0441\u043f\u043b\u044b\u0432\u0430\u044e\u0449\u0435\u0439 \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0438.\n\n        Args:\n           expected_text (str): \u041e\u0436\u0438\u0434\u0430\u0435\u043c\u044b\u0439 \u0442\u0435\u043a\u0441\u0442 \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0438.\n\n        Raises:\n            AssertionError: \u0415\u0441\u043b\u0438 \u0442\u0435\u043a\u0441\u0442 \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0438 \u043d\u0435 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u043e\u0436\u0438\u0434\u0430\u0435\u043c\u043e\u043c\u0443.\n        \"\"\"\n\n        # \u041d\u0430\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u043d\u0430 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0434\u043b\u044f \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0438\n        self.locator.hover()\n\n        # \u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0438\n        tooltip = self.page.locator(ButtonLocators.TOOLTIP)\n\n        tooltip.wait_for(state=\"visible\", timeout=5000)\n\n        self.page.wait_for_timeout(300)\n\n        # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u044f \u0442\u0435\u043a\u0441\u0442\u0430\n        actual_text = tooltip.text_content().strip()\n        assert actual_text == expected_text, (\n            f\"\u0422\u0435\u043a\u0441\u0442 \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0438 \u043d\u0435 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u043e\u0436\u0438\u0434\u0430\u0435\u043c\u043e\u043c\u0443. \"\n            f\"\u041e\u0436\u0438\u0434\u0430\u043b\u043e\u0441\u044c: '{expected_text}', \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043e: '{actual_text}'\"\n        )\n
    "},{"location":"elements/tooltip_button_element/#elements.tooltip_button_element.TooltipButton.type_of","title":"type_of property","text":"

    \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0442\u0438\u043f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 ('tooltip_button').

    Returns:

    Name Type Description str str

    \u0422\u0438\u043f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 - \u043a\u043d\u043e\u043f\u043a\u0430 \u0441 \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u043e\u0439.

    "},{"location":"elements/tooltip_button_element/#elements.tooltip_button_element.TooltipButton.check_tooltip_with_text","title":"check_tooltip_with_text(expected_text)","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0435 \u0442\u0435\u043a\u0441\u0442\u0430 \u0432\u0441\u043f\u043b\u044b\u0432\u0430\u044e\u0449\u0435\u0439 \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0438.

    Parameters:

    Name Type Description Default expected_text str

    \u041e\u0436\u0438\u0434\u0430\u0435\u043c\u044b\u0439 \u0442\u0435\u043a\u0441\u0442 \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0438.

    required

    Raises:

    Type Description AssertionError

    \u0415\u0441\u043b\u0438 \u0442\u0435\u043a\u0441\u0442 \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0438 \u043d\u0435 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u043e\u0436\u0438\u0434\u0430\u0435\u043c\u043e\u043c\u0443.

    Source code in elements\\tooltip_button_element.py
    def check_tooltip_with_text(self, expected_text: str) -> None:\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0435 \u0442\u0435\u043a\u0441\u0442\u0430 \u0432\u0441\u043f\u043b\u044b\u0432\u0430\u044e\u0449\u0435\u0439 \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0438.\n\n    Args:\n       expected_text (str): \u041e\u0436\u0438\u0434\u0430\u0435\u043c\u044b\u0439 \u0442\u0435\u043a\u0441\u0442 \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0438.\n\n    Raises:\n        AssertionError: \u0415\u0441\u043b\u0438 \u0442\u0435\u043a\u0441\u0442 \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0438 \u043d\u0435 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u043e\u0436\u0438\u0434\u0430\u0435\u043c\u043e\u043c\u0443.\n    \"\"\"\n\n    # \u041d\u0430\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u043d\u0430 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0434\u043b\u044f \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0438\n    self.locator.hover()\n\n    # \u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0438\n    tooltip = self.page.locator(ButtonLocators.TOOLTIP)\n\n    tooltip.wait_for(state=\"visible\", timeout=5000)\n\n    self.page.wait_for_timeout(300)\n\n    # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u044f \u0442\u0435\u043a\u0441\u0442\u0430\n    actual_text = tooltip.text_content().strip()\n    assert actual_text == expected_text, (\n        f\"\u0422\u0435\u043a\u0441\u0442 \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0438 \u043d\u0435 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u043e\u0436\u0438\u0434\u0430\u0435\u043c\u043e\u043c\u0443. \"\n        f\"\u041e\u0436\u0438\u0434\u0430\u043b\u043e\u0441\u044c: '{expected_text}', \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043e: '{actual_text}'\"\n    )\n
    "},{"location":"elements/tooltip_button_element/#elements.tooltip_button_element.TooltipButton.get_tooltip_text","title":"get_tooltip_text()","text":"

    \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0442\u0435\u043a\u0441\u0442 \u0432\u0441\u043f\u043b\u044b\u0432\u0430\u044e\u0449\u0435\u0439 \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0438.

    Returns:

    Name Type Description str str

    \u0422\u0435\u043a\u0441\u0442 \u0432\u0441\u043f\u043b\u044b\u0432\u0430\u044e\u0449\u0435\u0439 \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0438.

    Source code in elements\\tooltip_button_element.py
    def get_tooltip_text(self) -> str:\n    \"\"\"\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0442\u0435\u043a\u0441\u0442 \u0432\u0441\u043f\u043b\u044b\u0432\u0430\u044e\u0449\u0435\u0439 \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0438.\n\n    Returns:\n        str: \u0422\u0435\u043a\u0441\u0442 \u0432\u0441\u043f\u043b\u044b\u0432\u0430\u044e\u0449\u0435\u0439 \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0438.\n\n    \"\"\"\n\n    # \u041d\u0430\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u043d\u0430 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0434\u043b\u044f \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0438\n    self.locator.hover()\n\n    # \u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0438\n    tooltip = self.page.locator(ButtonLocators.TOOLTIP)\n\n    tooltip.wait_for(state=\"visible\", timeout=5000)\n\n    self.page.wait_for_timeout(300)\n    return tooltip.text_content().strip()\n
    "},{"location":"elements/tooltip_button_element/#elements.tooltip_button_element.TooltipButton.wait_for_tooltip_to_disappear","title":"wait_for_tooltip_to_disappear(timeout=5000)","text":"

    \u041e\u0436\u0438\u0434\u0430\u0435\u0442 \u0438\u0441\u0447\u0435\u0437\u043d\u043e\u0432\u0435\u043d\u0438\u044f \u0432\u0441\u0435\u0445 \u0430\u043a\u0442\u0438\u0432\u043d\u044b\u0445 \u0432\u0441\u043f\u043b\u044b\u0432\u0430\u044e\u0449\u0438\u0445 \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043e\u043a.

    Source code in elements\\tooltip_button_element.py
    def wait_for_tooltip_to_disappear(self, timeout: int = 5000) -> None:\n    \"\"\"\u041e\u0436\u0438\u0434\u0430\u0435\u0442 \u0438\u0441\u0447\u0435\u0437\u043d\u043e\u0432\u0435\u043d\u0438\u044f \u0432\u0441\u0435\u0445 \u0430\u043a\u0442\u0438\u0432\u043d\u044b\u0445 \u0432\u0441\u043f\u043b\u044b\u0432\u0430\u044e\u0449\u0438\u0445 \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043e\u043a.\"\"\"\n\n    self.page.mouse.click(10, 10)\n    tooltip_locator = self.page.locator(\".v-tooltip__content.menuable__content__active\")\n\n    tooltip_locator.wait_for(state=\"hidden\", timeout=timeout)\n
    "},{"location":"fixtures/pages/","title":"Browser Fixtures","text":"

    \u041c\u043e\u0434\u0443\u043b\u044c pages \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0444\u0438\u043a\u0441\u0442\u0443\u0440\u044b \u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 Playwright.

    \u041f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u044b \u0434\u043b\u044f \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u043e\u043c, \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0430\u043c\u0438 \u0438 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0430\u043c\u0438 \u0432 \u0442\u0435\u0441\u0442\u0430\u0445 pytest, \u0432\u043a\u043b\u044e\u0447\u0430\u044f \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0443 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 \u0437\u0430\u043f\u0443\u0441\u043a\u0430.

    "},{"location":"fixtures/pages/#fixtures.pages.browser","title":"browser(request)","text":"

    \u0424\u0438\u043a\u0441\u0442\u0443\u0440\u0430 \u0434\u043b\u044f \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u043e\u043c \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0430.

    Parameters:

    Name Type Description Default request FixtureRequest

    \u041e\u0431\u044a\u0435\u043a\u0442 \u0437\u0430\u043f\u0440\u043e\u0441\u0430 pytest \u0434\u043b\u044f \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u043a \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438.

    required

    Returns:

    Name Type Description Page Page

    \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0430.

    Yields:

    Name Type Description Page Page

    \u0421\u0442\u0440\u0430\u043d\u0438\u0446\u0430 \u0434\u043b\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0432 \u0442\u0435\u0441\u0442\u0430\u0445.

    Note

    \u0410\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0437\u0430\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u0431\u0440\u0430\u0443\u0437\u0435\u0440 \u043f\u043e\u0441\u043b\u0435 \u0442\u0435\u0441\u0442\u043e\u0432.

    Source code in fixtures\\pages.py
    @pytest.fixture(scope='class')\ndef browser(request: FixtureRequest) -> Page:\n    \"\"\"\u0424\u0438\u043a\u0441\u0442\u0443\u0440\u0430 \u0434\u043b\u044f \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440\u043e\u043c \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0430.\n\n    Args:\n        request: \u041e\u0431\u044a\u0435\u043a\u0442 \u0437\u0430\u043f\u0440\u043e\u0441\u0430 pytest \u0434\u043b\u044f \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u043a \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438.\n\n    Returns:\n        Page: \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0430.\n\n    Yields:\n        Page: \u0421\u0442\u0440\u0430\u043d\u0438\u0446\u0430 \u0434\u043b\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0432 \u0442\u0435\u0441\u0442\u0430\u0445.\n\n    Note:\n        \u0410\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0437\u0430\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u0431\u0440\u0430\u0443\u0437\u0435\u0440 \u043f\u043e\u0441\u043b\u0435 \u0442\u0435\u0441\u0442\u043e\u0432.\n    \"\"\"\n\n    playwright = sync_playwright().start()\n\n    # \u0412\u044b\u0431\u043e\u0440 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0430 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430 \u043a\u043e\u043c\u0430\u043d\u0434\u043d\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438\n    if request.config.getoption(\"bn\") == 'remote_chrome':\n        browser = get_remote_chrome(playwright, request)\n        context = get_context(browser, request, 'remote')\n        page_data = context.new_page()\n    elif request.config.getoption(\"bn\") == 'firefox':\n        browser = get_firefox_browser(playwright, request)\n        context = get_context(browser, request, 'local')\n        page_data = context.new_page()\n    elif request.config.getoption(\"bn\") == 'chrome':\n        browser = get_chrome_browser(playwright, request)\n        context = get_context(browser, request, 'local')\n        page_data = context.new_page()\n    else:\n        browser = get_chrome_browser(playwright, request)\n        context = get_context(browser, request, 'local')\n        page_data = context.new_page()\n\n    yield page_data\n\n    # \u041e\u0447\u0438\u0441\u0442\u043a\u0430 \u043f\u043e\u0441\u043b\u0435 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f \u0442\u0435\u0441\u0442\u043e\u0432\n    for context in browser.contexts:\n        context.close()\n    browser.close()\n    playwright.stop()\n
    "},{"location":"fixtures/pages/#fixtures.pages.get_chrome_browser","title":"get_chrome_browser(playwright, request)","text":"

    \u0421\u043e\u0437\u0434\u0430\u0435\u0442 \u0438 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 Chrome \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0430.

    Parameters:

    Name Type Description Default playwright Playwright

    \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 Playwright.

    required request FixtureRequest

    \u041e\u0431\u044a\u0435\u043a\u0442 \u0437\u0430\u043f\u0440\u043e\u0441\u0430 pytest.

    required

    Returns:

    Name Type Description Browser Browser

    \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 Chrome.

    Source code in fixtures\\pages.py
    def get_chrome_browser(playwright: Playwright, request: FixtureRequest) -> Browser:\n    \"\"\"\u0421\u043e\u0437\u0434\u0430\u0435\u0442 \u0438 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 Chrome \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0430.\n\n    Args:\n        playwright: \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 Playwright.\n        request: \u041e\u0431\u044a\u0435\u043a\u0442 \u0437\u0430\u043f\u0440\u043e\u0441\u0430 pytest.\n\n    Returns:\n        Browser: \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 Chrome.\n    \"\"\"\n\n    return playwright.chromium.launch(\n        headless=request.config.getoption(\"h\"),\n        slow_mo=request.config.getoption(\"slow\"),\n        args=['--s']\n    )\n
    "},{"location":"fixtures/pages/#fixtures.pages.get_context","title":"get_context(browser, request, start)","text":"

    \u0421\u043e\u0437\u0434\u0430\u0435\u0442 \u0438 \u043d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u0442 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0430.

    Parameters:

    Name Type Description Default browser Browser

    \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0430.

    required request FixtureRequest

    \u041e\u0431\u044a\u0435\u043a\u0442 \u0437\u0430\u043f\u0440\u043e\u0441\u0430 pytest.

    required start str

    \u0422\u0438\u043f \u0437\u0430\u043f\u0443\u0441\u043a\u0430 ('local' \u0438\u043b\u0438 'remote').

    required

    Returns:

    Name Type Description BrowserContext BrowserContext

    \u041d\u0430\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0439 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442.

    Source code in fixtures\\pages.py
    def get_context(browser: Browser, request: FixtureRequest, start: str) -> BrowserContext:\n    \"\"\"\u0421\u043e\u0437\u0434\u0430\u0435\u0442 \u0438 \u043d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u0442 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0430.\n\n    Args:\n        browser: \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0430.\n        request: \u041e\u0431\u044a\u0435\u043a\u0442 \u0437\u0430\u043f\u0440\u043e\u0441\u0430 pytest.\n        start: \u0422\u0438\u043f \u0437\u0430\u043f\u0443\u0441\u043a\u0430 ('local' \u0438\u043b\u0438 'remote').\n\n    Returns:\n        BrowserContext: \u041d\u0430\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0439 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442.\n    \"\"\"\n\n    if start == 'local':\n       # current_viewport = json.loads(request.config.getoption('--s'))\n\n        context = browser.new_context(\n            # no_viewport=True,\n            viewport= ast.literal_eval(request.config.getoption('--s')),\n            locale=request.config.getoption('l')\n        )\n        context.set_default_timeout(\n            timeout=request.config.getoption('t')\n        )\n        # \u041f\u0440\u0438\u043c\u0435\u0440 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043a\u0443\u043a (\u0437\u0430\u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043e)\n        # context.add_cookies([{'url': 'https://example.ru', 'name': 'ab_test', 'value': 'd'}])\n        return context\n\n    elif start == 'remote':\n        context = browser.new_context(\n            viewport=ast.literal_eval(request.config.getoption('--s')),\n            locale=request.config.getoption('l')\n        )\n        context.set_default_timeout(\n            timeout=request.config.getoption('t')\n        )\n        # \u041f\u0440\u0438\u043c\u0435\u0440 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043a\u0443\u043a (\u0437\u0430\u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043e)\n        # context.add_cookies([{'url': 'https://example.ru', 'name': 'ab_test', 'value': 'd'}])\n        return context\n
    "},{"location":"fixtures/pages/#fixtures.pages.get_firefox_browser","title":"get_firefox_browser(playwright, request)","text":"

    \u0421\u043e\u0437\u0434\u0430\u0435\u0442 \u0438 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 Firefox \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0430.

    Parameters:

    Name Type Description Default playwright Playwright

    \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 Playwright.

    required request FixtureRequest

    \u041e\u0431\u044a\u0435\u043a\u0442 \u0437\u0430\u043f\u0440\u043e\u0441\u0430 pytest.

    required

    Returns:

    Name Type Description Browser Browser

    \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 Firefox.

    Source code in fixtures\\pages.py
    def get_firefox_browser(playwright: Playwright, request: FixtureRequest) -> Browser:\n    \"\"\"\u0421\u043e\u0437\u0434\u0430\u0435\u0442 \u0438 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 Firefox \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0430.\n\n    Args:\n        playwright: \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 Playwright.\n        request: \u041e\u0431\u044a\u0435\u043a\u0442 \u0437\u0430\u043f\u0440\u043e\u0441\u0430 pytest.\n\n    Returns:\n        Browser: \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 Firefox.\n    \"\"\"\n\n    return playwright.firefox.launch(\n        headless=request.config.getoption(\"h\"),\n        slow_mo=request.config.getoption(\"slow\"),\n    )\n
    "},{"location":"fixtures/pages/#fixtures.pages.get_remote_chrome","title":"get_remote_chrome(playwright, request)","text":"

    \u0421\u043e\u0437\u0434\u0430\u0435\u0442 \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 Chrome \u0434\u043b\u044f \u0443\u0434\u0430\u043b\u0435\u043d\u043d\u043e\u0433\u043e \u0437\u0430\u043f\u0443\u0441\u043a\u0430.

    Parameters:

    Name Type Description Default playwright Playwright

    \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 Playwright.

    required request FixtureRequest

    \u041e\u0431\u044a\u0435\u043a\u0442 \u0437\u0430\u043f\u0440\u043e\u0441\u0430 pytest.

    required

    Returns:

    Name Type Description Browser Browser

    \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 Chrome \u0432 headless \u0440\u0435\u0436\u0438\u043c\u0435.

    Source code in fixtures\\pages.py
    def get_remote_chrome(playwright: Playwright, request: FixtureRequest) -> Browser:\n    \"\"\"\u0421\u043e\u0437\u0434\u0430\u0435\u0442 \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 Chrome \u0434\u043b\u044f \u0443\u0434\u0430\u043b\u0435\u043d\u043d\u043e\u0433\u043e \u0437\u0430\u043f\u0443\u0441\u043a\u0430.\n\n    Args:\n        playwright: \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 Playwright.\n        request: \u041e\u0431\u044a\u0435\u043a\u0442 \u0437\u0430\u043f\u0440\u043e\u0441\u0430 pytest.\n\n    Returns:\n        Browser: \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 Chrome \u0432 headless \u0440\u0435\u0436\u0438\u043c\u0435.\n    \"\"\"\n\n    return playwright.chromium.launch(\n        headless=True,\n        slow_mo=request.config.getoption(\"slow\")\n    )\n
    "},{"location":"fixtures/pages/#fixtures.pages.pytest_addoption","title":"pytest_addoption(parser)","text":"

    \u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u043e\u043f\u0446\u0438\u0438 \u043a\u043e\u043c\u0430\u043d\u0434\u043d\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438 \u0434\u043b\u044f \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0430.

    Parameters:

    Name Type Description Default parser Parser

    \u041f\u0430\u0440\u0441\u0435\u0440 pytest \u0434\u043b\u044f \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043e\u043f\u0446\u0438\u0439.

    required \u041e\u043f\u0446\u0438\u0438

    --bn: \u0411\u0440\u0430\u0443\u0437\u0435\u0440 (chrome, remote_chrome, firefox) --h: \u0420\u0435\u0436\u0438\u043c headless (True/False) --s: \u0420\u0430\u0437\u043c\u0435\u0440 \u043e\u043a\u043d\u0430 {'width': int, 'height': int} --slow: \u0417\u0430\u0434\u0435\u0440\u0436\u043a\u0430 \u043c\u0435\u0436\u0434\u0443 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f\u043c\u0438 (\u043c\u0441) --t: \u0422\u0430\u0439\u043c\u0430\u0443\u0442 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e (\u043c\u0441) --l: \u041b\u043e\u043a\u0430\u043b\u044c \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0430

    Source code in fixtures\\pages.py
    def pytest_addoption(parser: Parser):\n    \"\"\"\u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u043e\u043f\u0446\u0438\u0438 \u043a\u043e\u043c\u0430\u043d\u0434\u043d\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438 \u0434\u043b\u044f \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0430.\n\n    Args:\n        parser: \u041f\u0430\u0440\u0441\u0435\u0440 pytest \u0434\u043b\u044f \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043e\u043f\u0446\u0438\u0439.\n\n    \u041e\u043f\u0446\u0438\u0438:\n        --bn: \u0411\u0440\u0430\u0443\u0437\u0435\u0440 (chrome, remote_chrome, firefox)\n        --h: \u0420\u0435\u0436\u0438\u043c headless (True/False)\n        --s: \u0420\u0430\u0437\u043c\u0435\u0440 \u043e\u043a\u043d\u0430 {'width': int, 'height': int}\n        --slow: \u0417\u0430\u0434\u0435\u0440\u0436\u043a\u0430 \u043c\u0435\u0436\u0434\u0443 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f\u043c\u0438 (\u043c\u0441)\n        --t: \u0422\u0430\u0439\u043c\u0430\u0443\u0442 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e (\u043c\u0441)\n        --l: \u041b\u043e\u043a\u0430\u043b\u044c \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0430\n    \"\"\"\n\n    parser.addoption('--bn', action='store', default=\"chrome\",\n                   help=\"Choose browser: chrome, remote_chrome or firefox\")\n    parser.addoption('--h', action='store', default=False,\n                   help='Choose headless: True or False')\n    parser.addoption('--s', action='store', default=\"{'width': 1600, 'height': 900}\",\n                   help='Size window: width,height')\n    # \u0417\u0430\u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u0430\u043b\u044c\u0442\u0435\u0440\u043d\u0430\u0442\u0438\u0432\u043d\u044b\u0435 \u0440\u0430\u0437\u043c\u0435\u0440\u044b \u043e\u043a\u043e\u043d\n    # parser.addoption('--s', action='store', default=\"{'width': 1920, 'height': 1080}\",\n    #                 help='Size window: width,height')\n    # parser.addoption('--s', action='store', default=\"{'width': 1920, 'height': 300}\",\n    #                 help='Size window: width,height')\n    # parser.addoption('--s', action='store', default=\"{'width': 300, 'height': 420}\",\n    #               help='Size window: width,height')\n    parser.addoption('--slow', action='store', default=200,\n                   help='Choose slow_mo for robot action')\n    parser.addoption('--t', action='store', default=60000,\n                   help='Choose timeout')\n    parser.addoption('--l', action='store', default='ru-RU',\n                   help='Choose locale')\n
    "},{"location":"fixtures/pages/#fixtures.pages.return_back","title":"return_back(browser)","text":"

    \u0424\u0438\u043a\u0441\u0442\u0443\u0440\u0430 \u0434\u043b\u044f \u0432\u043e\u0437\u0432\u0440\u0430\u0442\u0430 \u043d\u0430 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0443\u044e \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0443.

    Parameters:

    Name Type Description Default browser Page

    \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0430.

    required Source code in fixtures\\pages.py
    @pytest.fixture(scope=\"function\")\ndef return_back(browser: Page):\n    \"\"\"\u0424\u0438\u043a\u0441\u0442\u0443\u0440\u0430 \u0434\u043b\u044f \u0432\u043e\u0437\u0432\u0440\u0430\u0442\u0430 \u043d\u0430 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0443\u044e \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0443.\n\n    Args:\n        browser: \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0430.\n    \"\"\"\n\n    browser.go_back()\n
    "},{"location":"locators/button_locators/","title":"ButtonLocators","text":"

    \u041c\u043e\u0434\u0443\u043b\u044c button_locators \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043b\u043e\u043a\u0430\u0442\u043e\u0440\u044b \u0434\u043b\u044f \u043a\u043d\u043e\u043f\u043e\u043a \u0438 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430.

    \u041a\u043b\u0430\u0441\u0441 ButtonLocators \u0445\u0440\u0430\u043d\u0438\u0442 XPath \u0438 CSS \u043b\u043e\u043a\u0430\u0442\u043e\u0440\u044b \u0434\u043b\u044f \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0441 \u043a\u043d\u043e\u043f\u043a\u0430\u043c\u0438 \u0438 \u0432\u0441\u043f\u043b\u044b\u0432\u0430\u044e\u0449\u0438\u043c\u0438 \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0430\u043c\u0438 \u0432 \u0442\u0435\u0441\u0442\u0430\u0445.

    "},{"location":"locators/button_locators/#locators.button_locators.ButtonLocators","title":"ButtonLocators","text":"

    \u041a\u043b\u0430\u0441\u0441 \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u043b\u043e\u043a\u0430\u0442\u043e\u0440\u043e\u0432 \u043a\u043d\u043e\u043f\u043e\u043a \u0438 \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u0445 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432.

    \u0421\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043b\u043e\u043a\u0430\u0442\u043e\u0440\u044b \u0432 \u0444\u043e\u0440\u043c\u0430\u0442\u0435 XPath \u0438 CSS \u0434\u043b\u044f \u043f\u043e\u0438\u0441\u043a\u0430 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432: - \u041a\u043d\u043e\u043f\u043a\u0430 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u043b\u0438\u0446\u0435\u043d\u0437\u0438\u0438 - \u0412\u0441\u043f\u043b\u044b\u0432\u0430\u044e\u0449\u0430\u044f \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0430 - \u041a\u043d\u043e\u043f\u043a\u0430 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u0441\u0435\u0441\u0441\u0438\u0438

    Source code in locators\\button_locators.py
    class ButtonLocators:\n    \"\"\"\u041a\u043b\u0430\u0441\u0441 \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u043b\u043e\u043a\u0430\u0442\u043e\u0440\u043e\u0432 \u043a\u043d\u043e\u043f\u043e\u043a \u0438 \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u0445 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432.\n\n    \u0421\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043b\u043e\u043a\u0430\u0442\u043e\u0440\u044b \u0432 \u0444\u043e\u0440\u043c\u0430\u0442\u0435 XPath \u0438 CSS \u0434\u043b\u044f \u043f\u043e\u0438\u0441\u043a\u0430 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432:\n    - \u041a\u043d\u043e\u043f\u043a\u0430 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u043b\u0438\u0446\u0435\u043d\u0437\u0438\u0438\n    - \u0412\u0441\u043f\u043b\u044b\u0432\u0430\u044e\u0449\u0430\u044f \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0430\n    - \u041a\u043d\u043e\u043f\u043a\u0430 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u0441\u0435\u0441\u0441\u0438\u0438\n    \"\"\"\n\n    BUTTON_LICENSE_UPDATE = \"//div[@class='scrollarea__footer']//button\"\n    TOOLTIP = \"//div[contains(@class,'v-tooltip__content menuable__content__active')]\"\n    BUTTON_DELETE_SESSION = \"button.v-btn--icon svg[fill='#4caf50']\"\n
    "},{"location":"locators/confirm_locators/","title":"ConfirmLocators","text":"

    \u041c\u043e\u0434\u0443\u043b\u044c confirm_locators \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043b\u043e\u043a\u0430\u0442\u043e\u0440\u044b \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0434\u0438\u0430\u043b\u043e\u0433\u043e\u0432 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u044f.

    \u041a\u043b\u0430\u0441\u0441 ConfirmLocators \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 XPath \u043b\u043e\u043a\u0430\u0442\u043e\u0440\u044b \u0434\u043b\u044f \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0441 \u0434\u0438\u0430\u043b\u043e\u0433\u043e\u0432\u044b\u043c\u0438 \u043e\u043a\u043d\u0430\u043c\u0438 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u044f \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439 \u0432 \u0442\u0435\u0441\u0442\u0430\u0445.

    "},{"location":"locators/confirm_locators/#locators.confirm_locators.ConfirmLocators","title":"ConfirmLocators","text":"

    \u041b\u043e\u043a\u0430\u0442\u043e\u0440\u044b \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0434\u0438\u0430\u043b\u043e\u0433\u043e\u0432 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u044f.

    \u0421\u043e\u0434\u0435\u0440\u0436\u0438\u0442 XPath \u043b\u043e\u043a\u0430\u0442\u043e\u0440\u044b \u0434\u043b\u044f

    CONFIRM (str): \u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0433\u043e \u0434\u0438\u0430\u043b\u043e\u0433\u043e\u0432\u043e\u0433\u043e \u043e\u043a\u043d\u0430. TITLE (str): \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430 \u0434\u0438\u0430\u043b\u043e\u0433\u043e\u0432\u043e\u0433\u043e \u043e\u043a\u043d\u0430. BUTTON_CLOSE (str): \u043a\u043d\u043e\u043f\u043a\u0438 \u0437\u0430\u043a\u0440\u044b\u0442\u0438\u044f \u0434\u0438\u0430\u043b\u043e\u0433\u0430. TEXT (str): \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u043e\u0433\u043e \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0433\u043e \u0434\u0438\u0430\u043b\u043e\u0433\u0430 (\u0444\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0438).

    Source code in locators\\confirm_locators.py
    class ConfirmLocators:\n    \"\"\"\u041b\u043e\u043a\u0430\u0442\u043e\u0440\u044b \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0434\u0438\u0430\u043b\u043e\u0433\u043e\u0432 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u044f.\n\n    \u0421\u043e\u0434\u0435\u0440\u0436\u0438\u0442 XPath \u043b\u043e\u043a\u0430\u0442\u043e\u0440\u044b \u0434\u043b\u044f:\n        CONFIRM (str): \u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0433\u043e \u0434\u0438\u0430\u043b\u043e\u0433\u043e\u0432\u043e\u0433\u043e \u043e\u043a\u043d\u0430.\n        TITLE (str): \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430 \u0434\u0438\u0430\u043b\u043e\u0433\u043e\u0432\u043e\u0433\u043e \u043e\u043a\u043d\u0430.\n        BUTTON_CLOSE (str): \u043a\u043d\u043e\u043f\u043a\u0438 \u0437\u0430\u043a\u0440\u044b\u0442\u0438\u044f \u0434\u0438\u0430\u043b\u043e\u0433\u0430.\n        TEXT (str): \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u043e\u0433\u043e \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0433\u043e \u0434\u0438\u0430\u043b\u043e\u0433\u0430 (\u0444\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0438).\n    \"\"\"\n\n    CONFIRM = \"//div[contains(@class, 'v-dialog--active')]\"\n    TITLE = \"//div[@class='v-card__title']/h3\"\n    BUTTON_CLOSE = \"//div[@class='vuedl-layout__closeBtn']\"\n    TEXT = f\"{CONFIRM}/div[2]/div[@class='v-card__text']\"\n
    "},{"location":"locators/event_panel_locators/","title":"EventPanelLocators","text":"

    \u041c\u043e\u0434\u0443\u043b\u044c event_panel_locators \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043b\u043e\u043a\u0430\u0442\u043e\u0440\u044b \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u043f\u0430\u043d\u0435\u043b\u0438 \u0441\u043e\u0431\u044b\u0442\u0438\u0439.

    \u041a\u043b\u0430\u0441\u0441 EventPanelLocators \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 XPath \u043b\u043e\u043a\u0430\u0442\u043e\u0440\u044b \u0434\u043b\u044f \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0441 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u043c\u0438 \u043f\u0430\u043d\u0435\u043b\u0438 \u0441\u043e\u0431\u044b\u0442\u0438\u0439 \u0432 \u0442\u0435\u0441\u0442\u0430\u0445.

    "},{"location":"locators/event_panel_locators/#locators.event_panel_locators.EventPanelLocators","title":"EventPanelLocators","text":"

    \u041b\u043e\u043a\u0430\u0442\u043e\u0440\u044b \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u043f\u0430\u043d\u0435\u043b\u0438 \u0441\u043e\u0431\u044b\u0442\u0438\u0439.

    \u0421\u043e\u0434\u0435\u0440\u0436\u0438\u0442 XPath \u043b\u043e\u043a\u0430\u0442\u043e\u0440\u044b \u0434\u043b\u044f: TABS_BLOCK (str): \u0431\u043b\u043e\u043a\u0430 \u043a\u043d\u043e\u043f\u043e\u043a \u0432 \u043f\u0430\u043d\u0435\u043b\u0438 \u0441\u043e\u0431\u044b\u0442\u0438\u0439. TAB_EXPAND_BUTTONS (str): \u0431\u043b\u043e\u043a\u0430 \u043a\u043d\u043e\u043f\u043e\u043a \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f \u043f\u0430\u043d\u0435\u043b\u0438 \u0441\u043e\u0431\u044b\u0442\u0438\u0439. TAB_STATES (str): \u043a\u043d\u043e\u043f\u043a\u0438 \u0421\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f. TAB_ACTIONS (str): \u043a\u043d\u043e\u043f\u043a\u0438 \u0414\u0435\u0439\u0441\u0442\u0432\u0438\u044f. TAB_EVENTS (str): \u043a\u043d\u043e\u043f\u043a\u0438 \u0421\u043e\u0431\u044b\u0442\u0438\u044f. TAB_MAINTENANCE (str): \u043a\u043d\u043e\u043f\u043a\u0438 \u041e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u043d\u0438\u044f. TAB_SYSTEM_LOG (str): \u043a\u043d\u043e\u043f\u043a\u0438 \u0421\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0439 \u0436\u0443\u0440\u043d\u0430\u043b. CONTAINER_SYSTEM_LOG_EVENTS (str): \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430 \u0441 \u0441\u043e\u0431\u044b\u0442\u0438\u044f\u043c\u0438 \u0421\u0438\u0441\u0442\u0435\u043c\u043d\u043e\u0433\u043e \u0436\u0443\u0440\u043d\u0430\u043b\u0430. BUTTONS_EVENT (str): \u0431\u043b\u043e\u043a\u0430 \u043a\u043d\u043e\u043f\u043e\u043a-\u0441\u0447\u0435\u0442\u0447\u0438\u043a\u043e\u0432 \u0441\u043e\u0431\u044b\u0442\u0438\u0439. BUTTONS_SERVICE (str): \u0431\u043b\u043e\u043a\u0430 \u043a\u043d\u043e\u043f\u043e\u043a, \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0435\u0433\u043e \u043a\u043d\u043e\u043f\u043a\u0438 \u041f\u043e\u0438\u0441\u043a\u0430 \u0438 \u0422\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f. AREA_EVENTS (str): \u0440\u0430\u0431\u043e\u0447\u0435\u0439 \u043e\u0431\u043b\u0430\u0441\u0442\u0438 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b.

    Source code in locators\\event_panel_locators.py
    class EventPanelLocators:\n    \"\"\"\u041b\u043e\u043a\u0430\u0442\u043e\u0440\u044b \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u043f\u0430\u043d\u0435\u043b\u0438 \u0441\u043e\u0431\u044b\u0442\u0438\u0439.\n\n    \u0421\u043e\u0434\u0435\u0440\u0436\u0438\u0442 XPath \u043b\u043e\u043a\u0430\u0442\u043e\u0440\u044b \u0434\u043b\u044f:\n    TABS_BLOCK (str): \u0431\u043b\u043e\u043a\u0430 \u043a\u043d\u043e\u043f\u043e\u043a \u0432 \u043f\u0430\u043d\u0435\u043b\u0438 \u0441\u043e\u0431\u044b\u0442\u0438\u0439.\n    TAB_EXPAND_BUTTONS (str): \u0431\u043b\u043e\u043a\u0430 \u043a\u043d\u043e\u043f\u043e\u043a \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f \u043f\u0430\u043d\u0435\u043b\u0438 \u0441\u043e\u0431\u044b\u0442\u0438\u0439.\n    TAB_STATES (str): \u043a\u043d\u043e\u043f\u043a\u0438 \u0421\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f.\n    TAB_ACTIONS (str): \u043a\u043d\u043e\u043f\u043a\u0438 \u0414\u0435\u0439\u0441\u0442\u0432\u0438\u044f.\n    TAB_EVENTS (str): \u043a\u043d\u043e\u043f\u043a\u0438 \u0421\u043e\u0431\u044b\u0442\u0438\u044f.\n    TAB_MAINTENANCE (str): \u043a\u043d\u043e\u043f\u043a\u0438 \u041e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u043d\u0438\u044f.\n    TAB_SYSTEM_LOG (str): \u043a\u043d\u043e\u043f\u043a\u0438 \u0421\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0439 \u0436\u0443\u0440\u043d\u0430\u043b.\n    CONTAINER_SYSTEM_LOG_EVENTS (str): \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430 \u0441 \u0441\u043e\u0431\u044b\u0442\u0438\u044f\u043c\u0438 \u0421\u0438\u0441\u0442\u0435\u043c\u043d\u043e\u0433\u043e \u0436\u0443\u0440\u043d\u0430\u043b\u0430.\n    BUTTONS_EVENT (str): \u0431\u043b\u043e\u043a\u0430 \u043a\u043d\u043e\u043f\u043e\u043a-\u0441\u0447\u0435\u0442\u0447\u0438\u043a\u043e\u0432 \u0441\u043e\u0431\u044b\u0442\u0438\u0439.\n    BUTTONS_SERVICE (str): \u0431\u043b\u043e\u043a\u0430 \u043a\u043d\u043e\u043f\u043e\u043a, \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0435\u0433\u043e \u043a\u043d\u043e\u043f\u043a\u0438 \u041f\u043e\u0438\u0441\u043a\u0430 \u0438 \u0422\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\n    AREA_EVENTS (str): \u0440\u0430\u0431\u043e\u0447\u0435\u0439 \u043e\u0431\u043b\u0430\u0441\u0442\u0438 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b.\n    \"\"\"\n\n    TABS_BLOCK = \"//nav/div[@class='v-toolbar__content']/div[@class='v-toolbar__items'][1]\"\n    TAB_EXPAND_BUTTONS = f\"{TABS_BLOCK}/div[1]/div[1]/div\"\n    TAB_STATES = f\"{TABS_BLOCK}//div[@class='v-tabs']//div[@class='v-tabs__container']/div[2]\"\n    TAB_ACTIONS = f\"{TABS_BLOCK}//div[@class='v-tabs']//div[@class='v-tabs__container']/div[3]\"\n    TAB_EVENTS = f\"{TABS_BLOCK}//div[@class='v-tabs']//div[@class='v-tabs__container']/div[4]\"\n    TAB_MAINTENANCE = f\"{TABS_BLOCK}//div[@class='v-tabs']//div[@class='v-tabs__container']/div[5]\"\n    TAB_SYSTEM_LOG = f\"{TABS_BLOCK}//div[@class='v-tabs']//div[@class='v-tabs__container']/div[6]\"\n\n    CONTAINER_SYSTEM_LOG_EVENTS = \"#app > div.application--wrap > div > div:nth-child(3) > div:nth-child(5)\"\n\n\n    BUTTONS_EVENT = \"//nav/div[@class='v-toolbar__content']/div[@class='v-toolbar__items'][2]//span[contains(@class, 'v-tooltip')]\"\n    BUTTONS_SERVICE = \"//nav/div[@class='v-toolbar__content']/div[@class='v-toolbar__items'][2]\"\n\n    AREA_EVENTS = \"#app > div.application--wrap > div > div:nth-child(3)\"\n
    "},{"location":"locators/input_locators/","title":"InputLocators","text":"

    \u041c\u043e\u0434\u0443\u043b\u044c input_locators \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043b\u043e\u043a\u0430\u0442\u043e\u0440\u044b \u043f\u043e\u043b\u0435\u0439 \u0432\u0432\u043e\u0434\u0430 \u043d\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435.

    \u041a\u043b\u0430\u0441\u0441 InputLocators \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 XPath \u043b\u043e\u043a\u0430\u0442\u043e\u0440\u044b \u0434\u043b\u044f \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0441 \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u044b\u043c\u0438 \u043f\u043e\u043b\u044f\u043c\u0438 \u0432\u0432\u043e\u0434\u0430 \u0432 \u0442\u0435\u0441\u0442\u0430\u0445.

    "},{"location":"locators/input_locators/#locators.input_locators.InputLocators","title":"InputLocators","text":"

    \u041b\u043e\u043a\u0430\u0442\u043e\u0440\u044b \u0434\u043b\u044f \u043f\u043e\u043b\u0435\u0439 \u0432\u0432\u043e\u0434\u0430 \u043d\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435.

    \u0421\u043e\u0434\u0435\u0440\u0436\u0438\u0442 XPath \u043b\u043e\u043a\u0430\u0442\u043e\u0440\u044b \u0434\u043b\u044f: LICENSE_ID_UPDATE (str): \u043f\u043e\u043b\u044f \u0432\u0432\u043e\u0434\u0430 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u0430 \u043b\u0438\u0446\u0435\u043d\u0437\u0438\u0438 \u0432 \u043f\u043e\u0434\u0432\u0430\u043b\u0435

    Source code in locators\\input_locators.py
    class InputLocators:\n    \"\"\"\u041b\u043e\u043a\u0430\u0442\u043e\u0440\u044b \u0434\u043b\u044f \u043f\u043e\u043b\u0435\u0439 \u0432\u0432\u043e\u0434\u0430 \u043d\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435.\n\n\n    \u0421\u043e\u0434\u0435\u0440\u0436\u0438\u0442 XPath \u043b\u043e\u043a\u0430\u0442\u043e\u0440\u044b \u0434\u043b\u044f:\n    LICENSE_ID_UPDATE (str): \u043f\u043e\u043b\u044f \u0432\u0432\u043e\u0434\u0430 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u0430 \u043b\u0438\u0446\u0435\u043d\u0437\u0438\u0438 \u0432 \u043f\u043e\u0434\u0432\u0430\u043b\u0435\n\n\n\n\n    \"\"\"\n\n    LICENSE_ID_UPDATE = \"//div[@class='scrollarea__footer']//div[@class='v-input__control']//textarea\"\n
    "},{"location":"locators/json_container_locators/","title":"JsonContainerLocators","text":"

    \u041c\u043e\u0434\u0443\u043b\u044c json_container_locators \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043b\u043e\u043a\u0430\u0442\u043e\u0440\u044b \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u043e\u0432 JSON-\u0434\u0430\u043d\u043d\u044b\u0445.

    \u041a\u043b\u0430\u0441\u0441 JsonContainerLocators \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 XPath \u043b\u043e\u043a\u0430\u0442\u043e\u0440\u044b \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430\u043c\u0438 JSON-\u0434\u0430\u043d\u043d\u044b\u0445 \u043d\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435.

    "},{"location":"locators/json_container_locators/#locators.json_container_locators.JsonContainerLocators","title":"JsonContainerLocators","text":"

    \u041b\u043e\u043a\u0430\u0442\u043e\u0440\u044b \u0434\u043b\u044f \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u043e\u0432 JSON-\u0434\u0430\u043d\u043d\u044b\u0445 \u043d\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435.

    \u0421\u043e\u0434\u0435\u0440\u0436\u0438\u0442 XPath \u043b\u043e\u043a\u0430\u0442\u043e\u0440\u044b \u0434\u043b\u044f: CONTAINER (str): \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0433\u043e \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430 JSON-\u0434\u0430\u043d\u043d\u044b\u0445 SCROLL_CONTAINER (str): \u043f\u0440\u043e\u043a\u0440\u0443\u0447\u0438\u0432\u0430\u0435\u043c\u043e\u0439 \u043e\u0431\u043b\u0430\u0441\u0442\u0438 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430

    Source code in locators\\json_container_locators.py
    class JsonContainerLocators:\n    \"\"\"\u041b\u043e\u043a\u0430\u0442\u043e\u0440\u044b \u0434\u043b\u044f \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u043e\u0432 JSON-\u0434\u0430\u043d\u043d\u044b\u0445 \u043d\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435.\n\n    \u0421\u043e\u0434\u0435\u0440\u0436\u0438\u0442 XPath \u043b\u043e\u043a\u0430\u0442\u043e\u0440\u044b \u0434\u043b\u044f:\n    CONTAINER (str): \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0433\u043e \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430 JSON-\u0434\u0430\u043d\u043d\u044b\u0445\n    SCROLL_CONTAINER (str): \u043f\u0440\u043e\u043a\u0440\u0443\u0447\u0438\u0432\u0430\u0435\u043c\u043e\u0439 \u043e\u0431\u043b\u0430\u0441\u0442\u0438 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430\n    \"\"\"\n\n    CONTAINER = \"//div[contains(@class,'jv-container')]\"\n    SCROLL_CONTAINER = \"//div[contains(@class, 'scrollarea__body')]\"\n
    "},{"location":"locators/modal_window_locators/","title":"ModalWindowLocators","text":"

    \u041c\u043e\u0434\u0443\u043b\u044c modal_window_locators \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043b\u043e\u043a\u0430\u0442\u043e\u0440\u044b \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u044b\u0445 \u043e\u043a\u043e\u043d.

    \u041a\u043b\u0430\u0441\u0441 ModalWindowLocators \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 XPath \u043b\u043e\u043a\u0430\u0442\u043e\u0440\u044b \u0434\u043b\u044f \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0441 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u043c\u0438 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u044b\u0445 \u043e\u043a\u043e\u043d \u0432 \u0442\u0435\u0441\u0442\u0430\u0445.

    "},{"location":"locators/modal_window_locators/#locators.modal_window_locators.ModalWindowLocators","title":"ModalWindowLocators","text":"

    \u041b\u043e\u043a\u0430\u0442\u043e\u0440\u044b \u0434\u043b\u044f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u044b\u0445 \u043e\u043a\u043e\u043d.

    \u0421\u043e\u0434\u0435\u0440\u0436\u0438\u0442 XPath \u043b\u043e\u043a\u0430\u0442\u043e\u0440\u044b \u0434\u043b\u044f: MODAL_WINDOW (str): \u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0433\u043e \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430 INPUT_FORM_USER_DATA (str): \u0444\u043e\u0440\u043c\u044b \u0432\u0432\u043e\u0434\u0430 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 TEXT_FIELD_INPUT_FORM_USER_DATA (str): \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u043b\u044f \u0432\u0432\u043e\u0434\u0430 MENU_INPUT_FORM_USER_DATA (str): \u043c\u0435\u043d\u044e \u0432\u044b\u0431\u043e\u0440\u0430 \u0440\u043e\u043b\u0435\u0439 LABEL_INPUT_FORM_USER_DATA (str): \u043c\u0435\u0442\u043a\u0438 \u043f\u043e\u043b\u044f \u0432\u0432\u043e\u0434\u0430 MODAL_WINDOW_SCROLL_CONTAINER (str): \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430 \u0441 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u043e\u0439 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430 MODAL_WINDOW_TITLE (str): \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430 \u0442\u0443\u043b\u0431\u0430\u0440\u0430 MODAL_WINDOW_TEXT_FIELD_INPUT (str): \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u043b\u044f \u0432\u0432\u043e\u0434\u0430

    Source code in locators\\modal_window_locators.py
    class ModalWindowLocators:\n    \"\"\"\u041b\u043e\u043a\u0430\u0442\u043e\u0440\u044b \u0434\u043b\u044f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u044b\u0445 \u043e\u043a\u043e\u043d.\n\n    \u0421\u043e\u0434\u0435\u0440\u0436\u0438\u0442 XPath \u043b\u043e\u043a\u0430\u0442\u043e\u0440\u044b \u0434\u043b\u044f:\n    MODAL_WINDOW (str): \u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0433\u043e \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430\n    INPUT_FORM_USER_DATA (str): \u0444\u043e\u0440\u043c\u044b \u0432\u0432\u043e\u0434\u0430 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0445 \u0434\u0430\u043d\u043d\u044b\u0445\n    TEXT_FIELD_INPUT_FORM_USER_DATA (str): \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u043b\u044f \u0432\u0432\u043e\u0434\u0430\n    MENU_INPUT_FORM_USER_DATA (str): \u043c\u0435\u043d\u044e \u0432\u044b\u0431\u043e\u0440\u0430 \u0440\u043e\u043b\u0435\u0439\n    LABEL_INPUT_FORM_USER_DATA (str): \u043c\u0435\u0442\u043a\u0438 \u043f\u043e\u043b\u044f \u0432\u0432\u043e\u0434\u0430\n    MODAL_WINDOW_SCROLL_CONTAINER (str): \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430 \u0441 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u043e\u0439 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430\n    MODAL_WINDOW_TITLE (str): \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430 \u0442\u0443\u043b\u0431\u0430\u0440\u0430\n    MODAL_WINDOW_TEXT_FIELD_INPUT (str): \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u043b\u044f \u0432\u0432\u043e\u0434\u0430\n    \"\"\"\n\n    MODAL_WINDOW = \"//div[contains(@class, 'v-dialog--active')]\"\n    MODAL_WINDOW_SCROLL_CONTAINER = f\"{MODAL_WINDOW}//div[contains(@class, 'scrollarea__body')]\"\n    MODAL_WINDOW_TITLE = f\"{MODAL_WINDOW}//div[contains(@class, 'v-toolbar__title')]\"\n    MODAL_WINDOW_TEXT_FIELD_INPUT = f\"{MODAL_WINDOW}//input\"\n\n    INPUT_FORM_USER_DATA = \"//form[@class='v-form']\"\n    TEXT_FIELD_INPUT_FORM_USER_DATA = \"xpath=div[2]/div/div/div/div/input\"\n    MENU_INPUT_FORM_USER_DATA = \"//div[contains(@class, 'menuable__content__active')]\"\n    LABEL_INPUT_FORM_USER_DATA = \"//label[contains(@class,'v-label')]/span\"\n
    "},{"location":"locators/navigation_panel_locators/","title":"NavigationPanelLocators","text":"

    \u041c\u043e\u0434\u0443\u043b\u044c navigation_panel_locators \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043b\u043e\u043a\u0430\u0442\u043e\u0440\u044b \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u043e\u043d\u043d\u043e\u0439 \u043f\u0430\u043d\u0435\u043b\u0438.

    \u041a\u043b\u0430\u0441\u0441 NavigationPanelLocators \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 XPath \u043b\u043e\u043a\u0430\u0442\u043e\u0440\u044b \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u043c\u0438 \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u043e\u043d\u043d\u043e\u0439 \u043f\u0430\u043d\u0435\u043b\u0438 \u0432 \u0442\u0435\u0441\u0442\u0430\u0445.

    "},{"location":"locators/navigation_panel_locators/#locators.navigation_panel_locators.NavigationPanelLocators","title":"NavigationPanelLocators","text":"

    \u041b\u043e\u043a\u0430\u0442\u043e\u0440\u044b \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u043e\u043d\u043d\u043e\u0439 \u043f\u0430\u043d\u0435\u043b\u0438.

    \u0421\u043e\u0434\u0435\u0440\u0436\u0438\u0442 XPath \u043b\u043e\u043a\u0430\u0442\u043e\u0440\u044b \u0434\u043b\u044f: PANEL_MAIN (str): \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u043f\u0430\u043d\u0435\u043b\u0438 \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438 PANEL_SCROLL_CONTAINER (str): \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430 \u0441 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u043e\u0439 ACTIVE_CONTAINER(str): \u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0433\u043e \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430, \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0435\u0433\u043e \u043e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u043c\u044b\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u043f\u0430\u043d\u0435\u043b\u0438 \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438 TREEVIEW(str): \u043a\u043e\u0440\u043d\u044f \u043e\u0431\u044a\u0435\u043a\u0442\u0430 v-treeview NODE(str): \u0443\u0437\u043b\u0430 \u0434\u0435\u0440\u0435\u0432\u0430 NODE_ROOT (str): \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0433\u043e \u0443\u0437\u043b\u0430 \u0434\u0435\u0440\u0435\u0432\u0430 NODE_CHILDREN (str): \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0445 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0443\u0437\u043b\u0430 TOGGLE_BUTTON(str): \u043a\u043d\u043e\u043f\u043a\u0438 \u0440\u0430\u0441\u043a\u0440\u044b\u0442\u0438\u044f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u043f\u0430\u043d\u0435\u043b\u0438 \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438

    Source code in locators\\navigation_panel_locators.py
    class NavigationPanelLocators:\n    \"\"\"\u041b\u043e\u043a\u0430\u0442\u043e\u0440\u044b \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u043e\u043d\u043d\u043e\u0439 \u043f\u0430\u043d\u0435\u043b\u0438.\n\n    \u0421\u043e\u0434\u0435\u0440\u0436\u0438\u0442 XPath \u043b\u043e\u043a\u0430\u0442\u043e\u0440\u044b \u0434\u043b\u044f:\n    PANEL_MAIN (str): \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u043f\u0430\u043d\u0435\u043b\u0438 \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438\n    PANEL_SCROLL_CONTAINER (str): \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430 \u0441 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u043e\u0439\n    ACTIVE_CONTAINER(str): \u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0433\u043e \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430, \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0435\u0433\u043e \u043e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u043c\u044b\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u043f\u0430\u043d\u0435\u043b\u0438 \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438\n    TREEVIEW(str): \u043a\u043e\u0440\u043d\u044f \u043e\u0431\u044a\u0435\u043a\u0442\u0430 v-treeview\n    NODE(str): \u0443\u0437\u043b\u0430 \u0434\u0435\u0440\u0435\u0432\u0430\n    NODE_ROOT (str): \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0433\u043e \u0443\u0437\u043b\u0430 \u0434\u0435\u0440\u0435\u0432\u0430\n    NODE_CHILDREN (str): \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0445 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0443\u0437\u043b\u0430\n    TOGGLE_BUTTON(str): \u043a\u043d\u043e\u043f\u043a\u0438 \u0440\u0430\u0441\u043a\u0440\u044b\u0442\u0438\u044f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u043f\u0430\u043d\u0435\u043b\u0438 \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438\n    \"\"\"\n\n    PANEL_MAIN = \"//ul[contains(@class, 'v-expansion-panel')]\"\n    PANEL_SCROLL_CONTAINER = \"//div[contains(@class, 'scrollarea__body') and .//ul[contains(@class, 'v-expansion-panel')]]\"\n\n    ACTIVE_CONTAINER = \"//li[contains(@class, 'v-expansion-panel__container--active')]\"\n    SUB_PANEL_MAIN = \"//div[contains(@class,'v-expansion-panel__body')]\"\n\n    TREEVIEW = \"//div[contains(@class,'v-treeview')]\"\n    NODE = \"//div[contains(@class,'v-treeview-node')]\"\n    NODE_ROOT = \"//div[contains(@class,'v-treeview-node__root')]\"\n    NODE_CHILDREN = \"//div[contains(@class,'v-treeview-node__children')]\"\n    TOGGLE_BUTTON = \"//i[contains(@class,'v-treeview-node__toggle')]\"\n
    "},{"location":"locators/table_locators/","title":"TableLocators","text":"

    \u041c\u043e\u0434\u0443\u043b\u044c table_locators \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043b\u043e\u043a\u0430\u0442\u043e\u0440\u044b \u0442\u0430\u0431\u043b\u0438\u0447\u043d\u044b\u0445 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432.

    \u041a\u043b\u0430\u0441\u0441 TableLocators \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 XPath \u043b\u043e\u043a\u0430\u0442\u043e\u0440\u044b \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0442\u0430\u0431\u043b\u0438\u0446\u0430\u043c\u0438 \u0432 \u0440\u0430\u0431\u043e\u0447\u0435\u0439 \u043e\u0431\u043b\u0430\u0441\u0442\u0438 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f.

    "},{"location":"locators/table_locators/#locators.table_locators.TableLocators","title":"TableLocators","text":"

    \u041b\u043e\u043a\u0430\u0442\u043e\u0440\u044b \u0434\u043b\u044f \u0442\u0430\u0431\u043b\u0438\u0447\u043d\u044b\u0445 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0432 \u0440\u0430\u0431\u043e\u0447\u0435\u0439 \u043e\u0431\u043b\u0430\u0441\u0442\u0438.

    \u0421\u043e\u0434\u0435\u0440\u0436\u0438\u0442 XPath \u043b\u043e\u043a\u0430\u0442\u043e\u0440\u044b \u0434\u043b\u044f: TABLE_WORK_AREA (str): \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0432 \u0440\u0430\u0431\u043e\u0447\u0435\u0439 \u043e\u0431\u043b\u0430\u0441\u0442\u0438 TABLE_SCROLL_CONTAINER (str): \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430 \u0441 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u043e\u0439 \u0442\u0430\u0431\u043b\u0438\u0446\u044b

    Source code in locators\\table_locators.py
    class TableLocators:\n    \"\"\"\u041b\u043e\u043a\u0430\u0442\u043e\u0440\u044b \u0434\u043b\u044f \u0442\u0430\u0431\u043b\u0438\u0447\u043d\u044b\u0445 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0432 \u0440\u0430\u0431\u043e\u0447\u0435\u0439 \u043e\u0431\u043b\u0430\u0441\u0442\u0438.\n\n    \u0421\u043e\u0434\u0435\u0440\u0436\u0438\u0442 XPath \u043b\u043e\u043a\u0430\u0442\u043e\u0440\u044b \u0434\u043b\u044f:\n    TABLE_WORK_AREA (str): \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0432 \u0440\u0430\u0431\u043e\u0447\u0435\u0439 \u043e\u0431\u043b\u0430\u0441\u0442\u0438\n    TABLE_SCROLL_CONTAINER (str): \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430 \u0441 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u043e\u0439 \u0442\u0430\u0431\u043b\u0438\u0446\u044b\n    \"\"\"\n\n    TABLE_WORK_AREA = \"//div[@class='scrollarea__body']/div/div/div/table\"\n    TABLE_SCROLL_CONTAINER = \"//div[contains(@class, 'scrollarea__body') and .//table[@class='scrolltable__container']]//tbody\"\n
    "},{"location":"locators/text_input_locators/","title":"TextInputLocators","text":"

    \u041c\u043e\u0434\u0443\u043b\u044c text_input_locators \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043b\u043e\u043a\u0430\u0442\u043e\u0440\u044b \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0432\u0432\u043e\u0434\u0430 \u0442\u0435\u043a\u0441\u0442\u0430.

    \u041a\u043b\u0430\u0441\u0441 TextInputLocators \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 XPath \u043b\u043e\u043a\u0430\u0442\u043e\u0440\u044b \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u043c\u0438 \u0432\u0432\u043e\u0434\u0430 \u0442\u0435\u043a\u0441\u0442\u0430 \u043d\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0430\u0445 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f.

    "},{"location":"locators/text_input_locators/#locators.text_input_locators.TextInputLocators","title":"TextInputLocators","text":"

    \u041b\u043e\u043a\u0430\u0442\u043e\u0440\u044b \u0434\u043b\u044f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0432\u0432\u043e\u0434\u0430 \u0442\u0435\u043a\u0441\u0442\u0430.

    \u0421\u043e\u0434\u0435\u0440\u0436\u0438\u0442 XPath \u043b\u043e\u043a\u0430\u0442\u043e\u0440\u044b \u0434\u043b\u044f: INPUT_FORM_MESSAGE (str): \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f-\u043f\u0440\u0435\u0434\u0443\u043f\u0440\u0435\u0436\u0434\u0435\u043d\u0438\u044f \u043f\u043e\u043b\u044f \u0444\u043e\u0440\u043c\u044b \u0432\u0432\u043e\u0434\u0430

    Source code in locators\\text_input_locators.py
    class TextInputLocators:\n    \"\"\"\u041b\u043e\u043a\u0430\u0442\u043e\u0440\u044b \u0434\u043b\u044f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0432\u0432\u043e\u0434\u0430 \u0442\u0435\u043a\u0441\u0442\u0430.\n\n    \u0421\u043e\u0434\u0435\u0440\u0436\u0438\u0442 XPath \u043b\u043e\u043a\u0430\u0442\u043e\u0440\u044b \u0434\u043b\u044f:\n    INPUT_FORM_MESSAGE (str): \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f-\u043f\u0440\u0435\u0434\u0443\u043f\u0440\u0435\u0436\u0434\u0435\u043d\u0438\u044f \u043f\u043e\u043b\u044f \u0444\u043e\u0440\u043c\u044b \u0432\u0432\u043e\u0434\u0430\n    \"\"\"\n\n    INPUT_FORM_MESSAGE = \"//div[contains(@class,'v-messages__message')]\"\n    ICON_PASSWORD_HIDING = \"//i[contains(@class,'v-icon')]\"\n
    "},{"location":"locators/text_locators/","title":"TextLocators","text":"

    \u041c\u043e\u0434\u0443\u043b\u044c text_locators \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043b\u043e\u043a\u0430\u0442\u043e\u0440\u044b \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u044b\u0445 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432.

    \u041a\u043b\u0430\u0441\u0441 TextLocators \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 XPath \u043b\u043e\u043a\u0430\u0442\u043e\u0440\u044b \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u044b\u043c\u0438 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u043c\u0438 \u043d\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0430\u0445 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f.

    "},{"location":"locators/text_locators/#locators.text_locators.TextLocators","title":"TextLocators","text":"

    \u041b\u043e\u043a\u0430\u0442\u043e\u0440\u044b \u0434\u043b\u044f \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u044b\u0445 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u043d\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435.

    \u0421\u043e\u0434\u0435\u0440\u0436\u0438\u0442 XPath \u043b\u043e\u043a\u0430\u0442\u043e\u0440\u044b \u0434\u043b\u044f: TITLE_LICENSE_INPUT_FORM (str): \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430 \u0444\u043e\u0440\u043c\u044b \u0432\u0432\u043e\u0434\u0430 \u043b\u0438\u0446\u0435\u043d\u0437\u0438\u0438 LICENSE_ID (str): \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0435\u043c\u043e\u0433\u043e ID \u043b\u0438\u0446\u0435\u043d\u0437\u0438\u0438 (\u0432\u044b\u0434\u0435\u043b\u044f\u0435\u043c\u044b\u0439 \u0442\u0435\u043a\u0441\u0442)

    Source code in locators\\text_locators.py
    class TextLocators:\n    \"\"\"\u041b\u043e\u043a\u0430\u0442\u043e\u0440\u044b \u0434\u043b\u044f \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u044b\u0445 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u043d\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435.\n\n    \u0421\u043e\u0434\u0435\u0440\u0436\u0438\u0442 XPath \u043b\u043e\u043a\u0430\u0442\u043e\u0440\u044b \u0434\u043b\u044f:\n    TITLE_LICENSE_INPUT_FORM (str): \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430 \u0444\u043e\u0440\u043c\u044b \u0432\u0432\u043e\u0434\u0430 \u043b\u0438\u0446\u0435\u043d\u0437\u0438\u0438\n    LICENSE_ID (str): \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0435\u043c\u043e\u0433\u043e ID \u043b\u0438\u0446\u0435\u043d\u0437\u0438\u0438 (\u0432\u044b\u0434\u0435\u043b\u044f\u0435\u043c\u044b\u0439 \u0442\u0435\u043a\u0441\u0442)\n    \"\"\"\n\n    TITLE_LICENSE_INPUT_FORM = \"//span[@class='title']\"\n    LICENSE_ID = \"//span[@class='title text_select']\"\n
    "},{"location":"locators/toolbar_locators/","title":"ToolbarLocators","text":"

    \u041c\u043e\u0434\u0443\u043b\u044c toolbar_locators \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043b\u043e\u043a\u0430\u0442\u043e\u0440\u044b \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u043f\u0430\u043d\u0435\u043b\u0438 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432.

    \u041a\u043b\u0430\u0441\u0441 ToolbarLocators \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 XPath \u043b\u043e\u043a\u0430\u0442\u043e\u0440\u044b \u0434\u043b\u044f \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0441 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u043c\u0438 \u0442\u0443\u043b\u0431\u0430\u0440\u0430 \u0438 \u0432\u0441\u043f\u043b\u044b\u0432\u0430\u044e\u0449\u0438\u043c\u0438 \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0430\u043c\u0438.

    "},{"location":"locators/toolbar_locators/#locators.toolbar_locators.ToolbarLocators","title":"ToolbarLocators","text":"

    \u041b\u043e\u043a\u0430\u0442\u043e\u0440\u044b \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u043f\u0430\u043d\u0435\u043b\u0438 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432 (\u0442\u0443\u043b\u0431\u0430\u0440\u0430).

    \u0421\u043e\u0434\u0435\u0440\u0436\u0438\u0442 XPath \u043b\u043e\u043a\u0430\u0442\u043e\u0440\u044b \u0434\u043b\u044f: TITLE (str): \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430 \u0442\u0443\u043b\u0431\u0430\u0440\u0430 TOOLTIP (str): \u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0439 \u0432\u0441\u043f\u043b\u044b\u0432\u0430\u044e\u0449\u0435\u0439 \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0438

    Source code in locators\\toolbar_locators.py
    class ToolbarLocators:\n    \"\"\"\u041b\u043e\u043a\u0430\u0442\u043e\u0440\u044b \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u043f\u0430\u043d\u0435\u043b\u0438 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432 (\u0442\u0443\u043b\u0431\u0430\u0440\u0430).\n\n    \u0421\u043e\u0434\u0435\u0440\u0436\u0438\u0442 XPath \u043b\u043e\u043a\u0430\u0442\u043e\u0440\u044b \u0434\u043b\u044f:\n    TITLE (str): \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430 \u0442\u0443\u043b\u0431\u0430\u0440\u0430\n\tTOOLTIP (str): \u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0439 \u0432\u0441\u043f\u043b\u044b\u0432\u0430\u044e\u0449\u0435\u0439 \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0438\n    \"\"\"\n\n    TITLE = \"//nav//div[contains(@class, 'v-toolbar__title')]\"\n    ITEMS = \"//nav//div[@class='v-toolbar__items']\"\n    TABS = \"//nav//div[contains(@class, 'v-toolbar__title')]//a[contains(@class, 'v-tabs__item')]\"\n    TOOLTIP = \"//div[contains(@class,'v-tooltip__content menuable__content__active')]\"\n
    "},{"location":"locators/user_card_locators/","title":"UserCardLocators","text":"

    \u041c\u043e\u0434\u0443\u043b\u044c user_card_locators \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043b\u043e\u043a\u0430\u0442\u043e\u0440\u044b \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u043a\u0430\u0440\u0442\u043e\u0447\u043a\u0438 \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.

    \u041a\u043b\u0430\u0441\u0441 UserCardLocators \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 XPath \u043b\u043e\u043a\u0430\u0442\u043e\u0440\u044b \u0434\u043b\u044f \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0441 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u043c\u0438 \u043a\u0430\u0440\u0442\u043e\u0447\u043a\u0438 \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.

    "},{"location":"locators/user_card_locators/#locators.user_card_locators.UserCardLocators","title":"UserCardLocators","text":"

    \u041b\u043e\u043a\u0430\u0442\u043e\u0440\u044b \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u043a\u0430\u0440\u0442\u043e\u0447\u043a\u0438 \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.

    \u0421\u043e\u0434\u0435\u0440\u0436\u0438\u0442 XPath \u043b\u043e\u043a\u0430\u0442\u043e\u0440\u044b \u0434\u043b\u044f: CARD_USER (str): \u043a\u0430\u0440\u0442\u043e\u0447\u043a\u0438 \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f. DIALOG_USER_SETTINGS (str): \u043e\u043a\u043d\u0430 \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0430 \u0441\u0435\u0441\u0441\u0438\u043e\u043d\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439. HEADER_DIALOG_USER_SETTINGS (str): \u0441\u0442\u0440\u043e\u043a\u0438 \u0441 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u043e\u043c \u043e\u043a\u043d\u0430 \u0438 \u043a\u043d\u043e\u043f\u043a\u043e\u0439 \u0437\u0430\u043a\u0440\u044b\u0442\u0438\u044f. TITLE_DIALOG_USER_SETTINGS (str): \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430 \u043e\u043a\u043d\u0430. TABLE_WORK_AREA (str): \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0441 \u0441\u0435\u0441\u0441\u0438\u043e\u043d\u043d\u044b\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439.

    Source code in locators\\user_card_locators.py
    class UserCardLocators:\n    \"\"\"\u041b\u043e\u043a\u0430\u0442\u043e\u0440\u044b \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u043a\u0430\u0440\u0442\u043e\u0447\u043a\u0438 \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\n\n    \u0421\u043e\u0434\u0435\u0440\u0436\u0438\u0442 XPath \u043b\u043e\u043a\u0430\u0442\u043e\u0440\u044b \u0434\u043b\u044f:\n    CARD_USER (str): \u043a\u0430\u0440\u0442\u043e\u0447\u043a\u0438 \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\n    DIALOG_USER_SETTINGS (str): \u043e\u043a\u043d\u0430 \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0430 \u0441\u0435\u0441\u0441\u0438\u043e\u043d\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439.\n    HEADER_DIALOG_USER_SETTINGS (str): \u0441\u0442\u0440\u043e\u043a\u0438 \u0441 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u043e\u043c \u043e\u043a\u043d\u0430 \u0438 \u043a\u043d\u043e\u043f\u043a\u043e\u0439 \u0437\u0430\u043a\u0440\u044b\u0442\u0438\u044f.\n    TITLE_DIALOG_USER_SETTINGS (str): \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430 \u043e\u043a\u043d\u0430.\n    TABLE_WORK_AREA (str): \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0441 \u0441\u0435\u0441\u0441\u0438\u043e\u043d\u043d\u044b\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439.\n    \"\"\"\n\n    CARD_USER = \"//div[@class='v-card__text']\"\n\n    DIALOG_USER_SETTINGS = \"//div[@class='dialog-drag']\"\n    HEADER_DIALOG_USER_SETTINGS = \"xpath=/div[@class='dialog-header']\"\n    TITLE_DIALOG_USER_SETTINGS = \"xpath=/div[@class='dialog-header']/div[@class='title']\"\n    TABLE_WORK_AREA = \"//div[@class='dialog-body']//table\"\n
    "},{"location":"pages/base_page/","title":"BasePage","text":"

    \u0411\u0430\u0437\u043e\u0432\u044b\u0439 \u043a\u043b\u0430\u0441\u0441 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 Playwright.

    \u0421\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043e\u0431\u0449\u0438\u0435 \u043c\u0435\u0442\u043e\u0434\u044b \u0434\u043b\u044f \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0441\u043e \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435\u0439 \u0438 API.

    "},{"location":"pages/base_page/#pages.base_page.BasePage","title":"BasePage","text":"

    \u0411\u0430\u0437\u043e\u0432\u044b\u0439 \u043a\u043b\u0430\u0441\u0441 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441\u043e \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0430\u043c\u0438 \u0447\u0435\u0440\u0435\u0437 Playwright.

    \u0410\u0442\u0440\u0438\u0431\u0443\u0442\u044b

    page (Page): \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.

    Source code in pages\\base_page.py
    class BasePage:\n    \"\"\"\u0411\u0430\u0437\u043e\u0432\u044b\u0439 \u043a\u043b\u0430\u0441\u0441 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441\u043e \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0430\u043c\u0438 \u0447\u0435\u0440\u0435\u0437 Playwright.\n\n    \u0410\u0442\u0440\u0438\u0431\u0443\u0442\u044b:\n        page (Page): \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.\n    \"\"\"\n\n    def __init__(self, page: Page):\n        \"\"\"\u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442 \u0431\u0430\u0437\u043e\u0432\u0443\u044e \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0443.\n\n        Args:\n            page (Page): \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.\n        \"\"\"\n        self.page = page\n\n    # \u0414\u0435\u0439\u0441\u0442\u0432\u0438\u044f:\n    def current_url(self) -> str:\n        \"\"\"\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0442\u0435\u043a\u0443\u0449\u0438\u0439 URL \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b.\n\n        Returns:\n            str: \u0422\u0435\u043a\u0443\u0449\u0438\u0439 URL \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b.\n        \"\"\"\n        return self.page.url\n\n    def open(self, uri) -> Response | None:\n        \"\"\"\u041e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u044b\u0439 URI \u0432 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0435.\n\n        Args:\n            uri (str): URI \u0434\u043b\u044f \u043e\u0442\u043a\u0440\u044b\u0442\u0438\u044f (\u0431\u0435\u0437 \u0431\u0430\u0437\u043e\u0432\u043e\u0433\u043e URL).\n\n        Returns:\n            Response | None: \u041e\u0442\u0432\u0435\u0442 \u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u0438\u043b\u0438 None \u0432 \u0441\u043b\u0443\u0447\u0430\u0435 \u043e\u0448\u0438\u0431\u043a\u0438.\n        \"\"\"\n        return self.page.goto(f\"{host.get_base_url()}{uri}\", wait_until='domcontentloaded')\n\n    def page_reload(self) -> None:\n        \"\"\"\u041f\u0435\u0440\u0435\u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u0442 \u0442\u0435\u043a\u0443\u0449\u0443\u044e \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0443.\"\"\"\n        self.page.reload()\n\n    def wait_for_timeout(self, timeout: int) -> None:\n        \"\"\"\u041e\u0436\u0438\u0434\u0430\u0435\u0442 \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043c\u0438\u043b\u043b\u0438\u0441\u0435\u043a\u0443\u043d\u0434.\n\n        Args:\n            timeout (int): \u0412\u0440\u0435\u043c\u044f \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u044f \u0432 \u043c\u0438\u043b\u043b\u0438\u0441\u0435\u043a\u0443\u043d\u0434\u0430\u0445.\n        \"\"\"\n        self.page.wait_for_timeout(timeout)\n\n    def get_api_request_context(self) -> APIRequestContext:\n        \"\"\"\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 API-\u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432.\n\n        Returns:\n            APIRequestContext: \u041a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 \u0434\u043b\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f API-\u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432.\n        \"\"\"\n        return self.page.context.request\n\n    def send_get_api_request(self, uri: str) -> Response:\n        \"\"\"\u041e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 GET-\u0437\u0430\u043f\u0440\u043e\u0441 \u043a API.\n\n        Args:\n            uri (str): URI API-\u044d\u043d\u0434\u043f\u043e\u0438\u043d\u0442\u0430 (\u0431\u0435\u0437 \u0431\u0430\u0437\u043e\u0432\u043e\u0433\u043e URL).\n\n        Returns:\n            Response: \u041e\u0442\u0432\u0435\u0442 \u0441\u0435\u0440\u0432\u0435\u0440\u0430.\n        \"\"\"\n        api_request_context = self.get_api_request_context()\n        token = host.get_access_token()\n\n        # \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u0447\u0442\u043e \u0442\u043e\u043a\u0435\u043d \u043f\u043e\u043b\u0443\u0447\u0435\u043d\n        if not token:\n            logger.error(\"Failed to get access token: token is None or empty\")\n            # \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c \u0437\u0430\u0433\u043b\u0443\u0448\u0435\u0447\u043d\u044b\u0439 response \u0438\u043b\u0438 \u0431\u0440\u043e\u0441\u0430\u0435\u043c \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435\n            # \u0412 Playwright \u043c\u043e\u0436\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u044c mock response \u0435\u0441\u043b\u0438 \u043d\u0443\u0436\u043d\u043e\n            return None\n\n        headers = {\"Accept\": \"application/json\", \"Authorization\": f\"Bearer {token}\"}\n        full_url = f\"{host.get_request_url()}{uri}\"\n\n        logger.debug(\"Sending GET request to: %s\", full_url)\n        response = api_request_context.get(full_url, headers=headers)\n\n        # \u041b\u043e\u0433\u0438\u0440\u0443\u0435\u043c \u0441\u0442\u0430\u0442\u0443\u0441 \u043e\u0442\u0432\u0435\u0442\u0430\n        logger.debug(\"GET response status: %s\", response.status)\n\n        return response\n\n    def send_post_api_request(self, uri: str, payload: Dict) -> Response:\n        \"\"\"\u041e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 POST-\u0437\u0430\u043f\u0440\u043e\u0441 \u043a API.\"\"\"\n        api_request_context = self.get_api_request_context()\n        token = host.get_access_token()\n\n        if not token:\n            logger.error(\"Failed to get access token: token is None or empty\")\n            return None\n\n        headers = {\n            \"Accept\": \"application/json\",\n            \"Content-Type\": \"application/json\",\n            \"Authorization\": f\"Bearer {token}\"\n        }\n        full_url = f\"{host.get_request_url()}{uri}\"\n\n        logger.debug(\"Sending POST request to: %s\", full_url)\n\n        # \u0421\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u0443\u0435\u043c payload \u0432 JSON\n        json_data = json.dumps(payload)\n\n        # \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u0447\u0442\u043e \u0441\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043f\u0440\u043e\u0448\u043b\u0430 \u0443\u0441\u043f\u0435\u0448\u043d\u043e\n        if json_data is None:\n            logger.error(\"Failed to serialize payload to JSON: result is None\")\n            return None\n\n        if not isinstance(json_data, str):\n            logger.error(\"Failed to serialize payload to JSON: expected string got %s\", type(json_data))\n            return None\n\n        response = api_request_context.post(\n            full_url,\n            headers=headers,\n            data=json_data  # \u041f\u0435\u0440\u0435\u0434\u0430\u0435\u043c \u0441\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u043d\u044b\u0439 JSON \u043a\u0430\u043a data\n        )\n\n        logger.debug(\"POST response status: %s\", response.status)\n\n        return response\n\n    def get_response_body(self, response: Response) -> dict | list | None:\n        \"\"\"\u0418\u0437\u0432\u043b\u0435\u043a\u0430\u0435\u0442 \u0442\u0435\u043b\u043e \u043e\u0442\u0432\u0435\u0442\u0430 \u0432 format JSON.\n\n        Args:\n            response (Response): \u041e\u0442\u0432\u0435\u0442 \u0441\u0435\u0440\u0432\u0435\u0440\u0430.\n\n        Returns:\n            dict | list | None: \u0420\u0430\u0441\u043f\u0430\u0440\u0441\u0435\u043d\u043d\u043e\u0435 \u0442\u0435\u043b\u043e \u043e\u0442\u0432\u0435\u0442\u0430 \u0438\u043b\u0438 None \u0432 \u0441\u043b\u0443\u0447\u0430\u0435 \u043e\u0448\u0438\u0431\u043a\u0438.\n        \"\"\"\n        start_time = time.time()\n\n        # \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u0447\u0442\u043e response \u043d\u0435 None\n        if response is None:\n            logger.error(\"Response object is None\")\n            processing_time = time.time() - start_time\n            logger.debug(\"Response processing time1: %.3f seconds\", processing_time)\n            return None\n\n        # \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u0441\u0442\u0430\u0442\u0443\u0441 \u043e\u0442\u0432\u0435\u0442\u0430\n        if response.status >= 400:\n            logger.error(\"API request failed with status %s\", response.status)\n            processing_time = time.time() - start_time\n            logger.debug(\"Response processing time2: %.3f seconds\", processing_time)\n            return None\n\n        # \u041f\u044b\u0442\u0430\u0435\u043c\u0441\u044f \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c JSON\n        json_result = response.json()\n\n        # \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u0447\u0442\u043e \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u043d\u0435 None\n        if json_result is None:\n            logger.error(\"JSON parsing returned None\")\n            processing_time = time.time() - start_time\n            logger.debug(\"Response processing time3: %.3f seconds\", processing_time)\n            return None\n\n        # \u041f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u043c \u043a\u0430\u043a \u0441\u043b\u043e\u0432\u0430\u0440\u0438, \u0442\u0430\u043a \u0438 \u0441\u043f\u0438\u0441\u043a\u0438\n        if not isinstance(json_result, (dict, list)):\n            logger.error(\"Expected dict or list but got %s\", type(json_result))\n            processing_time = time.time() - start_time\n            logger.debug(\"Response processing time4: %.3f seconds\", processing_time)\n            return None\n\n        processing_time = time.time() - start_time\n        logger.debug(\"Response processing time5: %.3f seconds\", processing_time)\n\n        return json_result\n\n        # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0438:\n    def check_URL(self, uri: str, msg: str) -> None:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442, \u0447\u0442\u043e \u0442\u0435\u043a\u0443\u0449\u0438\u0439 URL \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u043e\u0436\u0438\u0434\u0430\u0435\u043c\u043e\u043c\u0443.\n\n        Args:\n            uri (str): \u041e\u0436\u0438\u0434\u0430\u0435\u043c\u044b\u0439 URI (\u0431\u0435\u0437 \u0431\u0430\u0437\u043e\u0432\u043e\u0433\u043e URL).\n            msg (str): \u0421\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u043e\u0431 \u043e\u0448\u0438\u0431\u043a\u0435 \u043f\u0440\u0438 \u043d\u0435\u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0438.\n\n        Raises:\n            AssertionError: \u0415\u0441\u043b\u0438 URL \u043d\u0435 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u043e\u0436\u0438\u0434\u0430\u0435\u043c\u043e\u043c\u0443.\n        \"\"\"\n        expect(self.page).to_have_url(  # pylint: disable=expression-not-assigned\n            f\"{host.get_base_url()}{uri}\",\n            timeout=60000\n        ), msg\n\n    def check_equals(self, actual: Any, expected: Any, msg: str) -> None:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0440\u0430\u0432\u0435\u043d\u0441\u0442\u0432\u043e \u0444\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0438 \u043e\u0436\u0438\u0434\u0430\u0435\u043c\u043e\u0433\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439.\n\n        Args:\n            actual (Any): \u0424\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435.\n            expected (Any): \u041e\u0436\u0438\u0434\u0430\u0435\u043c\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435.\n            msg (str): \u0421\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u043e\u0431 \u043e\u0448\u0438\u0431\u043a\u0435 \u043f\u0440\u0438 \u043d\u0435\u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0438.\n\n        Raises:\n            AssertionError: \u0415\u0441\u043b\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043d\u0435 \u0440\u0430\u0432\u043d\u044b.\n        \"\"\"\n        assert actual == expected, msg\n\n    def check_lists_equals(self, actual: list, expected: list, msg: str) -> None:\n        \"\"\"\u0420\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0440\u0430\u0432\u0435\u043d\u0441\u0442\u0432\u043e \u0434\u0432\u0443\u0445 \u0441\u043f\u0438\u0441\u043a\u043e\u0432.\n\n        Args:\n            actual (list): \u0424\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0441\u043f\u0438\u0441\u043e\u043a.\n            expected (list): \u041e\u0436\u0438\u0434\u0430\u0435\u043c\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a.\n            msg (str): \u0421\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u043e\u0431 \u043e\u0448\u0438\u0431\u043a\u0435 \u043f\u0440\u0438 \u043d\u0435\u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0438.\n\n        Raises:\n            AssertionError: \u0415\u0441\u043b\u0438 \u0441\u043f\u0438\u0441\u043a\u0438 \u043d\u0435 \u0440\u0430\u0432\u043d\u044b.\n        \"\"\"\n        def compare_lists(list1: list, list2: list) -> bool:\n            \"\"\"\u0412\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0434\u043b\u044f \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u043e\u0433\u043e \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044f \u0441\u043f\u0438\u0441\u043a\u043e\u0432.\n\n            Args:\n                list1 (list): \u041f\u0435\u0440\u0432\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a \u0434\u043b\u044f \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044f.\n                list2 (list): \u0412\u0442\u043e\u0440\u043e\u0439 \u0441\u043f\u0438\u0441\u043e\u043a \u0434\u043b\u044f \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044f.\n\n            Returns:\n                bool: True \u0435\u0441\u043b\u0438 \u0441\u043f\u0438\u0441\u043a\u0438 \u0438\u0434\u0435\u043d\u0442\u0438\u0447\u043d\u044b, \u0438\u043d\u0430\u0447\u0435 False.\n            \"\"\"\n            if len(list1) != len(list2):\n                return False\n            for item1, item2 in zip(list1, list2):\n                if isinstance(item1, list) and isinstance(item2, list):\n                    if not compare_lists(item1, item2):\n                        return False\n                elif item1 != item2:\n                    return False\n            return True\n\n        assert compare_lists(actual, expected), msg\n
    "},{"location":"pages/base_page/#pages.base_page.BasePage.__init__","title":"__init__(page)","text":"

    \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442 \u0431\u0430\u0437\u043e\u0432\u0443\u044e \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0443.

    Parameters:

    Name Type Description Default page Page

    \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.

    required Source code in pages\\base_page.py
    def __init__(self, page: Page):\n    \"\"\"\u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442 \u0431\u0430\u0437\u043e\u0432\u0443\u044e \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0443.\n\n    Args:\n        page (Page): \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.\n    \"\"\"\n    self.page = page\n
    "},{"location":"pages/base_page/#pages.base_page.BasePage.check_URL","title":"check_URL(uri, msg)","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442, \u0447\u0442\u043e \u0442\u0435\u043a\u0443\u0449\u0438\u0439 URL \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u043e\u0436\u0438\u0434\u0430\u0435\u043c\u043e\u043c\u0443.

    Parameters:

    Name Type Description Default uri str

    \u041e\u0436\u0438\u0434\u0430\u0435\u043c\u044b\u0439 URI (\u0431\u0435\u0437 \u0431\u0430\u0437\u043e\u0432\u043e\u0433\u043e URL).

    required msg str

    \u0421\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u043e\u0431 \u043e\u0448\u0438\u0431\u043a\u0435 \u043f\u0440\u0438 \u043d\u0435\u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0438.

    required

    Raises:

    Type Description AssertionError

    \u0415\u0441\u043b\u0438 URL \u043d\u0435 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u043e\u0436\u0438\u0434\u0430\u0435\u043c\u043e\u043c\u0443.

    Source code in pages\\base_page.py
    def check_URL(self, uri: str, msg: str) -> None:\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442, \u0447\u0442\u043e \u0442\u0435\u043a\u0443\u0449\u0438\u0439 URL \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u043e\u0436\u0438\u0434\u0430\u0435\u043c\u043e\u043c\u0443.\n\n    Args:\n        uri (str): \u041e\u0436\u0438\u0434\u0430\u0435\u043c\u044b\u0439 URI (\u0431\u0435\u0437 \u0431\u0430\u0437\u043e\u0432\u043e\u0433\u043e URL).\n        msg (str): \u0421\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u043e\u0431 \u043e\u0448\u0438\u0431\u043a\u0435 \u043f\u0440\u0438 \u043d\u0435\u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0438.\n\n    Raises:\n        AssertionError: \u0415\u0441\u043b\u0438 URL \u043d\u0435 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u043e\u0436\u0438\u0434\u0430\u0435\u043c\u043e\u043c\u0443.\n    \"\"\"\n    expect(self.page).to_have_url(  # pylint: disable=expression-not-assigned\n        f\"{host.get_base_url()}{uri}\",\n        timeout=60000\n    ), msg\n
    "},{"location":"pages/base_page/#pages.base_page.BasePage.check_equals","title":"check_equals(actual, expected, msg)","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0440\u0430\u0432\u0435\u043d\u0441\u0442\u0432\u043e \u0444\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0438 \u043e\u0436\u0438\u0434\u0430\u0435\u043c\u043e\u0433\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439.

    Parameters:

    Name Type Description Default actual Any

    \u0424\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435.

    required expected Any

    \u041e\u0436\u0438\u0434\u0430\u0435\u043c\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435.

    required msg str

    \u0421\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u043e\u0431 \u043e\u0448\u0438\u0431\u043a\u0435 \u043f\u0440\u0438 \u043d\u0435\u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0438.

    required

    Raises:

    Type Description AssertionError

    \u0415\u0441\u043b\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043d\u0435 \u0440\u0430\u0432\u043d\u044b.

    Source code in pages\\base_page.py
    def check_equals(self, actual: Any, expected: Any, msg: str) -> None:\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0440\u0430\u0432\u0435\u043d\u0441\u0442\u0432\u043e \u0444\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0438 \u043e\u0436\u0438\u0434\u0430\u0435\u043c\u043e\u0433\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439.\n\n    Args:\n        actual (Any): \u0424\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435.\n        expected (Any): \u041e\u0436\u0438\u0434\u0430\u0435\u043c\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435.\n        msg (str): \u0421\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u043e\u0431 \u043e\u0448\u0438\u0431\u043a\u0435 \u043f\u0440\u0438 \u043d\u0435\u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0438.\n\n    Raises:\n        AssertionError: \u0415\u0441\u043b\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043d\u0435 \u0440\u0430\u0432\u043d\u044b.\n    \"\"\"\n    assert actual == expected, msg\n
    "},{"location":"pages/base_page/#pages.base_page.BasePage.check_lists_equals","title":"check_lists_equals(actual, expected, msg)","text":"

    \u0420\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0440\u0430\u0432\u0435\u043d\u0441\u0442\u0432\u043e \u0434\u0432\u0443\u0445 \u0441\u043f\u0438\u0441\u043a\u043e\u0432.

    Parameters:

    Name Type Description Default actual list

    \u0424\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0441\u043f\u0438\u0441\u043e\u043a.

    required expected list

    \u041e\u0436\u0438\u0434\u0430\u0435\u043c\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a.

    required msg str

    \u0421\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u043e\u0431 \u043e\u0448\u0438\u0431\u043a\u0435 \u043f\u0440\u0438 \u043d\u0435\u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0438.

    required

    Raises:

    Type Description AssertionError

    \u0415\u0441\u043b\u0438 \u0441\u043f\u0438\u0441\u043a\u0438 \u043d\u0435 \u0440\u0430\u0432\u043d\u044b.

    Source code in pages\\base_page.py
    def check_lists_equals(self, actual: list, expected: list, msg: str) -> None:\n    \"\"\"\u0420\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0440\u0430\u0432\u0435\u043d\u0441\u0442\u0432\u043e \u0434\u0432\u0443\u0445 \u0441\u043f\u0438\u0441\u043a\u043e\u0432.\n\n    Args:\n        actual (list): \u0424\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0441\u043f\u0438\u0441\u043e\u043a.\n        expected (list): \u041e\u0436\u0438\u0434\u0430\u0435\u043c\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a.\n        msg (str): \u0421\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u043e\u0431 \u043e\u0448\u0438\u0431\u043a\u0435 \u043f\u0440\u0438 \u043d\u0435\u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0438.\n\n    Raises:\n        AssertionError: \u0415\u0441\u043b\u0438 \u0441\u043f\u0438\u0441\u043a\u0438 \u043d\u0435 \u0440\u0430\u0432\u043d\u044b.\n    \"\"\"\n    def compare_lists(list1: list, list2: list) -> bool:\n        \"\"\"\u0412\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0434\u043b\u044f \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u043e\u0433\u043e \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044f \u0441\u043f\u0438\u0441\u043a\u043e\u0432.\n\n        Args:\n            list1 (list): \u041f\u0435\u0440\u0432\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a \u0434\u043b\u044f \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044f.\n            list2 (list): \u0412\u0442\u043e\u0440\u043e\u0439 \u0441\u043f\u0438\u0441\u043e\u043a \u0434\u043b\u044f \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044f.\n\n        Returns:\n            bool: True \u0435\u0441\u043b\u0438 \u0441\u043f\u0438\u0441\u043a\u0438 \u0438\u0434\u0435\u043d\u0442\u0438\u0447\u043d\u044b, \u0438\u043d\u0430\u0447\u0435 False.\n        \"\"\"\n        if len(list1) != len(list2):\n            return False\n        for item1, item2 in zip(list1, list2):\n            if isinstance(item1, list) and isinstance(item2, list):\n                if not compare_lists(item1, item2):\n                    return False\n            elif item1 != item2:\n                return False\n        return True\n\n    assert compare_lists(actual, expected), msg\n
    "},{"location":"pages/base_page/#pages.base_page.BasePage.current_url","title":"current_url()","text":"

    \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0442\u0435\u043a\u0443\u0449\u0438\u0439 URL \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b.

    Returns:

    Name Type Description str str

    \u0422\u0435\u043a\u0443\u0449\u0438\u0439 URL \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b.

    Source code in pages\\base_page.py
    def current_url(self) -> str:\n    \"\"\"\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0442\u0435\u043a\u0443\u0449\u0438\u0439 URL \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b.\n\n    Returns:\n        str: \u0422\u0435\u043a\u0443\u0449\u0438\u0439 URL \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b.\n    \"\"\"\n    return self.page.url\n
    "},{"location":"pages/base_page/#pages.base_page.BasePage.get_api_request_context","title":"get_api_request_context()","text":"

    \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 API-\u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432.

    Returns:

    Name Type Description APIRequestContext APIRequestContext

    \u041a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 \u0434\u043b\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f API-\u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432.

    Source code in pages\\base_page.py
    def get_api_request_context(self) -> APIRequestContext:\n    \"\"\"\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 API-\u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432.\n\n    Returns:\n        APIRequestContext: \u041a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 \u0434\u043b\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f API-\u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432.\n    \"\"\"\n    return self.page.context.request\n
    "},{"location":"pages/base_page/#pages.base_page.BasePage.get_response_body","title":"get_response_body(response)","text":"

    \u0418\u0437\u0432\u043b\u0435\u043a\u0430\u0435\u0442 \u0442\u0435\u043b\u043e \u043e\u0442\u0432\u0435\u0442\u0430 \u0432 format JSON.

    Parameters:

    Name Type Description Default response Response

    \u041e\u0442\u0432\u0435\u0442 \u0441\u0435\u0440\u0432\u0435\u0440\u0430.

    required

    Returns:

    Type Description dict | list | None

    dict | list | None: \u0420\u0430\u0441\u043f\u0430\u0440\u0441\u0435\u043d\u043d\u043e\u0435 \u0442\u0435\u043b\u043e \u043e\u0442\u0432\u0435\u0442\u0430 \u0438\u043b\u0438 None \u0432 \u0441\u043b\u0443\u0447\u0430\u0435 \u043e\u0448\u0438\u0431\u043a\u0438.

    Source code in pages\\base_page.py
    def get_response_body(self, response: Response) -> dict | list | None:\n    \"\"\"\u0418\u0437\u0432\u043b\u0435\u043a\u0430\u0435\u0442 \u0442\u0435\u043b\u043e \u043e\u0442\u0432\u0435\u0442\u0430 \u0432 format JSON.\n\n    Args:\n        response (Response): \u041e\u0442\u0432\u0435\u0442 \u0441\u0435\u0440\u0432\u0435\u0440\u0430.\n\n    Returns:\n        dict | list | None: \u0420\u0430\u0441\u043f\u0430\u0440\u0441\u0435\u043d\u043d\u043e\u0435 \u0442\u0435\u043b\u043e \u043e\u0442\u0432\u0435\u0442\u0430 \u0438\u043b\u0438 None \u0432 \u0441\u043b\u0443\u0447\u0430\u0435 \u043e\u0448\u0438\u0431\u043a\u0438.\n    \"\"\"\n    start_time = time.time()\n\n    # \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u0447\u0442\u043e response \u043d\u0435 None\n    if response is None:\n        logger.error(\"Response object is None\")\n        processing_time = time.time() - start_time\n        logger.debug(\"Response processing time1: %.3f seconds\", processing_time)\n        return None\n\n    # \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u0441\u0442\u0430\u0442\u0443\u0441 \u043e\u0442\u0432\u0435\u0442\u0430\n    if response.status >= 400:\n        logger.error(\"API request failed with status %s\", response.status)\n        processing_time = time.time() - start_time\n        logger.debug(\"Response processing time2: %.3f seconds\", processing_time)\n        return None\n\n    # \u041f\u044b\u0442\u0430\u0435\u043c\u0441\u044f \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c JSON\n    json_result = response.json()\n\n    # \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u0447\u0442\u043e \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u043d\u0435 None\n    if json_result is None:\n        logger.error(\"JSON parsing returned None\")\n        processing_time = time.time() - start_time\n        logger.debug(\"Response processing time3: %.3f seconds\", processing_time)\n        return None\n\n    # \u041f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u043c \u043a\u0430\u043a \u0441\u043b\u043e\u0432\u0430\u0440\u0438, \u0442\u0430\u043a \u0438 \u0441\u043f\u0438\u0441\u043a\u0438\n    if not isinstance(json_result, (dict, list)):\n        logger.error(\"Expected dict or list but got %s\", type(json_result))\n        processing_time = time.time() - start_time\n        logger.debug(\"Response processing time4: %.3f seconds\", processing_time)\n        return None\n\n    processing_time = time.time() - start_time\n    logger.debug(\"Response processing time5: %.3f seconds\", processing_time)\n\n    return json_result\n
    "},{"location":"pages/base_page/#pages.base_page.BasePage.open","title":"open(uri)","text":"

    \u041e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u044b\u0439 URI \u0432 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0435.

    Parameters:

    Name Type Description Default uri str

    URI \u0434\u043b\u044f \u043e\u0442\u043a\u0440\u044b\u0442\u0438\u044f (\u0431\u0435\u0437 \u0431\u0430\u0437\u043e\u0432\u043e\u0433\u043e URL).

    required

    Returns:

    Type Description Response | None

    Response | None: \u041e\u0442\u0432\u0435\u0442 \u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u0438\u043b\u0438 None \u0432 \u0441\u043b\u0443\u0447\u0430\u0435 \u043e\u0448\u0438\u0431\u043a\u0438.

    Source code in pages\\base_page.py
    def open(self, uri) -> Response | None:\n    \"\"\"\u041e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u044b\u0439 URI \u0432 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0435.\n\n    Args:\n        uri (str): URI \u0434\u043b\u044f \u043e\u0442\u043a\u0440\u044b\u0442\u0438\u044f (\u0431\u0435\u0437 \u0431\u0430\u0437\u043e\u0432\u043e\u0433\u043e URL).\n\n    Returns:\n        Response | None: \u041e\u0442\u0432\u0435\u0442 \u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u0438\u043b\u0438 None \u0432 \u0441\u043b\u0443\u0447\u0430\u0435 \u043e\u0448\u0438\u0431\u043a\u0438.\n    \"\"\"\n    return self.page.goto(f\"{host.get_base_url()}{uri}\", wait_until='domcontentloaded')\n
    "},{"location":"pages/base_page/#pages.base_page.BasePage.page_reload","title":"page_reload()","text":"

    \u041f\u0435\u0440\u0435\u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u0442 \u0442\u0435\u043a\u0443\u0449\u0443\u044e \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0443.

    Source code in pages\\base_page.py
    def page_reload(self) -> None:\n    \"\"\"\u041f\u0435\u0440\u0435\u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u0442 \u0442\u0435\u043a\u0443\u0449\u0443\u044e \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0443.\"\"\"\n    self.page.reload()\n
    "},{"location":"pages/base_page/#pages.base_page.BasePage.send_get_api_request","title":"send_get_api_request(uri)","text":"

    \u041e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 GET-\u0437\u0430\u043f\u0440\u043e\u0441 \u043a API.

    Parameters:

    Name Type Description Default uri str

    URI API-\u044d\u043d\u0434\u043f\u043e\u0438\u043d\u0442\u0430 (\u0431\u0435\u0437 \u0431\u0430\u0437\u043e\u0432\u043e\u0433\u043e URL).

    required

    Returns:

    Name Type Description Response Response

    \u041e\u0442\u0432\u0435\u0442 \u0441\u0435\u0440\u0432\u0435\u0440\u0430.

    Source code in pages\\base_page.py
    def send_get_api_request(self, uri: str) -> Response:\n    \"\"\"\u041e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 GET-\u0437\u0430\u043f\u0440\u043e\u0441 \u043a API.\n\n    Args:\n        uri (str): URI API-\u044d\u043d\u0434\u043f\u043e\u0438\u043d\u0442\u0430 (\u0431\u0435\u0437 \u0431\u0430\u0437\u043e\u0432\u043e\u0433\u043e URL).\n\n    Returns:\n        Response: \u041e\u0442\u0432\u0435\u0442 \u0441\u0435\u0440\u0432\u0435\u0440\u0430.\n    \"\"\"\n    api_request_context = self.get_api_request_context()\n    token = host.get_access_token()\n\n    # \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u0447\u0442\u043e \u0442\u043e\u043a\u0435\u043d \u043f\u043e\u043b\u0443\u0447\u0435\u043d\n    if not token:\n        logger.error(\"Failed to get access token: token is None or empty\")\n        # \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c \u0437\u0430\u0433\u043b\u0443\u0448\u0435\u0447\u043d\u044b\u0439 response \u0438\u043b\u0438 \u0431\u0440\u043e\u0441\u0430\u0435\u043c \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435\n        # \u0412 Playwright \u043c\u043e\u0436\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u044c mock response \u0435\u0441\u043b\u0438 \u043d\u0443\u0436\u043d\u043e\n        return None\n\n    headers = {\"Accept\": \"application/json\", \"Authorization\": f\"Bearer {token}\"}\n    full_url = f\"{host.get_request_url()}{uri}\"\n\n    logger.debug(\"Sending GET request to: %s\", full_url)\n    response = api_request_context.get(full_url, headers=headers)\n\n    # \u041b\u043e\u0433\u0438\u0440\u0443\u0435\u043c \u0441\u0442\u0430\u0442\u0443\u0441 \u043e\u0442\u0432\u0435\u0442\u0430\n    logger.debug(\"GET response status: %s\", response.status)\n\n    return response\n
    "},{"location":"pages/base_page/#pages.base_page.BasePage.send_post_api_request","title":"send_post_api_request(uri, payload)","text":"

    \u041e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 POST-\u0437\u0430\u043f\u0440\u043e\u0441 \u043a API.

    Source code in pages\\base_page.py
    def send_post_api_request(self, uri: str, payload: Dict) -> Response:\n    \"\"\"\u041e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 POST-\u0437\u0430\u043f\u0440\u043e\u0441 \u043a API.\"\"\"\n    api_request_context = self.get_api_request_context()\n    token = host.get_access_token()\n\n    if not token:\n        logger.error(\"Failed to get access token: token is None or empty\")\n        return None\n\n    headers = {\n        \"Accept\": \"application/json\",\n        \"Content-Type\": \"application/json\",\n        \"Authorization\": f\"Bearer {token}\"\n    }\n    full_url = f\"{host.get_request_url()}{uri}\"\n\n    logger.debug(\"Sending POST request to: %s\", full_url)\n\n    # \u0421\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u0443\u0435\u043c payload \u0432 JSON\n    json_data = json.dumps(payload)\n\n    # \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u0447\u0442\u043e \u0441\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043f\u0440\u043e\u0448\u043b\u0430 \u0443\u0441\u043f\u0435\u0448\u043d\u043e\n    if json_data is None:\n        logger.error(\"Failed to serialize payload to JSON: result is None\")\n        return None\n\n    if not isinstance(json_data, str):\n        logger.error(\"Failed to serialize payload to JSON: expected string got %s\", type(json_data))\n        return None\n\n    response = api_request_context.post(\n        full_url,\n        headers=headers,\n        data=json_data  # \u041f\u0435\u0440\u0435\u0434\u0430\u0435\u043c \u0441\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u043d\u044b\u0439 JSON \u043a\u0430\u043a data\n    )\n\n    logger.debug(\"POST response status: %s\", response.status)\n\n    return response\n
    "},{"location":"pages/base_page/#pages.base_page.BasePage.wait_for_timeout","title":"wait_for_timeout(timeout)","text":"

    \u041e\u0436\u0438\u0434\u0430\u0435\u0442 \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043c\u0438\u043b\u043b\u0438\u0441\u0435\u043a\u0443\u043d\u0434.

    Parameters:

    Name Type Description Default timeout int

    \u0412\u0440\u0435\u043c\u044f \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u044f \u0432 \u043c\u0438\u043b\u043b\u0438\u0441\u0435\u043a\u0443\u043d\u0434\u0430\u0445.

    required Source code in pages\\base_page.py
    def wait_for_timeout(self, timeout: int) -> None:\n    \"\"\"\u041e\u0436\u0438\u0434\u0430\u0435\u0442 \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043c\u0438\u043b\u043b\u0438\u0441\u0435\u043a\u0443\u043d\u0434.\n\n    Args:\n        timeout (int): \u0412\u0440\u0435\u043c\u044f \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u044f \u0432 \u043c\u0438\u043b\u043b\u0438\u0441\u0435\u043a\u0443\u043d\u0434\u0430\u0445.\n    \"\"\"\n    self.page.wait_for_timeout(timeout)\n
    "},{"location":"pages/license_tab/","title":"LicenseTab","text":"

    \u041c\u043e\u0434\u0443\u043b\u044c license_tab \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043a\u043b\u0430\u0441\u0441 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0432\u043a\u043b\u0430\u0434\u043a\u043e\u0439 '\u041b\u0438\u0446\u0435\u043d\u0437\u0438\u0438'.

    \u041a\u043b\u0430\u0441\u0441 LicenseTab \u043d\u0430\u0441\u043b\u0435\u0434\u0443\u0435\u0442 BasePage \u0438 \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u0442 \u043c\u0435\u0442\u043e\u0434\u044b \u0434\u043b\u044f \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0441 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u043c\u0438 \u0432\u043a\u043b\u0430\u0434\u043a\u0438 \u043b\u0438\u0446\u0435\u043d\u0437\u0438\u0439 \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0438\u0445 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f.

    "},{"location":"pages/license_tab/#pages.license_tab.LicenseTab","title":"LicenseTab","text":"

    Bases: BasePage

    \u041a\u043b\u0430\u0441\u0441 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0432\u043a\u043b\u0430\u0434\u043a\u043e\u0439 '\u041b\u0438\u0446\u0435\u043d\u0437\u0438\u0438'.

    \u0421\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043c\u0435\u0442\u043e\u0434\u044b \u0434\u043b\u044f: - \u0412\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0441 \u0444\u043e\u0440\u043c\u043e\u0439 \u0432\u0432\u043e\u0434\u0430 \u043b\u0438\u0446\u0435\u043d\u0437\u0438\u0438 - \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0433\u043e JSON-\u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430 - \u0420\u0430\u0431\u043e\u0442\u044b \u0441 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u043c\u0438 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f

    Source code in pages\\license_tab.py
    class LicenseTab(BasePage):\n    \"\"\"\u041a\u043b\u0430\u0441\u0441 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0432\u043a\u043b\u0430\u0434\u043a\u043e\u0439 '\u041b\u0438\u0446\u0435\u043d\u0437\u0438\u0438'.\n\n    \u0421\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043c\u0435\u0442\u043e\u0434\u044b \u0434\u043b\u044f:\n    - \u0412\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0441 \u0444\u043e\u0440\u043c\u043e\u0439 \u0432\u0432\u043e\u0434\u0430 \u043b\u0438\u0446\u0435\u043d\u0437\u0438\u0438\n    - \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0433\u043e JSON-\u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430\n    - \u0420\u0430\u0431\u043e\u0442\u044b \u0441 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u043c\u0438 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f\n    \"\"\"\n\n    def __init__(self, page: Page) -> None:\n        \"\"\"\u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0432\u043a\u043b\u0430\u0434\u043a\u0438 '\u041b\u0438\u0446\u0435\u043d\u0437\u0438\u0438'.\n\n        Args:\n            page: \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright\n        \"\"\"\n\n        super().__init__(page)\n\n        self.toolbar = ToolbarComponent(page, \"\u041b\u0438\u0446\u0435\u043d\u0437\u0438\u0438\")\n        self.json_container = JsonContainerComponent(page)\n\n        self.input_form_title = Text(page, TextLocators.TITLE_LICENSE_INPUT_FORM, \"input form title\")\n        self.license_id = Text(page, TextLocators.LICENSE_ID, \"license id\")\n        self.license_id_input = TextInput(page, InputLocators.LICENSE_ID_UPDATE, \"license id input\")\n        self.update_button = Button(page, ButtonLocators.BUTTON_LICENSE_UPDATE, \"update license button\")\n\n        self.alert = AlertComponent(page)\n\n    # \u0414\u0435\u0439\u0441\u0442\u0432\u0438\u044f:\n    def fill_license_input_form(self, value: str) -> None:\n        \"\"\"\u0417\u0430\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u0444\u043e\u0440\u043c\u0443 \u0432\u0432\u043e\u0434\u0430 \u043b\u0438\u0446\u0435\u043d\u0437\u0438\u0438 \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u044b\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u043c.\n\n        Args:\n            value: \u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0434\u043b\u044f \u0432\u0432\u043e\u0434\u0430\n        \"\"\"\n\n        self.license_id_input.clear()\n        self.license_id_input.input_value(value)\n        self.update_button.click()\n\n    def scroll_json_container_up(self) -> None:\n        \"\"\"\u041f\u0440\u043e\u043a\u0440\u0443\u0447\u0438\u0432\u0430\u0435\u0442 JSON-\u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440 \u0432\u0432\u0435\u0440\u0445.\"\"\"\n\n        loc = self.page.locator(JsonContainerLocators.SCROLL_CONTAINER).first\n        self.json_container.scroll_up(loc)\n\n    def scroll_json_container_down(self) -> None:\n        \"\"\"\u041f\u0440\u043e\u043a\u0440\u0443\u0447\u0438\u0432\u0430\u0435\u0442 JSON-\u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440 \u0432\u043d\u0438\u0437.\"\"\"\n\n        loc = self.page.locator(JsonContainerLocators.SCROLL_CONTAINER).first\n        self.json_container.scroll_down(loc)\n\n    # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0438:\n    def check_json_container_verticall_scrolling(self) -> bool:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u0439 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0438 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430.\n\n        Returns:\n            bool: \u0414\u043e\u0441\u0442\u0443\u043f\u043d\u043e\u0441\u0442\u044c \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0438\n        \"\"\"\n\n        loc = self.page.locator(JsonContainerLocators.SCROLL_CONTAINER).first\n        return self.json_container.is_scrollable_vertically(loc)\n\n    def check_content(self) -> None:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0432\u0441\u0435\u0445 \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0445 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0432\u043a\u043b\u0430\u0434\u043a\u0438.\"\"\"\n\n        self.should_be_toolbar()\n        self.should_be_json_container()\n        self.should_be_input_form_title()\n        self.should_be_empty_input_form()\n        self.should_be_update_button()\n\n        self.verify_json_container_content()\n\n    def should_be_error_alert_window_with_text(self, text: str) -> None:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435/\u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u0435 \u0430\u043b\u0435\u0440\u0442\u0430 \u0441 \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u044b\u043c \u0442\u0435\u043a\u0441\u0442\u043e\u043c.\n\n        Args:\n            text: \u0422\u0435\u043a\u0441\u0442 \u0434\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438\n        \"\"\"\n\n        alert_type = self.alert.get_alert_type()\n        assert alert_type==\"error\", f\"Expected error alert, but got {alert_type} alert\"\n\n        self.alert.check_alert_presence(text)\n        self.alert.check_alert_absence(text)\n\n    def should_be_toolbar(self) -> None:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u043f\u0430\u043d\u0435\u043b\u0438 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432.\"\"\"\n\n        self.toolbar.check_toolbar_presence(\"Toolbar is missing\")\n\n    def should_be_json_container(self) -> None:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 JSON-\u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430.\"\"\"\n\n        self.json_container.check_visibility(\n            JsonContainerLocators.CONTAINER,\n            \"Json container with license info is missing\"\n        )\n\n    def should_be_input_form_title(self) -> None:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a \u0444\u043e\u0440\u043c\u044b \u0438 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0435 ID \u043b\u0438\u0446\u0435\u043d\u0437\u0438\u0438.\"\"\"\n\n        self.input_form_title.check_have_text(\n            \"\u0418\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440:\",\n            \"Input lisence id form title '\u0418\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440:' is missing\"\n        )\n\n        actual_lisence_id = self.license_id.get_text(0).strip()\n\n        # send request to backend to get license id\n        response = self.send_get_api_request(\"e-cmdb/api/lic/deviceid\")\n        response_body = self.get_response_body(response)\n\n        self.check_equals(\n            actual_lisence_id,\n            response_body['deviceId'],\n            f\"Expected ID value {response_body['deviceId']} is not equal actual value {actual_lisence_id}\"\n        )\n\n    def should_be_empty_input_form(self) -> None:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043f\u0443\u0441\u0442\u043e\u0442\u0443 \u0444\u043e\u0440\u043c\u044b \u0432\u0432\u043e\u0434\u0430 \u043b\u0438\u0446\u0435\u043d\u0437\u0438\u0438.\"\"\"\n\n        self.license_id_input.check_empty_input(\"Input lisence id form is missing or not empty\")\n\n    def should_be_update_button(self) -> None:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u043a\u043d\u043e\u043f\u043a\u0438 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u043b\u0438\u0446\u0435\u043d\u0437\u0438\u0438.\"\"\"\n\n        button_text = \"\u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u043b\u0438\u0446\u0435\u043d\u0437\u0438\u044e\"\n        self.update_button.check_have_text(\n            button_text,\n            f\"Update button with text '{button_text}' is missing\"\n        )\n\n    def verify_json_container_content(self) -> None:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430 \u0434\u0430\u043d\u043d\u044b\u043c \u0438\u0437 API.\"\"\"\n\n        actual_data = self.json_container.read_data(JsonContainerLocators.CONTAINER)\n\n        env_name = host.get_env_name()\n\n        # temporarily because of difference in version\n        if env_name == \"test\":\n            # send request to backend to get license info\n            response = self.send_get_api_request(\"e-cmdb/api/lic\")\n            response_body = self.get_response_body(response)\n\n            del response_body[\"netManagment\"]\n            response_body[\"ui\"][\"lcc\"].pop(\"lcc_object\")\n            response_body[\"ui\"][\"lcc\"].pop(\"lcc_reference_book\")\n            response_body[\"ui\"][\"lcc\"].pop(\"lcc_reports\")\n            response_body[\"ui\"][\"lcc\"].pop(\"lcc_library_files\")\n            response_body[\"ui\"][\"lcc\"].pop(\"lcc_global_map\")\n            response_body[\"ui\"][\"cmdb\"].pop(\"logical_phone\")\n            response_body[\"ui\"][\"cmdb\"].pop(\"logical_ip\")\n            response_body[\"ui\"][\"cmdb\"].pop(\"logical_vlan\")\n            response_body[\"ui\"][\"cmdb\"].pop(\"logical_vm\")\n\n            # compare actual and response from cmdb\n            self.json_container.check_json_equals(\n                actual_data,\n                response_body,\n                \"Expected json content is not equal actual:\"\n            )\n        elif env_name == \"develop\" != 0:\n            # send request to backend to get license info\n            response = self.send_get_api_request(\"api/service-manager/license\")\n            response_body = self.get_response_body(response)\n\n            # compare actual and response from cmdb\n            self.json_container.check_json_equals(\n                actual_data,\n                response_body[\"data\"][\"config\"][\"config\"][\"e-nms\"],\n                \"Expected json content is not equal actual:\"\n            )\n        else:\n            pass\n
    "},{"location":"pages/license_tab/#pages.license_tab.LicenseTab.__init__","title":"__init__(page)","text":"

    \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0432\u043a\u043b\u0430\u0434\u043a\u0438 '\u041b\u0438\u0446\u0435\u043d\u0437\u0438\u0438'.

    Parameters:

    Name Type Description Default page Page

    \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright

    required Source code in pages\\license_tab.py
    def __init__(self, page: Page) -> None:\n    \"\"\"\u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0432\u043a\u043b\u0430\u0434\u043a\u0438 '\u041b\u0438\u0446\u0435\u043d\u0437\u0438\u0438'.\n\n    Args:\n        page: \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright\n    \"\"\"\n\n    super().__init__(page)\n\n    self.toolbar = ToolbarComponent(page, \"\u041b\u0438\u0446\u0435\u043d\u0437\u0438\u0438\")\n    self.json_container = JsonContainerComponent(page)\n\n    self.input_form_title = Text(page, TextLocators.TITLE_LICENSE_INPUT_FORM, \"input form title\")\n    self.license_id = Text(page, TextLocators.LICENSE_ID, \"license id\")\n    self.license_id_input = TextInput(page, InputLocators.LICENSE_ID_UPDATE, \"license id input\")\n    self.update_button = Button(page, ButtonLocators.BUTTON_LICENSE_UPDATE, \"update license button\")\n\n    self.alert = AlertComponent(page)\n
    "},{"location":"pages/license_tab/#pages.license_tab.LicenseTab.check_content","title":"check_content()","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0432\u0441\u0435\u0445 \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0445 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0432\u043a\u043b\u0430\u0434\u043a\u0438.

    Source code in pages\\license_tab.py
    def check_content(self) -> None:\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0432\u0441\u0435\u0445 \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0445 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0432\u043a\u043b\u0430\u0434\u043a\u0438.\"\"\"\n\n    self.should_be_toolbar()\n    self.should_be_json_container()\n    self.should_be_input_form_title()\n    self.should_be_empty_input_form()\n    self.should_be_update_button()\n\n    self.verify_json_container_content()\n
    "},{"location":"pages/license_tab/#pages.license_tab.LicenseTab.check_json_container_verticall_scrolling","title":"check_json_container_verticall_scrolling()","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u0439 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0438 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430.

    Returns:

    Name Type Description bool bool

    \u0414\u043e\u0441\u0442\u0443\u043f\u043d\u043e\u0441\u0442\u044c \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0438

    Source code in pages\\license_tab.py
    def check_json_container_verticall_scrolling(self) -> bool:\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u0439 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0438 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430.\n\n    Returns:\n        bool: \u0414\u043e\u0441\u0442\u0443\u043f\u043d\u043e\u0441\u0442\u044c \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0438\n    \"\"\"\n\n    loc = self.page.locator(JsonContainerLocators.SCROLL_CONTAINER).first\n    return self.json_container.is_scrollable_vertically(loc)\n
    "},{"location":"pages/license_tab/#pages.license_tab.LicenseTab.fill_license_input_form","title":"fill_license_input_form(value)","text":"

    \u0417\u0430\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u0444\u043e\u0440\u043c\u0443 \u0432\u0432\u043e\u0434\u0430 \u043b\u0438\u0446\u0435\u043d\u0437\u0438\u0438 \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u044b\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u043c.

    Parameters:

    Name Type Description Default value str

    \u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0434\u043b\u044f \u0432\u0432\u043e\u0434\u0430

    required Source code in pages\\license_tab.py
    def fill_license_input_form(self, value: str) -> None:\n    \"\"\"\u0417\u0430\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u0444\u043e\u0440\u043c\u0443 \u0432\u0432\u043e\u0434\u0430 \u043b\u0438\u0446\u0435\u043d\u0437\u0438\u0438 \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u044b\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u043c.\n\n    Args:\n        value: \u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0434\u043b\u044f \u0432\u0432\u043e\u0434\u0430\n    \"\"\"\n\n    self.license_id_input.clear()\n    self.license_id_input.input_value(value)\n    self.update_button.click()\n
    "},{"location":"pages/license_tab/#pages.license_tab.LicenseTab.scroll_json_container_down","title":"scroll_json_container_down()","text":"

    \u041f\u0440\u043e\u043a\u0440\u0443\u0447\u0438\u0432\u0430\u0435\u0442 JSON-\u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440 \u0432\u043d\u0438\u0437.

    Source code in pages\\license_tab.py
    def scroll_json_container_down(self) -> None:\n    \"\"\"\u041f\u0440\u043e\u043a\u0440\u0443\u0447\u0438\u0432\u0430\u0435\u0442 JSON-\u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440 \u0432\u043d\u0438\u0437.\"\"\"\n\n    loc = self.page.locator(JsonContainerLocators.SCROLL_CONTAINER).first\n    self.json_container.scroll_down(loc)\n
    "},{"location":"pages/license_tab/#pages.license_tab.LicenseTab.scroll_json_container_up","title":"scroll_json_container_up()","text":"

    \u041f\u0440\u043e\u043a\u0440\u0443\u0447\u0438\u0432\u0430\u0435\u0442 JSON-\u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440 \u0432\u0432\u0435\u0440\u0445.

    Source code in pages\\license_tab.py
    def scroll_json_container_up(self) -> None:\n    \"\"\"\u041f\u0440\u043e\u043a\u0440\u0443\u0447\u0438\u0432\u0430\u0435\u0442 JSON-\u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440 \u0432\u0432\u0435\u0440\u0445.\"\"\"\n\n    loc = self.page.locator(JsonContainerLocators.SCROLL_CONTAINER).first\n    self.json_container.scroll_up(loc)\n
    "},{"location":"pages/license_tab/#pages.license_tab.LicenseTab.should_be_empty_input_form","title":"should_be_empty_input_form()","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043f\u0443\u0441\u0442\u043e\u0442\u0443 \u0444\u043e\u0440\u043c\u044b \u0432\u0432\u043e\u0434\u0430 \u043b\u0438\u0446\u0435\u043d\u0437\u0438\u0438.

    Source code in pages\\license_tab.py
    def should_be_empty_input_form(self) -> None:\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043f\u0443\u0441\u0442\u043e\u0442\u0443 \u0444\u043e\u0440\u043c\u044b \u0432\u0432\u043e\u0434\u0430 \u043b\u0438\u0446\u0435\u043d\u0437\u0438\u0438.\"\"\"\n\n    self.license_id_input.check_empty_input(\"Input lisence id form is missing or not empty\")\n
    "},{"location":"pages/license_tab/#pages.license_tab.LicenseTab.should_be_error_alert_window_with_text","title":"should_be_error_alert_window_with_text(text)","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435/\u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u0435 \u0430\u043b\u0435\u0440\u0442\u0430 \u0441 \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u044b\u043c \u0442\u0435\u043a\u0441\u0442\u043e\u043c.

    Parameters:

    Name Type Description Default text str

    \u0422\u0435\u043a\u0441\u0442 \u0434\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438

    required Source code in pages\\license_tab.py
    def should_be_error_alert_window_with_text(self, text: str) -> None:\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435/\u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u0435 \u0430\u043b\u0435\u0440\u0442\u0430 \u0441 \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u044b\u043c \u0442\u0435\u043a\u0441\u0442\u043e\u043c.\n\n    Args:\n        text: \u0422\u0435\u043a\u0441\u0442 \u0434\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438\n    \"\"\"\n\n    alert_type = self.alert.get_alert_type()\n    assert alert_type==\"error\", f\"Expected error alert, but got {alert_type} alert\"\n\n    self.alert.check_alert_presence(text)\n    self.alert.check_alert_absence(text)\n
    "},{"location":"pages/license_tab/#pages.license_tab.LicenseTab.should_be_input_form_title","title":"should_be_input_form_title()","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a \u0444\u043e\u0440\u043c\u044b \u0438 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0435 ID \u043b\u0438\u0446\u0435\u043d\u0437\u0438\u0438.

    Source code in pages\\license_tab.py
    def should_be_input_form_title(self) -> None:\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a \u0444\u043e\u0440\u043c\u044b \u0438 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0435 ID \u043b\u0438\u0446\u0435\u043d\u0437\u0438\u0438.\"\"\"\n\n    self.input_form_title.check_have_text(\n        \"\u0418\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440:\",\n        \"Input lisence id form title '\u0418\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440:' is missing\"\n    )\n\n    actual_lisence_id = self.license_id.get_text(0).strip()\n\n    # send request to backend to get license id\n    response = self.send_get_api_request(\"e-cmdb/api/lic/deviceid\")\n    response_body = self.get_response_body(response)\n\n    self.check_equals(\n        actual_lisence_id,\n        response_body['deviceId'],\n        f\"Expected ID value {response_body['deviceId']} is not equal actual value {actual_lisence_id}\"\n    )\n
    "},{"location":"pages/license_tab/#pages.license_tab.LicenseTab.should_be_json_container","title":"should_be_json_container()","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 JSON-\u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430.

    Source code in pages\\license_tab.py
    def should_be_json_container(self) -> None:\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 JSON-\u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430.\"\"\"\n\n    self.json_container.check_visibility(\n        JsonContainerLocators.CONTAINER,\n        \"Json container with license info is missing\"\n    )\n
    "},{"location":"pages/license_tab/#pages.license_tab.LicenseTab.should_be_toolbar","title":"should_be_toolbar()","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u043f\u0430\u043d\u0435\u043b\u0438 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432.

    Source code in pages\\license_tab.py
    def should_be_toolbar(self) -> None:\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u043f\u0430\u043d\u0435\u043b\u0438 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432.\"\"\"\n\n    self.toolbar.check_toolbar_presence(\"Toolbar is missing\")\n
    "},{"location":"pages/license_tab/#pages.license_tab.LicenseTab.should_be_update_button","title":"should_be_update_button()","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u043a\u043d\u043e\u043f\u043a\u0438 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u043b\u0438\u0446\u0435\u043d\u0437\u0438\u0438.

    Source code in pages\\license_tab.py
    def should_be_update_button(self) -> None:\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u043a\u043d\u043e\u043f\u043a\u0438 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u043b\u0438\u0446\u0435\u043d\u0437\u0438\u0438.\"\"\"\n\n    button_text = \"\u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u043b\u0438\u0446\u0435\u043d\u0437\u0438\u044e\"\n    self.update_button.check_have_text(\n        button_text,\n        f\"Update button with text '{button_text}' is missing\"\n    )\n
    "},{"location":"pages/license_tab/#pages.license_tab.LicenseTab.verify_json_container_content","title":"verify_json_container_content()","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430 \u0434\u0430\u043d\u043d\u044b\u043c \u0438\u0437 API.

    Source code in pages\\license_tab.py
    def verify_json_container_content(self) -> None:\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430 \u0434\u0430\u043d\u043d\u044b\u043c \u0438\u0437 API.\"\"\"\n\n    actual_data = self.json_container.read_data(JsonContainerLocators.CONTAINER)\n\n    env_name = host.get_env_name()\n\n    # temporarily because of difference in version\n    if env_name == \"test\":\n        # send request to backend to get license info\n        response = self.send_get_api_request(\"e-cmdb/api/lic\")\n        response_body = self.get_response_body(response)\n\n        del response_body[\"netManagment\"]\n        response_body[\"ui\"][\"lcc\"].pop(\"lcc_object\")\n        response_body[\"ui\"][\"lcc\"].pop(\"lcc_reference_book\")\n        response_body[\"ui\"][\"lcc\"].pop(\"lcc_reports\")\n        response_body[\"ui\"][\"lcc\"].pop(\"lcc_library_files\")\n        response_body[\"ui\"][\"lcc\"].pop(\"lcc_global_map\")\n        response_body[\"ui\"][\"cmdb\"].pop(\"logical_phone\")\n        response_body[\"ui\"][\"cmdb\"].pop(\"logical_ip\")\n        response_body[\"ui\"][\"cmdb\"].pop(\"logical_vlan\")\n        response_body[\"ui\"][\"cmdb\"].pop(\"logical_vm\")\n\n        # compare actual and response from cmdb\n        self.json_container.check_json_equals(\n            actual_data,\n            response_body,\n            \"Expected json content is not equal actual:\"\n        )\n    elif env_name == \"develop\" != 0:\n        # send request to backend to get license info\n        response = self.send_get_api_request(\"api/service-manager/license\")\n        response_body = self.get_response_body(response)\n\n        # compare actual and response from cmdb\n        self.json_container.check_json_equals(\n            actual_data,\n            response_body[\"data\"][\"config\"][\"config\"][\"e-nms\"],\n            \"Expected json content is not equal actual:\"\n        )\n    else:\n        pass\n
    "},{"location":"pages/login_page/","title":"LoginPage","text":"

    \u041c\u043e\u0434\u0443\u043b\u044c \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u0438.

    \u0421\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043a\u043b\u0430\u0441\u0441 LoginPage \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u043c\u0438 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u0432\u0445\u043e\u0434\u0430 \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0443. \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 Playwright \u0434\u043b\u044f \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0441 UI \u0438 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u043e\u0442\u0432\u0435\u0442\u043e\u0432 \u0441\u0435\u0440\u0432\u0435\u0440\u0430.

    "},{"location":"pages/login_page/#pages.login_page.LoginPage","title":"LoginPage","text":"

    Bases: BasePage

    \u041a\u043b\u0430\u0441\u0441 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441\u043e \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435\u0439 \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u0438.

    \u0410\u0442\u0440\u0438\u0431\u0443\u0442\u044b

    page: \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright. login_input: \u041f\u043e\u043b\u0435 \u0432\u0432\u043e\u0434\u0430 \u043b\u043e\u0433\u0438\u043d\u0430. password_input: \u041f\u043e\u043b\u0435 \u0432\u0432\u043e\u0434\u0430 \u043f\u0430\u0440\u043e\u043b\u044f. login_button: \u041a\u043d\u043e\u043f\u043a\u0430 \u0432\u0445\u043e\u0434\u0430. alert: \u0410\u043b\u0435\u0440\u0442 \u043e\u043a\u043d\u043e \u0441 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435\u043c \u043e\u0431 \u043e\u0448\u0438\u0431\u043a\u0435.

    Source code in pages\\login_page.py
    class LoginPage(BasePage):\n    \"\"\"\u041a\u043b\u0430\u0441\u0441 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441\u043e \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435\u0439 \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u0438.\n\n    \u0410\u0442\u0440\u0438\u0431\u0443\u0442\u044b:\n        page: \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.\n        login_input: \u041f\u043e\u043b\u0435 \u0432\u0432\u043e\u0434\u0430 \u043b\u043e\u0433\u0438\u043d\u0430.\n        password_input: \u041f\u043e\u043b\u0435 \u0432\u0432\u043e\u0434\u0430 \u043f\u0430\u0440\u043e\u043b\u044f.\n        login_button: \u041a\u043d\u043e\u043f\u043a\u0430 \u0432\u0445\u043e\u0434\u0430.\n        alert: \u0410\u043b\u0435\u0440\u0442 \u043e\u043a\u043d\u043e \u0441 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435\u043c \u043e\u0431 \u043e\u0448\u0438\u0431\u043a\u0435.\n    \"\"\"\n\n    def __init__(self, page: Page) -> None:\n        \"\"\"\u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u0438.\n\n        Args:\n            page: \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.\n        \"\"\"\n\n        super().__init__(page)\n\n        self.login_input = TextInput(page, page.get_by_label(\"\u0418\u043c\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\"), \"login input\")\n        self.password_input = TextInput(page, page.get_by_label(\"\u041f\u0430\u0440\u043e\u043b\u044c\"), \"password input\")\n\n        icon_locator = page.get_by_label(\"\u041f\u0430\u0440\u043e\u043b\u044c\").locator(\"xpath=../..\").locator(TextInputLocators.ICON_PASSWORD_HIDING)\n        self.password_hidden_icon = Icon(page,\n                                         icon_locator,\n                                         \"password hidden icon\")\n        self.login_button = Button(page, page.get_by_role(\"button\"), \"login button\")\n\n        self.alert = AlertComponent(page)\n\n    # \u0414\u0435\u0439\u0441\u0442\u0432\u0438\u044f:\n    def click_password_hidden_icon(self) -> None:\n        \"\"\"\u041d\u0430\u0436\u0430\u0442\u0438\u0435 \u043d\u0430 \u0438\u043a\u043e\u043d\u043a\u0443 \u0441\u043a\u0440\u044b\u0442\u0438\u044f \u043f\u0430\u0440\u043e\u043b\u044f.\"\"\"\n\n        self.password_hidden_icon.click()\n\n    def do_login(self, username: str = None, password: str = None) -> None:\n        \"\"\"\u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u0432\u0445\u043e\u0434 \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0443.\n\n        \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u043f\u0435\u0440\u0435\u0434\u0430\u043d\u043d\u044b\u0435 \u0443\u0447\u0435\u0442\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0438\u043b\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0438\u0437 Constants.\n        \u041e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442 \u043e\u0442\u0432\u0435\u0442 \u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u0434\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0442\u043e\u043a\u0435\u043d\u0430 \u0434\u043e\u0441\u0442\u0443\u043f\u0430.\n\n        Args:\n            username: \u041b\u043e\u0433\u0438\u043d \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f. \u041f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u0438\u0437 Constants.\n            password: \u041f\u0430\u0440\u043e\u043b\u044c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f. \u041f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u0438\u0437 Constants.\n\n        Raises:\n            AssertionError: \u0415\u0441\u043b\u0438 \u043f\u043e\u0441\u043b\u0435 \u0432\u0445\u043e\u0434\u0430 \u043e\u0442\u043a\u0440\u044b\u043b\u0430\u0441\u044c \u043d\u0435\u043e\u0436\u0438\u0434\u0430\u043d\u043d\u0430\u044f \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0430.\n        \"\"\"\n\n        def handle_response(response):\n            if \"login\" in response.url:\n                response_body = self.get_response_body(response)\n                if response_body:\n                    host.set_current_user_credential(response_body)\n\n        self.page.on(\"response\", handle_response)\n\n        self.open(\"\")\n\n        # \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u043f\u0435\u0440\u0435\u0434\u0430\u043d\u043d\u044b\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0438\u043b\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u0438\u0437 Constants\n        actual_username = username if username is not None else Constants.login\n        actual_password = password if password is not None else Constants.password\n\n        self.login_input.clear()\n        self.login_input.input_value(actual_username)\n\n        self.password_input.clear()\n        self.password_input.input_value(actual_password)\n\n        self.login_button.click()\n\n        self.check_URL(\"dashboard\", \"An unexpected page has been opened\")\n\n    def do_unsuccessful_login(self, username: str = \"someuser\", password: str = \"password\") -> None:\n        \"\"\"\u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u043f\u043e\u043f\u044b\u0442\u043a\u0443 \u0432\u0445\u043e\u0434\u0430 \u0441 \u043d\u0435\u0432\u0435\u0440\u043d\u044b\u043c\u0438 \u0443\u0447\u0435\u0442\u043d\u044b\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u043c\u0438.\n\n        \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u043e\u0431 \u043e\u0448\u0438\u0431\u043a\u0435. \u041c\u043e\u0436\u043d\u043e \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u044c \u0441\u0432\u043e\u0438 \u0434\u0430\u043d\u043d\u044b\u0435\n        \u0438\u043b\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e.\n\n        Args:\n            username: \u041d\u0435\u0432\u0435\u0440\u043d\u044b\u0439 \u043b\u043e\u0433\u0438\u043d. \u041f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \"someuser\".\n            password: \u041d\u0435\u0432\u0435\u0440\u043d\u044b\u0439 \u043f\u0430\u0440\u043e\u043b\u044c. \u041f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \"password\".\n        \"\"\"\n\n        self.open(\"\")\n\n        self.login_input.clear()\n        self.login_input.input_value(username)\n\n        self.password_input.clear()\n        self.password_input.input_value(password)\n\n        self.login_button.click()\n\n        alert_type = self.alert.get_alert_type()\n        assert alert_type==\"error\", f\"Expected error alert, but got {alert_type} alert\"\n\n        self.alert.check_alert_presence(\"\u041d\u0435\u0432\u0435\u0440\u043d\u0430\u044f \u043f\u0430\u0440\u0430 \u043b\u043e\u0433\u0438\u043d/\u043f\u0430\u0440\u043e\u043b\u044c\")\n        self.alert.check_alert_absence(\"\u041d\u0435\u0432\u0435\u0440\u043d\u0430\u044f \u043f\u0430\u0440\u0430 \u043b\u043e\u0433\u0438\u043d/\u043f\u0430\u0440\u043e\u043b\u044c\")\n\n    # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0438:\n    def is_password_icon_hidden(self) -> bool:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0438\u043a\u043e\u043d\u043a\u0438 \u0441\u043a\u0440\u044b\u0442\u0438\u044f \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432 \u043f\u0430\u0440\u043e\u043b\u044f.\n           \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 True \u0435\u0441\u043b\u0438 \u043f\u0430\u0440\u043e\u043b\u044c \u0431\u0443\u0434\u0435\u0442 \u0441\u043a\u0440\u044b\u0442, \u0438\u043d\u0430\u0447\u0435 False\n        \"\"\"\n\n        return self.password_hidden_icon.is_password_hidden()\n\n    def is_password_hidden(self) -> bool:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432 \u043f\u0430\u0440\u043e\u043b\u044f.\"\"\"\n\n        input_type = self.password_input.get_input_type()\n        if input_type == \"password\":\n            return True\n        elif input_type == \"text\":\n            return False\n        else:\n            assert False, \"Check password hidden error\"\n
    "},{"location":"pages/login_page/#pages.login_page.LoginPage.__init__","title":"__init__(page)","text":"

    \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u0438.

    Parameters:

    Name Type Description Default page Page

    \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.

    required Source code in pages\\login_page.py
    def __init__(self, page: Page) -> None:\n    \"\"\"\u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u0438.\n\n    Args:\n        page: \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.\n    \"\"\"\n\n    super().__init__(page)\n\n    self.login_input = TextInput(page, page.get_by_label(\"\u0418\u043c\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\"), \"login input\")\n    self.password_input = TextInput(page, page.get_by_label(\"\u041f\u0430\u0440\u043e\u043b\u044c\"), \"password input\")\n\n    icon_locator = page.get_by_label(\"\u041f\u0430\u0440\u043e\u043b\u044c\").locator(\"xpath=../..\").locator(TextInputLocators.ICON_PASSWORD_HIDING)\n    self.password_hidden_icon = Icon(page,\n                                     icon_locator,\n                                     \"password hidden icon\")\n    self.login_button = Button(page, page.get_by_role(\"button\"), \"login button\")\n\n    self.alert = AlertComponent(page)\n
    "},{"location":"pages/login_page/#pages.login_page.LoginPage.click_password_hidden_icon","title":"click_password_hidden_icon()","text":"

    \u041d\u0430\u0436\u0430\u0442\u0438\u0435 \u043d\u0430 \u0438\u043a\u043e\u043d\u043a\u0443 \u0441\u043a\u0440\u044b\u0442\u0438\u044f \u043f\u0430\u0440\u043e\u043b\u044f.

    Source code in pages\\login_page.py
    def click_password_hidden_icon(self) -> None:\n    \"\"\"\u041d\u0430\u0436\u0430\u0442\u0438\u0435 \u043d\u0430 \u0438\u043a\u043e\u043d\u043a\u0443 \u0441\u043a\u0440\u044b\u0442\u0438\u044f \u043f\u0430\u0440\u043e\u043b\u044f.\"\"\"\n\n    self.password_hidden_icon.click()\n
    "},{"location":"pages/login_page/#pages.login_page.LoginPage.do_login","title":"do_login(username=None, password=None)","text":"

    \u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u0432\u0445\u043e\u0434 \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0443.

    \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u043f\u0435\u0440\u0435\u0434\u0430\u043d\u043d\u044b\u0435 \u0443\u0447\u0435\u0442\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0438\u043b\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0438\u0437 Constants. \u041e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442 \u043e\u0442\u0432\u0435\u0442 \u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u0434\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0442\u043e\u043a\u0435\u043d\u0430 \u0434\u043e\u0441\u0442\u0443\u043f\u0430.

    Parameters:

    Name Type Description Default username str

    \u041b\u043e\u0433\u0438\u043d \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f. \u041f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u0438\u0437 Constants.

    None password str

    \u041f\u0430\u0440\u043e\u043b\u044c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f. \u041f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u0438\u0437 Constants.

    None

    Raises:

    Type Description AssertionError

    \u0415\u0441\u043b\u0438 \u043f\u043e\u0441\u043b\u0435 \u0432\u0445\u043e\u0434\u0430 \u043e\u0442\u043a\u0440\u044b\u043b\u0430\u0441\u044c \u043d\u0435\u043e\u0436\u0438\u0434\u0430\u043d\u043d\u0430\u044f \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0430.

    Source code in pages\\login_page.py
    def do_login(self, username: str = None, password: str = None) -> None:\n    \"\"\"\u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u0432\u0445\u043e\u0434 \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0443.\n\n    \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u043f\u0435\u0440\u0435\u0434\u0430\u043d\u043d\u044b\u0435 \u0443\u0447\u0435\u0442\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0438\u043b\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0438\u0437 Constants.\n    \u041e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442 \u043e\u0442\u0432\u0435\u0442 \u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u0434\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0442\u043e\u043a\u0435\u043d\u0430 \u0434\u043e\u0441\u0442\u0443\u043f\u0430.\n\n    Args:\n        username: \u041b\u043e\u0433\u0438\u043d \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f. \u041f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u0438\u0437 Constants.\n        password: \u041f\u0430\u0440\u043e\u043b\u044c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f. \u041f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u0438\u0437 Constants.\n\n    Raises:\n        AssertionError: \u0415\u0441\u043b\u0438 \u043f\u043e\u0441\u043b\u0435 \u0432\u0445\u043e\u0434\u0430 \u043e\u0442\u043a\u0440\u044b\u043b\u0430\u0441\u044c \u043d\u0435\u043e\u0436\u0438\u0434\u0430\u043d\u043d\u0430\u044f \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0430.\n    \"\"\"\n\n    def handle_response(response):\n        if \"login\" in response.url:\n            response_body = self.get_response_body(response)\n            if response_body:\n                host.set_current_user_credential(response_body)\n\n    self.page.on(\"response\", handle_response)\n\n    self.open(\"\")\n\n    # \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u043f\u0435\u0440\u0435\u0434\u0430\u043d\u043d\u044b\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0438\u043b\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u0438\u0437 Constants\n    actual_username = username if username is not None else Constants.login\n    actual_password = password if password is not None else Constants.password\n\n    self.login_input.clear()\n    self.login_input.input_value(actual_username)\n\n    self.password_input.clear()\n    self.password_input.input_value(actual_password)\n\n    self.login_button.click()\n\n    self.check_URL(\"dashboard\", \"An unexpected page has been opened\")\n
    "},{"location":"pages/login_page/#pages.login_page.LoginPage.do_unsuccessful_login","title":"do_unsuccessful_login(username='someuser', password='password')","text":"

    \u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u043f\u043e\u043f\u044b\u0442\u043a\u0443 \u0432\u0445\u043e\u0434\u0430 \u0441 \u043d\u0435\u0432\u0435\u0440\u043d\u044b\u043c\u0438 \u0443\u0447\u0435\u0442\u043d\u044b\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u043c\u0438.

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u043e\u0431 \u043e\u0448\u0438\u0431\u043a\u0435. \u041c\u043e\u0436\u043d\u043e \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u044c \u0441\u0432\u043e\u0438 \u0434\u0430\u043d\u043d\u044b\u0435 \u0438\u043b\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e.

    Parameters:

    Name Type Description Default username str

    \u041d\u0435\u0432\u0435\u0440\u043d\u044b\u0439 \u043b\u043e\u0433\u0438\u043d. \u041f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \"someuser\".

    'someuser' password str

    \u041d\u0435\u0432\u0435\u0440\u043d\u044b\u0439 \u043f\u0430\u0440\u043e\u043b\u044c. \u041f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \"password\".

    'password' Source code in pages\\login_page.py
    def do_unsuccessful_login(self, username: str = \"someuser\", password: str = \"password\") -> None:\n    \"\"\"\u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u043f\u043e\u043f\u044b\u0442\u043a\u0443 \u0432\u0445\u043e\u0434\u0430 \u0441 \u043d\u0435\u0432\u0435\u0440\u043d\u044b\u043c\u0438 \u0443\u0447\u0435\u0442\u043d\u044b\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u043c\u0438.\n\n    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u043e\u0431 \u043e\u0448\u0438\u0431\u043a\u0435. \u041c\u043e\u0436\u043d\u043e \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u044c \u0441\u0432\u043e\u0438 \u0434\u0430\u043d\u043d\u044b\u0435\n    \u0438\u043b\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e.\n\n    Args:\n        username: \u041d\u0435\u0432\u0435\u0440\u043d\u044b\u0439 \u043b\u043e\u0433\u0438\u043d. \u041f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \"someuser\".\n        password: \u041d\u0435\u0432\u0435\u0440\u043d\u044b\u0439 \u043f\u0430\u0440\u043e\u043b\u044c. \u041f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \"password\".\n    \"\"\"\n\n    self.open(\"\")\n\n    self.login_input.clear()\n    self.login_input.input_value(username)\n\n    self.password_input.clear()\n    self.password_input.input_value(password)\n\n    self.login_button.click()\n\n    alert_type = self.alert.get_alert_type()\n    assert alert_type==\"error\", f\"Expected error alert, but got {alert_type} alert\"\n\n    self.alert.check_alert_presence(\"\u041d\u0435\u0432\u0435\u0440\u043d\u0430\u044f \u043f\u0430\u0440\u0430 \u043b\u043e\u0433\u0438\u043d/\u043f\u0430\u0440\u043e\u043b\u044c\")\n    self.alert.check_alert_absence(\"\u041d\u0435\u0432\u0435\u0440\u043d\u0430\u044f \u043f\u0430\u0440\u0430 \u043b\u043e\u0433\u0438\u043d/\u043f\u0430\u0440\u043e\u043b\u044c\")\n
    "},{"location":"pages/login_page/#pages.login_page.LoginPage.is_password_hidden","title":"is_password_hidden()","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432 \u043f\u0430\u0440\u043e\u043b\u044f.

    Source code in pages\\login_page.py
    def is_password_hidden(self) -> bool:\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432 \u043f\u0430\u0440\u043e\u043b\u044f.\"\"\"\n\n    input_type = self.password_input.get_input_type()\n    if input_type == \"password\":\n        return True\n    elif input_type == \"text\":\n        return False\n    else:\n        assert False, \"Check password hidden error\"\n
    "},{"location":"pages/login_page/#pages.login_page.LoginPage.is_password_icon_hidden","title":"is_password_icon_hidden()","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0438\u043a\u043e\u043d\u043a\u0438 \u0441\u043a\u0440\u044b\u0442\u0438\u044f \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432 \u043f\u0430\u0440\u043e\u043b\u044f. \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 True \u0435\u0441\u043b\u0438 \u043f\u0430\u0440\u043e\u043b\u044c \u0431\u0443\u0434\u0435\u0442 \u0441\u043a\u0440\u044b\u0442, \u0438\u043d\u0430\u0447\u0435 False

    Source code in pages\\login_page.py
    def is_password_icon_hidden(self) -> bool:\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0438\u043a\u043e\u043d\u043a\u0438 \u0441\u043a\u0440\u044b\u0442\u0438\u044f \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432 \u043f\u0430\u0440\u043e\u043b\u044f.\n       \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 True \u0435\u0441\u043b\u0438 \u043f\u0430\u0440\u043e\u043b\u044c \u0431\u0443\u0434\u0435\u0442 \u0441\u043a\u0440\u044b\u0442, \u0438\u043d\u0430\u0447\u0435 False\n    \"\"\"\n\n    return self.password_hidden_icon.is_password_hidden()\n
    "},{"location":"pages/main_page/","title":"MainPage","text":"

    \u041c\u043e\u0434\u0443\u043b\u044c \u0433\u043b\u0430\u0432\u043d\u043e\u0439 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f.

    \u0421\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043a\u043b\u0430\u0441\u0441 MainPage \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u043c\u0438 \u0433\u043b\u0430\u0432\u043d\u043e\u0439 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b. \u0412\u043a\u043b\u044e\u0447\u0430\u0435\u0442 \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u0441 \u043f\u0430\u043d\u0435\u043b\u044c\u044e \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438, \u043a\u043d\u043e\u043f\u043a\u0430\u043c\u0438 \u0438 \u043a\u0430\u0440\u0442\u043e\u0447\u043a\u043e\u0439 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.

    "},{"location":"pages/main_page/#pages.main_page.MainPage","title":"MainPage","text":"

    Bases: BasePage

    \u041a\u043b\u0430\u0441\u0441 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0433\u043b\u0430\u0432\u043d\u043e\u0439 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435\u0439 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f.

    \u0410\u0442\u0440\u0438\u0431\u0443\u0442\u044b

    page: \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright. navigation_panel: \u041a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 \u043f\u0430\u043d\u0435\u043b\u0438 \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438. user_button: \u041a\u043d\u043e\u043f\u043a\u0430 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f. user_card: \u041a\u0430\u0440\u0442\u043e\u0447\u043a\u0430 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.

    Source code in pages\\main_page.py
    class MainPage(BasePage):\n    \"\"\"\u041a\u043b\u0430\u0441\u0441 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0433\u043b\u0430\u0432\u043d\u043e\u0439 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435\u0439 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f.\n\n    \u0410\u0442\u0440\u0438\u0431\u0443\u0442\u044b:\n        page: \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.\n        navigation_panel: \u041a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 \u043f\u0430\u043d\u0435\u043b\u0438 \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438.\n        user_button: \u041a\u043d\u043e\u043f\u043a\u0430 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\n        user_card: \u041a\u0430\u0440\u0442\u043e\u0447\u043a\u0430 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\n    \"\"\"\n\n    def __init__(self, page: Page) -> None:\n        \"\"\"\u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0433\u043b\u0430\u0432\u043d\u043e\u0439 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b.\n\n        Args:\n            page: \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.\n        \"\"\"\n\n        super().__init__(page)\n\n        self.navigation_panel = NavigationPanelComponent(page)\n        self.event_panel = EventPanelComponent(page)\n\n    # \u0414\u0435\u0439\u0441\u0442\u0432\u0438\u044f:\n    def click_main_navigation_panel_item(self, item_name: str) -> None:\n        \"\"\"\u041a\u043b\u0438\u043a\u0430\u0435\u0442 \u043f\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0443 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u043f\u0430\u043d\u0435\u043b\u0438 \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438.\n\n        Args:\n            item_name: \u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0434\u043b\u044f \u043a\u043b\u0438\u043a\u0430.\n        \"\"\"\n\n        self.navigation_panel.click_item(NavigationPanelLocators.PANEL_MAIN, item_name)\n\n    def click_subpanel_item(self, item_name: str, parent=None) -> None:\n        \"\"\"\u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u044b\u0439 \u043f\u043e\u0438\u0441\u043a \u043f\u043e \u043f\u0430\u043d\u0435\u043b\u0438 \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438 \u0437\u0430\u0434\u0430\u043d\u043d\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0438 \u0434\u0435\u043b\u0430\u0435\u0442 \u043a\u043b\u0438\u043a \u043f\u043e \u043d\u0435\u043c\u0443.\"\"\"\n\n        active_item_locator = self.page.locator(NavigationPanelLocators.PANEL_MAIN).locator(NavigationPanelLocators.ACTIVE_CONTAINER)\n        node_locator = active_item_locator.locator(NavigationPanelLocators.SUB_PANEL_MAIN).locator(NavigationPanelLocators.TREEVIEW).first\n\n        # \u0420\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u044b\u0439 \u043f\u043e\u0438\u0441\u043a \u0432 \u0434\u0435\u0440\u0435\u0432\u0435 v-treeview \u0437\u0430\u0434\u0430\u043d\u043d\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0438 \u043a\u043b\u0438\u043a \u043f\u043e \u043d\u0435\u043c\u0443\n        self.navigation_panel.click_sub_item(node_locator, item_name, parent)\n\n    def click_events_panel_expand_less_button(self) -> None:\n        \"\"\"\u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u043d\u0430\u0436\u0430\u0442\u0438\u0435 \u043a\u043d\u043e\u043f\u043a\u0438 \u0433\u0430\u043b\u043e\u0447\u043a\u0430 \u0432\u0432\u0435\u0440\u0445.\"\"\"\n\n        self.event_panel.click_expand_less_button()\n\n    def click_events_panel_expand_more_button(self) -> None:\n        \"\"\"\u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u043d\u0430\u0436\u0430\u0442\u0438\u0435 \u043a\u043d\u043e\u043f\u043a\u0438 \u0433\u0430\u043b\u043e\u0447\u043a\u0430 \u0432\u043d\u0438\u0437.\"\"\"\n\n        self.event_panel.click_expand_more_button()\n\n    def click_events_panel_system_log_tab(self) -> SystemLogEventsContainer:\n        \"\"\"\u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u043d\u0430\u0436\u0430\u0442\u0438\u0435 tab-\u043a\u043d\u043e\u043f\u043a\u0438 \u0421\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0439 \u0436\u0443\u0440\u043d\u0430\u043b.\"\"\"\n\n        return self.event_panel.click_system_log_tab()\n\n    def click_user_button(self) -> UserCard:\n        \"\"\"\u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u043d\u0430\u0436\u0430\u0442\u0438\u0435 \u043a\u043d\u043e\u043f\u043a\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\"\"\"\n\n        return self.event_panel.click_user_button()\n\n    def do_logout(self) -> None:\n        \"\"\"\u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u0432\u044b\u0445\u043e\u0434 \u0438\u0437 \u0441\u0438\u0441\u0442\u0435\u043c\u044b.\"\"\"\n\n        self.event_panel.do_logout()\n\n    def expand_navigation_subpanel(self):\n        \"\"\"\u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u043f\u043e\u043b\u043d\u043e\u0435 \u043e\u0442\u043a\u0440\u044b\u0442\u0438\u0435 \u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0439 \u0433\u043b\u0430\u0432\u043d\u043e\u0439 \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u043e\u043d\u043d\u043e\u0439 \u043f\u043e\u0434\u043f\u0430\u043d\u0435\u043b\u0438.\"\"\"\n\n        active_item_locator = self.page.locator(NavigationPanelLocators.PANEL_MAIN).locator(NavigationPanelLocators.ACTIVE_CONTAINER)\n        node_locator = active_item_locator.locator(NavigationPanelLocators.SUB_PANEL_MAIN).locator(NavigationPanelLocators.TREEVIEW).first\n\n        # \u0420\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u044b\u0439 \u043e\u0431\u0445\u043e\u0434 \u0434\u0435\u0440\u0435\u0432\u0430 v-treeview \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u043e\u0439 \u043f\u043e\u0434\u043f\u0430\u043d\u0435\u043b\u0438 \u0438 \u0432\u044b\u0432\u043e\u0434 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u043e\u0431 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u0445 \u0432 \u0440\u0435\u0436\u0438\u043c\u0435 \u043e\u0442\u043b\u0430\u0434\u043a\u0438 (debug=True)\n        self.navigation_panel.traverse_panel_tree(node_locator, debug=False)\n\n    def get_event_counters_by_tooltips(self) -> {}:\n        \"\"\"\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043d\u0430\u0431\u043e\u0440 \u0442\u0435\u043a\u0441\u0442\u043e\u0432 \u0432\u0441\u043f\u043b\u044b\u0432\u0430\u044e\u0449\u0438\u0445 \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043e\u043a \u043a\u043d\u043e\u043f\u043e\u043a \u0441\u0447\u0435\u0442\u0447\u0438\u043a\u043e\u0432 \u0441\u043e\u0431\u044b\u0442\u0438\u0439.\"\"\"\n\n        events = self.event_panel.get_event_tooltip_texts()\n\n        event_counters = {}\n\n        for event in events:\n            if len(event) > 0:\n                event_name, count = event.split(\" \")\n                event_counters[event_name] = count\n        return event_counters\n\n    def get_event_counters_by_buttons(self) -> {}:\n        \"\"\"\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043d\u0430\u0431\u043e\u0440 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u043a\u043d\u043e\u043f\u043e\u043a \u0441\u0447\u0435\u0442\u0447\u0438\u043a\u043e\u0432 \u0441\u043e\u0431\u044b\u0442\u0438\u0439.\"\"\"\n\n        return self.event_panel.get_event_button_values()\n\n    def get_events_panel_position(self) -> str:\n        \"\"\"\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0442\u0435\u043a\u0443\u0449\u0435\u0435 \u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043f\u0430\u043d\u0435\u043b\u0438 \u0441\u043e\u0431\u044b\u0442\u0438\u0439 \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b: \"top\", \"center\",\"bottom\".\"\"\"\n\n        return self.event_panel.get_panel_position()\n\n    def scroll_navigation_panel_up(self) -> None:\n        \"\"\"\u041f\u0440\u043e\u043a\u0440\u0443\u0447\u0438\u0432\u0430\u0435\u0442 \u043f\u0430\u043d\u0435\u043b\u044c \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438 \u0432\u0432\u0435\u0440\u0445.\"\"\"\n\n        self.navigation_panel.scroll_up(NavigationPanelLocators.PANEL_SCROLL_CONTAINER)\n\n    def scroll_navigation_panel_down(self) -> None:\n        \"\"\"\u041f\u0440\u043e\u043a\u0440\u0443\u0447\u0438\u0432\u0430\u0435\u0442 \u043f\u0430\u043d\u0435\u043b\u044c \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438 \u0432\u043d\u0438\u0437.\"\"\"\n\n        self.navigation_panel.scroll_down(NavigationPanelLocators.PANEL_SCROLL_CONTAINER)\n\n    # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0438:\n    def should_be_navigation_panel(self) -> None:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u043f\u0430\u043d\u0435\u043b\u0438 \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438.\"\"\"\n\n        self.navigation_panel.check_visibility(\n            NavigationPanelLocators.PANEL_MAIN,\n            \"Navigation panel is missing\"\n        )\n\n    def should_be_event_panel(self) -> None:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u043f\u0430\u043d\u0435\u043b\u0438 \u0441\u043e\u0431\u044b\u0442\u0438\u0439.\"\"\"\n\n        ## to-do: \u043a\u043d\u043e\u043f\u043a\u0438 \u0433\u0430\u043b\u043e\u0447\u043a\u0438???\n        self.event_panel.should_be_tab_buttons()\n        self.event_panel.should_be_event_buttons()\n        self.event_panel.should_be_search_button()\n        self.event_panel.should_be_user_button()\n\n    def check_expand_less_button(self) -> bool:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u043a\u043d\u043e\u043f\u043a\u0438 \u0433\u0430\u043b\u043e\u0447\u043a\u0430 \u0432\u0432\u0435\u0440\u0445.\"\"\"\n\n        return self.event_panel.check_expand_less_button()\n\n    def check_expand_more_button(self) -> bool:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u043a\u043d\u043e\u043f\u043a\u0438 \u0433\u0430\u043b\u043e\u0447\u043a\u0430 \u0432\u043d\u0438\u0437.\"\"\"\n\n        return self.event_panel.check_expand_more_button()\n\n    def check_navigation_panel_verticall_scrolling(self) -> bool:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u0439 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0438 \u043f\u0430\u043d\u0435\u043b\u0438.\n\n        Returns:\n            bool: True \u0435\u0441\u043b\u0438 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0430 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u0430, \u0438\u043d\u0430\u0447\u0435 False.\n        \"\"\"\n\n        return self.navigation_panel.is_scrollable_vertically(\n            NavigationPanelLocators.PANEL_SCROLL_CONTAINER\n        )\n\n    def check_navigation_panel_item_visibility(self, item_name: str) -> None:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0432 \u043f\u0430\u043d\u0435\u043b\u0438 \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438.\n\n        Args:\n            item_name: \u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0434\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438.\n        \"\"\"\n\n        self.navigation_panel.check_item_visibility(\n            NavigationPanelLocators.PANEL_MAIN,\n            item_name\n        )\n
    "},{"location":"pages/main_page/#pages.main_page.MainPage.__init__","title":"__init__(page)","text":"

    \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0433\u043b\u0430\u0432\u043d\u043e\u0439 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b.

    Parameters:

    Name Type Description Default page Page

    \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.

    required Source code in pages\\main_page.py
    def __init__(self, page: Page) -> None:\n    \"\"\"\u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0433\u043b\u0430\u0432\u043d\u043e\u0439 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b.\n\n    Args:\n        page: \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.\n    \"\"\"\n\n    super().__init__(page)\n\n    self.navigation_panel = NavigationPanelComponent(page)\n    self.event_panel = EventPanelComponent(page)\n
    "},{"location":"pages/main_page/#pages.main_page.MainPage.check_expand_less_button","title":"check_expand_less_button()","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u043a\u043d\u043e\u043f\u043a\u0438 \u0433\u0430\u043b\u043e\u0447\u043a\u0430 \u0432\u0432\u0435\u0440\u0445.

    Source code in pages\\main_page.py
    def check_expand_less_button(self) -> bool:\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u043a\u043d\u043e\u043f\u043a\u0438 \u0433\u0430\u043b\u043e\u0447\u043a\u0430 \u0432\u0432\u0435\u0440\u0445.\"\"\"\n\n    return self.event_panel.check_expand_less_button()\n
    "},{"location":"pages/main_page/#pages.main_page.MainPage.check_expand_more_button","title":"check_expand_more_button()","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u043a\u043d\u043e\u043f\u043a\u0438 \u0433\u0430\u043b\u043e\u0447\u043a\u0430 \u0432\u043d\u0438\u0437.

    Source code in pages\\main_page.py
    def check_expand_more_button(self) -> bool:\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u043a\u043d\u043e\u043f\u043a\u0438 \u0433\u0430\u043b\u043e\u0447\u043a\u0430 \u0432\u043d\u0438\u0437.\"\"\"\n\n    return self.event_panel.check_expand_more_button()\n
    "},{"location":"pages/main_page/#pages.main_page.MainPage.check_navigation_panel_item_visibility","title":"check_navigation_panel_item_visibility(item_name)","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0432 \u043f\u0430\u043d\u0435\u043b\u0438 \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438.

    Parameters:

    Name Type Description Default item_name str

    \u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0434\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438.

    required Source code in pages\\main_page.py
    def check_navigation_panel_item_visibility(self, item_name: str) -> None:\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0432 \u043f\u0430\u043d\u0435\u043b\u0438 \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438.\n\n    Args:\n        item_name: \u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0434\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438.\n    \"\"\"\n\n    self.navigation_panel.check_item_visibility(\n        NavigationPanelLocators.PANEL_MAIN,\n        item_name\n    )\n
    "},{"location":"pages/main_page/#pages.main_page.MainPage.check_navigation_panel_verticall_scrolling","title":"check_navigation_panel_verticall_scrolling()","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u0439 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0438 \u043f\u0430\u043d\u0435\u043b\u0438.

    Returns:

    Name Type Description bool bool

    True \u0435\u0441\u043b\u0438 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0430 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u0430, \u0438\u043d\u0430\u0447\u0435 False.

    Source code in pages\\main_page.py
    def check_navigation_panel_verticall_scrolling(self) -> bool:\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u0439 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0438 \u043f\u0430\u043d\u0435\u043b\u0438.\n\n    Returns:\n        bool: True \u0435\u0441\u043b\u0438 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0430 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u0430, \u0438\u043d\u0430\u0447\u0435 False.\n    \"\"\"\n\n    return self.navigation_panel.is_scrollable_vertically(\n        NavigationPanelLocators.PANEL_SCROLL_CONTAINER\n    )\n
    "},{"location":"pages/main_page/#pages.main_page.MainPage.click_events_panel_expand_less_button","title":"click_events_panel_expand_less_button()","text":"

    \u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u043d\u0430\u0436\u0430\u0442\u0438\u0435 \u043a\u043d\u043e\u043f\u043a\u0438 \u0433\u0430\u043b\u043e\u0447\u043a\u0430 \u0432\u0432\u0435\u0440\u0445.

    Source code in pages\\main_page.py
    def click_events_panel_expand_less_button(self) -> None:\n    \"\"\"\u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u043d\u0430\u0436\u0430\u0442\u0438\u0435 \u043a\u043d\u043e\u043f\u043a\u0438 \u0433\u0430\u043b\u043e\u0447\u043a\u0430 \u0432\u0432\u0435\u0440\u0445.\"\"\"\n\n    self.event_panel.click_expand_less_button()\n
    "},{"location":"pages/main_page/#pages.main_page.MainPage.click_events_panel_expand_more_button","title":"click_events_panel_expand_more_button()","text":"

    \u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u043d\u0430\u0436\u0430\u0442\u0438\u0435 \u043a\u043d\u043e\u043f\u043a\u0438 \u0433\u0430\u043b\u043e\u0447\u043a\u0430 \u0432\u043d\u0438\u0437.

    Source code in pages\\main_page.py
    def click_events_panel_expand_more_button(self) -> None:\n    \"\"\"\u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u043d\u0430\u0436\u0430\u0442\u0438\u0435 \u043a\u043d\u043e\u043f\u043a\u0438 \u0433\u0430\u043b\u043e\u0447\u043a\u0430 \u0432\u043d\u0438\u0437.\"\"\"\n\n    self.event_panel.click_expand_more_button()\n
    "},{"location":"pages/main_page/#pages.main_page.MainPage.click_events_panel_system_log_tab","title":"click_events_panel_system_log_tab()","text":"

    \u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u043d\u0430\u0436\u0430\u0442\u0438\u0435 tab-\u043a\u043d\u043e\u043f\u043a\u0438 \u0421\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0439 \u0436\u0443\u0440\u043d\u0430\u043b.

    Source code in pages\\main_page.py
    def click_events_panel_system_log_tab(self) -> SystemLogEventsContainer:\n    \"\"\"\u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u043d\u0430\u0436\u0430\u0442\u0438\u0435 tab-\u043a\u043d\u043e\u043f\u043a\u0438 \u0421\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0439 \u0436\u0443\u0440\u043d\u0430\u043b.\"\"\"\n\n    return self.event_panel.click_system_log_tab()\n
    "},{"location":"pages/main_page/#pages.main_page.MainPage.click_main_navigation_panel_item","title":"click_main_navigation_panel_item(item_name)","text":"

    \u041a\u043b\u0438\u043a\u0430\u0435\u0442 \u043f\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0443 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u043f\u0430\u043d\u0435\u043b\u0438 \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438.

    Parameters:

    Name Type Description Default item_name str

    \u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0434\u043b\u044f \u043a\u043b\u0438\u043a\u0430.

    required Source code in pages\\main_page.py
    def click_main_navigation_panel_item(self, item_name: str) -> None:\n    \"\"\"\u041a\u043b\u0438\u043a\u0430\u0435\u0442 \u043f\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0443 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u043f\u0430\u043d\u0435\u043b\u0438 \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438.\n\n    Args:\n        item_name: \u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0434\u043b\u044f \u043a\u043b\u0438\u043a\u0430.\n    \"\"\"\n\n    self.navigation_panel.click_item(NavigationPanelLocators.PANEL_MAIN, item_name)\n
    "},{"location":"pages/main_page/#pages.main_page.MainPage.click_subpanel_item","title":"click_subpanel_item(item_name, parent=None)","text":"

    \u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u044b\u0439 \u043f\u043e\u0438\u0441\u043a \u043f\u043e \u043f\u0430\u043d\u0435\u043b\u0438 \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438 \u0437\u0430\u0434\u0430\u043d\u043d\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0438 \u0434\u0435\u043b\u0430\u0435\u0442 \u043a\u043b\u0438\u043a \u043f\u043e \u043d\u0435\u043c\u0443.

    Source code in pages\\main_page.py
    def click_subpanel_item(self, item_name: str, parent=None) -> None:\n    \"\"\"\u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u044b\u0439 \u043f\u043e\u0438\u0441\u043a \u043f\u043e \u043f\u0430\u043d\u0435\u043b\u0438 \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438 \u0437\u0430\u0434\u0430\u043d\u043d\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0438 \u0434\u0435\u043b\u0430\u0435\u0442 \u043a\u043b\u0438\u043a \u043f\u043e \u043d\u0435\u043c\u0443.\"\"\"\n\n    active_item_locator = self.page.locator(NavigationPanelLocators.PANEL_MAIN).locator(NavigationPanelLocators.ACTIVE_CONTAINER)\n    node_locator = active_item_locator.locator(NavigationPanelLocators.SUB_PANEL_MAIN).locator(NavigationPanelLocators.TREEVIEW).first\n\n    # \u0420\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u044b\u0439 \u043f\u043e\u0438\u0441\u043a \u0432 \u0434\u0435\u0440\u0435\u0432\u0435 v-treeview \u0437\u0430\u0434\u0430\u043d\u043d\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0438 \u043a\u043b\u0438\u043a \u043f\u043e \u043d\u0435\u043c\u0443\n    self.navigation_panel.click_sub_item(node_locator, item_name, parent)\n
    "},{"location":"pages/main_page/#pages.main_page.MainPage.click_user_button","title":"click_user_button()","text":"

    \u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u043d\u0430\u0436\u0430\u0442\u0438\u0435 \u043a\u043d\u043e\u043f\u043a\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.

    Source code in pages\\main_page.py
    def click_user_button(self) -> UserCard:\n    \"\"\"\u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u043d\u0430\u0436\u0430\u0442\u0438\u0435 \u043a\u043d\u043e\u043f\u043a\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\"\"\"\n\n    return self.event_panel.click_user_button()\n
    "},{"location":"pages/main_page/#pages.main_page.MainPage.do_logout","title":"do_logout()","text":"

    \u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u0432\u044b\u0445\u043e\u0434 \u0438\u0437 \u0441\u0438\u0441\u0442\u0435\u043c\u044b.

    Source code in pages\\main_page.py
    def do_logout(self) -> None:\n    \"\"\"\u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u0432\u044b\u0445\u043e\u0434 \u0438\u0437 \u0441\u0438\u0441\u0442\u0435\u043c\u044b.\"\"\"\n\n    self.event_panel.do_logout()\n
    "},{"location":"pages/main_page/#pages.main_page.MainPage.expand_navigation_subpanel","title":"expand_navigation_subpanel()","text":"

    \u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u043f\u043e\u043b\u043d\u043e\u0435 \u043e\u0442\u043a\u0440\u044b\u0442\u0438\u0435 \u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0439 \u0433\u043b\u0430\u0432\u043d\u043e\u0439 \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u043e\u043d\u043d\u043e\u0439 \u043f\u043e\u0434\u043f\u0430\u043d\u0435\u043b\u0438.

    Source code in pages\\main_page.py
    def expand_navigation_subpanel(self):\n    \"\"\"\u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u043f\u043e\u043b\u043d\u043e\u0435 \u043e\u0442\u043a\u0440\u044b\u0442\u0438\u0435 \u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0439 \u0433\u043b\u0430\u0432\u043d\u043e\u0439 \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u043e\u043d\u043d\u043e\u0439 \u043f\u043e\u0434\u043f\u0430\u043d\u0435\u043b\u0438.\"\"\"\n\n    active_item_locator = self.page.locator(NavigationPanelLocators.PANEL_MAIN).locator(NavigationPanelLocators.ACTIVE_CONTAINER)\n    node_locator = active_item_locator.locator(NavigationPanelLocators.SUB_PANEL_MAIN).locator(NavigationPanelLocators.TREEVIEW).first\n\n    # \u0420\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u044b\u0439 \u043e\u0431\u0445\u043e\u0434 \u0434\u0435\u0440\u0435\u0432\u0430 v-treeview \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u043e\u0439 \u043f\u043e\u0434\u043f\u0430\u043d\u0435\u043b\u0438 \u0438 \u0432\u044b\u0432\u043e\u0434 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u043e\u0431 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u0445 \u0432 \u0440\u0435\u0436\u0438\u043c\u0435 \u043e\u0442\u043b\u0430\u0434\u043a\u0438 (debug=True)\n    self.navigation_panel.traverse_panel_tree(node_locator, debug=False)\n
    "},{"location":"pages/main_page/#pages.main_page.MainPage.get_event_counters_by_buttons","title":"get_event_counters_by_buttons()","text":"

    \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043d\u0430\u0431\u043e\u0440 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u043a\u043d\u043e\u043f\u043e\u043a \u0441\u0447\u0435\u0442\u0447\u0438\u043a\u043e\u0432 \u0441\u043e\u0431\u044b\u0442\u0438\u0439.

    Source code in pages\\main_page.py
    def get_event_counters_by_buttons(self) -> {}:\n    \"\"\"\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043d\u0430\u0431\u043e\u0440 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u043a\u043d\u043e\u043f\u043e\u043a \u0441\u0447\u0435\u0442\u0447\u0438\u043a\u043e\u0432 \u0441\u043e\u0431\u044b\u0442\u0438\u0439.\"\"\"\n\n    return self.event_panel.get_event_button_values()\n
    "},{"location":"pages/main_page/#pages.main_page.MainPage.get_event_counters_by_tooltips","title":"get_event_counters_by_tooltips()","text":"

    \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043d\u0430\u0431\u043e\u0440 \u0442\u0435\u043a\u0441\u0442\u043e\u0432 \u0432\u0441\u043f\u043b\u044b\u0432\u0430\u044e\u0449\u0438\u0445 \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043e\u043a \u043a\u043d\u043e\u043f\u043e\u043a \u0441\u0447\u0435\u0442\u0447\u0438\u043a\u043e\u0432 \u0441\u043e\u0431\u044b\u0442\u0438\u0439.

    Source code in pages\\main_page.py
    def get_event_counters_by_tooltips(self) -> {}:\n    \"\"\"\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043d\u0430\u0431\u043e\u0440 \u0442\u0435\u043a\u0441\u0442\u043e\u0432 \u0432\u0441\u043f\u043b\u044b\u0432\u0430\u044e\u0449\u0438\u0445 \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043e\u043a \u043a\u043d\u043e\u043f\u043e\u043a \u0441\u0447\u0435\u0442\u0447\u0438\u043a\u043e\u0432 \u0441\u043e\u0431\u044b\u0442\u0438\u0439.\"\"\"\n\n    events = self.event_panel.get_event_tooltip_texts()\n\n    event_counters = {}\n\n    for event in events:\n        if len(event) > 0:\n            event_name, count = event.split(\" \")\n            event_counters[event_name] = count\n    return event_counters\n
    "},{"location":"pages/main_page/#pages.main_page.MainPage.get_events_panel_position","title":"get_events_panel_position()","text":"

    \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0442\u0435\u043a\u0443\u0449\u0435\u0435 \u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043f\u0430\u043d\u0435\u043b\u0438 \u0441\u043e\u0431\u044b\u0442\u0438\u0439 \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b: \"top\", \"center\",\"bottom\".

    Source code in pages\\main_page.py
    def get_events_panel_position(self) -> str:\n    \"\"\"\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0442\u0435\u043a\u0443\u0449\u0435\u0435 \u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043f\u0430\u043d\u0435\u043b\u0438 \u0441\u043e\u0431\u044b\u0442\u0438\u0439 \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b: \"top\", \"center\",\"bottom\".\"\"\"\n\n    return self.event_panel.get_panel_position()\n
    "},{"location":"pages/main_page/#pages.main_page.MainPage.scroll_navigation_panel_down","title":"scroll_navigation_panel_down()","text":"

    \u041f\u0440\u043e\u043a\u0440\u0443\u0447\u0438\u0432\u0430\u0435\u0442 \u043f\u0430\u043d\u0435\u043b\u044c \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438 \u0432\u043d\u0438\u0437.

    Source code in pages\\main_page.py
    def scroll_navigation_panel_down(self) -> None:\n    \"\"\"\u041f\u0440\u043e\u043a\u0440\u0443\u0447\u0438\u0432\u0430\u0435\u0442 \u043f\u0430\u043d\u0435\u043b\u044c \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438 \u0432\u043d\u0438\u0437.\"\"\"\n\n    self.navigation_panel.scroll_down(NavigationPanelLocators.PANEL_SCROLL_CONTAINER)\n
    "},{"location":"pages/main_page/#pages.main_page.MainPage.scroll_navigation_panel_up","title":"scroll_navigation_panel_up()","text":"

    \u041f\u0440\u043e\u043a\u0440\u0443\u0447\u0438\u0432\u0430\u0435\u0442 \u043f\u0430\u043d\u0435\u043b\u044c \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438 \u0432\u0432\u0435\u0440\u0445.

    Source code in pages\\main_page.py
    def scroll_navigation_panel_up(self) -> None:\n    \"\"\"\u041f\u0440\u043e\u043a\u0440\u0443\u0447\u0438\u0432\u0430\u0435\u0442 \u043f\u0430\u043d\u0435\u043b\u044c \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438 \u0432\u0432\u0435\u0440\u0445.\"\"\"\n\n    self.navigation_panel.scroll_up(NavigationPanelLocators.PANEL_SCROLL_CONTAINER)\n
    "},{"location":"pages/main_page/#pages.main_page.MainPage.should_be_event_panel","title":"should_be_event_panel()","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u043f\u0430\u043d\u0435\u043b\u0438 \u0441\u043e\u0431\u044b\u0442\u0438\u0439.

    Source code in pages\\main_page.py
    def should_be_event_panel(self) -> None:\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u043f\u0430\u043d\u0435\u043b\u0438 \u0441\u043e\u0431\u044b\u0442\u0438\u0439.\"\"\"\n\n    ## to-do: \u043a\u043d\u043e\u043f\u043a\u0438 \u0433\u0430\u043b\u043e\u0447\u043a\u0438???\n    self.event_panel.should_be_tab_buttons()\n    self.event_panel.should_be_event_buttons()\n    self.event_panel.should_be_search_button()\n    self.event_panel.should_be_user_button()\n
    "},{"location":"pages/main_page/#pages.main_page.MainPage.should_be_navigation_panel","title":"should_be_navigation_panel()","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u043f\u0430\u043d\u0435\u043b\u0438 \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438.

    Source code in pages\\main_page.py
    def should_be_navigation_panel(self) -> None:\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u043f\u0430\u043d\u0435\u043b\u0438 \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438.\"\"\"\n\n    self.navigation_panel.check_visibility(\n        NavigationPanelLocators.PANEL_MAIN,\n        \"Navigation panel is missing\"\n    )\n
    "},{"location":"pages/service_status_tab/","title":"ServiceStatusTab","text":"

    \u041c\u043e\u0434\u0443\u043b\u044c \u0432\u043a\u043b\u0430\u0434\u043a\u0438 '\u0421\u0442\u0430\u0442\u0443\u0441 \u043e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u043d\u0438\u044f'.

    \u0421\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043a\u043b\u0430\u0441\u0441 ServiceStatusTab \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0442\u0430\u0431\u043b\u0438\u0446\u0435\u0439 \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432. \u041f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0442\u044c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0438 \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c \u0441 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u043c\u0438 \u0432\u043a\u043b\u0430\u0434\u043a\u0438.

    "},{"location":"pages/service_status_tab/#pages.service_status_tab.ServiceStatusTab","title":"ServiceStatusTab","text":"

    Bases: BasePage

    \u041a\u043b\u0430\u0441\u0441 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0432\u043a\u043b\u0430\u0434\u043a\u043e\u0439 '\u0421\u0442\u0430\u0442\u0443\u0441 \u043e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u043d\u0438\u044f'.

    \u041f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u043c\u0435\u0442\u043e\u0434\u044b \u0434\u043b\u044f \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0441 \u0442\u0430\u0431\u043b\u0438\u0446\u0435\u0439 \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432 \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0435\u0451 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f.

    Parameters:

    Name Type Description Default page Page

    \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.

    required Source code in pages\\service_status_tab.py
    class ServiceStatusTab(BasePage):\n    \"\"\"\u041a\u043b\u0430\u0441\u0441 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0432\u043a\u043b\u0430\u0434\u043a\u043e\u0439 '\u0421\u0442\u0430\u0442\u0443\u0441 \u043e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u043d\u0438\u044f'.\n\n    \u041f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u043c\u0435\u0442\u043e\u0434\u044b \u0434\u043b\u044f \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0441 \u0442\u0430\u0431\u043b\u0438\u0446\u0435\u0439 \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432 \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438\n    \u0435\u0451 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f.\n\n    Args:\n        page: \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.\n    \"\"\"\n\n    def __init__(self, page: Page) -> None:\n        \"\"\"\u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u044b \u0432\u043a\u043b\u0430\u0434\u043a\u0438 '\u0421\u0442\u0430\u0442\u0443\u0441 \u043e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u043d\u0438\u044f'.\"\"\"\n\n        super().__init__(page)\n\n        self.toolbar = ToolbarComponent(page, \"\u0421\u0442\u0430\u0442\u0443\u0441 \u043e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u043d\u0438\u044f\")\n        self.services_table = TableComponent(page)\n\n    def get_rows_count(self) -> int:\n        \"\"\"\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0441\u0442\u0440\u043e\u043a \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435 (\u0431\u0435\u0437 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430).\n\n        Returns:\n            int: \u041a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0441\u0442\u0440\u043e\u043a \u0441 \u0434\u0430\u043d\u043d\u044b\u043c\u0438.\n\n        Raises:\n            AssertionError: \u0415\u0441\u043b\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u043f\u0443\u0441\u0442\u0430.\n        \"\"\"\n\n        return self.services_table.get_rows_count(TableLocators.TABLE_WORK_AREA)\n\n    def scroll_services_table_up(self) -> None:\n        \"\"\"\u041f\u0440\u043e\u043a\u0440\u0443\u0447\u0438\u0432\u0430\u0435\u0442 \u0442\u0430\u0431\u043b\u0438\u0446\u0443 \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432 \u0432\u0432\u0435\u0440\u0445.\"\"\"\n\n        self.services_table.scroll_up(TableLocators.TABLE_SCROLL_CONTAINER)\n\n    def scroll_services_table_down(self) -> None:\n        \"\"\"\u041f\u0440\u043e\u043a\u0440\u0443\u0447\u0438\u0432\u0430\u0435\u0442 \u0442\u0430\u0431\u043b\u0438\u0446\u0443 \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432 \u0432\u043d\u0438\u0437.\"\"\"\n\n        self.services_table.scroll_down(TableLocators.TABLE_SCROLL_CONTAINER)\n\n    def check_services_table_content(self) -> None:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432.\n\n        \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0438 \u0438 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435.\n\n        Raises:\n            AssertionError: \u0415\u0441\u043b\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u043f\u0443\u0441\u0442\u0430 \u0438\u043b\u0438 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0438 \u043d\u0435\u0432\u0435\u0440\u043d\u044b.\n        \"\"\"\n\n        expected_headers = [\n            '\u041a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440',\n            '\u0412\u0440\u0435\u043c\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f',\n            '\u0421\u0442\u0430\u0442\u0443\u0441',\n            '\u0412\u0440\u0435\u043c\u044f \u0440\u0430\u0431\u043e\u0442\u044b',\n            'Image ID',\n            'Image \u0422\u042d\u0413'\n        ]\n\n        self.services_table.check_content(TableLocators.TABLE_WORK_AREA, expected_headers)\n\n    def check_services_table_verticall_scrolling(self) -> bool:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u0439 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u044b.\n\n        Returns:\n            bool: True \u0435\u0441\u043b\u0438 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0430 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u0430, \u0438\u043d\u0430\u0447\u0435 False.\n        \"\"\"\n\n        return self.services_table.is_scrollable_vertically(\n            TableLocators.TABLE_SCROLL_CONTAINER\n        )\n\n    def check_services_table_first_row_visibility(self) -> None:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u043f\u0435\u0440\u0432\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u044b.\n\n        Raises:\n            AssertionError: \u0415\u0441\u043b\u0438 \u0441\u0442\u0440\u043e\u043a\u0430 \u043d\u0435 \u0432\u0438\u0434\u043d\u0430.\n        \"\"\"\n\n        self.services_table.check_first_row_visibility(TableLocators.TABLE_WORK_AREA)\n\n    def check_services_table_last_row_visibility(self) -> None:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0439 \u0441\u0442\u0440\u043e\u043a\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u044b.\n\n        Raises:\n            AssertionError: \u0415\u0441\u043b\u0438 \u0441\u0442\u0440\u043e\u043a\u0430 \u043d\u0435 \u0432\u0438\u0434\u043d\u0430.\n        \"\"\"\n\n        self.services_table.check_last_row_visibility(TableLocators.TABLE_WORK_AREA)\n\n    def check_services_table_row_highlighting(self, row_index: int) -> None:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u044b.\n\n        Args:\n            row_index: \u0418\u043d\u0434\u0435\u043a\u0441 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438.\n\n        Raises:\n            AssertionError: \u0415\u0441\u043b\u0438 \u0441\u0442\u0440\u043e\u043a\u0430 \u043d\u0435 \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u0430.\n        \"\"\"\n\n        self.services_table.check_row_highlighting(\n            TableLocators.TABLE_WORK_AREA,\n            row_index\n        )\n\n    def should_be_toolbar(self) -> None:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0442\u0443\u043b\u0431\u0430\u0440\u0430 \u043d\u0430 \u0432\u043a\u043b\u0430\u0434\u043a\u0435.\n\n        Raises:\n            AssertionError: \u0415\u0441\u043b\u0438 \u0442\u0443\u043b\u0431\u0430\u0440 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442.\n        \"\"\"\n\n        self.toolbar.check_toolbar_presence(\"Toolbar is missing\")\n\n    def should_be_services_table(self) -> None:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432.\n\n        Raises:\n            AssertionError: \u0415\u0441\u043b\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442.\n        \"\"\"\n\n        self.services_table.check_visibility(\n            TableLocators.TABLE_WORK_AREA,\n            \"Service statuses table is missing\"\n        )\n
    "},{"location":"pages/service_status_tab/#pages.service_status_tab.ServiceStatusTab.__init__","title":"__init__(page)","text":"

    \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u044b \u0432\u043a\u043b\u0430\u0434\u043a\u0438 '\u0421\u0442\u0430\u0442\u0443\u0441 \u043e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u043d\u0438\u044f'.

    Source code in pages\\service_status_tab.py
    def __init__(self, page: Page) -> None:\n    \"\"\"\u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u044b \u0432\u043a\u043b\u0430\u0434\u043a\u0438 '\u0421\u0442\u0430\u0442\u0443\u0441 \u043e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u043d\u0438\u044f'.\"\"\"\n\n    super().__init__(page)\n\n    self.toolbar = ToolbarComponent(page, \"\u0421\u0442\u0430\u0442\u0443\u0441 \u043e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u043d\u0438\u044f\")\n    self.services_table = TableComponent(page)\n
    "},{"location":"pages/service_status_tab/#pages.service_status_tab.ServiceStatusTab.check_services_table_content","title":"check_services_table_content()","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432.

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0438 \u0438 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435.

    Raises:

    Type Description AssertionError

    \u0415\u0441\u043b\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u043f\u0443\u0441\u0442\u0430 \u0438\u043b\u0438 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0438 \u043d\u0435\u0432\u0435\u0440\u043d\u044b.

    Source code in pages\\service_status_tab.py
    def check_services_table_content(self) -> None:\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432.\n\n    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0438 \u0438 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435.\n\n    Raises:\n        AssertionError: \u0415\u0441\u043b\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u043f\u0443\u0441\u0442\u0430 \u0438\u043b\u0438 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0438 \u043d\u0435\u0432\u0435\u0440\u043d\u044b.\n    \"\"\"\n\n    expected_headers = [\n        '\u041a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440',\n        '\u0412\u0440\u0435\u043c\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f',\n        '\u0421\u0442\u0430\u0442\u0443\u0441',\n        '\u0412\u0440\u0435\u043c\u044f \u0440\u0430\u0431\u043e\u0442\u044b',\n        'Image ID',\n        'Image \u0422\u042d\u0413'\n    ]\n\n    self.services_table.check_content(TableLocators.TABLE_WORK_AREA, expected_headers)\n
    "},{"location":"pages/service_status_tab/#pages.service_status_tab.ServiceStatusTab.check_services_table_first_row_visibility","title":"check_services_table_first_row_visibility()","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u043f\u0435\u0440\u0432\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u044b.

    Raises:

    Type Description AssertionError

    \u0415\u0441\u043b\u0438 \u0441\u0442\u0440\u043e\u043a\u0430 \u043d\u0435 \u0432\u0438\u0434\u043d\u0430.

    Source code in pages\\service_status_tab.py
    def check_services_table_first_row_visibility(self) -> None:\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u043f\u0435\u0440\u0432\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u044b.\n\n    Raises:\n        AssertionError: \u0415\u0441\u043b\u0438 \u0441\u0442\u0440\u043e\u043a\u0430 \u043d\u0435 \u0432\u0438\u0434\u043d\u0430.\n    \"\"\"\n\n    self.services_table.check_first_row_visibility(TableLocators.TABLE_WORK_AREA)\n
    "},{"location":"pages/service_status_tab/#pages.service_status_tab.ServiceStatusTab.check_services_table_last_row_visibility","title":"check_services_table_last_row_visibility()","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0439 \u0441\u0442\u0440\u043e\u043a\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u044b.

    Raises:

    Type Description AssertionError

    \u0415\u0441\u043b\u0438 \u0441\u0442\u0440\u043e\u043a\u0430 \u043d\u0435 \u0432\u0438\u0434\u043d\u0430.

    Source code in pages\\service_status_tab.py
    def check_services_table_last_row_visibility(self) -> None:\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0439 \u0441\u0442\u0440\u043e\u043a\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u044b.\n\n    Raises:\n        AssertionError: \u0415\u0441\u043b\u0438 \u0441\u0442\u0440\u043e\u043a\u0430 \u043d\u0435 \u0432\u0438\u0434\u043d\u0430.\n    \"\"\"\n\n    self.services_table.check_last_row_visibility(TableLocators.TABLE_WORK_AREA)\n
    "},{"location":"pages/service_status_tab/#pages.service_status_tab.ServiceStatusTab.check_services_table_row_highlighting","title":"check_services_table_row_highlighting(row_index)","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u044b.

    Parameters:

    Name Type Description Default row_index int

    \u0418\u043d\u0434\u0435\u043a\u0441 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438.

    required

    Raises:

    Type Description AssertionError

    \u0415\u0441\u043b\u0438 \u0441\u0442\u0440\u043e\u043a\u0430 \u043d\u0435 \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u0430.

    Source code in pages\\service_status_tab.py
    def check_services_table_row_highlighting(self, row_index: int) -> None:\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u044b.\n\n    Args:\n        row_index: \u0418\u043d\u0434\u0435\u043a\u0441 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438.\n\n    Raises:\n        AssertionError: \u0415\u0441\u043b\u0438 \u0441\u0442\u0440\u043e\u043a\u0430 \u043d\u0435 \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u0430.\n    \"\"\"\n\n    self.services_table.check_row_highlighting(\n        TableLocators.TABLE_WORK_AREA,\n        row_index\n    )\n
    "},{"location":"pages/service_status_tab/#pages.service_status_tab.ServiceStatusTab.check_services_table_verticall_scrolling","title":"check_services_table_verticall_scrolling()","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u0439 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u044b.

    Returns:

    Name Type Description bool bool

    True \u0435\u0441\u043b\u0438 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0430 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u0430, \u0438\u043d\u0430\u0447\u0435 False.

    Source code in pages\\service_status_tab.py
    def check_services_table_verticall_scrolling(self) -> bool:\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u0439 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u044b.\n\n    Returns:\n        bool: True \u0435\u0441\u043b\u0438 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0430 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u0430, \u0438\u043d\u0430\u0447\u0435 False.\n    \"\"\"\n\n    return self.services_table.is_scrollable_vertically(\n        TableLocators.TABLE_SCROLL_CONTAINER\n    )\n
    "},{"location":"pages/service_status_tab/#pages.service_status_tab.ServiceStatusTab.get_rows_count","title":"get_rows_count()","text":"

    \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0441\u0442\u0440\u043e\u043a \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435 (\u0431\u0435\u0437 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430).

    Returns:

    Name Type Description int int

    \u041a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0441\u0442\u0440\u043e\u043a \u0441 \u0434\u0430\u043d\u043d\u044b\u043c\u0438.

    Raises:

    Type Description AssertionError

    \u0415\u0441\u043b\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u043f\u0443\u0441\u0442\u0430.

    Source code in pages\\service_status_tab.py
    def get_rows_count(self) -> int:\n    \"\"\"\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0441\u0442\u0440\u043e\u043a \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435 (\u0431\u0435\u0437 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430).\n\n    Returns:\n        int: \u041a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0441\u0442\u0440\u043e\u043a \u0441 \u0434\u0430\u043d\u043d\u044b\u043c\u0438.\n\n    Raises:\n        AssertionError: \u0415\u0441\u043b\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u043f\u0443\u0441\u0442\u0430.\n    \"\"\"\n\n    return self.services_table.get_rows_count(TableLocators.TABLE_WORK_AREA)\n
    "},{"location":"pages/service_status_tab/#pages.service_status_tab.ServiceStatusTab.scroll_services_table_down","title":"scroll_services_table_down()","text":"

    \u041f\u0440\u043e\u043a\u0440\u0443\u0447\u0438\u0432\u0430\u0435\u0442 \u0442\u0430\u0431\u043b\u0438\u0446\u0443 \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432 \u0432\u043d\u0438\u0437.

    Source code in pages\\service_status_tab.py
    def scroll_services_table_down(self) -> None:\n    \"\"\"\u041f\u0440\u043e\u043a\u0440\u0443\u0447\u0438\u0432\u0430\u0435\u0442 \u0442\u0430\u0431\u043b\u0438\u0446\u0443 \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432 \u0432\u043d\u0438\u0437.\"\"\"\n\n    self.services_table.scroll_down(TableLocators.TABLE_SCROLL_CONTAINER)\n
    "},{"location":"pages/service_status_tab/#pages.service_status_tab.ServiceStatusTab.scroll_services_table_up","title":"scroll_services_table_up()","text":"

    \u041f\u0440\u043e\u043a\u0440\u0443\u0447\u0438\u0432\u0430\u0435\u0442 \u0442\u0430\u0431\u043b\u0438\u0446\u0443 \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432 \u0432\u0432\u0435\u0440\u0445.

    Source code in pages\\service_status_tab.py
    def scroll_services_table_up(self) -> None:\n    \"\"\"\u041f\u0440\u043e\u043a\u0440\u0443\u0447\u0438\u0432\u0430\u0435\u0442 \u0442\u0430\u0431\u043b\u0438\u0446\u0443 \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432 \u0432\u0432\u0435\u0440\u0445.\"\"\"\n\n    self.services_table.scroll_up(TableLocators.TABLE_SCROLL_CONTAINER)\n
    "},{"location":"pages/service_status_tab/#pages.service_status_tab.ServiceStatusTab.should_be_services_table","title":"should_be_services_table()","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432.

    Raises:

    Type Description AssertionError

    \u0415\u0441\u043b\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442.

    Source code in pages\\service_status_tab.py
    def should_be_services_table(self) -> None:\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432.\n\n    Raises:\n        AssertionError: \u0415\u0441\u043b\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442.\n    \"\"\"\n\n    self.services_table.check_visibility(\n        TableLocators.TABLE_WORK_AREA,\n        \"Service statuses table is missing\"\n    )\n
    "},{"location":"pages/service_status_tab/#pages.service_status_tab.ServiceStatusTab.should_be_toolbar","title":"should_be_toolbar()","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0442\u0443\u043b\u0431\u0430\u0440\u0430 \u043d\u0430 \u0432\u043a\u043b\u0430\u0434\u043a\u0435.

    Raises:

    Type Description AssertionError

    \u0415\u0441\u043b\u0438 \u0442\u0443\u043b\u0431\u0430\u0440 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442.

    Source code in pages\\service_status_tab.py
    def should_be_toolbar(self) -> None:\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0442\u0443\u043b\u0431\u0430\u0440\u0430 \u043d\u0430 \u0432\u043a\u043b\u0430\u0434\u043a\u0435.\n\n    Raises:\n        AssertionError: \u0415\u0441\u043b\u0438 \u0442\u0443\u043b\u0431\u0430\u0440 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442.\n    \"\"\"\n\n    self.toolbar.check_toolbar_presence(\"Toolbar is missing\")\n
    "},{"location":"pages/session_tab/","title":"SessionTab","text":"

    \u041c\u043e\u0434\u0443\u043b\u044c \u0432\u043a\u043b\u0430\u0434\u043a\u0438 '\u0421\u0435\u0430\u043d\u0441'.

    \u0421\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043a\u043b\u0430\u0441\u0441 SessionsTab \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0442\u0430\u0431\u043b\u0438\u0446\u0435\u0439 \u0441\u0435\u0430\u043d\u0441\u043e\u0432. \u041f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0442\u044c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0438 \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c \u0441 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u043c\u0438 \u0432\u043a\u043b\u0430\u0434\u043a\u0438.

    "},{"location":"pages/session_tab/#pages.session_tab.SessionsTab","title":"SessionsTab","text":"

    Bases: BasePage

    \u041a\u043b\u0430\u0441\u0441 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0432\u043a\u043b\u0430\u0434\u043a\u043e\u0439 '\u0421\u0435\u0430\u043d\u0441'.

    \u041f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u043c\u0435\u0442\u043e\u0434\u044b \u0434\u043b\u044f \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0441 \u0442\u0430\u0431\u043b\u0438\u0446\u0435\u0439 \u0441\u0435\u0430\u043d\u0441\u043e\u0432 \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0435\u0451 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f.

    Parameters:

    Name Type Description Default page Page

    \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.

    required Source code in pages\\session_tab.py
    class SessionsTab(BasePage):\n    \"\"\"\u041a\u043b\u0430\u0441\u0441 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0432\u043a\u043b\u0430\u0434\u043a\u043e\u0439 '\u0421\u0435\u0430\u043d\u0441'.\n\n    \u041f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u043c\u0435\u0442\u043e\u0434\u044b \u0434\u043b\u044f \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0441 \u0442\u0430\u0431\u043b\u0438\u0446\u0435\u0439 \u0441\u0435\u0430\u043d\u0441\u043e\u0432 \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438\n    \u0435\u0451 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f.\n\n    Args:\n        page: \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.\n    \"\"\"\n\n    def __init__(self, page: Page) -> None:\n        \"\"\"\u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u044b \u0432\u043a\u043b\u0430\u0434\u043a\u0438 '\u0421\u0435\u0430\u043d\u0441'.\"\"\"\n\n        super().__init__(page)\n\n        self.toolbar = ToolbarComponent(page, \"\u0421\u0435\u0441\u0441\u0438\u044f\")\n        self.sessions_table = TableComponent(page)\n\n        self.delete_session_confirm = ConfirmComponent(page, \" \u041e\u0442\u043c\u0435\u043d\u0430 \", \" \u0423\u0434\u0430\u043b\u0438\u0442\u044c \")\n\n    # \u0414\u0435\u0439\u0441\u0442\u0432\u0438\u044f:\n    def get_rows_count(self) -> int:\n        \"\"\"\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0441\u0442\u0440\u043e\u043a \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435 (\u0431\u0435\u0437 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430).\n\n        Returns:\n            int: \u041a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0441\u0442\u0440\u043e\u043a \u0441 \u0434\u0430\u043d\u043d\u044b\u043c\u0438.\n\n        Raises:\n            AssertionError: \u0415\u0441\u043b\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u043f\u0443\u0441\u0442\u0430.\n        \"\"\"\n\n        return self.sessions_table.get_rows_count(TableLocators.TABLE_WORK_AREA)\n\n    def get_delete_session_button_from_row(self, row_index: int) -> TooltipButton:\n        \"\"\"\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043a\u043d\u043e\u043f\u043a\u0443 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u0441\u0435\u0430\u043d\u0441\u0430 \u0434\u043b\u044f \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438.\n\n        Args:\n            row_index: \u0418\u043d\u0434\u0435\u043a\u0441 \u0441\u0442\u0440\u043e\u043a\u0438 \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435.\n\n        Returns:\n            TooltipButton: \u041a\u043d\u043e\u043f\u043a\u0430 \u0441 \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u043e\u0439.\n\n        Raises:\n            AssertionError: \u0415\u0441\u043b\u0438 \u0441\u0442\u0440\u043e\u043a\u0430 \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u0430.\n        \"\"\"\n\n        row_locator = self.sessions_table.get_row_locator(\n            TableLocators.TABLE_WORK_AREA,\n            row_index\n        )\n        assert isinstance(row_locator, Locator), f\"Row with index {row_index} is missing\"\n\n        button_locator = row_locator.locator(ButtonLocators.BUTTON_DELETE_SESSION)\n        return TooltipButton(self.page, button_locator, \"delete_session_button\")\n\n    def get_session_token(self) -> str:\n        \"\"\"\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0442\u043e\u043a\u0435\u043d \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\n\n        Args:\n\n        Returns:\n            str: \u0422\u043e\u043a\u0435\u043d \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\n\n        Raises:\n        \"\"\"\n        return host.get_access_token()\n\n    def find_session_in_table(self, token: str) -> int:\n        \"\"\"\u0418\u0449\u0435\u0442 \u0441\u0435\u0430\u043d\u0441 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435 \u043f\u043e \u0432\u044b\u0434\u0430\u043d\u043d\u043e\u043c\u0443 \u0435\u043c\u0443 \u0442\u043e\u043a\u0435\u043d\u0443.\n\n        Args:\n            token (str): \u0422\u043e\u043a\u0435\u043d \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\n\n        Returns:\n            int: \u0418\u043d\u0434\u0435\u043a\u0441 \u0441\u0442\u0440\u043e\u043a\u0438 \u0438\u043b\u0438 -1 \u0435\u0441\u043b\u0438 \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\n\n        Raises:\n            AssertionError: \u0415\u0441\u043b\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u043f\u0443\u0441\u0442\u0430.\n        \"\"\"\n        table_content = self.sessions_table.read(TableLocators.TABLE_WORK_AREA)\n        if len(table_content) == 0:\n            assert False, \"The contents of the table are missing\"\n\n        del table_content[0]  # \u0423\u0434\u0430\u043b\u044f\u0435\u043c \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a\n\n        for row_index, session_info in enumerate(table_content):\n            if token in session_info:\n                return row_index\n        return -1\n\n    def delete_session_by_token(self, token: str) -> None:\n        \"\"\"\u0423\u0434\u0430\u043b\u044f\u0435\u0442 \u0441\u0435\u0430\u043d\u0441 \u043f\u043e \u0442\u043e\u043a\u0435\u043d\u0443.\n\n        Args:\n            token (str): \u0422\u043e\u043a\u0435\u043d \u0441\u0435\u0430\u043d\u0441 \u0434\u043b\u044f \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f\n\n        Raises:\n            AssertionError: \u0415\u0441\u043b\u0438 \u0441\u0435\u0430\u043d\u0441 \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d \u0438\u043b\u0438 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u043d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c.\n        \"\"\"\n        row_index = self.find_session_in_table(token)\n        if row_index == -1:\n            raise AssertionError(f\"Session with token {token} not found\")\n\n        self.delete_session_by_index(row_index)\n\n    def delete_session_by_index(self, row_index: int) -> None:\n        \"\"\"\u0423\u0434\u0430\u043b\u044f\u0435\u0442 \u0441\u0435\u0430\u043d\u0441 \u043f\u043e \u0438\u043d\u0434\u0435\u043a\u0441\u0443 \u0441\u0442\u0440\u043e\u043a\u0438.\n\n        Args:\n            row_index (int): \u0418\u043d\u0434\u0435\u043a\u0441 \u0441\u0442\u0440\u043e\u043a\u0438 \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435\n\n        Raises:\n            AssertionError: \u0415\u0441\u043b\u0438 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u043d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c.\n        \"\"\"\n        try:\n            # \u041d\u0430\u0445\u043e\u0434\u0438\u043c \u043a\u043d\u043e\u043f\u043a\u0443 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u0441\u0435\u0430\u043d\u0441\u0430 \u0438 \u043d\u0430\u0436\u0438\u043c\u0430\u0435\u043c \u043d\u0430 \u043d\u0435\u0435\n            delete_session_button = self.get_delete_session_button_from_row(row_index)\n            delete_session_button.click()\n            self.page.wait_for_timeout(1000)\n\n            # \u041f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0430\u0435\u043c \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0435\n            self.delete_session_confirm.click_allow_button()\n\n            # \u0416\u0434\u0435\u043c \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u044b\n            self.page.wait_for_timeout(1000)\n\n        except Exception as e:\n            raise AssertionError(f\"Failed to delete session at index {row_index}: {e}\")\n\n\n    def scroll_sessions_table_up(self) -> None:\n        \"\"\"\u041f\u0440\u043e\u043a\u0440\u0443\u0447\u0438\u0432\u0430\u0435\u0442 \u0442\u0430\u0431\u043b\u0438\u0446\u0443 \u0441\u0435\u0430\u043d\u0441\u043e\u0432 \u0432\u0432\u0435\u0440\u0445.\"\"\"\n\n        self.sessions_table.scroll_up(TableLocators.TABLE_SCROLL_CONTAINER)\n\n    def scroll_sessions_table_down(self) -> None:\n        \"\"\"\u041f\u0440\u043e\u043a\u0440\u0443\u0447\u0438\u0432\u0430\u0435\u0442 \u0442\u0430\u0431\u043b\u0438\u0446\u0443 \u0441\u0435\u0430\u043d\u0441\u043e\u0432 \u0432\u043d\u0438\u0437.\"\"\"\n\n        self.sessions_table.scroll_down(TableLocators.TABLE_SCROLL_CONTAINER)\n\n    # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0438:\n    def check_delete_session_confirm_window(self):\n        \"\"\" \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043a\u043e\u043d\u0442\u0435\u043d\u0442 \u0438 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0433\u043e\u0440\u0438\u0437\u043e\u043d\u0442\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0441\u043a\u0440\u043e\u043b\u043b\u0438\u043d\u0433\u0430 \u043e\u043a\u043d\u0430 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u044f \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u0441\u0435\u0430\u043d\u0441. \"\"\"\n\n        # \u041f\u043e\u0438\u0441\u043a \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435 \u0441\u0435\u0430\u043d\u0441 \u0441\u0440\u043e\u043a\u0438 \u0434\u043b\u044f \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\n        session_token = self.get_session_token()\n        row_index = self.find_session_in_table(session_token)\n        if row_index == -1:\n            assert False, \"Session for this token has not been found\"\n\n        # \u041d\u0430\u0439\u0442\u0438 \u043a\u043d\u043e\u043f\u043a\u0443 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u0441\u0435\u0430\u043d\u0441\u0430 \u0438 \u043d\u0430\u0436\u0430\u0442\u044c \u043d\u0430 \u043d\u0435\u0435\n        delete_session_button = self.get_delete_session_button_from_row(row_index)\n        delete_session_button.click()\n\n        # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043e\u0442\u043a\u0440\u044b\u0442\u0438\u044f \u043e\u043a\u043d\u0430 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u044f \u0441 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u043e\u043c \"\u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435\"\n        title = \"\u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435\"\n        self.delete_session_confirm.check_title(\n            title,\n            f\"Confirmation dialog window text '{title}' is missing\"\n        )\n\n        # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0442\u0435\u043a\u0441\u0442\u0430 \u0432 \u043e\u043a\u043d\u0435 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u044f\n        confirm_message = f\"\u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0441\u0435\u0441\u0441\u0438\u044e {session_token}?\"\n        self.delete_session_confirm.check_text(\n            confirm_message,\n            \"Confirmation dialog window text does not match what is expected\"\n        )\n\n        # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043d\u0430\u043b\u0438\u0447\u0438\u044f \u0438 \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u043a\u043d\u043e\u043f\u043a\u0438 \"\u041e\u0442\u043c\u0435\u043d\u0430\"\n        self.delete_session_confirm.should_be_cancel_button()\n\n        # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043d\u0430\u043b\u0438\u0447\u0438\u044f \u0438 \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u043a\u043d\u043e\u043f\u043a\u0438 \"\u0423\u0434\u0430\u043b\u0438\u0442\u044c\"\n        self.delete_session_confirm.should_be_allow_button()\n\n        # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0442\u0435\u043a\u0441\u0442\u0430 \u043d\u0430 \u043a\u043d\u043e\u043f\u043a\u0430\u0445\n        self.delete_session_confirm.check_cancel_button_text(\" \u041e\u0442\u043c\u0435\u043d\u0430 \")\n        self.delete_session_confirm.check_allow_button_text(\" \u0423\u0434\u0430\u043b\u0438\u0442\u044c \")\n\n        # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0433\u043e\u0440\u0438\u0437\u043e\u043d\u0442\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0441\u043a\u0440\u043e\u043b\u043b\u0438\u043d\u0433\u0430\n        is_scrollable_horizontally = self.delete_session_confirm.check_window_horizontal_scrolling()\n        assert is_scrollable_horizontally, \"Should be horizontal scrolling\"\n\n        self.delete_session_confirm.scroll_window_right()\n        self.page.wait_for_timeout(3000)\n        self.delete_session_confirm.scroll_window_left()\n        self.page.wait_for_timeout(2000)\n\n        # \u041d\u0430\u0436\u0430\u0442\u044c \u043a\u043d\u043e\u043f\u043a\u0443 \"\u041e\u0442\u043c\u0435\u043d\u0430\"\n        self.delete_session_confirm.click_cancel_button()\n\n    def check_sessions_table_content(self, verify: bool = False) -> None:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0441\u0435\u0430\u043d\u0441\u043e\u0432.\n\n        Args:\n            verify: \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0442\u044c \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438\u0437 \u0411\u0414. \u041f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e False.\n\n        Raises:\n            AssertionError: \u0415\u0441\u043b\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u043f\u0443\u0441\u0442\u0430 \u0438\u043b\u0438 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0438 \u043d\u0435\u0432\u0435\u0440\u043d\u044b.\n        \"\"\"\n\n        expected_headers = [\n            'ID \u0441\u0435\u0441\u0441\u0438\u0438',\n            'ID \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f',\n            '\u0412\u0440\u0435\u043c\u044f \u0436\u0438\u0437\u043d\u0438',\n            '\u0420\u043e\u043b\u044c',\n            '\u0410\u0434\u0440\u0435\u0441'\n        ]\n\n\n        table_content = self.sessions_table.read(TableLocators.TABLE_WORK_AREA)\n        len_table_content = len(table_content)\n\n        if len_table_content == 0:\n            assert False, \"The contents of the table are missing\"\n\n        actual_headers = table_content[0]\n\n        self.check_equals(\n            actual_headers,\n            expected_headers,\n            f\"Expected table headers {expected_headers} are not equal {actual_headers}\"\n        )\n\n        if len_table_content == 1:\n            assert False, \"Table body is missing\"\n\n        if verify:\n            self.verify_sessions_table_content(table_content)\n\n        for index in range(len_table_content - 1):\n            self.should_be_delete_button_on_sessions_table_row(index, \"\u0423\u0434\u0430\u043b\u0438\u0442\u044c\")\n\n    def check_sessions_table_verticall_scrolling(self) -> bool:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u0439 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u044b.\n\n        Returns:\n            bool: True \u0435\u0441\u043b\u0438 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0430 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u0430, \u0438\u043d\u0430\u0447\u0435 False.\n        \"\"\"\n\n        return self.sessions_table.is_scrollable_vertically(\n            TableLocators.TABLE_SCROLL_CONTAINER\n        )\n\n    def check_sessions_table_first_row_visibility(self) -> None:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u043f\u0435\u0440\u0432\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u044b.\n\n        Raises:\n            AssertionError: \u0415\u0441\u043b\u0438 \u0441\u0442\u0440\u043e\u043a\u0430 \u043d\u0435 \u0432\u0438\u0434\u043d\u0430.\n        \"\"\"\n\n        self.sessions_table.check_first_row_visibility(TableLocators.TABLE_WORK_AREA)\n\n    def check_sessions_table_last_row_visibility(self) -> None:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0439 \u0441\u0442\u0440\u043e\u043a\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u044b.\n\n        Raises:\n            AssertionError: \u0415\u0441\u043b\u0438 \u0441\u0442\u0440\u043e\u043a\u0430 \u043d\u0435 \u0432\u0438\u0434\u043d\u0430.\n        \"\"\"\n\n        self.sessions_table.check_last_row_visibility(TableLocators.TABLE_WORK_AREA)\n\n    def check_sessions_table_row_highlighting(self, row_index: int) -> None:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u044b.\n\n        Args:\n            row_index: \u0418\u043d\u0434\u0435\u043a\u0441 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438.\n\n        Raises:\n            AssertionError: \u0415\u0441\u043b\u0438 \u0441\u0442\u0440\u043e\u043a\u0430 \u043d\u0435 \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u0430.\n        \"\"\"\n\n        self.sessions_table.check_row_highlighting(\n            TableLocators.TABLE_WORK_AREA,\n            row_index\n        )\n\n    def should_be_toolbar(self) -> None:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0442\u0443\u043b\u0431\u0430\u0440\u0430 \u043d\u0430 \u0432\u043a\u043b\u0430\u0434\u043a\u0435.\n\n        Raises:\n            AssertionError: \u0415\u0441\u043b\u0438 \u0442\u0443\u043b\u0431\u0430\u0440 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442.\n        \"\"\"\n\n        self.toolbar.check_toolbar_presence(\"Toolbar is missing\")\n\n    def should_be_sessions_table(self) -> None:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0441\u0435\u0430\u043d\u0441\u043e\u0432.\n\n        Raises:\n            AssertionError: \u0415\u0441\u043b\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442.\n        \"\"\"\n\n        self.sessions_table.check_visibility(\n            TableLocators.TABLE_WORK_AREA,\n            \"Sessions table is missing\"\n        )\n\n    def should_be_delete_button_on_sessions_table_row(\n        self,\n        row_index: int,\n        tooltip: str\n    ) -> None:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u043a\u043d\u043e\u043f\u043a\u0438 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u0432 \u0441\u0442\u0440\u043e\u043a\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u044b.\n\n        Args:\n            row_index: \u0418\u043d\u0434\u0435\u043a\u0441 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438.\n            tooltip: \u041e\u0436\u0438\u0434\u0430\u0435\u043c\u044b\u0439 \u0442\u0435\u043a\u0441\u0442 \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0438.\n\n        Raises:\n            AssertionError: \u0415\u0441\u043b\u0438 \u043a\u043d\u043e\u043f\u043a\u0430 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u0438\u043b\u0438 \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0430 \u043d\u0435\u0432\u0435\u0440\u043d\u0430.\n        \"\"\"\n        delete_button = self.get_delete_session_button_from_row(row_index)\n\n        # \u041e\u0436\u0438\u0434\u0430\u0435\u043c \u0438\u0441\u0447\u0435\u0437\u043d\u043e\u0432\u0435\u043d\u0438\u044f \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0445 \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043e\u043a \u043f\u0435\u0440\u0435\u0434 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u043e\u0439\n        delete_button.wait_for_tooltip_to_disappear()\n\n        delete_button.check_visibility(\n            f\"Delete session button is missing on {row_index} row\"\n        )\n        delete_button.check_tooltip_with_text(tooltip)\n\n        # \u041e\u0436\u0438\u0434\u0430\u0435\u043c \u0438\u0441\u0447\u0435\u0437\u043d\u043e\u0432\u0435\u043d\u0438\u044f \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0438 \u043f\u043e\u0441\u043b\u0435 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438\n        delete_button.wait_for_tooltip_to_disappear()\n\n\n    def should_be_session_in_table(self, token: str) -> None:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0441\u0435\u0430\u043d\u0441\u0430 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435.\n\n        Args:\n            token (str): \u0422\u043e\u043a\u0435\u043d \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\n\n        Raises:\n            AssertionError: \u0415\u0441\u043b\u0438 \u0441\u0435\u0430\u043d\u0441 \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d.\n        \"\"\"\n        found = self.find_session_in_table(token)\n        if found == -1:\n            assert False, \"Session for this token has not been found\"\n\n    def should_not_be_session_in_table(self, token: str) -> None:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u0435 \u0441\u0435\u0430\u043d\u0441\u0430 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435.\n\n        Args:\n            token (str): \u0422\u043e\u043a\u0435\u043d \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\n\n        Raises:\n            AssertionError: \u0415\u0441\u043b\u0438 \u0441\u0435\u0430\u043d\u0441 \u043d\u0430\u0439\u0434\u0435\u043d.\n        \"\"\"\n        found = self.find_session_in_table(token)\n        if found != -1:\n            assert False, \"Session for this token has been found\"\n\n\n    def verify_sessions_table_content(self, sessions_table: list) -> None:\n        \"\"\"\u0421\u0432\u0435\u0440\u044f\u0435\u0442 \u0434\u0430\u043d\u043d\u044b\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0441 \u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u0438\u0437 \u0411\u0414.\n\n        Args:\n            sessions_table: \u0414\u0430\u043d\u043d\u044b\u0435 \u0438\u0437 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u043d\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435.\n\n        Raises:\n            AssertionError: \u0415\u0441\u043b\u0438 \u0434\u0430\u043d\u043d\u044b\u0435 \u043d\u0435 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0442.\n        \"\"\"\n\n        expected_sessions_list = []\n\n        # \u041e\u0442\u043f\u0440\u0430\u0432\u043a\u0430 \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u043a \u0431\u044d\u043a\u0435\u043d\u0434\u0443 \u0434\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u043e \u0441\u0435\u0430\u043d\u0441\u0430\u0445\n        response = self.send_get_api_request(\"e-nms/auth/sessions\")\n        response_body = self.get_response_body(response)\n\n        for item in response_body:\n            session_info = []\n            session_info.append(item[\"id\"])\n            session_info.append(item[\"userId\"])\n\n            # \u0412\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u043d\u0435\u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u043c\u043e\u0435 \u043f\u043e\u043b\u0435: \u0432\u0440\u0435\u043c\u044f \u0436\u0438\u0437\u043d\u0438 \u0441\u0435\u0430\u043d\u0441\u0430\n            session_info.append(\"\")\n\n            roles = []\n            for role in item[\"roles\"]:\n                if role in roles_dict.keys():\n                    roles.append(roles_dict[role])\n\n            session_info.append(\",\".join(roles))\n            session_info.append(item[\"ip\"])\n\n            expected_sessions_list.append(session_info)\n\n        del sessions_table[0]  # \u0423\u0434\u0430\u043b\u044f\u0435\u043c \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a\n\n        self.check_lists_equals(\n            sessions_table,\n            expected_sessions_list,\n            \"Actual sessions list is not equal expected users list on base db\"\n        )\n
    "},{"location":"pages/session_tab/#pages.session_tab.SessionsTab.__init__","title":"__init__(page)","text":"

    \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u044b \u0432\u043a\u043b\u0430\u0434\u043a\u0438 '\u0421\u0435\u0430\u043d\u0441'.

    Source code in pages\\session_tab.py
    def __init__(self, page: Page) -> None:\n    \"\"\"\u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u044b \u0432\u043a\u043b\u0430\u0434\u043a\u0438 '\u0421\u0435\u0430\u043d\u0441'.\"\"\"\n\n    super().__init__(page)\n\n    self.toolbar = ToolbarComponent(page, \"\u0421\u0435\u0441\u0441\u0438\u044f\")\n    self.sessions_table = TableComponent(page)\n\n    self.delete_session_confirm = ConfirmComponent(page, \" \u041e\u0442\u043c\u0435\u043d\u0430 \", \" \u0423\u0434\u0430\u043b\u0438\u0442\u044c \")\n
    "},{"location":"pages/session_tab/#pages.session_tab.SessionsTab.check_delete_session_confirm_window","title":"check_delete_session_confirm_window()","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043a\u043e\u043d\u0442\u0435\u043d\u0442 \u0438 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0433\u043e\u0440\u0438\u0437\u043e\u043d\u0442\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0441\u043a\u0440\u043e\u043b\u043b\u0438\u043d\u0433\u0430 \u043e\u043a\u043d\u0430 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u044f \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u0441\u0435\u0430\u043d\u0441.

    Source code in pages\\session_tab.py
    def check_delete_session_confirm_window(self):\n    \"\"\" \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043a\u043e\u043d\u0442\u0435\u043d\u0442 \u0438 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0433\u043e\u0440\u0438\u0437\u043e\u043d\u0442\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0441\u043a\u0440\u043e\u043b\u043b\u0438\u043d\u0433\u0430 \u043e\u043a\u043d\u0430 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u044f \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u0441\u0435\u0430\u043d\u0441. \"\"\"\n\n    # \u041f\u043e\u0438\u0441\u043a \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435 \u0441\u0435\u0430\u043d\u0441 \u0441\u0440\u043e\u043a\u0438 \u0434\u043b\u044f \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\n    session_token = self.get_session_token()\n    row_index = self.find_session_in_table(session_token)\n    if row_index == -1:\n        assert False, \"Session for this token has not been found\"\n\n    # \u041d\u0430\u0439\u0442\u0438 \u043a\u043d\u043e\u043f\u043a\u0443 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u0441\u0435\u0430\u043d\u0441\u0430 \u0438 \u043d\u0430\u0436\u0430\u0442\u044c \u043d\u0430 \u043d\u0435\u0435\n    delete_session_button = self.get_delete_session_button_from_row(row_index)\n    delete_session_button.click()\n\n    # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043e\u0442\u043a\u0440\u044b\u0442\u0438\u044f \u043e\u043a\u043d\u0430 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u044f \u0441 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u043e\u043c \"\u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435\"\n    title = \"\u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435\"\n    self.delete_session_confirm.check_title(\n        title,\n        f\"Confirmation dialog window text '{title}' is missing\"\n    )\n\n    # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0442\u0435\u043a\u0441\u0442\u0430 \u0432 \u043e\u043a\u043d\u0435 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u044f\n    confirm_message = f\"\u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0441\u0435\u0441\u0441\u0438\u044e {session_token}?\"\n    self.delete_session_confirm.check_text(\n        confirm_message,\n        \"Confirmation dialog window text does not match what is expected\"\n    )\n\n    # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043d\u0430\u043b\u0438\u0447\u0438\u044f \u0438 \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u043a\u043d\u043e\u043f\u043a\u0438 \"\u041e\u0442\u043c\u0435\u043d\u0430\"\n    self.delete_session_confirm.should_be_cancel_button()\n\n    # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043d\u0430\u043b\u0438\u0447\u0438\u044f \u0438 \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u043a\u043d\u043e\u043f\u043a\u0438 \"\u0423\u0434\u0430\u043b\u0438\u0442\u044c\"\n    self.delete_session_confirm.should_be_allow_button()\n\n    # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0442\u0435\u043a\u0441\u0442\u0430 \u043d\u0430 \u043a\u043d\u043e\u043f\u043a\u0430\u0445\n    self.delete_session_confirm.check_cancel_button_text(\" \u041e\u0442\u043c\u0435\u043d\u0430 \")\n    self.delete_session_confirm.check_allow_button_text(\" \u0423\u0434\u0430\u043b\u0438\u0442\u044c \")\n\n    # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0433\u043e\u0440\u0438\u0437\u043e\u043d\u0442\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0441\u043a\u0440\u043e\u043b\u043b\u0438\u043d\u0433\u0430\n    is_scrollable_horizontally = self.delete_session_confirm.check_window_horizontal_scrolling()\n    assert is_scrollable_horizontally, \"Should be horizontal scrolling\"\n\n    self.delete_session_confirm.scroll_window_right()\n    self.page.wait_for_timeout(3000)\n    self.delete_session_confirm.scroll_window_left()\n    self.page.wait_for_timeout(2000)\n\n    # \u041d\u0430\u0436\u0430\u0442\u044c \u043a\u043d\u043e\u043f\u043a\u0443 \"\u041e\u0442\u043c\u0435\u043d\u0430\"\n    self.delete_session_confirm.click_cancel_button()\n
    "},{"location":"pages/session_tab/#pages.session_tab.SessionsTab.check_sessions_table_content","title":"check_sessions_table_content(verify=False)","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0441\u0435\u0430\u043d\u0441\u043e\u0432.

    Parameters:

    Name Type Description Default verify bool

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0442\u044c \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438\u0437 \u0411\u0414. \u041f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e False.

    False

    Raises:

    Type Description AssertionError

    \u0415\u0441\u043b\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u043f\u0443\u0441\u0442\u0430 \u0438\u043b\u0438 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0438 \u043d\u0435\u0432\u0435\u0440\u043d\u044b.

    Source code in pages\\session_tab.py
    def check_sessions_table_content(self, verify: bool = False) -> None:\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0441\u0435\u0430\u043d\u0441\u043e\u0432.\n\n    Args:\n        verify: \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0442\u044c \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438\u0437 \u0411\u0414. \u041f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e False.\n\n    Raises:\n        AssertionError: \u0415\u0441\u043b\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u043f\u0443\u0441\u0442\u0430 \u0438\u043b\u0438 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0438 \u043d\u0435\u0432\u0435\u0440\u043d\u044b.\n    \"\"\"\n\n    expected_headers = [\n        'ID \u0441\u0435\u0441\u0441\u0438\u0438',\n        'ID \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f',\n        '\u0412\u0440\u0435\u043c\u044f \u0436\u0438\u0437\u043d\u0438',\n        '\u0420\u043e\u043b\u044c',\n        '\u0410\u0434\u0440\u0435\u0441'\n    ]\n\n\n    table_content = self.sessions_table.read(TableLocators.TABLE_WORK_AREA)\n    len_table_content = len(table_content)\n\n    if len_table_content == 0:\n        assert False, \"The contents of the table are missing\"\n\n    actual_headers = table_content[0]\n\n    self.check_equals(\n        actual_headers,\n        expected_headers,\n        f\"Expected table headers {expected_headers} are not equal {actual_headers}\"\n    )\n\n    if len_table_content == 1:\n        assert False, \"Table body is missing\"\n\n    if verify:\n        self.verify_sessions_table_content(table_content)\n\n    for index in range(len_table_content - 1):\n        self.should_be_delete_button_on_sessions_table_row(index, \"\u0423\u0434\u0430\u043b\u0438\u0442\u044c\")\n
    "},{"location":"pages/session_tab/#pages.session_tab.SessionsTab.check_sessions_table_first_row_visibility","title":"check_sessions_table_first_row_visibility()","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u043f\u0435\u0440\u0432\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u044b.

    Raises:

    Type Description AssertionError

    \u0415\u0441\u043b\u0438 \u0441\u0442\u0440\u043e\u043a\u0430 \u043d\u0435 \u0432\u0438\u0434\u043d\u0430.

    Source code in pages\\session_tab.py
    def check_sessions_table_first_row_visibility(self) -> None:\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u043f\u0435\u0440\u0432\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u044b.\n\n    Raises:\n        AssertionError: \u0415\u0441\u043b\u0438 \u0441\u0442\u0440\u043e\u043a\u0430 \u043d\u0435 \u0432\u0438\u0434\u043d\u0430.\n    \"\"\"\n\n    self.sessions_table.check_first_row_visibility(TableLocators.TABLE_WORK_AREA)\n
    "},{"location":"pages/session_tab/#pages.session_tab.SessionsTab.check_sessions_table_last_row_visibility","title":"check_sessions_table_last_row_visibility()","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0439 \u0441\u0442\u0440\u043e\u043a\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u044b.

    Raises:

    Type Description AssertionError

    \u0415\u0441\u043b\u0438 \u0441\u0442\u0440\u043e\u043a\u0430 \u043d\u0435 \u0432\u0438\u0434\u043d\u0430.

    Source code in pages\\session_tab.py
    def check_sessions_table_last_row_visibility(self) -> None:\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0439 \u0441\u0442\u0440\u043e\u043a\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u044b.\n\n    Raises:\n        AssertionError: \u0415\u0441\u043b\u0438 \u0441\u0442\u0440\u043e\u043a\u0430 \u043d\u0435 \u0432\u0438\u0434\u043d\u0430.\n    \"\"\"\n\n    self.sessions_table.check_last_row_visibility(TableLocators.TABLE_WORK_AREA)\n
    "},{"location":"pages/session_tab/#pages.session_tab.SessionsTab.check_sessions_table_row_highlighting","title":"check_sessions_table_row_highlighting(row_index)","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u044b.

    Parameters:

    Name Type Description Default row_index int

    \u0418\u043d\u0434\u0435\u043a\u0441 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438.

    required

    Raises:

    Type Description AssertionError

    \u0415\u0441\u043b\u0438 \u0441\u0442\u0440\u043e\u043a\u0430 \u043d\u0435 \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u0430.

    Source code in pages\\session_tab.py
    def check_sessions_table_row_highlighting(self, row_index: int) -> None:\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u044b.\n\n    Args:\n        row_index: \u0418\u043d\u0434\u0435\u043a\u0441 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438.\n\n    Raises:\n        AssertionError: \u0415\u0441\u043b\u0438 \u0441\u0442\u0440\u043e\u043a\u0430 \u043d\u0435 \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u0430.\n    \"\"\"\n\n    self.sessions_table.check_row_highlighting(\n        TableLocators.TABLE_WORK_AREA,\n        row_index\n    )\n
    "},{"location":"pages/session_tab/#pages.session_tab.SessionsTab.check_sessions_table_verticall_scrolling","title":"check_sessions_table_verticall_scrolling()","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u0439 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u044b.

    Returns:

    Name Type Description bool bool

    True \u0435\u0441\u043b\u0438 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0430 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u0430, \u0438\u043d\u0430\u0447\u0435 False.

    Source code in pages\\session_tab.py
    def check_sessions_table_verticall_scrolling(self) -> bool:\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u0439 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u044b.\n\n    Returns:\n        bool: True \u0435\u0441\u043b\u0438 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0430 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u0430, \u0438\u043d\u0430\u0447\u0435 False.\n    \"\"\"\n\n    return self.sessions_table.is_scrollable_vertically(\n        TableLocators.TABLE_SCROLL_CONTAINER\n    )\n
    "},{"location":"pages/session_tab/#pages.session_tab.SessionsTab.delete_session_by_index","title":"delete_session_by_index(row_index)","text":"

    \u0423\u0434\u0430\u043b\u044f\u0435\u0442 \u0441\u0435\u0430\u043d\u0441 \u043f\u043e \u0438\u043d\u0434\u0435\u043a\u0441\u0443 \u0441\u0442\u0440\u043e\u043a\u0438.

    Parameters:

    Name Type Description Default row_index int

    \u0418\u043d\u0434\u0435\u043a\u0441 \u0441\u0442\u0440\u043e\u043a\u0438 \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435

    required

    Raises:

    Type Description AssertionError

    \u0415\u0441\u043b\u0438 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u043d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c.

    Source code in pages\\session_tab.py
    def delete_session_by_index(self, row_index: int) -> None:\n    \"\"\"\u0423\u0434\u0430\u043b\u044f\u0435\u0442 \u0441\u0435\u0430\u043d\u0441 \u043f\u043e \u0438\u043d\u0434\u0435\u043a\u0441\u0443 \u0441\u0442\u0440\u043e\u043a\u0438.\n\n    Args:\n        row_index (int): \u0418\u043d\u0434\u0435\u043a\u0441 \u0441\u0442\u0440\u043e\u043a\u0438 \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435\n\n    Raises:\n        AssertionError: \u0415\u0441\u043b\u0438 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u043d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c.\n    \"\"\"\n    try:\n        # \u041d\u0430\u0445\u043e\u0434\u0438\u043c \u043a\u043d\u043e\u043f\u043a\u0443 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u0441\u0435\u0430\u043d\u0441\u0430 \u0438 \u043d\u0430\u0436\u0438\u043c\u0430\u0435\u043c \u043d\u0430 \u043d\u0435\u0435\n        delete_session_button = self.get_delete_session_button_from_row(row_index)\n        delete_session_button.click()\n        self.page.wait_for_timeout(1000)\n\n        # \u041f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0430\u0435\u043c \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0435\n        self.delete_session_confirm.click_allow_button()\n\n        # \u0416\u0434\u0435\u043c \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u044b\n        self.page.wait_for_timeout(1000)\n\n    except Exception as e:\n        raise AssertionError(f\"Failed to delete session at index {row_index}: {e}\")\n
    "},{"location":"pages/session_tab/#pages.session_tab.SessionsTab.delete_session_by_token","title":"delete_session_by_token(token)","text":"

    \u0423\u0434\u0430\u043b\u044f\u0435\u0442 \u0441\u0435\u0430\u043d\u0441 \u043f\u043e \u0442\u043e\u043a\u0435\u043d\u0443.

    Parameters:

    Name Type Description Default token str

    \u0422\u043e\u043a\u0435\u043d \u0441\u0435\u0430\u043d\u0441 \u0434\u043b\u044f \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f

    required

    Raises:

    Type Description AssertionError

    \u0415\u0441\u043b\u0438 \u0441\u0435\u0430\u043d\u0441 \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d \u0438\u043b\u0438 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u043d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c.

    Source code in pages\\session_tab.py
    def delete_session_by_token(self, token: str) -> None:\n    \"\"\"\u0423\u0434\u0430\u043b\u044f\u0435\u0442 \u0441\u0435\u0430\u043d\u0441 \u043f\u043e \u0442\u043e\u043a\u0435\u043d\u0443.\n\n    Args:\n        token (str): \u0422\u043e\u043a\u0435\u043d \u0441\u0435\u0430\u043d\u0441 \u0434\u043b\u044f \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f\n\n    Raises:\n        AssertionError: \u0415\u0441\u043b\u0438 \u0441\u0435\u0430\u043d\u0441 \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d \u0438\u043b\u0438 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u043d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c.\n    \"\"\"\n    row_index = self.find_session_in_table(token)\n    if row_index == -1:\n        raise AssertionError(f\"Session with token {token} not found\")\n\n    self.delete_session_by_index(row_index)\n
    "},{"location":"pages/session_tab/#pages.session_tab.SessionsTab.find_session_in_table","title":"find_session_in_table(token)","text":"

    \u0418\u0449\u0435\u0442 \u0441\u0435\u0430\u043d\u0441 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435 \u043f\u043e \u0432\u044b\u0434\u0430\u043d\u043d\u043e\u043c\u0443 \u0435\u043c\u0443 \u0442\u043e\u043a\u0435\u043d\u0443.

    Parameters:

    Name Type Description Default token str

    \u0422\u043e\u043a\u0435\u043d \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f

    required

    Returns:

    Name Type Description int int

    \u0418\u043d\u0434\u0435\u043a\u0441 \u0441\u0442\u0440\u043e\u043a\u0438 \u0438\u043b\u0438 -1 \u0435\u0441\u043b\u0438 \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d

    Raises:

    Type Description AssertionError

    \u0415\u0441\u043b\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u043f\u0443\u0441\u0442\u0430.

    Source code in pages\\session_tab.py
    def find_session_in_table(self, token: str) -> int:\n    \"\"\"\u0418\u0449\u0435\u0442 \u0441\u0435\u0430\u043d\u0441 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435 \u043f\u043e \u0432\u044b\u0434\u0430\u043d\u043d\u043e\u043c\u0443 \u0435\u043c\u0443 \u0442\u043e\u043a\u0435\u043d\u0443.\n\n    Args:\n        token (str): \u0422\u043e\u043a\u0435\u043d \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\n\n    Returns:\n        int: \u0418\u043d\u0434\u0435\u043a\u0441 \u0441\u0442\u0440\u043e\u043a\u0438 \u0438\u043b\u0438 -1 \u0435\u0441\u043b\u0438 \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\n\n    Raises:\n        AssertionError: \u0415\u0441\u043b\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u043f\u0443\u0441\u0442\u0430.\n    \"\"\"\n    table_content = self.sessions_table.read(TableLocators.TABLE_WORK_AREA)\n    if len(table_content) == 0:\n        assert False, \"The contents of the table are missing\"\n\n    del table_content[0]  # \u0423\u0434\u0430\u043b\u044f\u0435\u043c \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a\n\n    for row_index, session_info in enumerate(table_content):\n        if token in session_info:\n            return row_index\n    return -1\n
    "},{"location":"pages/session_tab/#pages.session_tab.SessionsTab.get_delete_session_button_from_row","title":"get_delete_session_button_from_row(row_index)","text":"

    \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043a\u043d\u043e\u043f\u043a\u0443 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u0441\u0435\u0430\u043d\u0441\u0430 \u0434\u043b\u044f \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438.

    Parameters:

    Name Type Description Default row_index int

    \u0418\u043d\u0434\u0435\u043a\u0441 \u0441\u0442\u0440\u043e\u043a\u0438 \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435.

    required

    Returns:

    Name Type Description TooltipButton TooltipButton

    \u041a\u043d\u043e\u043f\u043a\u0430 \u0441 \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u043e\u0439.

    Raises:

    Type Description AssertionError

    \u0415\u0441\u043b\u0438 \u0441\u0442\u0440\u043e\u043a\u0430 \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u0430.

    Source code in pages\\session_tab.py
    def get_delete_session_button_from_row(self, row_index: int) -> TooltipButton:\n    \"\"\"\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043a\u043d\u043e\u043f\u043a\u0443 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u0441\u0435\u0430\u043d\u0441\u0430 \u0434\u043b\u044f \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438.\n\n    Args:\n        row_index: \u0418\u043d\u0434\u0435\u043a\u0441 \u0441\u0442\u0440\u043e\u043a\u0438 \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435.\n\n    Returns:\n        TooltipButton: \u041a\u043d\u043e\u043f\u043a\u0430 \u0441 \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u043e\u0439.\n\n    Raises:\n        AssertionError: \u0415\u0441\u043b\u0438 \u0441\u0442\u0440\u043e\u043a\u0430 \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u0430.\n    \"\"\"\n\n    row_locator = self.sessions_table.get_row_locator(\n        TableLocators.TABLE_WORK_AREA,\n        row_index\n    )\n    assert isinstance(row_locator, Locator), f\"Row with index {row_index} is missing\"\n\n    button_locator = row_locator.locator(ButtonLocators.BUTTON_DELETE_SESSION)\n    return TooltipButton(self.page, button_locator, \"delete_session_button\")\n
    "},{"location":"pages/session_tab/#pages.session_tab.SessionsTab.get_rows_count","title":"get_rows_count()","text":"

    \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0441\u0442\u0440\u043e\u043a \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435 (\u0431\u0435\u0437 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430).

    Returns:

    Name Type Description int int

    \u041a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0441\u0442\u0440\u043e\u043a \u0441 \u0434\u0430\u043d\u043d\u044b\u043c\u0438.

    Raises:

    Type Description AssertionError

    \u0415\u0441\u043b\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u043f\u0443\u0441\u0442\u0430.

    Source code in pages\\session_tab.py
    def get_rows_count(self) -> int:\n    \"\"\"\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0441\u0442\u0440\u043e\u043a \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435 (\u0431\u0435\u0437 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430).\n\n    Returns:\n        int: \u041a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0441\u0442\u0440\u043e\u043a \u0441 \u0434\u0430\u043d\u043d\u044b\u043c\u0438.\n\n    Raises:\n        AssertionError: \u0415\u0441\u043b\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u043f\u0443\u0441\u0442\u0430.\n    \"\"\"\n\n    return self.sessions_table.get_rows_count(TableLocators.TABLE_WORK_AREA)\n
    "},{"location":"pages/session_tab/#pages.session_tab.SessionsTab.get_session_token","title":"get_session_token()","text":"

    \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0442\u043e\u043a\u0435\u043d \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.

    Args:

    Returns:

    Name Type Description str str

    \u0422\u043e\u043a\u0435\u043d \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f

    Raises:

    Source code in pages\\session_tab.py
    def get_session_token(self) -> str:\n    \"\"\"\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0442\u043e\u043a\u0435\u043d \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\n\n    Args:\n\n    Returns:\n        str: \u0422\u043e\u043a\u0435\u043d \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\n\n    Raises:\n    \"\"\"\n    return host.get_access_token()\n
    "},{"location":"pages/session_tab/#pages.session_tab.SessionsTab.scroll_sessions_table_down","title":"scroll_sessions_table_down()","text":"

    \u041f\u0440\u043e\u043a\u0440\u0443\u0447\u0438\u0432\u0430\u0435\u0442 \u0442\u0430\u0431\u043b\u0438\u0446\u0443 \u0441\u0435\u0430\u043d\u0441\u043e\u0432 \u0432\u043d\u0438\u0437.

    Source code in pages\\session_tab.py
    def scroll_sessions_table_down(self) -> None:\n    \"\"\"\u041f\u0440\u043e\u043a\u0440\u0443\u0447\u0438\u0432\u0430\u0435\u0442 \u0442\u0430\u0431\u043b\u0438\u0446\u0443 \u0441\u0435\u0430\u043d\u0441\u043e\u0432 \u0432\u043d\u0438\u0437.\"\"\"\n\n    self.sessions_table.scroll_down(TableLocators.TABLE_SCROLL_CONTAINER)\n
    "},{"location":"pages/session_tab/#pages.session_tab.SessionsTab.scroll_sessions_table_up","title":"scroll_sessions_table_up()","text":"

    \u041f\u0440\u043e\u043a\u0440\u0443\u0447\u0438\u0432\u0430\u0435\u0442 \u0442\u0430\u0431\u043b\u0438\u0446\u0443 \u0441\u0435\u0430\u043d\u0441\u043e\u0432 \u0432\u0432\u0435\u0440\u0445.

    Source code in pages\\session_tab.py
    def scroll_sessions_table_up(self) -> None:\n    \"\"\"\u041f\u0440\u043e\u043a\u0440\u0443\u0447\u0438\u0432\u0430\u0435\u0442 \u0442\u0430\u0431\u043b\u0438\u0446\u0443 \u0441\u0435\u0430\u043d\u0441\u043e\u0432 \u0432\u0432\u0435\u0440\u0445.\"\"\"\n\n    self.sessions_table.scroll_up(TableLocators.TABLE_SCROLL_CONTAINER)\n
    "},{"location":"pages/session_tab/#pages.session_tab.SessionsTab.should_be_delete_button_on_sessions_table_row","title":"should_be_delete_button_on_sessions_table_row(row_index, tooltip)","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u043a\u043d\u043e\u043f\u043a\u0438 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u0432 \u0441\u0442\u0440\u043e\u043a\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u044b.

    Parameters:

    Name Type Description Default row_index int

    \u0418\u043d\u0434\u0435\u043a\u0441 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438.

    required tooltip str

    \u041e\u0436\u0438\u0434\u0430\u0435\u043c\u044b\u0439 \u0442\u0435\u043a\u0441\u0442 \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0438.

    required

    Raises:

    Type Description AssertionError

    \u0415\u0441\u043b\u0438 \u043a\u043d\u043e\u043f\u043a\u0430 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u0438\u043b\u0438 \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0430 \u043d\u0435\u0432\u0435\u0440\u043d\u0430.

    Source code in pages\\session_tab.py
    def should_be_delete_button_on_sessions_table_row(\n    self,\n    row_index: int,\n    tooltip: str\n) -> None:\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u043a\u043d\u043e\u043f\u043a\u0438 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u0432 \u0441\u0442\u0440\u043e\u043a\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u044b.\n\n    Args:\n        row_index: \u0418\u043d\u0434\u0435\u043a\u0441 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438.\n        tooltip: \u041e\u0436\u0438\u0434\u0430\u0435\u043c\u044b\u0439 \u0442\u0435\u043a\u0441\u0442 \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0438.\n\n    Raises:\n        AssertionError: \u0415\u0441\u043b\u0438 \u043a\u043d\u043e\u043f\u043a\u0430 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u0438\u043b\u0438 \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0430 \u043d\u0435\u0432\u0435\u0440\u043d\u0430.\n    \"\"\"\n    delete_button = self.get_delete_session_button_from_row(row_index)\n\n    # \u041e\u0436\u0438\u0434\u0430\u0435\u043c \u0438\u0441\u0447\u0435\u0437\u043d\u043e\u0432\u0435\u043d\u0438\u044f \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0445 \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043e\u043a \u043f\u0435\u0440\u0435\u0434 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u043e\u0439\n    delete_button.wait_for_tooltip_to_disappear()\n\n    delete_button.check_visibility(\n        f\"Delete session button is missing on {row_index} row\"\n    )\n    delete_button.check_tooltip_with_text(tooltip)\n\n    # \u041e\u0436\u0438\u0434\u0430\u0435\u043c \u0438\u0441\u0447\u0435\u0437\u043d\u043e\u0432\u0435\u043d\u0438\u044f \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0438 \u043f\u043e\u0441\u043b\u0435 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438\n    delete_button.wait_for_tooltip_to_disappear()\n
    "},{"location":"pages/session_tab/#pages.session_tab.SessionsTab.should_be_session_in_table","title":"should_be_session_in_table(token)","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0441\u0435\u0430\u043d\u0441\u0430 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435.

    Parameters:

    Name Type Description Default token str

    \u0422\u043e\u043a\u0435\u043d \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f

    required

    Raises:

    Type Description AssertionError

    \u0415\u0441\u043b\u0438 \u0441\u0435\u0430\u043d\u0441 \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d.

    Source code in pages\\session_tab.py
    def should_be_session_in_table(self, token: str) -> None:\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0441\u0435\u0430\u043d\u0441\u0430 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435.\n\n    Args:\n        token (str): \u0422\u043e\u043a\u0435\u043d \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\n\n    Raises:\n        AssertionError: \u0415\u0441\u043b\u0438 \u0441\u0435\u0430\u043d\u0441 \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d.\n    \"\"\"\n    found = self.find_session_in_table(token)\n    if found == -1:\n        assert False, \"Session for this token has not been found\"\n
    "},{"location":"pages/session_tab/#pages.session_tab.SessionsTab.should_be_sessions_table","title":"should_be_sessions_table()","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0441\u0435\u0430\u043d\u0441\u043e\u0432.

    Raises:

    Type Description AssertionError

    \u0415\u0441\u043b\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442.

    Source code in pages\\session_tab.py
    def should_be_sessions_table(self) -> None:\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0441\u0435\u0430\u043d\u0441\u043e\u0432.\n\n    Raises:\n        AssertionError: \u0415\u0441\u043b\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442.\n    \"\"\"\n\n    self.sessions_table.check_visibility(\n        TableLocators.TABLE_WORK_AREA,\n        \"Sessions table is missing\"\n    )\n
    "},{"location":"pages/session_tab/#pages.session_tab.SessionsTab.should_be_toolbar","title":"should_be_toolbar()","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0442\u0443\u043b\u0431\u0430\u0440\u0430 \u043d\u0430 \u0432\u043a\u043b\u0430\u0434\u043a\u0435.

    Raises:

    Type Description AssertionError

    \u0415\u0441\u043b\u0438 \u0442\u0443\u043b\u0431\u0430\u0440 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442.

    Source code in pages\\session_tab.py
    def should_be_toolbar(self) -> None:\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0442\u0443\u043b\u0431\u0430\u0440\u0430 \u043d\u0430 \u0432\u043a\u043b\u0430\u0434\u043a\u0435.\n\n    Raises:\n        AssertionError: \u0415\u0441\u043b\u0438 \u0442\u0443\u043b\u0431\u0430\u0440 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442.\n    \"\"\"\n\n    self.toolbar.check_toolbar_presence(\"Toolbar is missing\")\n
    "},{"location":"pages/session_tab/#pages.session_tab.SessionsTab.should_not_be_session_in_table","title":"should_not_be_session_in_table(token)","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u0435 \u0441\u0435\u0430\u043d\u0441\u0430 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435.

    Parameters:

    Name Type Description Default token str

    \u0422\u043e\u043a\u0435\u043d \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f

    required

    Raises:

    Type Description AssertionError

    \u0415\u0441\u043b\u0438 \u0441\u0435\u0430\u043d\u0441 \u043d\u0430\u0439\u0434\u0435\u043d.

    Source code in pages\\session_tab.py
    def should_not_be_session_in_table(self, token: str) -> None:\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u0435 \u0441\u0435\u0430\u043d\u0441\u0430 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435.\n\n    Args:\n        token (str): \u0422\u043e\u043a\u0435\u043d \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\n\n    Raises:\n        AssertionError: \u0415\u0441\u043b\u0438 \u0441\u0435\u0430\u043d\u0441 \u043d\u0430\u0439\u0434\u0435\u043d.\n    \"\"\"\n    found = self.find_session_in_table(token)\n    if found != -1:\n        assert False, \"Session for this token has been found\"\n
    "},{"location":"pages/session_tab/#pages.session_tab.SessionsTab.verify_sessions_table_content","title":"verify_sessions_table_content(sessions_table)","text":"

    \u0421\u0432\u0435\u0440\u044f\u0435\u0442 \u0434\u0430\u043d\u043d\u044b\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0441 \u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u0438\u0437 \u0411\u0414.

    Parameters:

    Name Type Description Default sessions_table list

    \u0414\u0430\u043d\u043d\u044b\u0435 \u0438\u0437 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u043d\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435.

    required

    Raises:

    Type Description AssertionError

    \u0415\u0441\u043b\u0438 \u0434\u0430\u043d\u043d\u044b\u0435 \u043d\u0435 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0442.

    Source code in pages\\session_tab.py
    def verify_sessions_table_content(self, sessions_table: list) -> None:\n    \"\"\"\u0421\u0432\u0435\u0440\u044f\u0435\u0442 \u0434\u0430\u043d\u043d\u044b\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0441 \u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u0438\u0437 \u0411\u0414.\n\n    Args:\n        sessions_table: \u0414\u0430\u043d\u043d\u044b\u0435 \u0438\u0437 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u043d\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435.\n\n    Raises:\n        AssertionError: \u0415\u0441\u043b\u0438 \u0434\u0430\u043d\u043d\u044b\u0435 \u043d\u0435 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0442.\n    \"\"\"\n\n    expected_sessions_list = []\n\n    # \u041e\u0442\u043f\u0440\u0430\u0432\u043a\u0430 \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u043a \u0431\u044d\u043a\u0435\u043d\u0434\u0443 \u0434\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u043e \u0441\u0435\u0430\u043d\u0441\u0430\u0445\n    response = self.send_get_api_request(\"e-nms/auth/sessions\")\n    response_body = self.get_response_body(response)\n\n    for item in response_body:\n        session_info = []\n        session_info.append(item[\"id\"])\n        session_info.append(item[\"userId\"])\n\n        # \u0412\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u043d\u0435\u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u043c\u043e\u0435 \u043f\u043e\u043b\u0435: \u0432\u0440\u0435\u043c\u044f \u0436\u0438\u0437\u043d\u0438 \u0441\u0435\u0430\u043d\u0441\u0430\n        session_info.append(\"\")\n\n        roles = []\n        for role in item[\"roles\"]:\n            if role in roles_dict.keys():\n                roles.append(roles_dict[role])\n\n        session_info.append(\",\".join(roles))\n        session_info.append(item[\"ip\"])\n\n        expected_sessions_list.append(session_info)\n\n    del sessions_table[0]  # \u0423\u0434\u0430\u043b\u044f\u0435\u043c \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a\n\n    self.check_lists_equals(\n        sessions_table,\n        expected_sessions_list,\n        \"Actual sessions list is not equal expected users list on base db\"\n    )\n
    "},{"location":"pages/templates_tab/","title":"TemplatesTab","text":"

    \u041c\u043e\u0434\u0443\u043b\u044c \u0432\u043a\u043b\u0430\u0434\u043a\u0438 '\u0428\u0430\u0431\u043b\u043e\u043d\u044b'.

    \u0421\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043a\u043b\u0430\u0441\u0441 TemplatesTab \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0442\u0430\u0431\u043b\u0438\u0446\u0435\u0439 \u0448\u0430\u0431\u043b\u043e\u043d\u043e\u0432. \u041f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0442\u044c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0438 \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c \u0441 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u043c\u0438 \u0432\u043a\u043b\u0430\u0434\u043a\u0438.

    "},{"location":"pages/templates_tab/#pages.templates_tab.TemplatesTab","title":"TemplatesTab","text":"

    Bases: BasePage

    \u041a\u043b\u0430\u0441\u0441 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0432\u043a\u043b\u0430\u0434\u043a\u043e\u0439 '\u0428\u0430\u0431\u043b\u043e\u043d\u044b'.

    \u041f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u043c\u0435\u0442\u043e\u0434\u044b \u0434\u043b\u044f \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0441 \u0442\u0430\u0431\u043b\u0438\u0446\u0435\u0439 \u0448\u0430\u0431\u043b\u043e\u043d\u043e\u0432 \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0435\u0451 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f.

    Parameters:

    Name Type Description Default page Page

    \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.

    required Source code in pages\\templates_tab.py
    class TemplatesTab(BasePage):\n    \"\"\"\u041a\u043b\u0430\u0441\u0441 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0432\u043a\u043b\u0430\u0434\u043a\u043e\u0439 '\u0428\u0430\u0431\u043b\u043e\u043d\u044b'.\n\n    \u041f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u043c\u0435\u0442\u043e\u0434\u044b \u0434\u043b\u044f \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0441 \u0442\u0430\u0431\u043b\u0438\u0446\u0435\u0439 \u0448\u0430\u0431\u043b\u043e\u043d\u043e\u0432 \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438\n    \u0435\u0451 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f.\n\n    Args:\n        page: \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.\n    \"\"\"\n\n    def __init__(self, page: Page) -> None:\n        \"\"\"\u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u044b \u0432\u043a\u043b\u0430\u0434\u043a\u0438 '\u0428\u0430\u0431\u043b\u043e\u043d\u044b'.\"\"\"\n\n        super().__init__(page)\n\n        self.toolbar = ToolbarComponent(page, \"\u0428\u0430\u0431\u043b\u043e\u043d\u044b\")\n\n        self.templates_table = TableComponent(page)\n        self.modal_windows = {}\n\n        self.json_container = JsonContainerComponent(page)\n        self.alert = AlertComponent(page)\n\n    def add_modal_window(self, title: str) -> None:\n        \"\"\"\u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043a\u043d\u043e \u0432 \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u044e.\n\n        Args:\n            title: \u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a \u043e\u043a\u043d\u0430.\n        \"\"\"\n\n        self.modal_windows[title] = ViewTemplateModalWindow(self.page, title)\n\n    def get_modal_window(self, title: str) -> ViewTemplateModalWindow:\n        \"\"\"\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043a\u043d\u043e \u043f\u043e \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0443.\n\n        Args:\n            title: \u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a \u043e\u043a\u043d\u0430.\n\n        Returns:\n            ViewTemplateModalWindow: \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430.\n\n        Raises:\n            AssertionError: \u0415\u0441\u043b\u0438 \u043e\u043a\u043d\u043e \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u043e.\n        \"\"\"\n\n        modal_window = self.modal_windows.get(title)\n\n        if modal_window is None:\n            assert False, f\"Modal window with title '{title}' not found\"\n        return modal_window\n\n    def delete_modal_window(self, title: str) -> None:\n        \"\"\"\u0423\u0434\u0430\u043b\u044f\u0435\u0442 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043a\u043d\u043e \u0438\u0437 \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u0438.\n\n        Args:\n            title: \u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a \u043e\u043a\u043d\u0430.\n\n        Raises:\n            AssertionError: \u0415\u0441\u043b\u0438 \u043e\u043a\u043d\u043e \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u043e.\n        \"\"\"\n\n        if self.modal_windows.get(title) is None:\n            assert False, f\"Modal window with title '{title}' not found\"\n        self.modal_windows[title] = None\n\n    def open_template_modal(self, row_index: int = 0) -> str:\n        \"\"\"\u041e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043a\u043d\u043e \u0448\u0430\u0431\u043b\u043e\u043d\u0430 \u043f\u043e \u043a\u043b\u0438\u043a\u0443 \u043d\u0430 \u0441\u0442\u0440\u043e\u043a\u0443 \u0442\u0430\u0431\u043b\u0438\u0446\u044b.\n\n        Args:\n            row_index: \u0418\u043d\u0434\u0435\u043a\u0441 \u0441\u0442\u0440\u043e\u043a\u0438 \u0434\u043b\u044f \u043a\u043b\u0438\u043a\u0430 (\u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e 0 - \u043f\u0435\u0440\u0432\u0430\u044f \u0441\u0442\u0440\u043e\u043a\u0430).\n\n        Returns:\n            str: \u0418\u043c\u044f \u0448\u0430\u0431\u043b\u043e\u043d\u0430.\n        \"\"\"\n        row_locator = self.templates_table.get_row_locator(\n            TableLocators.TABLE_WORK_AREA,\n            row_index\n        )\n        row_locator.click()\n\n        # \u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0438\u043c\u044f \u0448\u0430\u0431\u043b\u043e\u043d\u0430 \u0438\u0437 \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438\n        table_content = self.templates_table.read(TableLocators.TABLE_WORK_AREA)\n        # +1 \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043f\u0435\u0440\u0432\u0430\u044f \u0441\u0442\u0440\u043e\u043a\u0430 - \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0438\n        template_name = table_content[row_index + 1][0]\n\n        # \u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043a\u043d\u043e \u0432 \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u044e \u043f\u043e\u0441\u043b\u0435 \u043e\u0442\u043a\u0440\u044b\u0442\u0438\u044f\n        self.add_modal_window(template_name)\n\n        return template_name\n\n    def close_modal_window_by_toolbar_button(self, title: str) -> None:\n        \"\"\"\u0417\u0430\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043a\u043d\u043e \u0447\u0435\u0440\u0435\u0437 \u043a\u043d\u043e\u043f\u043a\u0443 \u0432 \u0442\u0443\u043b\u0431\u0430\u0440\u0435.\n\n        Args:\n            title: \u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a \u043e\u043a\u043d\u0430.\n        \"\"\"\n\n        modal_window = self.get_modal_window(title)\n        modal_window.click_toolbar_close_button()\n        self.delete_modal_window(title)\n\n    def get_rows_count(self) -> int:\n        \"\"\"\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0441\u0442\u0440\u043e\u043a \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435 (\u0431\u0435\u0437 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430).\n\n        Returns:\n            int: \u041a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0441\u0442\u0440\u043e\u043a \u0441 \u0434\u0430\u043d\u043d\u044b\u043c\u0438.\n\n        Raises:\n            AssertionError: \u0415\u0441\u043b\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u043f\u0443\u0441\u0442\u0430.\n        \"\"\"\n\n        return self.templates_table.get_rows_count(TableLocators.TABLE_WORK_AREA)\n\n    def scroll_templates_table_up(self) -> None:\n        \"\"\"\u041f\u0440\u043e\u043a\u0440\u0443\u0447\u0438\u0432\u0430\u0435\u0442 \u0442\u0430\u0431\u043b\u0438\u0446\u0443 \u0448\u0430\u0431\u043b\u043e\u043d\u043e\u0432 \u0432\u0432\u0435\u0440\u0445.\"\"\"\n\n        self.templates_table.scroll_up(TableLocators.TABLE_SCROLL_CONTAINER)\n\n    def scroll_templates_table_down(self) -> None:\n        \"\"\"\u041f\u0440\u043e\u043a\u0440\u0443\u0447\u0438\u0432\u0430\u0435\u0442 \u0442\u0430\u0431\u043b\u0438\u0446\u0443 \u0448\u0430\u0431\u043b\u043e\u043d\u043e\u0432 \u0432\u043d\u0438\u0437.\"\"\"\n\n        self.templates_table.scroll_down(TableLocators.TABLE_SCROLL_CONTAINER)\n\n    def scroll_modal_up(self) -> None:\n        \"\"\"\u041f\u0440\u043e\u043a\u0440\u0443\u0447\u0438\u0432\u0430\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430 \u0432\u0432\u0435\u0440\u0445.\"\"\"\n        self.templates_table.scroll_up(\n            ModalWindowLocators.MODAL_WINDOW_SCROLL_CONTAINER\n        )\n\n    def scroll_modal_down(self) -> None:\n        \"\"\"\u041f\u0440\u043e\u043a\u0440\u0443\u0447\u0438\u0432\u0430\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430 \u0432\u043d\u0438\u0437.\"\"\"\n        self.templates_table.scroll_down(\n            ModalWindowLocators.MODAL_WINDOW_SCROLL_CONTAINER\n        )\n\n    def extract_specific_template(self, template_name: str, response_data: dict) -> dict:\n        \"\"\"\u0418\u0437\u0432\u043b\u0435\u043a\u0430\u0435\u0442 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0433\u043e \u0448\u0430\u0431\u043b\u043e\u043d\u0430 \u043f\u043e template_name \u0438\u0437 \u0434\u0430\u043d\u043d\u044b\u0445 API.\n\n        Args:\n            template_name: \u0418\u043c\u044f \u0448\u0430\u0431\u043b\u043e\u043d\u0430 \u0434\u043b\u044f \u0438\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u044f.\n            response_data: \u0414\u0430\u043d\u043d\u044b\u0435 \u043e\u0442\u0432\u0435\u0442\u0430 \u043e\u0442 API.\n\n        Returns:\n            dict: \u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0433\u043e \u0448\u0430\u0431\u043b\u043e\u043d\u0430.\n\n        Raises:\n            AssertionError: \u0415\u0441\u043b\u0438 \u0448\u0430\u0431\u043b\u043e\u043d \u0441 \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u044b\u043c \u0438\u043c\u0435\u043d\u0435\u043c \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\n                \u0438\u043b\u0438 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u043e\u0442\u0432\u0435\u0442\u0430 \u043d\u0435\u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u0430.\n        \"\"\"\n        # \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c, \u0447\u0442\u043e \u043e\u0442\u0432\u0435\u0442 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0441\u043f\u0438\u0441\u043a\u043e\u043c \u0448\u0430\u0431\u043b\u043e\u043d\u043e\u0432\n        assert isinstance(response_data, list), \"API response is not a list of templates\"\n\n        # \u0418\u0449\u0435\u043c \u0448\u0430\u0431\u043b\u043e\u043d \u0441 \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u044b\u043c \u0438\u043c\u0435\u043d\u0435\u043c\n        for template in response_data:\n            if template.get('id') == template_name:\n                logger.info(\"Found template: %s\", template_name)\n                return template\n\n        # \u0415\u0441\u043b\u0438 \u0448\u0430\u0431\u043b\u043e\u043d \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\n        available_templates = [t.get('id', 'Unknown') for t in response_data]\n\n        # \u0413\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u043c \u043f\u043e\u043d\u044f\u0442\u043d\u043e\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u043e\u0431 \u043e\u0448\u0438\u0431\u043a\u0435\n        error_msg = (\n            f\"Template '{template_name}' not found. \"\n            f\"Available templates: {available_templates}\"\n        )\n        logger.error(error_msg)\n        assert False, error_msg\n\n    def save_template_data_to_file(self, template_data: dict, filename: str = None) -> str:\n        \"\"\"\u0418\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442 \u043e\u0442\u043b\u0430\u0434\u043a\u0438. \u0421\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u0442 \u0434\u0430\u043d\u043d\u044b\u0435 \u0448\u0430\u0431\u043b\u043e\u043d\u0430 \u0432 JSON \u0444\u0430\u0439\u043b \u0432 \u0442\u0435\u043a\u0443\u0449\u0435\u0439 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438.\n\n        Args:\n            template_data: \u0414\u0430\u043d\u043d\u044b\u0435 \u0448\u0430\u0431\u043b\u043e\u043d\u0430 \u0434\u043b\u044f \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f.\n            filename: \u0418\u043c\u044f \u0444\u0430\u0439\u043b\u0430 (\u0435\u0441\u043b\u0438 None, \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438).\n\n        Returns:\n            str: \u041f\u0443\u0442\u044c \u043a \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u043d\u043e\u043c\u0443 \u0444\u0430\u0439\u043b\u0443.\n        \"\"\"\n        # \u0413\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u043c \u0438\u043c\u044f \u0444\u0430\u0439\u043b\u0430 \u0435\u0441\u043b\u0438 \u043d\u0435 \u0443\u043a\u0430\u0437\u0430\u043d\u043e\n        if filename is None:\n            template_name = template_data.get('id', 'unknown_template')\n            filename = f\"{template_name}_data.json\"\n\n        # \u0421\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u043c \u0444\u0430\u0439\u043b \u0432 \u0442\u0435\u043a\u0443\u0449\u0435\u0439 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438\n        file_path = Path(filename)\n\n        # \u0421\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u043c \u0434\u0430\u043d\u043d\u044b\u0435 \u0432 \u0444\u0430\u0439\u043b \u0441 \u0444\u043e\u0440\u043c\u0430\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435\u043c\n        with open(file_path, 'w', encoding='utf-8') as file:\n            json.dump(template_data, file, ensure_ascii=False, indent=2)\n\n        logger.info(\"Template data saved to: %s\", file_path)\n        return str(file_path)\n\n    def check_templates_modal_content(self, template_name: str) -> None:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0438 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0441\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430 \u0448\u0430\u0431\u043b\u043e\u043d\u0430.\n\n        Args:\n            template_name: \u0418\u043c\u044f \u0448\u0430\u0431\u043b\u043e\u043d\u0430 \u0434\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430 \u043e\u043a\u043d\u0430.\n\n        Raises:\n            AssertionError: \u0415\u0441\u043b\u0438 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u043e\u043a\u043d\u0430 \u043d\u0435\u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u044b.\n        \"\"\"\n        modal_window = self.get_modal_window(template_name)\n        modal_window.check_content()\n\n    def check_templates_table_content(self) -> None:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0448\u0430\u0431\u043b\u043e\u043d\u043e\u0432.\n\n        \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0438 \u0438 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435.\n\n        Raises:\n            AssertionError: \u0415\u0441\u043b\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u043f\u0443\u0441\u0442\u0430 \u0438\u043b\u0438 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0438 \u043d\u0435\u0432\u0435\u0440\u043d\u044b.\n        \"\"\"\n\n        expected_headers = [\n            '\u0418\u043c\u044f',\n            '\u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435',\n            '\u0422\u0438\u043f \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430',\n            '\u041f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c'\n        ]\n\n        self.templates_table.check_content(TableLocators.TABLE_WORK_AREA, expected_headers)\n\n    def check_templates_table_verticall_scrolling(self) -> bool:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u0439 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u044b.\n\n        Returns:\n            bool: True \u0435\u0441\u043b\u0438 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0430 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u0430, \u0438\u043d\u0430\u0447\u0435 False.\n        \"\"\"\n\n        return self.templates_table.is_scrollable_vertically(\n            TableLocators.TABLE_SCROLL_CONTAINER\n        )\n\n    def check_templates_table_first_row_visibility(self) -> None:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u043f\u0435\u0440\u0432\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u044b.\n\n        Raises:\n            AssertionError: \u0415\u0441\u043b\u0438 \u0441\u0442\u0440\u043e\u043a\u0430 \u043d\u0435 \u0432\u0438\u0434\u043d\u0430.\n        \"\"\"\n\n        self.templates_table.check_first_row_visibility(TableLocators.TABLE_WORK_AREA)\n\n    def check_templates_table_last_row_visibility(self) -> None:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0439 \u0441\u0442\u0440\u043e\u043a\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u044b.\n\n        Raises:\n            AssertionError: \u0415\u0441\u043b\u0438 \u0441\u0442\u0440\u043e\u043a\u0430 \u043d\u0435 \u0432\u0438\u0434\u043d\u0430.\n        \"\"\"\n\n        self.templates_table.check_last_row_visibility(TableLocators.TABLE_WORK_AREA)\n\n    def check_templates_table_row_highlighting(self, row_index: int) -> None:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u044b.\n\n        Args:\n            row_index: \u0418\u043d\u0434\u0435\u043a\u0441 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438.\n\n        Raises:\n            AssertionError: \u0415\u0441\u043b\u0438 \u0441\u0442\u0440\u043e\u043a\u0430 \u043d\u0435 \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u0430.\n        \"\"\"\n\n        self.templates_table.check_row_highlighting(\n            TableLocators.TABLE_WORK_AREA,\n            row_index\n        )\n\n    def should_be_toolbar(self) -> None:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0442\u0443\u043b\u0431\u0430\u0440\u0430 \u043d\u0430 \u0432\u043a\u043b\u0430\u0434\u043a\u0435.\n\n        Raises:\n            AssertionError: \u0415\u0441\u043b\u0438 \u0442\u0443\u043b\u0431\u0430\u0440 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442.\n        \"\"\"\n\n        self.toolbar.check_toolbar_presence(\"Toolbar is missing\")\n\n    def should_be_templates_table(self) -> None:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0448\u0430\u0431\u043b\u043e\u043d\u043e\u0432.\n\n        Raises:\n            AssertionError: \u0415\u0441\u043b\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442.\n        \"\"\"\n\n        self.templates_table.check_visibility(\n            TableLocators.TABLE_WORK_AREA,\n            \"Templates table is missing\"\n        )\n\n    def should_be_modal_window(self) -> None:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430.\n\n        Raises:\n            AssertionError: \u0415\u0441\u043b\u0438 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043a\u043d\u043e \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442.\n        \"\"\"\n        self.templates_table.check_visibility(\n            ModalWindowLocators.MODAL_WINDOW,\n            \"Modal window is not visible\"\n        )\n\n    def should_not_be_modal_window(self) -> None:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442, \u0447\u0442\u043e \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043a\u043d\u043e \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442.\n\n        Raises:\n            AssertionError: \u0415\u0441\u043b\u0438 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043a\u043d\u043e \u0432\u0441\u0435 \u0435\u0449\u0435 \u0432\u0438\u0434\u043d\u043e.\n        \"\"\"\n        is_visible = self.page.locator(\n            ModalWindowLocators.MODAL_WINDOW\n        ).is_visible(timeout=1000)\n        if is_visible:\n            assert False, \"Modal window should not be visible\"\n\n    def check_modal_vertical_scrolling(self) -> bool:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0441\u043a\u0440\u043e\u043b\u043b\u0438\u043d\u0433\u0430 \u0432 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u043c \u043e\u043a\u043d\u0435.\n\n        Returns:\n            bool: True \u0435\u0441\u043b\u0438 \u0441\u043a\u0440\u043e\u043b\u043b\u0438\u043d\u0433 \u0432\u043e\u0437\u043c\u043e\u0436\u0435\u043d, \u0438\u043d\u0430\u0447\u0435 False.\n        \"\"\"\n        return self.templates_table.is_scrollable_vertically(\n            ModalWindowLocators.MODAL_WINDOW_SCROLL_CONTAINER\n        )\n\n    def verify_json_container_content(self, template_name: str, save_to_file: bool = False) -> None:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430 \u0434\u0430\u043d\u043d\u044b\u043c \u0438\u0437 API.\n\n        Args:\n            template_name: \u0418\u043c\u044f \u0448\u0430\u0431\u043b\u043e\u043d\u0430 \u0434\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438.\n            save_to_file: \u0424\u043b\u0430\u0433 \u0434\u043b\u044f \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 \u0444\u0430\u0439\u043b.\n        \"\"\"\n\n        # \u0427\u0438\u0442\u0430\u0435\u043c \u0434\u0430\u043d\u043d\u044b\u0435 \u0438\u0437 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430\n        actual_data = self.json_container.read_data(JsonContainerLocators.CONTAINER)\n\n        # \u041e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u043c \u0437\u0430\u043f\u0440\u043e\u0441 \u043a backend \u0434\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u043e \u0448\u0430\u0431\u043b\u043e\u043d\u0435\n        response = self.send_get_api_request(\"e-cmdb/api/device/template\")\n        response_body = self.get_response_body(response)\n\n        # \u0418\u0437\u0432\u043b\u0435\u043a\u0430\u0435\u043c \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0439 \u0448\u0430\u0431\u043b\u043e\u043d \u043f\u043e \u0438\u043c\u0435\u043d\u0438 \u0438\u0437 \u043e\u0442\u0432\u0435\u0442\u0430 API\n        template_data = self.extract_specific_template(template_name, response_body)\n\n        # \u0421\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u043c \u0434\u0430\u043d\u043d\u044b\u0435 \u0432 \u0444\u0430\u0439\u043b \u0435\u0441\u043b\u0438 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f\n        if save_to_file:\n            file_path = self.save_template_data_to_file(template_data)\n            logger.info(\"Template data saved to: %s\", file_path)\n\n        # \u0421\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u0435\u043c actual_data \u0441 \u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0433\u043e \u0448\u0430\u0431\u043b\u043e\u043d\u0430\n        self.json_container.check_json_equals(\n            actual_data,\n            template_data,\n            \"Expected json content is not equal actual:\"\n        )\n
    "},{"location":"pages/templates_tab/#pages.templates_tab.TemplatesTab.__init__","title":"__init__(page)","text":"

    \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u044b \u0432\u043a\u043b\u0430\u0434\u043a\u0438 '\u0428\u0430\u0431\u043b\u043e\u043d\u044b'.

    Source code in pages\\templates_tab.py
    def __init__(self, page: Page) -> None:\n    \"\"\"\u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u044b \u0432\u043a\u043b\u0430\u0434\u043a\u0438 '\u0428\u0430\u0431\u043b\u043e\u043d\u044b'.\"\"\"\n\n    super().__init__(page)\n\n    self.toolbar = ToolbarComponent(page, \"\u0428\u0430\u0431\u043b\u043e\u043d\u044b\")\n\n    self.templates_table = TableComponent(page)\n    self.modal_windows = {}\n\n    self.json_container = JsonContainerComponent(page)\n    self.alert = AlertComponent(page)\n
    "},{"location":"pages/templates_tab/#pages.templates_tab.TemplatesTab.add_modal_window","title":"add_modal_window(title)","text":"

    \u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043a\u043d\u043e \u0432 \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u044e.

    Parameters:

    Name Type Description Default title str

    \u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a \u043e\u043a\u043d\u0430.

    required Source code in pages\\templates_tab.py
    def add_modal_window(self, title: str) -> None:\n    \"\"\"\u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043a\u043d\u043e \u0432 \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u044e.\n\n    Args:\n        title: \u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a \u043e\u043a\u043d\u0430.\n    \"\"\"\n\n    self.modal_windows[title] = ViewTemplateModalWindow(self.page, title)\n
    "},{"location":"pages/templates_tab/#pages.templates_tab.TemplatesTab.check_modal_vertical_scrolling","title":"check_modal_vertical_scrolling()","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0441\u043a\u0440\u043e\u043b\u043b\u0438\u043d\u0433\u0430 \u0432 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u043c \u043e\u043a\u043d\u0435.

    Returns:

    Name Type Description bool bool

    True \u0435\u0441\u043b\u0438 \u0441\u043a\u0440\u043e\u043b\u043b\u0438\u043d\u0433 \u0432\u043e\u0437\u043c\u043e\u0436\u0435\u043d, \u0438\u043d\u0430\u0447\u0435 False.

    Source code in pages\\templates_tab.py
    def check_modal_vertical_scrolling(self) -> bool:\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0441\u043a\u0440\u043e\u043b\u043b\u0438\u043d\u0433\u0430 \u0432 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u043c \u043e\u043a\u043d\u0435.\n\n    Returns:\n        bool: True \u0435\u0441\u043b\u0438 \u0441\u043a\u0440\u043e\u043b\u043b\u0438\u043d\u0433 \u0432\u043e\u0437\u043c\u043e\u0436\u0435\u043d, \u0438\u043d\u0430\u0447\u0435 False.\n    \"\"\"\n    return self.templates_table.is_scrollable_vertically(\n        ModalWindowLocators.MODAL_WINDOW_SCROLL_CONTAINER\n    )\n
    "},{"location":"pages/templates_tab/#pages.templates_tab.TemplatesTab.check_templates_modal_content","title":"check_templates_modal_content(template_name)","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0438 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0441\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430 \u0448\u0430\u0431\u043b\u043e\u043d\u0430.

    Parameters:

    Name Type Description Default template_name str

    \u0418\u043c\u044f \u0448\u0430\u0431\u043b\u043e\u043d\u0430 \u0434\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430 \u043e\u043a\u043d\u0430.

    required

    Raises:

    Type Description AssertionError

    \u0415\u0441\u043b\u0438 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u043e\u043a\u043d\u0430 \u043d\u0435\u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u044b.

    Source code in pages\\templates_tab.py
    def check_templates_modal_content(self, template_name: str) -> None:\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0438 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0441\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430 \u0448\u0430\u0431\u043b\u043e\u043d\u0430.\n\n    Args:\n        template_name: \u0418\u043c\u044f \u0448\u0430\u0431\u043b\u043e\u043d\u0430 \u0434\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430 \u043e\u043a\u043d\u0430.\n\n    Raises:\n        AssertionError: \u0415\u0441\u043b\u0438 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u043e\u043a\u043d\u0430 \u043d\u0435\u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u044b.\n    \"\"\"\n    modal_window = self.get_modal_window(template_name)\n    modal_window.check_content()\n
    "},{"location":"pages/templates_tab/#pages.templates_tab.TemplatesTab.check_templates_table_content","title":"check_templates_table_content()","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0448\u0430\u0431\u043b\u043e\u043d\u043e\u0432.

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0438 \u0438 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435.

    Raises:

    Type Description AssertionError

    \u0415\u0441\u043b\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u043f\u0443\u0441\u0442\u0430 \u0438\u043b\u0438 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0438 \u043d\u0435\u0432\u0435\u0440\u043d\u044b.

    Source code in pages\\templates_tab.py
    def check_templates_table_content(self) -> None:\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0448\u0430\u0431\u043b\u043e\u043d\u043e\u0432.\n\n    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0438 \u0438 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435.\n\n    Raises:\n        AssertionError: \u0415\u0441\u043b\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u043f\u0443\u0441\u0442\u0430 \u0438\u043b\u0438 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0438 \u043d\u0435\u0432\u0435\u0440\u043d\u044b.\n    \"\"\"\n\n    expected_headers = [\n        '\u0418\u043c\u044f',\n        '\u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435',\n        '\u0422\u0438\u043f \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430',\n        '\u041f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c'\n    ]\n\n    self.templates_table.check_content(TableLocators.TABLE_WORK_AREA, expected_headers)\n
    "},{"location":"pages/templates_tab/#pages.templates_tab.TemplatesTab.check_templates_table_first_row_visibility","title":"check_templates_table_first_row_visibility()","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u043f\u0435\u0440\u0432\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u044b.

    Raises:

    Type Description AssertionError

    \u0415\u0441\u043b\u0438 \u0441\u0442\u0440\u043e\u043a\u0430 \u043d\u0435 \u0432\u0438\u0434\u043d\u0430.

    Source code in pages\\templates_tab.py
    def check_templates_table_first_row_visibility(self) -> None:\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u043f\u0435\u0440\u0432\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u044b.\n\n    Raises:\n        AssertionError: \u0415\u0441\u043b\u0438 \u0441\u0442\u0440\u043e\u043a\u0430 \u043d\u0435 \u0432\u0438\u0434\u043d\u0430.\n    \"\"\"\n\n    self.templates_table.check_first_row_visibility(TableLocators.TABLE_WORK_AREA)\n
    "},{"location":"pages/templates_tab/#pages.templates_tab.TemplatesTab.check_templates_table_last_row_visibility","title":"check_templates_table_last_row_visibility()","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0439 \u0441\u0442\u0440\u043e\u043a\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u044b.

    Raises:

    Type Description AssertionError

    \u0415\u0441\u043b\u0438 \u0441\u0442\u0440\u043e\u043a\u0430 \u043d\u0435 \u0432\u0438\u0434\u043d\u0430.

    Source code in pages\\templates_tab.py
    def check_templates_table_last_row_visibility(self) -> None:\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0439 \u0441\u0442\u0440\u043e\u043a\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u044b.\n\n    Raises:\n        AssertionError: \u0415\u0441\u043b\u0438 \u0441\u0442\u0440\u043e\u043a\u0430 \u043d\u0435 \u0432\u0438\u0434\u043d\u0430.\n    \"\"\"\n\n    self.templates_table.check_last_row_visibility(TableLocators.TABLE_WORK_AREA)\n
    "},{"location":"pages/templates_tab/#pages.templates_tab.TemplatesTab.check_templates_table_row_highlighting","title":"check_templates_table_row_highlighting(row_index)","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u044b.

    Parameters:

    Name Type Description Default row_index int

    \u0418\u043d\u0434\u0435\u043a\u0441 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438.

    required

    Raises:

    Type Description AssertionError

    \u0415\u0441\u043b\u0438 \u0441\u0442\u0440\u043e\u043a\u0430 \u043d\u0435 \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u0430.

    Source code in pages\\templates_tab.py
    def check_templates_table_row_highlighting(self, row_index: int) -> None:\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u044b.\n\n    Args:\n        row_index: \u0418\u043d\u0434\u0435\u043a\u0441 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438.\n\n    Raises:\n        AssertionError: \u0415\u0441\u043b\u0438 \u0441\u0442\u0440\u043e\u043a\u0430 \u043d\u0435 \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u0430.\n    \"\"\"\n\n    self.templates_table.check_row_highlighting(\n        TableLocators.TABLE_WORK_AREA,\n        row_index\n    )\n
    "},{"location":"pages/templates_tab/#pages.templates_tab.TemplatesTab.check_templates_table_verticall_scrolling","title":"check_templates_table_verticall_scrolling()","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u0439 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u044b.

    Returns:

    Name Type Description bool bool

    True \u0435\u0441\u043b\u0438 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0430 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u0430, \u0438\u043d\u0430\u0447\u0435 False.

    Source code in pages\\templates_tab.py
    def check_templates_table_verticall_scrolling(self) -> bool:\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u0439 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u044b.\n\n    Returns:\n        bool: True \u0435\u0441\u043b\u0438 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0430 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u0430, \u0438\u043d\u0430\u0447\u0435 False.\n    \"\"\"\n\n    return self.templates_table.is_scrollable_vertically(\n        TableLocators.TABLE_SCROLL_CONTAINER\n    )\n
    "},{"location":"pages/templates_tab/#pages.templates_tab.TemplatesTab.close_modal_window_by_toolbar_button","title":"close_modal_window_by_toolbar_button(title)","text":"

    \u0417\u0430\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043a\u043d\u043e \u0447\u0435\u0440\u0435\u0437 \u043a\u043d\u043e\u043f\u043a\u0443 \u0432 \u0442\u0443\u043b\u0431\u0430\u0440\u0435.

    Parameters:

    Name Type Description Default title str

    \u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a \u043e\u043a\u043d\u0430.

    required Source code in pages\\templates_tab.py
    def close_modal_window_by_toolbar_button(self, title: str) -> None:\n    \"\"\"\u0417\u0430\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043a\u043d\u043e \u0447\u0435\u0440\u0435\u0437 \u043a\u043d\u043e\u043f\u043a\u0443 \u0432 \u0442\u0443\u043b\u0431\u0430\u0440\u0435.\n\n    Args:\n        title: \u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a \u043e\u043a\u043d\u0430.\n    \"\"\"\n\n    modal_window = self.get_modal_window(title)\n    modal_window.click_toolbar_close_button()\n    self.delete_modal_window(title)\n
    "},{"location":"pages/templates_tab/#pages.templates_tab.TemplatesTab.delete_modal_window","title":"delete_modal_window(title)","text":"

    \u0423\u0434\u0430\u043b\u044f\u0435\u0442 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043a\u043d\u043e \u0438\u0437 \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u0438.

    Parameters:

    Name Type Description Default title str

    \u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a \u043e\u043a\u043d\u0430.

    required

    Raises:

    Type Description AssertionError

    \u0415\u0441\u043b\u0438 \u043e\u043a\u043d\u043e \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u043e.

    Source code in pages\\templates_tab.py
    def delete_modal_window(self, title: str) -> None:\n    \"\"\"\u0423\u0434\u0430\u043b\u044f\u0435\u0442 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043a\u043d\u043e \u0438\u0437 \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u0438.\n\n    Args:\n        title: \u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a \u043e\u043a\u043d\u0430.\n\n    Raises:\n        AssertionError: \u0415\u0441\u043b\u0438 \u043e\u043a\u043d\u043e \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u043e.\n    \"\"\"\n\n    if self.modal_windows.get(title) is None:\n        assert False, f\"Modal window with title '{title}' not found\"\n    self.modal_windows[title] = None\n
    "},{"location":"pages/templates_tab/#pages.templates_tab.TemplatesTab.extract_specific_template","title":"extract_specific_template(template_name, response_data)","text":"

    \u0418\u0437\u0432\u043b\u0435\u043a\u0430\u0435\u0442 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0433\u043e \u0448\u0430\u0431\u043b\u043e\u043d\u0430 \u043f\u043e template_name \u0438\u0437 \u0434\u0430\u043d\u043d\u044b\u0445 API.

    Parameters:

    Name Type Description Default template_name str

    \u0418\u043c\u044f \u0448\u0430\u0431\u043b\u043e\u043d\u0430 \u0434\u043b\u044f \u0438\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u044f.

    required response_data dict

    \u0414\u0430\u043d\u043d\u044b\u0435 \u043e\u0442\u0432\u0435\u0442\u0430 \u043e\u0442 API.

    required

    Returns:

    Name Type Description dict dict

    \u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0433\u043e \u0448\u0430\u0431\u043b\u043e\u043d\u0430.

    Raises:

    Type Description AssertionError

    \u0415\u0441\u043b\u0438 \u0448\u0430\u0431\u043b\u043e\u043d \u0441 \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u044b\u043c \u0438\u043c\u0435\u043d\u0435\u043c \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d \u0438\u043b\u0438 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u043e\u0442\u0432\u0435\u0442\u0430 \u043d\u0435\u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u0430.

    Source code in pages\\templates_tab.py
    def extract_specific_template(self, template_name: str, response_data: dict) -> dict:\n    \"\"\"\u0418\u0437\u0432\u043b\u0435\u043a\u0430\u0435\u0442 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0433\u043e \u0448\u0430\u0431\u043b\u043e\u043d\u0430 \u043f\u043e template_name \u0438\u0437 \u0434\u0430\u043d\u043d\u044b\u0445 API.\n\n    Args:\n        template_name: \u0418\u043c\u044f \u0448\u0430\u0431\u043b\u043e\u043d\u0430 \u0434\u043b\u044f \u0438\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u044f.\n        response_data: \u0414\u0430\u043d\u043d\u044b\u0435 \u043e\u0442\u0432\u0435\u0442\u0430 \u043e\u0442 API.\n\n    Returns:\n        dict: \u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0433\u043e \u0448\u0430\u0431\u043b\u043e\u043d\u0430.\n\n    Raises:\n        AssertionError: \u0415\u0441\u043b\u0438 \u0448\u0430\u0431\u043b\u043e\u043d \u0441 \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u044b\u043c \u0438\u043c\u0435\u043d\u0435\u043c \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\n            \u0438\u043b\u0438 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u043e\u0442\u0432\u0435\u0442\u0430 \u043d\u0435\u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u0430.\n    \"\"\"\n    # \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c, \u0447\u0442\u043e \u043e\u0442\u0432\u0435\u0442 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0441\u043f\u0438\u0441\u043a\u043e\u043c \u0448\u0430\u0431\u043b\u043e\u043d\u043e\u0432\n    assert isinstance(response_data, list), \"API response is not a list of templates\"\n\n    # \u0418\u0449\u0435\u043c \u0448\u0430\u0431\u043b\u043e\u043d \u0441 \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u044b\u043c \u0438\u043c\u0435\u043d\u0435\u043c\n    for template in response_data:\n        if template.get('id') == template_name:\n            logger.info(\"Found template: %s\", template_name)\n            return template\n\n    # \u0415\u0441\u043b\u0438 \u0448\u0430\u0431\u043b\u043e\u043d \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\n    available_templates = [t.get('id', 'Unknown') for t in response_data]\n\n    # \u0413\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u043c \u043f\u043e\u043d\u044f\u0442\u043d\u043e\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u043e\u0431 \u043e\u0448\u0438\u0431\u043a\u0435\n    error_msg = (\n        f\"Template '{template_name}' not found. \"\n        f\"Available templates: {available_templates}\"\n    )\n    logger.error(error_msg)\n    assert False, error_msg\n
    "},{"location":"pages/templates_tab/#pages.templates_tab.TemplatesTab.get_modal_window","title":"get_modal_window(title)","text":"

    \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043a\u043d\u043e \u043f\u043e \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0443.

    Parameters:

    Name Type Description Default title str

    \u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a \u043e\u043a\u043d\u0430.

    required

    Returns:

    Name Type Description ViewTemplateModalWindow ViewTemplateModalWindow

    \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430.

    Raises:

    Type Description AssertionError

    \u0415\u0441\u043b\u0438 \u043e\u043a\u043d\u043e \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u043e.

    Source code in pages\\templates_tab.py
    def get_modal_window(self, title: str) -> ViewTemplateModalWindow:\n    \"\"\"\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043a\u043d\u043e \u043f\u043e \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0443.\n\n    Args:\n        title: \u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a \u043e\u043a\u043d\u0430.\n\n    Returns:\n        ViewTemplateModalWindow: \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430.\n\n    Raises:\n        AssertionError: \u0415\u0441\u043b\u0438 \u043e\u043a\u043d\u043e \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u043e.\n    \"\"\"\n\n    modal_window = self.modal_windows.get(title)\n\n    if modal_window is None:\n        assert False, f\"Modal window with title '{title}' not found\"\n    return modal_window\n
    "},{"location":"pages/templates_tab/#pages.templates_tab.TemplatesTab.get_rows_count","title":"get_rows_count()","text":"

    \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0441\u0442\u0440\u043e\u043a \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435 (\u0431\u0435\u0437 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430).

    Returns:

    Name Type Description int int

    \u041a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0441\u0442\u0440\u043e\u043a \u0441 \u0434\u0430\u043d\u043d\u044b\u043c\u0438.

    Raises:

    Type Description AssertionError

    \u0415\u0441\u043b\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u043f\u0443\u0441\u0442\u0430.

    Source code in pages\\templates_tab.py
    def get_rows_count(self) -> int:\n    \"\"\"\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0441\u0442\u0440\u043e\u043a \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435 (\u0431\u0435\u0437 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430).\n\n    Returns:\n        int: \u041a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0441\u0442\u0440\u043e\u043a \u0441 \u0434\u0430\u043d\u043d\u044b\u043c\u0438.\n\n    Raises:\n        AssertionError: \u0415\u0441\u043b\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u043f\u0443\u0441\u0442\u0430.\n    \"\"\"\n\n    return self.templates_table.get_rows_count(TableLocators.TABLE_WORK_AREA)\n
    "},{"location":"pages/templates_tab/#pages.templates_tab.TemplatesTab.open_template_modal","title":"open_template_modal(row_index=0)","text":"

    \u041e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043a\u043d\u043e \u0448\u0430\u0431\u043b\u043e\u043d\u0430 \u043f\u043e \u043a\u043b\u0438\u043a\u0443 \u043d\u0430 \u0441\u0442\u0440\u043e\u043a\u0443 \u0442\u0430\u0431\u043b\u0438\u0446\u044b.

    Parameters:

    Name Type Description Default row_index int

    \u0418\u043d\u0434\u0435\u043a\u0441 \u0441\u0442\u0440\u043e\u043a\u0438 \u0434\u043b\u044f \u043a\u043b\u0438\u043a\u0430 (\u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e 0 - \u043f\u0435\u0440\u0432\u0430\u044f \u0441\u0442\u0440\u043e\u043a\u0430).

    0

    Returns:

    Name Type Description str str

    \u0418\u043c\u044f \u0448\u0430\u0431\u043b\u043e\u043d\u0430.

    Source code in pages\\templates_tab.py
    def open_template_modal(self, row_index: int = 0) -> str:\n    \"\"\"\u041e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043a\u043d\u043e \u0448\u0430\u0431\u043b\u043e\u043d\u0430 \u043f\u043e \u043a\u043b\u0438\u043a\u0443 \u043d\u0430 \u0441\u0442\u0440\u043e\u043a\u0443 \u0442\u0430\u0431\u043b\u0438\u0446\u044b.\n\n    Args:\n        row_index: \u0418\u043d\u0434\u0435\u043a\u0441 \u0441\u0442\u0440\u043e\u043a\u0438 \u0434\u043b\u044f \u043a\u043b\u0438\u043a\u0430 (\u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e 0 - \u043f\u0435\u0440\u0432\u0430\u044f \u0441\u0442\u0440\u043e\u043a\u0430).\n\n    Returns:\n        str: \u0418\u043c\u044f \u0448\u0430\u0431\u043b\u043e\u043d\u0430.\n    \"\"\"\n    row_locator = self.templates_table.get_row_locator(\n        TableLocators.TABLE_WORK_AREA,\n        row_index\n    )\n    row_locator.click()\n\n    # \u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0438\u043c\u044f \u0448\u0430\u0431\u043b\u043e\u043d\u0430 \u0438\u0437 \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438\n    table_content = self.templates_table.read(TableLocators.TABLE_WORK_AREA)\n    # +1 \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043f\u0435\u0440\u0432\u0430\u044f \u0441\u0442\u0440\u043e\u043a\u0430 - \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0438\n    template_name = table_content[row_index + 1][0]\n\n    # \u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043a\u043d\u043e \u0432 \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u044e \u043f\u043e\u0441\u043b\u0435 \u043e\u0442\u043a\u0440\u044b\u0442\u0438\u044f\n    self.add_modal_window(template_name)\n\n    return template_name\n
    "},{"location":"pages/templates_tab/#pages.templates_tab.TemplatesTab.save_template_data_to_file","title":"save_template_data_to_file(template_data, filename=None)","text":"

    \u0418\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442 \u043e\u0442\u043b\u0430\u0434\u043a\u0438. \u0421\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u0442 \u0434\u0430\u043d\u043d\u044b\u0435 \u0448\u0430\u0431\u043b\u043e\u043d\u0430 \u0432 JSON \u0444\u0430\u0439\u043b \u0432 \u0442\u0435\u043a\u0443\u0449\u0435\u0439 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438.

    Parameters:

    Name Type Description Default template_data dict

    \u0414\u0430\u043d\u043d\u044b\u0435 \u0448\u0430\u0431\u043b\u043e\u043d\u0430 \u0434\u043b\u044f \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f.

    required filename str

    \u0418\u043c\u044f \u0444\u0430\u0439\u043b\u0430 (\u0435\u0441\u043b\u0438 None, \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438).

    None

    Returns:

    Name Type Description str str

    \u041f\u0443\u0442\u044c \u043a \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u043d\u043e\u043c\u0443 \u0444\u0430\u0439\u043b\u0443.

    Source code in pages\\templates_tab.py
    def save_template_data_to_file(self, template_data: dict, filename: str = None) -> str:\n    \"\"\"\u0418\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442 \u043e\u0442\u043b\u0430\u0434\u043a\u0438. \u0421\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u0442 \u0434\u0430\u043d\u043d\u044b\u0435 \u0448\u0430\u0431\u043b\u043e\u043d\u0430 \u0432 JSON \u0444\u0430\u0439\u043b \u0432 \u0442\u0435\u043a\u0443\u0449\u0435\u0439 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438.\n\n    Args:\n        template_data: \u0414\u0430\u043d\u043d\u044b\u0435 \u0448\u0430\u0431\u043b\u043e\u043d\u0430 \u0434\u043b\u044f \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f.\n        filename: \u0418\u043c\u044f \u0444\u0430\u0439\u043b\u0430 (\u0435\u0441\u043b\u0438 None, \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438).\n\n    Returns:\n        str: \u041f\u0443\u0442\u044c \u043a \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u043d\u043e\u043c\u0443 \u0444\u0430\u0439\u043b\u0443.\n    \"\"\"\n    # \u0413\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u043c \u0438\u043c\u044f \u0444\u0430\u0439\u043b\u0430 \u0435\u0441\u043b\u0438 \u043d\u0435 \u0443\u043a\u0430\u0437\u0430\u043d\u043e\n    if filename is None:\n        template_name = template_data.get('id', 'unknown_template')\n        filename = f\"{template_name}_data.json\"\n\n    # \u0421\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u043c \u0444\u0430\u0439\u043b \u0432 \u0442\u0435\u043a\u0443\u0449\u0435\u0439 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438\n    file_path = Path(filename)\n\n    # \u0421\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u043c \u0434\u0430\u043d\u043d\u044b\u0435 \u0432 \u0444\u0430\u0439\u043b \u0441 \u0444\u043e\u0440\u043c\u0430\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435\u043c\n    with open(file_path, 'w', encoding='utf-8') as file:\n        json.dump(template_data, file, ensure_ascii=False, indent=2)\n\n    logger.info(\"Template data saved to: %s\", file_path)\n    return str(file_path)\n
    "},{"location":"pages/templates_tab/#pages.templates_tab.TemplatesTab.scroll_modal_down","title":"scroll_modal_down()","text":"

    \u041f\u0440\u043e\u043a\u0440\u0443\u0447\u0438\u0432\u0430\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430 \u0432\u043d\u0438\u0437.

    Source code in pages\\templates_tab.py
    def scroll_modal_down(self) -> None:\n    \"\"\"\u041f\u0440\u043e\u043a\u0440\u0443\u0447\u0438\u0432\u0430\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430 \u0432\u043d\u0438\u0437.\"\"\"\n    self.templates_table.scroll_down(\n        ModalWindowLocators.MODAL_WINDOW_SCROLL_CONTAINER\n    )\n
    "},{"location":"pages/templates_tab/#pages.templates_tab.TemplatesTab.scroll_modal_up","title":"scroll_modal_up()","text":"

    \u041f\u0440\u043e\u043a\u0440\u0443\u0447\u0438\u0432\u0430\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430 \u0432\u0432\u0435\u0440\u0445.

    Source code in pages\\templates_tab.py
    def scroll_modal_up(self) -> None:\n    \"\"\"\u041f\u0440\u043e\u043a\u0440\u0443\u0447\u0438\u0432\u0430\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430 \u0432\u0432\u0435\u0440\u0445.\"\"\"\n    self.templates_table.scroll_up(\n        ModalWindowLocators.MODAL_WINDOW_SCROLL_CONTAINER\n    )\n
    "},{"location":"pages/templates_tab/#pages.templates_tab.TemplatesTab.scroll_templates_table_down","title":"scroll_templates_table_down()","text":"

    \u041f\u0440\u043e\u043a\u0440\u0443\u0447\u0438\u0432\u0430\u0435\u0442 \u0442\u0430\u0431\u043b\u0438\u0446\u0443 \u0448\u0430\u0431\u043b\u043e\u043d\u043e\u0432 \u0432\u043d\u0438\u0437.

    Source code in pages\\templates_tab.py
    def scroll_templates_table_down(self) -> None:\n    \"\"\"\u041f\u0440\u043e\u043a\u0440\u0443\u0447\u0438\u0432\u0430\u0435\u0442 \u0442\u0430\u0431\u043b\u0438\u0446\u0443 \u0448\u0430\u0431\u043b\u043e\u043d\u043e\u0432 \u0432\u043d\u0438\u0437.\"\"\"\n\n    self.templates_table.scroll_down(TableLocators.TABLE_SCROLL_CONTAINER)\n
    "},{"location":"pages/templates_tab/#pages.templates_tab.TemplatesTab.scroll_templates_table_up","title":"scroll_templates_table_up()","text":"

    \u041f\u0440\u043e\u043a\u0440\u0443\u0447\u0438\u0432\u0430\u0435\u0442 \u0442\u0430\u0431\u043b\u0438\u0446\u0443 \u0448\u0430\u0431\u043b\u043e\u043d\u043e\u0432 \u0432\u0432\u0435\u0440\u0445.

    Source code in pages\\templates_tab.py
    def scroll_templates_table_up(self) -> None:\n    \"\"\"\u041f\u0440\u043e\u043a\u0440\u0443\u0447\u0438\u0432\u0430\u0435\u0442 \u0442\u0430\u0431\u043b\u0438\u0446\u0443 \u0448\u0430\u0431\u043b\u043e\u043d\u043e\u0432 \u0432\u0432\u0435\u0440\u0445.\"\"\"\n\n    self.templates_table.scroll_up(TableLocators.TABLE_SCROLL_CONTAINER)\n
    "},{"location":"pages/templates_tab/#pages.templates_tab.TemplatesTab.should_be_modal_window","title":"should_be_modal_window()","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430.

    Raises:

    Type Description AssertionError

    \u0415\u0441\u043b\u0438 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043a\u043d\u043e \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442.

    Source code in pages\\templates_tab.py
    def should_be_modal_window(self) -> None:\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430.\n\n    Raises:\n        AssertionError: \u0415\u0441\u043b\u0438 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043a\u043d\u043e \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442.\n    \"\"\"\n    self.templates_table.check_visibility(\n        ModalWindowLocators.MODAL_WINDOW,\n        \"Modal window is not visible\"\n    )\n
    "},{"location":"pages/templates_tab/#pages.templates_tab.TemplatesTab.should_be_templates_table","title":"should_be_templates_table()","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0448\u0430\u0431\u043b\u043e\u043d\u043e\u0432.

    Raises:

    Type Description AssertionError

    \u0415\u0441\u043b\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442.

    Source code in pages\\templates_tab.py
    def should_be_templates_table(self) -> None:\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0448\u0430\u0431\u043b\u043e\u043d\u043e\u0432.\n\n    Raises:\n        AssertionError: \u0415\u0441\u043b\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442.\n    \"\"\"\n\n    self.templates_table.check_visibility(\n        TableLocators.TABLE_WORK_AREA,\n        \"Templates table is missing\"\n    )\n
    "},{"location":"pages/templates_tab/#pages.templates_tab.TemplatesTab.should_be_toolbar","title":"should_be_toolbar()","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0442\u0443\u043b\u0431\u0430\u0440\u0430 \u043d\u0430 \u0432\u043a\u043b\u0430\u0434\u043a\u0435.

    Raises:

    Type Description AssertionError

    \u0415\u0441\u043b\u0438 \u0442\u0443\u043b\u0431\u0430\u0440 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442.

    Source code in pages\\templates_tab.py
    def should_be_toolbar(self) -> None:\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0442\u0443\u043b\u0431\u0430\u0440\u0430 \u043d\u0430 \u0432\u043a\u043b\u0430\u0434\u043a\u0435.\n\n    Raises:\n        AssertionError: \u0415\u0441\u043b\u0438 \u0442\u0443\u043b\u0431\u0430\u0440 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442.\n    \"\"\"\n\n    self.toolbar.check_toolbar_presence(\"Toolbar is missing\")\n
    "},{"location":"pages/templates_tab/#pages.templates_tab.TemplatesTab.should_not_be_modal_window","title":"should_not_be_modal_window()","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442, \u0447\u0442\u043e \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043a\u043d\u043e \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442.

    Raises:

    Type Description AssertionError

    \u0415\u0441\u043b\u0438 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043a\u043d\u043e \u0432\u0441\u0435 \u0435\u0449\u0435 \u0432\u0438\u0434\u043d\u043e.

    Source code in pages\\templates_tab.py
    def should_not_be_modal_window(self) -> None:\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442, \u0447\u0442\u043e \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043a\u043d\u043e \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442.\n\n    Raises:\n        AssertionError: \u0415\u0441\u043b\u0438 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043a\u043d\u043e \u0432\u0441\u0435 \u0435\u0449\u0435 \u0432\u0438\u0434\u043d\u043e.\n    \"\"\"\n    is_visible = self.page.locator(\n        ModalWindowLocators.MODAL_WINDOW\n    ).is_visible(timeout=1000)\n    if is_visible:\n        assert False, \"Modal window should not be visible\"\n
    "},{"location":"pages/templates_tab/#pages.templates_tab.TemplatesTab.verify_json_container_content","title":"verify_json_container_content(template_name, save_to_file=False)","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430 \u0434\u0430\u043d\u043d\u044b\u043c \u0438\u0437 API.

    Parameters:

    Name Type Description Default template_name str

    \u0418\u043c\u044f \u0448\u0430\u0431\u043b\u043e\u043d\u0430 \u0434\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438.

    required save_to_file bool

    \u0424\u043b\u0430\u0433 \u0434\u043b\u044f \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 \u0444\u0430\u0439\u043b.

    False Source code in pages\\templates_tab.py
    def verify_json_container_content(self, template_name: str, save_to_file: bool = False) -> None:\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430 \u0434\u0430\u043d\u043d\u044b\u043c \u0438\u0437 API.\n\n    Args:\n        template_name: \u0418\u043c\u044f \u0448\u0430\u0431\u043b\u043e\u043d\u0430 \u0434\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438.\n        save_to_file: \u0424\u043b\u0430\u0433 \u0434\u043b\u044f \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 \u0444\u0430\u0439\u043b.\n    \"\"\"\n\n    # \u0427\u0438\u0442\u0430\u0435\u043c \u0434\u0430\u043d\u043d\u044b\u0435 \u0438\u0437 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430\n    actual_data = self.json_container.read_data(JsonContainerLocators.CONTAINER)\n\n    # \u041e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u043c \u0437\u0430\u043f\u0440\u043e\u0441 \u043a backend \u0434\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u043e \u0448\u0430\u0431\u043b\u043e\u043d\u0435\n    response = self.send_get_api_request(\"e-cmdb/api/device/template\")\n    response_body = self.get_response_body(response)\n\n    # \u0418\u0437\u0432\u043b\u0435\u043a\u0430\u0435\u043c \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0439 \u0448\u0430\u0431\u043b\u043e\u043d \u043f\u043e \u0438\u043c\u0435\u043d\u0438 \u0438\u0437 \u043e\u0442\u0432\u0435\u0442\u0430 API\n    template_data = self.extract_specific_template(template_name, response_body)\n\n    # \u0421\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u043c \u0434\u0430\u043d\u043d\u044b\u0435 \u0432 \u0444\u0430\u0439\u043b \u0435\u0441\u043b\u0438 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f\n    if save_to_file:\n        file_path = self.save_template_data_to_file(template_data)\n        logger.info(\"Template data saved to: %s\", file_path)\n\n    # \u0421\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u0435\u043c actual_data \u0441 \u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0433\u043e \u0448\u0430\u0431\u043b\u043e\u043d\u0430\n    self.json_container.check_json_equals(\n        actual_data,\n        template_data,\n        \"Expected json content is not equal actual:\"\n    )\n
    "},{"location":"pages/users_tab/","title":"UsersTab","text":"

    \u041c\u043e\u0434\u0443\u043b\u044c \u0432\u043a\u043b\u0430\u0434\u043a\u0438 '\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438'.

    \u0421\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043a\u043b\u0430\u0441\u0441 UsersTab \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0442\u0430\u0431\u043b\u0438\u0446\u0435\u0439 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439. \u041f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\u043c\u0438 \u0447\u0435\u0440\u0435\u0437 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u044b\u0435 \u043e\u043a\u043d\u0430 \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0442\u044c \u0438\u0445 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435.

    "},{"location":"pages/users_tab/#pages.users_tab.UsersTab","title":"UsersTab","text":"

    Bases: BasePage

    \u041a\u043b\u0430\u0441\u0441 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0432\u043a\u043b\u0430\u0434\u043a\u043e\u0439 '\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438'.

    \u041f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u043c\u0435\u0442\u043e\u0434\u044b \u0434\u043b\u044f \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0441 \u0442\u0430\u0431\u043b\u0438\u0446\u0435\u0439 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439, \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u044b\u043c\u0438 \u043e\u043a\u043d\u0430\u043c\u0438 \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432.

    Parameters:

    Name Type Description Default page Page

    \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.

    required Source code in pages\\users_tab.py
    class UsersTab(BasePage):\n    \"\"\"\u041a\u043b\u0430\u0441\u0441 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0432\u043a\u043b\u0430\u0434\u043a\u043e\u0439 '\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438'.\n\n    \u041f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u043c\u0435\u0442\u043e\u0434\u044b \u0434\u043b\u044f \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0441 \u0442\u0430\u0431\u043b\u0438\u0446\u0435\u0439 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439,\n    \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u044b\u043c\u0438 \u043e\u043a\u043d\u0430\u043c\u0438 \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432.\n\n    Args:\n        page: \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.\n    \"\"\"\n\n    def __init__(self, page: Page) -> None:\n        \"\"\"\u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u044b \u0432\u043a\u043b\u0430\u0434\u043a\u0438 '\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438'.\"\"\"\n\n        super().__init__(page)\n\n        locator_button_1 = self.page.get_by_role(\"navigation\").filter(\n            has_text=re.compile(\"\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438\")\n        ).get_by_role(\"button\").nth(0)\n        locator_button_2 = self.page.get_by_role(\"navigation\").filter(\n            has_text=re.compile(\"\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438\")\n        ).get_by_role(\"button\").nth(1)\n\n        self.toolbar = ToolbarComponent(page, \"\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438\")\n        self.toolbar.add_tooltip_button(locator_button_1, \"edit\")\n        self.toolbar.add_tooltip_button(locator_button_1, \"add_user\")\n        self.toolbar.add_tooltip_button(locator_button_2, \"close\")\n\n        self.users_table = TableComponent(page)\n        self.modal_windows = {}\n        self.alert = AlertComponent(page)\n\n    # \u0414\u0435\u0439\u0441\u0442\u0432\u0438\u044f:\n    def add_modal_window(self, window_type: str, title: str) -> None:\n        \"\"\"\u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043a\u043d\u043e \u0432 \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u044e.\n\n        Args:\n            window_type: \u0422\u0438\u043f \u043e\u043a\u043d\u0430 ('add_user' \u0438\u043b\u0438 'edit_user').\n            title: \u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a \u043e\u043a\u043d\u0430.\n\n        Raises:\n            AssertionError: \u0415\u0441\u043b\u0438 \u0442\u0438\u043f \u043e\u043a\u043d\u0430 \u043d\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442\u0441\u044f.\n        \"\"\"\n\n        if window_type == \"add_local_user\":\n            self.modal_windows[\"add_local_user\"] = AddLocalUserModalWindow(self.page)\n        elif window_type == \"add_AD_user\":\n            self.modal_windows[\"add_AD_user\"] = AddADUserModalWindow(self.page)\n        elif window_type == \"edit_user\":\n            self.modal_windows[title] = EditUserModalWindow(self.page, title)\n        else:\n            assert False, \"Unsupported modal window type\"\n\n    def get_modal_window(self, title: str) -> ModalWindowComponent:\n        \"\"\"\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043a\u043d\u043e \u043f\u043e \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0443.\n\n        Args:\n            title: \u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a \u043e\u043a\u043d\u0430.\n\n        Returns:\n            ModalWindowComponent: \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430.\n\n        Raises:\n            AssertionError: \u0415\u0441\u043b\u0438 \u043e\u043a\u043d\u043e \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u043e.\n        \"\"\"\n\n        modal_window = self.modal_windows.get(title)\n        if modal_window is None:\n            assert False, f\"Modal window with title '{title}' not found\"\n        return modal_window\n\n    def delete_modal_window(self, title: str) -> None:\n        \"\"\"\u0423\u0434\u0430\u043b\u044f\u0435\u0442 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043a\u043d\u043e \u0438\u0437 \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u0438.\n\n        Args:\n            title: \u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a \u043e\u043a\u043d\u0430.\n\n        Raises:\n            AssertionError: \u0415\u0441\u043b\u0438 \u043e\u043a\u043d\u043e \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u043e.\n        \"\"\"\n\n        if self.modal_windows.get(title) is None:\n            assert False, f\"Modal window with title '{title}' not found\"\n        self.modal_windows[title] = None\n\n    def close_modal_window_by_toolbar_button(self, title: str) -> None:\n        \"\"\"\u0417\u0430\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043a\u043d\u043e \u0447\u0435\u0440\u0435\u0437 \u043a\u043d\u043e\u043f\u043a\u0443 \u0432 \u0442\u0443\u043b\u0431\u0430\u0440\u0435.\n\n        Args:\n            title: \u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a \u043e\u043a\u043d\u0430.\n        \"\"\"\n\n        modal_window = self.get_modal_window(title)\n        modal_window.close_window_by_toolbar_button()\n        self.delete_modal_window(title)\n\n    def close_modal_window(self, title: str) -> None:\n        \"\"\"\u0417\u0430\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043a\u043d\u043e \u0447\u0435\u0440\u0435\u0437 \u043a\u043d\u043e\u043f\u043a\u0443 \u0437\u0430\u043a\u0440\u044b\u0442\u0438\u044f.\n\n        Args:\n            title: \u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a \u043e\u043a\u043d\u0430.\n        \"\"\"\n\n        modal_window = self.get_modal_window(title)\n        modal_window.close_window()\n        self.delete_modal_window(title)\n\n    def close_add_AD_user_window_by_toolbar_button(self) -> None:\n        \"\"\"\u0417\u0430\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u043e\u043a\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0447\u0435\u0440\u0435\u0437 \u0442\u0443\u043b\u0431\u0430\u0440.\"\"\"\n\n        self.close_modal_window_by_toolbar_button(\"add_AD_user\")\n\n    def close_add_AD_user_window(self) -> None:\n        \"\"\"\u0417\u0430\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u043e\u043a\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\"\"\"\n\n        self.close_modal_window(\"add_AD_user\")\n\n    def close_add_user_window_by_toolbar_button(self) -> None:\n        \"\"\"\u0417\u0430\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u043e\u043a\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0447\u0435\u0440\u0435\u0437 \u0442\u0443\u043b\u0431\u0430\u0440.\"\"\"\n\n        self.close_modal_window_by_toolbar_button(\"add_local_user\")\n\n    def close_add_user_window(self) -> None:\n        \"\"\"\u0417\u0430\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u043e\u043a\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\"\"\"\n\n        self.close_modal_window(\"add_local_user\")\n\n    def close_edit_user_window_by_toolbar_button(self, title: str) -> None:\n        \"\"\"\u0417\u0430\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u043e\u043a\u043d\u043e \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0447\u0435\u0440\u0435\u0437 \u043a\u043d\u043e\u043f\u043a\u0443 \u0432 \u0442\u0443\u043b\u0431\u0430\u0440\u0435.\n\n        Args:\n            title: \u0418\u043c\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f (\u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a \u043e\u043a\u043d\u0430).\n        \"\"\"\n\n        self.close_modal_window_by_toolbar_button(title)\n\n    def close_edit_user_window(self, title: str) -> None:\n        \"\"\"\u0417\u0430\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u043e\u043a\u043d\u043e \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\n\n        Args:\n            title: \u0418\u043c\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f (\u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a \u043e\u043a\u043d\u0430).\n        \"\"\"\n\n        self.close_modal_window(title)\n\n\n    def add_new_user(self, user_data: dict) -> bool:\n        \"\"\"\u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u043d\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0438\u043b\u0438 \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442 \u043e\u0448\u0438\u0431\u043a\u0443 \u043f\u0440\u0438 \u0434\u0443\u0431\u043b\u0438\u043a\u0430\u0442\u0435.\n\n        Args:\n            user_data: \u0414\u0430\u043d\u043d\u044b\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f (name, role, password).\n\n        Returns:\n            bool: True \u0435\u0441\u043b\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d, False \u0435\u0441\u043b\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u0443\u0436\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442.\n\n        Raises:\n            AssertionError: \u0415\u0441\u043b\u0438 \u043e\u0442\u043a\u0440\u044b\u043b\u043e\u0441\u044c alert \u043e\u043a\u043d\u043e \u043e\u0442\u043b\u0438\u0447\u043d\u043e\u0435 \u043e\u0442 success \u0438\u043b\u0438 error,\n                        \u0438\u043b\u0438 \u0435\u0441\u043b\u0438 \u0442\u0435\u043a\u0441\u0442 alert \u043d\u0435 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u043e\u0436\u0438\u0434\u0430\u0435\u043c\u043e\u043c\u0443.\n        \"\"\"\n\n        add_user_window = self.get_modal_window(\"add_local_user\")\n\n        auth_type = user_data.get(\"auth_type\")\n        if auth_type == \"active_directory\":\n            add_user_window.check_active_directory_checkbox()\n            self.add_modal_window(\"add_AD_user\", \"\")\n            add_user_window = self.get_modal_window(\"add_AD_user\")\n            add_user_window.new_user(user_data)\n            return True\n\n        add_user_window.new_user(user_data)\n\n        is_added = False\n        alert_type = self.alert.get_alert_type()\n        if alert_type == \"success\":\n            self.alert.check_alert_presence(' \u041d\u043e\u0432\u044b\u0439 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \\n \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d! ')\n            self.alert.check_alert_absence(' \u041d\u043e\u0432\u044b\u0439 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \\n \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d! ')\n            is_added = True\n        elif alert_type == \"error\":\n            self.alert.check_alert_presence(f' \u0418\u043c\u044f {user_data[\"name\"]} \u0443\u0436\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f ')\n            self.alert.check_alert_absence(f' \u0418\u043c\u044f {user_data[\"name\"]} \u0443\u0436\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f ')\n        else:\n            assert False, f\"Got unexpected alert type {alert_type}\"\n\n        return is_added\n\n    def delete_user(self, user_name: str) -> None:\n        \"\"\"\u0423\u0434\u0430\u043b\u044f\u0435\u0442 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\n\n        Args:\n            user_name: \u0418\u043c\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\n\n        Raises:\n            AssertionError: \u0415\u0441\u043b\u0438 \u043d\u0435\u0442 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u043e\u0431 \u0443\u0441\u043f\u0435\u0448\u043d\u043e\u043c \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0438.\n        \"\"\"\n\n        self.get_modal_window(user_name).delete_user()\n\n        alert_type = self.alert.get_alert_type()\n        assert alert_type==\"success\", f\"Expected success alert, but got {alert_type} alert\"\n\n        self.alert.check_alert_presence('\\n\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u0443\u0434\u0430\u043b\u0451\u043d\\n')\n        self.alert.check_alert_absence('\\n\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u0443\u0434\u0430\u043b\u0451\u043d\\n')\n\n    def edit_user(self, user_name: str, user_data: dict) -> None:\n        \"\"\"\u0420\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u0443\u0435\u0442 \u0434\u0430\u043d\u043d\u044b\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\n\n        Args:\n            user_name: \u0418\u043c\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\n            user_data: \u041d\u043e\u0432\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\n\n        Raises:\n            AssertionError: \u0415\u0441\u043b\u0438 \u043d\u0435\u0442 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u043e\u0431 \u0443\u0441\u043f\u0435\u0448\u043d\u043e\u043c \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0438.\n        \"\"\"\n\n        self.get_modal_window(user_name).edit_user(user_data)\n\n        alert_type = self.alert.get_alert_type()\n        assert alert_type==\"success\", f\"Expected success alert, but got {alert_type} alert\"\n\n        self.alert.check_alert_presence('\\n\u041e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u0443\u0441\u043f\u0435\u0448\u043d\u043e\\n')\n        self.alert.check_alert_absence('\\n\u041e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u0443\u0441\u043f\u0435\u0448\u043d\u043e\\n')\n\n    def reset_password(self, user_name: str) -> str:\n        \"\"\"\u0421\u0431\u0440\u0430\u0441\u044b\u0432\u0430\u0435\u0442 \u043f\u0430\u0440\u043e\u043b\u044c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\n\n        Args:\n            user_name: \u0418\u043c\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\n\n        Returns:\n            str: \u041d\u043e\u0432\u044b\u0439 \u043f\u0430\u0440\u043e\u043b\u044c (\u0435\u0441\u043b\u0438 \u043f\u043e\u043b\u0443\u0447\u0435\u043d).\n        \"\"\"\n\n        new_password = \"\"\n        self.get_modal_window(user_name).reset_password()\n\n        self.alert.check_alert_presence(\"\")\n        alert_message = self.alert.get_text()\n        if len(alert_message) > 0:\n            new_password = re.findall(r'[\\d]+', alert_message)[0]\n\n        return new_password\n\n    def find_user_in_table(self, name: str, role: str) -> int:\n        \"\"\"\u0418\u0449\u0435\u0442 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435.\n\n        Args:\n            name: \u0418\u043c\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\n            role: \u0420\u043e\u043b\u044c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\n\n        Returns:\n            int: \u0418\u043d\u0434\u0435\u043a\u0441 \u0441\u0442\u0440\u043e\u043a\u0438 \u0438\u043b\u0438 -1 \u0435\u0441\u043b\u0438 \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d.\n\n        Raises:\n            AssertionError: \u0415\u0441\u043b\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u043f\u0443\u0441\u0442\u0430.\n        \"\"\"\n\n        self.page.wait_for_timeout(1000)\n\n        table_content = self.users_table.read(TableLocators.TABLE_WORK_AREA)\n        if len(table_content) == 0:\n            assert False, \"The contents of the table are missing\"\n\n        del table_content[0]  # \u0423\u0434\u0430\u043b\u044f\u0435\u043c \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a\n\n        for row_index, user_info in enumerate(table_content):\n            if name in user_info and role in user_info:\n                return row_index\n        return -1\n\n    def open_add_user_window(self) -> None:\n        \"\"\"\u041e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u043e\u043a\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\n\n        Raises:\n            AssertionError: \u0415\u0441\u043b\u0438 \u043a\u043d\u043e\u043f\u043a\u0438 \u043d\u0435\u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b \u0438\u043b\u0438 \u043e\u043a\u043d\u043e \u043d\u0435 \u043e\u0442\u043a\u0440\u044b\u043b\u043e\u0441\u044c.\n        \"\"\"\n\n        if self.toolbar.is_button_not_present(\"close\"):\n            self.toolbar.check_button_visibility(\"edit\")\n            self.toolbar.click_button(\"edit\")\n\n        self.toolbar.check_button_visibility(\"add_user\")\n        self.toolbar.click_button(\"add_user\")\n        self.add_modal_window(\"add_local_user\", \"\")\n        self.get_modal_window(\"add_local_user\").check_by_window_title()\n\n    def open_edit_user_page_by_index(self, row_index: int) -> tuple:\n        \"\"\"\u041e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u043e\u043a\u043d\u043e \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043f\u043e \u0438\u043d\u0434\u0435\u043a\u0441\u0443 \u0441\u0442\u0440\u043e\u043a\u0438.\n\n        Args:\n            row_index: \u0418\u043d\u0434\u0435\u043a\u0441 \u0441\u0442\u0440\u043e\u043a\u0438 \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435.\n\n        Returns:\n            tuple: (\u0438\u043c\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f, \u0440\u043e\u043b\u044c).\n\n        Raises:\n            AssertionError: \u0415\u0441\u043b\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u043f\u0443\u0441\u0442\u0430 \u0438\u043b\u0438 \u0438\u043d\u0434\u0435\u043a\u0441 \u0432\u043d\u0435 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0430.\n        \"\"\"\n\n        self.page.wait_for_timeout(2000)\n\n        tmp_dict = {\"admin\": \"\u0410\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440\", \"manager\": \"\u041a\u043e\u043d\u0442\u0430\u043a\u0442\u043d\u043e\u0435 \u043b\u0438\u0446\u043e\", \"operator\": \"\u041e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\"}\n        table_content = self.users_table.read(TableLocators.TABLE_WORK_AREA)\n\n        if len(table_content) == 0:\n            assert False, \"The contents of the table are missing\"\n\n        del table_content[0]  # \u0423\u0434\u0430\u043b\u044f\u0435\u043c \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a\n\n        if row_index >= len(table_content):\n            assert False, \"Row_index is out of range\"\n\n        user_name = table_content[row_index][0]\n        for key, val in tmp_dict.items():\n            if user_name == val:\n                user_name = key\n\n        role = table_content[row_index][2]\n\n        self.page.locator(TableLocators.TABLE_WORK_AREA).locator(\"//tbody/tr\").nth(row_index).click()\n        self.add_modal_window(\"edit_user\", user_name)\n        self.get_modal_window(user_name).check_by_window_title()\n\n        return user_name, role\n\n    def open_edit_user_page_by_user(self, user_name: str, role: str) -> None:\n        \"\"\"\u041e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u043e\u043a\u043d\u043e \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043f\u043e \u0438\u043c\u0435\u043d\u0438 \u0438 \u0440\u043e\u043b\u0438.\n\n        Args:\n            user_name: \u0418\u043c\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\n            role: \u0420\u043e\u043b\u044c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\n\n        Raises:\n            AssertionError: \u0415\u0441\u043b\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d.\n        \"\"\"\n\n        row_index = self.find_user_in_table(user_name, role)\n        if row_index == -1:\n            assert False, f\"User with name {user_name} and role {role} has not been found\"\n\n        self.page.locator(TableLocators.TABLE_WORK_AREA).locator(\"//tbody/tr\").nth(row_index).click()\n        self.add_modal_window(\"edit_user\", user_name)\n        self.get_modal_window(user_name).check_by_window_title()\n\n    def transform_to_add_AD_user_window(self):\n        \"\"\"\u0422\u0440\u0430\u043d\u0441\u0444\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u0442 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043a\u043d\u043e  \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\n           \u0432 \u043e\u043a\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f Active Directory \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043d\u0430\u0436\u0430\u0442\u0438\u044f\n           \u0447\u0435\u043a-\u0431\u043e\u043a\u0441\u0430 Active Directory.\n        \"\"\"\n\n        self.get_modal_window(\"add_local_user\").check_active_directory_checkbox()\n        modal_window = self.modal_windows.get(\"add_AD_user\")\n        if modal_window is None:\n            self.add_modal_window(\"add_AD_user\", \"\")\n\n    def transform_to_add_user_window(self):\n        \"\"\"\u0422\u0440\u0430\u043d\u0441\u0444\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u0442 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043a\u043d\u043e  \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f Active Directory\n           \u0432 \u043e\u043a\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0441\u043d\u044f\u0442\u0438\u044f \u043e\u0442\u043c\u0435\u0442\u043a\u0438 \u0441\n           \u0447\u0435\u043a-\u0431\u043e\u043a\u0441\u0430 Active Directory.\n        \"\"\"\n\n        self.get_modal_window(\"add_AD_user\").uncheck_active_directory_checkbox()\n        modal_window = self.modal_windows.get(\"add_local_user\")\n        if modal_window is None:\n            self.add_modal_window(\"add_local_user\", \"\")\n\n    # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0438:\n    def check_users_table_content(self, verify: bool = False) -> None:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439.\n\n        Args:\n            verify: \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0442\u044c \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438\u0437 \u0411\u0414. \u041f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e False.\n\n        Raises:\n            AssertionError: \u0415\u0441\u043b\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u043f\u0443\u0441\u0442\u0430 \u0438\u043b\u0438 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0438 \u043d\u0435\u0432\u0435\u0440\u043d\u044b.\n        \"\"\"\n        self.page.wait_for_timeout(2000)\n\n        expected_headers = ['\u0418\u043c\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f', '\u0422\u0438\u043f \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u0438', '\u0420\u043e\u043b\u044c', 'E-mail', '\u041d\u043e\u043c\u0435\u0440 \u0434\u043b\u044f \u0421\u041c\u0421']\n        table_content = self.users_table.read(TableLocators.TABLE_WORK_AREA)\n\n        if len(table_content) == 0:\n            assert False, \"The contents of the table are missing\"\n\n        actual_headers = table_content[0]\n        self.check_equals(\n            actual_headers,\n            expected_headers,\n            f\"Expected table headers {expected_headers} are not equal {actual_headers}\"\n        )\n\n        if len(table_content) == 1:\n            assert False, \"Table body is missing\"\n\n        if verify:\n            self.verify_users_table_content(table_content)\n\n    def check_add_user_window_content(self) -> None:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u043e\u043a\u043d\u0430 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\"\"\"\n\n        self.get_modal_window(\"add_local_user\").check_content()\n\n    def check_add_AD_user_window_content(self) -> None:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u043e\u043a\u043d\u0430 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0447\u0435\u0440\u0435\u0437 Active Directory.\"\"\"\n\n        self.get_modal_window(\"add_AD_user\").check_content()\n\n    def check_edit_user_window_content(self, user_name: str, role: str) -> None:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u043e\u043a\u043d\u0430 \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f.\n\n        Args:\n            user_name: \u0418\u043c\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\n            role: \u0420\u043e\u043b\u044c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\n        \"\"\"\n\n        edit_user_window = self.get_modal_window(user_name)\n        edit_user_window.check_content(user_name, role)\n\n    def should_be_toolbar(self) -> None:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0442\u0443\u043b\u0431\u0430\u0440\u0430.\n\n        Raises:\n            AssertionError: \u0415\u0441\u043b\u0438 \u0442\u0443\u043b\u0431\u0430\u0440 \u0438\u043b\u0438 \u043a\u043d\u043e\u043f\u043a\u0430 \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u044e\u0442.\n        \"\"\"\n\n        self.toolbar.check_toolbar_presence(\"Toolbar is missing\")\n        self.toolbar.check_button_visibility(\"edit\")\n\n    def should_be_toolbar_buttons(self) -> None:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u043a\u043d\u043e\u043f\u043e\u043a \u0442\u0443\u043b\u0431\u0430\u0440\u0430.\n\n        Raises:\n            AssertionError: \u0415\u0441\u043b\u0438 \u043a\u043d\u043e\u043f\u043a\u0438 \u043d\u0435\u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b \u0438\u043b\u0438 \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0438 \u043d\u0435\u0432\u0435\u0440\u043d\u044b.\n        \"\"\"\n\n        self.toolbar.check_button_visibility(\"edit\")\n        self.toolbar.check_button_tooltip(\"edit\", \"\u0420\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c\")\n\n        self.toolbar.get_button_by_name(\"edit\").click()\n        self.toolbar.check_button_visibility(\"add_user\")\n        self.toolbar.check_button_visibility(\"close\")\n        self.toolbar.check_button_tooltip(\"add_user\", \"\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c\")\n        self.toolbar.check_button_tooltip(\"close\", \"\u0417\u0430\u043a\u0440\u044b\u0442\u044c\")\n\n        self.toolbar.get_button_by_name(\"close\").click()\n        self.toolbar.check_button_visibility(\"edit\")\n\n    def should_be_users_table(self) -> None:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439.\n\n        Raises:\n            AssertionError: \u0415\u0441\u043b\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442.\n        \"\"\"\n\n        self.users_table.check_visibility(\n            TableLocators.TABLE_WORK_AREA,\n            \"Users table is missing\"\n        )\n\n    def should_be_user_in_table(self, name: str, role: str) -> None:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435.\n\n        Args:\n            name: \u0418\u043c\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\n            role: \u0420\u043e\u043b\u044c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\n\n        Raises:\n            AssertionError: \u0415\u0441\u043b\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d.\n        \"\"\"\n\n        found = self.find_user_in_table(name, role)\n        if found == -1:\n            assert False, f\"User with name {name} and role {role} has not been found\"\n\n    def should_not_be_user_in_table(self, name: str, role: str) -> None:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435.\n\n        Args:\n            name: \u0418\u043c\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\n            role: \u0420\u043e\u043b\u044c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\n\n        Raises:\n            AssertionError: \u0415\u0441\u043b\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u043d\u0430\u0439\u0434\u0435\u043d.\n        \"\"\"\n\n        found = self.find_user_in_table(name, role)\n        if found != -1:\n            assert False, f\"User with name {name} and role {role} has been found\"\n\n    def verify_users_table_content(self, users_table: list) -> None:\n        \"\"\"\u0421\u0432\u0435\u0440\u044f\u0435\u0442 \u0434\u0430\u043d\u043d\u044b\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0441 \u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u0438\u0437 \u0411\u0414.\n\n        Args:\n            users_table: \u0414\u0430\u043d\u043d\u044b\u0435 \u0438\u0437 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u043d\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435.\n\n        Raises:\n            AssertionError: \u0415\u0441\u043b\u0438 \u0434\u0430\u043d\u043d\u044b\u0435 \u043d\u0435 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0442.\n        \"\"\"\n\n        expected_users_list = []\n        tmp_dict = {\"admin\": \"\u0410\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440\", \"manager\": \"\u041a\u043e\u043d\u0442\u0430\u043a\u0442\u043d\u043e\u0435 \u043b\u0438\u0446\u043e\", \"operator\": \"\u041e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\"}\n\n        query = {\n            \"id\": [\"/catalogs/user\"],\n            \"data\": {\n                \"namePath\": True,\n                \"children\": {\"flatten\": True}\n            }\n        }\n\n        response = self.send_post_api_request(\"e-cmdb/api/query\", query)\n        response_body = self.get_response_body(response)\n\n        for item in response_body[0][\"children\"]:\n            user_info = []\n            user_name = item[\"name\"]\n\n            if user_name in tmp_dict.keys():\n                item[\"name\"] = tmp_dict[user_name]\n            user_info.append(item[\"name\"])\n\n            if item[\"type_auth\"] is not None:\n                user_info.append(item[\"type_auth\"])\n            else:\n                user_info.append(\"\")\n\n            if item[\"role\"] is not None:\n                role = item[\"role\"]\n                if role in roles_dict.keys():\n                    item[\"role\"] = roles_dict[role]\n                user_info.append(item[\"role\"])\n            else:\n                user_info.append(\"\")\n\n            if item[\"email\"] is not None:\n                user_info.append(item[\"email\"])\n            else:\n                user_info.append(\"\")\n\n            if item[\"sms_phone\"] is not None:\n                user_info.append(item[\"sms_phone\"])\n            else:\n                user_info.append(\"\")\n\n            expected_users_list.append(user_info)\n\n        del users_table[0]  # \u0423\u0434\u0430\u043b\u044f\u0435\u043c \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a\n\n        self.check_lists_equals(\n            users_table,\n            expected_users_list,\n            \"Actual users list is not equal expected users list on base db\"\n        )\n
    "},{"location":"pages/users_tab/#pages.users_tab.UsersTab.__init__","title":"__init__(page)","text":"

    \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u044b \u0432\u043a\u043b\u0430\u0434\u043a\u0438 '\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438'.

    Source code in pages\\users_tab.py
    def __init__(self, page: Page) -> None:\n    \"\"\"\u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u044b \u0432\u043a\u043b\u0430\u0434\u043a\u0438 '\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438'.\"\"\"\n\n    super().__init__(page)\n\n    locator_button_1 = self.page.get_by_role(\"navigation\").filter(\n        has_text=re.compile(\"\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438\")\n    ).get_by_role(\"button\").nth(0)\n    locator_button_2 = self.page.get_by_role(\"navigation\").filter(\n        has_text=re.compile(\"\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438\")\n    ).get_by_role(\"button\").nth(1)\n\n    self.toolbar = ToolbarComponent(page, \"\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438\")\n    self.toolbar.add_tooltip_button(locator_button_1, \"edit\")\n    self.toolbar.add_tooltip_button(locator_button_1, \"add_user\")\n    self.toolbar.add_tooltip_button(locator_button_2, \"close\")\n\n    self.users_table = TableComponent(page)\n    self.modal_windows = {}\n    self.alert = AlertComponent(page)\n
    "},{"location":"pages/users_tab/#pages.users_tab.UsersTab.add_modal_window","title":"add_modal_window(window_type, title)","text":"

    \u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043a\u043d\u043e \u0432 \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u044e.

    Parameters:

    Name Type Description Default window_type str

    \u0422\u0438\u043f \u043e\u043a\u043d\u0430 ('add_user' \u0438\u043b\u0438 'edit_user').

    required title str

    \u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a \u043e\u043a\u043d\u0430.

    required

    Raises:

    Type Description AssertionError

    \u0415\u0441\u043b\u0438 \u0442\u0438\u043f \u043e\u043a\u043d\u0430 \u043d\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442\u0441\u044f.

    Source code in pages\\users_tab.py
    def add_modal_window(self, window_type: str, title: str) -> None:\n    \"\"\"\u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043a\u043d\u043e \u0432 \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u044e.\n\n    Args:\n        window_type: \u0422\u0438\u043f \u043e\u043a\u043d\u0430 ('add_user' \u0438\u043b\u0438 'edit_user').\n        title: \u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a \u043e\u043a\u043d\u0430.\n\n    Raises:\n        AssertionError: \u0415\u0441\u043b\u0438 \u0442\u0438\u043f \u043e\u043a\u043d\u0430 \u043d\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442\u0441\u044f.\n    \"\"\"\n\n    if window_type == \"add_local_user\":\n        self.modal_windows[\"add_local_user\"] = AddLocalUserModalWindow(self.page)\n    elif window_type == \"add_AD_user\":\n        self.modal_windows[\"add_AD_user\"] = AddADUserModalWindow(self.page)\n    elif window_type == \"edit_user\":\n        self.modal_windows[title] = EditUserModalWindow(self.page, title)\n    else:\n        assert False, \"Unsupported modal window type\"\n
    "},{"location":"pages/users_tab/#pages.users_tab.UsersTab.add_new_user","title":"add_new_user(user_data)","text":"

    \u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u043d\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0438\u043b\u0438 \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442 \u043e\u0448\u0438\u0431\u043a\u0443 \u043f\u0440\u0438 \u0434\u0443\u0431\u043b\u0438\u043a\u0430\u0442\u0435.

    Parameters:

    Name Type Description Default user_data dict

    \u0414\u0430\u043d\u043d\u044b\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f (name, role, password).

    required

    Returns:

    Name Type Description bool bool

    True \u0435\u0441\u043b\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d, False \u0435\u0441\u043b\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u0443\u0436\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442.

    Raises:

    Type Description AssertionError

    \u0415\u0441\u043b\u0438 \u043e\u0442\u043a\u0440\u044b\u043b\u043e\u0441\u044c alert \u043e\u043a\u043d\u043e \u043e\u0442\u043b\u0438\u0447\u043d\u043e\u0435 \u043e\u0442 success \u0438\u043b\u0438 error, \u0438\u043b\u0438 \u0435\u0441\u043b\u0438 \u0442\u0435\u043a\u0441\u0442 alert \u043d\u0435 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u043e\u0436\u0438\u0434\u0430\u0435\u043c\u043e\u043c\u0443.

    Source code in pages\\users_tab.py
    def add_new_user(self, user_data: dict) -> bool:\n    \"\"\"\u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u043d\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0438\u043b\u0438 \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442 \u043e\u0448\u0438\u0431\u043a\u0443 \u043f\u0440\u0438 \u0434\u0443\u0431\u043b\u0438\u043a\u0430\u0442\u0435.\n\n    Args:\n        user_data: \u0414\u0430\u043d\u043d\u044b\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f (name, role, password).\n\n    Returns:\n        bool: True \u0435\u0441\u043b\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d, False \u0435\u0441\u043b\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u0443\u0436\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442.\n\n    Raises:\n        AssertionError: \u0415\u0441\u043b\u0438 \u043e\u0442\u043a\u0440\u044b\u043b\u043e\u0441\u044c alert \u043e\u043a\u043d\u043e \u043e\u0442\u043b\u0438\u0447\u043d\u043e\u0435 \u043e\u0442 success \u0438\u043b\u0438 error,\n                    \u0438\u043b\u0438 \u0435\u0441\u043b\u0438 \u0442\u0435\u043a\u0441\u0442 alert \u043d\u0435 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u043e\u0436\u0438\u0434\u0430\u0435\u043c\u043e\u043c\u0443.\n    \"\"\"\n\n    add_user_window = self.get_modal_window(\"add_local_user\")\n\n    auth_type = user_data.get(\"auth_type\")\n    if auth_type == \"active_directory\":\n        add_user_window.check_active_directory_checkbox()\n        self.add_modal_window(\"add_AD_user\", \"\")\n        add_user_window = self.get_modal_window(\"add_AD_user\")\n        add_user_window.new_user(user_data)\n        return True\n\n    add_user_window.new_user(user_data)\n\n    is_added = False\n    alert_type = self.alert.get_alert_type()\n    if alert_type == \"success\":\n        self.alert.check_alert_presence(' \u041d\u043e\u0432\u044b\u0439 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \\n \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d! ')\n        self.alert.check_alert_absence(' \u041d\u043e\u0432\u044b\u0439 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \\n \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d! ')\n        is_added = True\n    elif alert_type == \"error\":\n        self.alert.check_alert_presence(f' \u0418\u043c\u044f {user_data[\"name\"]} \u0443\u0436\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f ')\n        self.alert.check_alert_absence(f' \u0418\u043c\u044f {user_data[\"name\"]} \u0443\u0436\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f ')\n    else:\n        assert False, f\"Got unexpected alert type {alert_type}\"\n\n    return is_added\n
    "},{"location":"pages/users_tab/#pages.users_tab.UsersTab.check_add_AD_user_window_content","title":"check_add_AD_user_window_content()","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u043e\u043a\u043d\u0430 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0447\u0435\u0440\u0435\u0437 Active Directory.

    Source code in pages\\users_tab.py
    def check_add_AD_user_window_content(self) -> None:\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u043e\u043a\u043d\u0430 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0447\u0435\u0440\u0435\u0437 Active Directory.\"\"\"\n\n    self.get_modal_window(\"add_AD_user\").check_content()\n
    "},{"location":"pages/users_tab/#pages.users_tab.UsersTab.check_add_user_window_content","title":"check_add_user_window_content()","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u043e\u043a\u043d\u0430 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.

    Source code in pages\\users_tab.py
    def check_add_user_window_content(self) -> None:\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u043e\u043a\u043d\u0430 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\"\"\"\n\n    self.get_modal_window(\"add_local_user\").check_content()\n
    "},{"location":"pages/users_tab/#pages.users_tab.UsersTab.check_edit_user_window_content","title":"check_edit_user_window_content(user_name, role)","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u043e\u043a\u043d\u0430 \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f.

    Parameters:

    Name Type Description Default user_name str

    \u0418\u043c\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.

    required role str

    \u0420\u043e\u043b\u044c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.

    required Source code in pages\\users_tab.py
    def check_edit_user_window_content(self, user_name: str, role: str) -> None:\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u043e\u043a\u043d\u0430 \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f.\n\n    Args:\n        user_name: \u0418\u043c\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\n        role: \u0420\u043e\u043b\u044c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\n    \"\"\"\n\n    edit_user_window = self.get_modal_window(user_name)\n    edit_user_window.check_content(user_name, role)\n
    "},{"location":"pages/users_tab/#pages.users_tab.UsersTab.check_users_table_content","title":"check_users_table_content(verify=False)","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439.

    Parameters:

    Name Type Description Default verify bool

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0442\u044c \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438\u0437 \u0411\u0414. \u041f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e False.

    False

    Raises:

    Type Description AssertionError

    \u0415\u0441\u043b\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u043f\u0443\u0441\u0442\u0430 \u0438\u043b\u0438 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0438 \u043d\u0435\u0432\u0435\u0440\u043d\u044b.

    Source code in pages\\users_tab.py
    def check_users_table_content(self, verify: bool = False) -> None:\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439.\n\n    Args:\n        verify: \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0442\u044c \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438\u0437 \u0411\u0414. \u041f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e False.\n\n    Raises:\n        AssertionError: \u0415\u0441\u043b\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u043f\u0443\u0441\u0442\u0430 \u0438\u043b\u0438 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0438 \u043d\u0435\u0432\u0435\u0440\u043d\u044b.\n    \"\"\"\n    self.page.wait_for_timeout(2000)\n\n    expected_headers = ['\u0418\u043c\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f', '\u0422\u0438\u043f \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u0438', '\u0420\u043e\u043b\u044c', 'E-mail', '\u041d\u043e\u043c\u0435\u0440 \u0434\u043b\u044f \u0421\u041c\u0421']\n    table_content = self.users_table.read(TableLocators.TABLE_WORK_AREA)\n\n    if len(table_content) == 0:\n        assert False, \"The contents of the table are missing\"\n\n    actual_headers = table_content[0]\n    self.check_equals(\n        actual_headers,\n        expected_headers,\n        f\"Expected table headers {expected_headers} are not equal {actual_headers}\"\n    )\n\n    if len(table_content) == 1:\n        assert False, \"Table body is missing\"\n\n    if verify:\n        self.verify_users_table_content(table_content)\n
    "},{"location":"pages/users_tab/#pages.users_tab.UsersTab.close_add_AD_user_window","title":"close_add_AD_user_window()","text":"

    \u0417\u0430\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u043e\u043a\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.

    Source code in pages\\users_tab.py
    def close_add_AD_user_window(self) -> None:\n    \"\"\"\u0417\u0430\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u043e\u043a\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\"\"\"\n\n    self.close_modal_window(\"add_AD_user\")\n
    "},{"location":"pages/users_tab/#pages.users_tab.UsersTab.close_add_AD_user_window_by_toolbar_button","title":"close_add_AD_user_window_by_toolbar_button()","text":"

    \u0417\u0430\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u043e\u043a\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0447\u0435\u0440\u0435\u0437 \u0442\u0443\u043b\u0431\u0430\u0440.

    Source code in pages\\users_tab.py
    def close_add_AD_user_window_by_toolbar_button(self) -> None:\n    \"\"\"\u0417\u0430\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u043e\u043a\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0447\u0435\u0440\u0435\u0437 \u0442\u0443\u043b\u0431\u0430\u0440.\"\"\"\n\n    self.close_modal_window_by_toolbar_button(\"add_AD_user\")\n
    "},{"location":"pages/users_tab/#pages.users_tab.UsersTab.close_add_user_window","title":"close_add_user_window()","text":"

    \u0417\u0430\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u043e\u043a\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.

    Source code in pages\\users_tab.py
    def close_add_user_window(self) -> None:\n    \"\"\"\u0417\u0430\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u043e\u043a\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\"\"\"\n\n    self.close_modal_window(\"add_local_user\")\n
    "},{"location":"pages/users_tab/#pages.users_tab.UsersTab.close_add_user_window_by_toolbar_button","title":"close_add_user_window_by_toolbar_button()","text":"

    \u0417\u0430\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u043e\u043a\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0447\u0435\u0440\u0435\u0437 \u0442\u0443\u043b\u0431\u0430\u0440.

    Source code in pages\\users_tab.py
    def close_add_user_window_by_toolbar_button(self) -> None:\n    \"\"\"\u0417\u0430\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u043e\u043a\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0447\u0435\u0440\u0435\u0437 \u0442\u0443\u043b\u0431\u0430\u0440.\"\"\"\n\n    self.close_modal_window_by_toolbar_button(\"add_local_user\")\n
    "},{"location":"pages/users_tab/#pages.users_tab.UsersTab.close_edit_user_window","title":"close_edit_user_window(title)","text":"

    \u0417\u0430\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u043e\u043a\u043d\u043e \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.

    Parameters:

    Name Type Description Default title str

    \u0418\u043c\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f (\u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a \u043e\u043a\u043d\u0430).

    required Source code in pages\\users_tab.py
    def close_edit_user_window(self, title: str) -> None:\n    \"\"\"\u0417\u0430\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u043e\u043a\u043d\u043e \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\n\n    Args:\n        title: \u0418\u043c\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f (\u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a \u043e\u043a\u043d\u0430).\n    \"\"\"\n\n    self.close_modal_window(title)\n
    "},{"location":"pages/users_tab/#pages.users_tab.UsersTab.close_edit_user_window_by_toolbar_button","title":"close_edit_user_window_by_toolbar_button(title)","text":"

    \u0417\u0430\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u043e\u043a\u043d\u043e \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0447\u0435\u0440\u0435\u0437 \u043a\u043d\u043e\u043f\u043a\u0443 \u0432 \u0442\u0443\u043b\u0431\u0430\u0440\u0435.

    Parameters:

    Name Type Description Default title str

    \u0418\u043c\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f (\u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a \u043e\u043a\u043d\u0430).

    required Source code in pages\\users_tab.py
    def close_edit_user_window_by_toolbar_button(self, title: str) -> None:\n    \"\"\"\u0417\u0430\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u043e\u043a\u043d\u043e \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0447\u0435\u0440\u0435\u0437 \u043a\u043d\u043e\u043f\u043a\u0443 \u0432 \u0442\u0443\u043b\u0431\u0430\u0440\u0435.\n\n    Args:\n        title: \u0418\u043c\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f (\u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a \u043e\u043a\u043d\u0430).\n    \"\"\"\n\n    self.close_modal_window_by_toolbar_button(title)\n
    "},{"location":"pages/users_tab/#pages.users_tab.UsersTab.close_modal_window","title":"close_modal_window(title)","text":"

    \u0417\u0430\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043a\u043d\u043e \u0447\u0435\u0440\u0435\u0437 \u043a\u043d\u043e\u043f\u043a\u0443 \u0437\u0430\u043a\u0440\u044b\u0442\u0438\u044f.

    Parameters:

    Name Type Description Default title str

    \u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a \u043e\u043a\u043d\u0430.

    required Source code in pages\\users_tab.py
    def close_modal_window(self, title: str) -> None:\n    \"\"\"\u0417\u0430\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043a\u043d\u043e \u0447\u0435\u0440\u0435\u0437 \u043a\u043d\u043e\u043f\u043a\u0443 \u0437\u0430\u043a\u0440\u044b\u0442\u0438\u044f.\n\n    Args:\n        title: \u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a \u043e\u043a\u043d\u0430.\n    \"\"\"\n\n    modal_window = self.get_modal_window(title)\n    modal_window.close_window()\n    self.delete_modal_window(title)\n
    "},{"location":"pages/users_tab/#pages.users_tab.UsersTab.close_modal_window_by_toolbar_button","title":"close_modal_window_by_toolbar_button(title)","text":"

    \u0417\u0430\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043a\u043d\u043e \u0447\u0435\u0440\u0435\u0437 \u043a\u043d\u043e\u043f\u043a\u0443 \u0432 \u0442\u0443\u043b\u0431\u0430\u0440\u0435.

    Parameters:

    Name Type Description Default title str

    \u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a \u043e\u043a\u043d\u0430.

    required Source code in pages\\users_tab.py
    def close_modal_window_by_toolbar_button(self, title: str) -> None:\n    \"\"\"\u0417\u0430\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043a\u043d\u043e \u0447\u0435\u0440\u0435\u0437 \u043a\u043d\u043e\u043f\u043a\u0443 \u0432 \u0442\u0443\u043b\u0431\u0430\u0440\u0435.\n\n    Args:\n        title: \u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a \u043e\u043a\u043d\u0430.\n    \"\"\"\n\n    modal_window = self.get_modal_window(title)\n    modal_window.close_window_by_toolbar_button()\n    self.delete_modal_window(title)\n
    "},{"location":"pages/users_tab/#pages.users_tab.UsersTab.delete_modal_window","title":"delete_modal_window(title)","text":"

    \u0423\u0434\u0430\u043b\u044f\u0435\u0442 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043a\u043d\u043e \u0438\u0437 \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u0438.

    Parameters:

    Name Type Description Default title str

    \u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a \u043e\u043a\u043d\u0430.

    required

    Raises:

    Type Description AssertionError

    \u0415\u0441\u043b\u0438 \u043e\u043a\u043d\u043e \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u043e.

    Source code in pages\\users_tab.py
    def delete_modal_window(self, title: str) -> None:\n    \"\"\"\u0423\u0434\u0430\u043b\u044f\u0435\u0442 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043a\u043d\u043e \u0438\u0437 \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u0438.\n\n    Args:\n        title: \u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a \u043e\u043a\u043d\u0430.\n\n    Raises:\n        AssertionError: \u0415\u0441\u043b\u0438 \u043e\u043a\u043d\u043e \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u043e.\n    \"\"\"\n\n    if self.modal_windows.get(title) is None:\n        assert False, f\"Modal window with title '{title}' not found\"\n    self.modal_windows[title] = None\n
    "},{"location":"pages/users_tab/#pages.users_tab.UsersTab.delete_user","title":"delete_user(user_name)","text":"

    \u0423\u0434\u0430\u043b\u044f\u0435\u0442 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.

    Parameters:

    Name Type Description Default user_name str

    \u0418\u043c\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.

    required

    Raises:

    Type Description AssertionError

    \u0415\u0441\u043b\u0438 \u043d\u0435\u0442 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u043e\u0431 \u0443\u0441\u043f\u0435\u0448\u043d\u043e\u043c \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0438.

    Source code in pages\\users_tab.py
    def delete_user(self, user_name: str) -> None:\n    \"\"\"\u0423\u0434\u0430\u043b\u044f\u0435\u0442 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\n\n    Args:\n        user_name: \u0418\u043c\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\n\n    Raises:\n        AssertionError: \u0415\u0441\u043b\u0438 \u043d\u0435\u0442 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u043e\u0431 \u0443\u0441\u043f\u0435\u0448\u043d\u043e\u043c \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0438.\n    \"\"\"\n\n    self.get_modal_window(user_name).delete_user()\n\n    alert_type = self.alert.get_alert_type()\n    assert alert_type==\"success\", f\"Expected success alert, but got {alert_type} alert\"\n\n    self.alert.check_alert_presence('\\n\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u0443\u0434\u0430\u043b\u0451\u043d\\n')\n    self.alert.check_alert_absence('\\n\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u0443\u0434\u0430\u043b\u0451\u043d\\n')\n
    "},{"location":"pages/users_tab/#pages.users_tab.UsersTab.edit_user","title":"edit_user(user_name, user_data)","text":"

    \u0420\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u0443\u0435\u0442 \u0434\u0430\u043d\u043d\u044b\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.

    Parameters:

    Name Type Description Default user_name str

    \u0418\u043c\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.

    required user_data dict

    \u041d\u043e\u0432\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.

    required

    Raises:

    Type Description AssertionError

    \u0415\u0441\u043b\u0438 \u043d\u0435\u0442 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u043e\u0431 \u0443\u0441\u043f\u0435\u0448\u043d\u043e\u043c \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0438.

    Source code in pages\\users_tab.py
    def edit_user(self, user_name: str, user_data: dict) -> None:\n    \"\"\"\u0420\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u0443\u0435\u0442 \u0434\u0430\u043d\u043d\u044b\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\n\n    Args:\n        user_name: \u0418\u043c\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\n        user_data: \u041d\u043e\u0432\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\n\n    Raises:\n        AssertionError: \u0415\u0441\u043b\u0438 \u043d\u0435\u0442 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u043e\u0431 \u0443\u0441\u043f\u0435\u0448\u043d\u043e\u043c \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0438.\n    \"\"\"\n\n    self.get_modal_window(user_name).edit_user(user_data)\n\n    alert_type = self.alert.get_alert_type()\n    assert alert_type==\"success\", f\"Expected success alert, but got {alert_type} alert\"\n\n    self.alert.check_alert_presence('\\n\u041e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u0443\u0441\u043f\u0435\u0448\u043d\u043e\\n')\n    self.alert.check_alert_absence('\\n\u041e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u0443\u0441\u043f\u0435\u0448\u043d\u043e\\n')\n
    "},{"location":"pages/users_tab/#pages.users_tab.UsersTab.find_user_in_table","title":"find_user_in_table(name, role)","text":"

    \u0418\u0449\u0435\u0442 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435.

    Parameters:

    Name Type Description Default name str

    \u0418\u043c\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.

    required role str

    \u0420\u043e\u043b\u044c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.

    required

    Returns:

    Name Type Description int int

    \u0418\u043d\u0434\u0435\u043a\u0441 \u0441\u0442\u0440\u043e\u043a\u0438 \u0438\u043b\u0438 -1 \u0435\u0441\u043b\u0438 \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d.

    Raises:

    Type Description AssertionError

    \u0415\u0441\u043b\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u043f\u0443\u0441\u0442\u0430.

    Source code in pages\\users_tab.py
    def find_user_in_table(self, name: str, role: str) -> int:\n    \"\"\"\u0418\u0449\u0435\u0442 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435.\n\n    Args:\n        name: \u0418\u043c\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\n        role: \u0420\u043e\u043b\u044c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\n\n    Returns:\n        int: \u0418\u043d\u0434\u0435\u043a\u0441 \u0441\u0442\u0440\u043e\u043a\u0438 \u0438\u043b\u0438 -1 \u0435\u0441\u043b\u0438 \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d.\n\n    Raises:\n        AssertionError: \u0415\u0441\u043b\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u043f\u0443\u0441\u0442\u0430.\n    \"\"\"\n\n    self.page.wait_for_timeout(1000)\n\n    table_content = self.users_table.read(TableLocators.TABLE_WORK_AREA)\n    if len(table_content) == 0:\n        assert False, \"The contents of the table are missing\"\n\n    del table_content[0]  # \u0423\u0434\u0430\u043b\u044f\u0435\u043c \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a\n\n    for row_index, user_info in enumerate(table_content):\n        if name in user_info and role in user_info:\n            return row_index\n    return -1\n
    "},{"location":"pages/users_tab/#pages.users_tab.UsersTab.get_modal_window","title":"get_modal_window(title)","text":"

    \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043a\u043d\u043e \u043f\u043e \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0443.

    Parameters:

    Name Type Description Default title str

    \u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a \u043e\u043a\u043d\u0430.

    required

    Returns:

    Name Type Description ModalWindowComponent ModalWindowComponent

    \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430.

    Raises:

    Type Description AssertionError

    \u0415\u0441\u043b\u0438 \u043e\u043a\u043d\u043e \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u043e.

    Source code in pages\\users_tab.py
    def get_modal_window(self, title: str) -> ModalWindowComponent:\n    \"\"\"\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043a\u043d\u043e \u043f\u043e \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0443.\n\n    Args:\n        title: \u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a \u043e\u043a\u043d\u0430.\n\n    Returns:\n        ModalWindowComponent: \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430.\n\n    Raises:\n        AssertionError: \u0415\u0441\u043b\u0438 \u043e\u043a\u043d\u043e \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u043e.\n    \"\"\"\n\n    modal_window = self.modal_windows.get(title)\n    if modal_window is None:\n        assert False, f\"Modal window with title '{title}' not found\"\n    return modal_window\n
    "},{"location":"pages/users_tab/#pages.users_tab.UsersTab.open_add_user_window","title":"open_add_user_window()","text":"

    \u041e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u043e\u043a\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.

    Raises:

    Type Description AssertionError

    \u0415\u0441\u043b\u0438 \u043a\u043d\u043e\u043f\u043a\u0438 \u043d\u0435\u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b \u0438\u043b\u0438 \u043e\u043a\u043d\u043e \u043d\u0435 \u043e\u0442\u043a\u0440\u044b\u043b\u043e\u0441\u044c.

    Source code in pages\\users_tab.py
    def open_add_user_window(self) -> None:\n    \"\"\"\u041e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u043e\u043a\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\n\n    Raises:\n        AssertionError: \u0415\u0441\u043b\u0438 \u043a\u043d\u043e\u043f\u043a\u0438 \u043d\u0435\u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b \u0438\u043b\u0438 \u043e\u043a\u043d\u043e \u043d\u0435 \u043e\u0442\u043a\u0440\u044b\u043b\u043e\u0441\u044c.\n    \"\"\"\n\n    if self.toolbar.is_button_not_present(\"close\"):\n        self.toolbar.check_button_visibility(\"edit\")\n        self.toolbar.click_button(\"edit\")\n\n    self.toolbar.check_button_visibility(\"add_user\")\n    self.toolbar.click_button(\"add_user\")\n    self.add_modal_window(\"add_local_user\", \"\")\n    self.get_modal_window(\"add_local_user\").check_by_window_title()\n
    "},{"location":"pages/users_tab/#pages.users_tab.UsersTab.open_edit_user_page_by_index","title":"open_edit_user_page_by_index(row_index)","text":"

    \u041e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u043e\u043a\u043d\u043e \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043f\u043e \u0438\u043d\u0434\u0435\u043a\u0441\u0443 \u0441\u0442\u0440\u043e\u043a\u0438.

    Parameters:

    Name Type Description Default row_index int

    \u0418\u043d\u0434\u0435\u043a\u0441 \u0441\u0442\u0440\u043e\u043a\u0438 \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435.

    required

    Returns:

    Name Type Description tuple tuple

    (\u0438\u043c\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f, \u0440\u043e\u043b\u044c).

    Raises:

    Type Description AssertionError

    \u0415\u0441\u043b\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u043f\u0443\u0441\u0442\u0430 \u0438\u043b\u0438 \u0438\u043d\u0434\u0435\u043a\u0441 \u0432\u043d\u0435 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0430.

    Source code in pages\\users_tab.py
    def open_edit_user_page_by_index(self, row_index: int) -> tuple:\n    \"\"\"\u041e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u043e\u043a\u043d\u043e \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043f\u043e \u0438\u043d\u0434\u0435\u043a\u0441\u0443 \u0441\u0442\u0440\u043e\u043a\u0438.\n\n    Args:\n        row_index: \u0418\u043d\u0434\u0435\u043a\u0441 \u0441\u0442\u0440\u043e\u043a\u0438 \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435.\n\n    Returns:\n        tuple: (\u0438\u043c\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f, \u0440\u043e\u043b\u044c).\n\n    Raises:\n        AssertionError: \u0415\u0441\u043b\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u043f\u0443\u0441\u0442\u0430 \u0438\u043b\u0438 \u0438\u043d\u0434\u0435\u043a\u0441 \u0432\u043d\u0435 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0430.\n    \"\"\"\n\n    self.page.wait_for_timeout(2000)\n\n    tmp_dict = {\"admin\": \"\u0410\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440\", \"manager\": \"\u041a\u043e\u043d\u0442\u0430\u043a\u0442\u043d\u043e\u0435 \u043b\u0438\u0446\u043e\", \"operator\": \"\u041e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\"}\n    table_content = self.users_table.read(TableLocators.TABLE_WORK_AREA)\n\n    if len(table_content) == 0:\n        assert False, \"The contents of the table are missing\"\n\n    del table_content[0]  # \u0423\u0434\u0430\u043b\u044f\u0435\u043c \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a\n\n    if row_index >= len(table_content):\n        assert False, \"Row_index is out of range\"\n\n    user_name = table_content[row_index][0]\n    for key, val in tmp_dict.items():\n        if user_name == val:\n            user_name = key\n\n    role = table_content[row_index][2]\n\n    self.page.locator(TableLocators.TABLE_WORK_AREA).locator(\"//tbody/tr\").nth(row_index).click()\n    self.add_modal_window(\"edit_user\", user_name)\n    self.get_modal_window(user_name).check_by_window_title()\n\n    return user_name, role\n
    "},{"location":"pages/users_tab/#pages.users_tab.UsersTab.open_edit_user_page_by_user","title":"open_edit_user_page_by_user(user_name, role)","text":"

    \u041e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u043e\u043a\u043d\u043e \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043f\u043e \u0438\u043c\u0435\u043d\u0438 \u0438 \u0440\u043e\u043b\u0438.

    Parameters:

    Name Type Description Default user_name str

    \u0418\u043c\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.

    required role str

    \u0420\u043e\u043b\u044c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.

    required

    Raises:

    Type Description AssertionError

    \u0415\u0441\u043b\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d.

    Source code in pages\\users_tab.py
    def open_edit_user_page_by_user(self, user_name: str, role: str) -> None:\n    \"\"\"\u041e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u043e\u043a\u043d\u043e \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043f\u043e \u0438\u043c\u0435\u043d\u0438 \u0438 \u0440\u043e\u043b\u0438.\n\n    Args:\n        user_name: \u0418\u043c\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\n        role: \u0420\u043e\u043b\u044c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\n\n    Raises:\n        AssertionError: \u0415\u0441\u043b\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d.\n    \"\"\"\n\n    row_index = self.find_user_in_table(user_name, role)\n    if row_index == -1:\n        assert False, f\"User with name {user_name} and role {role} has not been found\"\n\n    self.page.locator(TableLocators.TABLE_WORK_AREA).locator(\"//tbody/tr\").nth(row_index).click()\n    self.add_modal_window(\"edit_user\", user_name)\n    self.get_modal_window(user_name).check_by_window_title()\n
    "},{"location":"pages/users_tab/#pages.users_tab.UsersTab.reset_password","title":"reset_password(user_name)","text":"

    \u0421\u0431\u0440\u0430\u0441\u044b\u0432\u0430\u0435\u0442 \u043f\u0430\u0440\u043e\u043b\u044c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.

    Parameters:

    Name Type Description Default user_name str

    \u0418\u043c\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.

    required

    Returns:

    Name Type Description str str

    \u041d\u043e\u0432\u044b\u0439 \u043f\u0430\u0440\u043e\u043b\u044c (\u0435\u0441\u043b\u0438 \u043f\u043e\u043b\u0443\u0447\u0435\u043d).

    Source code in pages\\users_tab.py
    def reset_password(self, user_name: str) -> str:\n    \"\"\"\u0421\u0431\u0440\u0430\u0441\u044b\u0432\u0430\u0435\u0442 \u043f\u0430\u0440\u043e\u043b\u044c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\n\n    Args:\n        user_name: \u0418\u043c\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\n\n    Returns:\n        str: \u041d\u043e\u0432\u044b\u0439 \u043f\u0430\u0440\u043e\u043b\u044c (\u0435\u0441\u043b\u0438 \u043f\u043e\u043b\u0443\u0447\u0435\u043d).\n    \"\"\"\n\n    new_password = \"\"\n    self.get_modal_window(user_name).reset_password()\n\n    self.alert.check_alert_presence(\"\")\n    alert_message = self.alert.get_text()\n    if len(alert_message) > 0:\n        new_password = re.findall(r'[\\d]+', alert_message)[0]\n\n    return new_password\n
    "},{"location":"pages/users_tab/#pages.users_tab.UsersTab.should_be_toolbar","title":"should_be_toolbar()","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0442\u0443\u043b\u0431\u0430\u0440\u0430.

    Raises:

    Type Description AssertionError

    \u0415\u0441\u043b\u0438 \u0442\u0443\u043b\u0431\u0430\u0440 \u0438\u043b\u0438 \u043a\u043d\u043e\u043f\u043a\u0430 \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u044e\u0442.

    Source code in pages\\users_tab.py
    def should_be_toolbar(self) -> None:\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0442\u0443\u043b\u0431\u0430\u0440\u0430.\n\n    Raises:\n        AssertionError: \u0415\u0441\u043b\u0438 \u0442\u0443\u043b\u0431\u0430\u0440 \u0438\u043b\u0438 \u043a\u043d\u043e\u043f\u043a\u0430 \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u044e\u0442.\n    \"\"\"\n\n    self.toolbar.check_toolbar_presence(\"Toolbar is missing\")\n    self.toolbar.check_button_visibility(\"edit\")\n
    "},{"location":"pages/users_tab/#pages.users_tab.UsersTab.should_be_toolbar_buttons","title":"should_be_toolbar_buttons()","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u043a\u043d\u043e\u043f\u043e\u043a \u0442\u0443\u043b\u0431\u0430\u0440\u0430.

    Raises:

    Type Description AssertionError

    \u0415\u0441\u043b\u0438 \u043a\u043d\u043e\u043f\u043a\u0438 \u043d\u0435\u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b \u0438\u043b\u0438 \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0438 \u043d\u0435\u0432\u0435\u0440\u043d\u044b.

    Source code in pages\\users_tab.py
    def should_be_toolbar_buttons(self) -> None:\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u043a\u043d\u043e\u043f\u043e\u043a \u0442\u0443\u043b\u0431\u0430\u0440\u0430.\n\n    Raises:\n        AssertionError: \u0415\u0441\u043b\u0438 \u043a\u043d\u043e\u043f\u043a\u0438 \u043d\u0435\u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b \u0438\u043b\u0438 \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0438 \u043d\u0435\u0432\u0435\u0440\u043d\u044b.\n    \"\"\"\n\n    self.toolbar.check_button_visibility(\"edit\")\n    self.toolbar.check_button_tooltip(\"edit\", \"\u0420\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c\")\n\n    self.toolbar.get_button_by_name(\"edit\").click()\n    self.toolbar.check_button_visibility(\"add_user\")\n    self.toolbar.check_button_visibility(\"close\")\n    self.toolbar.check_button_tooltip(\"add_user\", \"\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c\")\n    self.toolbar.check_button_tooltip(\"close\", \"\u0417\u0430\u043a\u0440\u044b\u0442\u044c\")\n\n    self.toolbar.get_button_by_name(\"close\").click()\n    self.toolbar.check_button_visibility(\"edit\")\n
    "},{"location":"pages/users_tab/#pages.users_tab.UsersTab.should_be_user_in_table","title":"should_be_user_in_table(name, role)","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435.

    Parameters:

    Name Type Description Default name str

    \u0418\u043c\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.

    required role str

    \u0420\u043e\u043b\u044c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.

    required

    Raises:

    Type Description AssertionError

    \u0415\u0441\u043b\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d.

    Source code in pages\\users_tab.py
    def should_be_user_in_table(self, name: str, role: str) -> None:\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435.\n\n    Args:\n        name: \u0418\u043c\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\n        role: \u0420\u043e\u043b\u044c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\n\n    Raises:\n        AssertionError: \u0415\u0441\u043b\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d.\n    \"\"\"\n\n    found = self.find_user_in_table(name, role)\n    if found == -1:\n        assert False, f\"User with name {name} and role {role} has not been found\"\n
    "},{"location":"pages/users_tab/#pages.users_tab.UsersTab.should_be_users_table","title":"should_be_users_table()","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439.

    Raises:

    Type Description AssertionError

    \u0415\u0441\u043b\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442.

    Source code in pages\\users_tab.py
    def should_be_users_table(self) -> None:\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439.\n\n    Raises:\n        AssertionError: \u0415\u0441\u043b\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442.\n    \"\"\"\n\n    self.users_table.check_visibility(\n        TableLocators.TABLE_WORK_AREA,\n        \"Users table is missing\"\n    )\n
    "},{"location":"pages/users_tab/#pages.users_tab.UsersTab.should_not_be_user_in_table","title":"should_not_be_user_in_table(name, role)","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435.

    Parameters:

    Name Type Description Default name str

    \u0418\u043c\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.

    required role str

    \u0420\u043e\u043b\u044c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.

    required

    Raises:

    Type Description AssertionError

    \u0415\u0441\u043b\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u043d\u0430\u0439\u0434\u0435\u043d.

    Source code in pages\\users_tab.py
    def should_not_be_user_in_table(self, name: str, role: str) -> None:\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435.\n\n    Args:\n        name: \u0418\u043c\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\n        role: \u0420\u043e\u043b\u044c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\n\n    Raises:\n        AssertionError: \u0415\u0441\u043b\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u043d\u0430\u0439\u0434\u0435\u043d.\n    \"\"\"\n\n    found = self.find_user_in_table(name, role)\n    if found != -1:\n        assert False, f\"User with name {name} and role {role} has been found\"\n
    "},{"location":"pages/users_tab/#pages.users_tab.UsersTab.transform_to_add_AD_user_window","title":"transform_to_add_AD_user_window()","text":"

    \u0422\u0440\u0430\u043d\u0441\u0444\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u0442 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043a\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0432 \u043e\u043a\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f Active Directory \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043d\u0430\u0436\u0430\u0442\u0438\u044f \u0447\u0435\u043a-\u0431\u043e\u043a\u0441\u0430 Active Directory.

    Source code in pages\\users_tab.py
    def transform_to_add_AD_user_window(self):\n    \"\"\"\u0422\u0440\u0430\u043d\u0441\u0444\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u0442 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043a\u043d\u043e  \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\n       \u0432 \u043e\u043a\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f Active Directory \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043d\u0430\u0436\u0430\u0442\u0438\u044f\n       \u0447\u0435\u043a-\u0431\u043e\u043a\u0441\u0430 Active Directory.\n    \"\"\"\n\n    self.get_modal_window(\"add_local_user\").check_active_directory_checkbox()\n    modal_window = self.modal_windows.get(\"add_AD_user\")\n    if modal_window is None:\n        self.add_modal_window(\"add_AD_user\", \"\")\n
    "},{"location":"pages/users_tab/#pages.users_tab.UsersTab.transform_to_add_user_window","title":"transform_to_add_user_window()","text":"

    \u0422\u0440\u0430\u043d\u0441\u0444\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u0442 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043a\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f Active Directory \u0432 \u043e\u043a\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0441\u043d\u044f\u0442\u0438\u044f \u043e\u0442\u043c\u0435\u0442\u043a\u0438 \u0441 \u0447\u0435\u043a-\u0431\u043e\u043a\u0441\u0430 Active Directory.

    Source code in pages\\users_tab.py
    def transform_to_add_user_window(self):\n    \"\"\"\u0422\u0440\u0430\u043d\u0441\u0444\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u0442 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043a\u043d\u043e  \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f Active Directory\n       \u0432 \u043e\u043a\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0441\u043d\u044f\u0442\u0438\u044f \u043e\u0442\u043c\u0435\u0442\u043a\u0438 \u0441\n       \u0447\u0435\u043a-\u0431\u043e\u043a\u0441\u0430 Active Directory.\n    \"\"\"\n\n    self.get_modal_window(\"add_AD_user\").uncheck_active_directory_checkbox()\n    modal_window = self.modal_windows.get(\"add_local_user\")\n    if modal_window is None:\n        self.add_modal_window(\"add_local_user\", \"\")\n
    "},{"location":"pages/users_tab/#pages.users_tab.UsersTab.verify_users_table_content","title":"verify_users_table_content(users_table)","text":"

    \u0421\u0432\u0435\u0440\u044f\u0435\u0442 \u0434\u0430\u043d\u043d\u044b\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0441 \u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u0438\u0437 \u0411\u0414.

    Parameters:

    Name Type Description Default users_table list

    \u0414\u0430\u043d\u043d\u044b\u0435 \u0438\u0437 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u043d\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435.

    required

    Raises:

    Type Description AssertionError

    \u0415\u0441\u043b\u0438 \u0434\u0430\u043d\u043d\u044b\u0435 \u043d\u0435 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0442.

    Source code in pages\\users_tab.py
    def verify_users_table_content(self, users_table: list) -> None:\n    \"\"\"\u0421\u0432\u0435\u0440\u044f\u0435\u0442 \u0434\u0430\u043d\u043d\u044b\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0441 \u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u0438\u0437 \u0411\u0414.\n\n    Args:\n        users_table: \u0414\u0430\u043d\u043d\u044b\u0435 \u0438\u0437 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u043d\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435.\n\n    Raises:\n        AssertionError: \u0415\u0441\u043b\u0438 \u0434\u0430\u043d\u043d\u044b\u0435 \u043d\u0435 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0442.\n    \"\"\"\n\n    expected_users_list = []\n    tmp_dict = {\"admin\": \"\u0410\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440\", \"manager\": \"\u041a\u043e\u043d\u0442\u0430\u043a\u0442\u043d\u043e\u0435 \u043b\u0438\u0446\u043e\", \"operator\": \"\u041e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\"}\n\n    query = {\n        \"id\": [\"/catalogs/user\"],\n        \"data\": {\n            \"namePath\": True,\n            \"children\": {\"flatten\": True}\n        }\n    }\n\n    response = self.send_post_api_request(\"e-cmdb/api/query\", query)\n    response_body = self.get_response_body(response)\n\n    for item in response_body[0][\"children\"]:\n        user_info = []\n        user_name = item[\"name\"]\n\n        if user_name in tmp_dict.keys():\n            item[\"name\"] = tmp_dict[user_name]\n        user_info.append(item[\"name\"])\n\n        if item[\"type_auth\"] is not None:\n            user_info.append(item[\"type_auth\"])\n        else:\n            user_info.append(\"\")\n\n        if item[\"role\"] is not None:\n            role = item[\"role\"]\n            if role in roles_dict.keys():\n                item[\"role\"] = roles_dict[role]\n            user_info.append(item[\"role\"])\n        else:\n            user_info.append(\"\")\n\n        if item[\"email\"] is not None:\n            user_info.append(item[\"email\"])\n        else:\n            user_info.append(\"\")\n\n        if item[\"sms_phone\"] is not None:\n            user_info.append(item[\"sms_phone\"])\n        else:\n            user_info.append(\"\")\n\n        expected_users_list.append(user_info)\n\n    del users_table[0]  # \u0423\u0434\u0430\u043b\u044f\u0435\u043c \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a\n\n    self.check_lists_equals(\n        users_table,\n        expected_users_list,\n        \"Actual users list is not equal expected users list on base db\"\n    )\n
    "},{"location":"pages/ztp_templates_tab/","title":"ZTPTemplatesTab","text":"

    \u041c\u043e\u0434\u0443\u043b\u044c \u0432\u043a\u043b\u0430\u0434\u043a\u0438 '\u0428\u0430\u0431\u043b\u043e\u043d\u044b' \u0432 \u043c\u043e\u0434\u0443\u043b\u0435 Zero Touch Provisioning.

    \u0421\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043a\u043b\u0430\u0441\u0441 ZTPTemplatesTab \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0442\u0430\u0431\u043b\u0438\u0446\u0435\u0439 \u0448\u0430\u0431\u043b\u043e\u043d\u043e\u0432. \u041f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0442\u044c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0438 \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c \u0441 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u043c\u0438 \u0432\u043a\u043b\u0430\u0434\u043a\u0438.

    "},{"location":"pages/ztp_templates_tab/#pages.ztp_templates_tab.ZTPTemplatesTab","title":"ZTPTemplatesTab","text":"

    Bases: BasePage

    \u041a\u043b\u0430\u0441\u0441 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0432\u043a\u043b\u0430\u0434\u043a\u043e\u0439 '\u0428\u0430\u0431\u043b\u043e\u043d\u044b' \u0432 \u043c\u043e\u0434\u0443\u043b\u0435 Zero Touch Provisioning.

    \u041f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u043c\u0435\u0442\u043e\u0434\u044b \u0434\u043b\u044f \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0441 \u0442\u0430\u0431\u043b\u0438\u0446\u0435\u0439 \u0448\u0430\u0431\u043b\u043e\u043d\u043e\u0432, \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u044b\u043c\u0438 \u043e\u043a\u043d\u0430\u043c\u0438 \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430. \u0412\u043a\u043b\u044e\u0447\u0430\u0435\u0442 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0434\u043b\u044f: - \u0420\u0430\u0431\u043e\u0442\u044b \u0441 \u0442\u0430\u0431\u043b\u0438\u0446\u0435\u0439 \u0448\u0430\u0431\u043b\u043e\u043d\u043e\u0432 (\u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0430, \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0441\u0442\u0440\u043e\u043a, \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u0438\u0435) - \u0423\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u044b\u043c\u0438 \u043e\u043a\u043d\u0430\u043c\u0438 \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0430 \u0448\u0430\u0431\u043b\u043e\u043d\u043e\u0432 - \u0421\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445 UI \u0441 API \u043e\u0442\u0432\u0435\u0442\u0430\u043c\u0438

    Parameters:

    Name Type Description Default page Page

    \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.

    required Source code in pages\\ztp_templates_tab.py
    class ZTPTemplatesTab(BasePage):\n    \"\"\"\u041a\u043b\u0430\u0441\u0441 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0432\u043a\u043b\u0430\u0434\u043a\u043e\u0439 '\u0428\u0430\u0431\u043b\u043e\u043d\u044b' \u0432 \u043c\u043e\u0434\u0443\u043b\u0435 Zero Touch Provisioning.\n\n    \u041f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u043c\u0435\u0442\u043e\u0434\u044b \u0434\u043b\u044f \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0441 \u0442\u0430\u0431\u043b\u0438\u0446\u0435\u0439 \u0448\u0430\u0431\u043b\u043e\u043d\u043e\u0432, \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u044b\u043c\u0438 \u043e\u043a\u043d\u0430\u043c\u0438\n    \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430. \u0412\u043a\u043b\u044e\u0447\u0430\u0435\u0442 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0434\u043b\u044f:\n    - \u0420\u0430\u0431\u043e\u0442\u044b \u0441 \u0442\u0430\u0431\u043b\u0438\u0446\u0435\u0439 \u0448\u0430\u0431\u043b\u043e\u043d\u043e\u0432 (\u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0430, \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0441\u0442\u0440\u043e\u043a, \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u0438\u0435)\n    - \u0423\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u044b\u043c\u0438 \u043e\u043a\u043d\u0430\u043c\u0438 \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0430 \u0448\u0430\u0431\u043b\u043e\u043d\u043e\u0432\n    - \u0421\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445 UI \u0441 API \u043e\u0442\u0432\u0435\u0442\u0430\u043c\u0438\n\n    Args:\n        page (Page): \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.\n    \"\"\"\n\n    def __init__(self, page: Page) -> None:\n        \"\"\"\u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u044b \u0432\u043a\u043b\u0430\u0434\u043a\u0438 '\u0428\u0430\u0431\u043b\u043e\u043d\u044b'.\"\"\"\n        super().__init__(page)\n\n        self.toolbar = ToolbarComponent(page, \"\u0428\u0430\u0431\u043b\u043e\u043d\u044b\")\n        self.ztp_templates_table = TableComponent(page)\n        self.modal_windows = {}\n\n    def add_modal_window(self, title: str) -> None:\n        \"\"\"\u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043a\u043d\u043e \u0432 \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u044e.\n\n        Args:\n            title: \u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a \u043e\u043a\u043d\u0430.\n        \"\"\"\n        self.modal_windows[title] = ViewTemplateModalWindow(self.page, title)\n\n    def get_modal_window(self, title: str) -> ViewTemplateModalWindow:\n        \"\"\"\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043a\u043d\u043e \u043f\u043e \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0443.\n\n        Args:\n            title: \u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a \u043e\u043a\u043d\u0430.\n\n        Returns:\n            ViewTemplateModalWindow: \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430 \u0448\u0430\u0431\u043b\u043e\u043d\u0430.\n\n        Raises:\n            AssertionError: \u0415\u0441\u043b\u0438 \u043e\u043a\u043d\u043e \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u043e.\n        \"\"\"\n        modal_window = self.modal_windows.get(title)\n\n        if modal_window is None:\n            assert False, f\"Modal window with title '{title}' not found\"\n        return modal_window\n\n    def delete_modal_window(self, title: str) -> None:\n        \"\"\"\u0423\u0434\u0430\u043b\u044f\u0435\u0442 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043a\u043d\u043e \u0438\u0437 \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u0438.\n\n        Args:\n            title: \u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a \u043e\u043a\u043d\u0430.\n\n        Raises:\n            AssertionError: \u0415\u0441\u043b\u0438 \u043e\u043a\u043d\u043e \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u043e.\n        \"\"\"\n        if self.modal_windows.get(title) is None:\n            assert False, f\"Modal window with title '{title}' not found\"\n        self.modal_windows[title] = None\n\n    def open_template_modal_by_index(self, row_index: int = 0) -> str:\n        \"\"\"\u041e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043a\u043d\u043e \u0448\u0430\u0431\u043b\u043e\u043d\u0430 \u043f\u043e \u043a\u043b\u0438\u043a\u0443 \u043d\u0430 \u0441\u0442\u0440\u043e\u043a\u0443 \u0442\u0430\u0431\u043b\u0438\u0446\u044b.\n\n        Args:\n            row_index: \u0418\u043d\u0434\u0435\u043a\u0441 \u0441\u0442\u0440\u043e\u043a\u0438 \u0434\u043b\u044f \u043a\u043b\u0438\u043a\u0430 (\u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e 0 - \u043f\u0435\u0440\u0432\u0430\u044f \u0441\u0442\u0440\u043e\u043a\u0430).\n\n        Returns:\n            str: \u0418\u043c\u044f \u0448\u0430\u0431\u043b\u043e\u043d\u0430.\n        \"\"\"\n        row_locator = self.ztp_templates_table.get_row_locator(\n            TableLocators.TABLE_WORK_AREA, row_index\n        )\n        row_locator.click()\n\n        # \u0421\u043e\u0437\u0434\u0430\u0435\u043c \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0439 \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430 \u0434\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430\n        temp_modal = ViewTemplateModalWindow(self.page, \"\")\n        template_name = temp_modal.toolbar.get_toolbar_title_text(\n            ModalWindowLocators.MODAL_WINDOW_TITLE\n        )\n\n        # \u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043a\u043d\u043e \u0432 \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u044e \u043f\u043e\u0441\u043b\u0435 \u043e\u0442\u043a\u0440\u044b\u0442\u0438\u044f\n        self.add_modal_window(template_name)\n        return template_name\n\n    def close_modal_window_by_toolbar_button(self, title: str) -> None:\n        \"\"\"\u0417\u0430\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043a\u043d\u043e \u0447\u0435\u0440\u0435\u0437 \u043a\u043d\u043e\u043f\u043a\u0443 \u0432 \u0442\u0443\u043b\u0431\u0430\u0440\u0435.\n\n        Args:\n            title: \u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a \u043e\u043a\u043d\u0430.\n        \"\"\"\n        modal_window = self.get_modal_window(title)\n        modal_window.click_toolbar_close_button()\n        self.delete_modal_window(title)\n\n    def get_rows_count(self) -> int:\n        \"\"\"\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0441\u0442\u0440\u043e\u043a \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435 (\u0431\u0435\u0437 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430).\n\n        Returns:\n            int: \u041a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0441\u0442\u0440\u043e\u043a \u0441 \u0434\u0430\u043d\u043d\u044b\u043c\u0438.\n\n        Raises:\n            AssertionError: \u0415\u0441\u043b\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u043f\u0443\u0441\u0442\u0430.\n        \"\"\"\n        return self.ztp_templates_table.get_rows_count(TableLocators.TABLE_WORK_AREA)\n\n    def scroll_templates_table_up(self) -> None:\n        \"\"\"\u041f\u0440\u043e\u043a\u0440\u0443\u0447\u0438\u0432\u0430\u0435\u0442 \u0442\u0430\u0431\u043b\u0438\u0446\u0443 \u0448\u0430\u0431\u043b\u043e\u043d\u043e\u0432 \u0432\u0432\u0435\u0440\u0445.\"\"\"\n        self.ztp_templates_table.scroll_up(TableLocators.TABLE_SCROLL_CONTAINER)\n\n    def scroll_templates_table_down(self) -> None:\n        \"\"\"\u041f\u0440\u043e\u043a\u0440\u0443\u0447\u0438\u0432\u0430\u0435\u0442 \u0442\u0430\u0431\u043b\u0438\u0446\u0443 \u0448\u0430\u0431\u043b\u043e\u043d\u043e\u0432 \u0432\u043d\u0438\u0437.\"\"\"\n        self.ztp_templates_table.scroll_down(TableLocators.TABLE_SCROLL_CONTAINER)\n\n    def scroll_modal_up(self) -> None:\n        \"\"\"\u041f\u0440\u043e\u043a\u0440\u0443\u0447\u0438\u0432\u0430\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430 \u0432\u0432\u0435\u0440\u0445.\"\"\"\n        self.ztp_templates_table.scroll_up(\n            ModalWindowLocators.MODAL_WINDOW_SCROLL_CONTAINER\n        )\n\n    def scroll_modal_down(self) -> None:\n        \"\"\"\u041f\u0440\u043e\u043a\u0440\u0443\u0447\u0438\u0432\u0430\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430 \u0432\u043d\u0438\u0437.\"\"\"\n        self.ztp_templates_table.scroll_down(\n            ModalWindowLocators.MODAL_WINDOW_SCROLL_CONTAINER\n        )\n\n    def check_templates_modal_content(self, template_name: str) -> None:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0438 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0441\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430 \u0448\u0430\u0431\u043b\u043e\u043d\u0430.\n\n        Args:\n            template_name: \u0418\u043c\u044f \u0448\u0430\u0431\u043b\u043e\u043d\u0430 \u0434\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430 \u043e\u043a\u043d\u0430.\n\n        Raises:\n            AssertionError: \u0415\u0441\u043b\u0438 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u043e\u043a\u043d\u0430 \u043d\u0435\u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u044b.\n        \"\"\"\n        modal_window = self.get_modal_window(template_name)\n        modal_window.check_content()\n\n    def check_templates_table_content(self) -> None:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0448\u0430\u0431\u043b\u043e\u043d\u043e\u0432.\n\n        \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0438 \u0438 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435.\n\n        Raises:\n            AssertionError: \u0415\u0441\u043b\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u043f\u0443\u0441\u0442\u0430 \u0438\u043b\u0438 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0438 \u043d\u0435\u0432\u0435\u0440\u043d\u044b.\n        \"\"\"\n        expected_headers = [\n            '\u041f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c',\n            'vendorCode',\n            'authentication',\n            'deviceType',\n            'authenticationOption'\n        ]\n\n        self.ztp_templates_table.check_content(TableLocators.TABLE_WORK_AREA, expected_headers)\n\n    def check_templates_table_vertical_scrolling(self) -> bool:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u0439 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u044b.\n\n        Returns:\n            bool: True \u0435\u0441\u043b\u0438 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0430 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u0430, \u0438\u043d\u0430\u0447\u0435 False.\n        \"\"\"\n        return self.ztp_templates_table.is_scrollable_vertically(\n            TableLocators.TABLE_SCROLL_CONTAINER\n        )\n\n    def check_templates_table_first_row_visibility(self) -> None:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u043f\u0435\u0440\u0432\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u044b.\n\n        Raises:\n            AssertionError: \u0415\u0441\u043b\u0438 \u0441\u0442\u0440\u043e\u043a\u0430 \u043d\u0435 \u0432\u0438\u0434\u043d\u0430.\n        \"\"\"\n        self.ztp_templates_table.check_first_row_visibility(TableLocators.TABLE_WORK_AREA)\n\n    def check_templates_table_last_row_visibility(self) -> None:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0439 \u0441\u0442\u0440\u043e\u043a\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u044b.\n\n        Raises:\n            AssertionError: \u0415\u0441\u043b\u0438 \u0441\u0442\u0440\u043e\u043a\u0430 \u043d\u0435 \u0432\u0438\u0434\u043d\u0430.\n        \"\"\"\n        self.ztp_templates_table.check_last_row_visibility(TableLocators.TABLE_WORK_AREA)\n\n    def check_templates_table_row_highlighting(self, row_index: int) -> None:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u044b.\n\n        Args:\n            row_index: \u0418\u043d\u0434\u0435\u043a\u0441 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438.\n\n        Raises:\n            AssertionError: \u0415\u0441\u043b\u0438 \u0441\u0442\u0440\u043e\u043a\u0430 \u043d\u0435 \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u0430.\n        \"\"\"\n        self.ztp_templates_table.check_row_highlighting(\n            TableLocators.TABLE_WORK_AREA, row_index\n        )\n\n    def should_be_toolbar(self) -> None:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0442\u0443\u043b\u0431\u0430\u0440\u0430 \u043d\u0430 \u0432\u043a\u043b\u0430\u0434\u043a\u0435.\n\n        Raises:\n            AssertionError: \u0415\u0441\u043b\u0438 \u0442\u0443\u043b\u0431\u0430\u0440 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442.\n        \"\"\"\n        self.toolbar.check_toolbar_presence(\"Toolbar is missing\")\n\n    def should_be_templates_table(self) -> None:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0448\u0430\u0431\u043b\u043e\u043d\u043e\u0432.\n\n        Raises:\n            AssertionError: \u0415\u0441\u043b\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442.\n        \"\"\"\n        self.ztp_templates_table.check_visibility(\n            TableLocators.TABLE_WORK_AREA, \"Templates table is missing\"\n        )\n\n    def should_be_modal_window(self) -> None:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430.\n\n        Raises:\n            AssertionError: \u0415\u0441\u043b\u0438 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043a\u043d\u043e \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442.\n        \"\"\"\n        self.ztp_templates_table.check_visibility(\n            ModalWindowLocators.MODAL_WINDOW, \"Modal window is not visible\"\n        )\n\n    def should_not_be_modal_window(self) -> None:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442, \u0447\u0442\u043e \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043a\u043d\u043e \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442.\n\n        Raises:\n            AssertionError: \u0415\u0441\u043b\u0438 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043a\u043d\u043e \u0432\u0441\u0435 \u0435\u0449\u0435 \u0432\u0438\u0434\u043d\u043e.\n        \"\"\"\n        is_visible = self.page.locator(\n            ModalWindowLocators.MODAL_WINDOW\n        ).is_visible(timeout=1000)\n        if is_visible:\n            assert False, \"Modal window should not be visible\"\n\n    def check_modal_vertical_scrolling(self) -> bool:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0441\u043a\u0440\u043e\u043b\u043b\u0438\u043d\u0433\u0430 \u0432 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u043c \u043e\u043a\u043d\u0435.\n\n        Returns:\n            bool: True \u0435\u0441\u043b\u0438 \u0441\u043a\u0440\u043e\u043b\u043b\u0438\u043d\u0433 \u0432\u043e\u0437\u043c\u043e\u0436\u0435\u043d, \u0438\u043d\u0430\u0447\u0435 False.\n        \"\"\"\n        return self.ztp_templates_table.is_scrollable_vertically(\n            ModalWindowLocators.MODAL_WINDOW_SCROLL_CONTAINER\n        )\n\n    def verify_template_data_with_api(self, template_name: str) -> None:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430 \u0434\u0430\u043d\u043d\u044b\u043c \u0438\u0437 API.\n\n        \u041f\u0440\u043e\u0446\u0435\u0441\u0441 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438:\n        1. \u041f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043a\u043d\u043e \u043f\u043e \u0438\u043c\u0435\u043d\u0438 \u0448\u0430\u0431\u043b\u043e\u043d\u0430\n        2. \u0418\u0437\u0432\u043b\u0435\u043a\u0430\u0435\u0442 \u0434\u0430\u043d\u043d\u044b\u0435 \u0438\u0437 \u043f\u043e\u043b\u0435\u0439 \u0432\u0432\u043e\u0434\u0430 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430\n        3. \u041e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 API \u0437\u0430\u043f\u0440\u043e\u0441 \u0434\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u044d\u0442\u0430\u043b\u043e\u043d\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u0448\u0430\u0431\u043b\u043e\u043d\u0430\n        4. \u0421\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u0435\u0442 \u0434\u0430\u043d\u043d\u044b\u0435 \u0438\u0437 UI \u0441 \u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u0438\u0437 API\n        5. \u0412\u044b\u0431\u0440\u0430\u0441\u044b\u0432\u0430\u0435\u0442 assertion \u043f\u0440\u0438 \u043e\u0431\u043d\u0430\u0440\u0443\u0436\u0435\u043d\u0438\u0438 \u0440\u0430\u0441\u0445\u043e\u0436\u0434\u0435\u043d\u0438\u0439\n\n        Args:\n            template_name: \u0418\u043c\u044f \u0448\u0430\u0431\u043b\u043e\u043d\u0430 \u0434\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 (\u0434\u043e\u043b\u0436\u043d\u043e \u0441\u043e\u0432\u043f\u0430\u0434\u0430\u0442\u044c \u0441 id \u0432 API).\n\n        Raises:\n            AssertionError: \u0415\u0441\u043b\u0438:\n                - \u041c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043a\u043d\u043e \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u043e\n                - API \u0437\u0430\u043f\u0440\u043e\u0441 \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u043b\u0441\u044f \u0441 \u043e\u0448\u0438\u0431\u043a\u043e\u0439 (status != 200)\n                - \u041e\u0431\u043d\u0430\u0440\u0443\u0436\u0435\u043d\u044b \u0440\u0430\u0441\u0445\u043e\u0436\u0434\u0435\u043d\u0438\u044f \u043c\u0435\u0436\u0434\u0443 \u0434\u0430\u043d\u043d\u044b\u043c\u0438 UI \u0438 API\n                - \u0418\u043c\u044f \u0448\u0430\u0431\u043b\u043e\u043d\u0430 \u0432 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u043c \u043e\u043a\u043d\u0435 \u043d\u0435 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u043e\u0436\u0438\u0434\u0430\u0435\u043c\u043e\u043c\u0443\n        \"\"\"\n        # \u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043a\u043d\u043e\n        modal_window = self.get_modal_window(template_name)\n\n        # \u0427\u0438\u0442\u0430\u0435\u043c \u0434\u0430\u043d\u043d\u044b\u0435 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430 (\u043c\u0435\u0442\u043e\u0434 \u0442\u0435\u043f\u0435\u0440\u044c \u0432 ViewTemplateModalWindow)\n        actual_data = modal_window.get_modal_window_data()\n\n        # \u0427\u0438\u0442\u0430\u0435\u043c \u0434\u0430\u043d\u043d\u044b\u0435 \u0438\u0437 API\n        encoded_template_name = template_name.replace(\" \", \"%20\")\n        url = f\"e-nms/DHCP/showOptPattern?template={encoded_template_name}\"\n        response = self.send_get_api_request(url)\n\n        # \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u0441\u0442\u0430\u0442\u0443\u0441 \u043e\u0442\u0432\u0435\u0442\u0430\n        if response.status != 200:\n            logger.error(\"API request failed with status: %s\", response.status)\n            assert False, f\"API request failed with status: {response.status}\"\n\n        # \u0418\u0437\u0432\u043b\u0435\u043a\u0430\u0435\u043c \u0434\u0430\u043d\u043d\u044b\u0435 \u0438\u0437 \u043e\u0442\u0432\u0435\u0442\u0430\n        response_data = response.json()\n        template_data = response_data['data']\n\n        # \u0421\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u0435\u043c actual_data \u0441 \u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0433\u043e \u0448\u0430\u0431\u043b\u043e\u043d\u0430 (\u043c\u0435\u0442\u043e\u0434 \u0442\u0435\u043f\u0435\u0440\u044c \u0432 ViewTemplateModalWindow)\n        modal_window.compare_modal_with_api_data(actual_data, template_data, template_name)\n
    "},{"location":"pages/ztp_templates_tab/#pages.ztp_templates_tab.ZTPTemplatesTab.__init__","title":"__init__(page)","text":"

    \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u044b \u0432\u043a\u043b\u0430\u0434\u043a\u0438 '\u0428\u0430\u0431\u043b\u043e\u043d\u044b'.

    Source code in pages\\ztp_templates_tab.py
    def __init__(self, page: Page) -> None:\n    \"\"\"\u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u044b \u0432\u043a\u043b\u0430\u0434\u043a\u0438 '\u0428\u0430\u0431\u043b\u043e\u043d\u044b'.\"\"\"\n    super().__init__(page)\n\n    self.toolbar = ToolbarComponent(page, \"\u0428\u0430\u0431\u043b\u043e\u043d\u044b\")\n    self.ztp_templates_table = TableComponent(page)\n    self.modal_windows = {}\n
    "},{"location":"pages/ztp_templates_tab/#pages.ztp_templates_tab.ZTPTemplatesTab.add_modal_window","title":"add_modal_window(title)","text":"

    \u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043a\u043d\u043e \u0432 \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u044e.

    Parameters:

    Name Type Description Default title str

    \u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a \u043e\u043a\u043d\u0430.

    required Source code in pages\\ztp_templates_tab.py
    def add_modal_window(self, title: str) -> None:\n    \"\"\"\u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043a\u043d\u043e \u0432 \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u044e.\n\n    Args:\n        title: \u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a \u043e\u043a\u043d\u0430.\n    \"\"\"\n    self.modal_windows[title] = ViewTemplateModalWindow(self.page, title)\n
    "},{"location":"pages/ztp_templates_tab/#pages.ztp_templates_tab.ZTPTemplatesTab.check_modal_vertical_scrolling","title":"check_modal_vertical_scrolling()","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0441\u043a\u0440\u043e\u043b\u043b\u0438\u043d\u0433\u0430 \u0432 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u043c \u043e\u043a\u043d\u0435.

    Returns:

    Name Type Description bool bool

    True \u0435\u0441\u043b\u0438 \u0441\u043a\u0440\u043e\u043b\u043b\u0438\u043d\u0433 \u0432\u043e\u0437\u043c\u043e\u0436\u0435\u043d, \u0438\u043d\u0430\u0447\u0435 False.

    Source code in pages\\ztp_templates_tab.py
    def check_modal_vertical_scrolling(self) -> bool:\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0441\u043a\u0440\u043e\u043b\u043b\u0438\u043d\u0433\u0430 \u0432 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u043c \u043e\u043a\u043d\u0435.\n\n    Returns:\n        bool: True \u0435\u0441\u043b\u0438 \u0441\u043a\u0440\u043e\u043b\u043b\u0438\u043d\u0433 \u0432\u043e\u0437\u043c\u043e\u0436\u0435\u043d, \u0438\u043d\u0430\u0447\u0435 False.\n    \"\"\"\n    return self.ztp_templates_table.is_scrollable_vertically(\n        ModalWindowLocators.MODAL_WINDOW_SCROLL_CONTAINER\n    )\n
    "},{"location":"pages/ztp_templates_tab/#pages.ztp_templates_tab.ZTPTemplatesTab.check_templates_modal_content","title":"check_templates_modal_content(template_name)","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0438 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0441\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430 \u0448\u0430\u0431\u043b\u043e\u043d\u0430.

    Parameters:

    Name Type Description Default template_name str

    \u0418\u043c\u044f \u0448\u0430\u0431\u043b\u043e\u043d\u0430 \u0434\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430 \u043e\u043a\u043d\u0430.

    required

    Raises:

    Type Description AssertionError

    \u0415\u0441\u043b\u0438 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u043e\u043a\u043d\u0430 \u043d\u0435\u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u044b.

    Source code in pages\\ztp_templates_tab.py
    def check_templates_modal_content(self, template_name: str) -> None:\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0438 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0441\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430 \u0448\u0430\u0431\u043b\u043e\u043d\u0430.\n\n    Args:\n        template_name: \u0418\u043c\u044f \u0448\u0430\u0431\u043b\u043e\u043d\u0430 \u0434\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430 \u043e\u043a\u043d\u0430.\n\n    Raises:\n        AssertionError: \u0415\u0441\u043b\u0438 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u043e\u043a\u043d\u0430 \u043d\u0435\u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u044b.\n    \"\"\"\n    modal_window = self.get_modal_window(template_name)\n    modal_window.check_content()\n
    "},{"location":"pages/ztp_templates_tab/#pages.ztp_templates_tab.ZTPTemplatesTab.check_templates_table_content","title":"check_templates_table_content()","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0448\u0430\u0431\u043b\u043e\u043d\u043e\u0432.

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0438 \u0438 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435.

    Raises:

    Type Description AssertionError

    \u0415\u0441\u043b\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u043f\u0443\u0441\u0442\u0430 \u0438\u043b\u0438 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0438 \u043d\u0435\u0432\u0435\u0440\u043d\u044b.

    Source code in pages\\ztp_templates_tab.py
    def check_templates_table_content(self) -> None:\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0448\u0430\u0431\u043b\u043e\u043d\u043e\u0432.\n\n    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0438 \u0438 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435.\n\n    Raises:\n        AssertionError: \u0415\u0441\u043b\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u043f\u0443\u0441\u0442\u0430 \u0438\u043b\u0438 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0438 \u043d\u0435\u0432\u0435\u0440\u043d\u044b.\n    \"\"\"\n    expected_headers = [\n        '\u041f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c',\n        'vendorCode',\n        'authentication',\n        'deviceType',\n        'authenticationOption'\n    ]\n\n    self.ztp_templates_table.check_content(TableLocators.TABLE_WORK_AREA, expected_headers)\n
    "},{"location":"pages/ztp_templates_tab/#pages.ztp_templates_tab.ZTPTemplatesTab.check_templates_table_first_row_visibility","title":"check_templates_table_first_row_visibility()","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u043f\u0435\u0440\u0432\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u044b.

    Raises:

    Type Description AssertionError

    \u0415\u0441\u043b\u0438 \u0441\u0442\u0440\u043e\u043a\u0430 \u043d\u0435 \u0432\u0438\u0434\u043d\u0430.

    Source code in pages\\ztp_templates_tab.py
    def check_templates_table_first_row_visibility(self) -> None:\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u043f\u0435\u0440\u0432\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u044b.\n\n    Raises:\n        AssertionError: \u0415\u0441\u043b\u0438 \u0441\u0442\u0440\u043e\u043a\u0430 \u043d\u0435 \u0432\u0438\u0434\u043d\u0430.\n    \"\"\"\n    self.ztp_templates_table.check_first_row_visibility(TableLocators.TABLE_WORK_AREA)\n
    "},{"location":"pages/ztp_templates_tab/#pages.ztp_templates_tab.ZTPTemplatesTab.check_templates_table_last_row_visibility","title":"check_templates_table_last_row_visibility()","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0439 \u0441\u0442\u0440\u043e\u043a\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u044b.

    Raises:

    Type Description AssertionError

    \u0415\u0441\u043b\u0438 \u0441\u0442\u0440\u043e\u043a\u0430 \u043d\u0435 \u0432\u0438\u0434\u043d\u0430.

    Source code in pages\\ztp_templates_tab.py
    def check_templates_table_last_row_visibility(self) -> None:\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0439 \u0441\u0442\u0440\u043e\u043a\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u044b.\n\n    Raises:\n        AssertionError: \u0415\u0441\u043b\u0438 \u0441\u0442\u0440\u043e\u043a\u0430 \u043d\u0435 \u0432\u0438\u0434\u043d\u0430.\n    \"\"\"\n    self.ztp_templates_table.check_last_row_visibility(TableLocators.TABLE_WORK_AREA)\n
    "},{"location":"pages/ztp_templates_tab/#pages.ztp_templates_tab.ZTPTemplatesTab.check_templates_table_row_highlighting","title":"check_templates_table_row_highlighting(row_index)","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u044b.

    Parameters:

    Name Type Description Default row_index int

    \u0418\u043d\u0434\u0435\u043a\u0441 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438.

    required

    Raises:

    Type Description AssertionError

    \u0415\u0441\u043b\u0438 \u0441\u0442\u0440\u043e\u043a\u0430 \u043d\u0435 \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u0430.

    Source code in pages\\ztp_templates_tab.py
    def check_templates_table_row_highlighting(self, row_index: int) -> None:\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u044b.\n\n    Args:\n        row_index: \u0418\u043d\u0434\u0435\u043a\u0441 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438.\n\n    Raises:\n        AssertionError: \u0415\u0441\u043b\u0438 \u0441\u0442\u0440\u043e\u043a\u0430 \u043d\u0435 \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u0430.\n    \"\"\"\n    self.ztp_templates_table.check_row_highlighting(\n        TableLocators.TABLE_WORK_AREA, row_index\n    )\n
    "},{"location":"pages/ztp_templates_tab/#pages.ztp_templates_tab.ZTPTemplatesTab.check_templates_table_vertical_scrolling","title":"check_templates_table_vertical_scrolling()","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u0439 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u044b.

    Returns:

    Name Type Description bool bool

    True \u0435\u0441\u043b\u0438 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0430 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u0430, \u0438\u043d\u0430\u0447\u0435 False.

    Source code in pages\\ztp_templates_tab.py
    def check_templates_table_vertical_scrolling(self) -> bool:\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u0439 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u044b.\n\n    Returns:\n        bool: True \u0435\u0441\u043b\u0438 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0430 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u0430, \u0438\u043d\u0430\u0447\u0435 False.\n    \"\"\"\n    return self.ztp_templates_table.is_scrollable_vertically(\n        TableLocators.TABLE_SCROLL_CONTAINER\n    )\n
    "},{"location":"pages/ztp_templates_tab/#pages.ztp_templates_tab.ZTPTemplatesTab.close_modal_window_by_toolbar_button","title":"close_modal_window_by_toolbar_button(title)","text":"

    \u0417\u0430\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043a\u043d\u043e \u0447\u0435\u0440\u0435\u0437 \u043a\u043d\u043e\u043f\u043a\u0443 \u0432 \u0442\u0443\u043b\u0431\u0430\u0440\u0435.

    Parameters:

    Name Type Description Default title str

    \u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a \u043e\u043a\u043d\u0430.

    required Source code in pages\\ztp_templates_tab.py
    def close_modal_window_by_toolbar_button(self, title: str) -> None:\n    \"\"\"\u0417\u0430\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043a\u043d\u043e \u0447\u0435\u0440\u0435\u0437 \u043a\u043d\u043e\u043f\u043a\u0443 \u0432 \u0442\u0443\u043b\u0431\u0430\u0440\u0435.\n\n    Args:\n        title: \u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a \u043e\u043a\u043d\u0430.\n    \"\"\"\n    modal_window = self.get_modal_window(title)\n    modal_window.click_toolbar_close_button()\n    self.delete_modal_window(title)\n
    "},{"location":"pages/ztp_templates_tab/#pages.ztp_templates_tab.ZTPTemplatesTab.delete_modal_window","title":"delete_modal_window(title)","text":"

    \u0423\u0434\u0430\u043b\u044f\u0435\u0442 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043a\u043d\u043e \u0438\u0437 \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u0438.

    Parameters:

    Name Type Description Default title str

    \u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a \u043e\u043a\u043d\u0430.

    required

    Raises:

    Type Description AssertionError

    \u0415\u0441\u043b\u0438 \u043e\u043a\u043d\u043e \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u043e.

    Source code in pages\\ztp_templates_tab.py
    def delete_modal_window(self, title: str) -> None:\n    \"\"\"\u0423\u0434\u0430\u043b\u044f\u0435\u0442 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043a\u043d\u043e \u0438\u0437 \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u0438.\n\n    Args:\n        title: \u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a \u043e\u043a\u043d\u0430.\n\n    Raises:\n        AssertionError: \u0415\u0441\u043b\u0438 \u043e\u043a\u043d\u043e \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u043e.\n    \"\"\"\n    if self.modal_windows.get(title) is None:\n        assert False, f\"Modal window with title '{title}' not found\"\n    self.modal_windows[title] = None\n
    "},{"location":"pages/ztp_templates_tab/#pages.ztp_templates_tab.ZTPTemplatesTab.get_modal_window","title":"get_modal_window(title)","text":"

    \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043a\u043d\u043e \u043f\u043e \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0443.

    Parameters:

    Name Type Description Default title str

    \u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a \u043e\u043a\u043d\u0430.

    required

    Returns:

    Name Type Description ViewTemplateModalWindow ViewTemplateModalWindow

    \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430 \u0448\u0430\u0431\u043b\u043e\u043d\u0430.

    Raises:

    Type Description AssertionError

    \u0415\u0441\u043b\u0438 \u043e\u043a\u043d\u043e \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u043e.

    Source code in pages\\ztp_templates_tab.py
    def get_modal_window(self, title: str) -> ViewTemplateModalWindow:\n    \"\"\"\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043a\u043d\u043e \u043f\u043e \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0443.\n\n    Args:\n        title: \u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a \u043e\u043a\u043d\u0430.\n\n    Returns:\n        ViewTemplateModalWindow: \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430 \u0448\u0430\u0431\u043b\u043e\u043d\u0430.\n\n    Raises:\n        AssertionError: \u0415\u0441\u043b\u0438 \u043e\u043a\u043d\u043e \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u043e.\n    \"\"\"\n    modal_window = self.modal_windows.get(title)\n\n    if modal_window is None:\n        assert False, f\"Modal window with title '{title}' not found\"\n    return modal_window\n
    "},{"location":"pages/ztp_templates_tab/#pages.ztp_templates_tab.ZTPTemplatesTab.get_rows_count","title":"get_rows_count()","text":"

    \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0441\u0442\u0440\u043e\u043a \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435 (\u0431\u0435\u0437 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430).

    Returns:

    Name Type Description int int

    \u041a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0441\u0442\u0440\u043e\u043a \u0441 \u0434\u0430\u043d\u043d\u044b\u043c\u0438.

    Raises:

    Type Description AssertionError

    \u0415\u0441\u043b\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u043f\u0443\u0441\u0442\u0430.

    Source code in pages\\ztp_templates_tab.py
    def get_rows_count(self) -> int:\n    \"\"\"\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0441\u0442\u0440\u043e\u043a \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435 (\u0431\u0435\u0437 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430).\n\n    Returns:\n        int: \u041a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0441\u0442\u0440\u043e\u043a \u0441 \u0434\u0430\u043d\u043d\u044b\u043c\u0438.\n\n    Raises:\n        AssertionError: \u0415\u0441\u043b\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u043f\u0443\u0441\u0442\u0430.\n    \"\"\"\n    return self.ztp_templates_table.get_rows_count(TableLocators.TABLE_WORK_AREA)\n
    "},{"location":"pages/ztp_templates_tab/#pages.ztp_templates_tab.ZTPTemplatesTab.open_template_modal_by_index","title":"open_template_modal_by_index(row_index=0)","text":"

    \u041e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043a\u043d\u043e \u0448\u0430\u0431\u043b\u043e\u043d\u0430 \u043f\u043e \u043a\u043b\u0438\u043a\u0443 \u043d\u0430 \u0441\u0442\u0440\u043e\u043a\u0443 \u0442\u0430\u0431\u043b\u0438\u0446\u044b.

    Parameters:

    Name Type Description Default row_index int

    \u0418\u043d\u0434\u0435\u043a\u0441 \u0441\u0442\u0440\u043e\u043a\u0438 \u0434\u043b\u044f \u043a\u043b\u0438\u043a\u0430 (\u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e 0 - \u043f\u0435\u0440\u0432\u0430\u044f \u0441\u0442\u0440\u043e\u043a\u0430).

    0

    Returns:

    Name Type Description str str

    \u0418\u043c\u044f \u0448\u0430\u0431\u043b\u043e\u043d\u0430.

    Source code in pages\\ztp_templates_tab.py
    def open_template_modal_by_index(self, row_index: int = 0) -> str:\n    \"\"\"\u041e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043a\u043d\u043e \u0448\u0430\u0431\u043b\u043e\u043d\u0430 \u043f\u043e \u043a\u043b\u0438\u043a\u0443 \u043d\u0430 \u0441\u0442\u0440\u043e\u043a\u0443 \u0442\u0430\u0431\u043b\u0438\u0446\u044b.\n\n    Args:\n        row_index: \u0418\u043d\u0434\u0435\u043a\u0441 \u0441\u0442\u0440\u043e\u043a\u0438 \u0434\u043b\u044f \u043a\u043b\u0438\u043a\u0430 (\u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e 0 - \u043f\u0435\u0440\u0432\u0430\u044f \u0441\u0442\u0440\u043e\u043a\u0430).\n\n    Returns:\n        str: \u0418\u043c\u044f \u0448\u0430\u0431\u043b\u043e\u043d\u0430.\n    \"\"\"\n    row_locator = self.ztp_templates_table.get_row_locator(\n        TableLocators.TABLE_WORK_AREA, row_index\n    )\n    row_locator.click()\n\n    # \u0421\u043e\u0437\u0434\u0430\u0435\u043c \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0439 \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430 \u0434\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430\n    temp_modal = ViewTemplateModalWindow(self.page, \"\")\n    template_name = temp_modal.toolbar.get_toolbar_title_text(\n        ModalWindowLocators.MODAL_WINDOW_TITLE\n    )\n\n    # \u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043a\u043d\u043e \u0432 \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u044e \u043f\u043e\u0441\u043b\u0435 \u043e\u0442\u043a\u0440\u044b\u0442\u0438\u044f\n    self.add_modal_window(template_name)\n    return template_name\n
    "},{"location":"pages/ztp_templates_tab/#pages.ztp_templates_tab.ZTPTemplatesTab.scroll_modal_down","title":"scroll_modal_down()","text":"

    \u041f\u0440\u043e\u043a\u0440\u0443\u0447\u0438\u0432\u0430\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430 \u0432\u043d\u0438\u0437.

    Source code in pages\\ztp_templates_tab.py
    def scroll_modal_down(self) -> None:\n    \"\"\"\u041f\u0440\u043e\u043a\u0440\u0443\u0447\u0438\u0432\u0430\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430 \u0432\u043d\u0438\u0437.\"\"\"\n    self.ztp_templates_table.scroll_down(\n        ModalWindowLocators.MODAL_WINDOW_SCROLL_CONTAINER\n    )\n
    "},{"location":"pages/ztp_templates_tab/#pages.ztp_templates_tab.ZTPTemplatesTab.scroll_modal_up","title":"scroll_modal_up()","text":"

    \u041f\u0440\u043e\u043a\u0440\u0443\u0447\u0438\u0432\u0430\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430 \u0432\u0432\u0435\u0440\u0445.

    Source code in pages\\ztp_templates_tab.py
    def scroll_modal_up(self) -> None:\n    \"\"\"\u041f\u0440\u043e\u043a\u0440\u0443\u0447\u0438\u0432\u0430\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430 \u0432\u0432\u0435\u0440\u0445.\"\"\"\n    self.ztp_templates_table.scroll_up(\n        ModalWindowLocators.MODAL_WINDOW_SCROLL_CONTAINER\n    )\n
    "},{"location":"pages/ztp_templates_tab/#pages.ztp_templates_tab.ZTPTemplatesTab.scroll_templates_table_down","title":"scroll_templates_table_down()","text":"

    \u041f\u0440\u043e\u043a\u0440\u0443\u0447\u0438\u0432\u0430\u0435\u0442 \u0442\u0430\u0431\u043b\u0438\u0446\u0443 \u0448\u0430\u0431\u043b\u043e\u043d\u043e\u0432 \u0432\u043d\u0438\u0437.

    Source code in pages\\ztp_templates_tab.py
    def scroll_templates_table_down(self) -> None:\n    \"\"\"\u041f\u0440\u043e\u043a\u0440\u0443\u0447\u0438\u0432\u0430\u0435\u0442 \u0442\u0430\u0431\u043b\u0438\u0446\u0443 \u0448\u0430\u0431\u043b\u043e\u043d\u043e\u0432 \u0432\u043d\u0438\u0437.\"\"\"\n    self.ztp_templates_table.scroll_down(TableLocators.TABLE_SCROLL_CONTAINER)\n
    "},{"location":"pages/ztp_templates_tab/#pages.ztp_templates_tab.ZTPTemplatesTab.scroll_templates_table_up","title":"scroll_templates_table_up()","text":"

    \u041f\u0440\u043e\u043a\u0440\u0443\u0447\u0438\u0432\u0430\u0435\u0442 \u0442\u0430\u0431\u043b\u0438\u0446\u0443 \u0448\u0430\u0431\u043b\u043e\u043d\u043e\u0432 \u0432\u0432\u0435\u0440\u0445.

    Source code in pages\\ztp_templates_tab.py
    def scroll_templates_table_up(self) -> None:\n    \"\"\"\u041f\u0440\u043e\u043a\u0440\u0443\u0447\u0438\u0432\u0430\u0435\u0442 \u0442\u0430\u0431\u043b\u0438\u0446\u0443 \u0448\u0430\u0431\u043b\u043e\u043d\u043e\u0432 \u0432\u0432\u0435\u0440\u0445.\"\"\"\n    self.ztp_templates_table.scroll_up(TableLocators.TABLE_SCROLL_CONTAINER)\n
    "},{"location":"pages/ztp_templates_tab/#pages.ztp_templates_tab.ZTPTemplatesTab.should_be_modal_window","title":"should_be_modal_window()","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430.

    Raises:

    Type Description AssertionError

    \u0415\u0441\u043b\u0438 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043a\u043d\u043e \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442.

    Source code in pages\\ztp_templates_tab.py
    def should_be_modal_window(self) -> None:\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430.\n\n    Raises:\n        AssertionError: \u0415\u0441\u043b\u0438 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043a\u043d\u043e \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442.\n    \"\"\"\n    self.ztp_templates_table.check_visibility(\n        ModalWindowLocators.MODAL_WINDOW, \"Modal window is not visible\"\n    )\n
    "},{"location":"pages/ztp_templates_tab/#pages.ztp_templates_tab.ZTPTemplatesTab.should_be_templates_table","title":"should_be_templates_table()","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0448\u0430\u0431\u043b\u043e\u043d\u043e\u0432.

    Raises:

    Type Description AssertionError

    \u0415\u0441\u043b\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442.

    Source code in pages\\ztp_templates_tab.py
    def should_be_templates_table(self) -> None:\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0448\u0430\u0431\u043b\u043e\u043d\u043e\u0432.\n\n    Raises:\n        AssertionError: \u0415\u0441\u043b\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442.\n    \"\"\"\n    self.ztp_templates_table.check_visibility(\n        TableLocators.TABLE_WORK_AREA, \"Templates table is missing\"\n    )\n
    "},{"location":"pages/ztp_templates_tab/#pages.ztp_templates_tab.ZTPTemplatesTab.should_be_toolbar","title":"should_be_toolbar()","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0442\u0443\u043b\u0431\u0430\u0440\u0430 \u043d\u0430 \u0432\u043a\u043b\u0430\u0434\u043a\u0435.

    Raises:

    Type Description AssertionError

    \u0415\u0441\u043b\u0438 \u0442\u0443\u043b\u0431\u0430\u0440 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442.

    Source code in pages\\ztp_templates_tab.py
    def should_be_toolbar(self) -> None:\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0442\u0443\u043b\u0431\u0430\u0440\u0430 \u043d\u0430 \u0432\u043a\u043b\u0430\u0434\u043a\u0435.\n\n    Raises:\n        AssertionError: \u0415\u0441\u043b\u0438 \u0442\u0443\u043b\u0431\u0430\u0440 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442.\n    \"\"\"\n    self.toolbar.check_toolbar_presence(\"Toolbar is missing\")\n
    "},{"location":"pages/ztp_templates_tab/#pages.ztp_templates_tab.ZTPTemplatesTab.should_not_be_modal_window","title":"should_not_be_modal_window()","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442, \u0447\u0442\u043e \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043a\u043d\u043e \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442.

    Raises:

    Type Description AssertionError

    \u0415\u0441\u043b\u0438 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043a\u043d\u043e \u0432\u0441\u0435 \u0435\u0449\u0435 \u0432\u0438\u0434\u043d\u043e.

    Source code in pages\\ztp_templates_tab.py
    def should_not_be_modal_window(self) -> None:\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442, \u0447\u0442\u043e \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043a\u043d\u043e \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442.\n\n    Raises:\n        AssertionError: \u0415\u0441\u043b\u0438 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043a\u043d\u043e \u0432\u0441\u0435 \u0435\u0449\u0435 \u0432\u0438\u0434\u043d\u043e.\n    \"\"\"\n    is_visible = self.page.locator(\n        ModalWindowLocators.MODAL_WINDOW\n    ).is_visible(timeout=1000)\n    if is_visible:\n        assert False, \"Modal window should not be visible\"\n
    "},{"location":"pages/ztp_templates_tab/#pages.ztp_templates_tab.ZTPTemplatesTab.verify_template_data_with_api","title":"verify_template_data_with_api(template_name)","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430 \u0434\u0430\u043d\u043d\u044b\u043c \u0438\u0437 API.

    \u041f\u0440\u043e\u0446\u0435\u0441\u0441 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438: 1. \u041f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043a\u043d\u043e \u043f\u043e \u0438\u043c\u0435\u043d\u0438 \u0448\u0430\u0431\u043b\u043e\u043d\u0430 2. \u0418\u0437\u0432\u043b\u0435\u043a\u0430\u0435\u0442 \u0434\u0430\u043d\u043d\u044b\u0435 \u0438\u0437 \u043f\u043e\u043b\u0435\u0439 \u0432\u0432\u043e\u0434\u0430 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430 3. \u041e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 API \u0437\u0430\u043f\u0440\u043e\u0441 \u0434\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u044d\u0442\u0430\u043b\u043e\u043d\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u0448\u0430\u0431\u043b\u043e\u043d\u0430 4. \u0421\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u0435\u0442 \u0434\u0430\u043d\u043d\u044b\u0435 \u0438\u0437 UI \u0441 \u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u0438\u0437 API 5. \u0412\u044b\u0431\u0440\u0430\u0441\u044b\u0432\u0430\u0435\u0442 assertion \u043f\u0440\u0438 \u043e\u0431\u043d\u0430\u0440\u0443\u0436\u0435\u043d\u0438\u0438 \u0440\u0430\u0441\u0445\u043e\u0436\u0434\u0435\u043d\u0438\u0439

    Parameters:

    Name Type Description Default template_name str

    \u0418\u043c\u044f \u0448\u0430\u0431\u043b\u043e\u043d\u0430 \u0434\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 (\u0434\u043e\u043b\u0436\u043d\u043e \u0441\u043e\u0432\u043f\u0430\u0434\u0430\u0442\u044c \u0441 id \u0432 API).

    required

    Raises:

    Type Description AssertionError

    \u0415\u0441\u043b\u0438: - \u041c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043a\u043d\u043e \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u043e - API \u0437\u0430\u043f\u0440\u043e\u0441 \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u043b\u0441\u044f \u0441 \u043e\u0448\u0438\u0431\u043a\u043e\u0439 (status != 200) - \u041e\u0431\u043d\u0430\u0440\u0443\u0436\u0435\u043d\u044b \u0440\u0430\u0441\u0445\u043e\u0436\u0434\u0435\u043d\u0438\u044f \u043c\u0435\u0436\u0434\u0443 \u0434\u0430\u043d\u043d\u044b\u043c\u0438 UI \u0438 API - \u0418\u043c\u044f \u0448\u0430\u0431\u043b\u043e\u043d\u0430 \u0432 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u043c \u043e\u043a\u043d\u0435 \u043d\u0435 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u043e\u0436\u0438\u0434\u0430\u0435\u043c\u043e\u043c\u0443

    Source code in pages\\ztp_templates_tab.py
    def verify_template_data_with_api(self, template_name: str) -> None:\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430 \u0434\u0430\u043d\u043d\u044b\u043c \u0438\u0437 API.\n\n    \u041f\u0440\u043e\u0446\u0435\u0441\u0441 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438:\n    1. \u041f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043a\u043d\u043e \u043f\u043e \u0438\u043c\u0435\u043d\u0438 \u0448\u0430\u0431\u043b\u043e\u043d\u0430\n    2. \u0418\u0437\u0432\u043b\u0435\u043a\u0430\u0435\u0442 \u0434\u0430\u043d\u043d\u044b\u0435 \u0438\u0437 \u043f\u043e\u043b\u0435\u0439 \u0432\u0432\u043e\u0434\u0430 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430\n    3. \u041e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 API \u0437\u0430\u043f\u0440\u043e\u0441 \u0434\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u044d\u0442\u0430\u043b\u043e\u043d\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u0448\u0430\u0431\u043b\u043e\u043d\u0430\n    4. \u0421\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u0435\u0442 \u0434\u0430\u043d\u043d\u044b\u0435 \u0438\u0437 UI \u0441 \u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u0438\u0437 API\n    5. \u0412\u044b\u0431\u0440\u0430\u0441\u044b\u0432\u0430\u0435\u0442 assertion \u043f\u0440\u0438 \u043e\u0431\u043d\u0430\u0440\u0443\u0436\u0435\u043d\u0438\u0438 \u0440\u0430\u0441\u0445\u043e\u0436\u0434\u0435\u043d\u0438\u0439\n\n    Args:\n        template_name: \u0418\u043c\u044f \u0448\u0430\u0431\u043b\u043e\u043d\u0430 \u0434\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 (\u0434\u043e\u043b\u0436\u043d\u043e \u0441\u043e\u0432\u043f\u0430\u0434\u0430\u0442\u044c \u0441 id \u0432 API).\n\n    Raises:\n        AssertionError: \u0415\u0441\u043b\u0438:\n            - \u041c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043a\u043d\u043e \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u043e\n            - API \u0437\u0430\u043f\u0440\u043e\u0441 \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u043b\u0441\u044f \u0441 \u043e\u0448\u0438\u0431\u043a\u043e\u0439 (status != 200)\n            - \u041e\u0431\u043d\u0430\u0440\u0443\u0436\u0435\u043d\u044b \u0440\u0430\u0441\u0445\u043e\u0436\u0434\u0435\u043d\u0438\u044f \u043c\u0435\u0436\u0434\u0443 \u0434\u0430\u043d\u043d\u044b\u043c\u0438 UI \u0438 API\n            - \u0418\u043c\u044f \u0448\u0430\u0431\u043b\u043e\u043d\u0430 \u0432 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u043c \u043e\u043a\u043d\u0435 \u043d\u0435 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u043e\u0436\u0438\u0434\u0430\u0435\u043c\u043e\u043c\u0443\n    \"\"\"\n    # \u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043a\u043d\u043e\n    modal_window = self.get_modal_window(template_name)\n\n    # \u0427\u0438\u0442\u0430\u0435\u043c \u0434\u0430\u043d\u043d\u044b\u0435 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430 (\u043c\u0435\u0442\u043e\u0434 \u0442\u0435\u043f\u0435\u0440\u044c \u0432 ViewTemplateModalWindow)\n    actual_data = modal_window.get_modal_window_data()\n\n    # \u0427\u0438\u0442\u0430\u0435\u043c \u0434\u0430\u043d\u043d\u044b\u0435 \u0438\u0437 API\n    encoded_template_name = template_name.replace(\" \", \"%20\")\n    url = f\"e-nms/DHCP/showOptPattern?template={encoded_template_name}\"\n    response = self.send_get_api_request(url)\n\n    # \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u0441\u0442\u0430\u0442\u0443\u0441 \u043e\u0442\u0432\u0435\u0442\u0430\n    if response.status != 200:\n        logger.error(\"API request failed with status: %s\", response.status)\n        assert False, f\"API request failed with status: {response.status}\"\n\n    # \u0418\u0437\u0432\u043b\u0435\u043a\u0430\u0435\u043c \u0434\u0430\u043d\u043d\u044b\u0435 \u0438\u0437 \u043e\u0442\u0432\u0435\u0442\u0430\n    response_data = response.json()\n    template_data = response_data['data']\n\n    # \u0421\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u0435\u043c actual_data \u0441 \u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0433\u043e \u0448\u0430\u0431\u043b\u043e\u043d\u0430 (\u043c\u0435\u0442\u043e\u0434 \u0442\u0435\u043f\u0435\u0440\u044c \u0432 ViewTemplateModalWindow)\n    modal_window.compare_modal_with_api_data(actual_data, template_data, template_name)\n
    "},{"location":"tests/components/test_json_container/","title":"TestJsonContainer","text":"

    \u041c\u043e\u0434\u0443\u043b\u044c \u0442\u0435\u0441\u0442\u043e\u0432 \u0434\u043b\u044f \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430 \u0441 JSON-\u0434\u0430\u043d\u043d\u044b\u043c\u0438.

    \u0421\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0442\u0435\u0441\u0442\u044b \u0434\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430 \u0441 JSON-\u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u043d\u0430 \u0432\u043a\u043b\u0430\u0434\u043a\u0435 \u043b\u0438\u0446\u0435\u043d\u0437\u0438\u0439.

    "},{"location":"tests/components/test_json_container/#tests.components.test_json_container.TestJsonContainer","title":"TestJsonContainer","text":"

    \u0422\u0435\u0441\u0442\u044b \u0434\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430 \u0441 JSON-\u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u043d\u0430 \u0432\u043a\u043b\u0430\u0434\u043a\u0435 \u043b\u0438\u0446\u0435\u043d\u0437\u0438\u0439.

    Source code in tests\\components\\test_json_container.py
    class TestJsonContainer:\n    \"\"\"\u0422\u0435\u0441\u0442\u044b \u0434\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430 \u0441 JSON-\u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u043d\u0430 \u0432\u043a\u043b\u0430\u0434\u043a\u0435 \u043b\u0438\u0446\u0435\u043d\u0437\u0438\u0439.\"\"\"\n\n    @pytest.fixture(scope=\"function\", autouse=True)\n    def setup(self, browser: Page) -> None:\n        \"\"\"\u041d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u0442 \u0442\u0435\u0441\u0442\u043e\u0432\u043e\u0435 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0435 \u043f\u0435\u0440\u0435\u0434 \u043a\u0430\u0436\u0434\u044b\u043c \u0442\u0435\u0441\u0442\u043e\u043c.\n\n        Args:\n            browser: \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.\n        \"\"\"\n\n        lp = LoginPage(browser)\n        lp.do_login()\n\n        mp = MainPage(browser)\n        mp.should_be_navigation_panel()\n        mp.click_main_navigation_panel_item(\"\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438\")\n        mp.click_subpanel_item(\"\u041b\u0438\u0446\u0435\u043d\u0437\u0438\u0438\")\n\n    def test_verticall_scrolling(self, browser: Page) -> None:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u0443\u044e \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0443 \u0432 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0435 \u0441 JSON-\u0434\u0430\u043d\u043d\u044b\u043c\u0438.\n\n        Args:\n            browser: \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.\n\n        Steps:\n            1. \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u0439 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0438\n            2. \u041f\u0440\u043e\u043a\u0440\u0443\u0447\u0438\u0432\u0430\u0435\u0442 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440 \u0432\u043d\u0438\u0437\n            3. \u041f\u0440\u043e\u043a\u0440\u0443\u0447\u0438\u0432\u0430\u0435\u0442 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440 \u0432\u0432\u0435\u0440\u0445\n        \"\"\"\n\n        lt = LicenseTab(browser)\n\n        is_scrollable = lt.check_json_container_verticall_scrolling()\n        assert is_scrollable, \"Should be verticall scrolling\"\n\n        lt.scroll_json_container_down()\n        lt.wait_for_timeout(3000)\n\n        lt.scroll_json_container_up()\n        lt.wait_for_timeout(2000)\n
    "},{"location":"tests/components/test_json_container/#tests.components.test_json_container.TestJsonContainer.setup","title":"setup(browser)","text":"

    \u041d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u0442 \u0442\u0435\u0441\u0442\u043e\u0432\u043e\u0435 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0435 \u043f\u0435\u0440\u0435\u0434 \u043a\u0430\u0436\u0434\u044b\u043c \u0442\u0435\u0441\u0442\u043e\u043c.

    Parameters:

    Name Type Description Default browser Page

    \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.

    required Source code in tests\\components\\test_json_container.py
    @pytest.fixture(scope=\"function\", autouse=True)\ndef setup(self, browser: Page) -> None:\n    \"\"\"\u041d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u0442 \u0442\u0435\u0441\u0442\u043e\u0432\u043e\u0435 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0435 \u043f\u0435\u0440\u0435\u0434 \u043a\u0430\u0436\u0434\u044b\u043c \u0442\u0435\u0441\u0442\u043e\u043c.\n\n    Args:\n        browser: \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.\n    \"\"\"\n\n    lp = LoginPage(browser)\n    lp.do_login()\n\n    mp = MainPage(browser)\n    mp.should_be_navigation_panel()\n    mp.click_main_navigation_panel_item(\"\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438\")\n    mp.click_subpanel_item(\"\u041b\u0438\u0446\u0435\u043d\u0437\u0438\u0438\")\n
    "},{"location":"tests/components/test_json_container/#tests.components.test_json_container.TestJsonContainer.test_verticall_scrolling","title":"test_verticall_scrolling(browser)","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u0443\u044e \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0443 \u0432 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0435 \u0441 JSON-\u0434\u0430\u043d\u043d\u044b\u043c\u0438.

    Parameters:

    Name Type Description Default browser Page

    \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.

    required Steps
    1. \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u0439 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0438
    2. \u041f\u0440\u043e\u043a\u0440\u0443\u0447\u0438\u0432\u0430\u0435\u0442 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440 \u0432\u043d\u0438\u0437
    3. \u041f\u0440\u043e\u043a\u0440\u0443\u0447\u0438\u0432\u0430\u0435\u0442 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440 \u0432\u0432\u0435\u0440\u0445
    Source code in tests\\components\\test_json_container.py
    def test_verticall_scrolling(self, browser: Page) -> None:\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u0443\u044e \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0443 \u0432 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0435 \u0441 JSON-\u0434\u0430\u043d\u043d\u044b\u043c\u0438.\n\n    Args:\n        browser: \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.\n\n    Steps:\n        1. \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u0439 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0438\n        2. \u041f\u0440\u043e\u043a\u0440\u0443\u0447\u0438\u0432\u0430\u0435\u0442 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440 \u0432\u043d\u0438\u0437\n        3. \u041f\u0440\u043e\u043a\u0440\u0443\u0447\u0438\u0432\u0430\u0435\u0442 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440 \u0432\u0432\u0435\u0440\u0445\n    \"\"\"\n\n    lt = LicenseTab(browser)\n\n    is_scrollable = lt.check_json_container_verticall_scrolling()\n    assert is_scrollable, \"Should be verticall scrolling\"\n\n    lt.scroll_json_container_down()\n    lt.wait_for_timeout(3000)\n\n    lt.scroll_json_container_up()\n    lt.wait_for_timeout(2000)\n
    "},{"location":"tests/components/test_navigation_panel/","title":"TestNavigationPanel","text":"

    \u041c\u043e\u0434\u0443\u043b\u044c \u0442\u0435\u0441\u0442\u043e\u0432 \u043f\u0430\u043d\u0435\u043b\u0438 \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438.

    \u0421\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0442\u0435\u0441\u0442\u044b \u0434\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u0438 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0438 \u043f\u0430\u043d\u0435\u043b\u0438 \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438 \u0432 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0438.

    "},{"location":"tests/components/test_navigation_panel/#tests.components.test_navigation_panel.TestNavigationPanel","title":"TestNavigationPanel","text":"

    \u041a\u043b\u0430\u0441\u0441 \u0442\u0435\u0441\u0442\u043e\u0432 \u0434\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u043f\u0430\u043d\u0435\u043b\u0438 \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438.

    \u0410\u0442\u0440\u0438\u0431\u0443\u0442\u044b

    browser: \u0424\u0438\u043a\u0441\u0442\u0443\u0440\u0430 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u043e\u043c.

    Source code in tests\\components\\test_navigation_panel.py
    class TestNavigationPanel:\n    \"\"\"\u041a\u043b\u0430\u0441\u0441 \u0442\u0435\u0441\u0442\u043e\u0432 \u0434\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u043f\u0430\u043d\u0435\u043b\u0438 \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438.\n\n    \u0410\u0442\u0440\u0438\u0431\u0443\u0442\u044b:\n        browser: \u0424\u0438\u043a\u0441\u0442\u0443\u0440\u0430 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u043e\u043c.\n    \"\"\"\n\n    def test_verticall_scrolling(self, browser: Page):\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u0443\u044e \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0443 \u043f\u0430\u043d\u0435\u043b\u0438 \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438.\n\n        Args:\n            browser: \u0424\u0438\u043a\u0441\u0442\u0443\u0440\u0430 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u043e\u043c.\n\n        Raises:\n            AssertionError: \u0415\u0441\u043b\u0438 \u043f\u0430\u043d\u0435\u043b\u044c \u043d\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0443.\n        \"\"\"\n\n        # \u0414\u0435\u0439\u0441\u0442\u0432\u0438\u044f:\n        lp = LoginPage(browser)\n        lp.do_login()\n\n        # \u041c\u044b \u043d\u0430 \u0433\u043b\u0430\u0432\u043d\u043e\u0439 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435\n        mp = MainPage(browser)\n\n        # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0438:\n        # \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u043f\u0430\u043d\u0435\u043b\u0438 \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438\n        mp.should_be_navigation_panel()\n\n        # \u041e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u043c \u0432\u0441\u0435 \u043f\u0443\u043d\u043a\u0442\u044b \u043f\u0430\u043d\u0435\u043b\u0438\n        mp.click_main_navigation_panel_item(\"\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438\")\n        mp.expand_navigation_subpanel()\n\n        mp.click_main_navigation_panel_item(\"\u041e\u0431\u044a\u0435\u043a\u0442\u044b\")\n        mp.wait_for_timeout(300)\n        mp.expand_navigation_subpanel()\n\n        # \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u0439 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0438\n        is_scrollable = mp.check_navigation_panel_verticall_scrolling()\n        assert is_scrollable, \"Should be vertical scrolling\"\n\n        # \u0414\u0435\u0439\u0441\u0442\u0432\u0438\u044f:\n        # \u041f\u0440\u043e\u043a\u0440\u0443\u0447\u0438\u0432\u0430\u0435\u043c \u0432\u0432\u0435\u0440\u0445 \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\n        mp.scroll_navigation_panel_up()\n        mp.check_navigation_panel_item_visibility(\"\u041f\u0430\u043d\u0435\u043b\u044c \u043f\u0440\u0438\u0431\u043e\u0440\u043e\u0432\")\n        mp.wait_for_timeout(3000)\n\n        # \u041f\u0440\u043e\u043a\u0440\u0443\u0447\u0438\u0432\u0430\u0435\u043c \u0432\u043d\u0438\u0437 \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438/ZTP/\u0428\u0430\u0431\u043b\u043e\u043d\u044b\n        mp.scroll_navigation_panel_down()\n        mp.check_navigation_panel_item_visibility(\"\u0428\u0430\u0431\u043b\u043e\u043d\u044b_2\")\n        mp.wait_for_timeout(2000)\n
    "},{"location":"tests/components/test_navigation_panel/#tests.components.test_navigation_panel.TestNavigationPanel.test_verticall_scrolling","title":"test_verticall_scrolling(browser)","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u0443\u044e \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0443 \u043f\u0430\u043d\u0435\u043b\u0438 \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438.

    Parameters:

    Name Type Description Default browser Page

    \u0424\u0438\u043a\u0441\u0442\u0443\u0440\u0430 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u043e\u043c.

    required

    Raises:

    Type Description AssertionError

    \u0415\u0441\u043b\u0438 \u043f\u0430\u043d\u0435\u043b\u044c \u043d\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0443.

    Source code in tests\\components\\test_navigation_panel.py
    def test_verticall_scrolling(self, browser: Page):\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u0443\u044e \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0443 \u043f\u0430\u043d\u0435\u043b\u0438 \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438.\n\n    Args:\n        browser: \u0424\u0438\u043a\u0441\u0442\u0443\u0440\u0430 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u043e\u043c.\n\n    Raises:\n        AssertionError: \u0415\u0441\u043b\u0438 \u043f\u0430\u043d\u0435\u043b\u044c \u043d\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0443.\n    \"\"\"\n\n    # \u0414\u0435\u0439\u0441\u0442\u0432\u0438\u044f:\n    lp = LoginPage(browser)\n    lp.do_login()\n\n    # \u041c\u044b \u043d\u0430 \u0433\u043b\u0430\u0432\u043d\u043e\u0439 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435\n    mp = MainPage(browser)\n\n    # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0438:\n    # \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u043f\u0430\u043d\u0435\u043b\u0438 \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438\n    mp.should_be_navigation_panel()\n\n    # \u041e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u043c \u0432\u0441\u0435 \u043f\u0443\u043d\u043a\u0442\u044b \u043f\u0430\u043d\u0435\u043b\u0438\n    mp.click_main_navigation_panel_item(\"\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438\")\n    mp.expand_navigation_subpanel()\n\n    mp.click_main_navigation_panel_item(\"\u041e\u0431\u044a\u0435\u043a\u0442\u044b\")\n    mp.wait_for_timeout(300)\n    mp.expand_navigation_subpanel()\n\n    # \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u0439 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0438\n    is_scrollable = mp.check_navigation_panel_verticall_scrolling()\n    assert is_scrollable, \"Should be vertical scrolling\"\n\n    # \u0414\u0435\u0439\u0441\u0442\u0432\u0438\u044f:\n    # \u041f\u0440\u043e\u043a\u0440\u0443\u0447\u0438\u0432\u0430\u0435\u043c \u0432\u0432\u0435\u0440\u0445 \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\n    mp.scroll_navigation_panel_up()\n    mp.check_navigation_panel_item_visibility(\"\u041f\u0430\u043d\u0435\u043b\u044c \u043f\u0440\u0438\u0431\u043e\u0440\u043e\u0432\")\n    mp.wait_for_timeout(3000)\n\n    # \u041f\u0440\u043e\u043a\u0440\u0443\u0447\u0438\u0432\u0430\u0435\u043c \u0432\u043d\u0438\u0437 \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438/ZTP/\u0428\u0430\u0431\u043b\u043e\u043d\u044b\n    mp.scroll_navigation_panel_down()\n    mp.check_navigation_panel_item_visibility(\"\u0428\u0430\u0431\u043b\u043e\u043d\u044b_2\")\n    mp.wait_for_timeout(2000)\n
    "},{"location":"tests/components/test_services_table/","title":"TestServiceStatusTable","text":"

    \u041c\u043e\u0434\u0443\u043b\u044c \u0442\u0435\u0441\u0442\u043e\u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0441\u0442\u0430\u0442\u0443\u0441\u043e\u0432 \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432.

    \u0421\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0442\u0435\u0441\u0442\u044b \u0434\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u0438 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0441\u0442\u0430\u0442\u0443\u0441\u043e\u0432 \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432 \u043d\u0430 \u0432\u043a\u043b\u0430\u0434\u043a\u0435 \u043e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u043d\u0438\u044f.

    "},{"location":"tests/components/test_services_table/#tests.components.test_services_table.TestServiceStatusTable","title":"TestServiceStatusTable","text":"

    \u041a\u043b\u0430\u0441\u0441 \u0442\u0435\u0441\u0442\u043e\u0432 \u0434\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0441\u0442\u0430\u0442\u0443\u0441\u043e\u0432 \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432.

    Source code in tests\\components\\test_services_table.py
    class TestServiceStatusTable:\n    \"\"\"\u041a\u043b\u0430\u0441\u0441 \u0442\u0435\u0441\u0442\u043e\u0432 \u0434\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0441\u0442\u0430\u0442\u0443\u0441\u043e\u0432 \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432.\"\"\"\n\n    @pytest.fixture(scope=\"function\", autouse=True)\n    def setup(self, browser: Page) -> None:\n        \"\"\"\u041d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u0442 \u0442\u0435\u0441\u0442\u043e\u0432\u043e\u0435 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0435 \u043f\u0435\u0440\u0435\u0434 \u043a\u0430\u0436\u0434\u044b\u043c \u0442\u0435\u0441\u0442\u043e\u043c.\n\n        Args:\n            browser: \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.\n        \"\"\"\n\n        lp = LoginPage(browser)\n        lp.do_login()\n\n        mp = MainPage(browser)\n        mp.should_be_navigation_panel()\n        mp.click_main_navigation_panel_item(\"\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438\")\n        mp.click_subpanel_item(\"\u041e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u043d\u0438\u0435 \u0438 \u0434\u0438\u0430\u0433\u043d\u043e\u0441\u0442\u0438\u043a\u0430\")\n        mp.click_subpanel_item(\"\u0421\u0442\u0430\u0442\u0443\u0441 \u043e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u043d\u0438\u044f\")\n\n    def test_scrolling(self, browser: Page) -> None:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0443 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0441\u0442\u0430\u0442\u0443\u0441\u043e\u0432 \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432.\n\n        Args:\n            browser: \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.\n\n        Steps:\n            1. \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0438 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u044b\n            2. \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u0439 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0438\n            3. \u041f\u0440\u043e\u043a\u0440\u0443\u0447\u0438\u0432\u0430\u0435\u0442 \u0432\u043d\u0438\u0437 \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0439 \u0441\u0442\u0440\u043e\u043a\u0438\n            4. \u041f\u0440\u043e\u043a\u0440\u0443\u0447\u0438\u0432\u0430\u0435\u0442 \u0432\u0432\u0435\u0440\u0445 \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u043f\u0435\u0440\u0432\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438\n        \"\"\"\n\n        sst = ServiceStatusTab(browser)\n\n        sst.should_be_services_table()\n        sst.check_services_table_content()\n\n        is_scrollable_vertically = sst.check_services_table_verticall_scrolling()\n        assert is_scrollable_vertically, \"Should be vertical scrolling\"\n\n        sst.scroll_services_table_down()\n        sst.check_services_table_last_row_visibility()\n        sst.wait_for_timeout(3000)\n\n        sst.scroll_services_table_up()\n        sst.check_services_table_first_row_visibility()\n        sst.wait_for_timeout(2000)\n
    "},{"location":"tests/components/test_services_table/#tests.components.test_services_table.TestServiceStatusTable.setup","title":"setup(browser)","text":"

    \u041d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u0442 \u0442\u0435\u0441\u0442\u043e\u0432\u043e\u0435 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0435 \u043f\u0435\u0440\u0435\u0434 \u043a\u0430\u0436\u0434\u044b\u043c \u0442\u0435\u0441\u0442\u043e\u043c.

    Parameters:

    Name Type Description Default browser Page

    \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.

    required Source code in tests\\components\\test_services_table.py
    @pytest.fixture(scope=\"function\", autouse=True)\ndef setup(self, browser: Page) -> None:\n    \"\"\"\u041d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u0442 \u0442\u0435\u0441\u0442\u043e\u0432\u043e\u0435 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0435 \u043f\u0435\u0440\u0435\u0434 \u043a\u0430\u0436\u0434\u044b\u043c \u0442\u0435\u0441\u0442\u043e\u043c.\n\n    Args:\n        browser: \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.\n    \"\"\"\n\n    lp = LoginPage(browser)\n    lp.do_login()\n\n    mp = MainPage(browser)\n    mp.should_be_navigation_panel()\n    mp.click_main_navigation_panel_item(\"\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438\")\n    mp.click_subpanel_item(\"\u041e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u043d\u0438\u0435 \u0438 \u0434\u0438\u0430\u0433\u043d\u043e\u0441\u0442\u0438\u043a\u0430\")\n    mp.click_subpanel_item(\"\u0421\u0442\u0430\u0442\u0443\u0441 \u043e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u043d\u0438\u044f\")\n
    "},{"location":"tests/components/test_services_table/#tests.components.test_services_table.TestServiceStatusTable.test_scrolling","title":"test_scrolling(browser)","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0443 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0441\u0442\u0430\u0442\u0443\u0441\u043e\u0432 \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432.

    Parameters:

    Name Type Description Default browser Page

    \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.

    required Steps
    1. \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0438 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u044b
    2. \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u0439 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0438
    3. \u041f\u0440\u043e\u043a\u0440\u0443\u0447\u0438\u0432\u0430\u0435\u0442 \u0432\u043d\u0438\u0437 \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0439 \u0441\u0442\u0440\u043e\u043a\u0438
    4. \u041f\u0440\u043e\u043a\u0440\u0443\u0447\u0438\u0432\u0430\u0435\u0442 \u0432\u0432\u0435\u0440\u0445 \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u043f\u0435\u0440\u0432\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438
    Source code in tests\\components\\test_services_table.py
    def test_scrolling(self, browser: Page) -> None:\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0443 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0441\u0442\u0430\u0442\u0443\u0441\u043e\u0432 \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432.\n\n    Args:\n        browser: \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.\n\n    Steps:\n        1. \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0438 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u044b\n        2. \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u0439 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0438\n        3. \u041f\u0440\u043e\u043a\u0440\u0443\u0447\u0438\u0432\u0430\u0435\u0442 \u0432\u043d\u0438\u0437 \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0439 \u0441\u0442\u0440\u043e\u043a\u0438\n        4. \u041f\u0440\u043e\u043a\u0440\u0443\u0447\u0438\u0432\u0430\u0435\u0442 \u0432\u0432\u0435\u0440\u0445 \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u043f\u0435\u0440\u0432\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438\n    \"\"\"\n\n    sst = ServiceStatusTab(browser)\n\n    sst.should_be_services_table()\n    sst.check_services_table_content()\n\n    is_scrollable_vertically = sst.check_services_table_verticall_scrolling()\n    assert is_scrollable_vertically, \"Should be vertical scrolling\"\n\n    sst.scroll_services_table_down()\n    sst.check_services_table_last_row_visibility()\n    sst.wait_for_timeout(3000)\n\n    sst.scroll_services_table_up()\n    sst.check_services_table_first_row_visibility()\n    sst.wait_for_timeout(2000)\n
    "},{"location":"tests/components/test_user_modal_window/","title":"TestUsersModalWindow","text":"

    \u041c\u043e\u0434\u0443\u043b\u044c \u0442\u0435\u0441\u0442\u043e\u0432 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u044b\u0445 \u043e\u043a\u043e\u043d \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439.

    \u0421\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0442\u0435\u0441\u0442\u044b \u0434\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u0438 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0438 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u044b\u0445 \u043e\u043a\u043e\u043d \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\u043c\u0438.

    "},{"location":"tests/components/test_user_modal_window/#tests.components.test_user_modal_window.TestUsersModalWindow","title":"TestUsersModalWindow","text":"

    \u041a\u043b\u0430\u0441\u0441 \u0442\u0435\u0441\u0442\u043e\u0432 \u0434\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u044b\u0445 \u043e\u043a\u043e\u043d \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439.

    Source code in tests\\components\\test_user_modal_window.py
    class TestUsersModalWindow:\n    \"\"\"\u041a\u043b\u0430\u0441\u0441 \u0442\u0435\u0441\u0442\u043e\u0432 \u0434\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u044b\u0445 \u043e\u043a\u043e\u043d \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439.\"\"\"\n\n    @pytest.fixture(scope=\"function\", autouse=True)\n    def setup(self, browser: Page) -> None:\n        \"\"\"\u041d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u0442 \u0442\u0435\u0441\u0442\u043e\u0432\u043e\u0435 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0435 \u043f\u0435\u0440\u0435\u0434 \u043a\u0430\u0436\u0434\u044b\u043c \u0442\u0435\u0441\u0442\u043e\u043c.\n\n        Args:\n            browser: \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.\n        \"\"\"\n\n        lp = LoginPage(browser)\n        lp.do_login()\n\n        mp = MainPage(browser)\n        mp.should_be_navigation_panel()\n        mp.click_main_navigation_panel_item(\"\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438\")\n        mp.click_subpanel_item(\"\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438\")\n\n    @pytest.mark.develop\n    def test_edit_user_window_scrolling(self, browser: Page) -> None:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0443 \u043e\u043a\u043d\u0430 \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\n\n        Args:\n            browser: \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.\n\n        Steps:\n            1. \u041e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u043e\u043a\u043d\u043e \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f\n            2. \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u0443\u044e \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0443\n            3. \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0433\u043e\u0440\u0438\u0437\u043e\u043d\u0442\u0430\u043b\u044c\u043d\u0443\u044e \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0443\n        \"\"\"\n\n        ut = UsersTab(browser)\n        user_name, role = ut.open_edit_user_page_by_index(0)\n        modal_window = ut.get_modal_window(user_name)\n\n        is_scrollable_vertically = modal_window.check_window_vertical_scrolling()\n        assert is_scrollable_vertically, \"Should be vertical scrolling\"\n\n        modal_window.scroll_window_down()\n        modal_window.check_button_visibility(\"close\")\n        ut.wait_for_timeout(3000)\n\n        modal_window.scroll_window_up()\n        modal_window.check_toolbar_button_visibility(\"close\")\n        ut.wait_for_timeout(3000)\n\n        is_scrollable_horizontally = modal_window.check_window_horizontal_scrolling()\n        assert is_scrollable_horizontally, \"Should be horizontal scrolling\"\n\n        modal_window.scroll_window_right()\n        ut.wait_for_timeout(3000)\n        modal_window.scroll_window_left()\n        ut.wait_for_timeout(2000)\n\n    def test_add_user_window_scrolling(self, browser: Page) -> None:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0443 \u043e\u043a\u043d\u0430 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\n\n        Args:\n            browser: \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.\n\n        Steps:\n            1. \u041e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u043e\u043a\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f\n            2. \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u0443\u044e \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0443\n        \"\"\"\n\n        ut = UsersTab(browser)\n        ut.open_add_user_window()\n        modal_window = ut.get_modal_window(\"add_local_user\")\n\n        is_scrollable_vertically = modal_window.check_window_vertical_scrolling()\n        assert is_scrollable_vertically, \"Should be vertical scrolling\"\n\n        modal_window.scroll_window_down()\n        modal_window.check_button_visibility(\"close\")\n        ut.wait_for_timeout(3000)\n\n        modal_window.scroll_window_up()\n        modal_window.check_toolbar_button_visibility(\"close\")\n        ut.wait_for_timeout(3000)\n
    "},{"location":"tests/components/test_user_modal_window/#tests.components.test_user_modal_window.TestUsersModalWindow.setup","title":"setup(browser)","text":"

    \u041d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u0442 \u0442\u0435\u0441\u0442\u043e\u0432\u043e\u0435 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0435 \u043f\u0435\u0440\u0435\u0434 \u043a\u0430\u0436\u0434\u044b\u043c \u0442\u0435\u0441\u0442\u043e\u043c.

    Parameters:

    Name Type Description Default browser Page

    \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.

    required Source code in tests\\components\\test_user_modal_window.py
    @pytest.fixture(scope=\"function\", autouse=True)\ndef setup(self, browser: Page) -> None:\n    \"\"\"\u041d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u0442 \u0442\u0435\u0441\u0442\u043e\u0432\u043e\u0435 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0435 \u043f\u0435\u0440\u0435\u0434 \u043a\u0430\u0436\u0434\u044b\u043c \u0442\u0435\u0441\u0442\u043e\u043c.\n\n    Args:\n        browser: \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.\n    \"\"\"\n\n    lp = LoginPage(browser)\n    lp.do_login()\n\n    mp = MainPage(browser)\n    mp.should_be_navigation_panel()\n    mp.click_main_navigation_panel_item(\"\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438\")\n    mp.click_subpanel_item(\"\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438\")\n
    "},{"location":"tests/components/test_user_modal_window/#tests.components.test_user_modal_window.TestUsersModalWindow.test_add_user_window_scrolling","title":"test_add_user_window_scrolling(browser)","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0443 \u043e\u043a\u043d\u0430 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.

    Parameters:

    Name Type Description Default browser Page

    \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.

    required Steps
    1. \u041e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u043e\u043a\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f
    2. \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u0443\u044e \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0443
    Source code in tests\\components\\test_user_modal_window.py
    def test_add_user_window_scrolling(self, browser: Page) -> None:\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0443 \u043e\u043a\u043d\u0430 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\n\n    Args:\n        browser: \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.\n\n    Steps:\n        1. \u041e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u043e\u043a\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f\n        2. \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u0443\u044e \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0443\n    \"\"\"\n\n    ut = UsersTab(browser)\n    ut.open_add_user_window()\n    modal_window = ut.get_modal_window(\"add_local_user\")\n\n    is_scrollable_vertically = modal_window.check_window_vertical_scrolling()\n    assert is_scrollable_vertically, \"Should be vertical scrolling\"\n\n    modal_window.scroll_window_down()\n    modal_window.check_button_visibility(\"close\")\n    ut.wait_for_timeout(3000)\n\n    modal_window.scroll_window_up()\n    modal_window.check_toolbar_button_visibility(\"close\")\n    ut.wait_for_timeout(3000)\n
    "},{"location":"tests/components/test_user_modal_window/#tests.components.test_user_modal_window.TestUsersModalWindow.test_edit_user_window_scrolling","title":"test_edit_user_window_scrolling(browser)","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0443 \u043e\u043a\u043d\u0430 \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.

    Parameters:

    Name Type Description Default browser Page

    \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.

    required Steps
    1. \u041e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u043e\u043a\u043d\u043e \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f
    2. \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u0443\u044e \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0443
    3. \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0433\u043e\u0440\u0438\u0437\u043e\u043d\u0442\u0430\u043b\u044c\u043d\u0443\u044e \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0443
    Source code in tests\\components\\test_user_modal_window.py
    @pytest.mark.develop\ndef test_edit_user_window_scrolling(self, browser: Page) -> None:\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0443 \u043e\u043a\u043d\u0430 \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\n\n    Args:\n        browser: \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.\n\n    Steps:\n        1. \u041e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u043e\u043a\u043d\u043e \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f\n        2. \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u0443\u044e \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0443\n        3. \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0433\u043e\u0440\u0438\u0437\u043e\u043d\u0442\u0430\u043b\u044c\u043d\u0443\u044e \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0443\n    \"\"\"\n\n    ut = UsersTab(browser)\n    user_name, role = ut.open_edit_user_page_by_index(0)\n    modal_window = ut.get_modal_window(user_name)\n\n    is_scrollable_vertically = modal_window.check_window_vertical_scrolling()\n    assert is_scrollable_vertically, \"Should be vertical scrolling\"\n\n    modal_window.scroll_window_down()\n    modal_window.check_button_visibility(\"close\")\n    ut.wait_for_timeout(3000)\n\n    modal_window.scroll_window_up()\n    modal_window.check_toolbar_button_visibility(\"close\")\n    ut.wait_for_timeout(3000)\n\n    is_scrollable_horizontally = modal_window.check_window_horizontal_scrolling()\n    assert is_scrollable_horizontally, \"Should be horizontal scrolling\"\n\n    modal_window.scroll_window_right()\n    ut.wait_for_timeout(3000)\n    modal_window.scroll_window_left()\n    ut.wait_for_timeout(2000)\n
    "},{"location":"tests/e2e/test_event_panel/","title":"TestEventPanel","text":"

    \u041c\u043e\u0434\u0443\u043b\u044c \u0442\u0435\u0441\u0442\u043e\u0432 \u043f\u0430\u043d\u0435\u043b\u0438 \u0441\u043e\u0431\u044b\u0442\u0438\u0439.

    \u0421\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0442\u0435\u0441\u0442\u044b \u0434\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u043f\u0430\u043d\u0435\u043b\u0438 \u0441\u043e\u0431\u044b\u0442\u0438\u0439 \u0432 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0438.

    "},{"location":"tests/e2e/test_event_panel/#tests.e2e.test_event_panel.TestEventPanel","title":"TestEventPanel","text":"

    \u041a\u043b\u0430\u0441\u0441 \u0442\u0435\u0441\u0442\u043e\u0432 \u0434\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u043f\u0430\u043d\u0435\u043b\u0438 \u0441\u043e\u0431\u044b\u0442\u0438\u0439.

    \u0422\u0435\u0441\u0442\u044b \u043f\u043e\u043a\u0440\u044b\u0432\u0430\u044e\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0438: 1. test_event_panel_content: \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u043f\u0430\u043d\u0435\u043b\u0438 \u0441\u043e\u0431\u044b\u0442\u0438\u0439 2. test_event_panel_expand_buttons: \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0438 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043a\u043d\u043e\u043f\u043e\u043a \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f \u0440\u0430\u0431\u043e\u0447\u0435\u0439 \u043e\u0431\u043b\u0430\u0441\u0442\u0438 \u043f\u0430\u043d\u0435\u043b\u0438 \u0441\u043e\u0431\u044b\u0442\u0438\u0439

    \u0410\u0442\u0440\u0438\u0431\u0443\u0442\u044b

    browser: \u0424\u0438\u043a\u0441\u0442\u0443\u0440\u0430 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u043e\u043c.

    Source code in tests\\e2e\\test_event_panel.py
    class TestEventPanel:\n    \"\"\"\u041a\u043b\u0430\u0441\u0441 \u0442\u0435\u0441\u0442\u043e\u0432 \u0434\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u043f\u0430\u043d\u0435\u043b\u0438 \u0441\u043e\u0431\u044b\u0442\u0438\u0439.\n\n    \u0422\u0435\u0441\u0442\u044b \u043f\u043e\u043a\u0440\u044b\u0432\u0430\u044e\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0438:\n    1. test_event_panel_content: \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u043f\u0430\u043d\u0435\u043b\u0438 \u0441\u043e\u0431\u044b\u0442\u0438\u0439\n    2. test_event_panel_expand_buttons: \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0438 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043a\u043d\u043e\u043f\u043e\u043a \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f \u0440\u0430\u0431\u043e\u0447\u0435\u0439 \u043e\u0431\u043b\u0430\u0441\u0442\u0438 \u043f\u0430\u043d\u0435\u043b\u0438 \u0441\u043e\u0431\u044b\u0442\u0438\u0439\n\n    \u0410\u0442\u0440\u0438\u0431\u0443\u0442\u044b:\n        browser: \u0424\u0438\u043a\u0441\u0442\u0443\u0440\u0430 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u043e\u043c.\n    \"\"\"\n\n    def test_event_panel_content(self, browser: Page) -> None:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u043f\u0430\u043d\u0435\u043b\u0438 \u0441\u043e\u0431\u044b\u0442\u0438\u0439.\n\n        Args:\n            browser: \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.\n        \"\"\"\n\n        lp = LoginPage(browser)\n        lp.do_login()\n\n        mp = MainPage(browser)\n        mp.should_be_event_panel()\n\n        # \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0435 \u0442\u0443\u043b\u0442\u0438\u043f\u043e\u0432 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u043d\u0430 \u043a\u043d\u043e\u043f\u043a\u0430\u0445\n        tooltip_event_counters = mp.get_event_counters_by_tooltips()\n        button_event_counters = mp.get_event_counters_by_tooltips()\n\n        for event, counter in tooltip_event_counters.items():\n            button_counter = button_event_counters.get(event)\n            if button_counter is None:\n                assert False, f\"Found unexpected tooltip {event} for event button\"\n\n            if button_counter != counter:\n                assert False, f\"Expected tooltip value {counter} is not equal button value {button_counter} for event button {event}\"\n\n    def test_event_panel_expand_buttons(self, browser: Page) -> None:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0438 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043a\u043d\u043e\u043f\u043e\u043a \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f \u0440\u0430\u0431\u043e\u0447\u0435\u0439 \u043e\u0431\u043b\u0430\u0441\u0442\u0438 \u043f\u0430\u043d\u0435\u043b\u0438 \u0441\u043e\u0431\u044b\u0442\u0438\u0439.\n\n        Args:\n            browser: \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.\n        \"\"\"\n\n        lp = LoginPage(browser)\n        lp.do_login()\n\n        mp = MainPage(browser)\n\n        # \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 - \u043f\u0430\u043d\u0435\u043b\u044c \u0441\u043e\u0431\u044b\u0442\u0438\u0439 \u0432\u043d\u0438\u0437\u0443, \u0432\u0438\u0434\u043d\u0430 \u043e\u0434\u043d\u0430 \u043a\u043d\u043e\u043f\u043a\u0430 expand less\n        current_position = mp.get_events_panel_position()\n        assert current_position == \"bottom\", \\\n               \"Events panel should be located on main page bottom\"\n        assert mp.check_expand_less_button(), \\\n               \"Expand less button should be present\"\n        assert mp.check_expand_more_button(), \\\n               \"Expand more button should be absent\"\n\n        mp.click_events_panel_expand_less_button()\n        mp.wait_for_timeout(500)\n\n        # \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c, \u0447\u0442\u043e \u043f\u0430\u043d\u0435\u043b\u044c \u0441\u043e\u0431\u044b\u0442\u0438\u0439 \u043f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u043b\u0430\u0441\u044c \u0432 \u0441\u0435\u0440\u0435\u0434\u0438\u043d\u0443 \u044d\u043a\u0440\u0430\u043d\u0430,\n        # \u0432\u0438\u0434\u043d\u0430 \u043e\u0431\u0435 \u043a\u043d\u043e\u043f\u043a\u0438 expand less \u0438 expand more\n        current_position = mp.get_events_panel_position()\n        assert current_position == \"center\", \\\n               \"Events panel should be located on main page center\"\n        assert mp.check_expand_less_button(), \\\n               \"Expand less button should be present\"\n        assert mp.check_expand_more_button(), \\\n               \"Expand more button should be present\"\n\n        mp.click_events_panel_expand_less_button()\n        mp.wait_for_timeout(500)\n\n        # \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c, \u0447\u0442\u043e \u043f\u0430\u043d\u0435\u043b\u044c \u0441\u043e\u0431\u044b\u0442\u0438\u0439 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432\u0432\u0435\u0440\u0445\u0443 \u044d\u043a\u0440\u0430\u043d\u0430,\n        # \u0432\u0438\u0434\u043d\u0430 \u043a\u043d\u043e\u043f\u043a\u0438 expand more \u0438 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442 expand less\n        current_position = mp.get_events_panel_position()\n        assert current_position == \"top\", \\\n               \"Events panel should be located on main page top\"\n        assert mp.check_expand_less_button(), \\\n               \"Expand less button should be absent\"\n        assert mp.check_expand_more_button(), \\\n               \"Expand more button should be present\"\n\n        # \u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0435\u043d\u0438\u0435 \u0432 \u043e\u0442\u0440\u0430\u0442\u043d\u043e\u043c \u043d\u0430\u043f\u0440\u0432\u043b\u0435\u043d\u0438\u0438 \u0441\u0432\u0435\u0440\u0445\u0443 \u0432\u043d\u0438\u0437\n        mp.click_events_panel_expand_more_button()\n        mp.wait_for_timeout(500)\n\n        current_position = mp.get_events_panel_position()\n        assert current_position == \"center\", \\\n               \"Events panel should be located on main page center\"\n        assert mp.check_expand_less_button(), \\\n               \"Expand less button should be present\"\n        assert mp.check_expand_more_button(), \\\n               \"Expand more button should be present\"\n\n        mp.click_events_panel_expand_more_button()\n        mp.wait_for_timeout(500)\n\n        current_position = mp.get_events_panel_position()\n        assert current_position == \"bottom\", \\\n               \"Events panel should be located on main page bottom\"\n        assert mp.check_expand_less_button(), \\\n               \"Expand less button should be present\"\n        assert mp.check_expand_more_button(), \\\n               \"Expand more button should be absent\"\n
    "},{"location":"tests/e2e/test_event_panel/#tests.e2e.test_event_panel.TestEventPanel.test_event_panel_content","title":"test_event_panel_content(browser)","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u043f\u0430\u043d\u0435\u043b\u0438 \u0441\u043e\u0431\u044b\u0442\u0438\u0439.

    Parameters:

    Name Type Description Default browser Page

    \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.

    required Source code in tests\\e2e\\test_event_panel.py
    def test_event_panel_content(self, browser: Page) -> None:\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u043f\u0430\u043d\u0435\u043b\u0438 \u0441\u043e\u0431\u044b\u0442\u0438\u0439.\n\n    Args:\n        browser: \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.\n    \"\"\"\n\n    lp = LoginPage(browser)\n    lp.do_login()\n\n    mp = MainPage(browser)\n    mp.should_be_event_panel()\n\n    # \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0435 \u0442\u0443\u043b\u0442\u0438\u043f\u043e\u0432 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u043d\u0430 \u043a\u043d\u043e\u043f\u043a\u0430\u0445\n    tooltip_event_counters = mp.get_event_counters_by_tooltips()\n    button_event_counters = mp.get_event_counters_by_tooltips()\n\n    for event, counter in tooltip_event_counters.items():\n        button_counter = button_event_counters.get(event)\n        if button_counter is None:\n            assert False, f\"Found unexpected tooltip {event} for event button\"\n\n        if button_counter != counter:\n            assert False, f\"Expected tooltip value {counter} is not equal button value {button_counter} for event button {event}\"\n
    "},{"location":"tests/e2e/test_event_panel/#tests.e2e.test_event_panel.TestEventPanel.test_event_panel_expand_buttons","title":"test_event_panel_expand_buttons(browser)","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0438 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043a\u043d\u043e\u043f\u043e\u043a \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f \u0440\u0430\u0431\u043e\u0447\u0435\u0439 \u043e\u0431\u043b\u0430\u0441\u0442\u0438 \u043f\u0430\u043d\u0435\u043b\u0438 \u0441\u043e\u0431\u044b\u0442\u0438\u0439.

    Parameters:

    Name Type Description Default browser Page

    \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.

    required Source code in tests\\e2e\\test_event_panel.py
    def test_event_panel_expand_buttons(self, browser: Page) -> None:\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0438 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043a\u043d\u043e\u043f\u043e\u043a \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f \u0440\u0430\u0431\u043e\u0447\u0435\u0439 \u043e\u0431\u043b\u0430\u0441\u0442\u0438 \u043f\u0430\u043d\u0435\u043b\u0438 \u0441\u043e\u0431\u044b\u0442\u0438\u0439.\n\n    Args:\n        browser: \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.\n    \"\"\"\n\n    lp = LoginPage(browser)\n    lp.do_login()\n\n    mp = MainPage(browser)\n\n    # \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 - \u043f\u0430\u043d\u0435\u043b\u044c \u0441\u043e\u0431\u044b\u0442\u0438\u0439 \u0432\u043d\u0438\u0437\u0443, \u0432\u0438\u0434\u043d\u0430 \u043e\u0434\u043d\u0430 \u043a\u043d\u043e\u043f\u043a\u0430 expand less\n    current_position = mp.get_events_panel_position()\n    assert current_position == \"bottom\", \\\n           \"Events panel should be located on main page bottom\"\n    assert mp.check_expand_less_button(), \\\n           \"Expand less button should be present\"\n    assert mp.check_expand_more_button(), \\\n           \"Expand more button should be absent\"\n\n    mp.click_events_panel_expand_less_button()\n    mp.wait_for_timeout(500)\n\n    # \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c, \u0447\u0442\u043e \u043f\u0430\u043d\u0435\u043b\u044c \u0441\u043e\u0431\u044b\u0442\u0438\u0439 \u043f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u043b\u0430\u0441\u044c \u0432 \u0441\u0435\u0440\u0435\u0434\u0438\u043d\u0443 \u044d\u043a\u0440\u0430\u043d\u0430,\n    # \u0432\u0438\u0434\u043d\u0430 \u043e\u0431\u0435 \u043a\u043d\u043e\u043f\u043a\u0438 expand less \u0438 expand more\n    current_position = mp.get_events_panel_position()\n    assert current_position == \"center\", \\\n           \"Events panel should be located on main page center\"\n    assert mp.check_expand_less_button(), \\\n           \"Expand less button should be present\"\n    assert mp.check_expand_more_button(), \\\n           \"Expand more button should be present\"\n\n    mp.click_events_panel_expand_less_button()\n    mp.wait_for_timeout(500)\n\n    # \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c, \u0447\u0442\u043e \u043f\u0430\u043d\u0435\u043b\u044c \u0441\u043e\u0431\u044b\u0442\u0438\u0439 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432\u0432\u0435\u0440\u0445\u0443 \u044d\u043a\u0440\u0430\u043d\u0430,\n    # \u0432\u0438\u0434\u043d\u0430 \u043a\u043d\u043e\u043f\u043a\u0438 expand more \u0438 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442 expand less\n    current_position = mp.get_events_panel_position()\n    assert current_position == \"top\", \\\n           \"Events panel should be located on main page top\"\n    assert mp.check_expand_less_button(), \\\n           \"Expand less button should be absent\"\n    assert mp.check_expand_more_button(), \\\n           \"Expand more button should be present\"\n\n    # \u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0435\u043d\u0438\u0435 \u0432 \u043e\u0442\u0440\u0430\u0442\u043d\u043e\u043c \u043d\u0430\u043f\u0440\u0432\u043b\u0435\u043d\u0438\u0438 \u0441\u0432\u0435\u0440\u0445\u0443 \u0432\u043d\u0438\u0437\n    mp.click_events_panel_expand_more_button()\n    mp.wait_for_timeout(500)\n\n    current_position = mp.get_events_panel_position()\n    assert current_position == \"center\", \\\n           \"Events panel should be located on main page center\"\n    assert mp.check_expand_less_button(), \\\n           \"Expand less button should be present\"\n    assert mp.check_expand_more_button(), \\\n           \"Expand more button should be present\"\n\n    mp.click_events_panel_expand_more_button()\n    mp.wait_for_timeout(500)\n\n    current_position = mp.get_events_panel_position()\n    assert current_position == \"bottom\", \\\n           \"Events panel should be located on main page bottom\"\n    assert mp.check_expand_less_button(), \\\n           \"Expand less button should be present\"\n    assert mp.check_expand_more_button(), \\\n           \"Expand more button should be absent\"\n
    "},{"location":"tests/e2e/test_expand_navigation_panel/","title":"TestNavigationPanel","text":"

    \u041c\u043e\u0434\u0443\u043b\u044c \u0442\u0435\u0441\u0442\u043e\u0432 \u043f\u0430\u043d\u0435\u043b\u0438 \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438.

    \u0421\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0442\u0435\u0441\u0442\u044b \u0434\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u043f\u0430\u043d\u0435\u043b\u0438 \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438 \u0432 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0438.

    "},{"location":"tests/e2e/test_expand_navigation_panel/#tests.e2e.test_expand_navigation_panel.TestNavigationPanel","title":"TestNavigationPanel","text":"

    \u041a\u043b\u0430\u0441\u0441 \u0442\u0435\u0441\u0442\u043e\u0432 \u0434\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u043f\u0430\u043d\u0435\u043b\u0438 \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438.

    \u0422\u0435\u0441\u0442\u044b \u043f\u043e\u043a\u0440\u044b\u0432\u0430\u044e\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0438: - test_expand_panel: \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043f\u043e\u043b\u043d\u043e\u0435 \u0440\u0430\u0441\u043a\u0440\u044b\u0442\u0438\u0435 \u043f\u0430\u043d\u0435\u043b\u0438 \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438 - test_sub_panel_item_click: \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043a\u043b\u0438\u043a\u0430 \u0437\u0430\u0434\u0430\u043d\u043d\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0432 \u043f\u043e\u0434\u043f\u0430\u043d\u0435\u043b\u0438 \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438

    \u0410\u0442\u0440\u0438\u0431\u0443\u0442\u044b

    browser: \u0424\u0438\u043a\u0441\u0442\u0443\u0440\u0430 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u043e\u043c.

    Source code in tests\\e2e\\test_expand_navigation_panel.py
    class TestNavigationPanel:\n    \"\"\"\u041a\u043b\u0430\u0441\u0441 \u0442\u0435\u0441\u0442\u043e\u0432 \u0434\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u043f\u0430\u043d\u0435\u043b\u0438 \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438.\n\n    \u0422\u0435\u0441\u0442\u044b \u043f\u043e\u043a\u0440\u044b\u0432\u0430\u044e\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0438:\n    - test_expand_panel: \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043f\u043e\u043b\u043d\u043e\u0435 \u0440\u0430\u0441\u043a\u0440\u044b\u0442\u0438\u0435 \u043f\u0430\u043d\u0435\u043b\u0438 \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438\n    - test_sub_panel_item_click: \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043a\u043b\u0438\u043a\u0430 \u0437\u0430\u0434\u0430\u043d\u043d\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0432 \u043f\u043e\u0434\u043f\u0430\u043d\u0435\u043b\u0438 \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438\n\n    \u0410\u0442\u0440\u0438\u0431\u0443\u0442\u044b:\n        browser: \u0424\u0438\u043a\u0441\u0442\u0443\u0440\u0430 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u043e\u043c.\n    \"\"\"\n\n    def test_expand_panel(self, browser: Page):\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043f\u043e\u043b\u043d\u043e\u0435 \u0440\u0430\u0441\u043a\u0440\u044b\u0442\u0438\u0435 \u043f\u0430\u043d\u0435\u043b\u0438 \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438.\n\n        Args:\n            browser: \u0424\u0438\u043a\u0441\u0442\u0443\u0440\u0430 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u043e\u043c.\n\n        \"\"\"\n\n        # \u0414\u0435\u0439\u0441\u0442\u0432\u0438\u044f:\n        lp = LoginPage(browser)\n        lp.do_login()\n\n        # \u041c\u044b \u043d\u0430 \u0433\u043b\u0430\u0432\u043d\u043e\u0439 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435\n        mp = MainPage(browser)\n\n        # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0438:\n        # \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u043f\u0430\u043d\u0435\u043b\u0438 \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438\n        mp.should_be_navigation_panel()\n\n        # \u041e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u043c \u0432\u0441\u0435 \u043f\u0443\u043d\u043a\u0442\u044b \u043f\u0430\u043d\u0435\u043b\u0438\n        mp.click_main_navigation_panel_item(\"\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438\")\n\n        mp.expand_navigation_subpanel()\n\n        mp.click_main_navigation_panel_item(\"\u041e\u0431\u044a\u0435\u043a\u0442\u044b\")\n        mp.wait_for_timeout(300)\n\n        mp.expand_navigation_subpanel()\n\n    # @pytest.mark.develop\n    def test_sub_panel_item_click(self, browser: Page):\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043a\u043b\u0438\u043a\u0430 \u0437\u0430\u0434\u0430\u043d\u043d\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0432 \u043f\u043e\u0434\u043f\u0430\u043d\u0435\u043b\u0438 \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438.\n\n        Args:\n            browser: \u0424\u0438\u043a\u0441\u0442\u0443\u0440\u0430 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u043e\u043c.\n\n        \"\"\"\n\n        # \u0414\u0435\u0439\u0441\u0442\u0432\u0438\u044f:\n        lp = LoginPage(browser)\n        lp.do_login()\n\n        # \u041c\u044b \u043d\u0430 \u0433\u043b\u0430\u0432\u043d\u043e\u0439 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435\n        mp = MainPage(browser)\n\n        # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0438:\n        # \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u043f\u0430\u043d\u0435\u043b\u0438 \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438\n        mp.should_be_navigation_panel()\n\n        # \u041e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u043c \u0440\u0430\u0437\u043d\u044b\u0435 \u043f\u0443\u043d\u043a\u0442\u044b \u043f\u0430\u043d\u0435\u043b\u0438\n        mp.click_main_navigation_panel_item(\"\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438\")\n\n        mp.click_subpanel_item(\"\u041e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u043d\u0438\u0435 \u0438 \u0434\u0438\u0430\u0433\u043d\u043e\u0441\u0442\u0438\u043a\u0430\")\n        mp.click_subpanel_item(\"\u0421\u0442\u0430\u0442\u0443\u0441 \u043e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u043d\u0438\u044f\")\n        mp.wait_for_timeout(500)\n\n        # \u041e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u043c/\u0437\u0430\u043a\u0440\u044b\u0432\u0430\u0435\u043c \u043f\u0443\u043d\u043a\u0442 \u043f\u0430\u043d\u0435\u043b\u0438\n        mp.click_subpanel_item(\"\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438\")\n        mp.click_subpanel_item(\"\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438\")\n        mp.wait_for_timeout(500)\n\n        # \u041e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u043c \u043f\u0443\u043d\u043a\u0442\u044b \u043f\u0430\u043d\u0435\u043b\u0438 \u0441 \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u044b\u043c\u0438 \u0438\u043c\u043d\u0430\u043c\u0438, \u043d\u043e \u0440\u0430\u0437\u043d\u044b\u043c \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435\u043c\n        mp.click_subpanel_item(\"\u0428\u0430\u0431\u043b\u043e\u043d\u044b\")\n        mp.wait_for_timeout(500)\n\n        mp.click_subpanel_item(\"Zero Touch Provisioning\")\n        mp.click_subpanel_item(\"\u0428\u0430\u0431\u043b\u043e\u043d\u044b\", parent=\"Zero Touch Provisioning\")\n        mp.wait_for_timeout(500)\n
    "},{"location":"tests/e2e/test_expand_navigation_panel/#tests.e2e.test_expand_navigation_panel.TestNavigationPanel.test_expand_panel","title":"test_expand_panel(browser)","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043f\u043e\u043b\u043d\u043e\u0435 \u0440\u0430\u0441\u043a\u0440\u044b\u0442\u0438\u0435 \u043f\u0430\u043d\u0435\u043b\u0438 \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438.

    Parameters:

    Name Type Description Default browser Page

    \u0424\u0438\u043a\u0441\u0442\u0443\u0440\u0430 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u043e\u043c.

    required Source code in tests\\e2e\\test_expand_navigation_panel.py
    def test_expand_panel(self, browser: Page):\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043f\u043e\u043b\u043d\u043e\u0435 \u0440\u0430\u0441\u043a\u0440\u044b\u0442\u0438\u0435 \u043f\u0430\u043d\u0435\u043b\u0438 \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438.\n\n    Args:\n        browser: \u0424\u0438\u043a\u0441\u0442\u0443\u0440\u0430 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u043e\u043c.\n\n    \"\"\"\n\n    # \u0414\u0435\u0439\u0441\u0442\u0432\u0438\u044f:\n    lp = LoginPage(browser)\n    lp.do_login()\n\n    # \u041c\u044b \u043d\u0430 \u0433\u043b\u0430\u0432\u043d\u043e\u0439 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435\n    mp = MainPage(browser)\n\n    # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0438:\n    # \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u043f\u0430\u043d\u0435\u043b\u0438 \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438\n    mp.should_be_navigation_panel()\n\n    # \u041e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u043c \u0432\u0441\u0435 \u043f\u0443\u043d\u043a\u0442\u044b \u043f\u0430\u043d\u0435\u043b\u0438\n    mp.click_main_navigation_panel_item(\"\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438\")\n\n    mp.expand_navigation_subpanel()\n\n    mp.click_main_navigation_panel_item(\"\u041e\u0431\u044a\u0435\u043a\u0442\u044b\")\n    mp.wait_for_timeout(300)\n\n    mp.expand_navigation_subpanel()\n
    "},{"location":"tests/e2e/test_expand_navigation_panel/#tests.e2e.test_expand_navigation_panel.TestNavigationPanel.test_sub_panel_item_click","title":"test_sub_panel_item_click(browser)","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043a\u043b\u0438\u043a\u0430 \u0437\u0430\u0434\u0430\u043d\u043d\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0432 \u043f\u043e\u0434\u043f\u0430\u043d\u0435\u043b\u0438 \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438.

    Parameters:

    Name Type Description Default browser Page

    \u0424\u0438\u043a\u0441\u0442\u0443\u0440\u0430 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u043e\u043c.

    required Source code in tests\\e2e\\test_expand_navigation_panel.py
    def test_sub_panel_item_click(self, browser: Page):\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043a\u043b\u0438\u043a\u0430 \u0437\u0430\u0434\u0430\u043d\u043d\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0432 \u043f\u043e\u0434\u043f\u0430\u043d\u0435\u043b\u0438 \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438.\n\n    Args:\n        browser: \u0424\u0438\u043a\u0441\u0442\u0443\u0440\u0430 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u043e\u043c.\n\n    \"\"\"\n\n    # \u0414\u0435\u0439\u0441\u0442\u0432\u0438\u044f:\n    lp = LoginPage(browser)\n    lp.do_login()\n\n    # \u041c\u044b \u043d\u0430 \u0433\u043b\u0430\u0432\u043d\u043e\u0439 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435\n    mp = MainPage(browser)\n\n    # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0438:\n    # \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u043f\u0430\u043d\u0435\u043b\u0438 \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438\n    mp.should_be_navigation_panel()\n\n    # \u041e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u043c \u0440\u0430\u0437\u043d\u044b\u0435 \u043f\u0443\u043d\u043a\u0442\u044b \u043f\u0430\u043d\u0435\u043b\u0438\n    mp.click_main_navigation_panel_item(\"\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438\")\n\n    mp.click_subpanel_item(\"\u041e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u043d\u0438\u0435 \u0438 \u0434\u0438\u0430\u0433\u043d\u043e\u0441\u0442\u0438\u043a\u0430\")\n    mp.click_subpanel_item(\"\u0421\u0442\u0430\u0442\u0443\u0441 \u043e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u043d\u0438\u044f\")\n    mp.wait_for_timeout(500)\n\n    # \u041e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u043c/\u0437\u0430\u043a\u0440\u044b\u0432\u0430\u0435\u043c \u043f\u0443\u043d\u043a\u0442 \u043f\u0430\u043d\u0435\u043b\u0438\n    mp.click_subpanel_item(\"\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438\")\n    mp.click_subpanel_item(\"\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438\")\n    mp.wait_for_timeout(500)\n\n    # \u041e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u043c \u043f\u0443\u043d\u043a\u0442\u044b \u043f\u0430\u043d\u0435\u043b\u0438 \u0441 \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u044b\u043c\u0438 \u0438\u043c\u043d\u0430\u043c\u0438, \u043d\u043e \u0440\u0430\u0437\u043d\u044b\u043c \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435\u043c\n    mp.click_subpanel_item(\"\u0428\u0430\u0431\u043b\u043e\u043d\u044b\")\n    mp.wait_for_timeout(500)\n\n    mp.click_subpanel_item(\"Zero Touch Provisioning\")\n    mp.click_subpanel_item(\"\u0428\u0430\u0431\u043b\u043e\u043d\u044b\", parent=\"Zero Touch Provisioning\")\n    mp.wait_for_timeout(500)\n
    "},{"location":"tests/e2e/test_license_tab/","title":"TestLicenseTab","text":"

    \u041c\u043e\u0434\u0443\u043b\u044c \u0442\u0435\u0441\u0442\u043e\u0432 \u0432\u043a\u043b\u0430\u0434\u043a\u0438 '\u041b\u0438\u0446\u0435\u043d\u0437\u0438\u0438'.

    \u0421\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0442\u0435\u0441\u0442\u044b \u0434\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u0438 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0433\u043e \u0432\u043a\u043b\u0430\u0434\u043a\u0438 \u043b\u0438\u0446\u0435\u043d\u0437\u0438\u0439.

    "},{"location":"tests/e2e/test_license_tab/#tests.e2e.test_license_tab.TestLicenseTab","title":"TestLicenseTab","text":"

    \u041a\u043b\u0430\u0441\u0441 \u0442\u0435\u0441\u0442\u043e\u0432 \u0434\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0432\u043a\u043b\u0430\u0434\u043a\u0438 '\u041b\u0438\u0446\u0435\u043d\u0437\u0438\u0438'.

    \u0422\u0435\u0441\u0442\u044b \u043f\u043e\u043a\u0440\u044b\u0432\u0430\u044e\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0438: 1. test_lisence_tab_content: \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u0432\u043a\u043b\u0430\u0434\u043a\u0438 '\u041b\u0438\u0446\u0435\u043d\u0437\u0438\u0438' 2. test_license_tab_input_form_and_check_alert: \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0444\u043e\u0440\u043c\u0443 \u0432\u0432\u043e\u0434\u0430 \u043b\u0438\u0446\u0435\u043d\u0437\u0438\u0438 \u0438 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0430\u043b\u0435\u0440\u0442\u043e\u0432

    Source code in tests\\e2e\\test_license_tab.py
    class TestLicenseTab:\n    \"\"\"\u041a\u043b\u0430\u0441\u0441 \u0442\u0435\u0441\u0442\u043e\u0432 \u0434\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0432\u043a\u043b\u0430\u0434\u043a\u0438 '\u041b\u0438\u0446\u0435\u043d\u0437\u0438\u0438'.\n\n    \u0422\u0435\u0441\u0442\u044b \u043f\u043e\u043a\u0440\u044b\u0432\u0430\u044e\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0438:\n    1. test_lisence_tab_content: \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u0432\u043a\u043b\u0430\u0434\u043a\u0438 '\u041b\u0438\u0446\u0435\u043d\u0437\u0438\u0438'\n    2. test_license_tab_input_form_and_check_alert: \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0444\u043e\u0440\u043c\u0443 \u0432\u0432\u043e\u0434\u0430 \u043b\u0438\u0446\u0435\u043d\u0437\u0438\u0438 \u0438 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0430\u043b\u0435\u0440\u0442\u043e\u0432\n    \"\"\"\n\n    @pytest.fixture(scope=\"function\", autouse=True)\n    def setup(self, browser: Page) -> None:\n        \"\"\"\u041d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u0442 \u0442\u0435\u0441\u0442\u043e\u0432\u043e\u0435 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0435 \u043f\u0435\u0440\u0435\u0434 \u043a\u0430\u0436\u0434\u044b\u043c \u0442\u0435\u0441\u0442\u043e\u043c.\n\n        Args:\n            browser: \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.\n        \"\"\"\n\n        lp = LoginPage(browser)\n        lp.do_login()\n\n        mp = MainPage(browser)\n        mp.should_be_navigation_panel()\n        mp.click_main_navigation_panel_item(\"\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438\")\n        mp.click_subpanel_item(\"\u041b\u0438\u0446\u0435\u043d\u0437\u0438\u0438\")\n\n    def test_lisence_tab_content(self, browser: Page) -> None:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u0432\u043a\u043b\u0430\u0434\u043a\u0438 '\u041b\u0438\u0446\u0435\u043d\u0437\u0438\u0438'.\n\n        Args:\n            browser: \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.\n        \"\"\"\n\n        lt = LicenseTab(browser)\n        lt.check_content()\n\n    def test_license_tab_input_form_and_check_alert(self, browser: Page) -> None:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0444\u043e\u0440\u043c\u0443 \u0432\u0432\u043e\u0434\u0430 \u043b\u0438\u0446\u0435\u043d\u0437\u0438\u0438 \u0438 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0430\u043b\u0435\u0440\u0442\u043e\u0432.\n\n        Args:\n            browser: \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.\n        \"\"\"\n\n        def gen_test_data() -> List[str]:\n            \"\"\"\u0413\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442 \u0442\u0435\u0441\u0442\u043e\u0432\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0434\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0444\u043e\u0440\u043c\u044b.\n\n            Returns:\n                List[str]: \u0421\u043f\u0438\u0441\u043e\u043a \u0442\u0435\u0441\u0442\u043e\u0432\u044b\u0445 \u0441\u0442\u0440\u043e\u043a \u043b\u0438\u0446\u0435\u043d\u0437\u0438\u0439.\n            \"\"\"\n\n            data = []\n            for i in range(3):\n                data.append(uuid.uuid4().hex)\n\n            lowercase_str = uuid.uuid4().hex\n            data.append(lowercase_str.upper())\n            data.append(lowercase_str + \"fffffffff\")\n            data.append(\"0\")\n            data.append(\"000000000000000000000000000000000000000000000000\")\n            data.append(\"-1\")\n\n            return data\n\n        lt = LicenseTab(browser)\n        lt.should_be_empty_input_form()\n\n        lt.fill_license_input_form(\"\")\n        lt.should_be_error_alert_window_with_text(\"\u041d\u0435\u0432\u0435\u0440\u043d\u044b\u0439 \u043b\u0438\u0446\u0435\u043d\u0437\u0438\u043e\u043d\u043d\u044b\u0439 \u043a\u043b\u044e\u0447\")\n\n        data = gen_test_data()\n\n        for data_string in data:\n            lt.fill_license_input_form(data_string)\n            lt.should_be_error_alert_window_with_text(\"\u041e\u0448\u0438\u0431\u043a\u0430 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u043b\u0438\u0446\u0435\u043d\u0437\u0438\u0438\")\n
    "},{"location":"tests/e2e/test_license_tab/#tests.e2e.test_license_tab.TestLicenseTab.setup","title":"setup(browser)","text":"

    \u041d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u0442 \u0442\u0435\u0441\u0442\u043e\u0432\u043e\u0435 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0435 \u043f\u0435\u0440\u0435\u0434 \u043a\u0430\u0436\u0434\u044b\u043c \u0442\u0435\u0441\u0442\u043e\u043c.

    Parameters:

    Name Type Description Default browser Page

    \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.

    required Source code in tests\\e2e\\test_license_tab.py
    @pytest.fixture(scope=\"function\", autouse=True)\ndef setup(self, browser: Page) -> None:\n    \"\"\"\u041d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u0442 \u0442\u0435\u0441\u0442\u043e\u0432\u043e\u0435 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0435 \u043f\u0435\u0440\u0435\u0434 \u043a\u0430\u0436\u0434\u044b\u043c \u0442\u0435\u0441\u0442\u043e\u043c.\n\n    Args:\n        browser: \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.\n    \"\"\"\n\n    lp = LoginPage(browser)\n    lp.do_login()\n\n    mp = MainPage(browser)\n    mp.should_be_navigation_panel()\n    mp.click_main_navigation_panel_item(\"\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438\")\n    mp.click_subpanel_item(\"\u041b\u0438\u0446\u0435\u043d\u0437\u0438\u0438\")\n
    "},{"location":"tests/e2e/test_license_tab/#tests.e2e.test_license_tab.TestLicenseTab.test_license_tab_input_form_and_check_alert","title":"test_license_tab_input_form_and_check_alert(browser)","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0444\u043e\u0440\u043c\u0443 \u0432\u0432\u043e\u0434\u0430 \u043b\u0438\u0446\u0435\u043d\u0437\u0438\u0438 \u0438 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0430\u043b\u0435\u0440\u0442\u043e\u0432.

    Parameters:

    Name Type Description Default browser Page

    \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.

    required Source code in tests\\e2e\\test_license_tab.py
    def test_license_tab_input_form_and_check_alert(self, browser: Page) -> None:\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0444\u043e\u0440\u043c\u0443 \u0432\u0432\u043e\u0434\u0430 \u043b\u0438\u0446\u0435\u043d\u0437\u0438\u0438 \u0438 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0430\u043b\u0435\u0440\u0442\u043e\u0432.\n\n    Args:\n        browser: \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.\n    \"\"\"\n\n    def gen_test_data() -> List[str]:\n        \"\"\"\u0413\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442 \u0442\u0435\u0441\u0442\u043e\u0432\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0434\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0444\u043e\u0440\u043c\u044b.\n\n        Returns:\n            List[str]: \u0421\u043f\u0438\u0441\u043e\u043a \u0442\u0435\u0441\u0442\u043e\u0432\u044b\u0445 \u0441\u0442\u0440\u043e\u043a \u043b\u0438\u0446\u0435\u043d\u0437\u0438\u0439.\n        \"\"\"\n\n        data = []\n        for i in range(3):\n            data.append(uuid.uuid4().hex)\n\n        lowercase_str = uuid.uuid4().hex\n        data.append(lowercase_str.upper())\n        data.append(lowercase_str + \"fffffffff\")\n        data.append(\"0\")\n        data.append(\"000000000000000000000000000000000000000000000000\")\n        data.append(\"-1\")\n\n        return data\n\n    lt = LicenseTab(browser)\n    lt.should_be_empty_input_form()\n\n    lt.fill_license_input_form(\"\")\n    lt.should_be_error_alert_window_with_text(\"\u041d\u0435\u0432\u0435\u0440\u043d\u044b\u0439 \u043b\u0438\u0446\u0435\u043d\u0437\u0438\u043e\u043d\u043d\u044b\u0439 \u043a\u043b\u044e\u0447\")\n\n    data = gen_test_data()\n\n    for data_string in data:\n        lt.fill_license_input_form(data_string)\n        lt.should_be_error_alert_window_with_text(\"\u041e\u0448\u0438\u0431\u043a\u0430 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u043b\u0438\u0446\u0435\u043d\u0437\u0438\u0438\")\n
    "},{"location":"tests/e2e/test_license_tab/#tests.e2e.test_license_tab.TestLicenseTab.test_lisence_tab_content","title":"test_lisence_tab_content(browser)","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u0432\u043a\u043b\u0430\u0434\u043a\u0438 '\u041b\u0438\u0446\u0435\u043d\u0437\u0438\u0438'.

    Parameters:

    Name Type Description Default browser Page

    \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.

    required Source code in tests\\e2e\\test_license_tab.py
    def test_lisence_tab_content(self, browser: Page) -> None:\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u0432\u043a\u043b\u0430\u0434\u043a\u0438 '\u041b\u0438\u0446\u0435\u043d\u0437\u0438\u0438'.\n\n    Args:\n        browser: \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.\n    \"\"\"\n\n    lt = LicenseTab(browser)\n    lt.check_content()\n
    "},{"location":"tests/e2e/test_login/","title":"TestLogin","text":"

    \u041c\u043e\u0434\u0443\u043b\u044c \u0442\u0435\u0441\u0442\u043e\u0432 \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u0438.

    \u0421\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0442\u0435\u0441\u0442\u044b \u0434\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u0430 \u0432\u0445\u043e\u0434\u0430 \u0438 \u0432\u044b\u0445\u043e\u0434\u0430 \u0438\u0437 \u0441\u0438\u0441\u0442\u0435\u043c\u044b.

    "},{"location":"tests/e2e/test_login/#tests.e2e.test_login.TestLogin","title":"TestLogin","text":"

    \u041a\u043b\u0430\u0441\u0441 \u0442\u0435\u0441\u0442\u043e\u0432 \u0434\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u0438.

    \u0422\u0435\u0441\u0442\u044b \u043f\u043e\u043a\u0440\u044b\u0432\u0430\u044e\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0438: 1. test_successful_login: \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0443\u0441\u043f\u0435\u0448\u043d\u044b\u0439 \u0432\u0445\u043e\u0434 \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0443 2. test_unsuccessful_login: \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u0445\u043e\u0434 \u0441 \u043d\u0435\u0432\u0435\u0440\u043d\u044b\u043c\u0438 \u0443\u0447\u0435\u0442\u043d\u044b\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u043c\u0438 3. test_successful_login_and_logout: \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0443\u0441\u043f\u0435\u0448\u043d\u044b\u0439 \u0432\u0445\u043e\u0434 \u0438 \u0432\u044b\u0445\u043e\u0434 \u0438\u0437 \u0441\u0438\u0441\u0442\u0435\u043c\u044b 4. test_password_visibility: \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432 \u043f\u0430\u0440\u043e\u043b\u044f

    Source code in tests\\e2e\\test_login.py
    class TestLogin:\n    \"\"\"\u041a\u043b\u0430\u0441\u0441 \u0442\u0435\u0441\u0442\u043e\u0432 \u0434\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u0438.\n\n    \u0422\u0435\u0441\u0442\u044b \u043f\u043e\u043a\u0440\u044b\u0432\u0430\u044e\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0438:\n    1. test_successful_login: \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0443\u0441\u043f\u0435\u0448\u043d\u044b\u0439 \u0432\u0445\u043e\u0434 \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0443\n    2. test_unsuccessful_login: \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u0445\u043e\u0434 \u0441 \u043d\u0435\u0432\u0435\u0440\u043d\u044b\u043c\u0438 \u0443\u0447\u0435\u0442\u043d\u044b\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u043c\u0438\n    3. test_successful_login_and_logout: \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0443\u0441\u043f\u0435\u0448\u043d\u044b\u0439 \u0432\u0445\u043e\u0434 \u0438 \u0432\u044b\u0445\u043e\u0434 \u0438\u0437 \u0441\u0438\u0441\u0442\u0435\u043c\u044b\n    4. test_password_visibility: \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432 \u043f\u0430\u0440\u043e\u043b\u044f\n    \"\"\"\n\n    def test_successful_login(self, browser: Page) -> None:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0443\u0441\u043f\u0435\u0448\u043d\u044b\u0439 \u0432\u0445\u043e\u0434 \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0443.\n\n        Args:\n            browser: \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.\n        \"\"\"\n\n        lp = LoginPage(browser)\n        lp.do_login()\n\n    def test_unsuccessful_login(self, browser: Page) -> None:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u0445\u043e\u0434 \u0441 \u043d\u0435\u0432\u0435\u0440\u043d\u044b\u043c\u0438 \u0443\u0447\u0435\u0442\u043d\u044b\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u043c\u0438.\n\n        Args:\n            browser: \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.\n        \"\"\"\n\n        lp = LoginPage(browser)\n        lp.do_unsuccessful_login()\n\n    def test_successful_login_and_logout(self, browser: Page) -> None:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0443\u0441\u043f\u0435\u0448\u043d\u044b\u0439 \u0432\u0445\u043e\u0434 \u0438 \u0432\u044b\u0445\u043e\u0434 \u0438\u0437 \u0441\u0438\u0441\u0442\u0435\u043c\u044b.\n\n        Args:\n            browser: \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.\n        \"\"\"\n\n        lp = LoginPage(browser)\n        lp.do_login()\n\n        mp = MainPage(browser)\n        mp.do_logout()\n\n    def test_password_visibility(self, browser: Page) -> None:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432 \u043f\u0430\u0440\u043e\u043b\u044f.\n\n        Args:\n            browser: \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.\n        \"\"\"\n\n        lp = LoginPage(browser)\n        lp.open(\"\")\n\n        is_hidden_icon = lp.is_password_icon_hidden()\n\n        if is_hidden_icon:\n            is_hidden = lp.is_password_hidden()\n            assert is_hidden, \"Password should be hidden\"\n\n            # \u041d\u0430\u0436\u0430\u0442\u0438\u0435 \u043d\u0430 \u0438\u043a\u043e\u043d\u043a\u0443 \u0441\u043a\u0440\u044b\u0442\u0438\u044f \u043f\u0430\u0440\u043e\u043b\u044f, \u043f\u0430\u0440\u043e\u043b\u044c \u0432\u0438\u0434\u0438\u043c\n            lp.click_password_hidden_icon()\n            is_hidden_icon = lp.is_password_icon_hidden()\n            is_hidden = lp.is_password_hidden()\n\n            assert not is_hidden_icon, \"Password hidden icon should not be in hidden state\"\n            assert not is_hidden, \"Password should be visible\"\n        else:\n            is_hidden = lp.is_password_hidden()\n            assert not is_hidden, \"Password should be visible\"\n\n            # \u041d\u0430\u0436\u0430\u0442\u0438\u0435 \u043d\u0430 \u0438\u043a\u043e\u043d\u043a\u0443 \u0441\u043a\u0440\u044b\u0442\u0438\u044f \u043f\u0430\u0440\u043e\u043b\u044f, \u043f\u0430\u0440\u043e\u043b\u044c \u0441\u043a\u0440\u044b\u0442\n            lp.click_password_hidden_icon()\n            is_hidden_icon = lp.is_password_icon_hidden()\n            is_hidden = lp.is_password_hidden()\n\n            assert is_hidden_icon, \"Password hidden icon should be in hidden state\"\n            assert is_hidden, \"Password should be hidden\"\n
    "},{"location":"tests/e2e/test_login/#tests.e2e.test_login.TestLogin.test_password_visibility","title":"test_password_visibility(browser)","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432 \u043f\u0430\u0440\u043e\u043b\u044f.

    Parameters:

    Name Type Description Default browser Page

    \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.

    required Source code in tests\\e2e\\test_login.py
    def test_password_visibility(self, browser: Page) -> None:\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432 \u043f\u0430\u0440\u043e\u043b\u044f.\n\n    Args:\n        browser: \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.\n    \"\"\"\n\n    lp = LoginPage(browser)\n    lp.open(\"\")\n\n    is_hidden_icon = lp.is_password_icon_hidden()\n\n    if is_hidden_icon:\n        is_hidden = lp.is_password_hidden()\n        assert is_hidden, \"Password should be hidden\"\n\n        # \u041d\u0430\u0436\u0430\u0442\u0438\u0435 \u043d\u0430 \u0438\u043a\u043e\u043d\u043a\u0443 \u0441\u043a\u0440\u044b\u0442\u0438\u044f \u043f\u0430\u0440\u043e\u043b\u044f, \u043f\u0430\u0440\u043e\u043b\u044c \u0432\u0438\u0434\u0438\u043c\n        lp.click_password_hidden_icon()\n        is_hidden_icon = lp.is_password_icon_hidden()\n        is_hidden = lp.is_password_hidden()\n\n        assert not is_hidden_icon, \"Password hidden icon should not be in hidden state\"\n        assert not is_hidden, \"Password should be visible\"\n    else:\n        is_hidden = lp.is_password_hidden()\n        assert not is_hidden, \"Password should be visible\"\n\n        # \u041d\u0430\u0436\u0430\u0442\u0438\u0435 \u043d\u0430 \u0438\u043a\u043e\u043d\u043a\u0443 \u0441\u043a\u0440\u044b\u0442\u0438\u044f \u043f\u0430\u0440\u043e\u043b\u044f, \u043f\u0430\u0440\u043e\u043b\u044c \u0441\u043a\u0440\u044b\u0442\n        lp.click_password_hidden_icon()\n        is_hidden_icon = lp.is_password_icon_hidden()\n        is_hidden = lp.is_password_hidden()\n\n        assert is_hidden_icon, \"Password hidden icon should be in hidden state\"\n        assert is_hidden, \"Password should be hidden\"\n
    "},{"location":"tests/e2e/test_login/#tests.e2e.test_login.TestLogin.test_successful_login","title":"test_successful_login(browser)","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0443\u0441\u043f\u0435\u0448\u043d\u044b\u0439 \u0432\u0445\u043e\u0434 \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0443.

    Parameters:

    Name Type Description Default browser Page

    \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.

    required Source code in tests\\e2e\\test_login.py
    def test_successful_login(self, browser: Page) -> None:\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0443\u0441\u043f\u0435\u0448\u043d\u044b\u0439 \u0432\u0445\u043e\u0434 \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0443.\n\n    Args:\n        browser: \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.\n    \"\"\"\n\n    lp = LoginPage(browser)\n    lp.do_login()\n
    "},{"location":"tests/e2e/test_login/#tests.e2e.test_login.TestLogin.test_successful_login_and_logout","title":"test_successful_login_and_logout(browser)","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0443\u0441\u043f\u0435\u0448\u043d\u044b\u0439 \u0432\u0445\u043e\u0434 \u0438 \u0432\u044b\u0445\u043e\u0434 \u0438\u0437 \u0441\u0438\u0441\u0442\u0435\u043c\u044b.

    Parameters:

    Name Type Description Default browser Page

    \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.

    required Source code in tests\\e2e\\test_login.py
    def test_successful_login_and_logout(self, browser: Page) -> None:\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0443\u0441\u043f\u0435\u0448\u043d\u044b\u0439 \u0432\u0445\u043e\u0434 \u0438 \u0432\u044b\u0445\u043e\u0434 \u0438\u0437 \u0441\u0438\u0441\u0442\u0435\u043c\u044b.\n\n    Args:\n        browser: \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.\n    \"\"\"\n\n    lp = LoginPage(browser)\n    lp.do_login()\n\n    mp = MainPage(browser)\n    mp.do_logout()\n
    "},{"location":"tests/e2e/test_login/#tests.e2e.test_login.TestLogin.test_unsuccessful_login","title":"test_unsuccessful_login(browser)","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u0445\u043e\u0434 \u0441 \u043d\u0435\u0432\u0435\u0440\u043d\u044b\u043c\u0438 \u0443\u0447\u0435\u0442\u043d\u044b\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u043c\u0438.

    Parameters:

    Name Type Description Default browser Page

    \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.

    required Source code in tests\\e2e\\test_login.py
    def test_unsuccessful_login(self, browser: Page) -> None:\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u0445\u043e\u0434 \u0441 \u043d\u0435\u0432\u0435\u0440\u043d\u044b\u043c\u0438 \u0443\u0447\u0435\u0442\u043d\u044b\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u043c\u0438.\n\n    Args:\n        browser: \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.\n    \"\"\"\n\n    lp = LoginPage(browser)\n    lp.do_unsuccessful_login()\n
    "},{"location":"tests/e2e/test_service_status_tab/","title":"TestServiceStatusTab","text":"

    \u041c\u043e\u0434\u0443\u043b\u044c \u0442\u0435\u0441\u0442\u043e\u0432 \u0432\u043a\u043b\u0430\u0434\u043a\u0438 '\u0421\u0442\u0430\u0442\u0443\u0441 \u043e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u043d\u0438\u044f'.

    \u0421\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0442\u0435\u0441\u0442\u044b \u0434\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0432\u043a\u043b\u0430\u0434\u043a\u0438 \u0441\u0442\u0430\u0442\u0443\u0441\u043e\u0432 \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432.

    "},{"location":"tests/e2e/test_service_status_tab/#tests.e2e.test_service_status_tab.TestServiceStatusTab","title":"TestServiceStatusTab","text":"

    \u041a\u043b\u0430\u0441\u0441 \u0442\u0435\u0441\u0442\u043e\u0432 \u0434\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0432\u043a\u043b\u0430\u0434\u043a\u0438 '\u0421\u0442\u0430\u0442\u0443\u0441 \u043e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u043d\u0438\u044f'.

    \u0422\u0435\u0441\u0442\u044b \u043f\u043e\u043a\u0440\u044b\u0432\u0430\u044e\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0438: 1. test_service_status_tab_content: \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u0432\u043a\u043b\u0430\u0434\u043a\u0438 '\u0421\u0442\u0430\u0442\u0443\u0441 \u043e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u043d\u0438\u044f' 2. test_service_status_table_row_highlighting: \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0441\u0442\u0440\u043e\u043a \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435 \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432

    Source code in tests\\e2e\\test_service_status_tab.py
    class TestServiceStatusTab:\n    \"\"\"\u041a\u043b\u0430\u0441\u0441 \u0442\u0435\u0441\u0442\u043e\u0432 \u0434\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0432\u043a\u043b\u0430\u0434\u043a\u0438 '\u0421\u0442\u0430\u0442\u0443\u0441 \u043e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u043d\u0438\u044f'.\n\n    \u0422\u0435\u0441\u0442\u044b \u043f\u043e\u043a\u0440\u044b\u0432\u0430\u044e\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0438:\n    1. test_service_status_tab_content: \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u0432\u043a\u043b\u0430\u0434\u043a\u0438 '\u0421\u0442\u0430\u0442\u0443\u0441 \u043e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u043d\u0438\u044f'\n    2. test_service_status_table_row_highlighting: \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0441\u0442\u0440\u043e\u043a \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435 \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432\n    \"\"\"\n\n    @pytest.fixture(scope=\"function\", autouse=True)\n    def setup(self, browser: Page):\n        \"\"\"\u041f\u043e\u0434\u0433\u043e\u0442\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442 \u0442\u0435\u0441\u0442\u043e\u0432\u043e\u0435 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0435.\n\n        Args:\n            browser: \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.\n        \"\"\"\n\n        lp = LoginPage(browser)\n        lp.do_login()\n\n        # \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u043d\u0430 \u0433\u043b\u0430\u0432\u043d\u0443\u044e \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0443\n        mp = MainPage(browser)\n\n        # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043d\u0430\u043b\u0438\u0447\u0438\u044f \u043f\u0430\u043d\u0435\u043b\u0438 \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438\n        mp.should_be_navigation_panel()\n\n        # \u041a\u043b\u0438\u043a \u043f\u043e \u043f\u0443\u043d\u043a\u0442\u0443 '\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438' \u0432 \u0433\u043b\u0430\u0432\u043d\u043e\u0439 \u043f\u0430\u043d\u0435\u043b\u0438 \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438\n        mp.click_main_navigation_panel_item(\"\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438\")\n\n        # \u041a\u043b\u0438\u043a \u043f\u043e \u043f\u0443\u043d\u043a\u0442\u0443 '\u041e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u043d\u0438\u0435 \u0438 \u0434\u0438\u0430\u0433\u043d\u043e\u0441\u0442\u0438\u043a\u0430' \u0432 \u043f\u0430\u043d\u0435\u043b\u0438 \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438 \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043a\n        mp.click_subpanel_item(\"\u041e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u043d\u0438\u0435 \u0438 \u0434\u0438\u0430\u0433\u043d\u043e\u0441\u0442\u0438\u043a\u0430\")\n\n        # \u041a\u043b\u0438\u043a \u043f\u043e \u043f\u0443\u043d\u043a\u0442\u0443 '\u0421\u0442\u0430\u0442\u0443\u0441 \u043e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u043d\u0438\u044f' \u0432 \u043f\u0430\u043d\u0435\u043b\u0438 \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438 \u043e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u043d\u0438\u044f\n        mp.click_subpanel_item(\"\u0421\u0442\u0430\u0442\u0443\u0441 \u043e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u043d\u0438\u044f\")\n\n    def test_service_status_tab_content(self, browser: Page):\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u0432\u043a\u043b\u0430\u0434\u043a\u0438 '\u0421\u0442\u0430\u0442\u0443\u0441 \u043e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u043d\u0438\u044f'.\n\n        Args:\n            browser: \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.\n        \"\"\"\n\n        sst = ServiceStatusTab(browser)\n\n        # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0442\u0443\u043b\u0431\u0430\u0440\u0430 \u0432\u043a\u043b\u0430\u0434\u043a\u0438\n        sst.should_be_toolbar()\n\n        # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043d\u0430\u043b\u0438\u0447\u0438\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0441\u0442\u0430\u0442\u0443\u0441\u043e\u0432 \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432\n        sst.should_be_services_table()\n\n        # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0433\u043e \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432\n        sst.check_services_table_content()\n\n    def test_service_status_table_row_highlighting(self, browser: Page):\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0441\u0442\u0440\u043e\u043a \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435 \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432.\n\n        Args:\n            browser: \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.\n        \"\"\"\n\n        sst = ServiceStatusTab(browser)\n\n        # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0442\u0443\u043b\u0431\u0430\u0440\u0430 \u0432\u043a\u043b\u0430\u0434\u043a\u0438\n        sst.should_be_toolbar()\n\n        # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043d\u0430\u043b\u0438\u0447\u0438\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0441\u0442\u0430\u0442\u0443\u0441\u043e\u0432 \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432\n        sst.should_be_services_table()\n\n        # \u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0430 \u0441\u0442\u0440\u043e\u043a \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435\n        rows_count = sst.get_rows_count()\n\n        # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0441\u0442\u0440\u043e\u043a\n        sst.check_services_table_row_highlighting(0)\n        sst.check_services_table_row_highlighting(rows_count - 1)\n        sst.check_services_table_row_highlighting(int(rows_count / 2))\n
    "},{"location":"tests/e2e/test_service_status_tab/#tests.e2e.test_service_status_tab.TestServiceStatusTab.setup","title":"setup(browser)","text":"

    \u041f\u043e\u0434\u0433\u043e\u0442\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442 \u0442\u0435\u0441\u0442\u043e\u0432\u043e\u0435 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0435.

    Parameters:

    Name Type Description Default browser Page

    \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.

    required Source code in tests\\e2e\\test_service_status_tab.py
    @pytest.fixture(scope=\"function\", autouse=True)\ndef setup(self, browser: Page):\n    \"\"\"\u041f\u043e\u0434\u0433\u043e\u0442\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442 \u0442\u0435\u0441\u0442\u043e\u0432\u043e\u0435 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0435.\n\n    Args:\n        browser: \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.\n    \"\"\"\n\n    lp = LoginPage(browser)\n    lp.do_login()\n\n    # \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u043d\u0430 \u0433\u043b\u0430\u0432\u043d\u0443\u044e \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0443\n    mp = MainPage(browser)\n\n    # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043d\u0430\u043b\u0438\u0447\u0438\u044f \u043f\u0430\u043d\u0435\u043b\u0438 \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438\n    mp.should_be_navigation_panel()\n\n    # \u041a\u043b\u0438\u043a \u043f\u043e \u043f\u0443\u043d\u043a\u0442\u0443 '\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438' \u0432 \u0433\u043b\u0430\u0432\u043d\u043e\u0439 \u043f\u0430\u043d\u0435\u043b\u0438 \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438\n    mp.click_main_navigation_panel_item(\"\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438\")\n\n    # \u041a\u043b\u0438\u043a \u043f\u043e \u043f\u0443\u043d\u043a\u0442\u0443 '\u041e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u043d\u0438\u0435 \u0438 \u0434\u0438\u0430\u0433\u043d\u043e\u0441\u0442\u0438\u043a\u0430' \u0432 \u043f\u0430\u043d\u0435\u043b\u0438 \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438 \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043a\n    mp.click_subpanel_item(\"\u041e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u043d\u0438\u0435 \u0438 \u0434\u0438\u0430\u0433\u043d\u043e\u0441\u0442\u0438\u043a\u0430\")\n\n    # \u041a\u043b\u0438\u043a \u043f\u043e \u043f\u0443\u043d\u043a\u0442\u0443 '\u0421\u0442\u0430\u0442\u0443\u0441 \u043e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u043d\u0438\u044f' \u0432 \u043f\u0430\u043d\u0435\u043b\u0438 \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438 \u043e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u043d\u0438\u044f\n    mp.click_subpanel_item(\"\u0421\u0442\u0430\u0442\u0443\u0441 \u043e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u043d\u0438\u044f\")\n
    "},{"location":"tests/e2e/test_service_status_tab/#tests.e2e.test_service_status_tab.TestServiceStatusTab.test_service_status_tab_content","title":"test_service_status_tab_content(browser)","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u0432\u043a\u043b\u0430\u0434\u043a\u0438 '\u0421\u0442\u0430\u0442\u0443\u0441 \u043e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u043d\u0438\u044f'.

    Parameters:

    Name Type Description Default browser Page

    \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.

    required Source code in tests\\e2e\\test_service_status_tab.py
    def test_service_status_tab_content(self, browser: Page):\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u0432\u043a\u043b\u0430\u0434\u043a\u0438 '\u0421\u0442\u0430\u0442\u0443\u0441 \u043e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u043d\u0438\u044f'.\n\n    Args:\n        browser: \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.\n    \"\"\"\n\n    sst = ServiceStatusTab(browser)\n\n    # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0442\u0443\u043b\u0431\u0430\u0440\u0430 \u0432\u043a\u043b\u0430\u0434\u043a\u0438\n    sst.should_be_toolbar()\n\n    # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043d\u0430\u043b\u0438\u0447\u0438\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0441\u0442\u0430\u0442\u0443\u0441\u043e\u0432 \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432\n    sst.should_be_services_table()\n\n    # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0433\u043e \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432\n    sst.check_services_table_content()\n
    "},{"location":"tests/e2e/test_service_status_tab/#tests.e2e.test_service_status_tab.TestServiceStatusTab.test_service_status_table_row_highlighting","title":"test_service_status_table_row_highlighting(browser)","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0441\u0442\u0440\u043e\u043a \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435 \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432.

    Parameters:

    Name Type Description Default browser Page

    \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.

    required Source code in tests\\e2e\\test_service_status_tab.py
    def test_service_status_table_row_highlighting(self, browser: Page):\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0441\u0442\u0440\u043e\u043a \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435 \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432.\n\n    Args:\n        browser: \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.\n    \"\"\"\n\n    sst = ServiceStatusTab(browser)\n\n    # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0442\u0443\u043b\u0431\u0430\u0440\u0430 \u0432\u043a\u043b\u0430\u0434\u043a\u0438\n    sst.should_be_toolbar()\n\n    # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043d\u0430\u043b\u0438\u0447\u0438\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0441\u0442\u0430\u0442\u0443\u0441\u043e\u0432 \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432\n    sst.should_be_services_table()\n\n    # \u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0430 \u0441\u0442\u0440\u043e\u043a \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435\n    rows_count = sst.get_rows_count()\n\n    # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0441\u0442\u0440\u043e\u043a\n    sst.check_services_table_row_highlighting(0)\n    sst.check_services_table_row_highlighting(rows_count - 1)\n    sst.check_services_table_row_highlighting(int(rows_count / 2))\n
    "},{"location":"tests/e2e/test_sessions_tab/","title":"TestSessionTab","text":"

    \u041c\u043e\u0434\u0443\u043b\u044c \u0442\u0435\u0441\u0442\u043e\u0432 \u0432\u043a\u043b\u0430\u0434\u043a\u0438 '\u0421\u0435\u0430\u043d\u0441\u044b'.

    \u0421\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0442\u0435\u0441\u0442\u044b \u0434\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0442\u0441\u043a\u0438\u043c\u0438 \u0441\u0435\u0430\u043d\u0441\u0430\u043c\u0438.

    "},{"location":"tests/e2e/test_sessions_tab/#tests.e2e.test_sessions_tab.TestSessionsTab","title":"TestSessionsTab","text":"

    \u041d\u0430\u0431\u043e\u0440 \u0442\u0435\u0441\u0442\u043e\u0432 \u0434\u043b\u044f \u0432\u043a\u043b\u0430\u0434\u043a\u0438 '\u0421\u0435\u0430\u043d\u0441\u044b'.

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0441\u0442\u044c \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0432\u043a\u043b\u0430\u0434\u043a\u0438 \u0441\u0435\u0430\u043d\u0441\u043e\u0432, \u0432\u043a\u043b\u044e\u0447\u0430\u044f \u0440\u0430\u0431\u043e\u0442\u0443 \u0441 \u0441\u0435\u0430\u043d\u0441\u0430\u043c\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439, \u0438\u0445 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435, \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u0438 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0443\u044e \u043e\u0447\u0438\u0441\u0442\u043a\u0443.

    \u0422\u0435\u0441\u0442\u044b \u043f\u043e\u043a\u0440\u044b\u0432\u0430\u044e\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0438: 1. test_sessions_tab_content: \u0422\u0435\u0441\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0433\u043e \u0432\u043a\u043b\u0430\u0434\u043a\u0438 '\u0421\u0435\u0430\u043d\u0441\u044b' 2. test_delete_session_confirm_window: \u0422\u0435\u0441\u0442 \u043e\u043a\u043d\u0430 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u044f \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u0441\u0435\u0430\u043d\u0441\u0430 3. test_delete_session_after_logout: \u0422\u0435\u0441\u0442 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u0441\u0435\u0430\u043d\u0441\u0430 \u043f\u043e\u0441\u043b\u0435 \u0432\u044b\u0445\u043e\u0434\u0430 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0438\u0437 \u0441\u0438\u0441\u0442\u0435\u043c\u044b 4. test_delete_existed_session: \u0422\u0435\u0441\u0442 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u043e\u0433\u043e \u0441\u0435\u0430\u043d\u0441\u0430 5 test_multiple_users_sessions: \u0422\u0435\u0441\u0442 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 \u0438 \u0438\u0445 \u0441\u0435\u0430\u043d\u0441\u043e\u0432 6. test_session_removed_when_user_deleted: \u0422\u0435\u0441\u0442 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u0441\u0435\u0430\u043d\u0441\u0430 \u043f\u0440\u0438 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f 7. test_session_auto_deletion_after_15_minutes: \u0422\u0435\u0441\u0442 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u0441\u0435\u0430\u043d\u0441\u0430 \u0447\u0435\u0440\u0435\u0437 15 \u043c\u0438\u043d\u0443\u0442 \u043f\u043e\u0441\u043b\u0435 \u0432\u044b\u0445\u043e\u0434\u0430 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f 8. test_user_cannot_delete_own_session: \u0422\u0435\u0441\u0442 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u043d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u0441\u0432\u043e\u0439 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u0441\u0435\u0430\u043d\u0441

    Source code in tests\\e2e\\test_sessions_tab.py
    class TestSessionsTab:\n    \"\"\"\u041d\u0430\u0431\u043e\u0440 \u0442\u0435\u0441\u0442\u043e\u0432 \u0434\u043b\u044f \u0432\u043a\u043b\u0430\u0434\u043a\u0438 '\u0421\u0435\u0430\u043d\u0441\u044b'.\n\n    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0441\u0442\u044c \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0432\u043a\u043b\u0430\u0434\u043a\u0438 \u0441\u0435\u0430\u043d\u0441\u043e\u0432,\n    \u0432\u043a\u043b\u044e\u0447\u0430\u044f \u0440\u0430\u0431\u043e\u0442\u0443 \u0441 \u0441\u0435\u0430\u043d\u0441\u0430\u043c\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439, \u0438\u0445 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435, \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u0438 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0443\u044e \u043e\u0447\u0438\u0441\u0442\u043a\u0443.\n\n    \u0422\u0435\u0441\u0442\u044b \u043f\u043e\u043a\u0440\u044b\u0432\u0430\u044e\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0438:\n    1. test_sessions_tab_content: \u0422\u0435\u0441\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0433\u043e \u0432\u043a\u043b\u0430\u0434\u043a\u0438 '\u0421\u0435\u0430\u043d\u0441\u044b'\n    2. test_delete_session_confirm_window: \u0422\u0435\u0441\u0442 \u043e\u043a\u043d\u0430 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u044f \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u0441\u0435\u0430\u043d\u0441\u0430\n    3. test_delete_session_after_logout: \u0422\u0435\u0441\u0442 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u0441\u0435\u0430\u043d\u0441\u0430 \u043f\u043e\u0441\u043b\u0435 \u0432\u044b\u0445\u043e\u0434\u0430 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0438\u0437 \u0441\u0438\u0441\u0442\u0435\u043c\u044b\n    4. test_delete_existed_session: \u0422\u0435\u0441\u0442 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u043e\u0433\u043e \u0441\u0435\u0430\u043d\u0441\u0430\n    5 test_multiple_users_sessions: \u0422\u0435\u0441\u0442 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 \u0438 \u0438\u0445 \u0441\u0435\u0430\u043d\u0441\u043e\u0432\n    6. test_session_removed_when_user_deleted: \u0422\u0435\u0441\u0442 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u0441\u0435\u0430\u043d\u0441\u0430 \u043f\u0440\u0438 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\n    7. test_session_auto_deletion_after_15_minutes: \u0422\u0435\u0441\u0442 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u0441\u0435\u0430\u043d\u0441\u0430 \u0447\u0435\u0440\u0435\u0437 15 \u043c\u0438\u043d\u0443\u0442 \u043f\u043e\u0441\u043b\u0435 \u0432\u044b\u0445\u043e\u0434\u0430 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\n    8. test_user_cannot_delete_own_session: \u0422\u0435\u0441\u0442 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u043d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u0441\u0432\u043e\u0439 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u0441\u0435\u0430\u043d\u0441\n    \"\"\"\n\n\n    @pytest.fixture(scope=\"function\", autouse=True)\n    def setup(self, browser: Page) -> None:\n        \"\"\"\u0424\u0438\u043a\u0441\u0442\u0443\u0440\u0430 \u0434\u043b\u044f \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0438 \u0442\u0435\u0441\u0442\u043e\u0432\u043e\u0433\u043e \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f.\n\n        \u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442:\n        1. \u0410\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u044e \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0435\n        2. \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u043d\u0430 \u0432\u043a\u043b\u0430\u0434\u043a\u0443 '\u0421\u0435\u0430\u043d\u0441\u044b' \u0447\u0435\u0440\u0435\u0437 \u043f\u0430\u043d\u0435\u043b\u044c \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438\n        \"\"\"\n        # \u0410\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u044f \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0435\n        login_page = LoginPage(browser)\n        login_page.do_login()\n\n        # \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0433\u043b\u0430\u0432\u043d\u043e\u0439 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b\n        main_page = MainPage(browser)\n\n        # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0438 \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u0441 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u043c\u0438 \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438\n        main_page.should_be_navigation_panel()\n        main_page.click_main_navigation_panel_item(\"\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438\")\n        main_page.click_subpanel_item(\"\u041e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u043d\u0438\u0435 \u0438 \u0434\u0438\u0430\u0433\u043d\u043e\u0441\u0442\u0438\u043a\u0430\")\n        main_page.click_subpanel_item(\"\u0421\u0435\u0430\u043d\u0441\u044b\")\n\n    @pytest.fixture(scope=\"function\")\n    def cleanup_users(self, browser: Page) -> None:\n        \"\"\"\u0424\u0438\u043a\u0441\u0442\u0443\u0440\u0430 \u0434\u043b\u044f \u043e\u0447\u0438\u0441\u0442\u043a\u0438 \u0442\u0435\u0441\u0442\u043e\u0432\u044b\u0445 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 \u0438 \u0438\u0445 \u0441\u0435\u0430\u043d\u0441\u043e\u0432 \u043f\u043e\u0441\u043b\u0435 \u0442\u0435\u0441\u0442\u0430.\"\"\"\n        yield\n\n        # \u0412\u044b\u0445\u043e\u0434 \u0438\u0437 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\n        mp = MainPage(browser)\n        mp.do_logout()\n\n        # \u0410\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u044f \u0430\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440\u043e\u043c \u0434\u043b\u044f \u043e\u0447\u0438\u0441\u0442\u043a\u0438\n        login_page = LoginPage(browser)\n        login_page.do_login()\n\n        # \u0423\u0434\u0430\u043b\u044f\u0435\u043c \u0442\u0435\u0441\u0442\u043e\u0432\u044b\u0445 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439\n        self._cleanup_test_users(browser)\n\n    def _cleanup_test_users(self, browser: Page) -> None:\n        \"\"\"\u0423\u0434\u0430\u043b\u044f\u0435\u0442 \u0442\u0435\u0441\u0442\u043e\u0432\u044b\u0445 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439.\"\"\"\n        mp = MainPage(browser)\n        mp.click_main_navigation_panel_item(\"\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438\")\n        mp.click_subpanel_item(\"\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438\")\n        ut = UsersTab(browser)\n\n        # \u0423\u0434\u0430\u043b\u044f\u0435\u043c \u0442\u0435\u0441\u0442\u043e\u0432\u044b\u0445 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439\n        test_users = [\"TestUser1\", \"TestUser2\", \"TestUser3\", \"TestUserForSessionDeletion\",\n                     \"TestUserForManualDeletion\", \"UserForAutoSessionDeletion\",\n                     \"TestUserFor15MinDeletion\", \"TestUserForSelfDeletion\"]\n\n        for user_name in test_users:\n            # \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u043b\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u0438 \u0443\u0434\u0430\u043b\u044f\u0435\u043c \u0435\u0433\u043e\n            user_index = ut.find_user_in_table(user_name, \"\u0410\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440\")\n            if user_index != -1:\n                ut.open_edit_user_page_by_user(user_name, \"\u0410\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440\")\n                ut.delete_user(user_name)\n\n    def test_sessions_tab_content(self, browser: Page) -> None:\n        \"\"\"\u0422\u0435\u0441\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0433\u043e \u0432\u043a\u043b\u0430\u0434\u043a\u0438 '\u0421\u0435\u0430\u043d\u0441\u044b'.\n\n        \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442:\n        1. \u041d\u0430\u043b\u0438\u0447\u0438\u0435 \u0438 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0441\u0442\u044c \u0442\u0443\u043b\u0431\u0430\u0440\u0430\n        2. \u041d\u0430\u043b\u0438\u0447\u0438\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0441\u0435\u0430\u043d\u0441\u043e\u0432\n        3. \u0421\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0433\u043e \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0434\u0430\u043d\u043d\u044b\u043c \u0438\u0437 \u0411\u0414\n        \"\"\"\n        # \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u0441\u0435\u0430\u043d\u0441\u043e\u0432\n        sessions_tab = SessionsTab(browser)\n\n        # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430\n        sessions_tab.should_be_toolbar()\n        sessions_tab.should_be_sessions_table()\n\n        # \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c API \u043e\u0442\u0432\u0435\u0442\n        response = sessions_tab.send_get_api_request(\"e-nms/auth/sessions\")\n        response_body = sessions_tab.get_response_body(response)\n\n        if not response_body:\n            print(\"No sessions data from API - table might be empty\")\n            # \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u0442\u043e\u043b\u044c\u043a\u043e \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0438\n            sessions_tab.check_sessions_table_content(verify=False)\n        else:\n            sessions_tab.check_sessions_table_content(verify=True)\n\n        # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0433\u043e \u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u0441 \u0432\u0435\u0440\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0435\u0439 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438\u0437 \u0411\u0414\n        sessions_tab.check_sessions_table_content(verify=True)\n\n\n    def test_delete_session_confirm_window(self, browser: Page) -> None:\n        \"\"\"\u0422\u0435\u0441\u0442 \u043e\u043a\u043d\u0430 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u044f \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u0441\u0435\u0430\u043d\u0441\u0430.\n\n        \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442:\n        1. \u041d\u0430\u043b\u0438\u0447\u0438\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0441\u0435\u0430\u043d\u0441\u043e\u0432\n        2. \u0421\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u043e\u043a\u043d\u0430 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u044f \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u0441\u0435\u0430\u043d\u0441\u0430\n        3. \u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0433\u043e\u0440\u0438\u0437\u043e\u043d\u0442\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0441\u043a\u0440\u043e\u043b\u043b\u0438\u043d\u0433\u0430 \u0432 \u043e\u043a\u043d\u0435 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u044f\n        4. \u041a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0441\u0442\u044c \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430 \u0432 \u043e\u043a\u043d\u0435 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u044f\n        5. \u0424\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u043a\u043d\u043e\u043f\u043e\u043a \u0432 \u043e\u043a\u043d\u0435 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u044f \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f\n        \"\"\"\n        # \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u0441\u0435\u0430\u043d\u0441\u043e\u0432\n        sessions_tab = SessionsTab(browser)\n\n        # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043d\u0430\u043b\u0438\u0447\u0438\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0441\u0435\u0430\u043d\u0441\u043e\u0432\n        sessions_tab.should_be_sessions_table()\n\n        # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043a\u043e\u043d\u0442\u0435\u043d\u0442\u0430 \u0438 \u0441\u043a\u0440\u043e\u043b\u043b\u0438\u043d\u0433\u0430 \u043e\u043a\u043d\u0430 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u044f \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u0441\u0435\u0430\u043d\u0441\u0430\n        sessions_tab.check_delete_session_confirm_window()\n\n    @pytest.mark.skip(reason=\"\u041d\u0435 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u043e \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u043c, \u0437\u0430\u0432\u0435\u0434\u0435\u043d \u0442\u0438\u043a\u0435\u0442\")\n    def test_delete_session_after_logout(self, browser: Page, cleanup_users: None) -> None:\n        \"\"\"\u0422\u0435\u0441\u0442 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u0441\u0435\u0430\u043d\u0441\u0430 \u043f\u043e\u0441\u043b\u0435 \u0432\u044b\u0445\u043e\u0434\u0430 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0438\u0437 \u0441\u0438\u0441\u0442\u0435\u043c\u044b.\n\n        \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442:\n        1. \u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043d\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\n        2. \u0412\u0445\u043e\u0434 \u043d\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0443\n        3. \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043d\u0430\u043b\u0438\u0447\u0438\u044f \u0441\u0435\u0430\u043d\u0441\u0430 \u043d\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\n        4. \u0412\u044b\u0445\u043e\u0434 \u043d\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0438\u0437 \u0441\u0438\u0441\u0442\u0435\u043c\u044b (logout)\n        5. \u0412\u0445\u043e\u0434 \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0443 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f admin\n        6. \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u044f \u0441\u0435\u0430\u043d\u0441\u0430 \u043d\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\n        7. \u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0444\u0438\u043a\u0441\u0442\u0443\u0440\u043e\u0439 cleanup_users\n        \"\"\"\n        user_data = {\"name\": \"TestUserForSessionDeletion\", \"role\": \"\u0410\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440\", \"password\": \"qwerty\"}\n\n        mp = MainPage(browser)\n        ut = UsersTab(browser)\n\n        # \u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043d\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\n        mp.click_subpanel_item(\"\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438\")\n        ut.open_add_user_window()\n        ut.add_new_user(user_data)\n\n        # \u041e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u0441\u043f\u0438\u0441\u043a\u0430 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 (\u0434\u0432\u043e\u0439\u043d\u043e\u0439 \u043a\u043b\u0438\u043a - \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u0431\u0430\u0433?)\n        mp.click_subpanel_item(\"\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438\")\n        mp.click_subpanel_item(\"\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438\")\n\n        # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043d\u0430\u043b\u0438\u0447\u0438\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435\n        ut.should_be_user_in_table(user_data[\"name\"], user_data[\"role\"])\n\n        # \u0412\u0445\u043e\u0434 \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0443 \u0434\u043b\u044f \u043d\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\n        new_lp = LoginPage(browser)\n        new_lp.do_login(username=user_data[\"name\"], password=user_data[\"password\"])\n\n        # \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0433\u043b\u0430\u0432\u043d\u043e\u0439 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b\n        new_mp = MainPage(browser)\n\n        # \u041e\u0442\u043a\u0440\u044b\u0442\u044c \u0432\u043a\u043b\u0430\u0434\u043a\u0443 \u0421\u0435\u0441\u0441\u0438\u0438\n        new_mp.should_be_navigation_panel()\n        new_mp.click_main_navigation_panel_item(\"\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438\")\n        new_mp.click_subpanel_item(\"\u041e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u043d\u0438\u0435 \u0438 \u0434\u0438\u0430\u0433\u043d\u043e\u0441\u0442\u0438\u043a\u0430\")\n        new_mp.click_subpanel_item(\"\u0421\u0435\u0430\u043d\u0441\u044b\")\n\n        # \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u0441\u0435\u0430\u043d\u0441\u043e\u0432\n        st = SessionsTab(browser)\n\n        # # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043d\u0430\u043b\u0438\u0447\u0438\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0441\u0435\u0430\u043d\u0441\u043e\u0432\n        st.should_be_sessions_table()\n\n        # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043d\u0430\u043b\u0438\u0447\u0438\u044f \u0437\u0430\u043f\u0438\u0441\u0438 \u043e \u0441\u0435\u0430\u043d\u0441\u0435 \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\n        session_token = st.get_session_token()\n        st.should_be_session_in_table(session_token)\n\n        # logout\n        new_mp.do_logout()\n\n        # \u0410\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u044f \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0435 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\n        admin_lp = LoginPage(browser)\n        admin_lp.do_login()\n\n        # \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0433\u043b\u0430\u0432\u043d\u043e\u0439 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b\n        admin_mp = MainPage(browser)\n\n        # \u041e\u0442\u043a\u0440\u044b\u0442\u044c \u0432\u043a\u043b\u0430\u0434\u043a\u0443 \u0421\u0435\u0430\u043d\u0441\u044b\n        admin_mp.should_be_navigation_panel()\n        admin_mp.click_main_navigation_panel_item(\"\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438\")\n        admin_mp.click_subpanel_item(\"\u041e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u043d\u0438\u0435 \u0438 \u0434\u0438\u0430\u0433\u043d\u043e\u0441\u0442\u0438\u043a\u0430\")\n        admin_mp.click_subpanel_item(\"\u0421\u0435\u0430\u043d\u0441\u044b\")\n\n        # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043d\u0430\u043b\u0438\u0447\u0438\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u0441\u0435\u0430\u043d\u0441\u043e\u0432\n        st.should_be_sessions_table()\n\n        # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u044f \u0437\u0430\u043f\u0438\u0441\u0438 \u043e \u0441\u0435\u0441\u0441\u0438\u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u043f\u043e\u0441\u043b\u0435 \u0432\u044b\u0445\u043e\u0434\u0430 \u0438\u0437 \u0441\u0438\u0441\u0442\u0435\u043c\u044b\n        st.should_not_be_session_in_table(session_token)\n\n        # \u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0444\u0438\u043a\u0441\u0442\u0443\u0440\u043e\u0439 cleanup_users \u043f\u043e\u0441\u043b\u0435 \u0442\u0435\u0441\u0442\u0430\n\n    def test_delete_existed_session(self, browser: Page, cleanup_users: None) -> None:\n        \"\"\"\u0422\u0435\u0441\u0442 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u043e\u0433\u043e \u0441\u0435\u0430\u043d\u0441\u0430.\n\n        \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442:\n        1. \u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043d\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\n        2. \u0412\u0445\u043e\u0434 \u043d\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0443\n        3. \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043d\u0430\u043b\u0438\u0447\u0438\u044f \u0441\u0435\u0430\u043d\u0441\u0430 \u043d\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\n        4. \u0412\u044b\u0445\u043e\u0434 \u043d\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0438\u0437 \u0441\u0438\u0441\u0442\u0435\u043c\u044b (logout)\n        5. \u0412\u0445\u043e\u0434 \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0443 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f admin\n        6. \u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u0441\u0435\u0430\u043d\u0441\u0430 \u043d\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\n        7. \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u044f \u0441\u0435\u0430\u043d\u0441\u0430 \u043d\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\n        8. \u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0444\u0438\u043a\u0441\u0442\u0443\u0440\u043e\u0439 cleanup_users\n        \"\"\"\n        user_data = {\"name\": \"TestUserForManualDeletion\", \"role\": \"\u0410\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440\", \"password\": \"qwerty123\"}\n\n        mp = MainPage(browser)\n        ut = UsersTab(browser)\n\n        # \u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043d\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f NewUser\n        mp.click_subpanel_item(\"\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438\")\n        ut.open_add_user_window()\n        ut.add_new_user(user_data)\n\n        # \u041e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u0441\u043f\u0438\u0441\u043a\u0430 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 (\u0434\u0432\u043e\u0439\u043d\u043e\u0439 \u043a\u043b\u0438\u043a - \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u0431\u0430\u0433?)\n        mp.click_subpanel_item(\"\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438\")\n        mp.click_subpanel_item(\"\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438\")\n\n        # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043d\u0430\u043b\u0438\u0447\u0438\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435\n        ut.should_be_user_in_table(user_data[\"name\"], user_data[\"role\"])\n\n        # \u0412\u0445\u043e\u0434 \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0443 \u0434\u043b\u044f \u043d\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f NewUser\n        new_lp = LoginPage(browser)\n        new_lp.do_login(username=user_data[\"name\"], password=user_data[\"password\"])\n\n        # \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0433\u043b\u0430\u0432\u043d\u043e\u0439 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b\n        new_mp = MainPage(browser)\n\n        # \u041e\u0442\u043a\u0440\u044b\u0442\u044c \u0432\u043a\u043b\u0430\u0434\u043a\u0443 \u0421\u0435\u0430\u043d\u0441\u0430\n        new_mp.should_be_navigation_panel()\n        new_mp.click_main_navigation_panel_item(\"\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438\")\n        new_mp.click_subpanel_item(\"\u041e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u043d\u0438\u0435 \u0438 \u0434\u0438\u0430\u0433\u043d\u043e\u0441\u0442\u0438\u043a\u0430\")\n        new_mp.click_subpanel_item(\"\u0421\u0435\u0430\u043d\u0441\u044b\")\n\n        # \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u0441\u0435\u0430\u043d\u0441\u043e\u0432\n        st = SessionsTab(browser)\n\n        # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043d\u0430\u043b\u0438\u0447\u0438\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0441\u0435\u0430\u043d\u0441\u043e\u0432\n        st.should_be_sessions_table()\n\n        # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043d\u0430\u043b\u0438\u0447\u0438\u044f \u0437\u0430\u043f\u0438\u0441\u0438 \u043e \u0441\u0435\u0430\u043d\u0441\u0435 \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\n        new_user_token = st.get_session_token()\n        st.should_be_session_in_table(new_user_token)\n\n        # logout\n        new_mp.do_logout()\n\n        # \u0410\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u044f \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f admin\n        admin_lp = LoginPage(browser)\n        admin_lp.do_login()\n\n        # \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u043d\u0430 \u0432\u043a\u043b\u0430\u0434\u043a\u0443 \u0421\u0435\u0430\u043d\u0441\u044b\n        admin_mp = MainPage(browser)\n        admin_mp.should_be_navigation_panel()\n        admin_mp.click_main_navigation_panel_item(\"\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438\")\n        admin_mp.click_subpanel_item(\"\u041e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u043d\u0438\u0435 \u0438 \u0434\u0438\u0430\u0433\u043d\u043e\u0441\u0442\u0438\u043a\u0430\")\n        admin_mp.click_subpanel_item(\"\u0421\u0435\u0430\u043d\u0441\u044b\")\n\n        # \u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u0441\u0435\u0430\u043d\u0441\u0430 \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u043f\u043e \u0442\u043e\u043a\u0435\u043d\u0443\n        admin_sessions_tab = SessionsTab(browser)\n        admin_sessions_tab.should_be_sessions_table()\n        admin_sessions_tab.delete_session_by_token(new_user_token)\n\n        # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u044f \u0437\u0430\u043f\u0438\u0441\u0438 \u043e \u0441\u0435\u0430\u043d\u0441\u0435 \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u043f\u043e\u0441\u043b\u0435 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f\n        admin_sessions_tab.should_not_be_session_in_table(new_user_token)\n\n        # \u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0444\u0438\u043a\u0441\u0442\u0443\u0440\u043e\u0439 cleanup_users \u043f\u043e\u0441\u043b\u0435 \u0442\u0435\u0441\u0442\u0430\n\n    def test_multiple_users_sessions(self, browser: Page, cleanup_users: None) -> None:\n        \"\"\"\u0422\u0435\u0441\u0442 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 \u0438 \u0438\u0445 \u0441\u0435\u0430\u043d\u0441\u043e\u0432.\n\n        \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442:\n        1. \u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 User1..User3\n        2. \u0412\u0445\u043e\u0434 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0443 \u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0441\u0435\u0430\u043d\u0441\u043e\u0432\n        3. \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043d\u0430\u043b\u0438\u0447\u0438\u044f \u0441\u0435\u0430\u043d\u0441\u0430 \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435\n        4. \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0441\u043a\u0440\u043e\u043b\u043b\u0438\u043d\u0433\u0430 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0441 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e\u043c \u0441\u0435\u0430\u043d\u0441\u043e\u0432\n        5. \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043f\u043e\u0434\u0441\u0432\u0435\u0442\u043a\u0438 \u0441\u0442\u0440\u043e\u043a \u0442\u0430\u0431\u043b\u0438\u0446\u044b\n        6. \u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0444\u0438\u043a\u0441\u0442\u0443\u0440\u043e\u0439 cleanup_users\n        \"\"\"\n        users_data = [\n            {\"name\": \"TestUser1\", \"role\": \"\u0410\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440\", \"password\": \"password1\"},\n            {\"name\": \"TestUser2\", \"role\": \"\u0410\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440\", \"password\": \"password2\"},\n            {\"name\": \"TestUser3\", \"role\": \"\u0410\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440\", \"password\": \"password3\"}\n        ]\n\n        session_tokens = []\n\n        mp = MainPage(browser)\n        ut = UsersTab(browser)\n        mp.click_subpanel_item(\"\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438\")\n\n        # \u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439\n        for user_data in users_data:\n            mp.click_subpanel_item(\"\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438\")\n            mp.click_subpanel_item(\"\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438\")\n            ut.open_add_user_window()\n            ut.add_new_user(user_data)\n\n            # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043d\u0430\u043b\u0438\u0447\u0438\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435\n            ut.should_be_user_in_table(user_data[\"name\"], user_data[\"role\"])\n\n        # \u0412\u0445\u043e\u0434 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0438 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0442\u043e\u043a\u0435\u043d\u043e\u0432 \u0441\u0435\u0430\u043d\u0441\u043e\u0432\n        for user_data in users_data:\n            # \u0412\u0445\u043e\u0434 \u043d\u043e\u0432\u044b\u043c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u043c\n            login_page = LoginPage(browser)\n            login_page.do_login(username=user_data[\"name\"], password=user_data[\"password\"])\n\n            # \u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0442\u043e\u043a\u0435\u043d\u0430 \u0441\u0435\u0430\u043d\u0441\u043e\u0432\n            sessions_tab = SessionsTab(browser)\n            #sessions_tab.should_be_sessions_table()\n            session_token = sessions_tab.get_session_token()\n            session_tokens.append(session_token)\n\n        # \u0412\u043e\u0437\u0432\u0440\u0430\u0442 \u0430\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440\u0430 \u0434\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0441\u0435\u0430\u043d\u0441\u043e\u0432\n        login_page = LoginPage(browser)\n        login_page.do_login()\n\n        mp = MainPage(browser)\n        mp.click_main_navigation_panel_item(\"\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438\")\n        mp.click_subpanel_item(\"\u041e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u043d\u0438\u0435 \u0438 \u0434\u0438\u0430\u0433\u043d\u043e\u0441\u0442\u0438\u043a\u0430\")\n        mp.click_subpanel_item(\"\u0421\u0435\u0430\u043d\u0441\u044b\")\n\n        sessions_tab = SessionsTab(browser)\n        sessions_tab.should_be_sessions_table()\n\n        # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043d\u0430\u043b\u0438\u0447\u0438\u044f \u0441\u0435\u0430\u043d\u0441\u043e\u0432 \u0432\u0441\u0435\u0445 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439\n        for session_token in session_tokens:\n            sessions_tab.should_be_session_in_table(session_token)\n\n        # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0441\u043a\u0440\u043e\u043b\u043b\u0438\u043d\u0433\u0430 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0441 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e\u043c \u0441\u0435\u0430\u043d\u0441\u043e\u0432\n        self._test_sessions_table_scrolling(sessions_tab)\n\n        # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043f\u043e\u0434\u0441\u0432\u0435\u0442\u043a\u0438 \u0441\u0442\u0440\u043e\u043a \u0442\u0430\u0431\u043b\u0438\u0446\u044b\n        rows_count = sessions_tab.get_rows_count()\n        browser.wait_for_timeout(1000)\n\n        # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043f\u043e\u0434\u0441\u0432\u0435\u0442\u043a\u0438 \u043f\u0435\u0440\u0432\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438\n        sessions_tab.check_sessions_table_row_highlighting(0)\n\n        # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043f\u043e\u0434\u0441\u0432\u0435\u0442\u043a\u0438 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0439 \u0441\u0442\u0440\u043e\u043a\u0438 (\u0435\u0441\u043b\u0438 \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435 \u0431\u043e\u043b\u0435\u0435 \u043e\u0434\u043d\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438)\n        if rows_count > 1:\n            browser.wait_for_timeout(1000)\n            sessions_tab.check_sessions_table_row_highlighting(rows_count - 1)\n\n\n    def _test_sessions_table_scrolling(self, sessions_tab: SessionsTab) -> None:\n        \"\"\"\u0412\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043c\u0435\u0442\u043e\u0434 \u0434\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0441\u043a\u0440\u043e\u043b\u043b\u0438\u043d\u0433\u0430 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0441\u0435\u0430\u043d\u0441\u043e\u0432.\n\n        \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442:\n        1. \u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0441\u043a\u0440\u043e\u043b\u043b\u0438\u043d\u0433\u0430 \u0442\u0430\u0431\u043b\u0438\u0446\u044b\n        2. \u0412\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u043f\u0435\u0440\u0432\u043e\u0439 \u0438 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0439 \u0441\u0442\u0440\u043e\u043a \u043f\u043e\u0441\u043b\u0435 \u0441\u043a\u0440\u043e\u043b\u043b\u0438\u043d\u0433\u0430\n        \"\"\"\n        # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0441\u043a\u0440\u043e\u043b\u043b\u0438\u043d\u0433\u0430\n        is_scrollable = sessions_tab.check_sessions_table_verticall_scrolling()\n\n        if is_scrollable:\n            print(\"\u0422\u0430\u0431\u043b\u0438\u0446\u0430 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u0439 \u0441\u043a\u0440\u043e\u043b\u043b\u0438\u043d\u0433\")\n\n            # \u041f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0430 \u0432\u043d\u0438\u0437\n            sessions_tab.scroll_sessions_table_down()\n\n            # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0439 \u0441\u0442\u0440\u043e\u043a\u0438 \u043f\u043e\u0441\u043b\u0435 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0438\n            sessions_tab.check_sessions_table_last_row_visibility()\n\n            # \u041f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0430 \u0432\u0432\u0435\u0440\u0445\n            sessions_tab.scroll_sessions_table_up()\n\n            # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u043f\u0435\u0440\u0432\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438 \u043f\u043e\u0441\u043b\u0435 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0438\n            sessions_tab.check_sessions_table_first_row_visibility()\n        else:\n            print(\"\u0422\u0430\u0431\u043b\u0438\u0446\u0430 \u043d\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u0439 \u0441\u043a\u0440\u043e\u043b\u043b\u0438\u043d\u0433 - \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u0431\u0430\u0437\u043e\u0432\u0443\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c\")\n\n            # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u043f\u0435\u0440\u0432\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438\n            sessions_tab.check_sessions_table_first_row_visibility()\n\n    @pytest.mark.skip(reason=\"\u041d\u0435 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u043e \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u043c\")\n    def test_session_removed_when_user_deleted(self, browser: Page, cleanup_users: None) -> None:\n        \"\"\"\u0422\u0435\u0441\u0442 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u0441\u0435\u0430\u043d\u0441\u0430 \u043f\u0440\u0438 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\n\n        \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442:\n        1. \u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043d\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\n        2. \u0412\u0445\u043e\u0434 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0441\u0435\u0430\u043d\u0441\u0430\n        3. \u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0430\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440\u043e\u043c\n        4. \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u0441\u0435\u0430\u043d\u0441\u0430 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\n        \"\"\"\n        user_data = {\"name\": \"UserForAutoSessionDeletion\", \"role\": \"\u0410\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440\", \"password\": \"qwerty123\"}\n\n        mp = MainPage(browser)\n        ut = UsersTab(browser)\n\n        # \u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043d\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\n        mp.click_subpanel_item(\"\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438\")\n        ut.open_add_user_window()\n        ut.add_new_user(user_data)\n\n        # \u041e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u0441\u043f\u0438\u0441\u043a\u0430 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439\n        mp.click_subpanel_item(\"\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438\")\n        mp.click_subpanel_item(\"\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438\")\n\n        # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043d\u0430\u043b\u0438\u0447\u0438\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435\n        ut.should_be_user_in_table(user_data[\"name\"], user_data[\"role\"])\n\n        # \u0412\u0445\u043e\u0434 \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0443 \u0434\u043b\u044f \u043d\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\n        new_lp = LoginPage(browser)\n        new_lp.do_login(username=user_data[\"name\"], password=user_data[\"password\"])\n\n        # \u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0442\u043e\u043a\u0435\u043d\u0430 \u0441\u0435\u0441\u0441\u0438\u0438 \u043d\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\n        new_mp = MainPage(browser)\n\n        # \u041e\u0442\u043a\u0440\u044b\u0442\u044c \u0432\u043a\u043b\u0430\u0434\u043a\u0443 \u0421\u0435\u0441\u0441\u0438\u0438\n        new_mp.should_be_navigation_panel()\n        new_mp.click_main_navigation_panel_item(\"\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438\")\n        new_mp.click_subpanel_item(\"\u041e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u043d\u0438\u0435 \u0438 \u0434\u0438\u0430\u0433\u043d\u043e\u0441\u0442\u0438\u043a\u0430\")\n        new_mp.click_subpanel_item(\"\u0421\u0435\u0430\u043d\u0441\u044b\")\n\n        # \u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0442\u043e\u043a\u0435\u043d \u0441\u0435\u0441\u0441\u0438\u0438\n        sessions_tab = SessionsTab(browser)\n        new_user_token = sessions_tab.get_session_token()\n\n        # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043d\u0430\u043b\u0438\u0447\u0438\u044f \u0441\u0435\u0441\u0441\u0438\u0438 \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435\n        sessions_tab.should_be_session_in_table(new_user_token)\n\n        # \u0412\u044b\u0445\u043e\u0434 \u0438\u0437 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u043d\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\n        new_mp.do_logout()\n\n        # \u0410\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u044f \u0430\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440\u043e\u043c\n        admin_lp = LoginPage(browser)\n        admin_lp.do_login()\n\n        # \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u043d\u0430 \u0432\u043a\u043b\u0430\u0434\u043a\u0443 \u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438\n        admin_mp = MainPage(browser)\n        admin_mp.click_main_navigation_panel_item(\"\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438\")\n        admin_mp.click_subpanel_item(\"\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438\")\n\n        # \u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\n        admin_ut = UsersTab(browser)\n        admin_ut.open_edit_user_page_by_user(user_data[\"name\"], user_data[\"role\"])\n        admin_ut.delete_user(user_data[\"name\"])\n\n        # \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u043d\u0430 \u0432\u043a\u043b\u0430\u0434\u043a\u0443 \u0421\u0435\u0430\u043d\u0441\u044b\n        admin_mp.click_main_navigation_panel_item(\"\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438\")\n        admin_mp.click_main_navigation_panel_item(\"\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438\")\n        admin_mp.click_subpanel_item(\"\u041e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u043d\u0438\u0435 \u0438 \u0434\u0438\u0430\u0433\u043d\u043e\u0441\u0442\u0438\u043a\u0430\")\n        admin_mp.click_subpanel_item(\"\u0421\u0435\u0430\u043d\u0441\u044b\")\n\n        # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u044f \u0441\u0435\u0441\u0441\u0438\u0438 \u043f\u043e\u0441\u043b\u0435 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\n        admin_sessions_tab = SessionsTab(browser)\n        admin_sessions_tab.should_be_sessions_table()\n\n        # \u0421\u0435\u0441\u0441\u0438\u044f \u0434\u043e\u043b\u0436\u043d\u0430 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0443\u0434\u0430\u043b\u0438\u0442\u044c\u0441\u044f \u043f\u0440\u0438 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\n        admin_sessions_tab.should_not_be_session_in_table(new_user_token)\n\n    @pytest.mark.skip(reason=\"\u0422\u0440\u0435\u0431\u0443\u0435\u0442 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0442\u0430\u0439\u043c\u0435\u0440\u0430 \u043e\u0447\u0438\u0441\u0442\u043a\u0438 \u0441\u0435\u0430\u043d\u0441\u043e\u0432\")\n    def test_session_auto_deletion_after_15_minutes(self, browser: Page, cleanup_users: None) -> None:\n        \"\"\"\u0422\u0435\u0441\u0442 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u0441\u0435\u0430\u043d\u0441\u0430 \u0447\u0435\u0440\u0435\u0437 15 \u043c\u0438\u043d\u0443\u0442 \u043f\u043e\u0441\u043b\u0435 \u0432\u044b\u0445\u043e\u0434\u0430 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\n\n        \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442:\n        1. \u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043d\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\n        2. \u0412\u0445\u043e\u0434 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0441\u0435\u0430\u043d\u0441\u0430\n        3. \u0412\u044b\u0445\u043e\u0434 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0438\u0437 \u0441\u0438\u0441\u0442\u0435\u043c\u044b\n        4. \u041e\u0436\u0438\u0434\u0430\u043d\u0438\u0435 15 \u043c\u0438\u043d\u0443\u0442\n        5. \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u0441\u0435\u0430\u043d\u0441\u0430 \u043f\u043e \u0438\u0441\u0442\u0435\u0447\u0435\u043d\u0438\u0438 \u0432\u0440\u0435\u043c\u0435\u043d\u0438\n        6. \u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0444\u0438\u043a\u0441\u0442\u0443\u0440\u043e\u0439 cleanup_users\n        \"\"\"\n        user_data = {\"name\": \"TestUserFor15MinDeletion\", \"role\": \"\u0410\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440\", \"password\": \"qwerty123\"}\n\n        mp = MainPage(browser)\n        ut = UsersTab(browser)\n\n        # \u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043d\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\n        mp.click_subpanel_item(\"\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438\")\n        ut.open_add_user_window()\n        ut.add_new_user(user_data)\n\n        # \u041e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u0441\u043f\u0438\u0441\u043a\u0430 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439\n        mp.click_subpanel_item(\"\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438\")\n        mp.click_subpanel_item(\"\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438\")\n\n        # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043d\u0430\u043b\u0438\u0447\u0438\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435\n        ut.should_be_user_in_table(user_data[\"name\"], user_data[\"role\"])\n\n        # \u0412\u0445\u043e\u0434 \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0443 \u0434\u043b\u044f \u043d\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\n        new_lp = LoginPage(browser)\n        new_lp.do_login(username=user_data[\"name\"], password=user_data[\"password\"])\n\n        # \u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0442\u043e\u043a\u0435\u043d\u0430 \u0441\u0435\u0441\u0441\u0438\u0438 \u043d\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\n        new_mp = MainPage(browser)\n\n        # \u041e\u0442\u043a\u0440\u044b\u0442\u044c \u0432\u043a\u043b\u0430\u0434\u043a\u0443 \u0421\u0435\u0441\u0441\u0438\u0438\n        new_mp.should_be_navigation_panel()\n        new_mp.click_main_navigation_panel_item(\"\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438\")\n        new_mp.click_subpanel_item(\"\u041e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u043d\u0438\u0435 \u0438 \u0434\u0438\u0430\u0433\u043d\u043e\u0441\u0442\u0438\u043a\u0430\")\n        new_mp.click_subpanel_item(\"\u0421\u0435\u0430\u043d\u0441\u044b\")\n\n        # \u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0442\u043e\u043a\u0435\u043d \u0441\u0435\u0441\u0441\u0438\u0438\n        sessions_tab = SessionsTab(browser)\n        session_token = sessions_tab.get_session_token()\n\n        # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043d\u0430\u043b\u0438\u0447\u0438\u044f \u0441\u0435\u0441\u0441\u0438\u0438 \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435\n        sessions_tab.should_be_session_in_table(session_token)\n\n        # \u0412\u044b\u0445\u043e\u0434 \u0438\u0437 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u043d\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\n        new_mp.do_logout()\n\n        # \u0410\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u044f \u0430\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440\u043e\u043c\n        admin_lp = LoginPage(browser)\n        admin_lp.do_login()\n\n        # \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u043d\u0430 \u0432\u043a\u043b\u0430\u0434\u043a\u0443 \u0421\u0435\u0430\u043d\u0441\u044b\n        admin_mp = MainPage(browser)\n        admin_mp.should_be_navigation_panel()\n        admin_mp.click_main_navigation_panel_item(\"\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438\")\n        admin_mp.click_subpanel_item(\"\u041e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u043d\u0438\u0435 \u0438 \u0434\u0438\u0430\u0433\u043d\u043e\u0441\u0442\u0438\u043a\u0430\")\n        admin_mp.click_subpanel_item(\"\u0421\u0435\u0430\u043d\u0441\u044b\")\n\n        # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043d\u0430\u043b\u0438\u0447\u0438\u044f \u0441\u0435\u0441\u0441\u0438\u0438 \u0441\u0440\u0430\u0437\u0443 \u043f\u043e\u0441\u043b\u0435 \u0432\u044b\u0445\u043e\u0434\u0430\n        admin_sessions_tab = SessionsTab(browser)\n        admin_sessions_tab.should_be_session_in_table(session_token)\n\n        admin_mp.do_logout()\n\n        # \u041e\u0436\u0438\u0434\u0430\u043d\u0438\u0435 15 \u043c\u0438\u043d\u0443\u0442 1 \u0441\u0435\u043a\u0443\u043d\u0434\u0430 (901 \u0441\u0435\u043a\u0443\u043d\u0434)\n        print(\"\u041e\u0436\u0438\u0434\u0430\u043d\u0438\u0435 15 \u043c\u0438\u043d\u0443\u0442 \u0434\u043b\u044f \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u0441\u0435\u0430\u043d\u0441\u0430...\")\n        browser.wait_for_timeout(901000)  # 15 \u043c\u0438\u043d\u0443\u0442 1 \u0441\u0435\u043a\u0443\u043d\u0434\u0430 \u0432 \u043c\u0438\u043b\u043b\u0438\u0441\u0435\u043a\u0443\u043d\u0434\u0430\u0445\n\n        # \u0410\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u044f \u0430\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440\u043e\u043c\n        admin_lp = LoginPage(browser)\n        admin_lp.do_login()\n\n        # \u041f\u043e\u0432\u0442\u043e\u0440\u043d\u044b\u0439 \u043f\u0435\u0440\u0435\u0445\u043e\u0434 \u043d\u0430 \u0432\u043a\u043b\u0430\u0434\u043a\u0443 \u0421\u0435\u0430\u043d\u0441\u044b \u043f\u043e\u0441\u043b\u0435 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f\n        admin_mp = MainPage(browser)\n        admin_mp.should_be_navigation_panel()\n        admin_mp.click_main_navigation_panel_item(\"\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438\")\n        admin_mp.click_subpanel_item(\"\u041e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u043d\u0438\u0435 \u0438 \u0434\u0438\u0430\u0433\u043d\u043e\u0441\u0442\u0438\u043a\u0430\")\n        admin_mp.click_subpanel_item(\"\u0421\u0435\u0430\u043d\u0441\u044b\")\n\n        # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u044f \u0441\u0435\u0441\u0441\u0438\u0438 \u043f\u043e\u0441\u043b\u0435 15 \u043c\u0438\u043d\u0443\u0442\n        admin_sessions_tab = SessionsTab(browser)\n        admin_sessions_tab.should_be_sessions_table()\n        admin_sessions_tab.should_not_be_session_in_table(session_token)\n\n        # \u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0444\u0438\u043a\u0441\u0442\u0443\u0440\u043e\u0439 cleanup_users \u043f\u043e\u0441\u043b\u0435 \u0442\u0435\u0441\u0442\u0430\n\n    @pytest.mark.skip(reason=\"\u041d\u0435 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u043c, \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0431\u0438\u0437\u043d\u0435\u0441-\u043b\u043e\u0433\u0438\u043a\u0438\")\n    def test_user_cannot_delete_own_session(self, browser: Page, cleanup_users: None) -> None:\n        \"\"\"\u0422\u0435\u0441\u0442 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u043d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u0441\u0432\u043e\u0439 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u0441\u0435\u0430\u043d\u0441.\n        \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442:\n        1. \u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043d\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\n        2. \u0412\u0445\u043e\u0434 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0441\u0435\u0430\u043d\u0441\u0430\n        3. \u041f\u043e\u043f\u044b\u0442\u043a\u0443 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u0441\u0432\u043e\u0435\u0433\u043e \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0433\u043e \u0441\u0435\u0430\u043d\u0441\u0430\n        4. \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0443, \u0447\u0442\u043e \u043a\u043d\u043e\u043f\u043a\u0430 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u043d\u0435\u0434\u043e\u0441\u0442\u0443\u043f\u043d\u0430 \u0438\u043b\u0438 \u0441\u043a\u0440\u044b\u0442\u0430\n        5. \u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0444\u0438\u043a\u0441\u0442\u0443\u0440\u043e\u0439 cleanup_users\n        \"\"\"\n        user_data = {\"name\": \"TestUserForSelfDeletion\", \"role\": \"\u0410\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440\", \"password\": \"qwerty123\"}\n\n        mp = MainPage(browser)\n        ut = UsersTab(browser)\n\n        # \u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043d\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\n        mp.click_subpanel_item(\"\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438\")\n        ut.open_add_user_window()\n        ut.add_new_user(user_data)\n\n        # \u041e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u0441\u043f\u0438\u0441\u043a\u0430 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439\n        mp.click_subpanel_item(\"\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438\")\n        mp.click_subpanel_item(\"\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438\")\n\n        # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043d\u0430\u043b\u0438\u0447\u0438\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435\n        ut.should_be_user_in_table(user_data[\"name\"], user_data[\"role\"])\n\n        # \u0412\u0445\u043e\u0434 \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0443 \u0434\u043b\u044f \u043d\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\n        new_lp = LoginPage(browser)\n        new_lp.do_login(username=user_data[\"name\"], password=user_data[\"password\"])\n\n        # \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u043d\u0430 \u0432\u043a\u043b\u0430\u0434\u043a\u0443 \u0421\u0435\u0430\u043d\u0441\u044b\n        new_mp = MainPage(browser)\n        new_mp.should_be_navigation_panel()\n        new_mp.click_main_navigation_panel_item(\"\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438\")\n        new_mp.click_subpanel_item(\"\u041e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u043d\u0438\u0435 \u0438 \u0434\u0438\u0430\u0433\u043d\u043e\u0441\u0442\u0438\u043a\u0430\")\n        new_mp.click_subpanel_item(\"\u0421\u0435\u0430\u043d\u0441\u044b\")\n\n        # \u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0442\u043e\u043a\u0435\u043d \u0441\u0435\u0441\u0441\u0438\u0438\n        sessions_tab = SessionsTab(browser)\n        session_token = sessions_tab.get_session_token()\n\n        # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043d\u0430\u043b\u0438\u0447\u0438\u044f \u0441\u0435\u0441\u0441\u0438\u0438 \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435\n        sessions_tab.should_be_session_in_table(session_token)\n\n        # \u041f\u043e\u043f\u044b\u0442\u043a\u0430 \u043d\u0430\u0439\u0442\u0438 \u043a\u043d\u043e\u043f\u043a\u0443 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u0434\u043b\u044f \u0441\u0432\u043e\u0435\u0433\u043e \u0441\u0435\u0430\u043d\u0441\u0430\n        row_index = sessions_tab.find_session_in_table(session_token)\n\n        # \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c, \u0447\u0442\u043e \u043a\u043d\u043e\u043f\u043a\u0430 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u043b\u0438\u0431\u043e \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442, \u043b\u0438\u0431\u043e \u043d\u0435\u0430\u043a\u0442\u0438\u0432\u043d\u0430\n        delete_button = sessions_tab.get_delete_session_button_from_row(row_index)\n\n        # \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c, \u0447\u0442\u043e \u043a\u043d\u043e\u043f\u043a\u0430 \u043b\u0438\u0431\u043e \u043d\u0435 \u0432\u0438\u0434\u0438\u043c\u0430, \u043b\u0438\u0431\u043e \u043e\u0442\u043a\u043b\u044e\u0447\u0435\u043d\u0430\n        expect(delete_button).not_to_be_visible()\n\n        # \u0412\u044b\u0445\u043e\u0434 \u0438\u0437 \u0441\u0438\u0441\u0442\u0435\u043c\u044b\n        new_mp.do_logout()\n
    "},{"location":"tests/e2e/test_sessions_tab/#tests.e2e.test_sessions_tab.TestSessionsTab.cleanup_users","title":"cleanup_users(browser)","text":"

    \u0424\u0438\u043a\u0441\u0442\u0443\u0440\u0430 \u0434\u043b\u044f \u043e\u0447\u0438\u0441\u0442\u043a\u0438 \u0442\u0435\u0441\u0442\u043e\u0432\u044b\u0445 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 \u0438 \u0438\u0445 \u0441\u0435\u0430\u043d\u0441\u043e\u0432 \u043f\u043e\u0441\u043b\u0435 \u0442\u0435\u0441\u0442\u0430.

    Source code in tests\\e2e\\test_sessions_tab.py
    @pytest.fixture(scope=\"function\")\ndef cleanup_users(self, browser: Page) -> None:\n    \"\"\"\u0424\u0438\u043a\u0441\u0442\u0443\u0440\u0430 \u0434\u043b\u044f \u043e\u0447\u0438\u0441\u0442\u043a\u0438 \u0442\u0435\u0441\u0442\u043e\u0432\u044b\u0445 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 \u0438 \u0438\u0445 \u0441\u0435\u0430\u043d\u0441\u043e\u0432 \u043f\u043e\u0441\u043b\u0435 \u0442\u0435\u0441\u0442\u0430.\"\"\"\n    yield\n\n    # \u0412\u044b\u0445\u043e\u0434 \u0438\u0437 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\n    mp = MainPage(browser)\n    mp.do_logout()\n\n    # \u0410\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u044f \u0430\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440\u043e\u043c \u0434\u043b\u044f \u043e\u0447\u0438\u0441\u0442\u043a\u0438\n    login_page = LoginPage(browser)\n    login_page.do_login()\n\n    # \u0423\u0434\u0430\u043b\u044f\u0435\u043c \u0442\u0435\u0441\u0442\u043e\u0432\u044b\u0445 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439\n    self._cleanup_test_users(browser)\n
    "},{"location":"tests/e2e/test_sessions_tab/#tests.e2e.test_sessions_tab.TestSessionsTab.setup","title":"setup(browser)","text":"

    \u0424\u0438\u043a\u0441\u0442\u0443\u0440\u0430 \u0434\u043b\u044f \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0438 \u0442\u0435\u0441\u0442\u043e\u0432\u043e\u0433\u043e \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f.

    \u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442: 1. \u0410\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u044e \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0435 2. \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u043d\u0430 \u0432\u043a\u043b\u0430\u0434\u043a\u0443 '\u0421\u0435\u0430\u043d\u0441\u044b' \u0447\u0435\u0440\u0435\u0437 \u043f\u0430\u043d\u0435\u043b\u044c \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438

    Source code in tests\\e2e\\test_sessions_tab.py
    @pytest.fixture(scope=\"function\", autouse=True)\ndef setup(self, browser: Page) -> None:\n    \"\"\"\u0424\u0438\u043a\u0441\u0442\u0443\u0440\u0430 \u0434\u043b\u044f \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0438 \u0442\u0435\u0441\u0442\u043e\u0432\u043e\u0433\u043e \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f.\n\n    \u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442:\n    1. \u0410\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u044e \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0435\n    2. \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u043d\u0430 \u0432\u043a\u043b\u0430\u0434\u043a\u0443 '\u0421\u0435\u0430\u043d\u0441\u044b' \u0447\u0435\u0440\u0435\u0437 \u043f\u0430\u043d\u0435\u043b\u044c \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438\n    \"\"\"\n    # \u0410\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u044f \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0435\n    login_page = LoginPage(browser)\n    login_page.do_login()\n\n    # \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0433\u043b\u0430\u0432\u043d\u043e\u0439 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b\n    main_page = MainPage(browser)\n\n    # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0438 \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u0441 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u043c\u0438 \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438\n    main_page.should_be_navigation_panel()\n    main_page.click_main_navigation_panel_item(\"\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438\")\n    main_page.click_subpanel_item(\"\u041e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u043d\u0438\u0435 \u0438 \u0434\u0438\u0430\u0433\u043d\u043e\u0441\u0442\u0438\u043a\u0430\")\n    main_page.click_subpanel_item(\"\u0421\u0435\u0430\u043d\u0441\u044b\")\n
    "},{"location":"tests/e2e/test_sessions_tab/#tests.e2e.test_sessions_tab.TestSessionsTab.test_delete_existed_session","title":"test_delete_existed_session(browser, cleanup_users)","text":"

    \u0422\u0435\u0441\u0442 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u043e\u0433\u043e \u0441\u0435\u0430\u043d\u0441\u0430.

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442: 1. \u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043d\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f 2. \u0412\u0445\u043e\u0434 \u043d\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0443 3. \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043d\u0430\u043b\u0438\u0447\u0438\u044f \u0441\u0435\u0430\u043d\u0441\u0430 \u043d\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f 4. \u0412\u044b\u0445\u043e\u0434 \u043d\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0438\u0437 \u0441\u0438\u0441\u0442\u0435\u043c\u044b (logout) 5. \u0412\u0445\u043e\u0434 \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0443 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f admin 6. \u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u0441\u0435\u0430\u043d\u0441\u0430 \u043d\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f 7. \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u044f \u0441\u0435\u0430\u043d\u0441\u0430 \u043d\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f 8. \u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0444\u0438\u043a\u0441\u0442\u0443\u0440\u043e\u0439 cleanup_users

    Source code in tests\\e2e\\test_sessions_tab.py
    def test_delete_existed_session(self, browser: Page, cleanup_users: None) -> None:\n    \"\"\"\u0422\u0435\u0441\u0442 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u043e\u0433\u043e \u0441\u0435\u0430\u043d\u0441\u0430.\n\n    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442:\n    1. \u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043d\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\n    2. \u0412\u0445\u043e\u0434 \u043d\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0443\n    3. \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043d\u0430\u043b\u0438\u0447\u0438\u044f \u0441\u0435\u0430\u043d\u0441\u0430 \u043d\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\n    4. \u0412\u044b\u0445\u043e\u0434 \u043d\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0438\u0437 \u0441\u0438\u0441\u0442\u0435\u043c\u044b (logout)\n    5. \u0412\u0445\u043e\u0434 \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0443 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f admin\n    6. \u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u0441\u0435\u0430\u043d\u0441\u0430 \u043d\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\n    7. \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u044f \u0441\u0435\u0430\u043d\u0441\u0430 \u043d\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\n    8. \u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0444\u0438\u043a\u0441\u0442\u0443\u0440\u043e\u0439 cleanup_users\n    \"\"\"\n    user_data = {\"name\": \"TestUserForManualDeletion\", \"role\": \"\u0410\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440\", \"password\": \"qwerty123\"}\n\n    mp = MainPage(browser)\n    ut = UsersTab(browser)\n\n    # \u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043d\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f NewUser\n    mp.click_subpanel_item(\"\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438\")\n    ut.open_add_user_window()\n    ut.add_new_user(user_data)\n\n    # \u041e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u0441\u043f\u0438\u0441\u043a\u0430 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 (\u0434\u0432\u043e\u0439\u043d\u043e\u0439 \u043a\u043b\u0438\u043a - \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u0431\u0430\u0433?)\n    mp.click_subpanel_item(\"\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438\")\n    mp.click_subpanel_item(\"\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438\")\n\n    # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043d\u0430\u043b\u0438\u0447\u0438\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435\n    ut.should_be_user_in_table(user_data[\"name\"], user_data[\"role\"])\n\n    # \u0412\u0445\u043e\u0434 \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0443 \u0434\u043b\u044f \u043d\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f NewUser\n    new_lp = LoginPage(browser)\n    new_lp.do_login(username=user_data[\"name\"], password=user_data[\"password\"])\n\n    # \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0433\u043b\u0430\u0432\u043d\u043e\u0439 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b\n    new_mp = MainPage(browser)\n\n    # \u041e\u0442\u043a\u0440\u044b\u0442\u044c \u0432\u043a\u043b\u0430\u0434\u043a\u0443 \u0421\u0435\u0430\u043d\u0441\u0430\n    new_mp.should_be_navigation_panel()\n    new_mp.click_main_navigation_panel_item(\"\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438\")\n    new_mp.click_subpanel_item(\"\u041e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u043d\u0438\u0435 \u0438 \u0434\u0438\u0430\u0433\u043d\u043e\u0441\u0442\u0438\u043a\u0430\")\n    new_mp.click_subpanel_item(\"\u0421\u0435\u0430\u043d\u0441\u044b\")\n\n    # \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u0441\u0435\u0430\u043d\u0441\u043e\u0432\n    st = SessionsTab(browser)\n\n    # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043d\u0430\u043b\u0438\u0447\u0438\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0441\u0435\u0430\u043d\u0441\u043e\u0432\n    st.should_be_sessions_table()\n\n    # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043d\u0430\u043b\u0438\u0447\u0438\u044f \u0437\u0430\u043f\u0438\u0441\u0438 \u043e \u0441\u0435\u0430\u043d\u0441\u0435 \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\n    new_user_token = st.get_session_token()\n    st.should_be_session_in_table(new_user_token)\n\n    # logout\n    new_mp.do_logout()\n\n    # \u0410\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u044f \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f admin\n    admin_lp = LoginPage(browser)\n    admin_lp.do_login()\n\n    # \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u043d\u0430 \u0432\u043a\u043b\u0430\u0434\u043a\u0443 \u0421\u0435\u0430\u043d\u0441\u044b\n    admin_mp = MainPage(browser)\n    admin_mp.should_be_navigation_panel()\n    admin_mp.click_main_navigation_panel_item(\"\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438\")\n    admin_mp.click_subpanel_item(\"\u041e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u043d\u0438\u0435 \u0438 \u0434\u0438\u0430\u0433\u043d\u043e\u0441\u0442\u0438\u043a\u0430\")\n    admin_mp.click_subpanel_item(\"\u0421\u0435\u0430\u043d\u0441\u044b\")\n\n    # \u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u0441\u0435\u0430\u043d\u0441\u0430 \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u043f\u043e \u0442\u043e\u043a\u0435\u043d\u0443\n    admin_sessions_tab = SessionsTab(browser)\n    admin_sessions_tab.should_be_sessions_table()\n    admin_sessions_tab.delete_session_by_token(new_user_token)\n\n    # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u044f \u0437\u0430\u043f\u0438\u0441\u0438 \u043e \u0441\u0435\u0430\u043d\u0441\u0435 \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u043f\u043e\u0441\u043b\u0435 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f\n    admin_sessions_tab.should_not_be_session_in_table(new_user_token)\n
    "},{"location":"tests/e2e/test_sessions_tab/#tests.e2e.test_sessions_tab.TestSessionsTab.test_delete_session_after_logout","title":"test_delete_session_after_logout(browser, cleanup_users)","text":"

    \u0422\u0435\u0441\u0442 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u0441\u0435\u0430\u043d\u0441\u0430 \u043f\u043e\u0441\u043b\u0435 \u0432\u044b\u0445\u043e\u0434\u0430 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0438\u0437 \u0441\u0438\u0441\u0442\u0435\u043c\u044b.

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442: 1. \u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043d\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f 2. \u0412\u0445\u043e\u0434 \u043d\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0443 3. \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043d\u0430\u043b\u0438\u0447\u0438\u044f \u0441\u0435\u0430\u043d\u0441\u0430 \u043d\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f 4. \u0412\u044b\u0445\u043e\u0434 \u043d\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0438\u0437 \u0441\u0438\u0441\u0442\u0435\u043c\u044b (logout) 5. \u0412\u0445\u043e\u0434 \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0443 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f admin 6. \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u044f \u0441\u0435\u0430\u043d\u0441\u0430 \u043d\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f 7. \u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0444\u0438\u043a\u0441\u0442\u0443\u0440\u043e\u0439 cleanup_users

    Source code in tests\\e2e\\test_sessions_tab.py
    @pytest.mark.skip(reason=\"\u041d\u0435 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u043e \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u043c, \u0437\u0430\u0432\u0435\u0434\u0435\u043d \u0442\u0438\u043a\u0435\u0442\")\ndef test_delete_session_after_logout(self, browser: Page, cleanup_users: None) -> None:\n    \"\"\"\u0422\u0435\u0441\u0442 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u0441\u0435\u0430\u043d\u0441\u0430 \u043f\u043e\u0441\u043b\u0435 \u0432\u044b\u0445\u043e\u0434\u0430 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0438\u0437 \u0441\u0438\u0441\u0442\u0435\u043c\u044b.\n\n    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442:\n    1. \u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043d\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\n    2. \u0412\u0445\u043e\u0434 \u043d\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0443\n    3. \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043d\u0430\u043b\u0438\u0447\u0438\u044f \u0441\u0435\u0430\u043d\u0441\u0430 \u043d\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\n    4. \u0412\u044b\u0445\u043e\u0434 \u043d\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0438\u0437 \u0441\u0438\u0441\u0442\u0435\u043c\u044b (logout)\n    5. \u0412\u0445\u043e\u0434 \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0443 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f admin\n    6. \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u044f \u0441\u0435\u0430\u043d\u0441\u0430 \u043d\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\n    7. \u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0444\u0438\u043a\u0441\u0442\u0443\u0440\u043e\u0439 cleanup_users\n    \"\"\"\n    user_data = {\"name\": \"TestUserForSessionDeletion\", \"role\": \"\u0410\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440\", \"password\": \"qwerty\"}\n\n    mp = MainPage(browser)\n    ut = UsersTab(browser)\n\n    # \u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043d\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\n    mp.click_subpanel_item(\"\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438\")\n    ut.open_add_user_window()\n    ut.add_new_user(user_data)\n\n    # \u041e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u0441\u043f\u0438\u0441\u043a\u0430 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 (\u0434\u0432\u043e\u0439\u043d\u043e\u0439 \u043a\u043b\u0438\u043a - \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u0431\u0430\u0433?)\n    mp.click_subpanel_item(\"\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438\")\n    mp.click_subpanel_item(\"\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438\")\n\n    # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043d\u0430\u043b\u0438\u0447\u0438\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435\n    ut.should_be_user_in_table(user_data[\"name\"], user_data[\"role\"])\n\n    # \u0412\u0445\u043e\u0434 \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0443 \u0434\u043b\u044f \u043d\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\n    new_lp = LoginPage(browser)\n    new_lp.do_login(username=user_data[\"name\"], password=user_data[\"password\"])\n\n    # \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0433\u043b\u0430\u0432\u043d\u043e\u0439 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b\n    new_mp = MainPage(browser)\n\n    # \u041e\u0442\u043a\u0440\u044b\u0442\u044c \u0432\u043a\u043b\u0430\u0434\u043a\u0443 \u0421\u0435\u0441\u0441\u0438\u0438\n    new_mp.should_be_navigation_panel()\n    new_mp.click_main_navigation_panel_item(\"\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438\")\n    new_mp.click_subpanel_item(\"\u041e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u043d\u0438\u0435 \u0438 \u0434\u0438\u0430\u0433\u043d\u043e\u0441\u0442\u0438\u043a\u0430\")\n    new_mp.click_subpanel_item(\"\u0421\u0435\u0430\u043d\u0441\u044b\")\n\n    # \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u0441\u0435\u0430\u043d\u0441\u043e\u0432\n    st = SessionsTab(browser)\n\n    # # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043d\u0430\u043b\u0438\u0447\u0438\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0441\u0435\u0430\u043d\u0441\u043e\u0432\n    st.should_be_sessions_table()\n\n    # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043d\u0430\u043b\u0438\u0447\u0438\u044f \u0437\u0430\u043f\u0438\u0441\u0438 \u043e \u0441\u0435\u0430\u043d\u0441\u0435 \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\n    session_token = st.get_session_token()\n    st.should_be_session_in_table(session_token)\n\n    # logout\n    new_mp.do_logout()\n\n    # \u0410\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u044f \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0435 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\n    admin_lp = LoginPage(browser)\n    admin_lp.do_login()\n\n    # \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0433\u043b\u0430\u0432\u043d\u043e\u0439 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b\n    admin_mp = MainPage(browser)\n\n    # \u041e\u0442\u043a\u0440\u044b\u0442\u044c \u0432\u043a\u043b\u0430\u0434\u043a\u0443 \u0421\u0435\u0430\u043d\u0441\u044b\n    admin_mp.should_be_navigation_panel()\n    admin_mp.click_main_navigation_panel_item(\"\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438\")\n    admin_mp.click_subpanel_item(\"\u041e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u043d\u0438\u0435 \u0438 \u0434\u0438\u0430\u0433\u043d\u043e\u0441\u0442\u0438\u043a\u0430\")\n    admin_mp.click_subpanel_item(\"\u0421\u0435\u0430\u043d\u0441\u044b\")\n\n    # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043d\u0430\u043b\u0438\u0447\u0438\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u0441\u0435\u0430\u043d\u0441\u043e\u0432\n    st.should_be_sessions_table()\n\n    # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u044f \u0437\u0430\u043f\u0438\u0441\u0438 \u043e \u0441\u0435\u0441\u0441\u0438\u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u043f\u043e\u0441\u043b\u0435 \u0432\u044b\u0445\u043e\u0434\u0430 \u0438\u0437 \u0441\u0438\u0441\u0442\u0435\u043c\u044b\n    st.should_not_be_session_in_table(session_token)\n
    "},{"location":"tests/e2e/test_sessions_tab/#tests.e2e.test_sessions_tab.TestSessionsTab.test_delete_session_confirm_window","title":"test_delete_session_confirm_window(browser)","text":"

    \u0422\u0435\u0441\u0442 \u043e\u043a\u043d\u0430 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u044f \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u0441\u0435\u0430\u043d\u0441\u0430.

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442: 1. \u041d\u0430\u043b\u0438\u0447\u0438\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0441\u0435\u0430\u043d\u0441\u043e\u0432 2. \u0421\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u043e\u043a\u043d\u0430 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u044f \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u0441\u0435\u0430\u043d\u0441\u0430 3. \u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0433\u043e\u0440\u0438\u0437\u043e\u043d\u0442\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0441\u043a\u0440\u043e\u043b\u043b\u0438\u043d\u0433\u0430 \u0432 \u043e\u043a\u043d\u0435 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u044f 4. \u041a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0441\u0442\u044c \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430 \u0432 \u043e\u043a\u043d\u0435 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u044f 5. \u0424\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u043a\u043d\u043e\u043f\u043e\u043a \u0432 \u043e\u043a\u043d\u0435 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u044f \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f

    Source code in tests\\e2e\\test_sessions_tab.py
    def test_delete_session_confirm_window(self, browser: Page) -> None:\n    \"\"\"\u0422\u0435\u0441\u0442 \u043e\u043a\u043d\u0430 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u044f \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u0441\u0435\u0430\u043d\u0441\u0430.\n\n    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442:\n    1. \u041d\u0430\u043b\u0438\u0447\u0438\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0441\u0435\u0430\u043d\u0441\u043e\u0432\n    2. \u0421\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u043e\u043a\u043d\u0430 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u044f \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u0441\u0435\u0430\u043d\u0441\u0430\n    3. \u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0433\u043e\u0440\u0438\u0437\u043e\u043d\u0442\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0441\u043a\u0440\u043e\u043b\u043b\u0438\u043d\u0433\u0430 \u0432 \u043e\u043a\u043d\u0435 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u044f\n    4. \u041a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0441\u0442\u044c \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430 \u0432 \u043e\u043a\u043d\u0435 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u044f\n    5. \u0424\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u043a\u043d\u043e\u043f\u043e\u043a \u0432 \u043e\u043a\u043d\u0435 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u044f \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f\n    \"\"\"\n    # \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u0441\u0435\u0430\u043d\u0441\u043e\u0432\n    sessions_tab = SessionsTab(browser)\n\n    # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043d\u0430\u043b\u0438\u0447\u0438\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0441\u0435\u0430\u043d\u0441\u043e\u0432\n    sessions_tab.should_be_sessions_table()\n\n    # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043a\u043e\u043d\u0442\u0435\u043d\u0442\u0430 \u0438 \u0441\u043a\u0440\u043e\u043b\u043b\u0438\u043d\u0433\u0430 \u043e\u043a\u043d\u0430 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u044f \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u0441\u0435\u0430\u043d\u0441\u0430\n    sessions_tab.check_delete_session_confirm_window()\n
    "},{"location":"tests/e2e/test_sessions_tab/#tests.e2e.test_sessions_tab.TestSessionsTab.test_multiple_users_sessions","title":"test_multiple_users_sessions(browser, cleanup_users)","text":"

    \u0422\u0435\u0441\u0442 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 \u0438 \u0438\u0445 \u0441\u0435\u0430\u043d\u0441\u043e\u0432.

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442: 1. \u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 User1..User3 2. \u0412\u0445\u043e\u0434 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0443 \u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0441\u0435\u0430\u043d\u0441\u043e\u0432 3. \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043d\u0430\u043b\u0438\u0447\u0438\u044f \u0441\u0435\u0430\u043d\u0441\u0430 \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435 4. \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0441\u043a\u0440\u043e\u043b\u043b\u0438\u043d\u0433\u0430 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0441 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e\u043c \u0441\u0435\u0430\u043d\u0441\u043e\u0432 5. \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043f\u043e\u0434\u0441\u0432\u0435\u0442\u043a\u0438 \u0441\u0442\u0440\u043e\u043a \u0442\u0430\u0431\u043b\u0438\u0446\u044b 6. \u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0444\u0438\u043a\u0441\u0442\u0443\u0440\u043e\u0439 cleanup_users

    Source code in tests\\e2e\\test_sessions_tab.py
    def test_multiple_users_sessions(self, browser: Page, cleanup_users: None) -> None:\n    \"\"\"\u0422\u0435\u0441\u0442 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 \u0438 \u0438\u0445 \u0441\u0435\u0430\u043d\u0441\u043e\u0432.\n\n    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442:\n    1. \u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 User1..User3\n    2. \u0412\u0445\u043e\u0434 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0443 \u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0441\u0435\u0430\u043d\u0441\u043e\u0432\n    3. \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043d\u0430\u043b\u0438\u0447\u0438\u044f \u0441\u0435\u0430\u043d\u0441\u0430 \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435\n    4. \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0441\u043a\u0440\u043e\u043b\u043b\u0438\u043d\u0433\u0430 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0441 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e\u043c \u0441\u0435\u0430\u043d\u0441\u043e\u0432\n    5. \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043f\u043e\u0434\u0441\u0432\u0435\u0442\u043a\u0438 \u0441\u0442\u0440\u043e\u043a \u0442\u0430\u0431\u043b\u0438\u0446\u044b\n    6. \u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0444\u0438\u043a\u0441\u0442\u0443\u0440\u043e\u0439 cleanup_users\n    \"\"\"\n    users_data = [\n        {\"name\": \"TestUser1\", \"role\": \"\u0410\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440\", \"password\": \"password1\"},\n        {\"name\": \"TestUser2\", \"role\": \"\u0410\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440\", \"password\": \"password2\"},\n        {\"name\": \"TestUser3\", \"role\": \"\u0410\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440\", \"password\": \"password3\"}\n    ]\n\n    session_tokens = []\n\n    mp = MainPage(browser)\n    ut = UsersTab(browser)\n    mp.click_subpanel_item(\"\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438\")\n\n    # \u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439\n    for user_data in users_data:\n        mp.click_subpanel_item(\"\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438\")\n        mp.click_subpanel_item(\"\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438\")\n        ut.open_add_user_window()\n        ut.add_new_user(user_data)\n\n        # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043d\u0430\u043b\u0438\u0447\u0438\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435\n        ut.should_be_user_in_table(user_data[\"name\"], user_data[\"role\"])\n\n    # \u0412\u0445\u043e\u0434 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0438 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0442\u043e\u043a\u0435\u043d\u043e\u0432 \u0441\u0435\u0430\u043d\u0441\u043e\u0432\n    for user_data in users_data:\n        # \u0412\u0445\u043e\u0434 \u043d\u043e\u0432\u044b\u043c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u043c\n        login_page = LoginPage(browser)\n        login_page.do_login(username=user_data[\"name\"], password=user_data[\"password\"])\n\n        # \u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0442\u043e\u043a\u0435\u043d\u0430 \u0441\u0435\u0430\u043d\u0441\u043e\u0432\n        sessions_tab = SessionsTab(browser)\n        #sessions_tab.should_be_sessions_table()\n        session_token = sessions_tab.get_session_token()\n        session_tokens.append(session_token)\n\n    # \u0412\u043e\u0437\u0432\u0440\u0430\u0442 \u0430\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440\u0430 \u0434\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0441\u0435\u0430\u043d\u0441\u043e\u0432\n    login_page = LoginPage(browser)\n    login_page.do_login()\n\n    mp = MainPage(browser)\n    mp.click_main_navigation_panel_item(\"\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438\")\n    mp.click_subpanel_item(\"\u041e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u043d\u0438\u0435 \u0438 \u0434\u0438\u0430\u0433\u043d\u043e\u0441\u0442\u0438\u043a\u0430\")\n    mp.click_subpanel_item(\"\u0421\u0435\u0430\u043d\u0441\u044b\")\n\n    sessions_tab = SessionsTab(browser)\n    sessions_tab.should_be_sessions_table()\n\n    # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043d\u0430\u043b\u0438\u0447\u0438\u044f \u0441\u0435\u0430\u043d\u0441\u043e\u0432 \u0432\u0441\u0435\u0445 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439\n    for session_token in session_tokens:\n        sessions_tab.should_be_session_in_table(session_token)\n\n    # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0441\u043a\u0440\u043e\u043b\u043b\u0438\u043d\u0433\u0430 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0441 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e\u043c \u0441\u0435\u0430\u043d\u0441\u043e\u0432\n    self._test_sessions_table_scrolling(sessions_tab)\n\n    # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043f\u043e\u0434\u0441\u0432\u0435\u0442\u043a\u0438 \u0441\u0442\u0440\u043e\u043a \u0442\u0430\u0431\u043b\u0438\u0446\u044b\n    rows_count = sessions_tab.get_rows_count()\n    browser.wait_for_timeout(1000)\n\n    # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043f\u043e\u0434\u0441\u0432\u0435\u0442\u043a\u0438 \u043f\u0435\u0440\u0432\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438\n    sessions_tab.check_sessions_table_row_highlighting(0)\n\n    # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043f\u043e\u0434\u0441\u0432\u0435\u0442\u043a\u0438 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0439 \u0441\u0442\u0440\u043e\u043a\u0438 (\u0435\u0441\u043b\u0438 \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435 \u0431\u043e\u043b\u0435\u0435 \u043e\u0434\u043d\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438)\n    if rows_count > 1:\n        browser.wait_for_timeout(1000)\n        sessions_tab.check_sessions_table_row_highlighting(rows_count - 1)\n
    "},{"location":"tests/e2e/test_sessions_tab/#tests.e2e.test_sessions_tab.TestSessionsTab.test_session_auto_deletion_after_15_minutes","title":"test_session_auto_deletion_after_15_minutes(browser, cleanup_users)","text":"

    \u0422\u0435\u0441\u0442 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u0441\u0435\u0430\u043d\u0441\u0430 \u0447\u0435\u0440\u0435\u0437 15 \u043c\u0438\u043d\u0443\u0442 \u043f\u043e\u0441\u043b\u0435 \u0432\u044b\u0445\u043e\u0434\u0430 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442: 1. \u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043d\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f 2. \u0412\u0445\u043e\u0434 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0441\u0435\u0430\u043d\u0441\u0430 3. \u0412\u044b\u0445\u043e\u0434 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0438\u0437 \u0441\u0438\u0441\u0442\u0435\u043c\u044b 4. \u041e\u0436\u0438\u0434\u0430\u043d\u0438\u0435 15 \u043c\u0438\u043d\u0443\u0442 5. \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u0441\u0435\u0430\u043d\u0441\u0430 \u043f\u043e \u0438\u0441\u0442\u0435\u0447\u0435\u043d\u0438\u0438 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 6. \u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0444\u0438\u043a\u0441\u0442\u0443\u0440\u043e\u0439 cleanup_users

    Source code in tests\\e2e\\test_sessions_tab.py
    @pytest.mark.skip(reason=\"\u0422\u0440\u0435\u0431\u0443\u0435\u0442 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0442\u0430\u0439\u043c\u0435\u0440\u0430 \u043e\u0447\u0438\u0441\u0442\u043a\u0438 \u0441\u0435\u0430\u043d\u0441\u043e\u0432\")\ndef test_session_auto_deletion_after_15_minutes(self, browser: Page, cleanup_users: None) -> None:\n    \"\"\"\u0422\u0435\u0441\u0442 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u0441\u0435\u0430\u043d\u0441\u0430 \u0447\u0435\u0440\u0435\u0437 15 \u043c\u0438\u043d\u0443\u0442 \u043f\u043e\u0441\u043b\u0435 \u0432\u044b\u0445\u043e\u0434\u0430 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\n\n    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442:\n    1. \u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043d\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\n    2. \u0412\u0445\u043e\u0434 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0441\u0435\u0430\u043d\u0441\u0430\n    3. \u0412\u044b\u0445\u043e\u0434 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0438\u0437 \u0441\u0438\u0441\u0442\u0435\u043c\u044b\n    4. \u041e\u0436\u0438\u0434\u0430\u043d\u0438\u0435 15 \u043c\u0438\u043d\u0443\u0442\n    5. \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u0441\u0435\u0430\u043d\u0441\u0430 \u043f\u043e \u0438\u0441\u0442\u0435\u0447\u0435\u043d\u0438\u0438 \u0432\u0440\u0435\u043c\u0435\u043d\u0438\n    6. \u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0444\u0438\u043a\u0441\u0442\u0443\u0440\u043e\u0439 cleanup_users\n    \"\"\"\n    user_data = {\"name\": \"TestUserFor15MinDeletion\", \"role\": \"\u0410\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440\", \"password\": \"qwerty123\"}\n\n    mp = MainPage(browser)\n    ut = UsersTab(browser)\n\n    # \u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043d\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\n    mp.click_subpanel_item(\"\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438\")\n    ut.open_add_user_window()\n    ut.add_new_user(user_data)\n\n    # \u041e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u0441\u043f\u0438\u0441\u043a\u0430 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439\n    mp.click_subpanel_item(\"\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438\")\n    mp.click_subpanel_item(\"\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438\")\n\n    # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043d\u0430\u043b\u0438\u0447\u0438\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435\n    ut.should_be_user_in_table(user_data[\"name\"], user_data[\"role\"])\n\n    # \u0412\u0445\u043e\u0434 \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0443 \u0434\u043b\u044f \u043d\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\n    new_lp = LoginPage(browser)\n    new_lp.do_login(username=user_data[\"name\"], password=user_data[\"password\"])\n\n    # \u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0442\u043e\u043a\u0435\u043d\u0430 \u0441\u0435\u0441\u0441\u0438\u0438 \u043d\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\n    new_mp = MainPage(browser)\n\n    # \u041e\u0442\u043a\u0440\u044b\u0442\u044c \u0432\u043a\u043b\u0430\u0434\u043a\u0443 \u0421\u0435\u0441\u0441\u0438\u0438\n    new_mp.should_be_navigation_panel()\n    new_mp.click_main_navigation_panel_item(\"\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438\")\n    new_mp.click_subpanel_item(\"\u041e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u043d\u0438\u0435 \u0438 \u0434\u0438\u0430\u0433\u043d\u043e\u0441\u0442\u0438\u043a\u0430\")\n    new_mp.click_subpanel_item(\"\u0421\u0435\u0430\u043d\u0441\u044b\")\n\n    # \u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0442\u043e\u043a\u0435\u043d \u0441\u0435\u0441\u0441\u0438\u0438\n    sessions_tab = SessionsTab(browser)\n    session_token = sessions_tab.get_session_token()\n\n    # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043d\u0430\u043b\u0438\u0447\u0438\u044f \u0441\u0435\u0441\u0441\u0438\u0438 \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435\n    sessions_tab.should_be_session_in_table(session_token)\n\n    # \u0412\u044b\u0445\u043e\u0434 \u0438\u0437 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u043d\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\n    new_mp.do_logout()\n\n    # \u0410\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u044f \u0430\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440\u043e\u043c\n    admin_lp = LoginPage(browser)\n    admin_lp.do_login()\n\n    # \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u043d\u0430 \u0432\u043a\u043b\u0430\u0434\u043a\u0443 \u0421\u0435\u0430\u043d\u0441\u044b\n    admin_mp = MainPage(browser)\n    admin_mp.should_be_navigation_panel()\n    admin_mp.click_main_navigation_panel_item(\"\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438\")\n    admin_mp.click_subpanel_item(\"\u041e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u043d\u0438\u0435 \u0438 \u0434\u0438\u0430\u0433\u043d\u043e\u0441\u0442\u0438\u043a\u0430\")\n    admin_mp.click_subpanel_item(\"\u0421\u0435\u0430\u043d\u0441\u044b\")\n\n    # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043d\u0430\u043b\u0438\u0447\u0438\u044f \u0441\u0435\u0441\u0441\u0438\u0438 \u0441\u0440\u0430\u0437\u0443 \u043f\u043e\u0441\u043b\u0435 \u0432\u044b\u0445\u043e\u0434\u0430\n    admin_sessions_tab = SessionsTab(browser)\n    admin_sessions_tab.should_be_session_in_table(session_token)\n\n    admin_mp.do_logout()\n\n    # \u041e\u0436\u0438\u0434\u0430\u043d\u0438\u0435 15 \u043c\u0438\u043d\u0443\u0442 1 \u0441\u0435\u043a\u0443\u043d\u0434\u0430 (901 \u0441\u0435\u043a\u0443\u043d\u0434)\n    print(\"\u041e\u0436\u0438\u0434\u0430\u043d\u0438\u0435 15 \u043c\u0438\u043d\u0443\u0442 \u0434\u043b\u044f \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u0441\u0435\u0430\u043d\u0441\u0430...\")\n    browser.wait_for_timeout(901000)  # 15 \u043c\u0438\u043d\u0443\u0442 1 \u0441\u0435\u043a\u0443\u043d\u0434\u0430 \u0432 \u043c\u0438\u043b\u043b\u0438\u0441\u0435\u043a\u0443\u043d\u0434\u0430\u0445\n\n    # \u0410\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u044f \u0430\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440\u043e\u043c\n    admin_lp = LoginPage(browser)\n    admin_lp.do_login()\n\n    # \u041f\u043e\u0432\u0442\u043e\u0440\u043d\u044b\u0439 \u043f\u0435\u0440\u0435\u0445\u043e\u0434 \u043d\u0430 \u0432\u043a\u043b\u0430\u0434\u043a\u0443 \u0421\u0435\u0430\u043d\u0441\u044b \u043f\u043e\u0441\u043b\u0435 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f\n    admin_mp = MainPage(browser)\n    admin_mp.should_be_navigation_panel()\n    admin_mp.click_main_navigation_panel_item(\"\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438\")\n    admin_mp.click_subpanel_item(\"\u041e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u043d\u0438\u0435 \u0438 \u0434\u0438\u0430\u0433\u043d\u043e\u0441\u0442\u0438\u043a\u0430\")\n    admin_mp.click_subpanel_item(\"\u0421\u0435\u0430\u043d\u0441\u044b\")\n\n    # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u044f \u0441\u0435\u0441\u0441\u0438\u0438 \u043f\u043e\u0441\u043b\u0435 15 \u043c\u0438\u043d\u0443\u0442\n    admin_sessions_tab = SessionsTab(browser)\n    admin_sessions_tab.should_be_sessions_table()\n    admin_sessions_tab.should_not_be_session_in_table(session_token)\n
    "},{"location":"tests/e2e/test_sessions_tab/#tests.e2e.test_sessions_tab.TestSessionsTab.test_session_removed_when_user_deleted","title":"test_session_removed_when_user_deleted(browser, cleanup_users)","text":"

    \u0422\u0435\u0441\u0442 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u0441\u0435\u0430\u043d\u0441\u0430 \u043f\u0440\u0438 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442: 1. \u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043d\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f 2. \u0412\u0445\u043e\u0434 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0441\u0435\u0430\u043d\u0441\u0430 3. \u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0430\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440\u043e\u043c 4. \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u0441\u0435\u0430\u043d\u0441\u0430 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f

    Source code in tests\\e2e\\test_sessions_tab.py
    @pytest.mark.skip(reason=\"\u041d\u0435 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u043e \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u043c\")\ndef test_session_removed_when_user_deleted(self, browser: Page, cleanup_users: None) -> None:\n    \"\"\"\u0422\u0435\u0441\u0442 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u0441\u0435\u0430\u043d\u0441\u0430 \u043f\u0440\u0438 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\n\n    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442:\n    1. \u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043d\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\n    2. \u0412\u0445\u043e\u0434 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0441\u0435\u0430\u043d\u0441\u0430\n    3. \u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0430\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440\u043e\u043c\n    4. \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u0441\u0435\u0430\u043d\u0441\u0430 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\n    \"\"\"\n    user_data = {\"name\": \"UserForAutoSessionDeletion\", \"role\": \"\u0410\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440\", \"password\": \"qwerty123\"}\n\n    mp = MainPage(browser)\n    ut = UsersTab(browser)\n\n    # \u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043d\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\n    mp.click_subpanel_item(\"\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438\")\n    ut.open_add_user_window()\n    ut.add_new_user(user_data)\n\n    # \u041e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u0441\u043f\u0438\u0441\u043a\u0430 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439\n    mp.click_subpanel_item(\"\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438\")\n    mp.click_subpanel_item(\"\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438\")\n\n    # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043d\u0430\u043b\u0438\u0447\u0438\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435\n    ut.should_be_user_in_table(user_data[\"name\"], user_data[\"role\"])\n\n    # \u0412\u0445\u043e\u0434 \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0443 \u0434\u043b\u044f \u043d\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\n    new_lp = LoginPage(browser)\n    new_lp.do_login(username=user_data[\"name\"], password=user_data[\"password\"])\n\n    # \u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0442\u043e\u043a\u0435\u043d\u0430 \u0441\u0435\u0441\u0441\u0438\u0438 \u043d\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\n    new_mp = MainPage(browser)\n\n    # \u041e\u0442\u043a\u0440\u044b\u0442\u044c \u0432\u043a\u043b\u0430\u0434\u043a\u0443 \u0421\u0435\u0441\u0441\u0438\u0438\n    new_mp.should_be_navigation_panel()\n    new_mp.click_main_navigation_panel_item(\"\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438\")\n    new_mp.click_subpanel_item(\"\u041e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u043d\u0438\u0435 \u0438 \u0434\u0438\u0430\u0433\u043d\u043e\u0441\u0442\u0438\u043a\u0430\")\n    new_mp.click_subpanel_item(\"\u0421\u0435\u0430\u043d\u0441\u044b\")\n\n    # \u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0442\u043e\u043a\u0435\u043d \u0441\u0435\u0441\u0441\u0438\u0438\n    sessions_tab = SessionsTab(browser)\n    new_user_token = sessions_tab.get_session_token()\n\n    # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043d\u0430\u043b\u0438\u0447\u0438\u044f \u0441\u0435\u0441\u0441\u0438\u0438 \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435\n    sessions_tab.should_be_session_in_table(new_user_token)\n\n    # \u0412\u044b\u0445\u043e\u0434 \u0438\u0437 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u043d\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\n    new_mp.do_logout()\n\n    # \u0410\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u044f \u0430\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440\u043e\u043c\n    admin_lp = LoginPage(browser)\n    admin_lp.do_login()\n\n    # \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u043d\u0430 \u0432\u043a\u043b\u0430\u0434\u043a\u0443 \u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438\n    admin_mp = MainPage(browser)\n    admin_mp.click_main_navigation_panel_item(\"\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438\")\n    admin_mp.click_subpanel_item(\"\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438\")\n\n    # \u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\n    admin_ut = UsersTab(browser)\n    admin_ut.open_edit_user_page_by_user(user_data[\"name\"], user_data[\"role\"])\n    admin_ut.delete_user(user_data[\"name\"])\n\n    # \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u043d\u0430 \u0432\u043a\u043b\u0430\u0434\u043a\u0443 \u0421\u0435\u0430\u043d\u0441\u044b\n    admin_mp.click_main_navigation_panel_item(\"\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438\")\n    admin_mp.click_main_navigation_panel_item(\"\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438\")\n    admin_mp.click_subpanel_item(\"\u041e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u043d\u0438\u0435 \u0438 \u0434\u0438\u0430\u0433\u043d\u043e\u0441\u0442\u0438\u043a\u0430\")\n    admin_mp.click_subpanel_item(\"\u0421\u0435\u0430\u043d\u0441\u044b\")\n\n    # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u044f \u0441\u0435\u0441\u0441\u0438\u0438 \u043f\u043e\u0441\u043b\u0435 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\n    admin_sessions_tab = SessionsTab(browser)\n    admin_sessions_tab.should_be_sessions_table()\n\n    # \u0421\u0435\u0441\u0441\u0438\u044f \u0434\u043e\u043b\u0436\u043d\u0430 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0443\u0434\u0430\u043b\u0438\u0442\u044c\u0441\u044f \u043f\u0440\u0438 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\n    admin_sessions_tab.should_not_be_session_in_table(new_user_token)\n
    "},{"location":"tests/e2e/test_sessions_tab/#tests.e2e.test_sessions_tab.TestSessionsTab.test_sessions_tab_content","title":"test_sessions_tab_content(browser)","text":"

    \u0422\u0435\u0441\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0433\u043e \u0432\u043a\u043b\u0430\u0434\u043a\u0438 '\u0421\u0435\u0430\u043d\u0441\u044b'.

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442: 1. \u041d\u0430\u043b\u0438\u0447\u0438\u0435 \u0438 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0441\u0442\u044c \u0442\u0443\u043b\u0431\u0430\u0440\u0430 2. \u041d\u0430\u043b\u0438\u0447\u0438\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0441\u0435\u0430\u043d\u0441\u043e\u0432 3. \u0421\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0433\u043e \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0434\u0430\u043d\u043d\u044b\u043c \u0438\u0437 \u0411\u0414

    Source code in tests\\e2e\\test_sessions_tab.py
    def test_sessions_tab_content(self, browser: Page) -> None:\n    \"\"\"\u0422\u0435\u0441\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0433\u043e \u0432\u043a\u043b\u0430\u0434\u043a\u0438 '\u0421\u0435\u0430\u043d\u0441\u044b'.\n\n    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442:\n    1. \u041d\u0430\u043b\u0438\u0447\u0438\u0435 \u0438 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0441\u0442\u044c \u0442\u0443\u043b\u0431\u0430\u0440\u0430\n    2. \u041d\u0430\u043b\u0438\u0447\u0438\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0441\u0435\u0430\u043d\u0441\u043e\u0432\n    3. \u0421\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0433\u043e \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0434\u0430\u043d\u043d\u044b\u043c \u0438\u0437 \u0411\u0414\n    \"\"\"\n    # \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u0441\u0435\u0430\u043d\u0441\u043e\u0432\n    sessions_tab = SessionsTab(browser)\n\n    # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430\n    sessions_tab.should_be_toolbar()\n    sessions_tab.should_be_sessions_table()\n\n    # \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c API \u043e\u0442\u0432\u0435\u0442\n    response = sessions_tab.send_get_api_request(\"e-nms/auth/sessions\")\n    response_body = sessions_tab.get_response_body(response)\n\n    if not response_body:\n        print(\"No sessions data from API - table might be empty\")\n        # \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u0442\u043e\u043b\u044c\u043a\u043e \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0438\n        sessions_tab.check_sessions_table_content(verify=False)\n    else:\n        sessions_tab.check_sessions_table_content(verify=True)\n\n    # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0433\u043e \u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u0441 \u0432\u0435\u0440\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0435\u0439 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438\u0437 \u0411\u0414\n    sessions_tab.check_sessions_table_content(verify=True)\n
    "},{"location":"tests/e2e/test_sessions_tab/#tests.e2e.test_sessions_tab.TestSessionsTab.test_user_cannot_delete_own_session","title":"test_user_cannot_delete_own_session(browser, cleanup_users)","text":"

    \u0422\u0435\u0441\u0442 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u043d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u0441\u0432\u043e\u0439 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u0441\u0435\u0430\u043d\u0441. \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442: 1. \u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043d\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f 2. \u0412\u0445\u043e\u0434 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0441\u0435\u0430\u043d\u0441\u0430 3. \u041f\u043e\u043f\u044b\u0442\u043a\u0443 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u0441\u0432\u043e\u0435\u0433\u043e \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0433\u043e \u0441\u0435\u0430\u043d\u0441\u0430 4. \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0443, \u0447\u0442\u043e \u043a\u043d\u043e\u043f\u043a\u0430 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u043d\u0435\u0434\u043e\u0441\u0442\u0443\u043f\u043d\u0430 \u0438\u043b\u0438 \u0441\u043a\u0440\u044b\u0442\u0430 5. \u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0444\u0438\u043a\u0441\u0442\u0443\u0440\u043e\u0439 cleanup_users

    Source code in tests\\e2e\\test_sessions_tab.py
    @pytest.mark.skip(reason=\"\u041d\u0435 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u043c, \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0431\u0438\u0437\u043d\u0435\u0441-\u043b\u043e\u0433\u0438\u043a\u0438\")\ndef test_user_cannot_delete_own_session(self, browser: Page, cleanup_users: None) -> None:\n    \"\"\"\u0422\u0435\u0441\u0442 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u043d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u0441\u0432\u043e\u0439 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u0441\u0435\u0430\u043d\u0441.\n    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442:\n    1. \u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043d\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\n    2. \u0412\u0445\u043e\u0434 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0441\u0435\u0430\u043d\u0441\u0430\n    3. \u041f\u043e\u043f\u044b\u0442\u043a\u0443 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u0441\u0432\u043e\u0435\u0433\u043e \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0433\u043e \u0441\u0435\u0430\u043d\u0441\u0430\n    4. \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0443, \u0447\u0442\u043e \u043a\u043d\u043e\u043f\u043a\u0430 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u043d\u0435\u0434\u043e\u0441\u0442\u0443\u043f\u043d\u0430 \u0438\u043b\u0438 \u0441\u043a\u0440\u044b\u0442\u0430\n    5. \u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0444\u0438\u043a\u0441\u0442\u0443\u0440\u043e\u0439 cleanup_users\n    \"\"\"\n    user_data = {\"name\": \"TestUserForSelfDeletion\", \"role\": \"\u0410\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440\", \"password\": \"qwerty123\"}\n\n    mp = MainPage(browser)\n    ut = UsersTab(browser)\n\n    # \u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043d\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\n    mp.click_subpanel_item(\"\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438\")\n    ut.open_add_user_window()\n    ut.add_new_user(user_data)\n\n    # \u041e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u0441\u043f\u0438\u0441\u043a\u0430 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439\n    mp.click_subpanel_item(\"\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438\")\n    mp.click_subpanel_item(\"\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438\")\n\n    # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043d\u0430\u043b\u0438\u0447\u0438\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435\n    ut.should_be_user_in_table(user_data[\"name\"], user_data[\"role\"])\n\n    # \u0412\u0445\u043e\u0434 \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0443 \u0434\u043b\u044f \u043d\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\n    new_lp = LoginPage(browser)\n    new_lp.do_login(username=user_data[\"name\"], password=user_data[\"password\"])\n\n    # \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u043d\u0430 \u0432\u043a\u043b\u0430\u0434\u043a\u0443 \u0421\u0435\u0430\u043d\u0441\u044b\n    new_mp = MainPage(browser)\n    new_mp.should_be_navigation_panel()\n    new_mp.click_main_navigation_panel_item(\"\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438\")\n    new_mp.click_subpanel_item(\"\u041e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u043d\u0438\u0435 \u0438 \u0434\u0438\u0430\u0433\u043d\u043e\u0441\u0442\u0438\u043a\u0430\")\n    new_mp.click_subpanel_item(\"\u0421\u0435\u0430\u043d\u0441\u044b\")\n\n    # \u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0442\u043e\u043a\u0435\u043d \u0441\u0435\u0441\u0441\u0438\u0438\n    sessions_tab = SessionsTab(browser)\n    session_token = sessions_tab.get_session_token()\n\n    # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043d\u0430\u043b\u0438\u0447\u0438\u044f \u0441\u0435\u0441\u0441\u0438\u0438 \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435\n    sessions_tab.should_be_session_in_table(session_token)\n\n    # \u041f\u043e\u043f\u044b\u0442\u043a\u0430 \u043d\u0430\u0439\u0442\u0438 \u043a\u043d\u043e\u043f\u043a\u0443 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u0434\u043b\u044f \u0441\u0432\u043e\u0435\u0433\u043e \u0441\u0435\u0430\u043d\u0441\u0430\n    row_index = sessions_tab.find_session_in_table(session_token)\n\n    # \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c, \u0447\u0442\u043e \u043a\u043d\u043e\u043f\u043a\u0430 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u043b\u0438\u0431\u043e \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442, \u043b\u0438\u0431\u043e \u043d\u0435\u0430\u043a\u0442\u0438\u0432\u043d\u0430\n    delete_button = sessions_tab.get_delete_session_button_from_row(row_index)\n\n    # \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c, \u0447\u0442\u043e \u043a\u043d\u043e\u043f\u043a\u0430 \u043b\u0438\u0431\u043e \u043d\u0435 \u0432\u0438\u0434\u0438\u043c\u0430, \u043b\u0438\u0431\u043e \u043e\u0442\u043a\u043b\u044e\u0447\u0435\u043d\u0430\n    expect(delete_button).not_to_be_visible()\n\n    # \u0412\u044b\u0445\u043e\u0434 \u0438\u0437 \u0441\u0438\u0441\u0442\u0435\u043c\u044b\n    new_mp.do_logout()\n
    "},{"location":"tests/e2e/test_system_log_events_container/","title":"TestSystemLogEventsContainer","text":"

    \u041c\u043e\u0434\u0443\u043b\u044c \u0442\u0435\u0441\u0442\u043e\u0432 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430 \u0434\u043b\u044f \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0441\u043e\u0431\u044b\u0442\u0438\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u043e\u0433\u043e \u0436\u0443\u0440\u043d\u0430\u043b\u0430.

    \u0421\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0442\u0435\u0441\u0442\u044b \u0434\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430 \u0434\u043b\u044f \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0441\u043e\u0431\u044b\u0442\u0438\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u043e\u0433\u043e \u0436\u0443\u0440\u043d\u0430\u043b\u0430.

    "},{"location":"tests/e2e/test_system_log_events_container/#tests.e2e.test_system_log_events_container.TestSystemLogEventsContainer","title":"TestSystemLogEventsContainer","text":"

    \u041a\u043b\u0430\u0441\u0441 \u0442\u0435\u0441\u0442\u043e\u0432 \u0434\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430 \u0434\u043b\u044f \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0441\u043e\u0431\u044b\u0442\u0438\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u043e\u0433\u043e \u0436\u0443\u0440\u043d\u0430\u043b\u0430..

    \u0422\u0435\u0441\u0442\u044b \u043f\u043e\u043a\u0440\u044b\u0432\u0430\u044e\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0438: 1. test_system_log_events_content: \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430 \u0434\u043b\u044f \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0441\u043e\u0431\u044b\u0442\u0438\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u043e\u0433\u043e \u0436\u0443\u0440\u043d\u0430\u043b\u0430.

    \u0410\u0442\u0440\u0438\u0431\u0443\u0442\u044b

    browser: \u0424\u0438\u043a\u0441\u0442\u0443\u0440\u0430 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u043e\u043c.

    Source code in tests\\e2e\\test_system_log_events_container.py
    class TestSystemLogEventsContainer:\n    \"\"\"\u041a\u043b\u0430\u0441\u0441 \u0442\u0435\u0441\u0442\u043e\u0432 \u0434\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430 \u0434\u043b\u044f \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0441\u043e\u0431\u044b\u0442\u0438\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u043e\u0433\u043e \u0436\u0443\u0440\u043d\u0430\u043b\u0430..\n\n    \u0422\u0435\u0441\u0442\u044b \u043f\u043e\u043a\u0440\u044b\u0432\u0430\u044e\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0438:\n    1. test_system_log_events_content: \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430 \u0434\u043b\u044f \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0441\u043e\u0431\u044b\u0442\u0438\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u043e\u0433\u043e \u0436\u0443\u0440\u043d\u0430\u043b\u0430.\n\n    \u0410\u0442\u0440\u0438\u0431\u0443\u0442\u044b:\n        browser: \u0424\u0438\u043a\u0441\u0442\u0443\u0440\u0430 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u043e\u043c.\n    \"\"\"\n\n    def test_system_log_events_content(self, browser: Page) -> None:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430 \u0434\u043b\u044f \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0441\u043e\u0431\u044b\u0442\u0438\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u043e\u0433\u043e \u0436\u0443\u0440\u043d\u0430\u043b\u0430.\n\n        Args:\n            browser: \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.\n        \"\"\"\n\n        lp = LoginPage(browser)\n        lp.do_login()\n\n        mp = MainPage(browser)\n        mp.should_be_event_panel()\n\n        system_log_events_container = mp.click_events_panel_system_log_tab()\n        system_log_events_container.check_content()\n\n    def test_events_table_row_highlighting(self, browser: Page):\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0441\u0442\u0440\u043e\u043a \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435 \u0441\u043e\u0431\u044b\u0442\u0438\u0439.\n\n        Args:\n            browser: \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.\n        \"\"\"\n\n        lp = LoginPage(browser)\n        lp.do_login()\n\n        mp = MainPage(browser)\n        mp.should_be_event_panel()\n\n        system_log_events_container = mp.click_events_panel_system_log_tab()\n\n        # \u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0430 \u0441\u0442\u0440\u043e\u043a \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435\n        rows_count = system_log_events_container.get_events_table_rows_count()\n\n        # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0441\u0442\u0440\u043e\u043a\n        system_log_events_container.check_events_table_row_highlighting(0)\n        system_log_events_container.check_events_table_row_highlighting(rows_count - 1)\n        system_log_events_container.check_events_table_row_highlighting(int(rows_count / 2))\n\n    def test_events_table_scrolling(self, browser: Page):\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0441\u043a\u0440\u043e\u043b\u043b\u0438\u043d\u0433\u0430 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0441\u043e\u0431\u044b\u0442\u0438\u0439.\n\n        Args:\n            browser: \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.\n        \"\"\"\n\n        lp = LoginPage(browser)\n        lp.do_login()\n\n        mp = MainPage(browser)\n        mp.should_be_event_panel()\n\n        system_log_events_container = mp.click_events_panel_system_log_tab()\n\n        events_panel_position = mp.get_events_panel_position()\n\n        # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430, \u0447\u0442\u043e \u043f\u0430\u043d\u0435\u043b\u044c \u0441 \u0442\u0430\u0431\u043b\u0438\u0446\u0435\u0439 \u043e\u0442\u043a\u0440\u044b\u0442\u0430\n        assert events_panel_position != \"bottom\", \"Panel with system log events should be opened\"\n\n        is_scrollable = system_log_events_container.check_events_table_verticall_scrolling()\n\n        # \u0423\u0431\u0435\u0436\u0434\u0430\u0435\u043c\u0441\u044f, \u0447\u0442\u043e \u043f\u0430\u043d\u0435\u043b\u044c \u043e\u0442\u043a\u0440\u044b\u0442\u0430 \u043d\u0430\u043f\u043e\u043b\u043e\u0432\u0438\u043d\u0443 \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u0441\u043a\u0440\u043e\u043b\u043b\u0438\u043d\u0433\n        assert events_panel_position == \"center\",\\\n               \"Panel with system log events should be located on the main page center\"\n        assert is_scrollable, \"System log events table should be scrollable\"\n\n        # \u0421\u043a\u0440\u043e\u043b\u043b\u0438\u043d\u0433 \u0432\u043d\u0438\u0437\n        system_log_events_container.scroll_events_table_down()\n        browser.wait_for_timeout(1000)\n\n        # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0439 \u0441\u0442\u0440\u043e\u043a\u0438 \u043f\u043e\u0441\u043b\u0435 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0438\n        system_log_events_container.check_events_table_last_row_visibility()\n\n        # \u0421\u043a\u0440\u043e\u043b\u043b\u0438\u043d\u0433 \u0432\u0432\u0435\u0440\u0445\n        system_log_events_container.scroll_events_table_up()\n        browser.wait_for_timeout(1000)\n\n        # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u043f\u0435\u0440\u0432\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438 \u043f\u043e\u0441\u043b\u0435 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0438\n        system_log_events_container.check_events_table_first_row_visibility()\n\n        # \u0420\u0430\u0441\u043a\u0440\u044b\u0432\u0430\u0435\u043c \u043f\u0430\u043d\u0435\u043b\u044c \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u0441\u043a\u0440\u043e\u043b\u043b\u0438\u043d\u0433\n        assert mp.check_expand_less_button(), \\\n                \"Expand less button should be present\"\n        mp.click_events_panel_expand_less_button()\n        mp.wait_for_timeout(500)\n\n        events_panel_position = mp.get_events_panel_position()\n        assert events_panel_position == \"top\",\\\n               \"Panel with system log events should be located on the main page top\"\n\n        is_scrollable = system_log_events_container.check_events_table_verticall_scrolling()\n        assert is_scrollable, \"System log events table should be scrollable in the full window\"\n\n        # \u0421\u043a\u0440\u043e\u043b\u043b\u0438\u043d\u0433 \u0432\u043d\u0438\u0437\n        system_log_events_container.scroll_events_table_down()\n        browser.wait_for_timeout(1000)\n\n        # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0439 \u0441\u0442\u0440\u043e\u043a\u0438 \u043f\u043e\u0441\u043b\u0435 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0438\n        system_log_events_container.check_events_table_last_row_visibility()\n\n        # \u0421\u043a\u0440\u043e\u043b\u043b\u0438\u043d\u0433 \u0432\u0432\u0435\u0440\u0445\n        system_log_events_container.scroll_events_table_up()\n        browser.wait_for_timeout(1000)\n\n        # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u043f\u0435\u0440\u0432\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438 \u043f\u043e\u0441\u043b\u0435 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0438\n        system_log_events_container.check_events_table_first_row_visibility()\n\n    def test_events_table_column_sorting(self, browser: Page):\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0443 \u043a\u043e\u043b\u043e\u043d\u043a\u0438 '\u0412\u0440\u0435\u043c\u044f' \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435 \u0441\u043e\u0431\u044b\u0442\u0438\u0439.\n\n        Args:\n            browser: \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.\n        \"\"\"\n\n        lp = LoginPage(browser)\n        lp.do_login()\n\n        mp = MainPage(browser)\n        mp.should_be_event_panel()\n\n        system_log_events_container = mp.click_events_panel_system_log_tab()\n\n        index = 1\n        state = system_log_events_container.get_arrow_button_state(index)\n        assert state == \"down\", \"Arrow button should be down\"\n\n        system_log_events_container.click_event_table_header_arrow(index)\n        browser.wait_for_timeout(300)\n\n        state = system_log_events_container.get_arrow_button_state(index)\n        assert state == \"up\", \"Arrow button should be up\"\n        is_descending_order = system_log_events_container.check_events_table_column_descending_order(index)\n        assert not is_descending_order, \"Column data should be in ascending order\"\n\n        system_log_events_container.click_event_table_header_arrow(index)\n        browser.wait_for_timeout(300)\n        state = system_log_events_container.get_arrow_button_state(index)\n        assert state == \"down\", \"Arrow button should be down\"\n        is_descending_order = system_log_events_container.check_events_table_column_descending_order(index)\n        assert is_descending_order, \"Column data should be in descending order\"\n\n    @pytest.mark.develop\n    def test_events_table_pagination(self, browser: Page):\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043f\u0430\u0433\u0438\u043d\u0430\u0446\u0438\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0441\u043e\u0431\u044b\u0442\u0438\u0439.\n\n        Args:\n            browser: \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.\n        \"\"\"\n\n        lp = LoginPage(browser)\n        lp.do_login()\n\n        mp = MainPage(browser)\n        mp.should_be_event_panel()\n\n        system_log_events_container = mp.click_events_panel_system_log_tab()\n\n        system_log_events_container.should_be_pagination_buttons()\n\n        # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f\n        is_chevron_left_disabled = system_log_events_container.is_chevron_left_disabled()\n        assert is_chevron_left_disabled, \"Arrow Left button should be disabled\"\n\n        is_chevron_right_disabled = system_log_events_container.is_chevron_right_disabled()\n        assert not is_chevron_right_disabled, \"Arrow Right button should be enabled\"\n\n        current_number = system_log_events_container.get_current_data_set_number()\n        assert current_number == 1, \"The first page should be number one\"\n\n        # \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446 \u043e\u0442 \u043d\u0430\u0447\u0430\u043b\u0430 \u0438 \u0434\u043e \u043a\u043e\u043d\u0446\u0430\n        # to_do: \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430, \u0447\u0442\u043e \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0433\u043e \u0442\u0430\u0431\u043b\u0438\u0446\u044b\n        counter = 1\n        while not is_chevron_right_disabled:\n            system_log_events_container.click_chevron_right()\n            counter += 1\n\n            is_chevron_left_disabled = system_log_events_container.is_chevron_left_disabled()\n            assert not is_chevron_left_disabled, \"Arrow Left button should be enabled\"\n\n            is_chevron_right_disabled = system_log_events_container.is_chevron_right_disabled()\n\n            current_number = system_log_events_container.get_current_data_set_number()\n            assert current_number == counter, f\"Expected page number {counter} is not equal actual {current_number}\"\n\n        # \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446 \u043e\u0442 \u043a\u043e\u043d\u0446\u0430 \u043a \u043d\u0430\u0447\u0430\u043b\u0443\n        # to_do: \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430, \u0447\u0442\u043e \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0433\u043e \u0442\u0430\u0431\u043b\u0438\u0446\u044b\n        while not is_chevron_left_disabled:\n            system_log_events_container.click_chevron_left()\n            counter -= 1\n\n            is_chevron_left_disabled = system_log_events_container.is_chevron_left_disabled()\n\n            is_chevron_right_disabled = system_log_events_container.is_chevron_right_disabled()\n            assert not is_chevron_right_disabled, \"Arrow Right button should be enabled\"\n\n            current_number = system_log_events_container.get_current_data_set_number()\n            assert current_number == counter, f\"Expected page number {counter} is not equal actual {current_number}\"\n\n        # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0432\u043e\u0437\u0432\u0440\u0430\u0442\u0430 \u043a \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e\u043c\u0443 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044e\n        is_chevron_left_disabled = system_log_events_container.is_chevron_left_disabled()\n        assert is_chevron_left_disabled, \"Arrow Left button should be disabled\"\n\n        is_chevron_right_disabled = system_log_events_container.is_chevron_right_disabled()\n        assert not is_chevron_right_disabled, \"Arrow Right button should be enabled\"\n\n        current_number = system_log_events_container.get_current_data_set_number()\n        assert current_number == 1, \"The first page should be number one\"\n
    "},{"location":"tests/e2e/test_system_log_events_container/#tests.e2e.test_system_log_events_container.TestSystemLogEventsContainer.test_events_table_column_sorting","title":"test_events_table_column_sorting(browser)","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0443 \u043a\u043e\u043b\u043e\u043d\u043a\u0438 '\u0412\u0440\u0435\u043c\u044f' \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435 \u0441\u043e\u0431\u044b\u0442\u0438\u0439.

    Parameters:

    Name Type Description Default browser Page

    \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.

    required Source code in tests\\e2e\\test_system_log_events_container.py
    def test_events_table_column_sorting(self, browser: Page):\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0443 \u043a\u043e\u043b\u043e\u043d\u043a\u0438 '\u0412\u0440\u0435\u043c\u044f' \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435 \u0441\u043e\u0431\u044b\u0442\u0438\u0439.\n\n    Args:\n        browser: \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.\n    \"\"\"\n\n    lp = LoginPage(browser)\n    lp.do_login()\n\n    mp = MainPage(browser)\n    mp.should_be_event_panel()\n\n    system_log_events_container = mp.click_events_panel_system_log_tab()\n\n    index = 1\n    state = system_log_events_container.get_arrow_button_state(index)\n    assert state == \"down\", \"Arrow button should be down\"\n\n    system_log_events_container.click_event_table_header_arrow(index)\n    browser.wait_for_timeout(300)\n\n    state = system_log_events_container.get_arrow_button_state(index)\n    assert state == \"up\", \"Arrow button should be up\"\n    is_descending_order = system_log_events_container.check_events_table_column_descending_order(index)\n    assert not is_descending_order, \"Column data should be in ascending order\"\n\n    system_log_events_container.click_event_table_header_arrow(index)\n    browser.wait_for_timeout(300)\n    state = system_log_events_container.get_arrow_button_state(index)\n    assert state == \"down\", \"Arrow button should be down\"\n    is_descending_order = system_log_events_container.check_events_table_column_descending_order(index)\n    assert is_descending_order, \"Column data should be in descending order\"\n
    "},{"location":"tests/e2e/test_system_log_events_container/#tests.e2e.test_system_log_events_container.TestSystemLogEventsContainer.test_events_table_pagination","title":"test_events_table_pagination(browser)","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043f\u0430\u0433\u0438\u043d\u0430\u0446\u0438\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0441\u043e\u0431\u044b\u0442\u0438\u0439.

    Parameters:

    Name Type Description Default browser Page

    \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.

    required Source code in tests\\e2e\\test_system_log_events_container.py
    @pytest.mark.develop\ndef test_events_table_pagination(self, browser: Page):\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043f\u0430\u0433\u0438\u043d\u0430\u0446\u0438\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0441\u043e\u0431\u044b\u0442\u0438\u0439.\n\n    Args:\n        browser: \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.\n    \"\"\"\n\n    lp = LoginPage(browser)\n    lp.do_login()\n\n    mp = MainPage(browser)\n    mp.should_be_event_panel()\n\n    system_log_events_container = mp.click_events_panel_system_log_tab()\n\n    system_log_events_container.should_be_pagination_buttons()\n\n    # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f\n    is_chevron_left_disabled = system_log_events_container.is_chevron_left_disabled()\n    assert is_chevron_left_disabled, \"Arrow Left button should be disabled\"\n\n    is_chevron_right_disabled = system_log_events_container.is_chevron_right_disabled()\n    assert not is_chevron_right_disabled, \"Arrow Right button should be enabled\"\n\n    current_number = system_log_events_container.get_current_data_set_number()\n    assert current_number == 1, \"The first page should be number one\"\n\n    # \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446 \u043e\u0442 \u043d\u0430\u0447\u0430\u043b\u0430 \u0438 \u0434\u043e \u043a\u043e\u043d\u0446\u0430\n    # to_do: \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430, \u0447\u0442\u043e \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0433\u043e \u0442\u0430\u0431\u043b\u0438\u0446\u044b\n    counter = 1\n    while not is_chevron_right_disabled:\n        system_log_events_container.click_chevron_right()\n        counter += 1\n\n        is_chevron_left_disabled = system_log_events_container.is_chevron_left_disabled()\n        assert not is_chevron_left_disabled, \"Arrow Left button should be enabled\"\n\n        is_chevron_right_disabled = system_log_events_container.is_chevron_right_disabled()\n\n        current_number = system_log_events_container.get_current_data_set_number()\n        assert current_number == counter, f\"Expected page number {counter} is not equal actual {current_number}\"\n\n    # \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446 \u043e\u0442 \u043a\u043e\u043d\u0446\u0430 \u043a \u043d\u0430\u0447\u0430\u043b\u0443\n    # to_do: \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430, \u0447\u0442\u043e \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0433\u043e \u0442\u0430\u0431\u043b\u0438\u0446\u044b\n    while not is_chevron_left_disabled:\n        system_log_events_container.click_chevron_left()\n        counter -= 1\n\n        is_chevron_left_disabled = system_log_events_container.is_chevron_left_disabled()\n\n        is_chevron_right_disabled = system_log_events_container.is_chevron_right_disabled()\n        assert not is_chevron_right_disabled, \"Arrow Right button should be enabled\"\n\n        current_number = system_log_events_container.get_current_data_set_number()\n        assert current_number == counter, f\"Expected page number {counter} is not equal actual {current_number}\"\n\n    # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0432\u043e\u0437\u0432\u0440\u0430\u0442\u0430 \u043a \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e\u043c\u0443 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044e\n    is_chevron_left_disabled = system_log_events_container.is_chevron_left_disabled()\n    assert is_chevron_left_disabled, \"Arrow Left button should be disabled\"\n\n    is_chevron_right_disabled = system_log_events_container.is_chevron_right_disabled()\n    assert not is_chevron_right_disabled, \"Arrow Right button should be enabled\"\n\n    current_number = system_log_events_container.get_current_data_set_number()\n    assert current_number == 1, \"The first page should be number one\"\n
    "},{"location":"tests/e2e/test_system_log_events_container/#tests.e2e.test_system_log_events_container.TestSystemLogEventsContainer.test_events_table_row_highlighting","title":"test_events_table_row_highlighting(browser)","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0441\u0442\u0440\u043e\u043a \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435 \u0441\u043e\u0431\u044b\u0442\u0438\u0439.

    Parameters:

    Name Type Description Default browser Page

    \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.

    required Source code in tests\\e2e\\test_system_log_events_container.py
    def test_events_table_row_highlighting(self, browser: Page):\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0441\u0442\u0440\u043e\u043a \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435 \u0441\u043e\u0431\u044b\u0442\u0438\u0439.\n\n    Args:\n        browser: \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.\n    \"\"\"\n\n    lp = LoginPage(browser)\n    lp.do_login()\n\n    mp = MainPage(browser)\n    mp.should_be_event_panel()\n\n    system_log_events_container = mp.click_events_panel_system_log_tab()\n\n    # \u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0430 \u0441\u0442\u0440\u043e\u043a \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435\n    rows_count = system_log_events_container.get_events_table_rows_count()\n\n    # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0441\u0442\u0440\u043e\u043a\n    system_log_events_container.check_events_table_row_highlighting(0)\n    system_log_events_container.check_events_table_row_highlighting(rows_count - 1)\n    system_log_events_container.check_events_table_row_highlighting(int(rows_count / 2))\n
    "},{"location":"tests/e2e/test_system_log_events_container/#tests.e2e.test_system_log_events_container.TestSystemLogEventsContainer.test_events_table_scrolling","title":"test_events_table_scrolling(browser)","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0441\u043a\u0440\u043e\u043b\u043b\u0438\u043d\u0433\u0430 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0441\u043e\u0431\u044b\u0442\u0438\u0439.

    Parameters:

    Name Type Description Default browser Page

    \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.

    required Source code in tests\\e2e\\test_system_log_events_container.py
    def test_events_table_scrolling(self, browser: Page):\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0441\u043a\u0440\u043e\u043b\u043b\u0438\u043d\u0433\u0430 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0441\u043e\u0431\u044b\u0442\u0438\u0439.\n\n    Args:\n        browser: \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.\n    \"\"\"\n\n    lp = LoginPage(browser)\n    lp.do_login()\n\n    mp = MainPage(browser)\n    mp.should_be_event_panel()\n\n    system_log_events_container = mp.click_events_panel_system_log_tab()\n\n    events_panel_position = mp.get_events_panel_position()\n\n    # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430, \u0447\u0442\u043e \u043f\u0430\u043d\u0435\u043b\u044c \u0441 \u0442\u0430\u0431\u043b\u0438\u0446\u0435\u0439 \u043e\u0442\u043a\u0440\u044b\u0442\u0430\n    assert events_panel_position != \"bottom\", \"Panel with system log events should be opened\"\n\n    is_scrollable = system_log_events_container.check_events_table_verticall_scrolling()\n\n    # \u0423\u0431\u0435\u0436\u0434\u0430\u0435\u043c\u0441\u044f, \u0447\u0442\u043e \u043f\u0430\u043d\u0435\u043b\u044c \u043e\u0442\u043a\u0440\u044b\u0442\u0430 \u043d\u0430\u043f\u043e\u043b\u043e\u0432\u0438\u043d\u0443 \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u0441\u043a\u0440\u043e\u043b\u043b\u0438\u043d\u0433\n    assert events_panel_position == \"center\",\\\n           \"Panel with system log events should be located on the main page center\"\n    assert is_scrollable, \"System log events table should be scrollable\"\n\n    # \u0421\u043a\u0440\u043e\u043b\u043b\u0438\u043d\u0433 \u0432\u043d\u0438\u0437\n    system_log_events_container.scroll_events_table_down()\n    browser.wait_for_timeout(1000)\n\n    # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0439 \u0441\u0442\u0440\u043e\u043a\u0438 \u043f\u043e\u0441\u043b\u0435 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0438\n    system_log_events_container.check_events_table_last_row_visibility()\n\n    # \u0421\u043a\u0440\u043e\u043b\u043b\u0438\u043d\u0433 \u0432\u0432\u0435\u0440\u0445\n    system_log_events_container.scroll_events_table_up()\n    browser.wait_for_timeout(1000)\n\n    # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u043f\u0435\u0440\u0432\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438 \u043f\u043e\u0441\u043b\u0435 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0438\n    system_log_events_container.check_events_table_first_row_visibility()\n\n    # \u0420\u0430\u0441\u043a\u0440\u044b\u0432\u0430\u0435\u043c \u043f\u0430\u043d\u0435\u043b\u044c \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u0441\u043a\u0440\u043e\u043b\u043b\u0438\u043d\u0433\n    assert mp.check_expand_less_button(), \\\n            \"Expand less button should be present\"\n    mp.click_events_panel_expand_less_button()\n    mp.wait_for_timeout(500)\n\n    events_panel_position = mp.get_events_panel_position()\n    assert events_panel_position == \"top\",\\\n           \"Panel with system log events should be located on the main page top\"\n\n    is_scrollable = system_log_events_container.check_events_table_verticall_scrolling()\n    assert is_scrollable, \"System log events table should be scrollable in the full window\"\n\n    # \u0421\u043a\u0440\u043e\u043b\u043b\u0438\u043d\u0433 \u0432\u043d\u0438\u0437\n    system_log_events_container.scroll_events_table_down()\n    browser.wait_for_timeout(1000)\n\n    # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0439 \u0441\u0442\u0440\u043e\u043a\u0438 \u043f\u043e\u0441\u043b\u0435 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0438\n    system_log_events_container.check_events_table_last_row_visibility()\n\n    # \u0421\u043a\u0440\u043e\u043b\u043b\u0438\u043d\u0433 \u0432\u0432\u0435\u0440\u0445\n    system_log_events_container.scroll_events_table_up()\n    browser.wait_for_timeout(1000)\n\n    # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u043f\u0435\u0440\u0432\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438 \u043f\u043e\u0441\u043b\u0435 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0438\n    system_log_events_container.check_events_table_first_row_visibility()\n
    "},{"location":"tests/e2e/test_system_log_events_container/#tests.e2e.test_system_log_events_container.TestSystemLogEventsContainer.test_system_log_events_content","title":"test_system_log_events_content(browser)","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430 \u0434\u043b\u044f \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0441\u043e\u0431\u044b\u0442\u0438\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u043e\u0433\u043e \u0436\u0443\u0440\u043d\u0430\u043b\u0430.

    Parameters:

    Name Type Description Default browser Page

    \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.

    required Source code in tests\\e2e\\test_system_log_events_container.py
    def test_system_log_events_content(self, browser: Page) -> None:\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430 \u0434\u043b\u044f \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0441\u043e\u0431\u044b\u0442\u0438\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u043e\u0433\u043e \u0436\u0443\u0440\u043d\u0430\u043b\u0430.\n\n    Args:\n        browser: \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.\n    \"\"\"\n\n    lp = LoginPage(browser)\n    lp.do_login()\n\n    mp = MainPage(browser)\n    mp.should_be_event_panel()\n\n    system_log_events_container = mp.click_events_panel_system_log_tab()\n    system_log_events_container.check_content()\n
    "},{"location":"tests/e2e/test_templates_tab/","title":"TestTemplatesTab","text":"

    \u041c\u043e\u0434\u0443\u043b\u044c \u0442\u0435\u0441\u0442\u043e\u0432 \u0432\u043a\u043b\u0430\u0434\u043a\u0438 '\u0428\u0430\u0431\u043b\u043e\u043d\u044b'.

    \u0421\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0442\u0435\u0441\u0442\u044b \u0434\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0448\u0430\u0431\u043b\u043e\u043d\u0430\u043c\u0438.

    "},{"location":"tests/e2e/test_templates_tab/#tests.e2e.test_templates_tab.TestTemplatesTab","title":"TestTemplatesTab","text":"

    \u041d\u0430\u0431\u043e\u0440 \u0442\u0435\u0441\u0442\u043e\u0432 \u0434\u043b\u044f \u0432\u043a\u043b\u0430\u0434\u043a\u0438 '\u0428\u0430\u0431\u043b\u043e\u043d\u044b'.

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0441\u0442\u044c \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0432\u043a\u043b\u0430\u0434\u043a\u0438 \u0428\u0430\u0431\u043b\u043e\u043d\u044b.

    \u0422\u0435\u0441\u0442\u044b \u043f\u043e\u043a\u0440\u044b\u0432\u0430\u044e\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0438: 1. test_templates_tab_content - \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0433\u043e \u0432\u043a\u043b\u0430\u0434\u043a\u0438 2. test_templates_table_row_highlighting - \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0441\u0442\u0440\u043e\u043a \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435 3. test_templates_table_scrolling - \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0441\u043a\u0440\u043e\u043b\u043b\u0438\u043d\u0433\u0430 \u0442\u0430\u0431\u043b\u0438\u0446\u044b 4. test_templates_modal_window_content - \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0433\u043e \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430 5. test_templates_modal_window_scrolling - \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0441\u043a\u0440\u043e\u043b\u043b\u0438\u043d\u0433\u0430 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430 6. test_templates_modal_window_api_data_consistency - \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445 API

    Source code in tests\\e2e\\test_templates_tab.py
    class TestTemplatesTab:\n    \"\"\"\u041d\u0430\u0431\u043e\u0440 \u0442\u0435\u0441\u0442\u043e\u0432 \u0434\u043b\u044f \u0432\u043a\u043b\u0430\u0434\u043a\u0438 '\u0428\u0430\u0431\u043b\u043e\u043d\u044b'.\n\n    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0441\u0442\u044c \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0432\u043a\u043b\u0430\u0434\u043a\u0438 \u0428\u0430\u0431\u043b\u043e\u043d\u044b.\n\n    \u0422\u0435\u0441\u0442\u044b \u043f\u043e\u043a\u0440\u044b\u0432\u0430\u044e\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0438:\n    1. test_templates_tab_content - \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0433\u043e \u0432\u043a\u043b\u0430\u0434\u043a\u0438\n    2. test_templates_table_row_highlighting - \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0441\u0442\u0440\u043e\u043a \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435\n    3. test_templates_table_scrolling - \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0441\u043a\u0440\u043e\u043b\u043b\u0438\u043d\u0433\u0430 \u0442\u0430\u0431\u043b\u0438\u0446\u044b\n    4. test_templates_modal_window_content - \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0433\u043e \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430\n    5. test_templates_modal_window_scrolling - \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0441\u043a\u0440\u043e\u043b\u043b\u0438\u043d\u0433\u0430 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430\n    6. test_templates_modal_window_api_data_consistency - \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445 API\n    \"\"\"\n\n    @pytest.fixture(scope=\"function\", autouse=True)\n    def setup(self, browser: Page) -> None:\n        \"\"\"\u0424\u0438\u043a\u0441\u0442\u0443\u0440\u0430 \u0434\u043b\u044f \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0438 \u0442\u0435\u0441\u0442\u043e\u0432\u043e\u0433\u043e \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f.\n\n        \u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442:\n        1. \u0410\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u044e \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0435\n        2. \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u043d\u0430 \u0432\u043a\u043b\u0430\u0434\u043a\u0443 '\u0428\u0430\u0431\u043b\u043e\u043d\u044b' \u0447\u0435\u0440\u0435\u0437 \u043f\u0430\u043d\u0435\u043b\u044c \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438\n        \"\"\"\n        # \u0410\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u044f \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0435\n        login_page = LoginPage(browser)\n        login_page.do_login()\n\n        # \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0433\u043b\u0430\u0432\u043d\u043e\u0439 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b\n        main_page = MainPage(browser)\n\n        # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0438 \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u0441 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u043c\u0438 \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438\n        main_page.should_be_navigation_panel()\n        main_page.click_main_navigation_panel_item(\"\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438\")\n        main_page.click_subpanel_item(\"\u0428\u0430\u0431\u043b\u043e\u043d\u044b\")\n\n    def test_templates_tab_content(self, browser: Page) -> None:\n        \"\"\"\u0422\u0435\u0441\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0433\u043e \u0432\u043a\u043b\u0430\u0434\u043a\u0438 '\u0428\u0430\u0431\u043b\u043e\u043d\u044b'.\n\n        \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442:\n        1. \u041d\u0430\u043b\u0438\u0447\u0438\u0435 \u0438 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0441\u0442\u044c \u0442\u0443\u043b\u0431\u0430\u0440\u0430\n        2. \u041d\u0430\u043b\u0438\u0447\u0438\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0448\u0430\u0431\u043b\u043e\u043d\u043e\u0432\n        3. \u0421\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0433\u043e \u0442\u0430\u0431\u043b\u0438\u0446\u044b\n        \"\"\"\n        # \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u0441\u0435\u0430\u043d\u0441\u043e\u0432\n        templates_tab = TemplatesTab(browser)\n\n        # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0442\u0443\u043b\u0431\u0430\u0440\u0430 \u0432\u043a\u043b\u0430\u0434\u043a\u0438\n        templates_tab.should_be_toolbar()\n\n        # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043d\u0430\u043b\u0438\u0447\u0438\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0448\u0430\u0431\u043b\u043e\u043d\u043e\u0432\n        templates_tab.should_be_templates_table()\n\n        browser.wait_for_timeout(5000)\n\n        # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0433\u043e \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0448\u0430\u0431\u043b\u043e\u043d\u043e\u0432\n        templates_tab.check_templates_table_content()\n\n    def test_templates_table_row_highlighting(self, browser: Page) -> None:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0441\u0442\u0440\u043e\u043a \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435 \u0448\u0430\u0431\u043b\u043e\u043d\u043e\u0432.\n\n        \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0441\u0442\u044c \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0441\u0442\u0440\u043e\u043a \u043f\u0440\u0438 \u043a\u043b\u0438\u043a\u0435 \u043d\u0430 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0435 \u043f\u043e\u0437\u0438\u0446\u0438\u0438:\n        1. \u041f\u0435\u0440\u0432\u0430\u044f \u0441\u0442\u0440\u043e\u043a\u0430\n        2. \u041f\u043e\u0441\u043b\u0435\u0434\u043d\u044f\u044f \u0441\u0442\u0440\u043e\u043a\u0430\n        3. \u0421\u0442\u0440\u043e\u043a\u0430 \u0432 \u0441\u0435\u0440\u0435\u0434\u0438\u043d\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u044b\n        \"\"\"\n\n        templates_tab = TemplatesTab(browser)\n\n        # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0442\u0443\u043b\u0431\u0430\u0440\u0430 \u0432\u043a\u043b\u0430\u0434\u043a\u0438\n        templates_tab.should_be_toolbar()\n\n        # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043d\u0430\u043b\u0438\u0447\u0438\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0448\u0430\u0431\u043b\u043e\u043d\u043e\u0432\n        templates_tab.should_be_templates_table()\n\n        # \u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0430 \u0441\u0442\u0440\u043e\u043a \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435\n        rows_count = templates_tab.get_rows_count()\n\n        # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0441\u0442\u0440\u043e\u043a\n        templates_tab.check_templates_table_row_highlighting(0)\n        templates_tab.check_templates_table_row_highlighting(rows_count - 1)\n        templates_tab.check_templates_table_row_highlighting(int(rows_count / 2))\n\n    def test_templates_table_scrolling(self, browser: Page) -> None:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0441\u043a\u0440\u043e\u043b\u043b\u0438\u043d\u0433\u0430 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0448\u0430\u0431\u043b\u043e\u043d\u043e\u0432.\n\n        \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442:\n        1. \u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u0439 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u044b\n        2. \u0412\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u0441\u0442\u0440\u043e\u043a \u043f\u043e\u0441\u043b\u0435 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0438 \u0432\u043d\u0438\u0437 \u0438 \u0432\u0432\u0435\u0440\u0445\n        3. \u041a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0441\u0442\u044c \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445 \u043f\u043e\u0441\u043b\u0435 \u0441\u043a\u0440\u043e\u043b\u043b\u0438\u043d\u0433\u0430\n        \"\"\"\n\n        templates_tab = TemplatesTab(browser)\n\n        browser.wait_for_timeout(2000)\n\n        # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0441\u043a\u0440\u043e\u043b\u043b\u0438\u043d\u0433\u0430\n        is_scrollable = templates_tab.check_templates_table_verticall_scrolling()\n\n        if is_scrollable:\n            print(\"\u0422\u0430\u0431\u043b\u0438\u0446\u0430 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u0439 \u0441\u043a\u0440\u043e\u043b\u043b\u0438\u043d\u0433\")\n\n            # \u041f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0430 \u0432\u043d\u0438\u0437\n            templates_tab.scroll_templates_table_down()\n\n            browser.wait_for_timeout(1000)\n\n            # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0439 \u0441\u0442\u0440\u043e\u043a\u0438 \u043f\u043e\u0441\u043b\u0435 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0438\n            templates_tab.check_templates_table_last_row_visibility()\n\n            # \u041f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0430 \u0432\u0432\u0435\u0440\u0445\n            templates_tab.scroll_templates_table_up()\n\n            browser.wait_for_timeout(1000)\n\n            # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u043f\u0435\u0440\u0432\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438 \u043f\u043e\u0441\u043b\u0435 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0438\n            templates_tab.check_templates_table_first_row_visibility()\n        else:\n            print(\"\u0422\u0430\u0431\u043b\u0438\u0446\u0430 \u043d\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u0439 \u0441\u043a\u0440\u043e\u043b\u043b\u0438\u043d\u0433\")\n\n            # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u043f\u0435\u0440\u0432\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438\n            templates_tab.check_templates_table_first_row_visibility()\n\n    def test_templates_modal_window_content(self, browser: Page) -> None:\n        \"\"\"\u0422\u0435\u0441\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0433\u043e \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430 \u0448\u0430\u0431\u043b\u043e\u043d\u0430.\n\n        \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442:\n        1. \u041e\u0442\u043a\u0440\u044b\u0442\u0438\u0435 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430 \u043f\u0440\u0438 \u043a\u043b\u0438\u043a\u0435 \u043d\u0430 \u0441\u0442\u0440\u043e\u043a\u0443 \u0442\u0430\u0431\u043b\u0438\u0446\u044b\n        2. \u041d\u0430\u043b\u0438\u0447\u0438\u0435 \u0438 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430\n        3. \u041d\u0430\u043b\u0438\u0447\u0438\u0435 \u0442\u0443\u043b\u0431\u0430\u0440\u0430 \u0432 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u043c \u043e\u043a\u043d\u0435\n        4. \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043a\u043d\u043e\u043f\u043a\u0438 \u0437\u0430\u043a\u0440\u044b\u0442\u0438\u044f \u0438 \u0435\u0451 \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0438\n        5. \u0417\u0430\u043a\u0440\u044b\u0442\u0438\u0435 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430\n        \"\"\"\n        # \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u0448\u0430\u0431\u043b\u043e\u043d\u043e\u0432\n        templates_tab = TemplatesTab(browser)\n\n        # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043d\u0430\u043b\u0438\u0447\u0438\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0448\u0430\u0431\u043b\u043e\u043d\u043e\u0432\n        templates_tab.should_be_templates_table()\n\n        # \u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0437\u0430\u0434\u0435\u0440\u0436\u043a\u0443 \u0434\u043b\u044f \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u0434\u0430\u043d\u043d\u044b\u0445\n        browser.wait_for_timeout(2000)\n\n        # \u041e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u043c \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043a\u043d\u043e, \u043a\u043b\u0438\u043a\u0430\u044f \u043d\u0430 \u043f\u0435\u0440\u0432\u0443\u044e \u0441\u0442\u0440\u043e\u043a\u0443 \u0442\u0430\u0431\u043b\u0438\u0446\u044b\n        template_name = templates_tab.open_template_modal(0)\n\n        # \u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0437\u0430\u0434\u0435\u0440\u0436\u043a\u0443 \u0434\u043b\u044f \u043e\u0442\u043a\u0440\u044b\u0442\u0438\u044f \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430\n        browser.wait_for_timeout(1000)\n\n        # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043e\u0442\u043a\u0440\u044b\u0442\u0438\u044f \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430\n        templates_tab.should_be_modal_window()\n\n        # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0433\u043e \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430\n        templates_tab.check_templates_modal_content(template_name)\n\n        # \u0417\u0430\u043a\u0440\u044b\u0442\u0438\u0435 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430 \u0447\u0435\u0440\u0435\u0437 \u043a\u043d\u043e\u043f\u043a\u0443 \u0437\u0430\u043a\u0440\u044b\u0442\u0438\u044f\n        templates_tab.close_modal_window_by_toolbar_button(template_name)\n\n        # \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c, \u0447\u0442\u043e \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043a\u043d\u043e \u0437\u0430\u043a\u0440\u044b\u043b\u043e\u0441\u044c\n        templates_tab.should_not_be_modal_window()\n\n    def test_templates_modal_window_scrolling(self, browser: Page) -> None:\n        \"\"\"\u0422\u0435\u0441\u0442 \u0441\u043a\u0440\u043e\u043b\u043b\u0438\u043d\u0433\u0430 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430 \u0448\u0430\u0431\u043b\u043e\u043d\u0430.\n\n        \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442:\n        1. \u041e\u0442\u043a\u0440\u044b\u0442\u0438\u0435 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430 \u043f\u0440\u0438 \u043a\u043b\u0438\u043a\u0435 \u043d\u0430 \u0441\u0442\u0440\u043e\u043a\u0443 \u0442\u0430\u0431\u043b\u0438\u0446\u044b\n        2. \u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0441\u043a\u0440\u043e\u043b\u043b\u0438\u043d\u0433\u0430 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0433\u043e \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430\n        3. \u0417\u0430\u043a\u0440\u044b\u0442\u0438\u0435 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430\n        \"\"\"\n\n        # \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u0448\u0430\u0431\u043b\u043e\u043d\u043e\u0432\n        templates_tab = TemplatesTab(browser)\n\n        # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043d\u0430\u043b\u0438\u0447\u0438\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0448\u0430\u0431\u043b\u043e\u043d\u043e\u0432\n        templates_tab.should_be_templates_table()\n\n        # \u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0437\u0430\u0434\u0435\u0440\u0436\u043a\u0443 \u0434\u043b\u044f \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u0434\u0430\u043d\u043d\u044b\u0445\n        browser.wait_for_timeout(2000)\n\n        # \u041e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u043c \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043a\u043d\u043e, \u043a\u043b\u0438\u043a\u0430\u044f \u043d\u0430 \u043f\u0435\u0440\u0432\u0443\u044e \u0441\u0442\u0440\u043e\u043a\u0443 \u0442\u0430\u0431\u043b\u0438\u0446\u044b\n        template_name = templates_tab.open_template_modal(0)\n\n        # \u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0437\u0430\u0434\u0435\u0440\u0436\u043a\u0443 \u0434\u043b\u044f \u043e\u0442\u043a\u0440\u044b\u0442\u0438\u044f \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430\n        browser.wait_for_timeout(1000)\n\n        # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043e\u0442\u043a\u0440\u044b\u0442\u0438\u044f \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430\n        templates_tab.should_be_modal_window()\n\n        # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0441\u043a\u0440\u043e\u043b\u043b\u0438\u043d\u0433\u0430 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430\n        is_scrollable = templates_tab.check_modal_vertical_scrolling()\n\n        if is_scrollable:\n            print(\"\u041c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043a\u043d\u043e \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u0439 \u0441\u043a\u0440\u043e\u043b\u043b\u0438\u043d\u0433\")\n\n            # \u041f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0430 \u0432\u043d\u0438\u0437\n            templates_tab.scroll_modal_down()\n            browser.wait_for_timeout(1000)\n\n            # \u041f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0430 \u0432\u0432\u0435\u0440\u0445\n            templates_tab.scroll_modal_up()\n            browser.wait_for_timeout(1000)\n        else:\n            print(\"\u041c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043a\u043d\u043e \u043d\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u0439 \u0441\u043a\u0440\u043e\u043b\u043b\u0438\u043d\u0433\")\n\n        # \u0417\u0430\u043a\u0440\u044b\u0442\u0438\u0435 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430 \u0447\u0435\u0440\u0435\u0437 \u043a\u043d\u043e\u043f\u043a\u0443 \u0437\u0430\u043a\u0440\u044b\u0442\u0438\u044f\n        templates_tab.close_modal_window_by_toolbar_button(template_name)\n\n        # \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c, \u0447\u0442\u043e \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043a\u043d\u043e \u0437\u0430\u043a\u0440\u044b\u043b\u043e\u0441\u044c\n        templates_tab.should_not_be_modal_window()\n\n    # @pytest.mark.skip(reason=\"\u0420\u0430\u0437\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442\u0441\u044f. \u0412\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u043e \u0438\u0437 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f\")\n    def test_templates_modal_window_api_data_consistency(self, browser: Page) -> None:\n        \"\"\"\u0422\u0435\u0441\u0442 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430 \u0434\u0430\u043d\u043d\u044b\u043c \u0438\u0437 API.\n\n        \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442:\n        1. \u041e\u0442\u043a\u0440\u044b\u0442\u0438\u0435 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430 \u043f\u0440\u0438 \u043a\u043b\u0438\u043a\u0435 \u043d\u0430 \u0441\u0442\u0440\u043e\u043a\u0443 \u0442\u0430\u0431\u043b\u0438\u0446\u044b\n        2. \u0421\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0435 JSON \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u043c \u043e\u043a\u043d\u0435 \u0434\u0430\u043d\u043d\u044b\u043c \u0438\u0437 API\n        3. \u0417\u0430\u043a\u0440\u044b\u0442\u0438\u0435 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430\n        \"\"\"\n        # \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u0448\u0430\u0431\u043b\u043e\u043d\u043e\u0432\n        templates_tab = TemplatesTab(browser)\n\n        # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043d\u0430\u043b\u0438\u0447\u0438\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0448\u0430\u0431\u043b\u043e\u043d\u043e\u0432\n        templates_tab.should_be_templates_table()\n\n        # \u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0437\u0430\u0434\u0435\u0440\u0436\u043a\u0443 \u0434\u043b\u044f \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u0434\u0430\u043d\u043d\u044b\u0445\n        browser.wait_for_timeout(5000)\n\n        # \u041e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u043c \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043a\u043d\u043e, \u043a\u043b\u0438\u043a\u0430\u044f \u043d\u0430 \u043f\u0435\u0440\u0432\u0443\u044e \u0441\u0442\u0440\u043e\u043a\u0443 \u0442\u0430\u0431\u043b\u0438\u0446\u044b\n        template_name = templates_tab.open_template_modal(0)\n\n        # \u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0437\u0430\u0434\u0435\u0440\u0436\u043a\u0443 \u0434\u043b\u044f \u043e\u0442\u043a\u0440\u044b\u0442\u0438\u044f \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430\n        browser.wait_for_timeout(2000)\n\n        # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043e\u0442\u043a\u0440\u044b\u0442\u0438\u044f \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430\n        templates_tab.should_be_modal_window()\n\n        # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430 \u0434\u0430\u043d\u043d\u044b\u043c \u0438\u0437 API\n        templates_tab.verify_json_container_content(\n            template_name,\n            save_to_file=False\n        )\n\n        # \u0417\u0430\u043a\u0440\u044b\u0442\u0438\u0435 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430 \u0447\u0435\u0440\u0435\u0437 \u043a\u043d\u043e\u043f\u043a\u0443 \u0437\u0430\u043a\u0440\u044b\u0442\u0438\u044f\n        templates_tab.close_modal_window_by_toolbar_button(template_name)\n\n        # \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c, \u0447\u0442\u043e \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043a\u043d\u043e \u0437\u0430\u043a\u0440\u044b\u043b\u043e\u0441\u044c\n        templates_tab.should_not_be_modal_window()\n
    "},{"location":"tests/e2e/test_templates_tab/#tests.e2e.test_templates_tab.TestTemplatesTab.setup","title":"setup(browser)","text":"

    \u0424\u0438\u043a\u0441\u0442\u0443\u0440\u0430 \u0434\u043b\u044f \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0438 \u0442\u0435\u0441\u0442\u043e\u0432\u043e\u0433\u043e \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f.

    \u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442: 1. \u0410\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u044e \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0435 2. \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u043d\u0430 \u0432\u043a\u043b\u0430\u0434\u043a\u0443 '\u0428\u0430\u0431\u043b\u043e\u043d\u044b' \u0447\u0435\u0440\u0435\u0437 \u043f\u0430\u043d\u0435\u043b\u044c \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438

    Source code in tests\\e2e\\test_templates_tab.py
    @pytest.fixture(scope=\"function\", autouse=True)\ndef setup(self, browser: Page) -> None:\n    \"\"\"\u0424\u0438\u043a\u0441\u0442\u0443\u0440\u0430 \u0434\u043b\u044f \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0438 \u0442\u0435\u0441\u0442\u043e\u0432\u043e\u0433\u043e \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f.\n\n    \u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442:\n    1. \u0410\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u044e \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0435\n    2. \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u043d\u0430 \u0432\u043a\u043b\u0430\u0434\u043a\u0443 '\u0428\u0430\u0431\u043b\u043e\u043d\u044b' \u0447\u0435\u0440\u0435\u0437 \u043f\u0430\u043d\u0435\u043b\u044c \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438\n    \"\"\"\n    # \u0410\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u044f \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0435\n    login_page = LoginPage(browser)\n    login_page.do_login()\n\n    # \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0433\u043b\u0430\u0432\u043d\u043e\u0439 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b\n    main_page = MainPage(browser)\n\n    # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0438 \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u0441 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u043c\u0438 \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438\n    main_page.should_be_navigation_panel()\n    main_page.click_main_navigation_panel_item(\"\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438\")\n    main_page.click_subpanel_item(\"\u0428\u0430\u0431\u043b\u043e\u043d\u044b\")\n
    "},{"location":"tests/e2e/test_templates_tab/#tests.e2e.test_templates_tab.TestTemplatesTab.test_templates_modal_window_api_data_consistency","title":"test_templates_modal_window_api_data_consistency(browser)","text":"

    \u0422\u0435\u0441\u0442 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430 \u0434\u0430\u043d\u043d\u044b\u043c \u0438\u0437 API.

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442: 1. \u041e\u0442\u043a\u0440\u044b\u0442\u0438\u0435 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430 \u043f\u0440\u0438 \u043a\u043b\u0438\u043a\u0435 \u043d\u0430 \u0441\u0442\u0440\u043e\u043a\u0443 \u0442\u0430\u0431\u043b\u0438\u0446\u044b 2. \u0421\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0435 JSON \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u043c \u043e\u043a\u043d\u0435 \u0434\u0430\u043d\u043d\u044b\u043c \u0438\u0437 API 3. \u0417\u0430\u043a\u0440\u044b\u0442\u0438\u0435 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430

    Source code in tests\\e2e\\test_templates_tab.py
    def test_templates_modal_window_api_data_consistency(self, browser: Page) -> None:\n    \"\"\"\u0422\u0435\u0441\u0442 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430 \u0434\u0430\u043d\u043d\u044b\u043c \u0438\u0437 API.\n\n    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442:\n    1. \u041e\u0442\u043a\u0440\u044b\u0442\u0438\u0435 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430 \u043f\u0440\u0438 \u043a\u043b\u0438\u043a\u0435 \u043d\u0430 \u0441\u0442\u0440\u043e\u043a\u0443 \u0442\u0430\u0431\u043b\u0438\u0446\u044b\n    2. \u0421\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0435 JSON \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u043c \u043e\u043a\u043d\u0435 \u0434\u0430\u043d\u043d\u044b\u043c \u0438\u0437 API\n    3. \u0417\u0430\u043a\u0440\u044b\u0442\u0438\u0435 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430\n    \"\"\"\n    # \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u0448\u0430\u0431\u043b\u043e\u043d\u043e\u0432\n    templates_tab = TemplatesTab(browser)\n\n    # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043d\u0430\u043b\u0438\u0447\u0438\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0448\u0430\u0431\u043b\u043e\u043d\u043e\u0432\n    templates_tab.should_be_templates_table()\n\n    # \u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0437\u0430\u0434\u0435\u0440\u0436\u043a\u0443 \u0434\u043b\u044f \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u0434\u0430\u043d\u043d\u044b\u0445\n    browser.wait_for_timeout(5000)\n\n    # \u041e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u043c \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043a\u043d\u043e, \u043a\u043b\u0438\u043a\u0430\u044f \u043d\u0430 \u043f\u0435\u0440\u0432\u0443\u044e \u0441\u0442\u0440\u043e\u043a\u0443 \u0442\u0430\u0431\u043b\u0438\u0446\u044b\n    template_name = templates_tab.open_template_modal(0)\n\n    # \u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0437\u0430\u0434\u0435\u0440\u0436\u043a\u0443 \u0434\u043b\u044f \u043e\u0442\u043a\u0440\u044b\u0442\u0438\u044f \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430\n    browser.wait_for_timeout(2000)\n\n    # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043e\u0442\u043a\u0440\u044b\u0442\u0438\u044f \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430\n    templates_tab.should_be_modal_window()\n\n    # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430 \u0434\u0430\u043d\u043d\u044b\u043c \u0438\u0437 API\n    templates_tab.verify_json_container_content(\n        template_name,\n        save_to_file=False\n    )\n\n    # \u0417\u0430\u043a\u0440\u044b\u0442\u0438\u0435 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430 \u0447\u0435\u0440\u0435\u0437 \u043a\u043d\u043e\u043f\u043a\u0443 \u0437\u0430\u043a\u0440\u044b\u0442\u0438\u044f\n    templates_tab.close_modal_window_by_toolbar_button(template_name)\n\n    # \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c, \u0447\u0442\u043e \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043a\u043d\u043e \u0437\u0430\u043a\u0440\u044b\u043b\u043e\u0441\u044c\n    templates_tab.should_not_be_modal_window()\n
    "},{"location":"tests/e2e/test_templates_tab/#tests.e2e.test_templates_tab.TestTemplatesTab.test_templates_modal_window_content","title":"test_templates_modal_window_content(browser)","text":"

    \u0422\u0435\u0441\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0433\u043e \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430 \u0448\u0430\u0431\u043b\u043e\u043d\u0430.

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442: 1. \u041e\u0442\u043a\u0440\u044b\u0442\u0438\u0435 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430 \u043f\u0440\u0438 \u043a\u043b\u0438\u043a\u0435 \u043d\u0430 \u0441\u0442\u0440\u043e\u043a\u0443 \u0442\u0430\u0431\u043b\u0438\u0446\u044b 2. \u041d\u0430\u043b\u0438\u0447\u0438\u0435 \u0438 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430 3. \u041d\u0430\u043b\u0438\u0447\u0438\u0435 \u0442\u0443\u043b\u0431\u0430\u0440\u0430 \u0432 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u043c \u043e\u043a\u043d\u0435 4. \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043a\u043d\u043e\u043f\u043a\u0438 \u0437\u0430\u043a\u0440\u044b\u0442\u0438\u044f \u0438 \u0435\u0451 \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0438 5. \u0417\u0430\u043a\u0440\u044b\u0442\u0438\u0435 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430

    Source code in tests\\e2e\\test_templates_tab.py
    def test_templates_modal_window_content(self, browser: Page) -> None:\n    \"\"\"\u0422\u0435\u0441\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0433\u043e \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430 \u0448\u0430\u0431\u043b\u043e\u043d\u0430.\n\n    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442:\n    1. \u041e\u0442\u043a\u0440\u044b\u0442\u0438\u0435 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430 \u043f\u0440\u0438 \u043a\u043b\u0438\u043a\u0435 \u043d\u0430 \u0441\u0442\u0440\u043e\u043a\u0443 \u0442\u0430\u0431\u043b\u0438\u0446\u044b\n    2. \u041d\u0430\u043b\u0438\u0447\u0438\u0435 \u0438 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430\n    3. \u041d\u0430\u043b\u0438\u0447\u0438\u0435 \u0442\u0443\u043b\u0431\u0430\u0440\u0430 \u0432 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u043c \u043e\u043a\u043d\u0435\n    4. \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043a\u043d\u043e\u043f\u043a\u0438 \u0437\u0430\u043a\u0440\u044b\u0442\u0438\u044f \u0438 \u0435\u0451 \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0438\n    5. \u0417\u0430\u043a\u0440\u044b\u0442\u0438\u0435 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430\n    \"\"\"\n    # \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u0448\u0430\u0431\u043b\u043e\u043d\u043e\u0432\n    templates_tab = TemplatesTab(browser)\n\n    # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043d\u0430\u043b\u0438\u0447\u0438\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0448\u0430\u0431\u043b\u043e\u043d\u043e\u0432\n    templates_tab.should_be_templates_table()\n\n    # \u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0437\u0430\u0434\u0435\u0440\u0436\u043a\u0443 \u0434\u043b\u044f \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u0434\u0430\u043d\u043d\u044b\u0445\n    browser.wait_for_timeout(2000)\n\n    # \u041e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u043c \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043a\u043d\u043e, \u043a\u043b\u0438\u043a\u0430\u044f \u043d\u0430 \u043f\u0435\u0440\u0432\u0443\u044e \u0441\u0442\u0440\u043e\u043a\u0443 \u0442\u0430\u0431\u043b\u0438\u0446\u044b\n    template_name = templates_tab.open_template_modal(0)\n\n    # \u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0437\u0430\u0434\u0435\u0440\u0436\u043a\u0443 \u0434\u043b\u044f \u043e\u0442\u043a\u0440\u044b\u0442\u0438\u044f \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430\n    browser.wait_for_timeout(1000)\n\n    # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043e\u0442\u043a\u0440\u044b\u0442\u0438\u044f \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430\n    templates_tab.should_be_modal_window()\n\n    # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0433\u043e \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430\n    templates_tab.check_templates_modal_content(template_name)\n\n    # \u0417\u0430\u043a\u0440\u044b\u0442\u0438\u0435 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430 \u0447\u0435\u0440\u0435\u0437 \u043a\u043d\u043e\u043f\u043a\u0443 \u0437\u0430\u043a\u0440\u044b\u0442\u0438\u044f\n    templates_tab.close_modal_window_by_toolbar_button(template_name)\n\n    # \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c, \u0447\u0442\u043e \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043a\u043d\u043e \u0437\u0430\u043a\u0440\u044b\u043b\u043e\u0441\u044c\n    templates_tab.should_not_be_modal_window()\n
    "},{"location":"tests/e2e/test_templates_tab/#tests.e2e.test_templates_tab.TestTemplatesTab.test_templates_modal_window_scrolling","title":"test_templates_modal_window_scrolling(browser)","text":"

    \u0422\u0435\u0441\u0442 \u0441\u043a\u0440\u043e\u043b\u043b\u0438\u043d\u0433\u0430 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430 \u0448\u0430\u0431\u043b\u043e\u043d\u0430.

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442: 1. \u041e\u0442\u043a\u0440\u044b\u0442\u0438\u0435 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430 \u043f\u0440\u0438 \u043a\u043b\u0438\u043a\u0435 \u043d\u0430 \u0441\u0442\u0440\u043e\u043a\u0443 \u0442\u0430\u0431\u043b\u0438\u0446\u044b 2. \u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0441\u043a\u0440\u043e\u043b\u043b\u0438\u043d\u0433\u0430 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0433\u043e \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430 3. \u0417\u0430\u043a\u0440\u044b\u0442\u0438\u0435 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430

    Source code in tests\\e2e\\test_templates_tab.py
    def test_templates_modal_window_scrolling(self, browser: Page) -> None:\n    \"\"\"\u0422\u0435\u0441\u0442 \u0441\u043a\u0440\u043e\u043b\u043b\u0438\u043d\u0433\u0430 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430 \u0448\u0430\u0431\u043b\u043e\u043d\u0430.\n\n    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442:\n    1. \u041e\u0442\u043a\u0440\u044b\u0442\u0438\u0435 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430 \u043f\u0440\u0438 \u043a\u043b\u0438\u043a\u0435 \u043d\u0430 \u0441\u0442\u0440\u043e\u043a\u0443 \u0442\u0430\u0431\u043b\u0438\u0446\u044b\n    2. \u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0441\u043a\u0440\u043e\u043b\u043b\u0438\u043d\u0433\u0430 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0433\u043e \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430\n    3. \u0417\u0430\u043a\u0440\u044b\u0442\u0438\u0435 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430\n    \"\"\"\n\n    # \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u0448\u0430\u0431\u043b\u043e\u043d\u043e\u0432\n    templates_tab = TemplatesTab(browser)\n\n    # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043d\u0430\u043b\u0438\u0447\u0438\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0448\u0430\u0431\u043b\u043e\u043d\u043e\u0432\n    templates_tab.should_be_templates_table()\n\n    # \u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0437\u0430\u0434\u0435\u0440\u0436\u043a\u0443 \u0434\u043b\u044f \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u0434\u0430\u043d\u043d\u044b\u0445\n    browser.wait_for_timeout(2000)\n\n    # \u041e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u043c \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043a\u043d\u043e, \u043a\u043b\u0438\u043a\u0430\u044f \u043d\u0430 \u043f\u0435\u0440\u0432\u0443\u044e \u0441\u0442\u0440\u043e\u043a\u0443 \u0442\u0430\u0431\u043b\u0438\u0446\u044b\n    template_name = templates_tab.open_template_modal(0)\n\n    # \u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0437\u0430\u0434\u0435\u0440\u0436\u043a\u0443 \u0434\u043b\u044f \u043e\u0442\u043a\u0440\u044b\u0442\u0438\u044f \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430\n    browser.wait_for_timeout(1000)\n\n    # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043e\u0442\u043a\u0440\u044b\u0442\u0438\u044f \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430\n    templates_tab.should_be_modal_window()\n\n    # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0441\u043a\u0440\u043e\u043b\u043b\u0438\u043d\u0433\u0430 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430\n    is_scrollable = templates_tab.check_modal_vertical_scrolling()\n\n    if is_scrollable:\n        print(\"\u041c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043a\u043d\u043e \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u0439 \u0441\u043a\u0440\u043e\u043b\u043b\u0438\u043d\u0433\")\n\n        # \u041f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0430 \u0432\u043d\u0438\u0437\n        templates_tab.scroll_modal_down()\n        browser.wait_for_timeout(1000)\n\n        # \u041f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0430 \u0432\u0432\u0435\u0440\u0445\n        templates_tab.scroll_modal_up()\n        browser.wait_for_timeout(1000)\n    else:\n        print(\"\u041c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043a\u043d\u043e \u043d\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u0439 \u0441\u043a\u0440\u043e\u043b\u043b\u0438\u043d\u0433\")\n\n    # \u0417\u0430\u043a\u0440\u044b\u0442\u0438\u0435 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430 \u0447\u0435\u0440\u0435\u0437 \u043a\u043d\u043e\u043f\u043a\u0443 \u0437\u0430\u043a\u0440\u044b\u0442\u0438\u044f\n    templates_tab.close_modal_window_by_toolbar_button(template_name)\n\n    # \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c, \u0447\u0442\u043e \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043a\u043d\u043e \u0437\u0430\u043a\u0440\u044b\u043b\u043e\u0441\u044c\n    templates_tab.should_not_be_modal_window()\n
    "},{"location":"tests/e2e/test_templates_tab/#tests.e2e.test_templates_tab.TestTemplatesTab.test_templates_tab_content","title":"test_templates_tab_content(browser)","text":"

    \u0422\u0435\u0441\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0433\u043e \u0432\u043a\u043b\u0430\u0434\u043a\u0438 '\u0428\u0430\u0431\u043b\u043e\u043d\u044b'.

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442: 1. \u041d\u0430\u043b\u0438\u0447\u0438\u0435 \u0438 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0441\u0442\u044c \u0442\u0443\u043b\u0431\u0430\u0440\u0430 2. \u041d\u0430\u043b\u0438\u0447\u0438\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0448\u0430\u0431\u043b\u043e\u043d\u043e\u0432 3. \u0421\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0433\u043e \u0442\u0430\u0431\u043b\u0438\u0446\u044b

    Source code in tests\\e2e\\test_templates_tab.py
    def test_templates_tab_content(self, browser: Page) -> None:\n    \"\"\"\u0422\u0435\u0441\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0433\u043e \u0432\u043a\u043b\u0430\u0434\u043a\u0438 '\u0428\u0430\u0431\u043b\u043e\u043d\u044b'.\n\n    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442:\n    1. \u041d\u0430\u043b\u0438\u0447\u0438\u0435 \u0438 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0441\u0442\u044c \u0442\u0443\u043b\u0431\u0430\u0440\u0430\n    2. \u041d\u0430\u043b\u0438\u0447\u0438\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0448\u0430\u0431\u043b\u043e\u043d\u043e\u0432\n    3. \u0421\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0433\u043e \u0442\u0430\u0431\u043b\u0438\u0446\u044b\n    \"\"\"\n    # \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u0441\u0435\u0430\u043d\u0441\u043e\u0432\n    templates_tab = TemplatesTab(browser)\n\n    # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0442\u0443\u043b\u0431\u0430\u0440\u0430 \u0432\u043a\u043b\u0430\u0434\u043a\u0438\n    templates_tab.should_be_toolbar()\n\n    # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043d\u0430\u043b\u0438\u0447\u0438\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0448\u0430\u0431\u043b\u043e\u043d\u043e\u0432\n    templates_tab.should_be_templates_table()\n\n    browser.wait_for_timeout(5000)\n\n    # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0433\u043e \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0448\u0430\u0431\u043b\u043e\u043d\u043e\u0432\n    templates_tab.check_templates_table_content()\n
    "},{"location":"tests/e2e/test_templates_tab/#tests.e2e.test_templates_tab.TestTemplatesTab.test_templates_table_row_highlighting","title":"test_templates_table_row_highlighting(browser)","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0441\u0442\u0440\u043e\u043a \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435 \u0448\u0430\u0431\u043b\u043e\u043d\u043e\u0432.

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0441\u0442\u044c \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0441\u0442\u0440\u043e\u043a \u043f\u0440\u0438 \u043a\u043b\u0438\u043a\u0435 \u043d\u0430 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0435 \u043f\u043e\u0437\u0438\u0446\u0438\u0438: 1. \u041f\u0435\u0440\u0432\u0430\u044f \u0441\u0442\u0440\u043e\u043a\u0430 2. \u041f\u043e\u0441\u043b\u0435\u0434\u043d\u044f\u044f \u0441\u0442\u0440\u043e\u043a\u0430 3. \u0421\u0442\u0440\u043e\u043a\u0430 \u0432 \u0441\u0435\u0440\u0435\u0434\u0438\u043d\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u044b

    Source code in tests\\e2e\\test_templates_tab.py
    def test_templates_table_row_highlighting(self, browser: Page) -> None:\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0441\u0442\u0440\u043e\u043a \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435 \u0448\u0430\u0431\u043b\u043e\u043d\u043e\u0432.\n\n    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0441\u0442\u044c \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0441\u0442\u0440\u043e\u043a \u043f\u0440\u0438 \u043a\u043b\u0438\u043a\u0435 \u043d\u0430 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0435 \u043f\u043e\u0437\u0438\u0446\u0438\u0438:\n    1. \u041f\u0435\u0440\u0432\u0430\u044f \u0441\u0442\u0440\u043e\u043a\u0430\n    2. \u041f\u043e\u0441\u043b\u0435\u0434\u043d\u044f\u044f \u0441\u0442\u0440\u043e\u043a\u0430\n    3. \u0421\u0442\u0440\u043e\u043a\u0430 \u0432 \u0441\u0435\u0440\u0435\u0434\u0438\u043d\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u044b\n    \"\"\"\n\n    templates_tab = TemplatesTab(browser)\n\n    # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0442\u0443\u043b\u0431\u0430\u0440\u0430 \u0432\u043a\u043b\u0430\u0434\u043a\u0438\n    templates_tab.should_be_toolbar()\n\n    # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043d\u0430\u043b\u0438\u0447\u0438\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0448\u0430\u0431\u043b\u043e\u043d\u043e\u0432\n    templates_tab.should_be_templates_table()\n\n    # \u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0430 \u0441\u0442\u0440\u043e\u043a \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435\n    rows_count = templates_tab.get_rows_count()\n\n    # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0441\u0442\u0440\u043e\u043a\n    templates_tab.check_templates_table_row_highlighting(0)\n    templates_tab.check_templates_table_row_highlighting(rows_count - 1)\n    templates_tab.check_templates_table_row_highlighting(int(rows_count / 2))\n
    "},{"location":"tests/e2e/test_templates_tab/#tests.e2e.test_templates_tab.TestTemplatesTab.test_templates_table_scrolling","title":"test_templates_table_scrolling(browser)","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0441\u043a\u0440\u043e\u043b\u043b\u0438\u043d\u0433\u0430 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0448\u0430\u0431\u043b\u043e\u043d\u043e\u0432.

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442: 1. \u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u0439 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u044b 2. \u0412\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u0441\u0442\u0440\u043e\u043a \u043f\u043e\u0441\u043b\u0435 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0438 \u0432\u043d\u0438\u0437 \u0438 \u0432\u0432\u0435\u0440\u0445 3. \u041a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0441\u0442\u044c \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445 \u043f\u043e\u0441\u043b\u0435 \u0441\u043a\u0440\u043e\u043b\u043b\u0438\u043d\u0433\u0430

    Source code in tests\\e2e\\test_templates_tab.py
    def test_templates_table_scrolling(self, browser: Page) -> None:\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0441\u043a\u0440\u043e\u043b\u043b\u0438\u043d\u0433\u0430 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0448\u0430\u0431\u043b\u043e\u043d\u043e\u0432.\n\n    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442:\n    1. \u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u0439 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u044b\n    2. \u0412\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u0441\u0442\u0440\u043e\u043a \u043f\u043e\u0441\u043b\u0435 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0438 \u0432\u043d\u0438\u0437 \u0438 \u0432\u0432\u0435\u0440\u0445\n    3. \u041a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0441\u0442\u044c \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445 \u043f\u043e\u0441\u043b\u0435 \u0441\u043a\u0440\u043e\u043b\u043b\u0438\u043d\u0433\u0430\n    \"\"\"\n\n    templates_tab = TemplatesTab(browser)\n\n    browser.wait_for_timeout(2000)\n\n    # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0441\u043a\u0440\u043e\u043b\u043b\u0438\u043d\u0433\u0430\n    is_scrollable = templates_tab.check_templates_table_verticall_scrolling()\n\n    if is_scrollable:\n        print(\"\u0422\u0430\u0431\u043b\u0438\u0446\u0430 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u0439 \u0441\u043a\u0440\u043e\u043b\u043b\u0438\u043d\u0433\")\n\n        # \u041f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0430 \u0432\u043d\u0438\u0437\n        templates_tab.scroll_templates_table_down()\n\n        browser.wait_for_timeout(1000)\n\n        # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0439 \u0441\u0442\u0440\u043e\u043a\u0438 \u043f\u043e\u0441\u043b\u0435 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0438\n        templates_tab.check_templates_table_last_row_visibility()\n\n        # \u041f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0430 \u0432\u0432\u0435\u0440\u0445\n        templates_tab.scroll_templates_table_up()\n\n        browser.wait_for_timeout(1000)\n\n        # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u043f\u0435\u0440\u0432\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438 \u043f\u043e\u0441\u043b\u0435 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0438\n        templates_tab.check_templates_table_first_row_visibility()\n    else:\n        print(\"\u0422\u0430\u0431\u043b\u0438\u0446\u0430 \u043d\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u0439 \u0441\u043a\u0440\u043e\u043b\u043b\u0438\u043d\u0433\")\n\n        # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u043f\u0435\u0440\u0432\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438\n        templates_tab.check_templates_table_first_row_visibility()\n
    "},{"location":"tests/e2e/test_user_card/","title":"TestUserCard","text":"

    \u041c\u043e\u0434\u0443\u043b\u044c \u0442\u0435\u0441\u0442\u043e\u0432 \u043a\u0430\u0440\u0442\u043e\u0447\u043a\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.

    \u0421\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0442\u0435\u0441\u0442\u044b \u0434\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u043a\u0430\u0440\u0442\u043e\u0447\u043a\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0432 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0438.

    "},{"location":"tests/e2e/test_user_card/#tests.e2e.test_user_card.TestUserCard","title":"TestUserCard","text":"

    \u041a\u043b\u0430\u0441\u0441 \u0442\u0435\u0441\u0442\u043e\u0432 \u0434\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u043a\u0430\u0440\u0442\u043e\u0447\u043a\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.

    \u0422\u0435\u0441\u0442\u044b \u043f\u043e\u043a\u0440\u044b\u0432\u0430\u044e\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0438: 1. test_user_card_content: \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u043a\u0430\u0440\u0442\u043e\u0447\u043a\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f 2. test_open_close_user_settings_window: \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043e\u0442\u043a\u0440\u044b\u0442\u0438\u044f \u0438 \u0437\u0430\u043a\u0440\u044b\u0442\u0438\u044f \u0434\u0438\u0430\u043b\u043e\u0433\u043e\u0432\u043e\u0433\u043e \u043e\u043a\u043d\u0430 \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0430 \u0441\u0435\u0441\u0441\u0438\u043e\u043d\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f 3. test_user_settings_window_content: \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0438 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0441\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0434\u0438\u0430\u043b\u043e\u0433\u043e\u0432\u043e\u0433\u043e \u043e\u043a\u043d\u0430 \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0430 \u0441\u0435\u0441\u0441\u0438\u043e\u043d\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f 4. test_change_password_window_content: \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0438 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0441\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u043e\u043a\u043d\u0430 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u043f\u0430\u0440\u043e\u043b\u044f \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f 5. test_change_password_successful: \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0443\u0441\u043f\u0435\u0448\u043d\u043e\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u043f\u0430\u0440\u043e\u043b\u044f \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f 6. test_change_password_unsuccessful: \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0435\u0443\u0441\u043f\u0435\u0448\u043d\u043e\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u043f\u0430\u0440\u043e\u043b\u044f \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f

    \u0410\u0442\u0440\u0438\u0431\u0443\u0442\u044b

    browser: \u0424\u0438\u043a\u0441\u0442\u0443\u0440\u0430 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u043e\u043c.

    Source code in tests\\e2e\\test_user_card.py
    class TestUserCard:\n    \"\"\"\u041a\u043b\u0430\u0441\u0441 \u0442\u0435\u0441\u0442\u043e\u0432 \u0434\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u043a\u0430\u0440\u0442\u043e\u0447\u043a\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\n\n    \u0422\u0435\u0441\u0442\u044b \u043f\u043e\u043a\u0440\u044b\u0432\u0430\u044e\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0438:\n    1. test_user_card_content: \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u043a\u0430\u0440\u0442\u043e\u0447\u043a\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\n    2. test_open_close_user_settings_window: \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043e\u0442\u043a\u0440\u044b\u0442\u0438\u044f \u0438 \u0437\u0430\u043a\u0440\u044b\u0442\u0438\u044f \u0434\u0438\u0430\u043b\u043e\u0433\u043e\u0432\u043e\u0433\u043e \u043e\u043a\u043d\u0430 \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0430 \u0441\u0435\u0441\u0441\u0438\u043e\u043d\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\n    3. test_user_settings_window_content: \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0438 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0441\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0434\u0438\u0430\u043b\u043e\u0433\u043e\u0432\u043e\u0433\u043e \u043e\u043a\u043d\u0430 \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0430 \u0441\u0435\u0441\u0441\u0438\u043e\u043d\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\n    4. test_change_password_window_content: \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0438 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0441\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u043e\u043a\u043d\u0430 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u043f\u0430\u0440\u043e\u043b\u044f \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\n    5. test_change_password_successful: \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0443\u0441\u043f\u0435\u0448\u043d\u043e\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u043f\u0430\u0440\u043e\u043b\u044f \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\n    6. test_change_password_unsuccessful: \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0435\u0443\u0441\u043f\u0435\u0448\u043d\u043e\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u043f\u0430\u0440\u043e\u043b\u044f \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\n\n    \u0410\u0442\u0440\u0438\u0431\u0443\u0442\u044b:\n        browser: \u0424\u0438\u043a\u0441\u0442\u0443\u0440\u0430 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u043e\u043c.\n    \"\"\"\n\n    @pytest.fixture(scope=\"function\")\n    def create_user(self, browser: Page) -> None:\n        \"\"\"\u0424\u0438\u043a\u0441\u0442\u0443\u0440\u0430 \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0442\u0435\u0441\u0442\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\"\"\"\n\n        lp = LoginPage(browser)\n        lp.do_login()\n\n        mp = MainPage(browser)\n        ut = UsersTab(browser)\n\n        # \u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043d\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\n        mp.click_main_navigation_panel_item(\"\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438\")\n        mp.click_subpanel_item(\"\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438\")\n        ut.open_add_user_window()\n        ut.add_new_user(user_data)\n\n        # \u041e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u0441\u043f\u0438\u0441\u043a\u0430 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 (\u0434\u0432\u043e\u0439\u043d\u043e\u0439 \u043a\u043b\u0438\u043a - \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u0431\u0430\u0433?)\n        mp.click_subpanel_item(\"\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438\")\n        mp.click_subpanel_item(\"\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438\")\n\n        # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043d\u0430\u043b\u0438\u0447\u0438\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435\n        ut.should_be_user_in_table(user_data[\"name\"], user_data[\"role\"])\n\n        # \u0412\u044b\u0445\u043e\u0434 \u0438\u0437 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\n        mp.do_logout()\n\n        yield\n\n    @pytest.fixture(scope=\"function\")\n    def cleanup_user(self, browser: Page) -> None:\n        \"\"\"\u0424\u0438\u043a\u0441\u0442\u0443\u0440\u0430 \u0434\u043b\u044f \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u0442\u0435\u0441\u0442\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u043f\u043e\u0441\u043b\u0435 \u0442\u0435\u0441\u0442\u0430.\"\"\"\n        yield\n\n        # \u0412\u044b\u0445\u043e\u0434 \u0438\u0437 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\n        mp = MainPage(browser)\n        mp.do_logout()\n\n        # \u0410\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u044f \u0430\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440\u043e\u043c \u0434\u043b\u044f \u043e\u0447\u0438\u0441\u0442\u043a\u0438\n        login_page = LoginPage(browser)\n        login_page.do_login()\n\n        # \u0423\u0434\u0430\u043b\u044f\u0435\u043c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\n        mp_admin = MainPage(browser)\n        mp_admin.click_main_navigation_panel_item(\"\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438\")\n        mp_admin.click_subpanel_item(\"\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438\")\n\n        ut = UsersTab(browser)\n        ut.open_edit_user_page_by_user(user_data[\"name\"], user_data[\"role\"])\n        ut.delete_user(user_data[\"name\"])\n\n    # @pytest.mark.develop\n    def test_user_card_content(self, browser: Page) -> None:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0438 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0441\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u043a\u0430\u0440\u0442\u043e\u0447\u043a\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\n\n        Args:\n            browser: \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.\n        \"\"\"\n\n        lp = LoginPage(browser)\n        lp.do_login()\n\n        mp = MainPage(browser)\n\n        user_card = mp.click_user_button()\n        user_card.check_content()\n\n    # @pytest.mark.develop\n    def test_open_close_user_settings_window(self, browser: Page) -> None:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043e\u0442\u043a\u0440\u044b\u0442\u0438\u044f \u0438 \u0437\u0430\u043a\u0440\u044b\u0442\u0438\u044f \u0434\u0438\u0430\u043b\u043e\u0433\u043e\u0432\u043e\u0433\u043e \u043e\u043a\u043d\u0430 \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0430 \u0441\u0435\u0441\u0441\u0438\u043e\u043d\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\n\n        Args:\n            browser: \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.\n        \"\"\"\n\n        lp = LoginPage(browser)\n        lp.do_login()\n\n        mp = MainPage(browser)\n\n        user_card = mp.click_user_button()\n        user_settings_window = user_card.click_settings_button()\n\n        user_settings_window.check_window_visibility()\n        user_settings_window.click_close_button()\n        user_settings_window.check_window_absence()\n\n    # @pytest.mark.develop\n    def test_user_settings_window_content(self, browser: Page) -> None:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0438 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0441\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0434\u0438\u0430\u043b\u043e\u0433\u043e\u0432\u043e\u0433\u043e \u043e\u043a\u043d\u0430 \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0430 \u0441\u0435\u0441\u0441\u0438\u043e\u043d\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\n\n        Args:\n            browser: \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.\n        \"\"\"\n\n        lp = LoginPage(browser)\n        lp.do_login()\n\n        mp = MainPage(browser)\n\n        user_card = mp.click_user_button()\n        user_settings_window = user_card.click_settings_button()\n\n        user_settings_window.check_window_visibility()\n        user_settings_window.check_content()\n\n    # @pytest.mark.develop\n    def test_change_password_window_content(self, browser: Page) -> None:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0438 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0441\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u043e\u043a\u043d\u0430 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u043f\u0430\u0440\u043e\u043b\u044f \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\n\n        Args:\n            browser: \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.\n        \"\"\"\n\n        lp = LoginPage(browser)\n        lp.do_login()\n\n        mp = MainPage(browser)\n\n        user_card = mp.click_user_button()\n        change_password_window = user_card.click_change_password_button()\n        change_password_window.check_content()\n\n    # @pytest.mark.develop\n    def test_change_password_successful(self, browser: Page,\n                                           create_user: None,\n                                           cleanup_user: None) -> None:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0443\u0441\u043f\u0435\u0448\u043d\u043e\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u043f\u0430\u0440\u043e\u043b\u044f \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\n\n        Args:\n            browser: \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.\n        \"\"\"\n\n        # \u0412\u0445\u043e\u0434 \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0443 \u0434\u043b\u044f \u0442\u0435\u0441\u0442\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\n        lp = LoginPage(browser)\n        lp.do_login(username=user_data[\"name\"], password=user_data[\"password\"])\n\n        # \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0433\u043b\u0430\u0432\u043d\u043e\u0439 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b\n        mp = MainPage(browser)\n\n        user_card = mp.click_user_button()\n        change_password_window = user_card.click_change_password_button()\n        is_changed, error = change_password_window.change_password(user_data[\"password\"], user_data[\"new_password\"])\n        assert is_changed, f\"Unsucessful attempt to change password: {error}\"\n\n    # @pytest.mark.develop\n    def test_change_password_unsuccessful(self, browser: Page,\n                                           create_user: None,\n                                           cleanup_user: None) -> None:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0435\u0443\u0441\u043f\u0435\u0448\u043d\u043e\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u043f\u0430\u0440\u043e\u043b\u044f \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\n\n        Args:\n            browser: \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.\n        \"\"\"\n\n        # \u0412\u0445\u043e\u0434 \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0443 \u0434\u043b\u044f \u0442\u0435\u0441\u0442\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\n        lp = LoginPage(browser)\n        lp.do_login(username=user_data[\"name\"], password=user_data[\"password\"])\n\n        # \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0433\u043b\u0430\u0432\u043d\u043e\u0439 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b\n        mp = MainPage(browser)\n\n        # \u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043f\u043e\u043b\u0435\u0439 \u043d\u043e\u0432\u043e\u0433\u043e \u043f\u0430\u0440\u043e\u043b\u044f \u0438 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u044f \u043d\u043e\u0432\u043e\u0433\u043e \u043f\u0430\u0440\u043e\u043b\u044f \u043d\u0435 \u0441\u043e\u0432\u043f\u0430\u0434\u0430\u044e\u0442\n        user_card = mp.click_user_button()\n        change_password_window = user_card.click_change_password_button()\n        password_inputs = change_password_window.get_password_inputs()\n\n        password_inputs[0].input_value(user_data[\"password\"])\n        password_inputs[1].input_value(user_data[\"new_password\"])\n        password_inputs[2].input_value(\"12345\")\n\n        change_password_window.check_error_message(\"\u041f\u0430\u0440\u043e\u043b\u0438 \u043d\u0435 \u0441\u043e\u0432\u043f\u0430\u0434\u0430\u044e\u0442\")\n        change_password_window.click_cancel_button()\n\n        # \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u043d\u0435\u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u044b\u0439 \u0441\u0442\u0430\u0440\u044b\u0439 \u043f\u0430\u0440\u043e\u043b\u044c\n        user_card = mp.click_user_button()\n        change_password_window = user_card.click_change_password_button()\n        is_changed, _ = change_password_window.change_password(\"123456789\", user_data[\"new_password\"])\n        assert not is_changed, \"Sucessful attempt to change password for incorrect old password\"\n        change_password_window.click_cancel_button()\n\n        # \u041f\u0443\u0441\u0442\u043e\u0435 \u043f\u043e\u043b\u0435 \u0432\u0432\u043e\u0434\u0430 \u043f\u0430\u0440\u043e\u043b\u044f \u043d\u0430 \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u043f\u043e\u043b\u044f \u0432\u0432\u043e\u0434\u0430 \u0441\u0442\u0430\u0440\u043e\u0433\u043e \u043f\u0430\u0440\u043e\u043b\u044f\n        user_card = mp.click_user_button()\n        change_password_window = user_card.click_change_password_button()\n        is_changed, error = change_password_window.change_password(\"\", user_data[\"new_password\"])\n        assert not is_changed, \"Sucessful attempt to change password for empty old password input\"\n        err_message = \"\u042d\u0442\u043e \u043f\u043e\u043b\u0435 \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u0434\u043b\u044f \u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f\"\n        assert error != err_message, f\"Expected error message '{err_message}' is not equal '{error}'\"\n        change_password_window.click_cancel_button()\n
    "},{"location":"tests/e2e/test_user_card/#tests.e2e.test_user_card.TestUserCard.cleanup_user","title":"cleanup_user(browser)","text":"

    \u0424\u0438\u043a\u0441\u0442\u0443\u0440\u0430 \u0434\u043b\u044f \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u0442\u0435\u0441\u0442\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u043f\u043e\u0441\u043b\u0435 \u0442\u0435\u0441\u0442\u0430.

    Source code in tests\\e2e\\test_user_card.py
    @pytest.fixture(scope=\"function\")\ndef cleanup_user(self, browser: Page) -> None:\n    \"\"\"\u0424\u0438\u043a\u0441\u0442\u0443\u0440\u0430 \u0434\u043b\u044f \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u0442\u0435\u0441\u0442\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u043f\u043e\u0441\u043b\u0435 \u0442\u0435\u0441\u0442\u0430.\"\"\"\n    yield\n\n    # \u0412\u044b\u0445\u043e\u0434 \u0438\u0437 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\n    mp = MainPage(browser)\n    mp.do_logout()\n\n    # \u0410\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u044f \u0430\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440\u043e\u043c \u0434\u043b\u044f \u043e\u0447\u0438\u0441\u0442\u043a\u0438\n    login_page = LoginPage(browser)\n    login_page.do_login()\n\n    # \u0423\u0434\u0430\u043b\u044f\u0435\u043c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\n    mp_admin = MainPage(browser)\n    mp_admin.click_main_navigation_panel_item(\"\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438\")\n    mp_admin.click_subpanel_item(\"\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438\")\n\n    ut = UsersTab(browser)\n    ut.open_edit_user_page_by_user(user_data[\"name\"], user_data[\"role\"])\n    ut.delete_user(user_data[\"name\"])\n
    "},{"location":"tests/e2e/test_user_card/#tests.e2e.test_user_card.TestUserCard.create_user","title":"create_user(browser)","text":"

    \u0424\u0438\u043a\u0441\u0442\u0443\u0440\u0430 \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0442\u0435\u0441\u0442\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.

    Source code in tests\\e2e\\test_user_card.py
    @pytest.fixture(scope=\"function\")\ndef create_user(self, browser: Page) -> None:\n    \"\"\"\u0424\u0438\u043a\u0441\u0442\u0443\u0440\u0430 \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0442\u0435\u0441\u0442\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\"\"\"\n\n    lp = LoginPage(browser)\n    lp.do_login()\n\n    mp = MainPage(browser)\n    ut = UsersTab(browser)\n\n    # \u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043d\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\n    mp.click_main_navigation_panel_item(\"\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438\")\n    mp.click_subpanel_item(\"\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438\")\n    ut.open_add_user_window()\n    ut.add_new_user(user_data)\n\n    # \u041e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u0441\u043f\u0438\u0441\u043a\u0430 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 (\u0434\u0432\u043e\u0439\u043d\u043e\u0439 \u043a\u043b\u0438\u043a - \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u0431\u0430\u0433?)\n    mp.click_subpanel_item(\"\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438\")\n    mp.click_subpanel_item(\"\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438\")\n\n    # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043d\u0430\u043b\u0438\u0447\u0438\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435\n    ut.should_be_user_in_table(user_data[\"name\"], user_data[\"role\"])\n\n    # \u0412\u044b\u0445\u043e\u0434 \u0438\u0437 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\n    mp.do_logout()\n\n    yield\n
    "},{"location":"tests/e2e/test_user_card/#tests.e2e.test_user_card.TestUserCard.test_change_password_successful","title":"test_change_password_successful(browser, create_user, cleanup_user)","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0443\u0441\u043f\u0435\u0448\u043d\u043e\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u043f\u0430\u0440\u043e\u043b\u044f \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.

    Parameters:

    Name Type Description Default browser Page

    \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.

    required Source code in tests\\e2e\\test_user_card.py
    def test_change_password_successful(self, browser: Page,\n                                       create_user: None,\n                                       cleanup_user: None) -> None:\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0443\u0441\u043f\u0435\u0448\u043d\u043e\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u043f\u0430\u0440\u043e\u043b\u044f \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\n\n    Args:\n        browser: \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.\n    \"\"\"\n\n    # \u0412\u0445\u043e\u0434 \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0443 \u0434\u043b\u044f \u0442\u0435\u0441\u0442\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\n    lp = LoginPage(browser)\n    lp.do_login(username=user_data[\"name\"], password=user_data[\"password\"])\n\n    # \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0433\u043b\u0430\u0432\u043d\u043e\u0439 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b\n    mp = MainPage(browser)\n\n    user_card = mp.click_user_button()\n    change_password_window = user_card.click_change_password_button()\n    is_changed, error = change_password_window.change_password(user_data[\"password\"], user_data[\"new_password\"])\n    assert is_changed, f\"Unsucessful attempt to change password: {error}\"\n
    "},{"location":"tests/e2e/test_user_card/#tests.e2e.test_user_card.TestUserCard.test_change_password_unsuccessful","title":"test_change_password_unsuccessful(browser, create_user, cleanup_user)","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0435\u0443\u0441\u043f\u0435\u0448\u043d\u043e\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u043f\u0430\u0440\u043e\u043b\u044f \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.

    Parameters:

    Name Type Description Default browser Page

    \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.

    required Source code in tests\\e2e\\test_user_card.py
    def test_change_password_unsuccessful(self, browser: Page,\n                                       create_user: None,\n                                       cleanup_user: None) -> None:\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0435\u0443\u0441\u043f\u0435\u0448\u043d\u043e\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u043f\u0430\u0440\u043e\u043b\u044f \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\n\n    Args:\n        browser: \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.\n    \"\"\"\n\n    # \u0412\u0445\u043e\u0434 \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0443 \u0434\u043b\u044f \u0442\u0435\u0441\u0442\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\n    lp = LoginPage(browser)\n    lp.do_login(username=user_data[\"name\"], password=user_data[\"password\"])\n\n    # \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0433\u043b\u0430\u0432\u043d\u043e\u0439 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b\n    mp = MainPage(browser)\n\n    # \u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043f\u043e\u043b\u0435\u0439 \u043d\u043e\u0432\u043e\u0433\u043e \u043f\u0430\u0440\u043e\u043b\u044f \u0438 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u044f \u043d\u043e\u0432\u043e\u0433\u043e \u043f\u0430\u0440\u043e\u043b\u044f \u043d\u0435 \u0441\u043e\u0432\u043f\u0430\u0434\u0430\u044e\u0442\n    user_card = mp.click_user_button()\n    change_password_window = user_card.click_change_password_button()\n    password_inputs = change_password_window.get_password_inputs()\n\n    password_inputs[0].input_value(user_data[\"password\"])\n    password_inputs[1].input_value(user_data[\"new_password\"])\n    password_inputs[2].input_value(\"12345\")\n\n    change_password_window.check_error_message(\"\u041f\u0430\u0440\u043e\u043b\u0438 \u043d\u0435 \u0441\u043e\u0432\u043f\u0430\u0434\u0430\u044e\u0442\")\n    change_password_window.click_cancel_button()\n\n    # \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u043d\u0435\u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u044b\u0439 \u0441\u0442\u0430\u0440\u044b\u0439 \u043f\u0430\u0440\u043e\u043b\u044c\n    user_card = mp.click_user_button()\n    change_password_window = user_card.click_change_password_button()\n    is_changed, _ = change_password_window.change_password(\"123456789\", user_data[\"new_password\"])\n    assert not is_changed, \"Sucessful attempt to change password for incorrect old password\"\n    change_password_window.click_cancel_button()\n\n    # \u041f\u0443\u0441\u0442\u043e\u0435 \u043f\u043e\u043b\u0435 \u0432\u0432\u043e\u0434\u0430 \u043f\u0430\u0440\u043e\u043b\u044f \u043d\u0430 \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u043f\u043e\u043b\u044f \u0432\u0432\u043e\u0434\u0430 \u0441\u0442\u0430\u0440\u043e\u0433\u043e \u043f\u0430\u0440\u043e\u043b\u044f\n    user_card = mp.click_user_button()\n    change_password_window = user_card.click_change_password_button()\n    is_changed, error = change_password_window.change_password(\"\", user_data[\"new_password\"])\n    assert not is_changed, \"Sucessful attempt to change password for empty old password input\"\n    err_message = \"\u042d\u0442\u043e \u043f\u043e\u043b\u0435 \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u0434\u043b\u044f \u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f\"\n    assert error != err_message, f\"Expected error message '{err_message}' is not equal '{error}'\"\n    change_password_window.click_cancel_button()\n
    "},{"location":"tests/e2e/test_user_card/#tests.e2e.test_user_card.TestUserCard.test_change_password_window_content","title":"test_change_password_window_content(browser)","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0438 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0441\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u043e\u043a\u043d\u0430 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u043f\u0430\u0440\u043e\u043b\u044f \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.

    Parameters:

    Name Type Description Default browser Page

    \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.

    required Source code in tests\\e2e\\test_user_card.py
    def test_change_password_window_content(self, browser: Page) -> None:\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0438 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0441\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u043e\u043a\u043d\u0430 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u043f\u0430\u0440\u043e\u043b\u044f \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\n\n    Args:\n        browser: \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.\n    \"\"\"\n\n    lp = LoginPage(browser)\n    lp.do_login()\n\n    mp = MainPage(browser)\n\n    user_card = mp.click_user_button()\n    change_password_window = user_card.click_change_password_button()\n    change_password_window.check_content()\n
    "},{"location":"tests/e2e/test_user_card/#tests.e2e.test_user_card.TestUserCard.test_open_close_user_settings_window","title":"test_open_close_user_settings_window(browser)","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043e\u0442\u043a\u0440\u044b\u0442\u0438\u044f \u0438 \u0437\u0430\u043a\u0440\u044b\u0442\u0438\u044f \u0434\u0438\u0430\u043b\u043e\u0433\u043e\u0432\u043e\u0433\u043e \u043e\u043a\u043d\u0430 \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0430 \u0441\u0435\u0441\u0441\u0438\u043e\u043d\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.

    Parameters:

    Name Type Description Default browser Page

    \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.

    required Source code in tests\\e2e\\test_user_card.py
    def test_open_close_user_settings_window(self, browser: Page) -> None:\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043e\u0442\u043a\u0440\u044b\u0442\u0438\u044f \u0438 \u0437\u0430\u043a\u0440\u044b\u0442\u0438\u044f \u0434\u0438\u0430\u043b\u043e\u0433\u043e\u0432\u043e\u0433\u043e \u043e\u043a\u043d\u0430 \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0430 \u0441\u0435\u0441\u0441\u0438\u043e\u043d\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\n\n    Args:\n        browser: \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.\n    \"\"\"\n\n    lp = LoginPage(browser)\n    lp.do_login()\n\n    mp = MainPage(browser)\n\n    user_card = mp.click_user_button()\n    user_settings_window = user_card.click_settings_button()\n\n    user_settings_window.check_window_visibility()\n    user_settings_window.click_close_button()\n    user_settings_window.check_window_absence()\n
    "},{"location":"tests/e2e/test_user_card/#tests.e2e.test_user_card.TestUserCard.test_user_card_content","title":"test_user_card_content(browser)","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0438 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0441\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u043a\u0430\u0440\u0442\u043e\u0447\u043a\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.

    Parameters:

    Name Type Description Default browser Page

    \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.

    required Source code in tests\\e2e\\test_user_card.py
    def test_user_card_content(self, browser: Page) -> None:\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0438 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0441\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u043a\u0430\u0440\u0442\u043e\u0447\u043a\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\n\n    Args:\n        browser: \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.\n    \"\"\"\n\n    lp = LoginPage(browser)\n    lp.do_login()\n\n    mp = MainPage(browser)\n\n    user_card = mp.click_user_button()\n    user_card.check_content()\n
    "},{"location":"tests/e2e/test_user_card/#tests.e2e.test_user_card.TestUserCard.test_user_settings_window_content","title":"test_user_settings_window_content(browser)","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0438 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0441\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0434\u0438\u0430\u043b\u043e\u0433\u043e\u0432\u043e\u0433\u043e \u043e\u043a\u043d\u0430 \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0430 \u0441\u0435\u0441\u0441\u0438\u043e\u043d\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.

    Parameters:

    Name Type Description Default browser Page

    \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.

    required Source code in tests\\e2e\\test_user_card.py
    def test_user_settings_window_content(self, browser: Page) -> None:\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0438 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0441\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0434\u0438\u0430\u043b\u043e\u0433\u043e\u0432\u043e\u0433\u043e \u043e\u043a\u043d\u0430 \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0430 \u0441\u0435\u0441\u0441\u0438\u043e\u043d\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\n\n    Args:\n        browser: \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.\n    \"\"\"\n\n    lp = LoginPage(browser)\n    lp.do_login()\n\n    mp = MainPage(browser)\n\n    user_card = mp.click_user_button()\n    user_settings_window = user_card.click_settings_button()\n\n    user_settings_window.check_window_visibility()\n    user_settings_window.check_content()\n
    "},{"location":"tests/e2e/test_users_tab/","title":"TestUsersTab","text":"

    \u041c\u043e\u0434\u0443\u043b\u044c \u0442\u0435\u0441\u0442\u043e\u0432 \u0432\u043a\u043b\u0430\u0434\u043a\u0438 '\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438'.

    \u0421\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0442\u0435\u0441\u0442\u044b \u0434\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\u043c\u0438 \u0441\u0438\u0441\u0442\u0435\u043c\u044b.

    "},{"location":"tests/e2e/test_users_tab/#tests.e2e.test_users_tab.TestUsersTab","title":"TestUsersTab","text":"

    \u041a\u043b\u0430\u0441\u0441 \u0442\u0435\u0441\u0442\u043e\u0432 \u0434\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0432\u043a\u043b\u0430\u0434\u043a\u0438 '\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438'.

    \u0422\u0435\u0441\u0442\u044b \u043f\u043e\u043a\u0440\u044b\u0432\u0430\u044e\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0438: 1. test_users_tab_content: \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u0432\u043a\u043b\u0430\u0434\u043a\u0438 '\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438' 2. test_users_tab_toolbar_buttons: \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043a\u043d\u043e\u043f\u043a\u0438 \u043d\u0430 \u043f\u0430\u043d\u0435\u043b\u0438 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432 3. test_add_user_window_content: \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u043e\u043a\u043d\u0430 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f 4. test_add_user_window_close_buttons: \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043a\u043d\u043e\u043f\u043a\u0438 \u0437\u0430\u043a\u0440\u044b\u0442\u0438\u044f \u043e\u043a\u043d\u0430 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f 5 test_edit_user_window_content: \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u043e\u043a\u043d\u0430 \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f 6. test_edit_user_window_close_buttons: \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043a\u043d\u043e\u043f\u043a\u0438 \u0437\u0430\u043a\u0440\u044b\u0442\u0438\u044f \u043e\u043a\u043d\u0430 \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f 7. test_add_and_delete_user: \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0438 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f 8. test_add_AD_user: \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f Active Directory 9. test_reset_password: \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0441\u0431\u0440\u043e\u0441 \u043f\u0430\u0440\u043e\u043b\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f 10.test_edit_user_role: \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u0440\u043e\u043b\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f

    Source code in tests\\e2e\\test_users_tab.py
    class TestUsersTab:\n    \"\"\"\u041a\u043b\u0430\u0441\u0441 \u0442\u0435\u0441\u0442\u043e\u0432 \u0434\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0432\u043a\u043b\u0430\u0434\u043a\u0438 '\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438'.\n\n    \u0422\u0435\u0441\u0442\u044b \u043f\u043e\u043a\u0440\u044b\u0432\u0430\u044e\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0438:\n    1. test_users_tab_content: \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u0432\u043a\u043b\u0430\u0434\u043a\u0438 '\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438'\n    2. test_users_tab_toolbar_buttons: \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043a\u043d\u043e\u043f\u043a\u0438 \u043d\u0430 \u043f\u0430\u043d\u0435\u043b\u0438 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432\n    3. test_add_user_window_content: \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u043e\u043a\u043d\u0430 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\n    4. test_add_user_window_close_buttons: \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043a\u043d\u043e\u043f\u043a\u0438 \u0437\u0430\u043a\u0440\u044b\u0442\u0438\u044f \u043e\u043a\u043d\u0430 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f\n    5 test_edit_user_window_content: \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u043e\u043a\u043d\u0430 \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f\n    6. test_edit_user_window_close_buttons: \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043a\u043d\u043e\u043f\u043a\u0438 \u0437\u0430\u043a\u0440\u044b\u0442\u0438\u044f \u043e\u043a\u043d\u0430 \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f\n    7. test_add_and_delete_user: \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0438 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\n    8. test_add_AD_user: \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f Active Directory\n    9. test_reset_password: \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0441\u0431\u0440\u043e\u0441 \u043f\u0430\u0440\u043e\u043b\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\n    10.test_edit_user_role: \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u0440\u043e\u043b\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\n    \"\"\"\n\n    @pytest.fixture(scope=\"function\", autouse=True)\n    def setup(self, browser: Page) -> None:\n        \"\"\"\u041d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u0442 \u0442\u0435\u0441\u0442\u043e\u0432\u043e\u0435 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0435.\n\n        Args:\n            browser: \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.\n        \"\"\"\n\n        lp = LoginPage(browser)\n        lp.do_login()\n\n        mp = MainPage(browser)\n        mp.should_be_navigation_panel()\n        mp.click_main_navigation_panel_item(\"\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438\")\n        mp.click_subpanel_item(\"\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438\")\n\n    @pytest.fixture(scope=\"function\")\n    def cleanup_users(self, browser: Page) -> None:\n        \"\"\"\u0424\u0438\u043a\u0441\u0442\u0443\u0440\u0430 \u0434\u043b\u044f \u043e\u0447\u0438\u0441\u0442\u043a\u0438 \u0442\u0435\u0441\u0442\u043e\u0432\u044b\u0445 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 \u0438 \u0438\u0445 \u0441\u0435\u0430\u043d\u0441\u043e\u0432 \u043f\u043e\u0441\u043b\u0435 \u0442\u0435\u0441\u0442\u0430.\"\"\"\n        yield\n\n        # \u0412\u044b\u0445\u043e\u0434 \u0438\u0437 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\n        mp = MainPage(browser)\n        mp.do_logout()\n\n        # \u0410\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u044f \u0430\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440\u043e\u043c \u0434\u043b\u044f \u043e\u0447\u0438\u0441\u0442\u043a\u0438\n        login_page = LoginPage(browser)\n        login_page.do_login()\n\n        # \u0423\u0434\u0430\u043b\u044f\u0435\u043c \u0442\u0435\u0441\u0442\u043e\u0432\u044b\u0445 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439\n        self._cleanup_test_users(browser)\n\n    def _cleanup_test_users(self, browser: Page) -> None:\n        \"\"\"\u0423\u0434\u0430\u043b\u044f\u0435\u0442 \u0442\u0435\u0441\u0442\u043e\u0432\u044b\u0445 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439.\"\"\"\n        mp = MainPage(browser)\n        mp.click_main_navigation_panel_item(\"\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438\")\n        mp.click_subpanel_item(\"\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438\")\n        ut = UsersTab(browser)\n\n        # \u0423\u0434\u0430\u043b\u044f\u0435\u043c \u0442\u0435\u0441\u0442\u043e\u0432\u044b\u0445 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439\n        test_users = [\"TestUser\", \"TestUserAutoOperator\", \"TestUserAutoAdmin\"]\n\n        for user_name in test_users:\n            # \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u043b\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u0438 \u0443\u0434\u0430\u043b\u044f\u0435\u043c \u0435\u0433\u043e\n            user_index = ut.find_user_in_table(user_name, \"\u0410\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440\")\n            if user_index != -1:\n                ut.open_edit_user_page_by_user(user_name, \"\u0410\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440\")\n                ut.delete_user(user_name)\n\n\n    def test_users_tab_content(self, browser: Page) -> None:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u0432\u043a\u043b\u0430\u0434\u043a\u0438 '\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438'.\n\n        Args:\n            browser: \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.\n        \"\"\"\n\n        ut = UsersTab(browser)\n        ut.should_be_toolbar()\n        ut.should_be_users_table()\n        ut.check_users_table_content(True)\n\n    def test_users_tab_toolbar_buttons(self, browser: Page) -> None:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043a\u043d\u043e\u043f\u043a\u0438 \u043d\u0430 \u043f\u0430\u043d\u0435\u043b\u0438 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432.\n\n        Args:\n            browser: \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.\n        \"\"\"\n\n        ut = UsersTab(browser)\n        ut.should_be_toolbar_buttons()\n\n    # @pytest.mark.develop\n    def test_add_user_window_content(self, browser: Page) -> None:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u043e\u043a\u043d\u0430 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\n\n        Args:\n            browser: \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.\n        \"\"\"\n\n        ut = UsersTab(browser)\n        ut.open_add_user_window()\n        ut.check_add_user_window_content()\n        ut.transform_to_add_AD_user_window()\n        ut.check_add_AD_user_window_content()\n\n    def test_add_user_window_close_buttons(self, browser: Page) -> None:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043a\u043d\u043e\u043f\u043a\u0438 \u0437\u0430\u043a\u0440\u044b\u0442\u0438\u044f \u043e\u043a\u043d\u0430 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f.\n\n        Args:\n            browser: \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.\n        \"\"\"\n\n        ut = UsersTab(browser)\n        ut.open_add_user_window()\n        ut.close_add_user_window_by_toolbar_button()\n\n        ut.open_add_user_window()\n        ut.close_add_user_window()\n\n        ut.open_add_user_window()\n        ut.transform_to_add_AD_user_window()\n        ut.close_add_AD_user_window_by_toolbar_button()\n\n        ut.open_add_user_window()\n        ut.transform_to_add_AD_user_window()\n        ut.close_add_AD_user_window()\n\n    def test_edit_user_window_content(self, browser: Page) -> None:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u043e\u043a\u043d\u0430 \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f.\n\n        Args:\n            browser: \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.\n        \"\"\"\n\n        ut = UsersTab(browser)\n        user_name, role = ut.open_edit_user_page_by_index(0)\n        ut.check_edit_user_window_content(user_name, role)\n\n    def test_edit_user_window_close_buttons(self, browser: Page) -> None:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043a\u043d\u043e\u043f\u043a\u0438 \u0437\u0430\u043a\u0440\u044b\u0442\u0438\u044f \u043e\u043a\u043d\u0430 \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f.\n\n        Args:\n            browser: \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.\n        \"\"\"\n\n        ut = UsersTab(browser)\n        user_name, _ = ut.open_edit_user_page_by_index(0)\n        ut.close_edit_user_window_by_toolbar_button(user_name)\n        user_name, _ = ut.open_edit_user_page_by_index(0)\n        ut.close_edit_user_window(user_name)\n\n    # @pytest.mark.develop\n    def test_add_and_delete_user(self, browser: Page, cleanup_users: None) -> None:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0438 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\n\n        Args:\n            browser: \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.\n            cleanup_users: \u0424\u0438\u043a\u0441\u0442\u0443\u0440\u0430 \u0434\u043b\u044f \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u043f\u043e\u0441\u043b\u0435 \u0442\u0435\u0441\u0442\u0430.\n        \"\"\"\n\n        user_data: Dict[str, str] = {\"name\": \"TestUser\", \"role\": \"\u0410\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440\", \"password\": \"987654\"}\n\n        mp = MainPage(browser)\n        ut = UsersTab(browser)\n\n        # \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c, \u0435\u0441\u0442\u044c \u043b\u0438 \u0442\u0430\u043a\u043e\u0439 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\n        user_exists = ut.find_user_in_table(user_data[\"name\"], user_data[\"role\"]) != -1\n\n        if not user_exists:\n            # \u0421\u043e\u0437\u0434\u0430\u0435\u043c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0432\u043f\u0435\u0440\u0432\u044b\u0435\n            ut.open_add_user_window()\n            success = ut.add_new_user(user_data)\n\n            if success:\n                # \u0416\u0434\u0435\u043c \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u0439 Playwright\n                browser.wait_for_timeout(2000)\n\n                # \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435\n                user_found = ut.find_user_in_table(user_data[\"name\"], user_data[\"role\"]) != -1\n                if not user_found:\n                    # \u0415\u0441\u043b\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d, \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u0435\u043c \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0443\n                    browser.reload()\n                    browser.wait_for_timeout(2000)\n            else:\n                ut.close_add_user_window()\n\n        # \u041f\u044b\u0442\u0430\u0435\u043c\u0441\u044f \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0442\u0430\u043a\u043e\u0433\u043e \u0436\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0441\u043d\u043e\u0432\u0430\n        ut.open_add_user_window()\n        success_second = ut.add_new_user(user_data)\n\n        # \u0414\u043e\u043b\u0436\u043d\u043e \u0432\u0435\u0440\u043d\u0443\u0442\u044c\u0441\u044f False \u043f\u0440\u0438 \u043f\u043e\u043f\u044b\u0442\u043a\u0435 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\n        assert not success_second, \"\u041e\u0436\u0438\u0434\u0430\u043b\u0430\u0441\u044c \u043e\u0448\u0438\u0431\u043a\u0430 \u043f\u0440\u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0438 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\"\n\n        ut.open_edit_user_page_by_user(user_data[\"name\"], user_data[\"role\"])\n        ut.delete_user(user_data[\"name\"])\n        mp.click_subpanel_item(\"\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438\")\n        mp.click_subpanel_item(\"\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438\")\n        ut.should_not_be_user_in_table(user_data[\"name\"], user_data[\"role\"])\n\n    # @pytest.mark.develop\n    def test_add_AD_user(self, browser: Page, cleanup_users: None) -> None:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f Active Directory.\n\n        Args:\n            browser: \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.\n            cleanup_users: \u0424\u0438\u043a\u0441\u0442\u0443\u0440\u0430 \u0434\u043b\u044f \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u043f\u043e\u0441\u043b\u0435 \u0442\u0435\u0441\u0442\u0430.\n        \"\"\"\n\n        user_data: Dict[str, str] = {\"auth_type\":\"active_directory\",\n                                     \"group\": \"\u0410\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440\u044b\",\n                                     \"name\": \"\u0410\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440\",\n                                     \"role\": \"\u0410\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440\"}\n\n        ut = UsersTab(browser)\n\n        ut.open_add_user_window()\n        ut.add_new_user(user_data)\n\n    def test_reset_password(self, browser: Page, cleanup_users: None) -> None:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0441\u0431\u0440\u043e\u0441 \u043f\u0430\u0440\u043e\u043b\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\n\n        Args:\n            browser: \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.\n            cleanup_users: \u0424\u0438\u043a\u0441\u0442\u0443\u0440\u0430 \u0434\u043b\u044f \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u043f\u043e\u0441\u043b\u0435 \u0442\u0435\u0441\u0442\u0430.\n        \"\"\"\n\n        user_data: Dict[str, str] = {\"name\": \"TestUserAutoAdmin\", \"role\": \"\u0410\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440\", \"password\": \"123456\"}\n\n        mp = MainPage(browser)\n        ut = UsersTab(browser)\n\n        ut.open_add_user_window()\n        ut.add_new_user(user_data)\n        mp.click_subpanel_item(\"\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438\")\n        mp.click_subpanel_item(\"\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438\")\n        ut.open_edit_user_page_by_user(user_data[\"name\"], user_data[\"role\"])\n        new_password = ut.reset_password(user_data[\"name\"])\n\n        if len(new_password) == 0:\n            assert False, \"Unsuccessful password reset\"\n\n        new_lp = LoginPage(browser)\n        new_lp.do_login(username=user_data[\"name\"], password=new_password)\n        new_mp = MainPage(browser)\n        new_mp.do_logout()\n        lp_1 = LoginPage(browser)\n        lp_1.do_login()\n        mp_1 = MainPage(browser)\n        mp_1.should_be_navigation_panel()\n        mp_1.click_main_navigation_panel_item(\"\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438\")\n        mp_1.click_subpanel_item(\"\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438\")\n        ut_1 = UsersTab(browser)\n        ut_1.open_edit_user_page_by_user(user_data[\"name\"], user_data[\"role\"])\n        ut_1.delete_user(user_data[\"name\"])\n        mp_1.click_subpanel_item(\"\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438\")\n        mp_1.click_subpanel_item(\"\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438\")\n        ut_1.should_not_be_user_in_table(user_data[\"name\"], user_data[\"role\"])\n\n    def test_edit_user_role(self, browser: Page, cleanup_users: None) -> None:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u0440\u043e\u043b\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\n\n        Args:\n            browser: \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.\n            cleanup_users: \u0424\u0438\u043a\u0441\u0442\u0443\u0440\u0430 \u0434\u043b\u044f \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u043f\u043e\u0441\u043b\u0435 \u0442\u0435\u0441\u0442\u0430.\n        \"\"\"\n\n        user_data: Dict[str, str] = {\"name\": \"TestUserAutoOperator\", \"role\": \"\u041e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\", \"password\": \"123245\"}\n\n        mp = MainPage(browser)\n        ut = UsersTab(browser)\n\n        ut.open_add_user_window()\n        ut.add_new_user(user_data)\n        mp.click_subpanel_item(\"\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438\")\n        mp.click_subpanel_item(\"\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438\")\n        ut.open_edit_user_page_by_user(user_data[\"name\"], user_data[\"role\"])\n        new_user_data = {\"role\": \"\u041a\u043e\u043d\u0442\u0430\u043a\u0442\u043d\u043e\u0435 \u043b\u0438\u0446\u043e\"}\n        ut.edit_user(user_data[\"name\"], new_user_data)\n        mp.click_subpanel_item(\"\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438\")\n        mp.click_subpanel_item(\"\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438\")\n        ut.should_be_user_in_table(user_data[\"name\"], new_user_data[\"role\"])\n        ut.open_edit_user_page_by_user(user_data[\"name\"], new_user_data[\"role\"])\n        ut.delete_user(user_data[\"name\"])\n        mp.click_subpanel_item(\"\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438\")\n        mp.click_subpanel_item(\"\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438\")\n        ut.should_not_be_user_in_table(user_data[\"name\"], new_user_data[\"role\"])\n
    "},{"location":"tests/e2e/test_users_tab/#tests.e2e.test_users_tab.TestUsersTab.cleanup_users","title":"cleanup_users(browser)","text":"

    \u0424\u0438\u043a\u0441\u0442\u0443\u0440\u0430 \u0434\u043b\u044f \u043e\u0447\u0438\u0441\u0442\u043a\u0438 \u0442\u0435\u0441\u0442\u043e\u0432\u044b\u0445 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 \u0438 \u0438\u0445 \u0441\u0435\u0430\u043d\u0441\u043e\u0432 \u043f\u043e\u0441\u043b\u0435 \u0442\u0435\u0441\u0442\u0430.

    Source code in tests\\e2e\\test_users_tab.py
    @pytest.fixture(scope=\"function\")\ndef cleanup_users(self, browser: Page) -> None:\n    \"\"\"\u0424\u0438\u043a\u0441\u0442\u0443\u0440\u0430 \u0434\u043b\u044f \u043e\u0447\u0438\u0441\u0442\u043a\u0438 \u0442\u0435\u0441\u0442\u043e\u0432\u044b\u0445 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 \u0438 \u0438\u0445 \u0441\u0435\u0430\u043d\u0441\u043e\u0432 \u043f\u043e\u0441\u043b\u0435 \u0442\u0435\u0441\u0442\u0430.\"\"\"\n    yield\n\n    # \u0412\u044b\u0445\u043e\u0434 \u0438\u0437 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\n    mp = MainPage(browser)\n    mp.do_logout()\n\n    # \u0410\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u044f \u0430\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440\u043e\u043c \u0434\u043b\u044f \u043e\u0447\u0438\u0441\u0442\u043a\u0438\n    login_page = LoginPage(browser)\n    login_page.do_login()\n\n    # \u0423\u0434\u0430\u043b\u044f\u0435\u043c \u0442\u0435\u0441\u0442\u043e\u0432\u044b\u0445 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439\n    self._cleanup_test_users(browser)\n
    "},{"location":"tests/e2e/test_users_tab/#tests.e2e.test_users_tab.TestUsersTab.setup","title":"setup(browser)","text":"

    \u041d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u0442 \u0442\u0435\u0441\u0442\u043e\u0432\u043e\u0435 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0435.

    Parameters:

    Name Type Description Default browser Page

    \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.

    required Source code in tests\\e2e\\test_users_tab.py
    @pytest.fixture(scope=\"function\", autouse=True)\ndef setup(self, browser: Page) -> None:\n    \"\"\"\u041d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u0442 \u0442\u0435\u0441\u0442\u043e\u0432\u043e\u0435 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0435.\n\n    Args:\n        browser: \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.\n    \"\"\"\n\n    lp = LoginPage(browser)\n    lp.do_login()\n\n    mp = MainPage(browser)\n    mp.should_be_navigation_panel()\n    mp.click_main_navigation_panel_item(\"\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438\")\n    mp.click_subpanel_item(\"\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438\")\n
    "},{"location":"tests/e2e/test_users_tab/#tests.e2e.test_users_tab.TestUsersTab.test_add_AD_user","title":"test_add_AD_user(browser, cleanup_users)","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f Active Directory.

    Parameters:

    Name Type Description Default browser Page

    \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.

    required cleanup_users None

    \u0424\u0438\u043a\u0441\u0442\u0443\u0440\u0430 \u0434\u043b\u044f \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u043f\u043e\u0441\u043b\u0435 \u0442\u0435\u0441\u0442\u0430.

    required Source code in tests\\e2e\\test_users_tab.py
    def test_add_AD_user(self, browser: Page, cleanup_users: None) -> None:\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f Active Directory.\n\n    Args:\n        browser: \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.\n        cleanup_users: \u0424\u0438\u043a\u0441\u0442\u0443\u0440\u0430 \u0434\u043b\u044f \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u043f\u043e\u0441\u043b\u0435 \u0442\u0435\u0441\u0442\u0430.\n    \"\"\"\n\n    user_data: Dict[str, str] = {\"auth_type\":\"active_directory\",\n                                 \"group\": \"\u0410\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440\u044b\",\n                                 \"name\": \"\u0410\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440\",\n                                 \"role\": \"\u0410\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440\"}\n\n    ut = UsersTab(browser)\n\n    ut.open_add_user_window()\n    ut.add_new_user(user_data)\n
    "},{"location":"tests/e2e/test_users_tab/#tests.e2e.test_users_tab.TestUsersTab.test_add_and_delete_user","title":"test_add_and_delete_user(browser, cleanup_users)","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0438 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.

    Parameters:

    Name Type Description Default browser Page

    \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.

    required cleanup_users None

    \u0424\u0438\u043a\u0441\u0442\u0443\u0440\u0430 \u0434\u043b\u044f \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u043f\u043e\u0441\u043b\u0435 \u0442\u0435\u0441\u0442\u0430.

    required Source code in tests\\e2e\\test_users_tab.py
    def test_add_and_delete_user(self, browser: Page, cleanup_users: None) -> None:\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0438 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\n\n    Args:\n        browser: \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.\n        cleanup_users: \u0424\u0438\u043a\u0441\u0442\u0443\u0440\u0430 \u0434\u043b\u044f \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u043f\u043e\u0441\u043b\u0435 \u0442\u0435\u0441\u0442\u0430.\n    \"\"\"\n\n    user_data: Dict[str, str] = {\"name\": \"TestUser\", \"role\": \"\u0410\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440\", \"password\": \"987654\"}\n\n    mp = MainPage(browser)\n    ut = UsersTab(browser)\n\n    # \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c, \u0435\u0441\u0442\u044c \u043b\u0438 \u0442\u0430\u043a\u043e\u0439 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\n    user_exists = ut.find_user_in_table(user_data[\"name\"], user_data[\"role\"]) != -1\n\n    if not user_exists:\n        # \u0421\u043e\u0437\u0434\u0430\u0435\u043c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0432\u043f\u0435\u0440\u0432\u044b\u0435\n        ut.open_add_user_window()\n        success = ut.add_new_user(user_data)\n\n        if success:\n            # \u0416\u0434\u0435\u043c \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u0439 Playwright\n            browser.wait_for_timeout(2000)\n\n            # \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435\n            user_found = ut.find_user_in_table(user_data[\"name\"], user_data[\"role\"]) != -1\n            if not user_found:\n                # \u0415\u0441\u043b\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d, \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u0435\u043c \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0443\n                browser.reload()\n                browser.wait_for_timeout(2000)\n        else:\n            ut.close_add_user_window()\n\n    # \u041f\u044b\u0442\u0430\u0435\u043c\u0441\u044f \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0442\u0430\u043a\u043e\u0433\u043e \u0436\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0441\u043d\u043e\u0432\u0430\n    ut.open_add_user_window()\n    success_second = ut.add_new_user(user_data)\n\n    # \u0414\u043e\u043b\u0436\u043d\u043e \u0432\u0435\u0440\u043d\u0443\u0442\u044c\u0441\u044f False \u043f\u0440\u0438 \u043f\u043e\u043f\u044b\u0442\u043a\u0435 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\n    assert not success_second, \"\u041e\u0436\u0438\u0434\u0430\u043b\u0430\u0441\u044c \u043e\u0448\u0438\u0431\u043a\u0430 \u043f\u0440\u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0438 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\"\n\n    ut.open_edit_user_page_by_user(user_data[\"name\"], user_data[\"role\"])\n    ut.delete_user(user_data[\"name\"])\n    mp.click_subpanel_item(\"\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438\")\n    mp.click_subpanel_item(\"\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438\")\n    ut.should_not_be_user_in_table(user_data[\"name\"], user_data[\"role\"])\n
    "},{"location":"tests/e2e/test_users_tab/#tests.e2e.test_users_tab.TestUsersTab.test_add_user_window_close_buttons","title":"test_add_user_window_close_buttons(browser)","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043a\u043d\u043e\u043f\u043a\u0438 \u0437\u0430\u043a\u0440\u044b\u0442\u0438\u044f \u043e\u043a\u043d\u0430 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f.

    Parameters:

    Name Type Description Default browser Page

    \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.

    required Source code in tests\\e2e\\test_users_tab.py
    def test_add_user_window_close_buttons(self, browser: Page) -> None:\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043a\u043d\u043e\u043f\u043a\u0438 \u0437\u0430\u043a\u0440\u044b\u0442\u0438\u044f \u043e\u043a\u043d\u0430 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f.\n\n    Args:\n        browser: \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.\n    \"\"\"\n\n    ut = UsersTab(browser)\n    ut.open_add_user_window()\n    ut.close_add_user_window_by_toolbar_button()\n\n    ut.open_add_user_window()\n    ut.close_add_user_window()\n\n    ut.open_add_user_window()\n    ut.transform_to_add_AD_user_window()\n    ut.close_add_AD_user_window_by_toolbar_button()\n\n    ut.open_add_user_window()\n    ut.transform_to_add_AD_user_window()\n    ut.close_add_AD_user_window()\n
    "},{"location":"tests/e2e/test_users_tab/#tests.e2e.test_users_tab.TestUsersTab.test_add_user_window_content","title":"test_add_user_window_content(browser)","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u043e\u043a\u043d\u0430 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.

    Parameters:

    Name Type Description Default browser Page

    \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.

    required Source code in tests\\e2e\\test_users_tab.py
    def test_add_user_window_content(self, browser: Page) -> None:\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u043e\u043a\u043d\u0430 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\n\n    Args:\n        browser: \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.\n    \"\"\"\n\n    ut = UsersTab(browser)\n    ut.open_add_user_window()\n    ut.check_add_user_window_content()\n    ut.transform_to_add_AD_user_window()\n    ut.check_add_AD_user_window_content()\n
    "},{"location":"tests/e2e/test_users_tab/#tests.e2e.test_users_tab.TestUsersTab.test_edit_user_role","title":"test_edit_user_role(browser, cleanup_users)","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u0440\u043e\u043b\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.

    Parameters:

    Name Type Description Default browser Page

    \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.

    required cleanup_users None

    \u0424\u0438\u043a\u0441\u0442\u0443\u0440\u0430 \u0434\u043b\u044f \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u043f\u043e\u0441\u043b\u0435 \u0442\u0435\u0441\u0442\u0430.

    required Source code in tests\\e2e\\test_users_tab.py
    def test_edit_user_role(self, browser: Page, cleanup_users: None) -> None:\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u0440\u043e\u043b\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\n\n    Args:\n        browser: \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.\n        cleanup_users: \u0424\u0438\u043a\u0441\u0442\u0443\u0440\u0430 \u0434\u043b\u044f \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u043f\u043e\u0441\u043b\u0435 \u0442\u0435\u0441\u0442\u0430.\n    \"\"\"\n\n    user_data: Dict[str, str] = {\"name\": \"TestUserAutoOperator\", \"role\": \"\u041e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\", \"password\": \"123245\"}\n\n    mp = MainPage(browser)\n    ut = UsersTab(browser)\n\n    ut.open_add_user_window()\n    ut.add_new_user(user_data)\n    mp.click_subpanel_item(\"\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438\")\n    mp.click_subpanel_item(\"\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438\")\n    ut.open_edit_user_page_by_user(user_data[\"name\"], user_data[\"role\"])\n    new_user_data = {\"role\": \"\u041a\u043e\u043d\u0442\u0430\u043a\u0442\u043d\u043e\u0435 \u043b\u0438\u0446\u043e\"}\n    ut.edit_user(user_data[\"name\"], new_user_data)\n    mp.click_subpanel_item(\"\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438\")\n    mp.click_subpanel_item(\"\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438\")\n    ut.should_be_user_in_table(user_data[\"name\"], new_user_data[\"role\"])\n    ut.open_edit_user_page_by_user(user_data[\"name\"], new_user_data[\"role\"])\n    ut.delete_user(user_data[\"name\"])\n    mp.click_subpanel_item(\"\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438\")\n    mp.click_subpanel_item(\"\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438\")\n    ut.should_not_be_user_in_table(user_data[\"name\"], new_user_data[\"role\"])\n
    "},{"location":"tests/e2e/test_users_tab/#tests.e2e.test_users_tab.TestUsersTab.test_edit_user_window_close_buttons","title":"test_edit_user_window_close_buttons(browser)","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043a\u043d\u043e\u043f\u043a\u0438 \u0437\u0430\u043a\u0440\u044b\u0442\u0438\u044f \u043e\u043a\u043d\u0430 \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f.

    Parameters:

    Name Type Description Default browser Page

    \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.

    required Source code in tests\\e2e\\test_users_tab.py
    def test_edit_user_window_close_buttons(self, browser: Page) -> None:\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043a\u043d\u043e\u043f\u043a\u0438 \u0437\u0430\u043a\u0440\u044b\u0442\u0438\u044f \u043e\u043a\u043d\u0430 \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f.\n\n    Args:\n        browser: \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.\n    \"\"\"\n\n    ut = UsersTab(browser)\n    user_name, _ = ut.open_edit_user_page_by_index(0)\n    ut.close_edit_user_window_by_toolbar_button(user_name)\n    user_name, _ = ut.open_edit_user_page_by_index(0)\n    ut.close_edit_user_window(user_name)\n
    "},{"location":"tests/e2e/test_users_tab/#tests.e2e.test_users_tab.TestUsersTab.test_edit_user_window_content","title":"test_edit_user_window_content(browser)","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u043e\u043a\u043d\u0430 \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f.

    Parameters:

    Name Type Description Default browser Page

    \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.

    required Source code in tests\\e2e\\test_users_tab.py
    def test_edit_user_window_content(self, browser: Page) -> None:\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u043e\u043a\u043d\u0430 \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f.\n\n    Args:\n        browser: \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.\n    \"\"\"\n\n    ut = UsersTab(browser)\n    user_name, role = ut.open_edit_user_page_by_index(0)\n    ut.check_edit_user_window_content(user_name, role)\n
    "},{"location":"tests/e2e/test_users_tab/#tests.e2e.test_users_tab.TestUsersTab.test_reset_password","title":"test_reset_password(browser, cleanup_users)","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0441\u0431\u0440\u043e\u0441 \u043f\u0430\u0440\u043e\u043b\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.

    Parameters:

    Name Type Description Default browser Page

    \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.

    required cleanup_users None

    \u0424\u0438\u043a\u0441\u0442\u0443\u0440\u0430 \u0434\u043b\u044f \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u043f\u043e\u0441\u043b\u0435 \u0442\u0435\u0441\u0442\u0430.

    required Source code in tests\\e2e\\test_users_tab.py
    def test_reset_password(self, browser: Page, cleanup_users: None) -> None:\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0441\u0431\u0440\u043e\u0441 \u043f\u0430\u0440\u043e\u043b\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\n\n    Args:\n        browser: \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.\n        cleanup_users: \u0424\u0438\u043a\u0441\u0442\u0443\u0440\u0430 \u0434\u043b\u044f \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u043f\u043e\u0441\u043b\u0435 \u0442\u0435\u0441\u0442\u0430.\n    \"\"\"\n\n    user_data: Dict[str, str] = {\"name\": \"TestUserAutoAdmin\", \"role\": \"\u0410\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440\", \"password\": \"123456\"}\n\n    mp = MainPage(browser)\n    ut = UsersTab(browser)\n\n    ut.open_add_user_window()\n    ut.add_new_user(user_data)\n    mp.click_subpanel_item(\"\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438\")\n    mp.click_subpanel_item(\"\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438\")\n    ut.open_edit_user_page_by_user(user_data[\"name\"], user_data[\"role\"])\n    new_password = ut.reset_password(user_data[\"name\"])\n\n    if len(new_password) == 0:\n        assert False, \"Unsuccessful password reset\"\n\n    new_lp = LoginPage(browser)\n    new_lp.do_login(username=user_data[\"name\"], password=new_password)\n    new_mp = MainPage(browser)\n    new_mp.do_logout()\n    lp_1 = LoginPage(browser)\n    lp_1.do_login()\n    mp_1 = MainPage(browser)\n    mp_1.should_be_navigation_panel()\n    mp_1.click_main_navigation_panel_item(\"\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438\")\n    mp_1.click_subpanel_item(\"\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438\")\n    ut_1 = UsersTab(browser)\n    ut_1.open_edit_user_page_by_user(user_data[\"name\"], user_data[\"role\"])\n    ut_1.delete_user(user_data[\"name\"])\n    mp_1.click_subpanel_item(\"\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438\")\n    mp_1.click_subpanel_item(\"\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438\")\n    ut_1.should_not_be_user_in_table(user_data[\"name\"], user_data[\"role\"])\n
    "},{"location":"tests/e2e/test_users_tab/#tests.e2e.test_users_tab.TestUsersTab.test_users_tab_content","title":"test_users_tab_content(browser)","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u0432\u043a\u043b\u0430\u0434\u043a\u0438 '\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438'.

    Parameters:

    Name Type Description Default browser Page

    \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.

    required Source code in tests\\e2e\\test_users_tab.py
    def test_users_tab_content(self, browser: Page) -> None:\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u0432\u043a\u043b\u0430\u0434\u043a\u0438 '\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438'.\n\n    Args:\n        browser: \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.\n    \"\"\"\n\n    ut = UsersTab(browser)\n    ut.should_be_toolbar()\n    ut.should_be_users_table()\n    ut.check_users_table_content(True)\n
    "},{"location":"tests/e2e/test_users_tab/#tests.e2e.test_users_tab.TestUsersTab.test_users_tab_toolbar_buttons","title":"test_users_tab_toolbar_buttons(browser)","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043a\u043d\u043e\u043f\u043a\u0438 \u043d\u0430 \u043f\u0430\u043d\u0435\u043b\u0438 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432.

    Parameters:

    Name Type Description Default browser Page

    \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.

    required Source code in tests\\e2e\\test_users_tab.py
    def test_users_tab_toolbar_buttons(self, browser: Page) -> None:\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043a\u043d\u043e\u043f\u043a\u0438 \u043d\u0430 \u043f\u0430\u043d\u0435\u043b\u0438 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432.\n\n    Args:\n        browser: \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.\n    \"\"\"\n\n    ut = UsersTab(browser)\n    ut.should_be_toolbar_buttons()\n
    "},{"location":"tests/e2e/test_ztp_templates_tab/","title":"TestZTPTemplatesTab","text":"

    \u041c\u043e\u0434\u0443\u043b\u044c \u0442\u0435\u0441\u0442\u043e\u0432 \u0432\u043a\u043b\u0430\u0434\u043a\u0438 '\u0428\u0430\u0431\u043b\u043e\u043d\u044b' \u0432 \u043c\u043e\u0434\u0443\u043b\u0435 Zero Touch Provisioning.

    \u0421\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0442\u0435\u0441\u0442\u044b \u0434\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0448\u0430\u0431\u043b\u043e\u043d\u0430\u043c\u0438.

    "},{"location":"tests/e2e/test_ztp_templates_tab/#tests.e2e.test_ztp_templates_tab.TestZTPTemplatesTab","title":"TestZTPTemplatesTab","text":"

    \u041d\u0430\u0431\u043e\u0440 \u0442\u0435\u0441\u0442\u043e\u0432 \u0434\u043b\u044f \u0432\u043a\u043b\u0430\u0434\u043a\u0438 '\u0428\u0430\u0431\u043b\u043e\u043d\u044b' \u0432 \u043c\u043e\u0434\u0443\u043b\u0435 Zero Touch Provisioning.

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0441\u0442\u044c \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f, \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430 \u0438 \u043a\u043e\u043d\u0441\u0438\u0441\u0442\u0435\u043d\u0442\u043d\u043e\u0441\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0445 \u043c\u0435\u0436\u0434\u0443 UI \u0438 API \u043d\u0430 \u0432\u043a\u043b\u0430\u0434\u043a\u0435 \u0448\u0430\u0431\u043b\u043e\u043d\u043e\u0432 ZTP.

    \u0422\u0435\u0441\u0442\u044b \u043f\u043e\u043a\u0440\u044b\u0432\u0430\u044e\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u044b\u0435 \u043e\u0431\u043b\u0430\u0441\u0442\u0438: 1. test_templates_tab_content - \u0411\u0430\u0437\u043e\u0432\u0430\u044f \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0438 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u0432\u043a\u043b\u0430\u0434\u043a\u0438 2. test_templates_table_row_highlighting - \u0412\u0438\u0437\u0443\u0430\u043b\u044c\u043d\u043e\u0435 \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0441\u0442\u0440\u043e\u043a \u0442\u0430\u0431\u043b\u0438\u0446\u044b 3. test_templates_table_scrolling - \u041d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u044f \u043f\u043e \u0442\u0430\u0431\u043b\u0438\u0446\u0435 \u0441 \u0431\u043e\u043b\u044c\u0448\u0438\u043c \u043e\u0431\u044a\u0435\u043c\u043e\u043c \u0434\u0430\u043d\u043d\u044b\u0445 4. test_templates_modal_window_content - \u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0438 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u044b\u0445 \u043e\u043a\u043e\u043d 5. test_templates_modal_window_scrolling - \u041d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u044f \u0432 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u044b\u0445 \u043e\u043a\u043d\u0430\u0445 6. test_templates_modal_window_api_data_consistency - \u0421\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445 UI \u0438 API

    \u0424\u0438\u043a\u0441\u0442\u0443\u0440\u0430 setup \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0432\u0430\u0435\u0442 \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0443 \u0442\u0435\u0441\u0442\u043e\u0432\u043e\u0433\u043e \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f: - \u0410\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u044e \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0435 - \u041d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u044e \u043a \u0446\u0435\u043b\u0435\u0432\u043e\u0439 \u0432\u043a\u043b\u0430\u0434\u043a\u0435 \u0447\u0435\u0440\u0435\u0437 \u043f\u0430\u043d\u0435\u043b\u044c \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043a - \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0445 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043e\u0432 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b

    Source code in tests\\e2e\\test_ztp_templates_tab.py
    class TestZTPTemplatesTab:\n    \"\"\"\u041d\u0430\u0431\u043e\u0440 \u0442\u0435\u0441\u0442\u043e\u0432 \u0434\u043b\u044f \u0432\u043a\u043b\u0430\u0434\u043a\u0438 '\u0428\u0430\u0431\u043b\u043e\u043d\u044b' \u0432 \u043c\u043e\u0434\u0443\u043b\u0435 Zero Touch Provisioning.\n\n    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0441\u0442\u044c \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f, \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430\n    \u0438 \u043a\u043e\u043d\u0441\u0438\u0441\u0442\u0435\u043d\u0442\u043d\u043e\u0441\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0445 \u043c\u0435\u0436\u0434\u0443 UI \u0438 API \u043d\u0430 \u0432\u043a\u043b\u0430\u0434\u043a\u0435 \u0448\u0430\u0431\u043b\u043e\u043d\u043e\u0432 ZTP.\n\n    \u0422\u0435\u0441\u0442\u044b \u043f\u043e\u043a\u0440\u044b\u0432\u0430\u044e\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u044b\u0435 \u043e\u0431\u043b\u0430\u0441\u0442\u0438:\n    1. test_templates_tab_content - \u0411\u0430\u0437\u043e\u0432\u0430\u044f \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0438 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u0432\u043a\u043b\u0430\u0434\u043a\u0438\n    2. test_templates_table_row_highlighting - \u0412\u0438\u0437\u0443\u0430\u043b\u044c\u043d\u043e\u0435 \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0441\u0442\u0440\u043e\u043a \u0442\u0430\u0431\u043b\u0438\u0446\u044b\n    3. test_templates_table_scrolling - \u041d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u044f \u043f\u043e \u0442\u0430\u0431\u043b\u0438\u0446\u0435 \u0441 \u0431\u043e\u043b\u044c\u0448\u0438\u043c \u043e\u0431\u044a\u0435\u043c\u043e\u043c \u0434\u0430\u043d\u043d\u044b\u0445\n    4. test_templates_modal_window_content - \u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0438 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u044b\u0445 \u043e\u043a\u043e\u043d\n    5. test_templates_modal_window_scrolling - \u041d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u044f \u0432 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u044b\u0445 \u043e\u043a\u043d\u0430\u0445\n    6. test_templates_modal_window_api_data_consistency - \u0421\u0438\u043d\u0445\u0440\u043e\u043d\u0438\u0437\u0430\u0446\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445 UI \u0438 API\n\n    \u0424\u0438\u043a\u0441\u0442\u0443\u0440\u0430 setup \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0432\u0430\u0435\u0442 \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0443 \u0442\u0435\u0441\u0442\u043e\u0432\u043e\u0433\u043e \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f:\n    - \u0410\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u044e \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0435\n    - \u041d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u044e \u043a \u0446\u0435\u043b\u0435\u0432\u043e\u0439 \u0432\u043a\u043b\u0430\u0434\u043a\u0435 \u0447\u0435\u0440\u0435\u0437 \u043f\u0430\u043d\u0435\u043b\u044c \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043a\n    - \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0445 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043e\u0432 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b\n    \"\"\"\n\n    @pytest.fixture(scope=\"function\", autouse=True)\n    def setup(self, browser: Page) -> None:\n        \"\"\"\u0424\u0438\u043a\u0441\u0442\u0443\u0440\u0430 \u0434\u043b\u044f \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0438 \u0442\u0435\u0441\u0442\u043e\u0432\u043e\u0433\u043e \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f.\n\n        \u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442:\n        1. \u0410\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u044e \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0435\n        2. \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u043d\u0430 \u0432\u043a\u043b\u0430\u0434\u043a\u0443 '\u0428\u0430\u0431\u043b\u043e\u043d\u044b' \u0447\u0435\u0440\u0435\u0437 \u043f\u0430\u043d\u0435\u043b\u044c \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438\n        \"\"\"\n        # \u0410\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u044f \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0435\n        login_page = LoginPage(browser)\n        login_page.do_login()\n\n        # \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0433\u043b\u0430\u0432\u043d\u043e\u0439 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b\n        main_page = MainPage(browser)\n\n        # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0438 \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u0441 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u043c\u0438 \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438\n        main_page.should_be_navigation_panel()\n        main_page.click_main_navigation_panel_item(\"\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438\")\n        main_page.click_subpanel_item(\"Zero Touch Provisioning\")\n        main_page.click_subpanel_item(\"\u0428\u0430\u0431\u043b\u043e\u043d\u044b\", parent=\"Zero Touch Provisioning\")\n        main_page.wait_for_timeout(5000)\n\n\n    def test_templates_tab_content(self, browser: Page) -> None:\n        \"\"\"\u0422\u0435\u0441\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0433\u043e \u0432\u043a\u043b\u0430\u0434\u043a\u0438 '\u0428\u0430\u0431\u043b\u043e\u043d\u044b'.\n\n        \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442:\n        1. \u041d\u0430\u043b\u0438\u0447\u0438\u0435 \u0438 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0441\u0442\u044c \u0442\u0443\u043b\u0431\u0430\u0440\u0430\n        2. \u041d\u0430\u043b\u0438\u0447\u0438\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0448\u0430\u0431\u043b\u043e\u043d\u043e\u0432\n        3. \u0421\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0433\u043e \u0442\u0430\u0431\u043b\u0438\u0446\u044b\n        \"\"\"\n        # \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u0441\u0435\u0430\u043d\u0441\u043e\u0432\n        ztp_templates_tab = ZTPTemplatesTab(browser)\n\n        # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0442\u0443\u043b\u0431\u0430\u0440\u0430 \u0432\u043a\u043b\u0430\u0434\u043a\u0438\n        ztp_templates_tab.should_be_toolbar()\n\n        # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043d\u0430\u043b\u0438\u0447\u0438\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0448\u0430\u0431\u043b\u043e\u043d\u043e\u0432\n        ztp_templates_tab.should_be_templates_table()\n\n        browser.wait_for_timeout(5000)\n\n        # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0433\u043e \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0448\u0430\u0431\u043b\u043e\u043d\u043e\u0432\n        ztp_templates_tab.check_templates_table_content()\n\n    def test_templates_table_row_highlighting(self, browser: Page) -> None:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0441\u0442\u0440\u043e\u043a \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435 \u0448\u0430\u0431\u043b\u043e\u043d\u043e\u0432.\n\n        \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0441\u0442\u044c \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0441\u0442\u0440\u043e\u043a \u043f\u0440\u0438 \u043a\u043b\u0438\u043a\u0435 \u043d\u0430 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0435 \u043f\u043e\u0437\u0438\u0446\u0438\u0438:\n        1. \u041f\u0435\u0440\u0432\u0430\u044f \u0441\u0442\u0440\u043e\u043a\u0430\n        2. \u041f\u043e\u0441\u043b\u0435\u0434\u043d\u044f\u044f \u0441\u0442\u0440\u043e\u043a\u0430\n        3. \u0421\u0442\u0440\u043e\u043a\u0430 \u0432 \u0441\u0435\u0440\u0435\u0434\u0438\u043d\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u044b\n        \"\"\"\n\n        ztp_templates_tab = ZTPTemplatesTab(browser)\n\n        # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0442\u0443\u043b\u0431\u0430\u0440\u0430 \u0432\u043a\u043b\u0430\u0434\u043a\u0438\n        ztp_templates_tab.should_be_toolbar()\n\n        # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043d\u0430\u043b\u0438\u0447\u0438\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0448\u0430\u0431\u043b\u043e\u043d\u043e\u0432\n        ztp_templates_tab.should_be_templates_table()\n\n        # \u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0430 \u0441\u0442\u0440\u043e\u043a \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435\n        rows_count = ztp_templates_tab.get_rows_count()\n\n        # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0441\u0442\u0440\u043e\u043a\n        ztp_templates_tab.check_templates_table_row_highlighting(0)\n        ztp_templates_tab.check_templates_table_row_highlighting(rows_count - 1)\n        ztp_templates_tab.check_templates_table_row_highlighting(int(rows_count / 2))\n\n    def test_templates_table_scrolling(self, browser: Page) -> None:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0441\u043a\u0440\u043e\u043b\u043b\u0438\u043d\u0433\u0430 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0448\u0430\u0431\u043b\u043e\u043d\u043e\u0432.\n\n        \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442:\n        1. \u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u0439 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u044b\n        2. \u0412\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u0441\u0442\u0440\u043e\u043a \u043f\u043e\u0441\u043b\u0435 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0438 \u0432\u043d\u0438\u0437 \u0438 \u0432\u0432\u0435\u0440\u0445\n        3. \u041a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0441\u0442\u044c \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445 \u043f\u043e\u0441\u043b\u0435 \u0441\u043a\u0440\u043e\u043b\u043b\u0438\u043d\u0433\u0430\n        \"\"\"\n\n        ztp_templates_tab = ZTPTemplatesTab(browser)\n\n        browser.wait_for_timeout(2000)\n\n        # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0441\u043a\u0440\u043e\u043b\u043b\u0438\u043d\u0433\u0430\n        is_scrollable = ztp_templates_tab.check_templates_table_vertical_scrolling()\n\n        if is_scrollable:\n            print(\"\u0422\u0430\u0431\u043b\u0438\u0446\u0430 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u0439 \u0441\u043a\u0440\u043e\u043b\u043b\u0438\u043d\u0433\")\n\n            # \u041f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0430 \u0432\u043d\u0438\u0437\n            ztp_templates_tab.scroll_templates_table_down()\n\n            browser.wait_for_timeout(1000)\n\n            # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0439 \u0441\u0442\u0440\u043e\u043a\u0438 \u043f\u043e\u0441\u043b\u0435 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0438\n            ztp_templates_tab.check_templates_table_last_row_visibility()\n\n            # \u041f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0430 \u0432\u0432\u0435\u0440\u0445\n            ztp_templates_tab.scroll_templates_table_up()\n\n            browser.wait_for_timeout(1000)\n\n            # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u043f\u0435\u0440\u0432\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438 \u043f\u043e\u0441\u043b\u0435 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0438\n            ztp_templates_tab.check_templates_table_first_row_visibility()\n        else:\n            print(\"\u0422\u0430\u0431\u043b\u0438\u0446\u0430 \u043d\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u0439 \u0441\u043a\u0440\u043e\u043b\u043b\u0438\u043d\u0433\")\n\n            # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u043f\u0435\u0440\u0432\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438\n            ztp_templates_tab.check_templates_table_first_row_visibility()\n\n    def test_templates_modal_window_content(self, browser: Page) -> None:\n        \"\"\"\u0422\u0435\u0441\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0433\u043e \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430 \u0448\u0430\u0431\u043b\u043e\u043d\u0430.\n\n        \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442:\n        1. \u041e\u0442\u043a\u0440\u044b\u0442\u0438\u0435 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430 \u043f\u0440\u0438 \u043a\u043b\u0438\u043a\u0435 \u043d\u0430 \u0441\u0442\u0440\u043e\u043a\u0443 \u0442\u0430\u0431\u043b\u0438\u0446\u044b\n        2. \u041d\u0430\u043b\u0438\u0447\u0438\u0435 \u0438 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430\n        3. \u041d\u0430\u043b\u0438\u0447\u0438\u0435 \u0442\u0443\u043b\u0431\u0430\u0440\u0430 \u0432 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u043c \u043e\u043a\u043d\u0435\n        4. \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043a\u043d\u043e\u043f\u043a\u0438 \u0437\u0430\u043a\u0440\u044b\u0442\u0438\u044f \u0438 \u0435\u0451 \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0438\n        5. \u0417\u0430\u043a\u0440\u044b\u0442\u0438\u0435 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430\n        \"\"\"\n        # \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u0448\u0430\u0431\u043b\u043e\u043d\u043e\u0432\n        ztp_templates_tab = ZTPTemplatesTab(browser)\n\n        # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043d\u0430\u043b\u0438\u0447\u0438\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0448\u0430\u0431\u043b\u043e\u043d\u043e\u0432\n        ztp_templates_tab.should_be_templates_table()\n\n        # \u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0437\u0430\u0434\u0435\u0440\u0436\u043a\u0443 \u0434\u043b\u044f \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u0434\u0430\u043d\u043d\u044b\u0445\n        browser.wait_for_timeout(2000)\n\n        # \u041e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u043c \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043a\u043d\u043e, \u043a\u043b\u0438\u043a\u0430\u044f \u043d\u0430 \u043f\u0435\u0440\u0432\u0443\u044e \u0441\u0442\u0440\u043e\u043a\u0443 \u0442\u0430\u0431\u043b\u0438\u0446\u044b\n        template_name = ztp_templates_tab.open_template_modal_by_index(0)\n\n        # \u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0437\u0430\u0434\u0435\u0440\u0436\u043a\u0443 \u0434\u043b\u044f \u043e\u0442\u043a\u0440\u044b\u0442\u0438\u044f \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430\n        browser.wait_for_timeout(1000)\n\n        # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043e\u0442\u043a\u0440\u044b\u0442\u0438\u044f \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430\n        ztp_templates_tab.should_be_modal_window()\n\n        # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0433\u043e \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430\n        ztp_templates_tab.check_templates_modal_content(template_name)\n\n        # \u0417\u0430\u043a\u0440\u044b\u0442\u0438\u0435 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430 \u0447\u0435\u0440\u0435\u0437 \u043a\u043d\u043e\u043f\u043a\u0443 \u0437\u0430\u043a\u0440\u044b\u0442\u0438\u044f\n        ztp_templates_tab.close_modal_window_by_toolbar_button(template_name)\n\n        # \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c, \u0447\u0442\u043e \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043a\u043d\u043e \u0437\u0430\u043a\u0440\u044b\u043b\u043e\u0441\u044c\n        ztp_templates_tab.should_not_be_modal_window()\n\n    #@pytest.mark.skip(reason=\" \u0412\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u043e \u0438\u0437 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f\")\n    def test_templates_modal_window_scrolling(self, browser: Page) -> None:\n        \"\"\"\u0422\u0435\u0441\u0442 \u0441\u043a\u0440\u043e\u043b\u043b\u0438\u043d\u0433\u0430 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430 \u0448\u0430\u0431\u043b\u043e\u043d\u0430.\n\n        \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442:\n        1. \u041e\u0442\u043a\u0440\u044b\u0442\u0438\u0435 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430 \u043f\u0440\u0438 \u043a\u043b\u0438\u043a\u0435 \u043d\u0430 \u0441\u0442\u0440\u043e\u043a\u0443 \u0442\u0430\u0431\u043b\u0438\u0446\u044b\n        2. \u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0441\u043a\u0440\u043e\u043b\u043b\u0438\u043d\u0433\u0430 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0433\u043e \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430\n        3. \u0417\u0430\u043a\u0440\u044b\u0442\u0438\u0435 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430\n        \"\"\"\n\n        # \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u0448\u0430\u0431\u043b\u043e\u043d\u043e\u0432\n        ztp_templates_tab = ZTPTemplatesTab(browser)\n\n        # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043d\u0430\u043b\u0438\u0447\u0438\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0448\u0430\u0431\u043b\u043e\u043d\u043e\u0432\n        ztp_templates_tab.should_be_templates_table()\n\n        # \u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0437\u0430\u0434\u0435\u0440\u0436\u043a\u0443 \u0434\u043b\u044f \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u0434\u0430\u043d\u043d\u044b\u0445\n        browser.wait_for_timeout(2000)\n\n        # \u041e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u043c \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043a\u043d\u043e, \u043a\u043b\u0438\u043a\u0430\u044f \u043d\u0430 \u043f\u0435\u0440\u0432\u0443\u044e \u0441\u0442\u0440\u043e\u043a\u0443 \u0442\u0430\u0431\u043b\u0438\u0446\u044b\n        template_name = ztp_templates_tab.open_template_modal_by_index(0)\n\n        # \u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0437\u0430\u0434\u0435\u0440\u0436\u043a\u0443 \u0434\u043b\u044f \u043e\u0442\u043a\u0440\u044b\u0442\u0438\u044f \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430\n        browser.wait_for_timeout(1000)\n\n        # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043e\u0442\u043a\u0440\u044b\u0442\u0438\u044f \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430\n        ztp_templates_tab.should_be_modal_window()\n\n        # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0441\u043a\u0440\u043e\u043b\u043b\u0438\u043d\u0433\u0430 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430\n        is_scrollable = ztp_templates_tab.check_modal_vertical_scrolling()\n\n        if is_scrollable:\n            print(\"\u041c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043a\u043d\u043e \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u0439 \u0441\u043a\u0440\u043e\u043b\u043b\u0438\u043d\u0433\")\n\n            # \u041f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0430 \u0432\u043d\u0438\u0437\n            ztp_templates_tab.scroll_modal_down()\n            browser.wait_for_timeout(1000)\n\n            # \u041f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0430 \u0432\u0432\u0435\u0440\u0445\n            ztp_templates_tab.scroll_modal_up()\n            browser.wait_for_timeout(1000)\n        else:\n            print(\"\u041c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043a\u043d\u043e \u043d\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u0439 \u0441\u043a\u0440\u043e\u043b\u043b\u0438\u043d\u0433\")\n\n        # \u0417\u0430\u043a\u0440\u044b\u0442\u0438\u0435 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430 \u0447\u0435\u0440\u0435\u0437 \u043a\u043d\u043e\u043f\u043a\u0443 \u0437\u0430\u043a\u0440\u044b\u0442\u0438\u044f\n        ztp_templates_tab.close_modal_window_by_toolbar_button(template_name)\n\n        # \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c, \u0447\u0442\u043e \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043a\u043d\u043e \u0437\u0430\u043a\u0440\u044b\u043b\u043e\u0441\u044c\n        ztp_templates_tab.should_not_be_modal_window()\n\n    #@pytest.mark.skip(reason=\" \u0412\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u043e \u0438\u0437 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f\")\n    def test_templates_modal_window_api_data_consistency(self, browser: Page) -> None:\n        \"\"\"\u0422\u0435\u0441\u0442 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430 \u0448\u0430\u0431\u043b\u043e\u043d\u0430 \u0434\u0430\u043d\u043d\u044b\u043c \u0438\u0437 API.\n\n        \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043a\u043e\u043d\u0441\u0438\u0441\u0442\u0435\u043d\u0442\u043d\u043e\u0441\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0445 \u043c\u0435\u0436\u0434\u0443 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u043e\u043c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0438 API:\n        1. \u041e\u0442\u043a\u0440\u044b\u0442\u0438\u0435 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430 \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0430 \u0448\u0430\u0431\u043b\u043e\u043d\u0430 \u043f\u043e \u043a\u043b\u0438\u043a\u0443 \u043d\u0430 \u0441\u0442\u0440\u043e\u043a\u0443 \u0442\u0430\u0431\u043b\u0438\u0446\u044b\n        2. \u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0438 \u0432\u0430\u043b\u0438\u0434\u0430\u0446\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445 \u0438\u0437 \u043f\u043e\u043b\u0435\u0439 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430\n        3. \u0421\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 UI \u0441 \u044d\u0442\u0430\u043b\u043e\u043d\u043d\u044b\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u0438\u0437 API \u0437\u0430\u043f\u0440\u043e\u0441\u0430\n        4. \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0441\u0442\u0438 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0432\u0441\u0435\u0445 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 \u0448\u0430\u0431\u043b\u043e\u043d\u0430\n        5. \u0417\u0430\u043a\u0440\u044b\u0442\u0438\u0435 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430 \u043f\u043e\u0441\u043b\u0435 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438\n\n        Args:\n            browser (Page): \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright \u0434\u043b\u044f \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0441 UI.\n        \"\"\"\n        # \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u0448\u0430\u0431\u043b\u043e\u043d\u043e\u0432\n        ztp_templates_tab = ZTPTemplatesTab(browser)\n\n        # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043d\u0430\u043b\u0438\u0447\u0438\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0448\u0430\u0431\u043b\u043e\u043d\u043e\u0432\n        ztp_templates_tab.should_be_templates_table()\n\n        # \u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0437\u0430\u0434\u0435\u0440\u0436\u043a\u0443 \u0434\u043b\u044f \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u0434\u0430\u043d\u043d\u044b\u0445\n        browser.wait_for_timeout(5000)\n\n        # \u041e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u043c \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043a\u043d\u043e, \u043a\u043b\u0438\u043a\u0430\u044f \u043d\u0430 \u043f\u0435\u0440\u0432\u0443\u044e \u0441\u0442\u0440\u043e\u043a\u0443 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0438 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c \u0438\u043c\u044f \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430\n        template_name = ztp_templates_tab.open_template_modal_by_index(0)\n\n        # \u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0437\u0430\u0434\u0435\u0440\u0436\u043a\u0443 \u0434\u043b\u044f \u043e\u0442\u043a\u0440\u044b\u0442\u0438\u044f \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430\n        browser.wait_for_timeout(2000)\n\n        # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043e\u0442\u043a\u0440\u044b\u0442\u0438\u044f \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430\n        ztp_templates_tab.should_be_modal_window()\n\n        # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430 \u0434\u0430\u043d\u043d\u044b\u043c \u0438\u0437 API\n        ztp_templates_tab.verify_template_data_with_api(template_name)\n\n        # \u0417\u0430\u043a\u0440\u044b\u0442\u0438\u0435 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430 \u0447\u0435\u0440\u0435\u0437 \u043a\u043d\u043e\u043f\u043a\u0443 \u0437\u0430\u043a\u0440\u044b\u0442\u0438\u044f\n        ztp_templates_tab.close_modal_window_by_toolbar_button(template_name)\n\n        # \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c, \u0447\u0442\u043e \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043a\u043d\u043e \u0437\u0430\u043a\u0440\u044b\u043b\u043e\u0441\u044c\n        ztp_templates_tab.should_not_be_modal_window()\n
    "},{"location":"tests/e2e/test_ztp_templates_tab/#tests.e2e.test_ztp_templates_tab.TestZTPTemplatesTab.setup","title":"setup(browser)","text":"

    \u0424\u0438\u043a\u0441\u0442\u0443\u0440\u0430 \u0434\u043b\u044f \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0438 \u0442\u0435\u0441\u0442\u043e\u0432\u043e\u0433\u043e \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f.

    \u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442: 1. \u0410\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u044e \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0435 2. \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u043d\u0430 \u0432\u043a\u043b\u0430\u0434\u043a\u0443 '\u0428\u0430\u0431\u043b\u043e\u043d\u044b' \u0447\u0435\u0440\u0435\u0437 \u043f\u0430\u043d\u0435\u043b\u044c \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438

    Source code in tests\\e2e\\test_ztp_templates_tab.py
    @pytest.fixture(scope=\"function\", autouse=True)\ndef setup(self, browser: Page) -> None:\n    \"\"\"\u0424\u0438\u043a\u0441\u0442\u0443\u0440\u0430 \u0434\u043b\u044f \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0438 \u0442\u0435\u0441\u0442\u043e\u0432\u043e\u0433\u043e \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f.\n\n    \u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442:\n    1. \u0410\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u044e \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0435\n    2. \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u043d\u0430 \u0432\u043a\u043b\u0430\u0434\u043a\u0443 '\u0428\u0430\u0431\u043b\u043e\u043d\u044b' \u0447\u0435\u0440\u0435\u0437 \u043f\u0430\u043d\u0435\u043b\u044c \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438\n    \"\"\"\n    # \u0410\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u044f \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0435\n    login_page = LoginPage(browser)\n    login_page.do_login()\n\n    # \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0433\u043b\u0430\u0432\u043d\u043e\u0439 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b\n    main_page = MainPage(browser)\n\n    # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0438 \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u0441 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u043c\u0438 \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438\n    main_page.should_be_navigation_panel()\n    main_page.click_main_navigation_panel_item(\"\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438\")\n    main_page.click_subpanel_item(\"Zero Touch Provisioning\")\n    main_page.click_subpanel_item(\"\u0428\u0430\u0431\u043b\u043e\u043d\u044b\", parent=\"Zero Touch Provisioning\")\n    main_page.wait_for_timeout(5000)\n
    "},{"location":"tests/e2e/test_ztp_templates_tab/#tests.e2e.test_ztp_templates_tab.TestZTPTemplatesTab.test_templates_modal_window_api_data_consistency","title":"test_templates_modal_window_api_data_consistency(browser)","text":"

    \u0422\u0435\u0441\u0442 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430 \u0448\u0430\u0431\u043b\u043e\u043d\u0430 \u0434\u0430\u043d\u043d\u044b\u043c \u0438\u0437 API.

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043a\u043e\u043d\u0441\u0438\u0441\u0442\u0435\u043d\u0442\u043d\u043e\u0441\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0445 \u043c\u0435\u0436\u0434\u0443 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u043e\u043c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0438 API: 1. \u041e\u0442\u043a\u0440\u044b\u0442\u0438\u0435 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430 \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0430 \u0448\u0430\u0431\u043b\u043e\u043d\u0430 \u043f\u043e \u043a\u043b\u0438\u043a\u0443 \u043d\u0430 \u0441\u0442\u0440\u043e\u043a\u0443 \u0442\u0430\u0431\u043b\u0438\u0446\u044b 2. \u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0438 \u0432\u0430\u043b\u0438\u0434\u0430\u0446\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445 \u0438\u0437 \u043f\u043e\u043b\u0435\u0439 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430 3. \u0421\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 UI \u0441 \u044d\u0442\u0430\u043b\u043e\u043d\u043d\u044b\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u0438\u0437 API \u0437\u0430\u043f\u0440\u043e\u0441\u0430 4. \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0441\u0442\u0438 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0432\u0441\u0435\u0445 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 \u0448\u0430\u0431\u043b\u043e\u043d\u0430 5. \u0417\u0430\u043a\u0440\u044b\u0442\u0438\u0435 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430 \u043f\u043e\u0441\u043b\u0435 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438

    Parameters:

    Name Type Description Default browser Page

    \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright \u0434\u043b\u044f \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0441 UI.

    required Source code in tests\\e2e\\test_ztp_templates_tab.py
    def test_templates_modal_window_api_data_consistency(self, browser: Page) -> None:\n    \"\"\"\u0422\u0435\u0441\u0442 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430 \u0448\u0430\u0431\u043b\u043e\u043d\u0430 \u0434\u0430\u043d\u043d\u044b\u043c \u0438\u0437 API.\n\n    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043a\u043e\u043d\u0441\u0438\u0441\u0442\u0435\u043d\u0442\u043d\u043e\u0441\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0445 \u043c\u0435\u0436\u0434\u0443 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u043e\u043c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0438 API:\n    1. \u041e\u0442\u043a\u0440\u044b\u0442\u0438\u0435 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430 \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0430 \u0448\u0430\u0431\u043b\u043e\u043d\u0430 \u043f\u043e \u043a\u043b\u0438\u043a\u0443 \u043d\u0430 \u0441\u0442\u0440\u043e\u043a\u0443 \u0442\u0430\u0431\u043b\u0438\u0446\u044b\n    2. \u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0438 \u0432\u0430\u043b\u0438\u0434\u0430\u0446\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445 \u0438\u0437 \u043f\u043e\u043b\u0435\u0439 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430\n    3. \u0421\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 UI \u0441 \u044d\u0442\u0430\u043b\u043e\u043d\u043d\u044b\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u0438\u0437 API \u0437\u0430\u043f\u0440\u043e\u0441\u0430\n    4. \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0441\u0442\u0438 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0432\u0441\u0435\u0445 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 \u0448\u0430\u0431\u043b\u043e\u043d\u0430\n    5. \u0417\u0430\u043a\u0440\u044b\u0442\u0438\u0435 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430 \u043f\u043e\u0441\u043b\u0435 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438\n\n    Args:\n        browser (Page): \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright \u0434\u043b\u044f \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0441 UI.\n    \"\"\"\n    # \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u0448\u0430\u0431\u043b\u043e\u043d\u043e\u0432\n    ztp_templates_tab = ZTPTemplatesTab(browser)\n\n    # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043d\u0430\u043b\u0438\u0447\u0438\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0448\u0430\u0431\u043b\u043e\u043d\u043e\u0432\n    ztp_templates_tab.should_be_templates_table()\n\n    # \u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0437\u0430\u0434\u0435\u0440\u0436\u043a\u0443 \u0434\u043b\u044f \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u0434\u0430\u043d\u043d\u044b\u0445\n    browser.wait_for_timeout(5000)\n\n    # \u041e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u043c \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043a\u043d\u043e, \u043a\u043b\u0438\u043a\u0430\u044f \u043d\u0430 \u043f\u0435\u0440\u0432\u0443\u044e \u0441\u0442\u0440\u043e\u043a\u0443 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0438 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c \u0438\u043c\u044f \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430\n    template_name = ztp_templates_tab.open_template_modal_by_index(0)\n\n    # \u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0437\u0430\u0434\u0435\u0440\u0436\u043a\u0443 \u0434\u043b\u044f \u043e\u0442\u043a\u0440\u044b\u0442\u0438\u044f \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430\n    browser.wait_for_timeout(2000)\n\n    # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043e\u0442\u043a\u0440\u044b\u0442\u0438\u044f \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430\n    ztp_templates_tab.should_be_modal_window()\n\n    # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430 \u0434\u0430\u043d\u043d\u044b\u043c \u0438\u0437 API\n    ztp_templates_tab.verify_template_data_with_api(template_name)\n\n    # \u0417\u0430\u043a\u0440\u044b\u0442\u0438\u0435 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430 \u0447\u0435\u0440\u0435\u0437 \u043a\u043d\u043e\u043f\u043a\u0443 \u0437\u0430\u043a\u0440\u044b\u0442\u0438\u044f\n    ztp_templates_tab.close_modal_window_by_toolbar_button(template_name)\n\n    # \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c, \u0447\u0442\u043e \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043a\u043d\u043e \u0437\u0430\u043a\u0440\u044b\u043b\u043e\u0441\u044c\n    ztp_templates_tab.should_not_be_modal_window()\n
    "},{"location":"tests/e2e/test_ztp_templates_tab/#tests.e2e.test_ztp_templates_tab.TestZTPTemplatesTab.test_templates_modal_window_content","title":"test_templates_modal_window_content(browser)","text":"

    \u0422\u0435\u0441\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0433\u043e \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430 \u0448\u0430\u0431\u043b\u043e\u043d\u0430.

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442: 1. \u041e\u0442\u043a\u0440\u044b\u0442\u0438\u0435 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430 \u043f\u0440\u0438 \u043a\u043b\u0438\u043a\u0435 \u043d\u0430 \u0441\u0442\u0440\u043e\u043a\u0443 \u0442\u0430\u0431\u043b\u0438\u0446\u044b 2. \u041d\u0430\u043b\u0438\u0447\u0438\u0435 \u0438 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430 3. \u041d\u0430\u043b\u0438\u0447\u0438\u0435 \u0442\u0443\u043b\u0431\u0430\u0440\u0430 \u0432 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u043c \u043e\u043a\u043d\u0435 4. \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043a\u043d\u043e\u043f\u043a\u0438 \u0437\u0430\u043a\u0440\u044b\u0442\u0438\u044f \u0438 \u0435\u0451 \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0438 5. \u0417\u0430\u043a\u0440\u044b\u0442\u0438\u0435 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430

    Source code in tests\\e2e\\test_ztp_templates_tab.py
    def test_templates_modal_window_content(self, browser: Page) -> None:\n    \"\"\"\u0422\u0435\u0441\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0433\u043e \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430 \u0448\u0430\u0431\u043b\u043e\u043d\u0430.\n\n    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442:\n    1. \u041e\u0442\u043a\u0440\u044b\u0442\u0438\u0435 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430 \u043f\u0440\u0438 \u043a\u043b\u0438\u043a\u0435 \u043d\u0430 \u0441\u0442\u0440\u043e\u043a\u0443 \u0442\u0430\u0431\u043b\u0438\u0446\u044b\n    2. \u041d\u0430\u043b\u0438\u0447\u0438\u0435 \u0438 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430\n    3. \u041d\u0430\u043b\u0438\u0447\u0438\u0435 \u0442\u0443\u043b\u0431\u0430\u0440\u0430 \u0432 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u043c \u043e\u043a\u043d\u0435\n    4. \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043a\u043d\u043e\u043f\u043a\u0438 \u0437\u0430\u043a\u0440\u044b\u0442\u0438\u044f \u0438 \u0435\u0451 \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0438\n    5. \u0417\u0430\u043a\u0440\u044b\u0442\u0438\u0435 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430\n    \"\"\"\n    # \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u0448\u0430\u0431\u043b\u043e\u043d\u043e\u0432\n    ztp_templates_tab = ZTPTemplatesTab(browser)\n\n    # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043d\u0430\u043b\u0438\u0447\u0438\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0448\u0430\u0431\u043b\u043e\u043d\u043e\u0432\n    ztp_templates_tab.should_be_templates_table()\n\n    # \u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0437\u0430\u0434\u0435\u0440\u0436\u043a\u0443 \u0434\u043b\u044f \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u0434\u0430\u043d\u043d\u044b\u0445\n    browser.wait_for_timeout(2000)\n\n    # \u041e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u043c \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043a\u043d\u043e, \u043a\u043b\u0438\u043a\u0430\u044f \u043d\u0430 \u043f\u0435\u0440\u0432\u0443\u044e \u0441\u0442\u0440\u043e\u043a\u0443 \u0442\u0430\u0431\u043b\u0438\u0446\u044b\n    template_name = ztp_templates_tab.open_template_modal_by_index(0)\n\n    # \u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0437\u0430\u0434\u0435\u0440\u0436\u043a\u0443 \u0434\u043b\u044f \u043e\u0442\u043a\u0440\u044b\u0442\u0438\u044f \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430\n    browser.wait_for_timeout(1000)\n\n    # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043e\u0442\u043a\u0440\u044b\u0442\u0438\u044f \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430\n    ztp_templates_tab.should_be_modal_window()\n\n    # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0433\u043e \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430\n    ztp_templates_tab.check_templates_modal_content(template_name)\n\n    # \u0417\u0430\u043a\u0440\u044b\u0442\u0438\u0435 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430 \u0447\u0435\u0440\u0435\u0437 \u043a\u043d\u043e\u043f\u043a\u0443 \u0437\u0430\u043a\u0440\u044b\u0442\u0438\u044f\n    ztp_templates_tab.close_modal_window_by_toolbar_button(template_name)\n\n    # \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c, \u0447\u0442\u043e \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043a\u043d\u043e \u0437\u0430\u043a\u0440\u044b\u043b\u043e\u0441\u044c\n    ztp_templates_tab.should_not_be_modal_window()\n
    "},{"location":"tests/e2e/test_ztp_templates_tab/#tests.e2e.test_ztp_templates_tab.TestZTPTemplatesTab.test_templates_modal_window_scrolling","title":"test_templates_modal_window_scrolling(browser)","text":"

    \u0422\u0435\u0441\u0442 \u0441\u043a\u0440\u043e\u043b\u043b\u0438\u043d\u0433\u0430 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430 \u0448\u0430\u0431\u043b\u043e\u043d\u0430.

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442: 1. \u041e\u0442\u043a\u0440\u044b\u0442\u0438\u0435 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430 \u043f\u0440\u0438 \u043a\u043b\u0438\u043a\u0435 \u043d\u0430 \u0441\u0442\u0440\u043e\u043a\u0443 \u0442\u0430\u0431\u043b\u0438\u0446\u044b 2. \u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0441\u043a\u0440\u043e\u043b\u043b\u0438\u043d\u0433\u0430 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0433\u043e \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430 3. \u0417\u0430\u043a\u0440\u044b\u0442\u0438\u0435 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430

    Source code in tests\\e2e\\test_ztp_templates_tab.py
    def test_templates_modal_window_scrolling(self, browser: Page) -> None:\n    \"\"\"\u0422\u0435\u0441\u0442 \u0441\u043a\u0440\u043e\u043b\u043b\u0438\u043d\u0433\u0430 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430 \u0448\u0430\u0431\u043b\u043e\u043d\u0430.\n\n    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442:\n    1. \u041e\u0442\u043a\u0440\u044b\u0442\u0438\u0435 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430 \u043f\u0440\u0438 \u043a\u043b\u0438\u043a\u0435 \u043d\u0430 \u0441\u0442\u0440\u043e\u043a\u0443 \u0442\u0430\u0431\u043b\u0438\u0446\u044b\n    2. \u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0441\u043a\u0440\u043e\u043b\u043b\u0438\u043d\u0433\u0430 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0433\u043e \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430\n    3. \u0417\u0430\u043a\u0440\u044b\u0442\u0438\u0435 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430\n    \"\"\"\n\n    # \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u0448\u0430\u0431\u043b\u043e\u043d\u043e\u0432\n    ztp_templates_tab = ZTPTemplatesTab(browser)\n\n    # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043d\u0430\u043b\u0438\u0447\u0438\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0448\u0430\u0431\u043b\u043e\u043d\u043e\u0432\n    ztp_templates_tab.should_be_templates_table()\n\n    # \u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0437\u0430\u0434\u0435\u0440\u0436\u043a\u0443 \u0434\u043b\u044f \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u0434\u0430\u043d\u043d\u044b\u0445\n    browser.wait_for_timeout(2000)\n\n    # \u041e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u043c \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043a\u043d\u043e, \u043a\u043b\u0438\u043a\u0430\u044f \u043d\u0430 \u043f\u0435\u0440\u0432\u0443\u044e \u0441\u0442\u0440\u043e\u043a\u0443 \u0442\u0430\u0431\u043b\u0438\u0446\u044b\n    template_name = ztp_templates_tab.open_template_modal_by_index(0)\n\n    # \u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0437\u0430\u0434\u0435\u0440\u0436\u043a\u0443 \u0434\u043b\u044f \u043e\u0442\u043a\u0440\u044b\u0442\u0438\u044f \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430\n    browser.wait_for_timeout(1000)\n\n    # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043e\u0442\u043a\u0440\u044b\u0442\u0438\u044f \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430\n    ztp_templates_tab.should_be_modal_window()\n\n    # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0441\u043a\u0440\u043e\u043b\u043b\u0438\u043d\u0433\u0430 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430\n    is_scrollable = ztp_templates_tab.check_modal_vertical_scrolling()\n\n    if is_scrollable:\n        print(\"\u041c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043a\u043d\u043e \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u0439 \u0441\u043a\u0440\u043e\u043b\u043b\u0438\u043d\u0433\")\n\n        # \u041f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0430 \u0432\u043d\u0438\u0437\n        ztp_templates_tab.scroll_modal_down()\n        browser.wait_for_timeout(1000)\n\n        # \u041f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0430 \u0432\u0432\u0435\u0440\u0445\n        ztp_templates_tab.scroll_modal_up()\n        browser.wait_for_timeout(1000)\n    else:\n        print(\"\u041c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043a\u043d\u043e \u043d\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u0439 \u0441\u043a\u0440\u043e\u043b\u043b\u0438\u043d\u0433\")\n\n    # \u0417\u0430\u043a\u0440\u044b\u0442\u0438\u0435 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430 \u0447\u0435\u0440\u0435\u0437 \u043a\u043d\u043e\u043f\u043a\u0443 \u0437\u0430\u043a\u0440\u044b\u0442\u0438\u044f\n    ztp_templates_tab.close_modal_window_by_toolbar_button(template_name)\n\n    # \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c, \u0447\u0442\u043e \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043a\u043d\u043e \u0437\u0430\u043a\u0440\u044b\u043b\u043e\u0441\u044c\n    ztp_templates_tab.should_not_be_modal_window()\n
    "},{"location":"tests/e2e/test_ztp_templates_tab/#tests.e2e.test_ztp_templates_tab.TestZTPTemplatesTab.test_templates_tab_content","title":"test_templates_tab_content(browser)","text":"

    \u0422\u0435\u0441\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0433\u043e \u0432\u043a\u043b\u0430\u0434\u043a\u0438 '\u0428\u0430\u0431\u043b\u043e\u043d\u044b'.

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442: 1. \u041d\u0430\u043b\u0438\u0447\u0438\u0435 \u0438 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0441\u0442\u044c \u0442\u0443\u043b\u0431\u0430\u0440\u0430 2. \u041d\u0430\u043b\u0438\u0447\u0438\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0448\u0430\u0431\u043b\u043e\u043d\u043e\u0432 3. \u0421\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0433\u043e \u0442\u0430\u0431\u043b\u0438\u0446\u044b

    Source code in tests\\e2e\\test_ztp_templates_tab.py
    def test_templates_tab_content(self, browser: Page) -> None:\n    \"\"\"\u0422\u0435\u0441\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0433\u043e \u0432\u043a\u043b\u0430\u0434\u043a\u0438 '\u0428\u0430\u0431\u043b\u043e\u043d\u044b'.\n\n    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442:\n    1. \u041d\u0430\u043b\u0438\u0447\u0438\u0435 \u0438 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0441\u0442\u044c \u0442\u0443\u043b\u0431\u0430\u0440\u0430\n    2. \u041d\u0430\u043b\u0438\u0447\u0438\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0448\u0430\u0431\u043b\u043e\u043d\u043e\u0432\n    3. \u0421\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0433\u043e \u0442\u0430\u0431\u043b\u0438\u0446\u044b\n    \"\"\"\n    # \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u0441\u0435\u0430\u043d\u0441\u043e\u0432\n    ztp_templates_tab = ZTPTemplatesTab(browser)\n\n    # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0442\u0443\u043b\u0431\u0430\u0440\u0430 \u0432\u043a\u043b\u0430\u0434\u043a\u0438\n    ztp_templates_tab.should_be_toolbar()\n\n    # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043d\u0430\u043b\u0438\u0447\u0438\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0448\u0430\u0431\u043b\u043e\u043d\u043e\u0432\n    ztp_templates_tab.should_be_templates_table()\n\n    browser.wait_for_timeout(5000)\n\n    # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0433\u043e \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0448\u0430\u0431\u043b\u043e\u043d\u043e\u0432\n    ztp_templates_tab.check_templates_table_content()\n
    "},{"location":"tests/e2e/test_ztp_templates_tab/#tests.e2e.test_ztp_templates_tab.TestZTPTemplatesTab.test_templates_table_row_highlighting","title":"test_templates_table_row_highlighting(browser)","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0441\u0442\u0440\u043e\u043a \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435 \u0448\u0430\u0431\u043b\u043e\u043d\u043e\u0432.

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0441\u0442\u044c \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0441\u0442\u0440\u043e\u043a \u043f\u0440\u0438 \u043a\u043b\u0438\u043a\u0435 \u043d\u0430 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0435 \u043f\u043e\u0437\u0438\u0446\u0438\u0438: 1. \u041f\u0435\u0440\u0432\u0430\u044f \u0441\u0442\u0440\u043e\u043a\u0430 2. \u041f\u043e\u0441\u043b\u0435\u0434\u043d\u044f\u044f \u0441\u0442\u0440\u043e\u043a\u0430 3. \u0421\u0442\u0440\u043e\u043a\u0430 \u0432 \u0441\u0435\u0440\u0435\u0434\u0438\u043d\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u044b

    Source code in tests\\e2e\\test_ztp_templates_tab.py
    def test_templates_table_row_highlighting(self, browser: Page) -> None:\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0441\u0442\u0440\u043e\u043a \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435 \u0448\u0430\u0431\u043b\u043e\u043d\u043e\u0432.\n\n    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0441\u0442\u044c \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0441\u0442\u0440\u043e\u043a \u043f\u0440\u0438 \u043a\u043b\u0438\u043a\u0435 \u043d\u0430 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0435 \u043f\u043e\u0437\u0438\u0446\u0438\u0438:\n    1. \u041f\u0435\u0440\u0432\u0430\u044f \u0441\u0442\u0440\u043e\u043a\u0430\n    2. \u041f\u043e\u0441\u043b\u0435\u0434\u043d\u044f\u044f \u0441\u0442\u0440\u043e\u043a\u0430\n    3. \u0421\u0442\u0440\u043e\u043a\u0430 \u0432 \u0441\u0435\u0440\u0435\u0434\u0438\u043d\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u044b\n    \"\"\"\n\n    ztp_templates_tab = ZTPTemplatesTab(browser)\n\n    # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0442\u0443\u043b\u0431\u0430\u0440\u0430 \u0432\u043a\u043b\u0430\u0434\u043a\u0438\n    ztp_templates_tab.should_be_toolbar()\n\n    # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043d\u0430\u043b\u0438\u0447\u0438\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0448\u0430\u0431\u043b\u043e\u043d\u043e\u0432\n    ztp_templates_tab.should_be_templates_table()\n\n    # \u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0430 \u0441\u0442\u0440\u043e\u043a \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435\n    rows_count = ztp_templates_tab.get_rows_count()\n\n    # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0441\u0442\u0440\u043e\u043a\n    ztp_templates_tab.check_templates_table_row_highlighting(0)\n    ztp_templates_tab.check_templates_table_row_highlighting(rows_count - 1)\n    ztp_templates_tab.check_templates_table_row_highlighting(int(rows_count / 2))\n
    "},{"location":"tests/e2e/test_ztp_templates_tab/#tests.e2e.test_ztp_templates_tab.TestZTPTemplatesTab.test_templates_table_scrolling","title":"test_templates_table_scrolling(browser)","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0441\u043a\u0440\u043e\u043b\u043b\u0438\u043d\u0433\u0430 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0448\u0430\u0431\u043b\u043e\u043d\u043e\u0432.

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442: 1. \u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u0439 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u044b 2. \u0412\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u0441\u0442\u0440\u043e\u043a \u043f\u043e\u0441\u043b\u0435 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0438 \u0432\u043d\u0438\u0437 \u0438 \u0432\u0432\u0435\u0440\u0445 3. \u041a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0441\u0442\u044c \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445 \u043f\u043e\u0441\u043b\u0435 \u0441\u043a\u0440\u043e\u043b\u043b\u0438\u043d\u0433\u0430

    Source code in tests\\e2e\\test_ztp_templates_tab.py
    def test_templates_table_scrolling(self, browser: Page) -> None:\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0441\u043a\u0440\u043e\u043b\u043b\u0438\u043d\u0433\u0430 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0448\u0430\u0431\u043b\u043e\u043d\u043e\u0432.\n\n    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442:\n    1. \u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u0439 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u044b\n    2. \u0412\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u0441\u0442\u0440\u043e\u043a \u043f\u043e\u0441\u043b\u0435 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0438 \u0432\u043d\u0438\u0437 \u0438 \u0432\u0432\u0435\u0440\u0445\n    3. \u041a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0441\u0442\u044c \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445 \u043f\u043e\u0441\u043b\u0435 \u0441\u043a\u0440\u043e\u043b\u043b\u0438\u043d\u0433\u0430\n    \"\"\"\n\n    ztp_templates_tab = ZTPTemplatesTab(browser)\n\n    browser.wait_for_timeout(2000)\n\n    # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0441\u043a\u0440\u043e\u043b\u043b\u0438\u043d\u0433\u0430\n    is_scrollable = ztp_templates_tab.check_templates_table_vertical_scrolling()\n\n    if is_scrollable:\n        print(\"\u0422\u0430\u0431\u043b\u0438\u0446\u0430 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u0439 \u0441\u043a\u0440\u043e\u043b\u043b\u0438\u043d\u0433\")\n\n        # \u041f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0430 \u0432\u043d\u0438\u0437\n        ztp_templates_tab.scroll_templates_table_down()\n\n        browser.wait_for_timeout(1000)\n\n        # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0439 \u0441\u0442\u0440\u043e\u043a\u0438 \u043f\u043e\u0441\u043b\u0435 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0438\n        ztp_templates_tab.check_templates_table_last_row_visibility()\n\n        # \u041f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0430 \u0432\u0432\u0435\u0440\u0445\n        ztp_templates_tab.scroll_templates_table_up()\n\n        browser.wait_for_timeout(1000)\n\n        # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u043f\u0435\u0440\u0432\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438 \u043f\u043e\u0441\u043b\u0435 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0438\n        ztp_templates_tab.check_templates_table_first_row_visibility()\n    else:\n        print(\"\u0422\u0430\u0431\u043b\u0438\u0446\u0430 \u043d\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u0439 \u0441\u043a\u0440\u043e\u043b\u043b\u0438\u043d\u0433\")\n\n        # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u043f\u0435\u0440\u0432\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438\n        ztp_templates_tab.check_templates_table_first_row_visibility()\n
    "},{"location":"tools/fix_python_project/","title":"Python Project Fixer","text":"

    \u041c\u043e\u0434\u0443\u043b\u044c \u0438\u0441\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b Python-\u043f\u0440\u043e\u0435\u043a\u0442\u0430.

    \u0410\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442: 1. \u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 BOM-\u043c\u0430\u0440\u043a\u0435\u0440\u043e\u0432 \u0438\u0437 \u0444\u0430\u0439\u043b\u043e\u0432 2. \u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u044e\u0449\u0438\u0445 init.py 3. \u041b\u043e\u0433\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0432\u0441\u0435\u0445 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439

    \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435: python fix_python_project.py [\u043f\u0443\u0442\u044c_\u043a_\u043f\u0440\u043e\u0435\u043a\u0442\u0443]

    "},{"location":"tools/fix_python_project/#tools.fix_python_project.ProjectFixer","title":"ProjectFixer","text":"

    \u0418\u0441\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 Python-\u043f\u0440\u043e\u0435\u043a\u0442\u0430.

    \u0410\u0442\u0440\u0438\u0431\u0443\u0442\u044b

    root_dir: \u041a\u043e\u0440\u043d\u0435\u0432\u0430\u044f \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044f \u043f\u0440\u043e\u0435\u043a\u0442\u0430. log: \u041b\u043e\u0433 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u043d\u044b\u0445 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439.

    Source code in tools\\fix_python_project.py
    class ProjectFixer:\n    \"\"\"\u0418\u0441\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 Python-\u043f\u0440\u043e\u0435\u043a\u0442\u0430.\n\n    \u0410\u0442\u0440\u0438\u0431\u0443\u0442\u044b:\n        root_dir: \u041a\u043e\u0440\u043d\u0435\u0432\u0430\u044f \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044f \u043f\u0440\u043e\u0435\u043a\u0442\u0430.\n        log: \u041b\u043e\u0433 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u043d\u044b\u0445 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439.\n    \"\"\"\n\n    def __init__(self, root_dir: str = '.'):\n        \"\"\"\u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442 \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 ProjectFixer.\n\n        Args:\n            root_dir: \u041a\u043e\u0440\u043d\u0435\u0432\u0430\u044f \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044f \u043f\u0440\u043e\u0435\u043a\u0442\u0430. \u041f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e '.'.\n        \"\"\"\n\n        self.root_dir = os.path.abspath(root_dir)\n        self.log: List[str] = []\n\n    def remove_bom(self, filepath: str) -> bool:\n        \"\"\"\u0423\u0434\u0430\u043b\u044f\u0435\u0442 BOM-\u043c\u0430\u0440\u043a\u0435\u0440 \u0438\u0437 \u0444\u0430\u0439\u043b\u0430.\n\n        Args:\n            filepath: \u041f\u0443\u0442\u044c \u043a \u0444\u0430\u0439\u043b\u0443.\n\n        Returns:\n            bool: True \u0435\u0441\u043b\u0438 BOM \u0431\u044b\u043b \u0443\u0434\u0430\u043b\u0451\u043d.\n\n        Raises:\n            Exception: \u041f\u0440\u0438 \u043e\u0448\u0438\u0431\u043a\u0435 \u0447\u0442\u0435\u043d\u0438\u044f/\u0437\u0430\u043f\u0438\u0441\u0438.\n        \"\"\"\n\n        try:\n            with open(filepath, 'rb') as f:\n                content = f.read()\n\n            if content.startswith(b'\\xEF\\xBB\\xBF'):\n                with open(filepath, 'wb') as f:\n                    f.write(content[3:])\n                self.log.append(f\"REMOVED BOM: {filepath}\")\n                return True\n        except Exception as e:\n            self.log.append(f\"ERROR processing {filepath}: {str(e)}\")\n        return False\n\n    def should_skip_init(self, dir_path: str) -> bool:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0443\u0436\u043d\u043e \u043b\u0438 \u043f\u0440\u043e\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044e.\n\n        Args:\n            dir_path: \u041f\u0443\u0442\u044c \u043a \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438.\n\n        Returns:\n            bool: True \u0435\u0441\u043b\u0438 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044e \u043d\u0443\u0436\u043d\u043e \u043f\u0440\u043e\u043f\u0443\u0441\u0442\u0438\u0442\u044c.\n        \"\"\"\n\n        dir_name = os.path.basename(dir_path)\n        return (dir_name in INIT_IGNORED_DIRS or\n                dir_name.startswith('.'))\n\n    def needs_init_py(self, dir_path: str) -> bool:\n        \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0443\u0436\u043d\u043e \u043b\u0438 \u0441\u043e\u0437\u0434\u0430\u0442\u044c __init__.py.\n\n        Args:\n            dir_path: \u041f\u0443\u0442\u044c \u043a \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438.\n\n        Returns:\n            bool: True \u0435\u0441\u043b\u0438 __init__.py \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f.\n        \"\"\"\n\n        if self.should_skip_init(dir_path):\n            return False\n\n        try:\n            items = os.listdir(dir_path)\n            has_py_files = any(f.endswith('.py') and f != '__init__.py' for f in items)\n            has_init = '__init__.py' in items\n            return has_py_files and not has_init\n        except Exception:\n            return False\n\n    def create_init_py(self, dir_path: str) -> bool:\n        \"\"\"\u0421\u043e\u0437\u0434\u0430\u0451\u0442 \u0444\u0430\u0439\u043b __init__.py.\n\n        Args:\n            dir_path: \u041f\u0443\u0442\u044c \u043a \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438.\n\n        Returns:\n            bool: True \u0435\u0441\u043b\u0438 \u0444\u0430\u0439\u043b \u0441\u043e\u0437\u0434\u0430\u043d.\n\n        Raises:\n            Exception: \u041f\u0440\u0438 \u043e\u0448\u0438\u0431\u043a\u0435 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f.\n        \"\"\"\n\n        init_path = os.path.join(dir_path, '__init__.py')\n        try:\n            with open(init_path, 'w', encoding='utf-8') as f:\n                f.write(INIT_TEMPLATE)\n            self.log.append(f\"CREATED INIT: {init_path}\")\n            return True\n        except Exception as e:\n            self.log.append(f\"ERROR creating {init_path}: {str(e)}\")\n            return False\n\n    def process_directory(self):\n        \"\"\"\u0420\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u043e \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442 \u043f\u0440\u043e\u0435\u043a\u0442.\"\"\"\n\n        for root, dirs, files in os.walk(self.root_dir):\n            # \u041e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0444\u0430\u0439\u043b\u043e\u0432 \u0441 \u0446\u0435\u043b\u0435\u0432\u044b\u043c\u0438 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f\u043c\u0438\n            for file in files:\n                if file.endswith(TARGET_EXTENSIONS):\n                    self.remove_bom(os.path.join(root, file))\n\n            # \u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 __init__.py \u0433\u0434\u0435 \u044d\u0442\u043e \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\n            if self.needs_init_py(root):\n                self.create_init_py(root)\n\n    def save_log(self, log_file: str = 'project_fix.log'):\n        \"\"\"\u0421\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u0442 \u043b\u043e\u0433 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 \u0432 \u0444\u0430\u0439\u043b.\n\n        Args:\n            log_file: \u0418\u043c\u044f \u0444\u0430\u0439\u043b\u0430 \u043b\u043e\u0433\u0430. \u041f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e 'project_fix.log'.\n        \"\"\"\n\n        with open(log_file, 'w', encoding='utf-8') as f:\n            f.write(\"\\n\".join(self.log))\n
    "},{"location":"tools/fix_python_project/#tools.fix_python_project.ProjectFixer.__init__","title":"__init__(root_dir='.')","text":"

    \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442 \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 ProjectFixer.

    Parameters:

    Name Type Description Default root_dir str

    \u041a\u043e\u0440\u043d\u0435\u0432\u0430\u044f \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044f \u043f\u0440\u043e\u0435\u043a\u0442\u0430. \u041f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e '.'.

    '.' Source code in tools\\fix_python_project.py
    def __init__(self, root_dir: str = '.'):\n    \"\"\"\u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442 \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 ProjectFixer.\n\n    Args:\n        root_dir: \u041a\u043e\u0440\u043d\u0435\u0432\u0430\u044f \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044f \u043f\u0440\u043e\u0435\u043a\u0442\u0430. \u041f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e '.'.\n    \"\"\"\n\n    self.root_dir = os.path.abspath(root_dir)\n    self.log: List[str] = []\n
    "},{"location":"tools/fix_python_project/#tools.fix_python_project.ProjectFixer.create_init_py","title":"create_init_py(dir_path)","text":"

    \u0421\u043e\u0437\u0434\u0430\u0451\u0442 \u0444\u0430\u0439\u043b init.py.

    Parameters:

    Name Type Description Default dir_path str

    \u041f\u0443\u0442\u044c \u043a \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438.

    required

    Returns:

    Name Type Description bool bool

    True \u0435\u0441\u043b\u0438 \u0444\u0430\u0439\u043b \u0441\u043e\u0437\u0434\u0430\u043d.

    Raises:

    Type Description Exception

    \u041f\u0440\u0438 \u043e\u0448\u0438\u0431\u043a\u0435 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f.

    Source code in tools\\fix_python_project.py
    def create_init_py(self, dir_path: str) -> bool:\n    \"\"\"\u0421\u043e\u0437\u0434\u0430\u0451\u0442 \u0444\u0430\u0439\u043b __init__.py.\n\n    Args:\n        dir_path: \u041f\u0443\u0442\u044c \u043a \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438.\n\n    Returns:\n        bool: True \u0435\u0441\u043b\u0438 \u0444\u0430\u0439\u043b \u0441\u043e\u0437\u0434\u0430\u043d.\n\n    Raises:\n        Exception: \u041f\u0440\u0438 \u043e\u0448\u0438\u0431\u043a\u0435 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f.\n    \"\"\"\n\n    init_path = os.path.join(dir_path, '__init__.py')\n    try:\n        with open(init_path, 'w', encoding='utf-8') as f:\n            f.write(INIT_TEMPLATE)\n        self.log.append(f\"CREATED INIT: {init_path}\")\n        return True\n    except Exception as e:\n        self.log.append(f\"ERROR creating {init_path}: {str(e)}\")\n        return False\n
    "},{"location":"tools/fix_python_project/#tools.fix_python_project.ProjectFixer.needs_init_py","title":"needs_init_py(dir_path)","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0443\u0436\u043d\u043e \u043b\u0438 \u0441\u043e\u0437\u0434\u0430\u0442\u044c init.py.

    Parameters:

    Name Type Description Default dir_path str

    \u041f\u0443\u0442\u044c \u043a \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438.

    required

    Returns:

    Name Type Description bool bool

    True \u0435\u0441\u043b\u0438 init.py \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f.

    Source code in tools\\fix_python_project.py
    def needs_init_py(self, dir_path: str) -> bool:\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0443\u0436\u043d\u043e \u043b\u0438 \u0441\u043e\u0437\u0434\u0430\u0442\u044c __init__.py.\n\n    Args:\n        dir_path: \u041f\u0443\u0442\u044c \u043a \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438.\n\n    Returns:\n        bool: True \u0435\u0441\u043b\u0438 __init__.py \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f.\n    \"\"\"\n\n    if self.should_skip_init(dir_path):\n        return False\n\n    try:\n        items = os.listdir(dir_path)\n        has_py_files = any(f.endswith('.py') and f != '__init__.py' for f in items)\n        has_init = '__init__.py' in items\n        return has_py_files and not has_init\n    except Exception:\n        return False\n
    "},{"location":"tools/fix_python_project/#tools.fix_python_project.ProjectFixer.process_directory","title":"process_directory()","text":"

    \u0420\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u043e \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442 \u043f\u0440\u043e\u0435\u043a\u0442.

    Source code in tools\\fix_python_project.py
    def process_directory(self):\n    \"\"\"\u0420\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u043e \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442 \u043f\u0440\u043e\u0435\u043a\u0442.\"\"\"\n\n    for root, dirs, files in os.walk(self.root_dir):\n        # \u041e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0444\u0430\u0439\u043b\u043e\u0432 \u0441 \u0446\u0435\u043b\u0435\u0432\u044b\u043c\u0438 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u044f\u043c\u0438\n        for file in files:\n            if file.endswith(TARGET_EXTENSIONS):\n                self.remove_bom(os.path.join(root, file))\n\n        # \u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 __init__.py \u0433\u0434\u0435 \u044d\u0442\u043e \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\n        if self.needs_init_py(root):\n            self.create_init_py(root)\n
    "},{"location":"tools/fix_python_project/#tools.fix_python_project.ProjectFixer.remove_bom","title":"remove_bom(filepath)","text":"

    \u0423\u0434\u0430\u043b\u044f\u0435\u0442 BOM-\u043c\u0430\u0440\u043a\u0435\u0440 \u0438\u0437 \u0444\u0430\u0439\u043b\u0430.

    Parameters:

    Name Type Description Default filepath str

    \u041f\u0443\u0442\u044c \u043a \u0444\u0430\u0439\u043b\u0443.

    required

    Returns:

    Name Type Description bool bool

    True \u0435\u0441\u043b\u0438 BOM \u0431\u044b\u043b \u0443\u0434\u0430\u043b\u0451\u043d.

    Raises:

    Type Description Exception

    \u041f\u0440\u0438 \u043e\u0448\u0438\u0431\u043a\u0435 \u0447\u0442\u0435\u043d\u0438\u044f/\u0437\u0430\u043f\u0438\u0441\u0438.

    Source code in tools\\fix_python_project.py
    def remove_bom(self, filepath: str) -> bool:\n    \"\"\"\u0423\u0434\u0430\u043b\u044f\u0435\u0442 BOM-\u043c\u0430\u0440\u043a\u0435\u0440 \u0438\u0437 \u0444\u0430\u0439\u043b\u0430.\n\n    Args:\n        filepath: \u041f\u0443\u0442\u044c \u043a \u0444\u0430\u0439\u043b\u0443.\n\n    Returns:\n        bool: True \u0435\u0441\u043b\u0438 BOM \u0431\u044b\u043b \u0443\u0434\u0430\u043b\u0451\u043d.\n\n    Raises:\n        Exception: \u041f\u0440\u0438 \u043e\u0448\u0438\u0431\u043a\u0435 \u0447\u0442\u0435\u043d\u0438\u044f/\u0437\u0430\u043f\u0438\u0441\u0438.\n    \"\"\"\n\n    try:\n        with open(filepath, 'rb') as f:\n            content = f.read()\n\n        if content.startswith(b'\\xEF\\xBB\\xBF'):\n            with open(filepath, 'wb') as f:\n                f.write(content[3:])\n            self.log.append(f\"REMOVED BOM: {filepath}\")\n            return True\n    except Exception as e:\n        self.log.append(f\"ERROR processing {filepath}: {str(e)}\")\n    return False\n
    "},{"location":"tools/fix_python_project/#tools.fix_python_project.ProjectFixer.save_log","title":"save_log(log_file='project_fix.log')","text":"

    \u0421\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u0442 \u043b\u043e\u0433 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 \u0432 \u0444\u0430\u0439\u043b.

    Parameters:

    Name Type Description Default log_file str

    \u0418\u043c\u044f \u0444\u0430\u0439\u043b\u0430 \u043b\u043e\u0433\u0430. \u041f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e 'project_fix.log'.

    'project_fix.log' Source code in tools\\fix_python_project.py
    def save_log(self, log_file: str = 'project_fix.log'):\n    \"\"\"\u0421\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u0442 \u043b\u043e\u0433 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 \u0432 \u0444\u0430\u0439\u043b.\n\n    Args:\n        log_file: \u0418\u043c\u044f \u0444\u0430\u0439\u043b\u0430 \u043b\u043e\u0433\u0430. \u041f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e 'project_fix.log'.\n    \"\"\"\n\n    with open(log_file, 'w', encoding='utf-8') as f:\n        f.write(\"\\n\".join(self.log))\n
    "},{"location":"tools/fix_python_project/#tools.fix_python_project.ProjectFixer.should_skip_init","title":"should_skip_init(dir_path)","text":"

    \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0443\u0436\u043d\u043e \u043b\u0438 \u043f\u0440\u043e\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044e.

    Parameters:

    Name Type Description Default dir_path str

    \u041f\u0443\u0442\u044c \u043a \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438.

    required

    Returns:

    Name Type Description bool bool

    True \u0435\u0441\u043b\u0438 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044e \u043d\u0443\u0436\u043d\u043e \u043f\u0440\u043e\u043f\u0443\u0441\u0442\u0438\u0442\u044c.

    Source code in tools\\fix_python_project.py
    def should_skip_init(self, dir_path: str) -> bool:\n    \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0443\u0436\u043d\u043e \u043b\u0438 \u043f\u0440\u043e\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044e.\n\n    Args:\n        dir_path: \u041f\u0443\u0442\u044c \u043a \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438.\n\n    Returns:\n        bool: True \u0435\u0441\u043b\u0438 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044e \u043d\u0443\u0436\u043d\u043e \u043f\u0440\u043e\u043f\u0443\u0441\u0442\u0438\u0442\u044c.\n    \"\"\"\n\n    dir_name = os.path.basename(dir_path)\n    return (dir_name in INIT_IGNORED_DIRS or\n            dir_name.startswith('.'))\n
    "},{"location":"tools/logger/","title":"Logging","text":"

    \u041c\u043e\u0434\u0443\u043b\u044c \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u043b\u043e\u0433\u0433\u0435\u0440\u0430.

    \u0421\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0438 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u043b\u043e\u0433\u0433\u0435\u0440\u0430 \u0441 \u0432\u044b\u0432\u043e\u0434\u043e\u043c \u0432 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0439 \u043f\u043e\u0442\u043e\u043a.

    "},{"location":"tools/logger/#tools.logger.get_logger","title":"get_logger(name)","text":"

    \u0421\u043e\u0437\u0434\u0430\u0451\u0442 \u0438 \u043d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u0442 \u043b\u043e\u0433\u0433\u0435\u0440.

    Parameters:

    Name Type Description Default name str

    \u0418\u043c\u044f \u043b\u043e\u0433\u0433\u0435\u0440\u0430 (\u043e\u0431\u044b\u0447\u043d\u043e name \u043c\u043e\u0434\u0443\u043b\u044f).

    required

    Returns:

    Type Description Logger

    logging.Logger: \u041d\u0430\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0439 \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u043b\u043e\u0433\u0433\u0435\u0440\u0430.

    \u041f\u0440\u0438\u043c\u0435\u0440

    logger = get_logger(name) logger.debug(\"\u0422\u0435\u0441\u0442\u043e\u0432\u043e\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435\")

    Source code in tools\\logger.py
    def get_logger(name: str) -> logging.Logger:\n    \"\"\"\u0421\u043e\u0437\u0434\u0430\u0451\u0442 \u0438 \u043d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u0442 \u043b\u043e\u0433\u0433\u0435\u0440.\n\n    Args:\n        name: \u0418\u043c\u044f \u043b\u043e\u0433\u0433\u0435\u0440\u0430 (\u043e\u0431\u044b\u0447\u043d\u043e __name__ \u043c\u043e\u0434\u0443\u043b\u044f).\n\n    Returns:\n        logging.Logger: \u041d\u0430\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0439 \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u043b\u043e\u0433\u0433\u0435\u0440\u0430.\n\n    \u041f\u0440\u0438\u043c\u0435\u0440:\n        logger = get_logger(__name__)\n        logger.debug(\"\u0422\u0435\u0441\u0442\u043e\u0432\u043e\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435\")\n    \"\"\"\n\n    logger = logging.getLogger(name)\n    logger.setLevel(logging.DEBUG)\n\n    # \u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430 \u0434\u043b\u044f \u0432\u044b\u0432\u043e\u0434\u0430 \u0432 \u043a\u043e\u043d\u0441\u043e\u043b\u044c\n    handler = logging.StreamHandler()\n    handler.setLevel(logging.DEBUG)\n\n    # \u0424\u043e\u0440\u043c\u0430\u0442 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439: \u0432\u0440\u0435\u043c\u044f | \u0438\u043c\u044f \u043b\u043e\u0433\u0433\u0435\u0440\u0430 | \u0443\u0440\u043e\u0432\u0435\u043d\u044c | \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435\n    formatter = logging.Formatter('%(asctime)s | %(name)s | %(levelname)s | %(message)s')\n    handler.setFormatter(formatter)\n\n    logger.addHandler(handler)\n\n    return logger\n
    "}]} \ No newline at end of file diff --git a/site/sitemap.xml.gz b/site/sitemap.xml.gz index 64d1d0bc5669b26e87933b3590b041dc22169c17..d51809ed8beef58ced8f3e72dfbc82d4784b0968 100644 GIT binary patch delta 13 Ucmb=gXP58h;Apshbs~EO03Z?s`~Uy| delta 13 Ucmb=gXP58h;9!`0W+Hn902|B%IRF3v diff --git a/site/tests/components/test_json_container/index.html b/site/tests/components/test_json_container/index.html index 52ff4b7..45d2f52 100644 --- a/site/tests/components/test_json_container/index.html +++ b/site/tests/components/test_json_container/index.html @@ -9,7 +9,7 @@ - + @@ -751,6 +751,27 @@ +
  • + + + + + EventsContainerComponent + + + + +
  • + + + + + + + + + +
  • @@ -898,6 +919,27 @@ +
  • + + + + + SystemLogEventsContainer + + + + +
  • + + + + + + + + + +
  • @@ -1543,6 +1585,27 @@ + + + + + + +
  • + + + + + ZTPTemplatesTab + + + + +
  • + + + + @@ -1754,6 +1817,27 @@ +
  • + + + + + TestSystemLogEventsContainer + + + + +
  • + + + + + + + + + +
  • @@ -1811,6 +1895,27 @@ + + + + + + +
  • + + + + + TestZTPTemplatesTab + + + + +
  • + + + + diff --git a/site/tests/components/test_navigation_panel/index.html b/site/tests/components/test_navigation_panel/index.html index b6a1992..3ea2f4b 100644 --- a/site/tests/components/test_navigation_panel/index.html +++ b/site/tests/components/test_navigation_panel/index.html @@ -751,6 +751,27 @@ +
  • + + + + + EventsContainerComponent + + + + +
  • + + + + + + + + + +
  • @@ -898,6 +919,27 @@ +
  • + + + + + SystemLogEventsContainer + + + + +
  • + + + + + + + + + +
  • @@ -1543,6 +1585,27 @@ + + + + + + +
  • + + + + + ZTPTemplatesTab + + + + +
  • + + + + @@ -1754,6 +1817,27 @@ +
  • + + + + + TestSystemLogEventsContainer + + + + +
  • + + + + + + + + + +
  • @@ -1811,6 +1895,27 @@ + + + + + + +
  • + + + + + TestZTPTemplatesTab + + + + +
  • + + + + diff --git a/site/tests/components/test_services_table/index.html b/site/tests/components/test_services_table/index.html index 90c9ebe..66faad7 100644 --- a/site/tests/components/test_services_table/index.html +++ b/site/tests/components/test_services_table/index.html @@ -751,6 +751,27 @@ +
  • + + + + + EventsContainerComponent + + + + +
  • + + + + + + + + + +
  • @@ -898,6 +919,27 @@ +
  • + + + + + SystemLogEventsContainer + + + + +
  • + + + + + + + + + +
  • @@ -1543,6 +1585,27 @@ + + + + + + +
  • + + + + + ZTPTemplatesTab + + + + +
  • + + + + @@ -1754,6 +1817,27 @@ +
  • + + + + + TestSystemLogEventsContainer + + + + +
  • + + + + + + + + + +
  • @@ -1811,6 +1895,27 @@ + + + + + + +
  • + + + + + TestZTPTemplatesTab + + + + +
  • + + + + diff --git a/site/tests/components/test_user_modal_window/index.html b/site/tests/components/test_user_modal_window/index.html index b2b8102..b620551 100644 --- a/site/tests/components/test_user_modal_window/index.html +++ b/site/tests/components/test_user_modal_window/index.html @@ -751,6 +751,27 @@ +
  • + + + + + EventsContainerComponent + + + + +
  • + + + + + + + + + +
  • @@ -898,6 +919,27 @@ +
  • + + + + + SystemLogEventsContainer + + + + +
  • + + + + + + + + + +
  • @@ -1543,6 +1585,27 @@ + + + + + + +
  • + + + + + ZTPTemplatesTab + + + + +
  • + + + + @@ -1754,6 +1817,27 @@ +
  • + + + + + TestSystemLogEventsContainer + + + + +
  • + + + + + + + + + +
  • @@ -1811,6 +1895,27 @@ + + + + + + +
  • + + + + + TestZTPTemplatesTab + + + + +
  • + + + + diff --git a/site/tests/e2e/test_event_panel/index.html b/site/tests/e2e/test_event_panel/index.html index 836f667..63cba06 100644 --- a/site/tests/e2e/test_event_panel/index.html +++ b/site/tests/e2e/test_event_panel/index.html @@ -9,7 +9,7 @@ - + @@ -751,6 +751,27 @@ +
  • + + + + + EventsContainerComponent + + + + +
  • + + + + + + + + + +
  • @@ -898,6 +919,27 @@ +
  • + + + + + SystemLogEventsContainer + + + + +
  • + + + + + + + + + +
  • @@ -1543,6 +1585,27 @@ + + + + + + +
  • + + + + + ZTPTemplatesTab + + + + +
  • + + + + @@ -1838,6 +1901,27 @@ +
  • + + + + + TestSystemLogEventsContainer + + + + +
  • + + + + + + + + + +
  • @@ -1895,6 +1979,27 @@ + + + + + + +
  • + + + + + TestZTPTemplatesTab + + + + +
  • + + + + diff --git a/site/tests/e2e/test_expand_navigation_panel/index.html b/site/tests/e2e/test_expand_navigation_panel/index.html index 9fb4732..0096533 100644 --- a/site/tests/e2e/test_expand_navigation_panel/index.html +++ b/site/tests/e2e/test_expand_navigation_panel/index.html @@ -751,6 +751,27 @@ +
  • + + + + + EventsContainerComponent + + + + +
  • + + + + + + + + + +
  • @@ -898,6 +919,27 @@ +
  • + + + + + SystemLogEventsContainer + + + + +
  • + + + + + + + + + +
  • @@ -1543,6 +1585,27 @@ + + + + + + +
  • + + + + + ZTPTemplatesTab + + + + +
  • + + + + @@ -1838,6 +1901,27 @@ +
  • + + + + + TestSystemLogEventsContainer + + + + +
  • + + + + + + + + + +
  • @@ -1895,6 +1979,27 @@ + + + + + + +
  • + + + + + TestZTPTemplatesTab + + + + +
  • + + + + @@ -2372,8 +2477,7 @@
    Source code in tests\e2e\test_expand_navigation_panel.py -
    13
    -14
    +                
    14
     15
     16
     17
    @@ -2440,7 +2544,18 @@
     78
     79
     80
    -81
    class TestNavigationPanel:
    +81
    +82
    +83
    +84
    +85
    +86
    +87
    +88
    +89
    +90
    +91
    +92
    class TestNavigationPanel:
         """Класс тестов для проверки панели навигации.
     
         Тесты покрывают следующие сценарии:
    @@ -2480,6 +2595,7 @@
     
             mp.expand_navigation_subpanel()
     
    +    # @pytest.mark.develop
         def test_sub_panel_item_click(self, browser: Page):
             """Проверяет возможность клика заданного элемента в подпанели навигации.
     
    @@ -2499,16 +2615,25 @@
             # Проверяем наличие панели навигации
             mp.should_be_navigation_panel()
     
    -        # Открываем все пункты панели
    +        # Открываем разные пункты панели
             mp.click_main_navigation_panel_item("Настройки")
     
             mp.click_subpanel_item("Обслуживание и диагностика")
             mp.click_subpanel_item("Статус обслуживания")
    -
             mp.wait_for_timeout(500)
     
    +        # Открываем/закрываем пункт панели
             mp.click_subpanel_item("Пользователи")
             mp.click_subpanel_item("Пользователи")
    +        mp.wait_for_timeout(500)
    +
    +        # Открываем пункты панели с одинаковыми имнами, но разным расположением
    +        mp.click_subpanel_item("Шаблоны")
    +        mp.wait_for_timeout(500)
    +
    +        mp.click_subpanel_item("Zero Touch Provisioning")
    +        mp.click_subpanel_item("Шаблоны", parent="Zero Touch Provisioning")
    +        mp.wait_for_timeout(500)
     
    @@ -2571,8 +2696,7 @@
    Source code in tests\e2e\test_expand_navigation_panel.py -
    24
    -25
    +              
    25
     26
     27
     28
    @@ -2598,7 +2722,8 @@
     48
     49
     50
    -51
    def test_expand_panel(self, browser: Page):
    +51
    +52
    def test_expand_panel(self, browser: Page):
         """Проверяет полное раскрытие панели навигации.
     
         Args:
    @@ -2679,9 +2804,7 @@
     
                 
    Source code in tests\e2e\test_expand_navigation_panel.py -
    53
    -54
    -55
    +              
    55
     56
     57
     58
    @@ -2707,7 +2830,18 @@
     78
     79
     80
    -81
    def test_sub_panel_item_click(self, browser: Page):
    +81
    +82
    +83
    +84
    +85
    +86
    +87
    +88
    +89
    +90
    +91
    +92
    def test_sub_panel_item_click(self, browser: Page):
         """Проверяет возможность клика заданного элемента в подпанели навигации.
     
         Args:
    @@ -2726,16 +2860,25 @@
         # Проверяем наличие панели навигации
         mp.should_be_navigation_panel()
     
    -    # Открываем все пункты панели
    +    # Открываем разные пункты панели
         mp.click_main_navigation_panel_item("Настройки")
     
         mp.click_subpanel_item("Обслуживание и диагностика")
         mp.click_subpanel_item("Статус обслуживания")
    -
         mp.wait_for_timeout(500)
     
    +    # Открываем/закрываем пункт панели
         mp.click_subpanel_item("Пользователи")
         mp.click_subpanel_item("Пользователи")
    +    mp.wait_for_timeout(500)
    +
    +    # Открываем пункты панели с одинаковыми имнами, но разным расположением
    +    mp.click_subpanel_item("Шаблоны")
    +    mp.wait_for_timeout(500)
    +
    +    mp.click_subpanel_item("Zero Touch Provisioning")
    +    mp.click_subpanel_item("Шаблоны", parent="Zero Touch Provisioning")
    +    mp.wait_for_timeout(500)
     
    diff --git a/site/tests/e2e/test_license_tab/index.html b/site/tests/e2e/test_license_tab/index.html index 77ae85a..079eb19 100644 --- a/site/tests/e2e/test_license_tab/index.html +++ b/site/tests/e2e/test_license_tab/index.html @@ -751,6 +751,27 @@ +
  • + + + + + EventsContainerComponent + + + + +
  • + + + + + + + + + +
  • @@ -898,6 +919,27 @@ +
  • + + + + + SystemLogEventsContainer + + + + +
  • + + + + + + + + + +
  • @@ -1543,6 +1585,27 @@ + + + + + + +
  • + + + + + ZTPTemplatesTab + + + + +
  • + + + + @@ -1847,6 +1910,27 @@ +
  • + + + + + TestSystemLogEventsContainer + + + + +
  • + + + + + + + + + +
  • @@ -1904,6 +1988,27 @@ + + + + + + +
  • + + + + + TestZTPTemplatesTab + + + + +
  • + + + + diff --git a/site/tests/e2e/test_login/index.html b/site/tests/e2e/test_login/index.html index 28279d4..2f0c8b1 100644 --- a/site/tests/e2e/test_login/index.html +++ b/site/tests/e2e/test_login/index.html @@ -751,6 +751,27 @@ +
  • + + + + + EventsContainerComponent + + + + +
  • + + + + + + + + + +
  • @@ -898,6 +919,27 @@ +
  • + + + + + SystemLogEventsContainer + + + + +
  • + + + + + + + + + +
  • @@ -1543,6 +1585,27 @@ + + + + + + +
  • + + + + + ZTPTemplatesTab + + + + +
  • + + + + @@ -1856,6 +1919,27 @@ +
  • + + + + + TestSystemLogEventsContainer + + + + +
  • + + + + + + + + + +
  • @@ -1913,6 +1997,27 @@ + + + + + + +
  • + + + + + TestZTPTemplatesTab + + + + +
  • + + + + diff --git a/site/tests/e2e/test_service_status_tab/index.html b/site/tests/e2e/test_service_status_tab/index.html index 280e0a8..71c8a8a 100644 --- a/site/tests/e2e/test_service_status_tab/index.html +++ b/site/tests/e2e/test_service_status_tab/index.html @@ -751,6 +751,27 @@ +
  • + + + + + EventsContainerComponent + + + + +
  • + + + + + + + + + +
  • @@ -898,6 +919,27 @@ +
  • + + + + + SystemLogEventsContainer + + + + +
  • + + + + + + + + + +
  • @@ -1543,6 +1585,27 @@ + + + + + + +
  • + + + + + ZTPTemplatesTab + + + + +
  • + + + + @@ -1847,6 +1910,27 @@ +
  • + + + + + TestSystemLogEventsContainer + + + + +
  • + + + + + + + + + +
  • @@ -1904,6 +1988,27 @@ + + + + + + +
  • + + + + + TestZTPTemplatesTab + + + + +
  • + + + + diff --git a/site/tests/e2e/test_sessions_tab/index.html b/site/tests/e2e/test_sessions_tab/index.html index 0bc36f1..d69dc75 100644 --- a/site/tests/e2e/test_sessions_tab/index.html +++ b/site/tests/e2e/test_sessions_tab/index.html @@ -12,7 +12,7 @@ - + @@ -751,6 +751,27 @@ +
  • + + + + + EventsContainerComponent + + + + +
  • + + + + + + + + + +
  • @@ -898,6 +919,27 @@ +
  • + + + + + SystemLogEventsContainer + + + + +
  • + + + + + + + + + +
  • @@ -1543,6 +1585,27 @@ + + + + + + +
  • + + + + + ZTPTemplatesTab + + + + +
  • + + + + @@ -1910,6 +1973,27 @@ +
  • + + + + + TestSystemLogEventsContainer + + + + +
  • + + + + + + + + + +
  • @@ -1967,6 +2051,27 @@ + + + + + + +
  • + + + + + TestZTPTemplatesTab + + + + +
  • + + + + diff --git a/site/tests/e2e/test_system_log_events_container/index.html b/site/tests/e2e/test_system_log_events_container/index.html new file mode 100644 index 0000000..9aac616 --- /dev/null +++ b/site/tests/e2e/test_system_log_events_container/index.html @@ -0,0 +1,3716 @@ + + + + + + + + + + + + + + + + + + + + + + + TestSystemLogEventsContainer - Документация тестов eNODE-Мониторинг + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + +
    + + +
    + +
    + + + + + + +
    +
    + + + +
    +
    +
    + + + + + +
    +
    +
    + + + + + + + +
    +
    + + + + +

    TestSystemLogEventsContainer

    + + +
    + + + + +
    + +

    Модуль тестов контейнера для отображения событий системного журнала.

    +

    Содержит тесты для проверки функциональности +контейнера для отображения событий системного журнала.

    + + + + + + + + + +
    + + + + + + + + +
    + + + +

    + TestSystemLogEventsContainer + + +

    + + +
    + + +

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

    +

    Тесты покрывают следующие сценарии: +1. test_system_log_events_content: Проверяет содержимое контейнера для отображения событий системного журнала.

    + + +
    + Атрибуты +

    browser: Фикстура для работы с браузером.

    +
    + + + + + + +
    + Source code in tests\e2e\test_system_log_events_container.py +
     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
    +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
    class TestSystemLogEventsContainer:
    +    """Класс тестов для проверки контейнера для отображения событий системного журнала..
    +
    +    Тесты покрывают следующие сценарии:
    +    1. test_system_log_events_content: Проверяет содержимое контейнера для отображения событий системного журнала.
    +
    +    Атрибуты:
    +        browser: Фикстура для работы с браузером.
    +    """
    +
    +    def test_system_log_events_content(self, browser: Page) -> None:
    +        """Проверяет содержимое контейнера для отображения событий системного журнала.
    +
    +        Args:
    +            browser: Экземпляр страницы Playwright.
    +        """
    +
    +        lp = LoginPage(browser)
    +        lp.do_login()
    +
    +        mp = MainPage(browser)
    +        mp.should_be_event_panel()
    +
    +        system_log_events_container = mp.click_events_panel_system_log_tab()
    +        system_log_events_container.check_content()
    +
    +    def test_events_table_row_highlighting(self, browser: Page):
    +        """Проверяет выделение строк в таблице событий.
    +
    +        Args:
    +            browser: Экземпляр страницы Playwright.
    +        """
    +
    +        lp = LoginPage(browser)
    +        lp.do_login()
    +
    +        mp = MainPage(browser)
    +        mp.should_be_event_panel()
    +
    +        system_log_events_container = mp.click_events_panel_system_log_tab()
    +
    +        # Получение количества строк в таблице
    +        rows_count = system_log_events_container.get_events_table_rows_count()
    +
    +        # Проверка выделения строк
    +        system_log_events_container.check_events_table_row_highlighting(0)
    +        system_log_events_container.check_events_table_row_highlighting(rows_count - 1)
    +        system_log_events_container.check_events_table_row_highlighting(int(rows_count / 2))
    +
    +    def test_events_table_scrolling(self, browser: Page):
    +        """Проверяет возможность скроллинга таблицы событий.
    +
    +        Args:
    +            browser: Экземпляр страницы Playwright.
    +        """
    +
    +        lp = LoginPage(browser)
    +        lp.do_login()
    +
    +        mp = MainPage(browser)
    +        mp.should_be_event_panel()
    +
    +        system_log_events_container = mp.click_events_panel_system_log_tab()
    +
    +        events_panel_position = mp.get_events_panel_position()
    +
    +        # Проверка, что панель с таблицей открыта
    +        assert events_panel_position != "bottom", "Panel with system log events should be opened"
    +
    +        is_scrollable = system_log_events_container.check_events_table_verticall_scrolling()
    +
    +        # Убеждаемся, что панель открыта наполовину и проверяем скроллинг
    +        assert events_panel_position == "center",\
    +               "Panel with system log events should be located on the main page center"
    +        assert is_scrollable, "System log events table should be scrollable"
    +
    +        # Скроллинг вниз
    +        system_log_events_container.scroll_events_table_down()
    +        browser.wait_for_timeout(1000)
    +
    +        # Проверка видимости последней строки после прокрутки
    +        system_log_events_container.check_events_table_last_row_visibility()
    +
    +        # Скроллинг вверх
    +        system_log_events_container.scroll_events_table_up()
    +        browser.wait_for_timeout(1000)
    +
    +        # Проверка видимости первой строки после прокрутки
    +        system_log_events_container.check_events_table_first_row_visibility()
    +
    +        # Раскрываем панель полностью и проверяем скроллинг
    +        assert mp.check_expand_less_button(), \
    +                "Expand less button should be present"
    +        mp.click_events_panel_expand_less_button()
    +        mp.wait_for_timeout(500)
    +
    +        events_panel_position = mp.get_events_panel_position()
    +        assert events_panel_position == "top",\
    +               "Panel with system log events should be located on the main page top"
    +
    +        is_scrollable = system_log_events_container.check_events_table_verticall_scrolling()
    +        assert is_scrollable, "System log events table should be scrollable in the full window"
    +
    +        # Скроллинг вниз
    +        system_log_events_container.scroll_events_table_down()
    +        browser.wait_for_timeout(1000)
    +
    +        # Проверка видимости последней строки после прокрутки
    +        system_log_events_container.check_events_table_last_row_visibility()
    +
    +        # Скроллинг вверх
    +        system_log_events_container.scroll_events_table_up()
    +        browser.wait_for_timeout(1000)
    +
    +        # Проверка видимости первой строки после прокрутки
    +        system_log_events_container.check_events_table_first_row_visibility()
    +
    +    def test_events_table_column_sorting(self, browser: Page):
    +        """Проверяет сортировку колонки 'Время' в таблице событий.
    +
    +        Args:
    +            browser: Экземпляр страницы Playwright.
    +        """
    +
    +        lp = LoginPage(browser)
    +        lp.do_login()
    +
    +        mp = MainPage(browser)
    +        mp.should_be_event_panel()
    +
    +        system_log_events_container = mp.click_events_panel_system_log_tab()
    +
    +        index = 1
    +        state = system_log_events_container.get_arrow_button_state(index)
    +        assert state == "down", "Arrow button should be down"
    +
    +        system_log_events_container.click_event_table_header_arrow(index)
    +        browser.wait_for_timeout(300)
    +
    +        state = system_log_events_container.get_arrow_button_state(index)
    +        assert state == "up", "Arrow button should be up"
    +        is_descending_order = system_log_events_container.check_events_table_column_descending_order(index)
    +        assert not is_descending_order, "Column data should be in ascending order"
    +
    +        system_log_events_container.click_event_table_header_arrow(index)
    +        browser.wait_for_timeout(300)
    +        state = system_log_events_container.get_arrow_button_state(index)
    +        assert state == "down", "Arrow button should be down"
    +        is_descending_order = system_log_events_container.check_events_table_column_descending_order(index)
    +        assert is_descending_order, "Column data should be in descending order"
    +
    +    @pytest.mark.develop
    +    def test_events_table_pagination(self, browser: Page):
    +        """Проверяет возможность пагинации таблицы событий.
    +
    +        Args:
    +            browser: Экземпляр страницы Playwright.
    +        """
    +
    +        lp = LoginPage(browser)
    +        lp.do_login()
    +
    +        mp = MainPage(browser)
    +        mp.should_be_event_panel()
    +
    +        system_log_events_container = mp.click_events_panel_system_log_tab()
    +
    +        system_log_events_container.should_be_pagination_buttons()
    +
    +        # Проверка начального состояния
    +        is_chevron_left_disabled = system_log_events_container.is_chevron_left_disabled()
    +        assert is_chevron_left_disabled, "Arrow Left button should be disabled"
    +
    +        is_chevron_right_disabled = system_log_events_container.is_chevron_right_disabled()
    +        assert not is_chevron_right_disabled, "Arrow Right button should be enabled"
    +
    +        current_number = system_log_events_container.get_current_data_set_number()
    +        assert current_number == 1, "The first page should be number one"
    +
    +        # загрузка страниц от начала и до конца
    +        # to_do: проверка, что происходит обновление содержимого таблицы
    +        counter = 1
    +        while not is_chevron_right_disabled:
    +            system_log_events_container.click_chevron_right()
    +            counter += 1
    +
    +            is_chevron_left_disabled = system_log_events_container.is_chevron_left_disabled()
    +            assert not is_chevron_left_disabled, "Arrow Left button should be enabled"
    +
    +            is_chevron_right_disabled = system_log_events_container.is_chevron_right_disabled()
    +
    +            current_number = system_log_events_container.get_current_data_set_number()
    +            assert current_number == counter, f"Expected page number {counter} is not equal actual {current_number}"
    +
    +        # загрузка страниц от конца к началу
    +        # to_do: проверка, что происходит обновление содержимого таблицы
    +        while not is_chevron_left_disabled:
    +            system_log_events_container.click_chevron_left()
    +            counter -= 1
    +
    +            is_chevron_left_disabled = system_log_events_container.is_chevron_left_disabled()
    +
    +            is_chevron_right_disabled = system_log_events_container.is_chevron_right_disabled()
    +            assert not is_chevron_right_disabled, "Arrow Right button should be enabled"
    +
    +            current_number = system_log_events_container.get_current_data_set_number()
    +            assert current_number == counter, f"Expected page number {counter} is not equal actual {current_number}"
    +
    +        # Проверка возврата к начальному состоянию
    +        is_chevron_left_disabled = system_log_events_container.is_chevron_left_disabled()
    +        assert is_chevron_left_disabled, "Arrow Left button should be disabled"
    +
    +        is_chevron_right_disabled = system_log_events_container.is_chevron_right_disabled()
    +        assert not is_chevron_right_disabled, "Arrow Right button should be enabled"
    +
    +        current_number = system_log_events_container.get_current_data_set_number()
    +        assert current_number == 1, "The first page should be number one"
    +
    +
    + + + +
    + + + + + + + + + +
    + + +

    + test_events_table_column_sorting(browser) + +

    + + +
    + +

    Проверяет сортировку колонки 'Время' в таблице событий.

    + + +

    Parameters:

    + + + + + + + + + + + + + + + + + +
    NameTypeDescriptionDefault
    + browser + + Page + +
    +

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

    +
    +
    + required +
    + + +
    + Source code in tests\e2e\test_system_log_events_container.py +
    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
    def test_events_table_column_sorting(self, browser: Page):
    +    """Проверяет сортировку колонки 'Время' в таблице событий.
    +
    +    Args:
    +        browser: Экземпляр страницы Playwright.
    +    """
    +
    +    lp = LoginPage(browser)
    +    lp.do_login()
    +
    +    mp = MainPage(browser)
    +    mp.should_be_event_panel()
    +
    +    system_log_events_container = mp.click_events_panel_system_log_tab()
    +
    +    index = 1
    +    state = system_log_events_container.get_arrow_button_state(index)
    +    assert state == "down", "Arrow button should be down"
    +
    +    system_log_events_container.click_event_table_header_arrow(index)
    +    browser.wait_for_timeout(300)
    +
    +    state = system_log_events_container.get_arrow_button_state(index)
    +    assert state == "up", "Arrow button should be up"
    +    is_descending_order = system_log_events_container.check_events_table_column_descending_order(index)
    +    assert not is_descending_order, "Column data should be in ascending order"
    +
    +    system_log_events_container.click_event_table_header_arrow(index)
    +    browser.wait_for_timeout(300)
    +    state = system_log_events_container.get_arrow_button_state(index)
    +    assert state == "down", "Arrow button should be down"
    +    is_descending_order = system_log_events_container.check_events_table_column_descending_order(index)
    +    assert is_descending_order, "Column data should be in descending order"
    +
    +
    +
    + +
    + +
    + + +

    + test_events_table_pagination(browser) + +

    + + +
    + +

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

    + + +

    Parameters:

    + + + + + + + + + + + + + + + + + +
    NameTypeDescriptionDefault
    + browser + + Page + +
    +

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

    +
    +
    + required +
    + + +
    + Source code in tests\e2e\test_system_log_events_container.py +
    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
    @pytest.mark.develop
    +def test_events_table_pagination(self, browser: Page):
    +    """Проверяет возможность пагинации таблицы событий.
    +
    +    Args:
    +        browser: Экземпляр страницы Playwright.
    +    """
    +
    +    lp = LoginPage(browser)
    +    lp.do_login()
    +
    +    mp = MainPage(browser)
    +    mp.should_be_event_panel()
    +
    +    system_log_events_container = mp.click_events_panel_system_log_tab()
    +
    +    system_log_events_container.should_be_pagination_buttons()
    +
    +    # Проверка начального состояния
    +    is_chevron_left_disabled = system_log_events_container.is_chevron_left_disabled()
    +    assert is_chevron_left_disabled, "Arrow Left button should be disabled"
    +
    +    is_chevron_right_disabled = system_log_events_container.is_chevron_right_disabled()
    +    assert not is_chevron_right_disabled, "Arrow Right button should be enabled"
    +
    +    current_number = system_log_events_container.get_current_data_set_number()
    +    assert current_number == 1, "The first page should be number one"
    +
    +    # загрузка страниц от начала и до конца
    +    # to_do: проверка, что происходит обновление содержимого таблицы
    +    counter = 1
    +    while not is_chevron_right_disabled:
    +        system_log_events_container.click_chevron_right()
    +        counter += 1
    +
    +        is_chevron_left_disabled = system_log_events_container.is_chevron_left_disabled()
    +        assert not is_chevron_left_disabled, "Arrow Left button should be enabled"
    +
    +        is_chevron_right_disabled = system_log_events_container.is_chevron_right_disabled()
    +
    +        current_number = system_log_events_container.get_current_data_set_number()
    +        assert current_number == counter, f"Expected page number {counter} is not equal actual {current_number}"
    +
    +    # загрузка страниц от конца к началу
    +    # to_do: проверка, что происходит обновление содержимого таблицы
    +    while not is_chevron_left_disabled:
    +        system_log_events_container.click_chevron_left()
    +        counter -= 1
    +
    +        is_chevron_left_disabled = system_log_events_container.is_chevron_left_disabled()
    +
    +        is_chevron_right_disabled = system_log_events_container.is_chevron_right_disabled()
    +        assert not is_chevron_right_disabled, "Arrow Right button should be enabled"
    +
    +        current_number = system_log_events_container.get_current_data_set_number()
    +        assert current_number == counter, f"Expected page number {counter} is not equal actual {current_number}"
    +
    +    # Проверка возврата к начальному состоянию
    +    is_chevron_left_disabled = system_log_events_container.is_chevron_left_disabled()
    +    assert is_chevron_left_disabled, "Arrow Left button should be disabled"
    +
    +    is_chevron_right_disabled = system_log_events_container.is_chevron_right_disabled()
    +    assert not is_chevron_right_disabled, "Arrow Right button should be enabled"
    +
    +    current_number = system_log_events_container.get_current_data_set_number()
    +    assert current_number == 1, "The first page should be number one"
    +
    +
    +
    + +
    + +
    + + +

    + test_events_table_row_highlighting(browser) + +

    + + +
    + +

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

    + + +

    Parameters:

    + + + + + + + + + + + + + + + + + +
    NameTypeDescriptionDefault
    + browser + + Page + +
    +

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

    +
    +
    + required +
    + + +
    + Source code in tests\e2e\test_system_log_events_container.py +
    40
    +41
    +42
    +43
    +44
    +45
    +46
    +47
    +48
    +49
    +50
    +51
    +52
    +53
    +54
    +55
    +56
    +57
    +58
    +59
    +60
    +61
    def test_events_table_row_highlighting(self, browser: Page):
    +    """Проверяет выделение строк в таблице событий.
    +
    +    Args:
    +        browser: Экземпляр страницы Playwright.
    +    """
    +
    +    lp = LoginPage(browser)
    +    lp.do_login()
    +
    +    mp = MainPage(browser)
    +    mp.should_be_event_panel()
    +
    +    system_log_events_container = mp.click_events_panel_system_log_tab()
    +
    +    # Получение количества строк в таблице
    +    rows_count = system_log_events_container.get_events_table_rows_count()
    +
    +    # Проверка выделения строк
    +    system_log_events_container.check_events_table_row_highlighting(0)
    +    system_log_events_container.check_events_table_row_highlighting(rows_count - 1)
    +    system_log_events_container.check_events_table_row_highlighting(int(rows_count / 2))
    +
    +
    +
    + +
    + +
    + + +

    + test_events_table_scrolling(browser) + +

    + + +
    + +

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

    + + +

    Parameters:

    + + + + + + + + + + + + + + + + + +
    NameTypeDescriptionDefault
    + browser + + Page + +
    +

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

    +
    +
    + required +
    + + +
    + Source code in tests\e2e\test_system_log_events_container.py +
     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
    def test_events_table_scrolling(self, browser: Page):
    +    """Проверяет возможность скроллинга таблицы событий.
    +
    +    Args:
    +        browser: Экземпляр страницы Playwright.
    +    """
    +
    +    lp = LoginPage(browser)
    +    lp.do_login()
    +
    +    mp = MainPage(browser)
    +    mp.should_be_event_panel()
    +
    +    system_log_events_container = mp.click_events_panel_system_log_tab()
    +
    +    events_panel_position = mp.get_events_panel_position()
    +
    +    # Проверка, что панель с таблицей открыта
    +    assert events_panel_position != "bottom", "Panel with system log events should be opened"
    +
    +    is_scrollable = system_log_events_container.check_events_table_verticall_scrolling()
    +
    +    # Убеждаемся, что панель открыта наполовину и проверяем скроллинг
    +    assert events_panel_position == "center",\
    +           "Panel with system log events should be located on the main page center"
    +    assert is_scrollable, "System log events table should be scrollable"
    +
    +    # Скроллинг вниз
    +    system_log_events_container.scroll_events_table_down()
    +    browser.wait_for_timeout(1000)
    +
    +    # Проверка видимости последней строки после прокрутки
    +    system_log_events_container.check_events_table_last_row_visibility()
    +
    +    # Скроллинг вверх
    +    system_log_events_container.scroll_events_table_up()
    +    browser.wait_for_timeout(1000)
    +
    +    # Проверка видимости первой строки после прокрутки
    +    system_log_events_container.check_events_table_first_row_visibility()
    +
    +    # Раскрываем панель полностью и проверяем скроллинг
    +    assert mp.check_expand_less_button(), \
    +            "Expand less button should be present"
    +    mp.click_events_panel_expand_less_button()
    +    mp.wait_for_timeout(500)
    +
    +    events_panel_position = mp.get_events_panel_position()
    +    assert events_panel_position == "top",\
    +           "Panel with system log events should be located on the main page top"
    +
    +    is_scrollable = system_log_events_container.check_events_table_verticall_scrolling()
    +    assert is_scrollable, "System log events table should be scrollable in the full window"
    +
    +    # Скроллинг вниз
    +    system_log_events_container.scroll_events_table_down()
    +    browser.wait_for_timeout(1000)
    +
    +    # Проверка видимости последней строки после прокрутки
    +    system_log_events_container.check_events_table_last_row_visibility()
    +
    +    # Скроллинг вверх
    +    system_log_events_container.scroll_events_table_up()
    +    browser.wait_for_timeout(1000)
    +
    +    # Проверка видимости первой строки после прокрутки
    +    system_log_events_container.check_events_table_first_row_visibility()
    +
    +
    +
    + +
    + +
    + + +

    + test_system_log_events_content(browser) + +

    + + +
    + +

    Проверяет содержимое контейнера для отображения событий системного журнала.

    + + +

    Parameters:

    + + + + + + + + + + + + + + + + + +
    NameTypeDescriptionDefault
    + browser + + Page + +
    +

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

    +
    +
    + required +
    + + +
    + Source code in tests\e2e\test_system_log_events_container.py +
    24
    +25
    +26
    +27
    +28
    +29
    +30
    +31
    +32
    +33
    +34
    +35
    +36
    +37
    +38
    def test_system_log_events_content(self, browser: Page) -> None:
    +    """Проверяет содержимое контейнера для отображения событий системного журнала.
    +
    +    Args:
    +        browser: Экземпляр страницы Playwright.
    +    """
    +
    +    lp = LoginPage(browser)
    +    lp.do_login()
    +
    +    mp = MainPage(browser)
    +    mp.should_be_event_panel()
    +
    +    system_log_events_container = mp.click_events_panel_system_log_tab()
    +    system_log_events_container.check_content()
    +
    +
    +
    + +
    + + + +
    + +
    + +
    + + + + +
    + +
    + +
    + + + + + + + + + + + + + +
    +
    + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + + \ No newline at end of file diff --git a/site/tests/e2e/test_templates_tab/index.html b/site/tests/e2e/test_templates_tab/index.html index 405ebd8..7fe9083 100644 --- a/site/tests/e2e/test_templates_tab/index.html +++ b/site/tests/e2e/test_templates_tab/index.html @@ -9,7 +9,7 @@ - + @@ -751,6 +751,27 @@ +
  • + + + + + EventsContainerComponent + + + + +
  • + + + + + + + + + +
  • @@ -898,6 +919,27 @@ +
  • + + + + + SystemLogEventsContainer + + + + +
  • + + + + + + + + + +
  • @@ -1543,6 +1585,27 @@ + + + + + + +
  • + + + + + ZTPTemplatesTab + + + + +
  • + + + + @@ -1754,6 +1817,27 @@ + + +
  • + + + + + TestSystemLogEventsContainer + + + + +
  • + + + + + + + + @@ -1940,6 +2024,27 @@ + + + + + + +
  • + + + + + TestZTPTemplatesTab + + + + +
  • + + + + @@ -2447,13 +2552,12 @@

    Набор тестов для вкладки 'Шаблоны'.

    Проверяет корректность отображения и функциональность элементов вкладки Шаблоны.

    Тесты покрывают следующие сценарии: -1. test_templates_tab_content - Проверка содержимого вкладки (тулбар, таблица шаблонов) -2. test_templates_table_row_highlighting - Проверка выделения строк в таблице шаблонов -3. test_templates_table_scrolling - Проверка вертикального скроллинга таблицы шаблонов -4. test_templates_modal_window_content - Проверка содержимого модального окна шаблона -5. test_templates_modal_window_scrolling - Проверка скроллинга модального окна шаблона -6. test_templates_modal_window_api_data_consistency - [В разработке] - Проверка соответствия данных модального окна данным из API

    +1. test_templates_tab_content - Проверка содержимого вкладки +2. test_templates_table_row_highlighting - Проверка выделения строк в таблице +3. test_templates_table_scrolling - Проверка вертикального скроллинга таблицы +4. test_templates_modal_window_content - Проверка содержимого модального окна +5. test_templates_modal_window_scrolling - Проверка скроллинга модального окна +6. test_templates_modal_window_api_data_consistency - Проверка соответствия данных API

    @@ -2463,7 +2567,8 @@
    Source code in tests\e2e\test_templates_tab.py -
     15
    +                
     14
    + 15
      16
      17
      18
    @@ -2706,23 +2811,18 @@
     255
     256
     257
    -258
    -259
    -260
    -261
    -262
    class TestTemplatesTab:
    +258
    class TestTemplatesTab:
         """Набор тестов для вкладки 'Шаблоны'.
     
         Проверяет корректность отображения и функциональность элементов вкладки Шаблоны.
     
         Тесты покрывают следующие сценарии:
    -    1. test_templates_tab_content - Проверка содержимого вкладки (тулбар, таблица шаблонов)
    -    2. test_templates_table_row_highlighting - Проверка выделения строк в таблице шаблонов
    -    3. test_templates_table_scrolling - Проверка вертикального скроллинга таблицы шаблонов
    -    4. test_templates_modal_window_content - Проверка содержимого модального окна шаблона
    -    5. test_templates_modal_window_scrolling - Проверка скроллинга модального окна шаблона
    -    6. test_templates_modal_window_api_data_consistency - [В разработке]
    -       Проверка соответствия данных модального окна данным из API
    +    1. test_templates_tab_content - Проверка содержимого вкладки
    +    2. test_templates_table_row_highlighting - Проверка выделения строк в таблице
    +    3. test_templates_table_scrolling - Проверка вертикального скроллинга таблицы
    +    4. test_templates_modal_window_content - Проверка содержимого модального окна
    +    5. test_templates_modal_window_scrolling - Проверка скроллинга модального окна
    +    6. test_templates_modal_window_api_data_consistency - Проверка соответствия данных API
         """
     
         @pytest.fixture(scope="function", autouse=True)
    @@ -2745,7 +2845,6 @@
             main_page.click_main_navigation_panel_item("Настройки")
             main_page.click_subpanel_item("Шаблоны")
     
    -    @pytest.mark.skip(reason="Временно исключено из тестирования")
         def test_templates_tab_content(self, browser: Page) -> None:
             """Тест содержимого вкладки 'Шаблоны'.
     
    @@ -2768,7 +2867,6 @@
             # Проверка содержимого таблицы шаблонов
             templates_tab.check_templates_table_content()
     
    -    @pytest.mark.skip(reason="Временно исключено из тестирования")
         def test_templates_table_row_highlighting(self, browser: Page) -> None:
             """Проверка выделения строк в таблице шаблонов.
     
    @@ -2794,7 +2892,6 @@
             templates_tab.check_templates_table_row_highlighting(rows_count - 1)
             templates_tab.check_templates_table_row_highlighting(int(rows_count / 2))
     
    -    @pytest.mark.skip(reason="Временно исключено из тестирования")
         def test_templates_table_scrolling(self, browser: Page) -> None:
             """Проверка вертикального скроллинга таблицы шаблонов.
     
    @@ -2830,12 +2927,11 @@
                 # Проверка видимости первой строки после прокрутки
                 templates_tab.check_templates_table_first_row_visibility()
             else:
    -            print("Таблица не поддерживает вертикальный скроллинг - проверяем базовую функциональность")
    +            print("Таблица не поддерживает вертикальный скроллинг")
     
                 # Проверка видимости первой строки
                 templates_tab.check_templates_table_first_row_visibility()
     
    -    @pytest.mark.skip(reason="Временно исключено из тестирования")
         def test_templates_modal_window_content(self, browser: Page) -> None:
             """Тест содержимого модального окна шаблона.
     
    @@ -2873,7 +2969,6 @@
             # Проверяем, что модальное окно закрылось
             templates_tab.should_not_be_modal_window()
     
    -    @pytest.mark.skip(reason="Временно исключено из тестирования")
         def test_templates_modal_window_scrolling(self, browser: Page) -> None:
             """Тест скроллинга модального окна шаблона.
     
    @@ -2923,7 +3018,7 @@
             # Проверяем, что модальное окно закрылось
             templates_tab.should_not_be_modal_window()
     
    -    #@pytest.mark.skip(reason="Разрабатывается. Временно исключено из тестирования")
    +    # @pytest.mark.skip(reason="Разрабатывается. Временно исключено из тестирования")
         def test_templates_modal_window_api_data_consistency(self, browser: Page) -> None:
             """Тест соответствия данных модального окна данным из API.
     
    @@ -2951,7 +3046,10 @@
             templates_tab.should_be_modal_window()
     
             # Проверка соответствия данных модального окна данным из API
    -        templates_tab.verify_json_container_content()
    +        templates_tab.verify_json_container_content(
    +            template_name,
    +            save_to_file=False
    +        )
     
             # Закрытие модального окна через кнопку закрытия
             templates_tab.close_modal_window_by_toolbar_button(template_name)
    @@ -2992,7 +3090,9 @@
     
                 
    Source code in tests\e2e\test_templates_tab.py -
    30
    +              
    28
    +29
    +30
     31
     32
     33
    @@ -3008,9 +3108,7 @@
     43
     44
     45
    -46
    -47
    -48
    @pytest.fixture(scope="function", autouse=True)
    +46
    @pytest.fixture(scope="function", autouse=True)
     def setup(self, browser: Page) -> None:
         """Фикстура для подготовки тестового окружения.
     
    @@ -3055,7 +3153,14 @@
     
                 
    Source code in tests\e2e\test_templates_tab.py -
    229
    +              
    222
    +223
    +224
    +225
    +226
    +227
    +228
    +229
     230
     231
     232
    @@ -3084,11 +3189,7 @@
     255
     256
     257
    -258
    -259
    -260
    -261
    -262
    def test_templates_modal_window_api_data_consistency(self, browser: Page) -> None:
    +258
    def test_templates_modal_window_api_data_consistency(self, browser: Page) -> None:
         """Тест соответствия данных модального окна данным из API.
     
         Проверяет:
    @@ -3115,7 +3216,10 @@
         templates_tab.should_be_modal_window()
     
         # Проверка соответствия данных модального окна данным из API
    -    templates_tab.verify_json_container_content()
    +    templates_tab.verify_json_container_content(
    +        template_name,
    +        save_to_file=False
    +    )
     
         # Закрытие модального окна через кнопку закрытия
         templates_tab.close_modal_window_by_toolbar_button(template_name)
    @@ -3150,7 +3254,12 @@
     
                 
    Source code in tests\e2e\test_templates_tab.py -
    140
    +              
    135
    +136
    +137
    +138
    +139
    +140
     141
     142
     143
    @@ -3180,14 +3289,7 @@
     167
     168
     169
    -170
    -171
    -172
    -173
    -174
    -175
    -176
    @pytest.mark.skip(reason="Временно исключено из тестирования")
    -def test_templates_modal_window_content(self, browser: Page) -> None:
    +170
    def test_templates_modal_window_content(self, browser: Page) -> None:
         """Тест содержимого модального окна шаблона.
     
         Проверяет:
    @@ -3249,7 +3351,13 @@
     
                 
    Source code in tests\e2e\test_templates_tab.py -
    178
    +              
    172
    +173
    +174
    +175
    +176
    +177
    +178
     179
     180
     181
    @@ -3290,15 +3398,7 @@
     216
     217
     218
    -219
    -220
    -221
    -222
    -223
    -224
    -225
    -226
    @pytest.mark.skip(reason="Временно исключено из тестирования")
    -def test_templates_modal_window_scrolling(self, browser: Page) -> None:
    +219
    def test_templates_modal_window_scrolling(self, browser: Page) -> None:
         """Тест скроллинга модального окна шаблона.
     
         Проверяет:
    @@ -3372,7 +3472,9 @@
     
                 
    Source code in tests\e2e\test_templates_tab.py -
    50
    +              
    48
    +49
    +50
     51
     52
     53
    @@ -3390,11 +3492,7 @@
     65
     66
     67
    -68
    -69
    -70
    -71
    @pytest.mark.skip(reason="Временно исключено из тестирования")
    -def test_templates_tab_content(self, browser: Page) -> None:
    +68
    def test_templates_tab_content(self, browser: Page) -> None:
         """Тест содержимого вкладки 'Шаблоны'.
     
         Проверяет:
    @@ -3441,7 +3539,10 @@
     
                 
    Source code in tests\e2e\test_templates_tab.py -
    73
    +              
    70
    +71
    +72
    +73
     74
     75
     76
    @@ -3461,12 +3562,7 @@
     90
     91
     92
    -93
    -94
    -95
    -96
    -97
    @pytest.mark.skip(reason="Временно исключено из тестирования")
    -def test_templates_table_row_highlighting(self, browser: Page) -> None:
    +93
    def test_templates_table_row_highlighting(self, browser: Page) -> None:
         """Проверка выделения строк в таблице шаблонов.
     
         Проверяет корректность выделения строк при клике на различные позиции:
    @@ -3516,7 +3612,11 @@
     
                 
    Source code in tests\e2e\test_templates_tab.py -
     99
    +              
     95
    + 96
    + 97
    + 98
    + 99
     100
     101
     102
    @@ -3550,13 +3650,7 @@
     130
     131
     132
    -133
    -134
    -135
    -136
    -137
    -138
    @pytest.mark.skip(reason="Временно исключено из тестирования")
    -def test_templates_table_scrolling(self, browser: Page) -> None:
    +133
    def test_templates_table_scrolling(self, browser: Page) -> None:
         """Проверка вертикального скроллинга таблицы шаблонов.
     
         Проверяет:
    @@ -3591,7 +3685,7 @@
             # Проверка видимости первой строки после прокрутки
             templates_tab.check_templates_table_first_row_visibility()
         else:
    -        print("Таблица не поддерживает вертикальный скроллинг - проверяем базовую функциональность")
    +        print("Таблица не поддерживает вертикальный скроллинг")
     
             # Проверка видимости первой строки
             templates_tab.check_templates_table_first_row_visibility()
    diff --git a/site/tests/e2e/test_user_card/index.html b/site/tests/e2e/test_user_card/index.html
    index c12044b..bb54f17 100644
    --- a/site/tests/e2e/test_user_card/index.html
    +++ b/site/tests/e2e/test_user_card/index.html
    @@ -751,6 +751,27 @@
       
       
       
    +    
  • + + + + + EventsContainerComponent + + + + +
  • + + + + + + + + + +
  • @@ -898,6 +919,27 @@ +
  • + + + + + SystemLogEventsContainer + + + + +
  • + + + + + + + + + +
  • @@ -1543,6 +1585,27 @@ + + + + + + +
  • + + + + + ZTPTemplatesTab + + + + +
  • + + + + @@ -1756,6 +1819,27 @@ +
  • + + + + + TestSystemLogEventsContainer + + + + +
  • + + + + + + + + + +
  • @@ -1949,6 +2033,27 @@ + + + + + + +
  • + + + + + TestZTPTemplatesTab + + + + +
  • + + + + diff --git a/site/tests/e2e/test_users_tab/index.html b/site/tests/e2e/test_users_tab/index.html index 6a4af2c..2a58a74 100644 --- a/site/tests/e2e/test_users_tab/index.html +++ b/site/tests/e2e/test_users_tab/index.html @@ -12,7 +12,7 @@ - + @@ -751,6 +751,27 @@ +
  • + + + + + EventsContainerComponent + + + + +
  • + + + + + + + + + +
  • @@ -898,6 +919,27 @@ +
  • + + + + + SystemLogEventsContainer + + + + +
  • + + + + + + + + + +
  • @@ -1543,6 +1585,27 @@ + + + + + + +
  • + + + + + ZTPTemplatesTab + + + + +
  • + + + + @@ -1756,6 +1819,27 @@ +
  • + + + + + TestSystemLogEventsContainer + + + + +
  • + + + + + + + + + +
  • @@ -1985,6 +2069,27 @@ + + + + + + +
  • + + + + + TestZTPTemplatesTab + + + + +
  • + + + + diff --git a/site/tests/e2e/test_ztp_templates_tab/index.html b/site/tests/e2e/test_ztp_templates_tab/index.html new file mode 100644 index 0000000..9c0780d --- /dev/null +++ b/site/tests/e2e/test_ztp_templates_tab/index.html @@ -0,0 +1,3837 @@ + + + + + + + + + + + + + + + + + + + + + + + TestZTPTemplatesTab - Документация тестов eNODE-Мониторинг + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + +
    + + + + + + +
    + + +
    + +
    + + + + + + +
    +
    + + + +
    +
    +
    + + + + + +
    +
    +
    + + + + + + + +
    +
    + + + + +

    TestZTPTemplatesTab

    + + +
    + + + + +
    + +

    Модуль тестов вкладки 'Шаблоны' в модуле Zero Touch Provisioning.

    +

    Содержит тесты для проверки функциональности +работы с шаблонами.

    + + + + + + + + + +
    + + + + + + + + +
    + + + +

    + TestZTPTemplatesTab + + +

    + + +
    + + +

    Набор тестов для вкладки 'Шаблоны' в модуле Zero Touch Provisioning.

    +

    Проверяет корректность отображения, функциональность элементов интерфейса +и консистентность данных между UI и API на вкладке шаблонов ZTP.

    +

    Тесты покрывают следующие функциональные области: +1. test_templates_tab_content - Базовая структура и содержимое вкладки +2. test_templates_table_row_highlighting - Визуальное выделение строк таблицы +3. test_templates_table_scrolling - Навигация по таблице с большим объемом данных +4. test_templates_modal_window_content - Структура и содержимое модальных окон +5. test_templates_modal_window_scrolling - Навигация в модальных окнах +6. test_templates_modal_window_api_data_consistency - Синхронизация данных UI и API

    +

    Фикстура setup обеспечивает подготовку тестового окружения: +- Авторизацию в системе +- Навигацию к целевой вкладке через панель настроек +- Инициализацию необходимых компонентов страницы

    + + + + + + + +
    + Source code in tests\e2e\test_ztp_templates_tab.py +
     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
    +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 TestZTPTemplatesTab:
    +    """Набор тестов для вкладки 'Шаблоны' в модуле Zero Touch Provisioning.
    +
    +    Проверяет корректность отображения, функциональность элементов интерфейса
    +    и консистентность данных между UI и API на вкладке шаблонов ZTP.
    +
    +    Тесты покрывают следующие функциональные области:
    +    1. test_templates_tab_content - Базовая структура и содержимое вкладки
    +    2. test_templates_table_row_highlighting - Визуальное выделение строк таблицы
    +    3. test_templates_table_scrolling - Навигация по таблице с большим объемом данных
    +    4. test_templates_modal_window_content - Структура и содержимое модальных окон
    +    5. test_templates_modal_window_scrolling - Навигация в модальных окнах
    +    6. test_templates_modal_window_api_data_consistency - Синхронизация данных UI и API
    +
    +    Фикстура setup обеспечивает подготовку тестового окружения:
    +    - Авторизацию в системе
    +    - Навигацию к целевой вкладке через панель настроек
    +    - Инициализацию необходимых компонентов страницы
    +    """
    +
    +    @pytest.fixture(scope="function", autouse=True)
    +    def setup(self, browser: Page) -> None:
    +        """Фикстура для подготовки тестового окружения.
    +
    +        Выполняет:
    +        1. Авторизацию в системе
    +        2. Переход на вкладку 'Шаблоны' через панель навигации
    +        """
    +        # Авторизация в системе
    +        login_page = LoginPage(browser)
    +        login_page.do_login()
    +
    +        # Инициализация главной страницы
    +        main_page = MainPage(browser)
    +
    +        # Проверка и взаимодействие с элементами навигации
    +        main_page.should_be_navigation_panel()
    +        main_page.click_main_navigation_panel_item("Настройки")
    +        main_page.click_subpanel_item("Zero Touch Provisioning")
    +        main_page.click_subpanel_item("Шаблоны", parent="Zero Touch Provisioning")
    +        main_page.wait_for_timeout(5000)
    +
    +
    +    def test_templates_tab_content(self, browser: Page) -> None:
    +        """Тест содержимого вкладки 'Шаблоны'.
    +
    +        Проверяет:
    +        1. Наличие и корректность тулбара
    +        2. Наличие таблицы шаблонов
    +        3. Соответствие содержимого таблицы
    +        """
    +        # Инициализация страницы сеансов
    +        ztp_templates_tab = ZTPTemplatesTab(browser)
    +
    +        # Проверка тулбара вкладки
    +        ztp_templates_tab.should_be_toolbar()
    +
    +        # Проверка наличия таблицы шаблонов
    +        ztp_templates_tab.should_be_templates_table()
    +
    +        browser.wait_for_timeout(5000)
    +
    +        # Проверка содержимого таблицы шаблонов
    +        ztp_templates_tab.check_templates_table_content()
    +
    +    def test_templates_table_row_highlighting(self, browser: Page) -> None:
    +        """Проверка выделения строк в таблице шаблонов.
    +
    +        Проверяет корректность выделения строк при клике на различные позиции:
    +        1. Первая строка
    +        2. Последняя строка
    +        3. Строка в середине таблицы
    +        """
    +
    +        ztp_templates_tab = ZTPTemplatesTab(browser)
    +
    +        # Проверка тулбара вкладки
    +        ztp_templates_tab.should_be_toolbar()
    +
    +        # Проверка наличия таблицы шаблонов
    +        ztp_templates_tab.should_be_templates_table()
    +
    +        # Получение количества строк в таблице
    +        rows_count = ztp_templates_tab.get_rows_count()
    +
    +        # Проверка выделения строк
    +        ztp_templates_tab.check_templates_table_row_highlighting(0)
    +        ztp_templates_tab.check_templates_table_row_highlighting(rows_count - 1)
    +        ztp_templates_tab.check_templates_table_row_highlighting(int(rows_count / 2))
    +
    +    def test_templates_table_scrolling(self, browser: Page) -> None:
    +        """Проверка вертикального скроллинга таблицы шаблонов.
    +
    +        Проверяет:
    +        1. Возможность вертикальной прокрутки таблицы
    +        2. Видимость строк после прокрутки вниз и вверх
    +        3. Корректность отображения данных после скроллинга
    +        """
    +
    +        ztp_templates_tab = ZTPTemplatesTab(browser)
    +
    +        browser.wait_for_timeout(2000)
    +
    +        # Проверка возможности вертикального скроллинга
    +        is_scrollable = ztp_templates_tab.check_templates_table_vertical_scrolling()
    +
    +        if is_scrollable:
    +            print("Таблица поддерживает вертикальный скроллинг")
    +
    +            # Прокрутка вниз
    +            ztp_templates_tab.scroll_templates_table_down()
    +
    +            browser.wait_for_timeout(1000)
    +
    +            # Проверка видимости последней строки после прокрутки
    +            ztp_templates_tab.check_templates_table_last_row_visibility()
    +
    +            # Прокрутка вверх
    +            ztp_templates_tab.scroll_templates_table_up()
    +
    +            browser.wait_for_timeout(1000)
    +
    +            # Проверка видимости первой строки после прокрутки
    +            ztp_templates_tab.check_templates_table_first_row_visibility()
    +        else:
    +            print("Таблица не поддерживает вертикальный скроллинг")
    +
    +            # Проверка видимости первой строки
    +            ztp_templates_tab.check_templates_table_first_row_visibility()
    +
    +    def test_templates_modal_window_content(self, browser: Page) -> None:
    +        """Тест содержимого модального окна шаблона.
    +
    +        Проверяет:
    +        1. Открытие модального окна при клике на строку таблицы
    +        2. Наличие и содержимое модального окна
    +        3. Наличие тулбара в модальном окне
    +        4. Проверка кнопки закрытия и её подсказки
    +        5. Закрытие модального окна
    +        """
    +        # Инициализация страницы шаблонов
    +        ztp_templates_tab = ZTPTemplatesTab(browser)
    +
    +        # Проверка наличия таблицы шаблонов
    +        ztp_templates_tab.should_be_templates_table()
    +
    +        # Добавляем задержку для загрузки данных
    +        browser.wait_for_timeout(2000)
    +
    +        # Открываем модальное окно, кликая на первую строку таблицы
    +        template_name = ztp_templates_tab.open_template_modal_by_index(0)
    +
    +        # Добавляем задержку для открытия модального окна
    +        browser.wait_for_timeout(1000)
    +
    +        # Проверка открытия модального окна
    +        ztp_templates_tab.should_be_modal_window()
    +
    +        # Проверка содержимого модального окна
    +        ztp_templates_tab.check_templates_modal_content(template_name)
    +
    +        # Закрытие модального окна через кнопку закрытия
    +        ztp_templates_tab.close_modal_window_by_toolbar_button(template_name)
    +
    +        # Проверяем, что модальное окно закрылось
    +        ztp_templates_tab.should_not_be_modal_window()
    +
    +    #@pytest.mark.skip(reason=" Временно исключено из тестирования")
    +    def test_templates_modal_window_scrolling(self, browser: Page) -> None:
    +        """Тест скроллинга модального окна шаблона.
    +
    +        Проверяет:
    +        1. Открытие модального окна при клике на строку таблицы
    +        2. Возможность вертикального скроллинга содержимого модального окна
    +        3. Закрытие модального окна
    +        """
    +
    +        # Инициализация страницы шаблонов
    +        ztp_templates_tab = ZTPTemplatesTab(browser)
    +
    +        # Проверка наличия таблицы шаблонов
    +        ztp_templates_tab.should_be_templates_table()
    +
    +        # Добавляем задержку для загрузки данных
    +        browser.wait_for_timeout(2000)
    +
    +        # Открываем модальное окно, кликая на первую строку таблицы
    +        template_name = ztp_templates_tab.open_template_modal_by_index(0)
    +
    +        # Добавляем задержку для открытия модального окна
    +        browser.wait_for_timeout(1000)
    +
    +        # Проверка открытия модального окна
    +        ztp_templates_tab.should_be_modal_window()
    +
    +        # Проверка вертикального скроллинга модального окна
    +        is_scrollable = ztp_templates_tab.check_modal_vertical_scrolling()
    +
    +        if is_scrollable:
    +            print("Модальное окно поддерживает вертикальный скроллинг")
    +
    +            # Прокрутка вниз
    +            ztp_templates_tab.scroll_modal_down()
    +            browser.wait_for_timeout(1000)
    +
    +            # Прокрутка вверх
    +            ztp_templates_tab.scroll_modal_up()
    +            browser.wait_for_timeout(1000)
    +        else:
    +            print("Модальное окно не поддерживает вертикальный скроллинг")
    +
    +        # Закрытие модального окна через кнопку закрытия
    +        ztp_templates_tab.close_modal_window_by_toolbar_button(template_name)
    +
    +        # Проверяем, что модальное окно закрылось
    +        ztp_templates_tab.should_not_be_modal_window()
    +
    +    #@pytest.mark.skip(reason=" Временно исключено из тестирования")
    +    def test_templates_modal_window_api_data_consistency(self, browser: Page) -> None:
    +        """Тест соответствия данных модального окна шаблона данным из API.
    +
    +        Проверяет консистентность данных между интерфейсом пользователя и API:
    +        1. Открытие модального окна просмотра шаблона по клику на строку таблицы
    +        2. Получение и валидация данных из полей модального окна
    +        3. Сравнение данных UI с эталонными данными из API запроса
    +        4. Проверка корректности отображения всех параметров шаблона
    +        5. Закрытие модального окна после проверки
    +
    +        Args:
    +            browser (Page): Экземпляр страницы Playwright для взаимодействия с UI.
    +        """
    +        # Инициализация страницы шаблонов
    +        ztp_templates_tab = ZTPTemplatesTab(browser)
    +
    +        # Проверка наличия таблицы шаблонов
    +        ztp_templates_tab.should_be_templates_table()
    +
    +        # Добавляем задержку для загрузки данных
    +        browser.wait_for_timeout(5000)
    +
    +        # Открываем модальное окно, кликая на первую строку таблицы и возвращаем имя заголовка
    +        template_name = ztp_templates_tab.open_template_modal_by_index(0)
    +
    +        # Добавляем задержку для открытия модального окна
    +        browser.wait_for_timeout(2000)
    +
    +        # Проверка открытия модального окна
    +        ztp_templates_tab.should_be_modal_window()
    +
    +        # Проверка соответствия данных модального окна данным из API
    +        ztp_templates_tab.verify_template_data_with_api(template_name)
    +
    +        # Закрытие модального окна через кнопку закрытия
    +        ztp_templates_tab.close_modal_window_by_toolbar_button(template_name)
    +
    +        # Проверяем, что модальное окно закрылось
    +        ztp_templates_tab.should_not_be_modal_window()
    +
    +
    + + + +
    + + + + + + + + + +
    + + +

    + setup(browser) + +

    + + +
    + +

    Фикстура для подготовки тестового окружения.

    +

    Выполняет: +1. Авторизацию в системе +2. Переход на вкладку 'Шаблоны' через панель навигации

    + + +
    + Source code in tests\e2e\test_ztp_templates_tab.py +
    34
    +35
    +36
    +37
    +38
    +39
    +40
    +41
    +42
    +43
    +44
    +45
    +46
    +47
    +48
    +49
    +50
    +51
    +52
    +53
    +54
    @pytest.fixture(scope="function", autouse=True)
    +def setup(self, browser: Page) -> None:
    +    """Фикстура для подготовки тестового окружения.
    +
    +    Выполняет:
    +    1. Авторизацию в системе
    +    2. Переход на вкладку 'Шаблоны' через панель навигации
    +    """
    +    # Авторизация в системе
    +    login_page = LoginPage(browser)
    +    login_page.do_login()
    +
    +    # Инициализация главной страницы
    +    main_page = MainPage(browser)
    +
    +    # Проверка и взаимодействие с элементами навигации
    +    main_page.should_be_navigation_panel()
    +    main_page.click_main_navigation_panel_item("Настройки")
    +    main_page.click_subpanel_item("Zero Touch Provisioning")
    +    main_page.click_subpanel_item("Шаблоны", parent="Zero Touch Provisioning")
    +    main_page.wait_for_timeout(5000)
    +
    +
    +
    + +
    + +
    + + +

    + test_templates_modal_window_api_data_consistency(browser) + +

    + + +
    + +

    Тест соответствия данных модального окна шаблона данным из API.

    +

    Проверяет консистентность данных между интерфейсом пользователя и API: +1. Открытие модального окна просмотра шаблона по клику на строку таблицы +2. Получение и валидация данных из полей модального окна +3. Сравнение данных UI с эталонными данными из API запроса +4. Проверка корректности отображения всех параметров шаблона +5. Закрытие модального окна после проверки

    + + +

    Parameters:

    + + + + + + + + + + + + + + + + + +
    NameTypeDescriptionDefault
    + browser + + Page + +
    +

    Экземпляр страницы Playwright для взаимодействия с UI.

    +
    +
    + required +
    + + +
    + Source code in tests\e2e\test_ztp_templates_tab.py +
    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
    def test_templates_modal_window_api_data_consistency(self, browser: Page) -> None:
    +    """Тест соответствия данных модального окна шаблона данным из API.
    +
    +    Проверяет консистентность данных между интерфейсом пользователя и API:
    +    1. Открытие модального окна просмотра шаблона по клику на строку таблицы
    +    2. Получение и валидация данных из полей модального окна
    +    3. Сравнение данных UI с эталонными данными из API запроса
    +    4. Проверка корректности отображения всех параметров шаблона
    +    5. Закрытие модального окна после проверки
    +
    +    Args:
    +        browser (Page): Экземпляр страницы Playwright для взаимодействия с UI.
    +    """
    +    # Инициализация страницы шаблонов
    +    ztp_templates_tab = ZTPTemplatesTab(browser)
    +
    +    # Проверка наличия таблицы шаблонов
    +    ztp_templates_tab.should_be_templates_table()
    +
    +    # Добавляем задержку для загрузки данных
    +    browser.wait_for_timeout(5000)
    +
    +    # Открываем модальное окно, кликая на первую строку таблицы и возвращаем имя заголовка
    +    template_name = ztp_templates_tab.open_template_modal_by_index(0)
    +
    +    # Добавляем задержку для открытия модального окна
    +    browser.wait_for_timeout(2000)
    +
    +    # Проверка открытия модального окна
    +    ztp_templates_tab.should_be_modal_window()
    +
    +    # Проверка соответствия данных модального окна данным из API
    +    ztp_templates_tab.verify_template_data_with_api(template_name)
    +
    +    # Закрытие модального окна через кнопку закрытия
    +    ztp_templates_tab.close_modal_window_by_toolbar_button(template_name)
    +
    +    # Проверяем, что модальное окно закрылось
    +    ztp_templates_tab.should_not_be_modal_window()
    +
    +
    +
    + +
    + +
    + + +

    + test_templates_modal_window_content(browser) + +

    + + +
    + +

    Тест содержимого модального окна шаблона.

    +

    Проверяет: +1. Открытие модального окна при клике на строку таблицы +2. Наличие и содержимое модального окна +3. Наличие тулбара в модальном окне +4. Проверка кнопки закрытия и её подсказки +5. Закрытие модального окна

    + + +
    + Source code in tests\e2e\test_ztp_templates_tab.py +
    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
    def test_templates_modal_window_content(self, browser: Page) -> None:
    +    """Тест содержимого модального окна шаблона.
    +
    +    Проверяет:
    +    1. Открытие модального окна при клике на строку таблицы
    +    2. Наличие и содержимое модального окна
    +    3. Наличие тулбара в модальном окне
    +    4. Проверка кнопки закрытия и её подсказки
    +    5. Закрытие модального окна
    +    """
    +    # Инициализация страницы шаблонов
    +    ztp_templates_tab = ZTPTemplatesTab(browser)
    +
    +    # Проверка наличия таблицы шаблонов
    +    ztp_templates_tab.should_be_templates_table()
    +
    +    # Добавляем задержку для загрузки данных
    +    browser.wait_for_timeout(2000)
    +
    +    # Открываем модальное окно, кликая на первую строку таблицы
    +    template_name = ztp_templates_tab.open_template_modal_by_index(0)
    +
    +    # Добавляем задержку для открытия модального окна
    +    browser.wait_for_timeout(1000)
    +
    +    # Проверка открытия модального окна
    +    ztp_templates_tab.should_be_modal_window()
    +
    +    # Проверка содержимого модального окна
    +    ztp_templates_tab.check_templates_modal_content(template_name)
    +
    +    # Закрытие модального окна через кнопку закрытия
    +    ztp_templates_tab.close_modal_window_by_toolbar_button(template_name)
    +
    +    # Проверяем, что модальное окно закрылось
    +    ztp_templates_tab.should_not_be_modal_window()
    +
    +
    +
    + +
    + +
    + + +

    + test_templates_modal_window_scrolling(browser) + +

    + + +
    + +

    Тест скроллинга модального окна шаблона.

    +

    Проверяет: +1. Открытие модального окна при клике на строку таблицы +2. Возможность вертикального скроллинга содержимого модального окна +3. Закрытие модального окна

    + + +
    + Source code in tests\e2e\test_ztp_templates_tab.py +
    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
    def test_templates_modal_window_scrolling(self, browser: Page) -> None:
    +    """Тест скроллинга модального окна шаблона.
    +
    +    Проверяет:
    +    1. Открытие модального окна при клике на строку таблицы
    +    2. Возможность вертикального скроллинга содержимого модального окна
    +    3. Закрытие модального окна
    +    """
    +
    +    # Инициализация страницы шаблонов
    +    ztp_templates_tab = ZTPTemplatesTab(browser)
    +
    +    # Проверка наличия таблицы шаблонов
    +    ztp_templates_tab.should_be_templates_table()
    +
    +    # Добавляем задержку для загрузки данных
    +    browser.wait_for_timeout(2000)
    +
    +    # Открываем модальное окно, кликая на первую строку таблицы
    +    template_name = ztp_templates_tab.open_template_modal_by_index(0)
    +
    +    # Добавляем задержку для открытия модального окна
    +    browser.wait_for_timeout(1000)
    +
    +    # Проверка открытия модального окна
    +    ztp_templates_tab.should_be_modal_window()
    +
    +    # Проверка вертикального скроллинга модального окна
    +    is_scrollable = ztp_templates_tab.check_modal_vertical_scrolling()
    +
    +    if is_scrollable:
    +        print("Модальное окно поддерживает вертикальный скроллинг")
    +
    +        # Прокрутка вниз
    +        ztp_templates_tab.scroll_modal_down()
    +        browser.wait_for_timeout(1000)
    +
    +        # Прокрутка вверх
    +        ztp_templates_tab.scroll_modal_up()
    +        browser.wait_for_timeout(1000)
    +    else:
    +        print("Модальное окно не поддерживает вертикальный скроллинг")
    +
    +    # Закрытие модального окна через кнопку закрытия
    +    ztp_templates_tab.close_modal_window_by_toolbar_button(template_name)
    +
    +    # Проверяем, что модальное окно закрылось
    +    ztp_templates_tab.should_not_be_modal_window()
    +
    +
    +
    + +
    + +
    + + +

    + test_templates_tab_content(browser) + +

    + + +
    + +

    Тест содержимого вкладки 'Шаблоны'.

    +

    Проверяет: +1. Наличие и корректность тулбара +2. Наличие таблицы шаблонов +3. Соответствие содержимого таблицы

    + + +
    + Source code in tests\e2e\test_ztp_templates_tab.py +
    57
    +58
    +59
    +60
    +61
    +62
    +63
    +64
    +65
    +66
    +67
    +68
    +69
    +70
    +71
    +72
    +73
    +74
    +75
    +76
    +77
    def test_templates_tab_content(self, browser: Page) -> None:
    +    """Тест содержимого вкладки 'Шаблоны'.
    +
    +    Проверяет:
    +    1. Наличие и корректность тулбара
    +    2. Наличие таблицы шаблонов
    +    3. Соответствие содержимого таблицы
    +    """
    +    # Инициализация страницы сеансов
    +    ztp_templates_tab = ZTPTemplatesTab(browser)
    +
    +    # Проверка тулбара вкладки
    +    ztp_templates_tab.should_be_toolbar()
    +
    +    # Проверка наличия таблицы шаблонов
    +    ztp_templates_tab.should_be_templates_table()
    +
    +    browser.wait_for_timeout(5000)
    +
    +    # Проверка содержимого таблицы шаблонов
    +    ztp_templates_tab.check_templates_table_content()
    +
    +
    +
    + +
    + +
    + + +

    + test_templates_table_row_highlighting(browser) + +

    + + +
    + +

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

    +

    Проверяет корректность выделения строк при клике на различные позиции: +1. Первая строка +2. Последняя строка +3. Строка в середине таблицы

    + + +
    + Source code in tests\e2e\test_ztp_templates_tab.py +
     79
    + 80
    + 81
    + 82
    + 83
    + 84
    + 85
    + 86
    + 87
    + 88
    + 89
    + 90
    + 91
    + 92
    + 93
    + 94
    + 95
    + 96
    + 97
    + 98
    + 99
    +100
    +101
    +102
    def test_templates_table_row_highlighting(self, browser: Page) -> None:
    +    """Проверка выделения строк в таблице шаблонов.
    +
    +    Проверяет корректность выделения строк при клике на различные позиции:
    +    1. Первая строка
    +    2. Последняя строка
    +    3. Строка в середине таблицы
    +    """
    +
    +    ztp_templates_tab = ZTPTemplatesTab(browser)
    +
    +    # Проверка тулбара вкладки
    +    ztp_templates_tab.should_be_toolbar()
    +
    +    # Проверка наличия таблицы шаблонов
    +    ztp_templates_tab.should_be_templates_table()
    +
    +    # Получение количества строк в таблице
    +    rows_count = ztp_templates_tab.get_rows_count()
    +
    +    # Проверка выделения строк
    +    ztp_templates_tab.check_templates_table_row_highlighting(0)
    +    ztp_templates_tab.check_templates_table_row_highlighting(rows_count - 1)
    +    ztp_templates_tab.check_templates_table_row_highlighting(int(rows_count / 2))
    +
    +
    +
    + +
    + +
    + + +

    + test_templates_table_scrolling(browser) + +

    + + +
    + +

    Проверка вертикального скроллинга таблицы шаблонов.

    +

    Проверяет: +1. Возможность вертикальной прокрутки таблицы +2. Видимость строк после прокрутки вниз и вверх +3. Корректность отображения данных после скроллинга

    + + +
    + Source code in tests\e2e\test_ztp_templates_tab.py +
    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
    def test_templates_table_scrolling(self, browser: Page) -> None:
    +    """Проверка вертикального скроллинга таблицы шаблонов.
    +
    +    Проверяет:
    +    1. Возможность вертикальной прокрутки таблицы
    +    2. Видимость строк после прокрутки вниз и вверх
    +    3. Корректность отображения данных после скроллинга
    +    """
    +
    +    ztp_templates_tab = ZTPTemplatesTab(browser)
    +
    +    browser.wait_for_timeout(2000)
    +
    +    # Проверка возможности вертикального скроллинга
    +    is_scrollable = ztp_templates_tab.check_templates_table_vertical_scrolling()
    +
    +    if is_scrollable:
    +        print("Таблица поддерживает вертикальный скроллинг")
    +
    +        # Прокрутка вниз
    +        ztp_templates_tab.scroll_templates_table_down()
    +
    +        browser.wait_for_timeout(1000)
    +
    +        # Проверка видимости последней строки после прокрутки
    +        ztp_templates_tab.check_templates_table_last_row_visibility()
    +
    +        # Прокрутка вверх
    +        ztp_templates_tab.scroll_templates_table_up()
    +
    +        browser.wait_for_timeout(1000)
    +
    +        # Проверка видимости первой строки после прокрутки
    +        ztp_templates_tab.check_templates_table_first_row_visibility()
    +    else:
    +        print("Таблица не поддерживает вертикальный скроллинг")
    +
    +        # Проверка видимости первой строки
    +        ztp_templates_tab.check_templates_table_first_row_visibility()
    +
    +
    +
    + +
    + + + +
    + +
    + +
    + + + + +
    + +
    + +
    + + + + + + + + + + + + + +
    +
    + + + +
    + +
    + + + +
    +
    +
    +
    + + + + + + + + + + \ No newline at end of file diff --git a/site/tools/fix_python_project/index.html b/site/tools/fix_python_project/index.html index d566fdf..01c1bd8 100644 --- a/site/tools/fix_python_project/index.html +++ b/site/tools/fix_python_project/index.html @@ -751,6 +751,27 @@ +
  • + + + + + EventsContainerComponent + + + + +
  • + + + + + + + + + +
  • @@ -898,6 +919,27 @@ +
  • + + + + + SystemLogEventsContainer + + + + +
  • + + + + + + + + + +
  • @@ -1543,6 +1585,27 @@ + + + + + + +
  • + + + + + ZTPTemplatesTab + + + + +
  • + + + + @@ -1752,6 +1815,27 @@ +
  • + + + + + TestSystemLogEventsContainer + + + + +
  • + + + + + + + + + +
  • @@ -1809,6 +1893,27 @@ + + + + + + +
  • + + + + + TestZTPTemplatesTab + + + + +
  • + + + + diff --git a/site/tools/logger/index.html b/site/tools/logger/index.html index 4b1af3b..696cacf 100644 --- a/site/tools/logger/index.html +++ b/site/tools/logger/index.html @@ -751,6 +751,27 @@ +
  • + + + + + EventsContainerComponent + + + + +
  • + + + + + + + + + +
  • @@ -898,6 +919,27 @@ +
  • + + + + + SystemLogEventsContainer + + + + +
  • + + + + + + + + + +
  • @@ -1543,6 +1585,27 @@ + + + + + + +
  • + + + + + ZTPTemplatesTab + + + + +
  • + + + + @@ -1752,6 +1815,27 @@ +
  • + + + + + TestSystemLogEventsContainer + + + + +
  • + + + + + + + + + +
  • @@ -1809,6 +1893,27 @@ + + + + + + +
  • + + + + + TestZTPTemplatesTab + + + + +
  • + + + +