{"config":{"lang":["en"],"separator":"[\\s\\-]+","pipeline":["stopWordFilter"]},"docs":[{"location":"","title":"\u0414\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f \u0442\u0435\u0441\u0442\u043e\u0432\u043e\u0433\u043e \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u0430 eNODE-\u041c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043d\u0433","text":"
\u0410\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u0430\u044f \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f \u0434\u043b\u044f \u0442\u0435\u0441\u0442\u043e\u0432\u043e\u0433\u043e \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u0430, \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0430\u043d\u043d\u043e\u0433\u043e \u0434\u043b\u044f \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f eNODE-\u043c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043d\u0433.
"},{"location":"#_1","title":"\u041e\u0431\u0437\u043e\u0440 \u043f\u0440\u043e\u0435\u043a\u0442\u0430","text":"\u0424\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0430\u043d \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c:
Playwright - \u0434\u043b\u044f \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0430\u0446\u0438\u0438 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0430
Pytest - \u043a\u0430\u043a \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u0442\u0435\u0441\u0442\u043e\u0432\u044b\u0439 \u0434\u0432\u0438\u0436\u043e\u043a
Page Object Model - \u043f\u0430\u0442\u0442\u0435\u0440\u043d \u0434\u043b\u044f \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u0430\u0446\u0438\u0438 \u0442\u0435\u0441\u0442\u043e\u0432\u043e\u0433\u043e \u043a\u043e\u0434\u0430
MkDocs - \u0434\u043b\u044f \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438
Python 3.8+ - \u044f\u0437\u044b\u043a \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438
.env - \u0444\u0430\u0439\u043b \u0441 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u043c\u0438 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044fconftest.py - \u0444\u0438\u043a\u0441\u0442\u0443\u0440\u044b Pytest, \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438mkdocs.yml - \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438pytest.ini - \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f \u0442\u0435\u0441\u0442\u043e\u0432 (\u043c\u0430\u0440\u043a\u0435\u0440\u044b, \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b)requirements.txt - \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 Pythonsetup.py - \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f \u043f\u0430\u043a\u0435\u0442\u0430\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) -
\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 -
\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
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
\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
\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
\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
\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
\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
bash pip install -e . \u0417\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u0435 \u0442\u0435\u0441\u0442\u044b:
bash
"},{"location":"#_8","title":"\u0412\u0441\u0435 \u0442\u0435\u0441\u0442\u044b","text":"pytest tests/ -v
"},{"location":"#smoke-","title":"\u0422\u043e\u043b\u044c\u043a\u043e smoke-\u0442\u0435\u0441\u0442\u044b","text":"pytest tests/ -m smoke -v
"},{"location":"#_9","title":"\u0421\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0439\u0442\u0435 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044e:","text":"bash
mkdocs serve
"},{"location":"#_10","title":"\u041f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u043c\u044b\u0435 \u0442\u0435\u0441\u0442\u044b","text":"\u0410\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u044f (\u0443\u0441\u043f\u0435\u0448\u043d\u0430\u044f/\u043d\u0435\u0443\u0434\u0430\u0447\u043d\u0430\u044f)
\u0423\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0441\u0435\u0441\u0441\u0438\u044f\u043c\u0438:
\u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0442\u0430\u0431\u043b\u0438\u0446\u044b
\u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u0441\u0435\u0441\u0441\u0438\u0439
\u041c\u043e\u0434\u0430\u043b\u044c\u043d\u044b\u0435 \u043e\u043a\u043d\u0430
\u0423\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\u043c\u0438:
\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435/\u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0435
\u0418\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u0440\u043e\u043b\u0435\u0439
\u0421\u0431\u0440\u043e\u0441 \u043f\u0430\u0440\u043e\u043b\u0435\u0439
\u0421\u0442\u0430\u0442\u0443\u0441 \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432
\u041b\u0438\u0446\u0435\u043d\u0437\u0438\u0438
\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 incomponents\\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 Defaultpage Page \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.
required Source code incomponents\\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 Defaulttext str \u0422\u0435\u043a\u0441\u0442 \u0434\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438.
requiredtimeout 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 DescriptionAssertionError \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 incomponents\\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 Defaulttext 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.
requiredRaises:
Type DescriptionAssertionError \u0415\u0441\u043b\u0438 alert-\u043e\u043a\u043d\u043e \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u043e.
Source code incomponents\\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 Defaultalert_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.
requiredRaises:
Type DescriptionAssertionError \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 incomponents\\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 Descriptionstr str \u0422\u0438\u043f alert-\u043e\u043a\u043d\u0430.
Raises:
Type DescriptionValueError \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 incomponents\\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 Descriptionstr str \u0422\u0435\u043a\u0441\u0442 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f.
Source code incomponents\\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 incomponents\\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 Defaultpage Page \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.
required Source code incomponents\\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 Defaultlocator 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).
requiredmsg 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.
requiredRaises:
Type DescriptionAssertionError \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 incomponents\\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 Defaultlocator 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).
requiredmsg 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.
requiredRaises:
Type DescriptionAssertionError \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 incomponents\\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 Defaultlocator 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.
requiredReturns:
Name Type DescriptionLocator 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 DescriptionTypeError \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 incomponents\\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 Defaultlocator str | Locator \u043b\u043e\u043a\u0430\u0442\u043e\u0440 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430.
requiredReturns:
Name Type Descriptionbool 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 incomponents\\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 Defaultlocator str | Locator \u043b\u043e\u043a\u0430\u0442\u043e\u0440 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430.
requiredReturns:
Name Type Descriptionbool 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 incomponents\\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 Defaultlocator str | Locator \u043b\u043e\u043a\u0430\u0442\u043e\u0440 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430.
requiredRaises:
Type DescriptionAssertionError \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 incomponents\\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 Defaultlocator str | Locator \u043b\u043e\u043a\u0430\u0442\u043e\u0440 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430.
requiredRaises:
Type DescriptionAssertionError \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 incomponents\\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 Defaultlocator str | Locator \u043b\u043e\u043a\u0430\u0442\u043e\u0440 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430.
requiredRaises:
Type DescriptionAssertionError \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 incomponents\\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 Defaultlocator str | Locator \u043b\u043e\u043a\u0430\u0442\u043e\u0440 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430.
requiredRaises:
Type DescriptionAssertionError \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 incomponents\\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 incomponents\\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 Defaultpage Page \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.
required Source code incomponents\\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 incomponents\\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 incomponents\\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 Defaultpage Page \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.
requiredcancel_button_text str \u0422\u0435\u043a\u0441\u0442 \u043a\u043d\u043e\u043f\u043a\u0438 \u043e\u0442\u043c\u0435\u043d\u044b.
requiredallow_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 incomponents\\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 incomponents\\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 incomponents\\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 Defaulttext str \u041e\u0436\u0438\u0434\u0430\u0435\u043c\u044b\u0439 \u0442\u0435\u043a\u0441\u0442 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f.
requiredmsg str \u0421\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u043f\u0440\u0438 \u043e\u0448\u0438\u0431\u043a\u0435.
required Source code incomponents\\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 Defaulttitle str \u041e\u0436\u0438\u0434\u0430\u0435\u043c\u044b\u0439 \u0442\u0435\u043a\u0441\u0442 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430.
requiredmsg str \u0421\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u043f\u0440\u0438 \u043e\u0448\u0438\u0431\u043a\u0435.
required Source code incomponents\\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 incomponents\\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 incomponents\\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 incomponents\\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 incomponents\\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 incomponents\\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 incomponents\\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 incomponents\\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 incomponents\\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 incomponents\\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 Defaultpage Page \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.
required Source code incomponents\\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 Defaulttext 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.
requiredRaises:
Type DescriptionAssertionError \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 incomponents\\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 Defaultlocator 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.
requiredReturns:
Type Descriptionbool 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 incomponents\\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 Defaulttext 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 incomponents\\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 Defaultlocator 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.
requiredReturns:
Type Descriptionlist[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 incomponents\\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 Defaultlocator 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 incomponents\\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 incomponents\\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 Defaultpage Page \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.
required Source code incomponents\\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 incomponents\\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 incomponents\\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 incomponents\\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 incomponents\\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 incomponents\\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 incomponents\\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 incomponents\\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 incomponents\\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 incomponents\\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 incomponents\\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 incomponents\\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 incomponents\\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 incomponents\\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 incomponents\\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 incomponents\\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 Defaultpage Page \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright
requiredlocator 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 incomponents\\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 incomponents\\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 Defaultindex int \u0418\u043d\u0434\u0435\u043a\u0441 \u0441\u0442\u043e\u043b\u0431\u0446\u0430.
requiredReturns:
Type Descriptionbool 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 incomponents\\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 DescriptionAssertionError \u0415\u0441\u043b\u0438 \u0441\u0442\u0440\u043e\u043a\u0430 \u043d\u0435 \u0432\u0438\u0434\u043d\u0430.
Source code incomponents\\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 incomponents\\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 DescriptionAssertionError \u0415\u0441\u043b\u0438 \u0441\u0442\u0440\u043e\u043a\u0430 \u043d\u0435 \u0432\u0438\u0434\u043d\u0430.
Source code incomponents\\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 Defaultrow_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.
requiredRaises:
Type DescriptionAssertionError \u0415\u0441\u043b\u0438 \u0441\u0442\u0440\u043e\u043a\u0430 \u043d\u0435 \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u0430.
Source code incomponents\\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 Descriptionbool 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 incomponents\\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 incomponents\\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 incomponents\\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 Defaultindex 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 incomponents\\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 incomponents\\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 Defaultindex int \u0418\u043d\u0434\u0435\u043a\u0441 \u044f\u0447\u0435\u0439\u043a\u0438 \u0432 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0435.
requiredReturns:
Type Descriptionstr 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 incomponents\\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 incomponents\\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 Descriptionlist[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 incomponents\\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 Descriptionint 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 DescriptionAssertionError \u0415\u0441\u043b\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u043f\u0443\u0441\u0442\u0430.
Source code incomponents\\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 incomponents\\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 incomponents\\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 incomponents\\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 incomponents\\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 incomponents\\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 incomponents\\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 incomponents\\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 incomponents\\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 incomponents\\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 DescriptionAssertionError \u0415\u0441\u043b\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442.
Source code incomponents\\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 incomponents\\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 incomponents\\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 incomponents\\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 Defaultpage Page \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.
required Source code incomponents\\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 Defaultactual Any \u0424\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 JSON-\u043e\u0431\u044a\u0435\u043a\u0442.
requiredexpected Any \u041e\u0436\u0438\u0434\u0430\u0435\u043c\u044b\u0439 JSON-\u043e\u0431\u044a\u0435\u043a\u0442.
requiredmsg str \u0421\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u043e\u0431 \u043e\u0448\u0438\u0431\u043a\u0435.
requiredRaises:
Type DescriptionAssertionError \u0415\u0441\u043b\u0438 \u043e\u0431\u044a\u0435\u043a\u0442\u044b \u043d\u0435 \u0438\u0434\u0435\u043d\u0442\u0438\u0447\u043d\u044b.
Source code incomponents\\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 Defaultjson_string str \u0421\u044b\u0440\u0430\u044f \u0441\u0442\u0440\u043e\u043a\u0430 \u0441 JSON-\u0434\u0430\u043d\u043d\u044b\u043c\u0438.
requiredReturns:
Name Type Descriptionstr 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 incomponents\\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 Defaultlocator 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.
requiredReturns:
Name Type Descriptiondict Dict \u0420\u0430\u0441\u043f\u0430\u0440\u0441\u0435\u043d\u043d\u044b\u0439 JSON-\u043e\u0431\u044a\u0435\u043a\u0442.
Raises:
Type DescriptionJSONDecodeError \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 incomponents\\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 incomponents\\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 incomponents\\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 incomponents\\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 incomponents\\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 incomponents\\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 incomponents\\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 incomponents\\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 incomponents\\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 incomponents\\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 incomponents\\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 incomponents\\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 incomponents\\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 incomponents\\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 incomponents\\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 incomponents\\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 incomponents\\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 incomponents\\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 incomponents\\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 incomponents\\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 incomponents\\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 Defaultpage Page \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.
required Source code incomponents\\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 Defaultlocator 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.
requireditem_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 incomponents\\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 Defaultlocator 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.
requireditem_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 incomponents\\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 Defaultnode_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).
requireditem_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 incomponents\\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 Defaultlocator 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.
requiredReturns:
Type Descriptionlist[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 incomponents\\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 Defaultnode_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 incomponents\\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 incomponents\\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 Defaultpage Page \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.
required Source code incomponents\\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 Defaultlocator str | Locator \u041b\u043e\u043a\u0430\u0442\u043e\u0440 \u0442\u0430\u0431\u043b\u0438\u0446\u044b.
requiredindex int \u0418\u043d\u0434\u0435\u043a\u0441 \u0441\u0442\u043e\u043b\u0431\u0446\u0430.
requiredReturns:
Type Descriptionbool 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 incomponents\\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 DescriptionAssertionError \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 incomponents\\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 Defaultlocator str | Locator \u041b\u043e\u043a\u0430\u0442\u043e\u0440 \u0442\u0430\u0431\u043b\u0438\u0446\u044b.
required Source code incomponents\\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 Defaultlocator str | Locator \u041b\u043e\u043a\u0430\u0442\u043e\u0440 \u0442\u0430\u0431\u043b\u0438\u0446\u044b.
required Source code incomponents\\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 Defaultlocator str | Locator \u041b\u043e\u043a\u0430\u0442\u043e\u0440 \u0442\u0430\u0431\u043b\u0438\u0446\u044b.
requiredrow_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 incomponents\\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 incomponents\\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 Defaulttable_locator str | Locator \u041b\u043e\u043a\u0430\u0442\u043e\u0440 \u0442\u0430\u0431\u043b\u0438\u0446\u044b.
requiredindex 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 incomponents\\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 Defaulttable_locator str | Locator \u041b\u043e\u043a\u0430\u0442\u043e\u0440 \u0442\u0430\u0431\u043b\u0438\u0446\u044b.
requiredindex int \u0418\u043d\u0434\u0435\u043a\u0441 \u044f\u0447\u0435\u0439\u043a\u0438 \u0432 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0435.
requiredReturns:
Type Descriptionstr 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 incomponents\\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 Defaulttable_locator str | Locator \u041b\u043e\u043a\u0430\u0442\u043e\u0440 \u0442\u0430\u0431\u043b\u0438\u0446\u044b.
requiredrow_index int \u0418\u043d\u0434\u0435\u043a\u0441 \u0441\u0442\u0440\u043e\u043a\u0438.
requiredReturns:
Type DescriptionLocator | 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 incomponents\\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 Descriptionint 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 DescriptionAssertionError \u0415\u0441\u043b\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u043f\u0443\u0441\u0442\u0430.
Source code incomponents\\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 Defaultlocator str | Locator \u041b\u043e\u043a\u0430\u0442\u043e\u0440 \u0442\u0430\u0431\u043b\u0438\u0446\u044b.
requiredReturns:
Type Descriptionlist[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 incomponents\\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 Defaultpage Page \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright
requiredtitle str \u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a \u0442\u0443\u043b\u0431\u0430\u0440\u0430
required Source code incomponents\\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 incomponents\\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 Defaultlocator Locator \u041b\u043e\u043a\u0430\u0442\u043e\u0440 \u043a\u043d\u043e\u043f\u043a\u0438
requiredname str \u0423\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u0435 \u0438\u043c\u044f \u043a\u043d\u043e\u043f\u043a\u0438
required Source code incomponents\\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 Defaultlocator Locator \u041b\u043e\u043a\u0430\u0442\u043e\u0440 \u043a\u043d\u043e\u043f\u043a\u0438
requiredname str \u0423\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u0435 \u0438\u043c\u044f \u043a\u043d\u043e\u043f\u043a\u0438
required Source code incomponents\\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 Defaulttitle str \u041d\u043e\u0432\u044b\u0439 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a
required Source code incomponents\\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 Defaultlocator Locator \u041b\u043e\u043a\u0430\u0442\u043e\u0440 \u043a\u043d\u043e\u043f\u043a\u0438
requiredname str \u0423\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u0435 \u0438\u043c\u044f \u043a\u043d\u043e\u043f\u043a\u0438
required Source code incomponents\\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 Defaultname str \u0418\u043c\u044f \u043a\u043d\u043e\u043f\u043a\u0438
requiredtooltip str \u041e\u0436\u0438\u0434\u0430\u0435\u043c\u044b\u0439 \u0442\u0435\u043a\u0441\u0442 \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0438
requiredRaises:
Type DescriptionAssertionError \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 incomponents\\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 Defaultname str \u0418\u043c\u044f \u043a\u043d\u043e\u043f\u043a\u0438
requiredRaises:
Type DescriptionAssertionError \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 incomponents\\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 Defaultmessage 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 incomponents\\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 Defaultmessage 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 incomponents\\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 Defaultname str \u0418\u043c\u044f \u043a\u043d\u043e\u043f\u043a\u0438
requiredRaises:
Type DescriptionAssertionError \u0415\u0441\u043b\u0438 \u043a\u043d\u043e\u043f\u043a\u0430 \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u0430
Source code incomponents\\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 Defaultname str \u0418\u043c\u044f \u043a\u043d\u043e\u043f\u043a\u0438
requiredReturns:
Type DescriptionTooltipButton | 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 incomponents\\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 Defaultlocator 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 Descriptionstr str \u0422\u0435\u043a\u0441\u0442 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430 \u0442\u0443\u043b\u0431\u0430\u0440\u0430
Raises:
Type DescriptionException \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 incomponents\\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 Defaultname str \u0418\u043c\u044f \u043a\u043d\u043e\u043f\u043a\u0438
requiredReturns:
Name Type Descriptionbool 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 DescriptionAssertionError \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 incomponents\\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 Defaultname str \u0418\u043c\u044f \u043a\u043d\u043e\u043f\u043a\u0438
requiredReturns:
Name Type Descriptionbool 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 DescriptionAssertionError \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 incomponents\\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 incomponents_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 Defaultpage Page \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.
required Source code incomponents_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 incomponents_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 incomponents_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 Defaultpage Page \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.
required Source code incomponents_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 incomponents_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 DescriptionAssertionError \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 incomponents_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 DescriptionAssertionError \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 incomponents_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 DescriptionAssertionError \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 incomponents_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 incomponents_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 Defaultrow_index int \u0418\u043d\u0434\u0435\u043a\u0441 \u0441\u0442\u0440\u043e\u043a\u0438 \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435.
requiredReturns:
Name Type DescriptionTooltipButton TooltipButton \u041a\u043d\u043e\u043f\u043a\u0430 \u0441 \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u043e\u0439.
Raises:
Type DescriptionAssertionError \u0415\u0441\u043b\u0438 \u0441\u0442\u0440\u043e\u043a\u0430 \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u0430.
Source code incomponents_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 Defaultrow_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.
requiredtooltip str \u041e\u0436\u0438\u0434\u0430\u0435\u043c\u044b\u0439 \u0442\u0435\u043a\u0441\u0442 \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0438.
requiredRaises:
Type DescriptionAssertionError \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 incomponents_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 DescriptionAssertionError \u0415\u0441\u043b\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442.
Source code incomponents_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 incomponents_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 incomponents_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 incomponents_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 incomponents_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 incomponents_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 incomponents_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 Defaultuser_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 incomponents_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 incomponents_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 incomponents_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 incomponents_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 incomponents_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 incomponents_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 incomponents_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 incomponents_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 incomponents_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 Defaultuser_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 incomponents_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 incomponents_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 incomponents_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 incomponents_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 incomponents_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 incomponents_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 incomponents_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 incomponents_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 incomponents_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 incomponents_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 incomponents_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 incomponents_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 incomponents_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 incomponents_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 Defaultuser_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
requiredrole 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 incomponents_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 incomponents_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 incomponents_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 incomponents_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 Defaultuser_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 incomponents_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 incomponents_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 incomponents_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 incomponents_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 incomponents_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 incomponents_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 incomponents_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 Descriptiondict 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 incomponents_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 incomponents_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 Defaultpage Page \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.
required Source code incomponents_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 incomponents_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 incomponents_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 incomponents_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 incomponents_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":"\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.
\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.
\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.
\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c docstring \u043f\u0435\u0440\u0435\u0434 \u0438\u043c\u043f\u043e\u0440\u0442\u0430\u043c\u0438.
\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.
\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.
\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).
\u041d\u0435 \u0443\u0434\u0430\u043b\u044f\u0442\u044c \u043f\u0443\u0441\u0442\u044b\u0435 \u0441\u0442\u0440\u043e\u043a\u0438.
\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.
\u0414\u043e\u043a\u0443\u043c\u0435\u043d\u0442 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c
"},{"location":"config/mkdocs_guide/","title":"\u0414\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f \u043f\u0440\u043e\u0435\u043a\u0442\u0430: \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 MkDocs \u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438 \u041a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430 UI \"alert_component.py\"","text":""},{"location":"config/mkdocs_guide/#1","title":"1 \u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u043f\u0440\u043e\u0435\u043a\u0442\u0430","text":"nms_tests/\n\u251c\u2500\u2500 docs/\n\u2502 \u251c\u2500\u2500 components/\n\u2502 \u2502 \u2514\u2500\u2500 alert_component.md\n\u2502 \u2514\u2500\u2500 index.md\n\u251c\n\u251c\u2500\u2500 components/\n\u2502 \u2514\u2500\u2500 alert_component.py\n\u2514\u2500\u2500 mkdocs.yml\n"},{"location":"config/mkdocs_guide/#2-mkdocs","title":"2 \u0418\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f \u043f\u043e \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0435 MkDocs","text":""},{"location":"config/mkdocs_guide/#21","title":"2.1 \u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439","text":"powershell pip install mkdocs mkdocs-material mkdocstrings mkdocstrings-python
"},{"location":"config/mkdocs_guide/#22","title":"2.2 \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043f\u0440\u043e\u0435\u043a\u0442\u0430","text":"powershell mkdocs new .
"},{"location":"config/mkdocs_guide/#3","title":"3 \u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438","text":""},{"location":"config/mkdocs_guide/#31-docstrings-alert-alert_componentpy","title":"3.1 \u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0435\u0432 docstrings \u0432 \u041a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 Alert (alert_component.py)","text":"python\n\"\"\"\u041c\u043e\u0434\u0443\u043b\u044c \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043e\u043c alert-\u043e\u043a\u043d\u0430 \u0432 Playwright.\n\n\u0421\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043a\u043b\u0430\u0441\u0441 AlertComponent \u0434\u043b\u044f \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0441 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u043c\u0438 \u0442\u0438\u043f\u0430\u043c\u0438\nalert-\u043e\u043a\u043e\u043d (error, success, info, warning) \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0438\u0445 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f.\n\"\"\"\n\nfrom playwright.sync_api import Page, expect\nfrom tools.logger import get_logger\nfrom elements.text_element import Text\nfrom components.base_component import BaseComponent\n\nlogger = get_logger(\"ALERT\")\n\nclass AlertComponent(BaseComponent):\n \"\"\"\u041a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 alert-\u043e\u043a\u043d\u0430\u043c\u0438 Playwright.\n\n \u041f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u0442\u0438\u043f\u044b: error, success, info, warning.\n \u041f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0442\u044c \u043d\u0430\u043b\u0438\u0447\u0438\u0435, \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u0435 \u0438 \u0442\u0435\u043a\u0441\u0442 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439.\n \"\"\"\n\n # ... (\u043f\u043e\u043b\u043d\u044b\u0439 \u043a\u043e\u0434 \u043a\u043b\u0430\u0441\u0441\u0430 \u0438\u0437 \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0433\u043e \u0444\u0430\u0439\u043b\u0430)\n"},{"location":"config/mkdocs_guide/#32-mkdocs-mkdocsyml","title":"3.2 \u041a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f MkDocs (mkdocs.yml)","text":"yaml\nsite_name: \u0414\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f \u0442\u0435\u0441\u0442\u043e\u0432\ntheme:\n name: material\n\nplugins:\n - search\n - mkdocstrings:\n default_handler: python\n handlers:\n python:\n paths: [\".\", \"pages\"]\n options:\n show_source: true\n\nnav:\n - \u0413\u043b\u0430\u0432\u043d\u0430\u044f: index.md\n - \u041a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u044b UI:\n - AlertComponent: components/alert_component.md\n # ... (\u043e\u0441\u0442\u0430\u043b\u044c\u043d\u0430\u044f \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438)\n"},{"location":"config/mkdocs_guide/#33-alert","title":"3.3 \u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0444\u0430\u0439\u043b\u0430 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u041a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430 Alert","text":"docs/components/alert_component.md:
markdown\n# AlertComponent\n\n::: components.alert_component:AlertComponent\n handler: python\n options:\n show_source: true\n heading_level: 2\n"},{"location":"config/mkdocs_guide/#4","title":"4 \u0420\u0430\u0431\u043e\u0442\u0430 \u0441 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0435\u0439.","text":""},{"location":"config/mkdocs_guide/#41","title":"4.1 \u041f\u0440\u043e\u0441\u043c\u043e\u0442\u0440 \u0432 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u043c \u0432\u0440\u0435\u043c\u0435\u043d\u0438","text":"bash
mkdocs serve
"},{"location":"config/mkdocs_guide/#42","title":"4.2 \u0421\u0431\u043e\u0440\u043a\u0430 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438","text":"bash
rmdir /s /q site # \u041e\u0447\u0438\u0441\u0442\u043a\u0430 \u043a\u044d\u0448\u0430
mkdocs build # \u041f\u0435\u0440\u0435\u0441\u0431\u043e\u0440\u043a\u0430
"},{"location":"config/mkdocs_guide/#5","title":"5 \u0427\u0430\u0441\u0442\u044b\u0435 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u0438 \u0440\u0435\u0448\u0435\u043d\u0438\u044f","text":"\u041e\u0448\u0438\u0431\u043a\u0438 \u0438\u043c\u043f\u043e\u0440\u0442\u0430:
\u0423\u0431\u0435\u0434\u0438\u0442\u0435\u0441\u044c \u0432 \u043d\u0430\u043b\u0438\u0447\u0438\u0438 init.py \u0432 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044f\u0445.
\u041f\u0440\u043e\u0432\u0435\u0440\u044c\u0442\u0435 \u043f\u0443\u0442\u0438 \u0432 mkdocs.yml.
\u041f\u0440\u0435\u0434\u0443\u043f\u0440\u0435\u0436\u0434\u0435\u043d\u0438\u044f \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u0438 \u0442\u0438\u043f\u043e\u0432 \u0434\u043b\u044f \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430:
\u0423\u0431\u0435\u0434\u0438\u0442\u0435\u0441\u044c \u0432 \u043d\u0430\u043b\u0438\u0447\u0438\u0438 \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u0438 \u0442\u0438\u043f\u043e\u0432 \u0434\u043b\u044f \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430.
"},{"location":"config/mkdocs_guide/#6","title":"6 \u0417\u0430\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435","text":"\u0414\u043b\u044f \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438 \u043f\u043e\u0441\u043b\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439 \u0432 \u043a\u043e\u0434\u0435:
\u0412\u043d\u0435\u0441\u0438\u0442\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0432 docstrings Python-\u043a\u043e\u0434\u0430.
\u041e\u0431\u043d\u043e\u0432\u0438\u0442\u0435 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435 .md-\u0444\u0430\u0439\u043b\u044b.
\u041f\u0435\u0440\u0435\u0441\u043e\u0431\u0435\u0440\u0438\u0442\u0435 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044e.
\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\u044blogin (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 indata\\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\u0430TEST (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 indata\\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 indata\\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\u0442str: \u0422\u0435\u043a\u0443\u0449\u0438\u0439 \u0442\u043e\u043a\u0435\u043d \u0434\u043e\u0441\u0442\u0443\u043f\u0430.
Source code indata\\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\u0442str: \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 indata\\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 indata\\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\u0442str: id \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.
Source code indata\\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\u0442str: \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 indata\\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\u0442str: \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 indata\\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\u0442str: \u0438\u043c\u044f \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f.
Source code indata\\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\u0442str: URL \u0434\u043b\u044f API-\u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432.
Source code indata\\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\u044bcredential ({}): \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 indata\\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 inelements\\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 Defaultpage Page \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright
requiredlocator 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)
requiredname 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 inelements\\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 inelements\\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 inelements\\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 inelements\\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 inelements\\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 inelements\\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 inelements\\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 inelements\\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 inelements\\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 inelements\\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 Descriptionstr 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 inelements\\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 inelements\\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 Descriptionstr 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 inelements\\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 Descriptionbool bool True \u0435\u0441\u043b\u0438 \u043e\u0442\u043c\u0435\u0447\u0435\u043d, False \u0435\u0441\u043b\u0438 \u043d\u0435\u0442.
Source code inelements\\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 inelements\\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 inelements\\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 Descriptionstr 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 inelements\\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 inelements\\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 Descriptionstr 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 inelements\\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 Descriptionstr 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 inelements\\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 Descriptionstr 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 Defaultmsg 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.
requiredRaises:
Type DescriptionAssertionError \u0415\u0441\u043b\u0438 \u043f\u043e\u043b\u0435 \u043d\u0435 \u043f\u0443\u0441\u0442\u043e\u0435.
Source code inelements\\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 inelements\\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 Descriptionstr str \u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0430\u0442\u0442\u0440\u0438\u0431\u0443\u0442\u0430 type.
Source code inelements\\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 Descriptionstr str \u0422\u0435\u043a\u0443\u0449\u0435\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0432 \u043f\u043e\u043b\u0435.
Source code inelements\\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 Defaultvalue str \u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0434\u043b\u044f \u0432\u0432\u043e\u0434\u0430.
required Source code inelements\\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 inelements\\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 Descriptionstr 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 Defaultexpected_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.
requiredRaises:
Type DescriptionAssertionError \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 inelements\\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 Descriptionstr 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 inelements\\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 inelements\\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 Defaultrequest 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.
requiredReturns:
Name Type DescriptionPage 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 DescriptionPage 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 infixtures\\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 Defaultplaywright Playwright \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 Playwright.
requiredrequest FixtureRequest \u041e\u0431\u044a\u0435\u043a\u0442 \u0437\u0430\u043f\u0440\u043e\u0441\u0430 pytest.
requiredReturns:
Name Type DescriptionBrowser Browser \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 Chrome.
Source code infixtures\\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 Defaultbrowser Browser \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0430.
requiredrequest FixtureRequest \u041e\u0431\u044a\u0435\u043a\u0442 \u0437\u0430\u043f\u0440\u043e\u0441\u0430 pytest.
requiredstart str \u0422\u0438\u043f \u0437\u0430\u043f\u0443\u0441\u043a\u0430 ('local' \u0438\u043b\u0438 'remote').
requiredReturns:
Name Type DescriptionBrowserContext BrowserContext \u041d\u0430\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0439 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442.
Source code infixtures\\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 Defaultplaywright Playwright \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 Playwright.
requiredrequest FixtureRequest \u041e\u0431\u044a\u0435\u043a\u0442 \u0437\u0430\u043f\u0440\u043e\u0441\u0430 pytest.
requiredReturns:
Name Type DescriptionBrowser Browser \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 Firefox.
Source code infixtures\\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 Defaultplaywright Playwright \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 Playwright.
requiredrequest FixtureRequest \u041e\u0431\u044a\u0435\u043a\u0442 \u0437\u0430\u043f\u0440\u043e\u0441\u0430 pytest.
requiredReturns:
Name Type DescriptionBrowser Browser \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 Chrome \u0432 headless \u0440\u0435\u0436\u0438\u043c\u0435.
Source code infixtures\\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 Defaultparser 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 infixtures\\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 Defaultbrowser 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 infixtures\\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 inlocators\\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\u044fCONFIRM (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 inlocators\\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 inlocators\\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 inlocators\\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 inlocators\\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 inlocators\\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 inlocators\\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 inlocators\\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 inlocators\\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 inlocators\\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 inlocators\\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 inlocators\\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\u044bpage (Page): \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.
Source code inpages\\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 Defaultpage Page \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.
required Source code inpages\\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 Defaulturi str \u041e\u0436\u0438\u0434\u0430\u0435\u043c\u044b\u0439 URI (\u0431\u0435\u0437 \u0431\u0430\u0437\u043e\u0432\u043e\u0433\u043e URL).
requiredmsg 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.
requiredRaises:
Type DescriptionAssertionError \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 inpages\\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 Defaultactual Any \u0424\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435.
requiredexpected Any \u041e\u0436\u0438\u0434\u0430\u0435\u043c\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435.
requiredmsg 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.
requiredRaises:
Type DescriptionAssertionError \u0415\u0441\u043b\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043d\u0435 \u0440\u0430\u0432\u043d\u044b.
Source code inpages\\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 Defaultactual list \u0424\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0441\u043f\u0438\u0441\u043e\u043a.
requiredexpected list \u041e\u0436\u0438\u0434\u0430\u0435\u043c\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a.
requiredmsg 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.
requiredRaises:
Type DescriptionAssertionError \u0415\u0441\u043b\u0438 \u0441\u043f\u0438\u0441\u043a\u0438 \u043d\u0435 \u0440\u0430\u0432\u043d\u044b.
Source code inpages\\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 Descriptionstr str \u0422\u0435\u043a\u0443\u0449\u0438\u0439 URL \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b.
Source code inpages\\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 DescriptionAPIRequestContext 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 inpages\\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 Defaultresponse Response \u041e\u0442\u0432\u0435\u0442 \u0441\u0435\u0440\u0432\u0435\u0440\u0430.
requiredReturns:
Type Descriptiondict | 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 inpages\\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 Defaulturi 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).
requiredReturns:
Type DescriptionResponse | 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 inpages\\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 inpages\\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 Defaulturi str URI API-\u044d\u043d\u0434\u043f\u043e\u0438\u043d\u0442\u0430 (\u0431\u0435\u0437 \u0431\u0430\u0437\u043e\u0432\u043e\u0433\u043e URL).
requiredReturns:
Name Type DescriptionResponse Response \u041e\u0442\u0432\u0435\u0442 \u0441\u0435\u0440\u0432\u0435\u0440\u0430.
Source code inpages\\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 inpages\\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 Defaulttimeout 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 inpages\\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 inpages\\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 Defaultpage Page \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright
required Source code inpages\\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 inpages\\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 Descriptionbool bool \u0414\u043e\u0441\u0442\u0443\u043f\u043d\u043e\u0441\u0442\u044c \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0438
Source code inpages\\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 Defaultvalue str \u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0434\u043b\u044f \u0432\u0432\u043e\u0434\u0430
required Source code inpages\\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 inpages\\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 inpages\\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 inpages\\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 Defaulttext str \u0422\u0435\u043a\u0441\u0442 \u0434\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438
required Source code inpages\\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 inpages\\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 inpages\\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 inpages\\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 inpages\\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 inpages\\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\u044bpage: \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 inpages\\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 Defaultpage Page \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.
required Source code inpages\\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 inpages\\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 Defaultusername 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 DescriptionAssertionError \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 inpages\\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 Defaultusername 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 inpages\\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 inpages\\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\u044bpage: \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 inpages\\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 Defaultpage Page \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.
required Source code inpages\\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 inpages\\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 inpages\\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 Defaultitem_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 inpages\\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 Descriptionbool 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 inpages\\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 inpages\\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 inpages\\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 inpages\\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 Defaultitem_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 inpages\\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 inpages\\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 inpages\\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 inpages\\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 inpages\\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 inpages\\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 inpages\\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 inpages\\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 inpages\\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 inpages\\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 inpages\\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 inpages\\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 Defaultpage Page \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.
required Source code inpages\\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 inpages\\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 DescriptionAssertionError \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 inpages\\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 DescriptionAssertionError \u0415\u0441\u043b\u0438 \u0441\u0442\u0440\u043e\u043a\u0430 \u043d\u0435 \u0432\u0438\u0434\u043d\u0430.
Source code inpages\\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 DescriptionAssertionError \u0415\u0441\u043b\u0438 \u0441\u0442\u0440\u043e\u043a\u0430 \u043d\u0435 \u0432\u0438\u0434\u043d\u0430.
Source code inpages\\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 Defaultrow_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.
requiredRaises:
Type DescriptionAssertionError \u0415\u0441\u043b\u0438 \u0441\u0442\u0440\u043e\u043a\u0430 \u043d\u0435 \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u0430.
Source code inpages\\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 Descriptionbool 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 inpages\\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 Descriptionint 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 DescriptionAssertionError \u0415\u0441\u043b\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u043f\u0443\u0441\u0442\u0430.
Source code inpages\\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 inpages\\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 inpages\\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 DescriptionAssertionError \u0415\u0441\u043b\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442.
Source code inpages\\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 DescriptionAssertionError \u0415\u0441\u043b\u0438 \u0442\u0443\u043b\u0431\u0430\u0440 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442.
Source code inpages\\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 Defaultpage Page \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.
required Source code inpages\\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 inpages\\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 inpages\\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 Defaultverify 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 DescriptionAssertionError \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 inpages\\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 DescriptionAssertionError \u0415\u0441\u043b\u0438 \u0441\u0442\u0440\u043e\u043a\u0430 \u043d\u0435 \u0432\u0438\u0434\u043d\u0430.
Source code inpages\\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 DescriptionAssertionError \u0415\u0441\u043b\u0438 \u0441\u0442\u0440\u043e\u043a\u0430 \u043d\u0435 \u0432\u0438\u0434\u043d\u0430.
Source code inpages\\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 Defaultrow_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.
requiredRaises:
Type DescriptionAssertionError \u0415\u0441\u043b\u0438 \u0441\u0442\u0440\u043e\u043a\u0430 \u043d\u0435 \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u0430.
Source code inpages\\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 Descriptionbool 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 inpages\\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 Defaultrow_index int \u0418\u043d\u0434\u0435\u043a\u0441 \u0441\u0442\u0440\u043e\u043a\u0438 \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435
requiredRaises:
Type DescriptionAssertionError \u0415\u0441\u043b\u0438 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u043d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c.
Source code inpages\\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 Defaulttoken str \u0422\u043e\u043a\u0435\u043d \u0441\u0435\u0430\u043d\u0441 \u0434\u043b\u044f \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f
requiredRaises:
Type DescriptionAssertionError \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 inpages\\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 Defaulttoken str \u0422\u043e\u043a\u0435\u043d \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f
requiredReturns:
Name Type Descriptionint 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 DescriptionAssertionError \u0415\u0441\u043b\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u043f\u0443\u0441\u0442\u0430.
Source code inpages\\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 Defaultrow_index int \u0418\u043d\u0434\u0435\u043a\u0441 \u0441\u0442\u0440\u043e\u043a\u0438 \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435.
requiredReturns:
Name Type DescriptionTooltipButton TooltipButton \u041a\u043d\u043e\u043f\u043a\u0430 \u0441 \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u043e\u0439.
Raises:
Type DescriptionAssertionError \u0415\u0441\u043b\u0438 \u0441\u0442\u0440\u043e\u043a\u0430 \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u0430.
Source code inpages\\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 Descriptionint 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 DescriptionAssertionError \u0415\u0441\u043b\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u043f\u0443\u0441\u0442\u0430.
Source code inpages\\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 Descriptionstr 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 inpages\\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 inpages\\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 inpages\\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 Defaultrow_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.
requiredtooltip str \u041e\u0436\u0438\u0434\u0430\u0435\u043c\u044b\u0439 \u0442\u0435\u043a\u0441\u0442 \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0438.
requiredRaises:
Type DescriptionAssertionError \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 inpages\\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 Defaulttoken str \u0422\u043e\u043a\u0435\u043d \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f
requiredRaises:
Type DescriptionAssertionError \u0415\u0441\u043b\u0438 \u0441\u0435\u0430\u043d\u0441 \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d.
Source code inpages\\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 DescriptionAssertionError \u0415\u0441\u043b\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442.
Source code inpages\\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 DescriptionAssertionError \u0415\u0441\u043b\u0438 \u0442\u0443\u043b\u0431\u0430\u0440 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442.
Source code inpages\\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 Defaulttoken str \u0422\u043e\u043a\u0435\u043d \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f
requiredRaises:
Type DescriptionAssertionError \u0415\u0441\u043b\u0438 \u0441\u0435\u0430\u043d\u0441 \u043d\u0430\u0439\u0434\u0435\u043d.
Source code inpages\\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 Defaultsessions_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.
requiredRaises:
Type DescriptionAssertionError \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 inpages\\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 Defaultpage Page \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.
required Source code inpages\\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 inpages\\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 Defaulttitle str \u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a \u043e\u043a\u043d\u0430.
required Source code inpages\\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 Descriptionbool 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 inpages\\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 Defaulttemplate_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.
requiredRaises:
Type DescriptionAssertionError \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 inpages\\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 DescriptionAssertionError \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 inpages\\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 DescriptionAssertionError \u0415\u0441\u043b\u0438 \u0441\u0442\u0440\u043e\u043a\u0430 \u043d\u0435 \u0432\u0438\u0434\u043d\u0430.
Source code inpages\\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 DescriptionAssertionError \u0415\u0441\u043b\u0438 \u0441\u0442\u0440\u043e\u043a\u0430 \u043d\u0435 \u0432\u0438\u0434\u043d\u0430.
Source code inpages\\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 Defaultrow_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.
requiredRaises:
Type DescriptionAssertionError \u0415\u0441\u043b\u0438 \u0441\u0442\u0440\u043e\u043a\u0430 \u043d\u0435 \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u0430.
Source code inpages\\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 Descriptionbool 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 inpages\\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 Defaulttitle str \u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a \u043e\u043a\u043d\u0430.
required Source code inpages\\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 Defaulttitle str \u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a \u043e\u043a\u043d\u0430.
requiredRaises:
Type DescriptionAssertionError \u0415\u0441\u043b\u0438 \u043e\u043a\u043d\u043e \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u043e.
Source code inpages\\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 Defaulttemplate_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.
requiredresponse_data dict \u0414\u0430\u043d\u043d\u044b\u0435 \u043e\u0442\u0432\u0435\u0442\u0430 \u043e\u0442 API.
requiredReturns:
Name Type Descriptiondict 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 DescriptionAssertionError \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 inpages\\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 Defaulttitle str \u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a \u043e\u043a\u043d\u0430.
requiredReturns:
Name Type DescriptionViewTemplateModalWindow 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 DescriptionAssertionError \u0415\u0441\u043b\u0438 \u043e\u043a\u043d\u043e \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u043e.
Source code inpages\\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 Descriptionint 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 DescriptionAssertionError \u0415\u0441\u043b\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u043f\u0443\u0441\u0442\u0430.
Source code inpages\\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 Defaultrow_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 Descriptionstr str \u0418\u043c\u044f \u0448\u0430\u0431\u043b\u043e\u043d\u0430.
Source code inpages\\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 Defaulttemplate_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.
requiredfilename 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 Descriptionstr 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 inpages\\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 inpages\\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 inpages\\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 inpages\\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 inpages\\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 DescriptionAssertionError \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 inpages\\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 DescriptionAssertionError \u0415\u0441\u043b\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442.
Source code inpages\\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 DescriptionAssertionError \u0415\u0441\u043b\u0438 \u0442\u0443\u043b\u0431\u0430\u0440 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442.
Source code inpages\\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 DescriptionAssertionError \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 inpages\\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 Defaulttemplate_name str \u0418\u043c\u044f \u0448\u0430\u0431\u043b\u043e\u043d\u0430 \u0434\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438.
requiredsave_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 Defaultpage Page \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.
required Source code inpages\\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 inpages\\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 Defaultwindow_type str \u0422\u0438\u043f \u043e\u043a\u043d\u0430 ('add_user' \u0438\u043b\u0438 'edit_user').
requiredtitle str \u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a \u043e\u043a\u043d\u0430.
requiredRaises:
Type DescriptionAssertionError \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 inpages\\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 Defaultuser_data dict \u0414\u0430\u043d\u043d\u044b\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f (name, role, password).
requiredReturns:
Name Type Descriptionbool 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 DescriptionAssertionError \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 inpages\\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 inpages\\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 inpages\\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 Defaultuser_name str \u0418\u043c\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.
requiredrole str \u0420\u043e\u043b\u044c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.
required Source code inpages\\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 Defaultverify 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 DescriptionAssertionError \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 inpages\\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 inpages\\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 inpages\\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 inpages\\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 inpages\\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 Defaulttitle 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 inpages\\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 Defaulttitle 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 inpages\\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 Defaulttitle str \u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a \u043e\u043a\u043d\u0430.
required Source code inpages\\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 Defaulttitle str \u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a \u043e\u043a\u043d\u0430.
required Source code inpages\\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 Defaulttitle str \u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a \u043e\u043a\u043d\u0430.
requiredRaises:
Type DescriptionAssertionError \u0415\u0441\u043b\u0438 \u043e\u043a\u043d\u043e \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u043e.
Source code inpages\\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 Defaultuser_name str \u0418\u043c\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.
requiredRaises:
Type DescriptionAssertionError \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 inpages\\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 Defaultuser_name str \u0418\u043c\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.
requireduser_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.
requiredRaises:
Type DescriptionAssertionError \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 inpages\\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 Defaultname str \u0418\u043c\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.
requiredrole str \u0420\u043e\u043b\u044c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.
requiredReturns:
Name Type Descriptionint 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 DescriptionAssertionError \u0415\u0441\u043b\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u043f\u0443\u0441\u0442\u0430.
Source code inpages\\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 Defaulttitle str \u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a \u043e\u043a\u043d\u0430.
requiredReturns:
Name Type DescriptionModalWindowComponent 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 DescriptionAssertionError \u0415\u0441\u043b\u0438 \u043e\u043a\u043d\u043e \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u043e.
Source code inpages\\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 DescriptionAssertionError \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 inpages\\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 Defaultrow_index int \u0418\u043d\u0434\u0435\u043a\u0441 \u0441\u0442\u0440\u043e\u043a\u0438 \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435.
requiredReturns:
Name Type Descriptiontuple tuple (\u0438\u043c\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f, \u0440\u043e\u043b\u044c).
Raises:
Type DescriptionAssertionError \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 inpages\\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 Defaultuser_name str \u0418\u043c\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.
requiredrole str \u0420\u043e\u043b\u044c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.
requiredRaises:
Type DescriptionAssertionError \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 inpages\\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 Defaultuser_name str \u0418\u043c\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.
requiredReturns:
Name Type Descriptionstr 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 inpages\\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 DescriptionAssertionError \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 inpages\\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 DescriptionAssertionError \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 inpages\\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 Defaultname str \u0418\u043c\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.
requiredrole str \u0420\u043e\u043b\u044c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.
requiredRaises:
Type DescriptionAssertionError \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 inpages\\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 DescriptionAssertionError \u0415\u0441\u043b\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442.
Source code inpages\\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 Defaultname str \u0418\u043c\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.
requiredrole str \u0420\u043e\u043b\u044c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.
requiredRaises:
Type DescriptionAssertionError \u0415\u0441\u043b\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u043d\u0430\u0439\u0434\u0435\u043d.
Source code inpages\\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 inpages\\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 inpages\\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 Defaultusers_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.
requiredRaises:
Type DescriptionAssertionError \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 inpages\\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 Defaultpage Page \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.
required Source code inpages\\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 inpages\\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 Defaulttitle str \u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a \u043e\u043a\u043d\u0430.
required Source code inpages\\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 Descriptionbool 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 inpages\\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 Defaulttemplate_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.
requiredRaises:
Type DescriptionAssertionError \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 inpages\\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 DescriptionAssertionError \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 inpages\\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 DescriptionAssertionError \u0415\u0441\u043b\u0438 \u0441\u0442\u0440\u043e\u043a\u0430 \u043d\u0435 \u0432\u0438\u0434\u043d\u0430.
Source code inpages\\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 DescriptionAssertionError \u0415\u0441\u043b\u0438 \u0441\u0442\u0440\u043e\u043a\u0430 \u043d\u0435 \u0432\u0438\u0434\u043d\u0430.
Source code inpages\\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 Defaultrow_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.
requiredRaises:
Type DescriptionAssertionError \u0415\u0441\u043b\u0438 \u0441\u0442\u0440\u043e\u043a\u0430 \u043d\u0435 \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u0430.
Source code inpages\\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 Descriptionbool 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 inpages\\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 Defaulttitle str \u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a \u043e\u043a\u043d\u0430.
required Source code inpages\\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 Defaulttitle str \u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a \u043e\u043a\u043d\u0430.
requiredRaises:
Type DescriptionAssertionError \u0415\u0441\u043b\u0438 \u043e\u043a\u043d\u043e \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u043e.
Source code inpages\\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 Defaulttitle str \u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a \u043e\u043a\u043d\u0430.
requiredReturns:
Name Type DescriptionViewTemplateModalWindow 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 DescriptionAssertionError \u0415\u0441\u043b\u0438 \u043e\u043a\u043d\u043e \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u043e.
Source code inpages\\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 Descriptionint 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 DescriptionAssertionError \u0415\u0441\u043b\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u043f\u0443\u0441\u0442\u0430.
Source code inpages\\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 Defaultrow_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 Descriptionstr str \u0418\u043c\u044f \u0448\u0430\u0431\u043b\u043e\u043d\u0430.
Source code inpages\\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 inpages\\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 inpages\\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 inpages\\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 inpages\\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 DescriptionAssertionError \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 inpages\\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 DescriptionAssertionError \u0415\u0441\u043b\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442.
Source code inpages\\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 DescriptionAssertionError \u0415\u0441\u043b\u0438 \u0442\u0443\u043b\u0431\u0430\u0440 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442.
Source code inpages\\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 DescriptionAssertionError \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 inpages\\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 Defaulttemplate_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).
requiredRaises:
Type DescriptionAssertionError \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 inpages\\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 intests\\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 Defaultbrowser Page \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.
required Source code intests\\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 Defaultbrowser Page \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.
required Stepstests\\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\u044bbrowser: \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 intests\\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 Defaultbrowser 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.
requiredRaises:
Type DescriptionAssertionError \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 intests\\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 intests\\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 Defaultbrowser Page \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.
required Source code intests\\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 Defaultbrowser Page \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.
required Stepstests\\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 intests\\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 Defaultbrowser Page \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.
required Source code intests\\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 Defaultbrowser Page \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.
required Stepstests\\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 Defaultbrowser Page \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.
required Stepstests\\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\u044bbrowser: \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 intests\\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 Defaultbrowser Page \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.
required Source code intests\\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 Defaultbrowser Page \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.
required Source code intests\\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\u044bbrowser: \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 intests\\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 Defaultbrowser 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 intests\\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 Defaultbrowser 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 intests\\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 intests\\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 Defaultbrowser Page \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.
required Source code intests\\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 Defaultbrowser Page \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.
required Source code intests\\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 Defaultbrowser Page \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.
required Source code intests\\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 intests\\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 Defaultbrowser Page \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.
required Source code intests\\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 Defaultbrowser Page \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.
required Source code intests\\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 Defaultbrowser Page \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.
required Source code intests\\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 Defaultbrowser Page \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.
required Source code intests\\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 intests\\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 Defaultbrowser Page \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.
required Source code intests\\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 Defaultbrowser Page \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.
required Source code intests\\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 Defaultbrowser Page \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.
required Source code intests\\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 intests\\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 intests\\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 intests\\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 intests\\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 intests\\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 intests\\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 intests\\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 intests\\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 intests\\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 intests\\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 intests\\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\u044bbrowser: \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 intests\\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 Defaultbrowser Page \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.
required Source code intests\\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 Defaultbrowser Page \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.
required Source code intests\\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 Defaultbrowser Page \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.
required Source code intests\\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 Defaultbrowser Page \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.
required Source code intests\\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 Defaultbrowser Page \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.
required Source code intests\\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 intests\\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 intests\\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 intests\\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 intests\\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 intests\\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 intests\\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 intests\\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 intests\\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\u044bbrowser: \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 intests\\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 intests\\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 intests\\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 Defaultbrowser Page \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.
required Source code intests\\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 Defaultbrowser Page \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.
required Source code intests\\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 Defaultbrowser Page \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.
required Source code intests\\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 Defaultbrowser Page \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.
required Source code intests\\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 Defaultbrowser Page \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.
required Source code intests\\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 Defaultbrowser Page \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.
required Source code intests\\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 intests\\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 intests\\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 Defaultbrowser Page \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.
required Source code intests\\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 Defaultbrowser Page \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.
requiredcleanup_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 intests\\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 Defaultbrowser Page \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.
requiredcleanup_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 intests\\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 Defaultbrowser Page \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.
required Source code intests\\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 Defaultbrowser Page \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.
required Source code intests\\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 Defaultbrowser Page \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.
requiredcleanup_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 intests\\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 Defaultbrowser Page \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.
required Source code intests\\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 Defaultbrowser Page \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.
required Source code intests\\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 Defaultbrowser Page \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.
requiredcleanup_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 intests\\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 Defaultbrowser Page \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.
required Source code intests\\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 Defaultbrowser Page \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.
required Source code intests\\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 intests\\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 intests\\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 Defaultbrowser 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 intests\\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 intests\\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 intests\\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 intests\\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 intests\\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 intests\\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\u044broot_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 intools\\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 Defaultroot_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 Defaultdir_path str \u041f\u0443\u0442\u044c \u043a \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438.
requiredReturns:
Name Type Descriptionbool bool True \u0435\u0441\u043b\u0438 \u0444\u0430\u0439\u043b \u0441\u043e\u0437\u0434\u0430\u043d.
Raises:
Type DescriptionException \u041f\u0440\u0438 \u043e\u0448\u0438\u0431\u043a\u0435 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f.
Source code intools\\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 Defaultdir_path str \u041f\u0443\u0442\u044c \u043a \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438.
requiredReturns:
Name Type Descriptionbool bool True \u0435\u0441\u043b\u0438 init.py \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f.
Source code intools\\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 intools\\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 Defaultfilepath str \u041f\u0443\u0442\u044c \u043a \u0444\u0430\u0439\u043b\u0443.
requiredReturns:
Name Type Descriptionbool bool True \u0435\u0441\u043b\u0438 BOM \u0431\u044b\u043b \u0443\u0434\u0430\u043b\u0451\u043d.
Raises:
Type DescriptionException \u041f\u0440\u0438 \u043e\u0448\u0438\u0431\u043a\u0435 \u0447\u0442\u0435\u043d\u0438\u044f/\u0437\u0430\u043f\u0438\u0441\u0438.
Source code intools\\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 Defaultlog_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 Defaultdir_path str \u041f\u0443\u0442\u044c \u043a \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438.
requiredReturns:
Name Type Descriptionbool 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 intools\\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 Defaultname str \u0418\u043c\u044f \u043b\u043e\u0433\u0433\u0435\u0440\u0430 (\u043e\u0431\u044b\u0447\u043d\u043e name \u043c\u043e\u0434\u0443\u043b\u044f).
requiredReturns:
Type DescriptionLogger 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\u0440logger = get_logger(name) logger.debug(\"\u0422\u0435\u0441\u0442\u043e\u0432\u043e\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435\")
Source code intools\\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"}]}