{"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:

"},{"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":""},{"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:

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

"},{"location":"#_11","title":"\u0421\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0435 \u0442\u0435\u0441\u0442\u044b:","text":""},{"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":""},{"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:

\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:

"},{"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
"}]}