e-nms_qa_automation/site/search/search_index.json

1 line
865 KiB
JSON

{"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":"<p>\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.</p>"},{"location":"#_1","title":"\u041e\u0431\u0437\u043e\u0440 \u043f\u0440\u043e\u0435\u043a\u0442\u0430","text":"<p>\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:</p> <ul> <li> <p>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</p> </li> <li> <p>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</p> </li> <li> <p>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</p> </li> <li> <p>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</p> </li> <li> <p>Python 3.8+ - \u044f\u0437\u044b\u043a \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438</p> </li> </ul>"},{"location":"#_2","title":"\u0414\u0435\u0442\u0430\u043b\u044c\u043d\u0430\u044f \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u043f\u0440\u043e\u0435\u043a\u0442\u0430","text":""},{"location":"#_3","title":"\u041a\u043e\u0440\u043d\u0435\u0432\u0430\u044f \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044f","text":"<ul> <li><code>.env</code> - \u0444\u0430\u0439\u043b \u0441 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u043c\u0438 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f</li> <li><code>conftest.py</code> - \u0444\u0438\u043a\u0441\u0442\u0443\u0440\u044b Pytest, \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438</li> <li><code>mkdocs.yml</code> - \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438</li> <li><code>pytest.ini</code> - \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)</li> <li><code>requirements.txt</code> - \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 Python</li> <li><code>setup.py</code> - \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f \u043f\u0430\u043a\u0435\u0442\u0430</li> </ul>"},{"location":"#_4","title":"\u041e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u043c\u043e\u0434\u0443\u043b\u0438","text":""},{"location":"#1-components","title":"1. components/","text":"<p>\u0411\u0430\u0437\u043e\u0432\u044b\u0435 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u044b UI: - <code>alert_component.py</code> - \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) - </p>"},{"location":"#2-data","title":"2. data/","text":"<p>\u0414\u0430\u043d\u043d\u044b\u0435 \u0438 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438: - <code>constants.py</code> - \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u044b (\u043b\u043e\u0433\u0438\u043d\u044b, \u043f\u0430\u0440\u043e\u043b\u0438) - <code>environment.py</code> - \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f (test/develop) - <code>roles_dict.py</code> - \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 - </p>"},{"location":"#3-docs","title":"3. docs/","text":"<p>\u0414\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f: - <code>tests/</code> - \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f \u0442\u0435\u0441\u0442\u043e\u0432 - <code>config/</code> - \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 \u043f\u043e \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0435 - index.md</p>"},{"location":"#4-elements","title":"4. elements/","text":"<p>UI-\u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b: - <code>base_element.py</code> - \u0431\u0430\u0437\u043e\u0432\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 - <code>button_element.py</code> - \u043a\u043d\u043e\u043f\u043a\u0438 - <code>checkbox_element.py</code> - \u0447\u0435\u043a\u0431\u043e\u043a\u0441\u044b - <code>text_element.py</code> - \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u044b\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b - <code>text_input_element.py</code> - \u043f\u043e\u043b\u044f \u0432\u0432\u043e\u0434\u0430 - <code>toolbar_button_element.py</code> - \u043a\u043d\u043e\u043f\u043a\u0438 \u0442\u0443\u043b\u0431\u0430\u0440\u0430</p>"},{"location":"#5-fixtures","title":"5. fixtures/","text":"<p>\u0424\u0438\u043a\u0441\u0442\u0443\u0440\u044b Pytest: - <code>pages.py</code> - \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</p>"},{"location":"#6-locators","title":"6. locators/","text":"<p>\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.)</p>"},{"location":"#7-modal_windows","title":"7. modal_windows/","text":"<p>\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: - <code>modal_add_user.py</code> - \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f - <code>modal_edit_user.py</code> - \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</p>"},{"location":"#8-pages","title":"8. pages/","text":"<p>\u0421\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f: - <code>base_page.py</code> - \u0431\u0430\u0437\u043e\u0432\u044b\u0439 \u043a\u043b\u0430\u0441\u0441 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b - <code>login_page.py</code> - \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0430 \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u0438 - <code>main_page.py</code> - \u0433\u043b\u0430\u0432\u043d\u0430\u044f \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0430 - \u0422\u0430\u0431\u044b: <code>service_status_tab.py</code>, <code>session_tab.py</code>, <code>users_tab.py</code></p>"},{"location":"#9-tests","title":"9. tests/","text":"<p>\u0422\u0435\u0441\u0442\u044b: - \u041e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u0442\u0435\u0441\u0442\u044b (<code>test_login.py</code>, <code>test_session_tab.py</code> \u0438 \u0434\u0440.) - \u041f\u043e\u0434\u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438: - <code>components/</code> - \u0442\u0435\u0441\u0442\u044b \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043e\u0432 - <code>e2e/</code> - end-to-end \u0442\u0435\u0441\u0442\u044b</p>"},{"location":"#10-tools","title":"10. tools/","text":"<p>\u0423\u0442\u0438\u043b\u0438\u0442\u044b: - <code>logger.py</code> - \u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u043b\u043e\u0433\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f</p>"},{"location":"#_5","title":"\u0412\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043e\u0432","text":"<ol> <li>\u0422\u0435\u0441\u0442\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b (pages)</li> <li>\u0421\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u0441\u043e\u0441\u0442\u043e\u044f\u0442 \u0438\u0437 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043e\u0432 (components)</li> <li>\u041a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u044b \u0441\u043e\u0441\u0442\u043e\u044f\u0442 \u0438\u0437 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 (elements)</li> <li>\u042d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442 \u043b\u043e\u043a\u0430\u0442\u043e\u0440\u044b \u0438\u0437 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0445 \u0444\u0430\u0439\u043b\u043e\u0432</li> <li>\u0412\u0441\u0435 \u043c\u043e\u0434\u0443\u043b\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442:</li> <li>\u041e\u0431\u0449\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0438\u0437 data/</li> <li>\u041b\u043e\u0433\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0447\u0435\u0440\u0435\u0437 tools/logger.py</li> <li>\u0424\u0438\u043a\u0441\u0442\u0443\u0440\u044b \u0438\u0437 fixtures/</li> </ol>"},{"location":"#_6","title":"\u041a\u0430\u043a \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c","text":""},{"location":"#_7","title":"\u0423\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438:","text":"<p>bash pip install -e . \u0417\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u0435 \u0442\u0435\u0441\u0442\u044b:</p> <p>bash</p>"},{"location":"#_8","title":"\u0412\u0441\u0435 \u0442\u0435\u0441\u0442\u044b","text":"<p>pytest tests/ -v</p>"},{"location":"#smoke-","title":"\u0422\u043e\u043b\u044c\u043a\u043e smoke-\u0442\u0435\u0441\u0442\u044b","text":"<p>pytest tests/ -m smoke -v</p>"},{"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":"<p>bash</p> <p>mkdocs serve</p>"},{"location":"#_10","title":"\u041f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u043c\u044b\u0435 \u0442\u0435\u0441\u0442\u044b","text":"<p>\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)</p> <p>\u0423\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0441\u0435\u0441\u0441\u0438\u044f\u043c\u0438:</p> <ul> <li> <p>\u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0442\u0430\u0431\u043b\u0438\u0446\u044b</p> </li> <li> <p>\u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u0441\u0435\u0441\u0441\u0438\u0439</p> </li> <li> <p>\u041c\u043e\u0434\u0430\u043b\u044c\u043d\u044b\u0435 \u043e\u043a\u043d\u0430</p> </li> </ul> <p>\u0423\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\u043c\u0438:</p> <ul> <li> <p>\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435/\u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0435</p> </li> <li> <p>\u0418\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u0440\u043e\u043b\u0435\u0439</p> </li> <li> <p>\u0421\u0431\u0440\u043e\u0441 \u043f\u0430\u0440\u043e\u043b\u0435\u0439</p> </li> </ul>"},{"location":"#_11","title":"\u0421\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0435 \u0442\u0435\u0441\u0442\u044b:","text":"<ul> <li> <p>\u0421\u0442\u0430\u0442\u0443\u0441 \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432</p> </li> <li> <p>\u041b\u0438\u0446\u0435\u043d\u0437\u0438\u0438</p> </li> </ul>"},{"location":"components/alert_component/","title":"AlertComponent","text":"<p>\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.</p> <p>\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.</p>"},{"location":"components/alert_component/#components.alert_component.AlertComponent","title":"<code>AlertComponent</code>","text":"<p> Bases: <code>BaseComponent</code></p> <p>\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.</p> <p>\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.</p> Source code in <code>components\\alert_component.py</code> <pre><code>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) -&gt; 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('&gt;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) -&gt; 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</code></pre>"},{"location":"components/alert_component/#components.alert_component.AlertComponent.__init__","title":"<code>__init__(page)</code>","text":"<p>\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.</p> <p>Parameters:</p> Name Type Description Default <code>page</code> <code>Page</code> <p>\u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.</p> required Source code in <code>components\\alert_component.py</code> <pre><code>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</code></pre>"},{"location":"components/alert_component/#components.alert_component.AlertComponent.check_alert_absence","title":"<code>check_alert_absence(text, timeout=30000)</code>","text":"<p>\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.</p> <p>Parameters:</p> Name Type Description Default <code>text</code> <code>str</code> <p>\u0422\u0435\u043a\u0441\u0442 \u0434\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438.</p> required <code>timeout</code> <code>int</code> <p>\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).</p> <code>30000</code> <p>Raises:</p> Type Description <code>AssertionError</code> <p>\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.</p> Source code in <code>components\\alert_component.py</code> <pre><code>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</code></pre>"},{"location":"components/alert_component/#components.alert_component.AlertComponent.check_alert_presence","title":"<code>check_alert_presence(text)</code>","text":"<p>\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.</p> <p>Parameters:</p> Name Type Description Default <code>text</code> <code>str</code> <p>\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.</p> required <p>Raises:</p> Type Description <code>AssertionError</code> <p>\u0415\u0441\u043b\u0438 alert-\u043e\u043a\u043d\u043e \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u043e.</p> Source code in <code>components\\alert_component.py</code> <pre><code>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</code></pre>"},{"location":"components/alert_component/#components.alert_component.AlertComponent.check_text","title":"<code>check_text(alert_text)</code>","text":"<p>\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.</p> <p>Parameters:</p> Name Type Description Default <code>alert_text</code> <code>str</code> <p>\u041e\u0436\u0438\u0434\u0430\u0435\u043c\u044b\u0439 \u0442\u0435\u043a\u0441\u0442 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f.</p> required <p>Raises:</p> Type Description <code>AssertionError</code> <p>\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.</p> Source code in <code>components\\alert_component.py</code> <pre><code>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</code></pre>"},{"location":"components/alert_component/#components.alert_component.AlertComponent.get_alert_type","title":"<code>get_alert_type()</code>","text":"<p>\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0442\u0438\u043f alert-\u043e\u043a\u043d\u0430.</p> <p>Returns:</p> Name Type Description <code>str</code> <code>str</code> <p>\u0422\u0438\u043f alert-\u043e\u043a\u043d\u0430.</p> <p>Raises:</p> Type Description <code>ValueError</code> <p>\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.</p> Source code in <code>components\\alert_component.py</code> <pre><code>def get_alert_type(self) -&gt; 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('&gt;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</code></pre>"},{"location":"components/alert_component/#components.alert_component.AlertComponent.get_text","title":"<code>get_text()</code>","text":"<p>\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.</p> <p>Returns:</p> Name Type Description <code>str</code> <code>str</code> <p>\u0422\u0435\u043a\u0441\u0442 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f.</p> Source code in <code>components\\alert_component.py</code> <pre><code>def get_text(self) -&gt; 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</code></pre>"},{"location":"components/base_component/","title":"BaseComponent","text":"<p>\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.</p> <p>\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.</p>"},{"location":"components/base_component/#components.base_component.BaseComponent","title":"<code>BaseComponent</code>","text":"<p>\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.</p> <p>\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</p> Source code in <code>components\\base_component.py</code> <pre><code>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) -&gt; 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_presence(self, locator: str | Locator, msg: str) -&gt; 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) -&gt; 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 =&gt; el.scrollHeight &gt; el.clientHeight\")\n\n def is_scrollable_horizontally(self, locator: str | Locator) -&gt; 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 =&gt; el.scrollWidth &gt; 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) -&gt; 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 =&gt; 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 =&gt; el.scrollTop\")\n assert scroll_position == 0, \"Invalid postion after scroll up\"\n\n def scroll_down(self, locator: str | Locator) -&gt; 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 =&gt; 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 =&gt; el.scrollTop\")\n assert scroll_position &gt; 0, \"Invalid postion after scroll down\"\n\n def scroll_left(self, locator: str | Locator) -&gt; 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 =&gt; 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 =&gt; el.scrollLeft\")\n assert scroll_position == 0, \"Invalid postion after scroll left\"\n\n def scroll_right(self, locator: str | Locator) -&gt; 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 =&gt; 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 =&gt; el.scrollLeft\")\n max_scroll_x = loc.evaluate(\"el =&gt; el.scrollWidth - el.clientWidth\")\n assert scroll_position &gt;= max_scroll_x, \"Invalid postion after scroll right\"\n</code></pre>"},{"location":"components/base_component/#components.base_component.BaseComponent.__init__","title":"<code>__init__(page)</code>","text":"<p>\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.</p> <p>Parameters:</p> Name Type Description Default <code>page</code> <code>Page</code> <p>\u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.</p> required Source code in <code>components\\base_component.py</code> <pre><code>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</code></pre>"},{"location":"components/base_component/#components.base_component.BaseComponent.check_presence","title":"<code>check_presence(locator, msg)</code>","text":"<p>\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.</p> <p>Parameters:</p> Name Type Description Default <code>locator</code> <code>str | Locator</code> <p>\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).</p> required <code>msg</code> <code>str</code> <p>\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.</p> required <p>Raises:</p> Type Description <code>AssertionError</code> <p>\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.</p> Source code in <code>components\\base_component.py</code> <pre><code>def check_presence(self, locator: str | Locator, msg: str) -&gt; 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</code></pre>"},{"location":"components/base_component/#components.base_component.BaseComponent.get_locator","title":"<code>get_locator(locator)</code>","text":"<p>\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.</p> <p>Parameters:</p> Name Type Description Default <code>locator</code> <code>str | Locator</code> <p>\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.</p> required <p>Returns:</p> Name Type Description <code>Locator</code> <code>Locator</code> <p>\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.</p> <p>Raises:</p> Type Description <code>TypeError</code> <p>\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.</p> Source code in <code>components\\base_component.py</code> <pre><code>def get_locator(self, locator: str | Locator) -&gt; 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</code></pre>"},{"location":"components/base_component/#components.base_component.BaseComponent.is_scrollable_horizontally","title":"<code>is_scrollable_horizontally(locator)</code>","text":"<p>\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.</p> <p>Parameters:</p> Name Type Description Default <code>locator</code> <code>str | Locator</code> <p>\u043b\u043e\u043a\u0430\u0442\u043e\u0440 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430.</p> required <p>Returns:</p> Name Type Description <code>bool</code> <code>bool</code> <p>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.</p> Source code in <code>components\\base_component.py</code> <pre><code>def is_scrollable_horizontally(self, locator: str | Locator) -&gt; 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 =&gt; el.scrollWidth &gt; el.clientWidth\")\n</code></pre>"},{"location":"components/base_component/#components.base_component.BaseComponent.is_scrollable_vertically","title":"<code>is_scrollable_vertically(locator)</code>","text":"<p>\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.</p> <p>Parameters:</p> Name Type Description Default <code>locator</code> <code>str | Locator</code> <p>\u043b\u043e\u043a\u0430\u0442\u043e\u0440 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430.</p> required <p>Returns:</p> Name Type Description <code>bool</code> <code>bool</code> <p>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.</p> Source code in <code>components\\base_component.py</code> <pre><code>def is_scrollable_vertically(self, locator: str | Locator) -&gt; 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 =&gt; el.scrollHeight &gt; el.clientHeight\")\n</code></pre>"},{"location":"components/base_component/#components.base_component.BaseComponent.scroll_down","title":"<code>scroll_down(locator)</code>","text":"<p>\u041f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0430 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0432\u043d\u0438\u0437.</p> <p>Parameters:</p> Name Type Description Default <code>locator</code> <code>str | Locator</code> <p>\u043b\u043e\u043a\u0430\u0442\u043e\u0440 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430.</p> required <p>Raises:</p> Type Description <code>AssertionError</code> <p>\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.</p> Source code in <code>components\\base_component.py</code> <pre><code>def scroll_down(self, locator: str | Locator) -&gt; 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 =&gt; 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 =&gt; el.scrollTop\")\n assert scroll_position &gt; 0, \"Invalid postion after scroll down\"\n</code></pre>"},{"location":"components/base_component/#components.base_component.BaseComponent.scroll_left","title":"<code>scroll_left(locator)</code>","text":"<p>\u041f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0430 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0432\u043b\u0435\u0432\u043e.</p> <p>Parameters:</p> Name Type Description Default <code>locator</code> <code>str | Locator</code> <p>\u043b\u043e\u043a\u0430\u0442\u043e\u0440 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430.</p> required <p>Raises:</p> Type Description <code>AssertionError</code> <p>\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.</p> Source code in <code>components\\base_component.py</code> <pre><code>def scroll_left(self, locator: str | Locator) -&gt; 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 =&gt; 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 =&gt; el.scrollLeft\")\n assert scroll_position == 0, \"Invalid postion after scroll left\"\n</code></pre>"},{"location":"components/base_component/#components.base_component.BaseComponent.scroll_right","title":"<code>scroll_right(locator)</code>","text":"<p>\u041f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0430 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0432\u043f\u0440\u0430\u0432\u043e.</p> <p>Parameters:</p> Name Type Description Default <code>locator</code> <code>str | Locator</code> <p>\u043b\u043e\u043a\u0430\u0442\u043e\u0440 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430.</p> required <p>Raises:</p> Type Description <code>AssertionError</code> <p>\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.</p> Source code in <code>components\\base_component.py</code> <pre><code>def scroll_right(self, locator: str | Locator) -&gt; 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 =&gt; 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 =&gt; el.scrollLeft\")\n max_scroll_x = loc.evaluate(\"el =&gt; el.scrollWidth - el.clientWidth\")\n assert scroll_position &gt;= max_scroll_x, \"Invalid postion after scroll right\"\n</code></pre>"},{"location":"components/base_component/#components.base_component.BaseComponent.scroll_up","title":"<code>scroll_up(locator)</code>","text":"<p>\u041f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0430 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0432\u0432\u0435\u0440\u0445.</p> <p>Parameters:</p> Name Type Description Default <code>locator</code> <code>str | Locator</code> <p>\u043b\u043e\u043a\u0430\u0442\u043e\u0440 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430.</p> required <p>Raises:</p> Type Description <code>AssertionError</code> <p>\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.</p> Source code in <code>components\\base_component.py</code> <pre><code>def scroll_up(self, locator: str | Locator) -&gt; 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 =&gt; 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 =&gt; el.scrollTop\")\n assert scroll_position == 0, \"Invalid postion after scroll up\"\n</code></pre>"},{"location":"components/card_component/","title":"CardComponent","text":"<p>\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.</p> <p>\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.</p>"},{"location":"components/card_component/#components.card_component.CardComponent","title":"<code>CardComponent</code>","text":"<p> Bases: <code>BaseComponent</code></p> <p>\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.</p> <p>\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.</p> Source code in <code>components\\card_component.py</code> <pre><code>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</code></pre>"},{"location":"components/card_component/#components.card_component.CardComponent.__init__","title":"<code>__init__(page)</code>","text":"<p>\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.</p> <p>Parameters:</p> Name Type Description Default <code>page</code> <code>Page</code> <p>\u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.</p> required Source code in <code>components\\card_component.py</code> <pre><code>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</code></pre>"},{"location":"components/card_component/#components.card_component.CardComponent.click_logout_button","title":"<code>click_logout_button()</code>","text":"<p>\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.</p> <p>\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.</p> Source code in <code>components\\card_component.py</code> <pre><code>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</code></pre>"},{"location":"components/confirm_component/","title":"ConfirmComponent","text":"<p>\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.</p> <p>\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.</p>"},{"location":"components/confirm_component/#components.confirm_component.ConfirmComponent","title":"<code>ConfirmComponent</code>","text":"<p> Bases: <code>BaseComponent</code></p> <p>\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.</p> Source code in <code>components\\confirm_component.py</code> <pre><code>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) -&gt; 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) -&gt; 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) -&gt; 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) -&gt; 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) -&gt; 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) -&gt; 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) -&gt; 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) -&gt; 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</code></pre>"},{"location":"components/confirm_component/#components.confirm_component.ConfirmComponent.__init__","title":"<code>__init__(page, cancel_button_text, allow_button_text)</code>","text":"<p>\u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430.</p> <p>Parameters:</p> Name Type Description Default <code>page</code> <code>Page</code> <p>\u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.</p> required <code>cancel_button_text</code> <code>str</code> <p>\u0422\u0435\u043a\u0441\u0442 \u043a\u043d\u043e\u043f\u043a\u0438 \u043e\u0442\u043c\u0435\u043d\u044b.</p> required <code>allow_button_text</code> <code>str</code> <p>\u0422\u0435\u043a\u0441\u0442 \u043a\u043d\u043e\u043f\u043a\u0438 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u044f.</p> required Source code in <code>components\\confirm_component.py</code> <pre><code>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</code></pre>"},{"location":"components/confirm_component/#components.confirm_component.ConfirmComponent.check_text","title":"<code>check_text(text, msg)</code>","text":"<p>\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.</p> <p>Parameters:</p> Name Type Description Default <code>text</code> <code>str</code> <p>\u041e\u0436\u0438\u0434\u0430\u0435\u043c\u044b\u0439 \u0442\u0435\u043a\u0441\u0442 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f.</p> required <code>msg</code> <code>str</code> <p>\u0421\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u043f\u0440\u0438 \u043e\u0448\u0438\u0431\u043a\u0435.</p> required Source code in <code>components\\confirm_component.py</code> <pre><code>def check_text(self, text: str, msg: str) -&gt; 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</code></pre>"},{"location":"components/confirm_component/#components.confirm_component.ConfirmComponent.check_title","title":"<code>check_title(title, msg)</code>","text":"<p>\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.</p> <p>Parameters:</p> Name Type Description Default <code>title</code> <code>str</code> <p>\u041e\u0436\u0438\u0434\u0430\u0435\u043c\u044b\u0439 \u0442\u0435\u043a\u0441\u0442 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430.</p> required <code>msg</code> <code>str</code> <p>\u0421\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u043f\u0440\u0438 \u043e\u0448\u0438\u0431\u043a\u0435.</p> required Source code in <code>components\\confirm_component.py</code> <pre><code>def check_title(self, title: str, msg: str) -&gt; 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</code></pre>"},{"location":"components/confirm_component/#components.confirm_component.ConfirmComponent.check_window_horizontal_scrolling","title":"<code>check_window_horizontal_scrolling()</code>","text":"<p>\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.</p> Source code in <code>components\\confirm_component.py</code> <pre><code>def check_window_horizontal_scrolling(self) -&gt; 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</code></pre>"},{"location":"components/confirm_component/#components.confirm_component.ConfirmComponent.click_allow_button","title":"<code>click_allow_button()</code>","text":"<p>\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.</p> Source code in <code>components\\confirm_component.py</code> <pre><code>def click_allow_button(self) -&gt; 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</code></pre>"},{"location":"components/confirm_component/#components.confirm_component.ConfirmComponent.click_cancel_button","title":"<code>click_cancel_button()</code>","text":"<p>\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.</p> Source code in <code>components\\confirm_component.py</code> <pre><code>def click_cancel_button(self) -&gt; 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</code></pre>"},{"location":"components/confirm_component/#components.confirm_component.ConfirmComponent.click_close_button","title":"<code>click_close_button()</code>","text":"<p>\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.</p> Source code in <code>components\\confirm_component.py</code> <pre><code>def click_close_button(self) -&gt; 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</code></pre>"},{"location":"components/confirm_component/#components.confirm_component.ConfirmComponent.scroll_window_left","title":"<code>scroll_window_left()</code>","text":"<p>\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.</p> Source code in <code>components\\confirm_component.py</code> <pre><code>def scroll_window_left(self) -&gt; 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</code></pre>"},{"location":"components/confirm_component/#components.confirm_component.ConfirmComponent.scroll_window_right","title":"<code>scroll_window_right()</code>","text":"<p>\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.</p> Source code in <code>components\\confirm_component.py</code> <pre><code>def scroll_window_right(self) -&gt; 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</code></pre>"},{"location":"components/json_container_component/","title":"JsonContainerComponent","text":"<p>\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.</p> <p>\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.</p>"},{"location":"components/json_container_component/#components.json_container_component.JsonContainerComponent","title":"<code>JsonContainerComponent</code>","text":"<p> Bases: <code>BaseComponent</code></p> <p>\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.</p> <p>\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.</p> Source code in <code>components\\json_container_component.py</code> <pre><code>class JsonContainerComponent(BaseComponent):\n \"\"\"\u041a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 JSON-\u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u043d\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435.\n\n \u041f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u043c\u0435\u0442\u043e\u0434\u044b \u0447\u0442\u0435\u043d\u0438\u044f \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 JSON-\u0434\u0430\u043d\u043d\u044b\u0445 \u0432 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430\u0445.\n\n \"\"\"\n\n def __init__(self, page: Page):\n \"\"\"\u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442 JSON-\u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440.\n\n Args:\n page: \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.\n \"\"\"\n\n super().__init__(page)\n\n # \u0414\u0435\u0439\u0441\u0442\u0432\u0438\u044f:\n def read_data(self, locator: Any) -&gt; Dict:\n \"\"\"\u0427\u0438\u0442\u0430\u0435\u0442 \u0438 \u0444\u043e\u0440\u043c\u0430\u0442\u0438\u0440\u0443\u0435\u0442 JSON-\u0434\u0430\u043d\u043d\u044b\u0435 \u0438\u0437 \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u043e\u0433\u043e \u043b\u043e\u043a\u0430\u0442\u043e\u0440\u0430.\n\n Args:\n locator: \u041b\u043e\u043a\u0430\u0442\u043e\u0440 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0441 JSON-\u0434\u0430\u043d\u043d\u044b\u043c\u0438.\n\n Returns:\n dict: \u0420\u0430\u0441\u043f\u0430\u0440\u0441\u0435\u043d\u043d\u044b\u0439 JSON-\u043e\u0431\u044a\u0435\u043a\u0442.\n\n Raises:\n json.JSONDecodeError: \u0415\u0441\u043b\u0438 \u0434\u0430\u043d\u043d\u044b\u0435 \u043d\u0435 \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u044b \u0432 JSON.\n \"\"\"\n\n def format_json_string(json_string):\n \"\"\"\u0424\u043e\u0440\u043c\u0430\u0442\u0438\u0440\u0443\u0435\u0442 \u0441\u0442\u0440\u043e\u043a\u0443 JSON \u0434\u043b\u044f \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0433\u043e \u043f\u0430\u0440\u0441\u0438\u043d\u0433\u0430.\n\n Args:\n json_string: \u0421\u044b\u0440\u0430\u044f \u0441\u0442\u0440\u043e\u043a\u0430 \u0441 JSON-\u0434\u0430\u043d\u043d\u044b\u043c\u0438.\n\n Returns:\n str: \u041e\u0442\u0444\u043e\u0440\u043c\u0430\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u0430\u044f \u0441\u0442\u0440\u043e\u043a\u0430 JSON.\n \"\"\"\n\n substrings = json_string.splitlines()\n formatted_string_list = []\n last_substring = substrings.pop()\n\n for substring in substrings:\n if substring.find(':') == -1:\n if substring == '{':\n formatted_string_list.append(substring)\n elif substring == '}':\n s1 = formatted_string_list.pop()\n formatted_string_list.append(s1.rstrip(','))\n formatted_string_list.append(substring + ',')\n else:\n formatted_string_list.append(substring + ',')\n continue\n\n key, value = substring.split(':')\n s = ':'.join(['\"' + key + '\" ', \" \" + value])\n\n if value == '{':\n formatted_string_list.append(s)\n else:\n formatted_string_list.append(s + ',')\n\n s2 = formatted_string_list.pop()\n formatted_string_list.append(s2.rstrip(','))\n formatted_string_list.append(last_substring)\n\n return \" \".join(formatted_string_list)\n\n # \u0427\u0442\u0435\u043d\u0438\u0435 JSON-\u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0433\u043e \u0438\u0437 \u0440\u0430\u0431\u043e\u0447\u0435\u0439 \u043e\u0431\u043b\u0430\u0441\u0442\u0438\n loc = self.get_locator(locator)\n json_string = loc.inner_text()\n formatted_json_string = format_json_string(json_string)\n return json.loads(formatted_json_string)\n\n # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0438:\n def check_json_equals(self, actual: Any, expected: Any, msg: str) -&gt; None:\n \"\"\"\u0421\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u0435\u0442 JSON-\u043e\u0431\u044a\u0435\u043a\u0442\u044b \u043d\u0430 \u0438\u0434\u0435\u043d\u0442\u0438\u0447\u043d\u043e\u0441\u0442\u044c.\n\n Args:\n actual: \u0424\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 JSON-\u043e\u0431\u044a\u0435\u043a\u0442.\n expected: \u041e\u0436\u0438\u0434\u0430\u0435\u043c\u044b\u0439 JSON-\u043e\u0431\u044a\u0435\u043a\u0442.\n msg: \u0421\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u043e\u0431 \u043e\u0448\u0438\u0431\u043a\u0435.\n\n Raises:\n AssertionError: \u0415\u0441\u043b\u0438 \u043e\u0431\u044a\u0435\u043a\u0442\u044b \u043d\u0435 \u0438\u0434\u0435\u043d\u0442\u0438\u0447\u043d\u044b.\n \"\"\"\n\n diff = jsondiff.diff(expected, actual, syntax='symmetric')\n assert len(diff) == 0, f\"{msg}. DIFF is {diff}\"\n</code></pre>"},{"location":"components/json_container_component/#components.json_container_component.JsonContainerComponent.__init__","title":"<code>__init__(page)</code>","text":"<p>\u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442 JSON-\u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440.</p> <p>Parameters:</p> Name Type Description Default <code>page</code> <code>Page</code> <p>\u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.</p> required Source code in <code>components\\json_container_component.py</code> <pre><code>def __init__(self, page: Page):\n \"\"\"\u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442 JSON-\u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440.\n\n Args:\n page: \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.\n \"\"\"\n\n super().__init__(page)\n</code></pre>"},{"location":"components/json_container_component/#components.json_container_component.JsonContainerComponent.check_json_equals","title":"<code>check_json_equals(actual, expected, msg)</code>","text":"<p>\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.</p> <p>Parameters:</p> Name Type Description Default <code>actual</code> <code>Any</code> <p>\u0424\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 JSON-\u043e\u0431\u044a\u0435\u043a\u0442.</p> required <code>expected</code> <code>Any</code> <p>\u041e\u0436\u0438\u0434\u0430\u0435\u043c\u044b\u0439 JSON-\u043e\u0431\u044a\u0435\u043a\u0442.</p> required <code>msg</code> <code>str</code> <p>\u0421\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u043e\u0431 \u043e\u0448\u0438\u0431\u043a\u0435.</p> required <p>Raises:</p> Type Description <code>AssertionError</code> <p>\u0415\u0441\u043b\u0438 \u043e\u0431\u044a\u0435\u043a\u0442\u044b \u043d\u0435 \u0438\u0434\u0435\u043d\u0442\u0438\u0447\u043d\u044b.</p> Source code in <code>components\\json_container_component.py</code> <pre><code>def check_json_equals(self, actual: Any, expected: Any, msg: str) -&gt; None:\n \"\"\"\u0421\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u0435\u0442 JSON-\u043e\u0431\u044a\u0435\u043a\u0442\u044b \u043d\u0430 \u0438\u0434\u0435\u043d\u0442\u0438\u0447\u043d\u043e\u0441\u0442\u044c.\n\n Args:\n actual: \u0424\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 JSON-\u043e\u0431\u044a\u0435\u043a\u0442.\n expected: \u041e\u0436\u0438\u0434\u0430\u0435\u043c\u044b\u0439 JSON-\u043e\u0431\u044a\u0435\u043a\u0442.\n msg: \u0421\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u043e\u0431 \u043e\u0448\u0438\u0431\u043a\u0435.\n\n Raises:\n AssertionError: \u0415\u0441\u043b\u0438 \u043e\u0431\u044a\u0435\u043a\u0442\u044b \u043d\u0435 \u0438\u0434\u0435\u043d\u0442\u0438\u0447\u043d\u044b.\n \"\"\"\n\n diff = jsondiff.diff(expected, actual, syntax='symmetric')\n assert len(diff) == 0, f\"{msg}. DIFF is {diff}\"\n</code></pre>"},{"location":"components/json_container_component/#components.json_container_component.JsonContainerComponent.read_data","title":"<code>read_data(locator)</code>","text":"<p>\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.</p> <p>Parameters:</p> Name Type Description Default <code>locator</code> <code>Any</code> <p>\u041b\u043e\u043a\u0430\u0442\u043e\u0440 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0441 JSON-\u0434\u0430\u043d\u043d\u044b\u043c\u0438.</p> required <p>Returns:</p> Name Type Description <code>dict</code> <code>Dict</code> <p>\u0420\u0430\u0441\u043f\u0430\u0440\u0441\u0435\u043d\u043d\u044b\u0439 JSON-\u043e\u0431\u044a\u0435\u043a\u0442.</p> <p>Raises:</p> Type Description <code>JSONDecodeError</code> <p>\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.</p> Source code in <code>components\\json_container_component.py</code> <pre><code>def read_data(self, locator: Any) -&gt; Dict:\n \"\"\"\u0427\u0438\u0442\u0430\u0435\u0442 \u0438 \u0444\u043e\u0440\u043c\u0430\u0442\u0438\u0440\u0443\u0435\u0442 JSON-\u0434\u0430\u043d\u043d\u044b\u0435 \u0438\u0437 \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u043e\u0433\u043e \u043b\u043e\u043a\u0430\u0442\u043e\u0440\u0430.\n\n Args:\n locator: \u041b\u043e\u043a\u0430\u0442\u043e\u0440 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0441 JSON-\u0434\u0430\u043d\u043d\u044b\u043c\u0438.\n\n Returns:\n dict: \u0420\u0430\u0441\u043f\u0430\u0440\u0441\u0435\u043d\u043d\u044b\u0439 JSON-\u043e\u0431\u044a\u0435\u043a\u0442.\n\n Raises:\n json.JSONDecodeError: \u0415\u0441\u043b\u0438 \u0434\u0430\u043d\u043d\u044b\u0435 \u043d\u0435 \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u044b \u0432 JSON.\n \"\"\"\n\n def format_json_string(json_string):\n \"\"\"\u0424\u043e\u0440\u043c\u0430\u0442\u0438\u0440\u0443\u0435\u0442 \u0441\u0442\u0440\u043e\u043a\u0443 JSON \u0434\u043b\u044f \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0433\u043e \u043f\u0430\u0440\u0441\u0438\u043d\u0433\u0430.\n\n Args:\n json_string: \u0421\u044b\u0440\u0430\u044f \u0441\u0442\u0440\u043e\u043a\u0430 \u0441 JSON-\u0434\u0430\u043d\u043d\u044b\u043c\u0438.\n\n Returns:\n str: \u041e\u0442\u0444\u043e\u0440\u043c\u0430\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u0430\u044f \u0441\u0442\u0440\u043e\u043a\u0430 JSON.\n \"\"\"\n\n substrings = json_string.splitlines()\n formatted_string_list = []\n last_substring = substrings.pop()\n\n for substring in substrings:\n if substring.find(':') == -1:\n if substring == '{':\n formatted_string_list.append(substring)\n elif substring == '}':\n s1 = formatted_string_list.pop()\n formatted_string_list.append(s1.rstrip(','))\n formatted_string_list.append(substring + ',')\n else:\n formatted_string_list.append(substring + ',')\n continue\n\n key, value = substring.split(':')\n s = ':'.join(['\"' + key + '\" ', \" \" + value])\n\n if value == '{':\n formatted_string_list.append(s)\n else:\n formatted_string_list.append(s + ',')\n\n s2 = formatted_string_list.pop()\n formatted_string_list.append(s2.rstrip(','))\n formatted_string_list.append(last_substring)\n\n return \" \".join(formatted_string_list)\n\n # \u0427\u0442\u0435\u043d\u0438\u0435 JSON-\u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0433\u043e \u0438\u0437 \u0440\u0430\u0431\u043e\u0447\u0435\u0439 \u043e\u0431\u043b\u0430\u0441\u0442\u0438\n loc = self.get_locator(locator)\n json_string = loc.inner_text()\n formatted_json_string = format_json_string(json_string)\n return json.loads(formatted_json_string)\n</code></pre>"},{"location":"components/modal_window_component/","title":"ModalWindowComponent","text":"<p>\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.</p>"},{"location":"components/modal_window_component/#components.modal_window_component.ModalWindowComponent","title":"<code>ModalWindowComponent</code>","text":"<p> Bases: <code>BaseComponent</code></p> <p>\u041a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430. \u041f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u043c\u0435\u0442\u043e\u0434\u044b \u0434\u043b\u044f \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0441 \u043e\u043a\u043d\u043e\u043c, \u0435\u0433\u043e \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u044b\u043c \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u043e\u043a.</p> Source code in <code>components\\modal_window_component.py</code> <pre><code>class ModalWindowComponent(BaseComponent):\n \"\"\"\u041a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430. \u041f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u043c\u0435\u0442\u043e\u0434\u044b \u0434\u043b\u044f \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0441 \u043e\u043a\u043d\u043e\u043c,\n \u0435\u0433\u043e \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u044b\u043c \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u043e\u043a.\"\"\"\n\n def __init__(self, page: Page):\n super().__init__(page)\n self.toolbar = ToolbarComponent(page, \"\")\n self.content_items = {}\n self.buttons = []\n\n # \u0414\u0435\u0439\u0441\u0442\u0432\u0438\u044f:\n def add_content_item(self, name: str, item: object) -&gt; None:\n \"\"\"\u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0433\u043e \u0432 \u043e\u043a\u043d\u043e \u043f\u043e \u0437\u0430\u0434\u0430\u043d\u043d\u043e\u043c\u0443 \u0438\u043c\u0435\u043d\u0438.\"\"\"\n\n self.content_items[name] = item\n\n def get_content_item(self, name: str) -&gt; object | None:\n \"\"\"\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0433\u043e \u043f\u043e \u0438\u043c\u0435\u043d\u0438 \u0438\u043b\u0438 None, \u0435\u0441\u043b\u0438 \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d.\"\"\"\n\n return self.content_items.get(name)\n\n def add_toolbar_title(self, title: str) -&gt; None:\n \"\"\"\u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a \u0432 \u043f\u0430\u043d\u0435\u043b\u044c \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430.\"\"\"\n\n self.toolbar.add_title(title)\n\n def add_toolbar_button(self, locator: str, name: str) -&gt; None:\n \"\"\"\u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u043a\u043d\u043e\u043f\u043a\u0443 \u0432 \u043f\u0430\u043d\u0435\u043b\u044c \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430.\"\"\"\n\n self.toolbar.add_button(locator, name)\n\n def add_button(self, locator: str, name: str) -&gt; None:\n \"\"\"\u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u043a\u043d\u043e\u043f\u043a\u0443 \u0432 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043a\u043d\u043e.\"\"\"\n\n self.buttons.append(Button(self.page, locator, name))\n\n def get_button_by_name(self, name: str) -&gt; Button | None:\n \"\"\"\u0418\u0449\u0435\u0442 \u0438 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043a\u043d\u043e\u043f\u043a\u0443 \u043f\u043e \u0438\u043c\u0435\u043d\u0438 \u0438\u043b\u0438 None, \u0435\u0441\u043b\u0438 \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u0430.\"\"\"\n\n for button in self.buttons:\n if button.name == name:\n return button\n return None\n\n def click_button(self, name: str) -&gt; None:\n \"\"\"\u041a\u043b\u0438\u043a\u0430\u0435\u0442 \u043f\u043e \u043a\u043d\u043e\u043f\u043a\u0435 \u0441 \u0437\u0430\u0434\u0430\u043d\u043d\u044b\u043c \u0438\u043c\u0435\u043d\u0435\u043c. \u0412\u044b\u0437\u044b\u0432\u0430\u0435\u0442 \u043e\u0448\u0438\u0431\u043a\u0443, \u0435\u0441\u043b\u0438 \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u0430.\"\"\"\n\n button = self.get_button_by_name(name)\n if button is None:\n assert False, f\"Button with name '{name}' not found\"\n button.click()\n\n def click_toolbar_close_button(self) -&gt; None:\n \"\"\"\u041a\u043b\u0438\u043a\u0430\u0435\u0442 \u043f\u043e \u043a\u043d\u043e\u043f\u043a\u0435 \u0437\u0430\u043a\u0440\u044b\u0442\u0438\u044f \u0432 \u043f\u0430\u043d\u0435\u043b\u0438 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432.\"\"\"\n\n self.toolbar.click_button(\"close\")\n\n def scroll_window_down(self) -&gt; None:\n \"\"\"\u041f\u0440\u043e\u043a\u0440\u0443\u0447\u0438\u0432\u0430\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u043e\u043a\u043d\u0430 \u0432\u043d\u0438\u0437.\"\"\"\n\n self.scroll_down(ModalWindowLocators.MODAL_WINDOW)\n\n def scroll_window_up(self) -&gt; None:\n \"\"\"\u041f\u0440\u043e\u043a\u0440\u0443\u0447\u0438\u0432\u0430\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u043e\u043a\u043d\u0430 \u0432\u0432\u0435\u0440\u0445.\"\"\"\n\n self.scroll_up(ModalWindowLocators.MODAL_WINDOW)\n\n def scroll_window_left(self) -&gt; None:\n \"\"\"\u041f\u0440\u043e\u043a\u0440\u0443\u0447\u0438\u0432\u0430\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u043e\u043a\u043d\u0430 \u0432\u043b\u0435\u0432\u043e.\"\"\"\n\n self.scroll_left(ModalWindowLocators.MODAL_WINDOW)\n\n def scroll_window_right(self) -&gt; None:\n \"\"\"\u041f\u0440\u043e\u043a\u0440\u0443\u0447\u0438\u0432\u0430\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u043e\u043a\u043d\u0430 \u0432\u043f\u0440\u0430\u0432\u043e.\"\"\"\n\n self.scroll_right(ModalWindowLocators.MODAL_WINDOW)\n\n # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0438:\n def check_window_vertical_scrolling(self) -&gt; bool:\n \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u0439 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0438 \u043e\u043a\u043d\u0430.\"\"\"\n\n return self.is_scrollable_vertically(ModalWindowLocators.MODAL_WINDOW)\n\n def check_window_horizontal_scrolling(self) -&gt; bool:\n \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0433\u043e\u0440\u0438\u0437\u043e\u043d\u0442\u0430\u043b\u044c\u043d\u043e\u0439 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0438 \u043e\u043a\u043d\u0430.\"\"\"\n\n return self.is_scrollable_horizontally(ModalWindowLocators.MODAL_WINDOW)\n\n def check_by_window_title(self) -&gt; None:\n \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u043e\u043a\u043d\u0430 \u043f\u043e \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0443.\"\"\"\n\n self.toolbar.check_toolbar_presence(f\"Modal window with '{self.toolbar.title}' is missing\")\n\n def check_button_presence(self, name: str) -&gt; None:\n \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u043a\u043d\u043e\u043f\u043a\u0438 \u043f\u043e \u0438\u043c\u0435\u043d\u0438. \u0412\u044b\u0437\u044b\u0432\u0430\u0435\u0442 \u043e\u0448\u0438\u0431\u043a\u0443, \u0435\u0441\u043b\u0438 \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u0430.\"\"\"\n\n button = self.get_button_by_name(name)\n if button is None:\n assert False, f\"Button with name '{name}' not found\"\n button.check_presence(f\"Button with name '{name}' is missing\")\n\n def check_toolbar_button_presence(self, name: str) -&gt; None:\n \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u043a\u043d\u043e\u043f\u043a\u0438 \u0432 \u043f\u0430\u043d\u0435\u043b\u0438 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432.\"\"\"\n\n self.toolbar.check_button_presence(name)\n\n def check_toolbar_button_tooltip(self, name: str, tooltip: str) -&gt; None:\n \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0443 \u0443 \u043a\u043d\u043e\u043f\u043a\u0438 \u0432 \u043f\u0430\u043d\u0435\u043b\u0438 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432.\"\"\"\n\n self.toolbar.check_button_tooltip(name, tooltip)\n</code></pre>"},{"location":"components/modal_window_component/#components.modal_window_component.ModalWindowComponent.add_button","title":"<code>add_button(locator, name)</code>","text":"<p>\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.</p> Source code in <code>components\\modal_window_component.py</code> <pre><code>def add_button(self, locator: str, name: str) -&gt; None:\n \"\"\"\u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u043a\u043d\u043e\u043f\u043a\u0443 \u0432 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043a\u043d\u043e.\"\"\"\n\n self.buttons.append(Button(self.page, locator, name))\n</code></pre>"},{"location":"components/modal_window_component/#components.modal_window_component.ModalWindowComponent.add_content_item","title":"<code>add_content_item(name, item)</code>","text":"<p>\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.</p> Source code in <code>components\\modal_window_component.py</code> <pre><code>def add_content_item(self, name: str, item: object) -&gt; None:\n \"\"\"\u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0433\u043e \u0432 \u043e\u043a\u043d\u043e \u043f\u043e \u0437\u0430\u0434\u0430\u043d\u043d\u043e\u043c\u0443 \u0438\u043c\u0435\u043d\u0438.\"\"\"\n\n self.content_items[name] = item\n</code></pre>"},{"location":"components/modal_window_component/#components.modal_window_component.ModalWindowComponent.add_toolbar_button","title":"<code>add_toolbar_button(locator, name)</code>","text":"<p>\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.</p> Source code in <code>components\\modal_window_component.py</code> <pre><code>def add_toolbar_button(self, locator: str, name: str) -&gt; None:\n \"\"\"\u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u043a\u043d\u043e\u043f\u043a\u0443 \u0432 \u043f\u0430\u043d\u0435\u043b\u044c \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430.\"\"\"\n\n self.toolbar.add_button(locator, name)\n</code></pre>"},{"location":"components/modal_window_component/#components.modal_window_component.ModalWindowComponent.add_toolbar_title","title":"<code>add_toolbar_title(title)</code>","text":"<p>\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.</p> Source code in <code>components\\modal_window_component.py</code> <pre><code>def add_toolbar_title(self, title: str) -&gt; None:\n \"\"\"\u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a \u0432 \u043f\u0430\u043d\u0435\u043b\u044c \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430.\"\"\"\n\n self.toolbar.add_title(title)\n</code></pre>"},{"location":"components/modal_window_component/#components.modal_window_component.ModalWindowComponent.check_button_presence","title":"<code>check_button_presence(name)</code>","text":"<p>\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.</p> Source code in <code>components\\modal_window_component.py</code> <pre><code>def check_button_presence(self, name: str) -&gt; None:\n \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u043a\u043d\u043e\u043f\u043a\u0438 \u043f\u043e \u0438\u043c\u0435\u043d\u0438. \u0412\u044b\u0437\u044b\u0432\u0430\u0435\u0442 \u043e\u0448\u0438\u0431\u043a\u0443, \u0435\u0441\u043b\u0438 \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u0430.\"\"\"\n\n button = self.get_button_by_name(name)\n if button is None:\n assert False, f\"Button with name '{name}' not found\"\n button.check_presence(f\"Button with name '{name}' is missing\")\n</code></pre>"},{"location":"components/modal_window_component/#components.modal_window_component.ModalWindowComponent.check_by_window_title","title":"<code>check_by_window_title()</code>","text":"<p>\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.</p> Source code in <code>components\\modal_window_component.py</code> <pre><code>def check_by_window_title(self) -&gt; None:\n \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u043e\u043a\u043d\u0430 \u043f\u043e \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0443.\"\"\"\n\n self.toolbar.check_toolbar_presence(f\"Modal window with '{self.toolbar.title}' is missing\")\n</code></pre>"},{"location":"components/modal_window_component/#components.modal_window_component.ModalWindowComponent.check_toolbar_button_presence","title":"<code>check_toolbar_button_presence(name)</code>","text":"<p>\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.</p> Source code in <code>components\\modal_window_component.py</code> <pre><code>def check_toolbar_button_presence(self, name: str) -&gt; None:\n \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u043a\u043d\u043e\u043f\u043a\u0438 \u0432 \u043f\u0430\u043d\u0435\u043b\u0438 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432.\"\"\"\n\n self.toolbar.check_button_presence(name)\n</code></pre>"},{"location":"components/modal_window_component/#components.modal_window_component.ModalWindowComponent.check_toolbar_button_tooltip","title":"<code>check_toolbar_button_tooltip(name, tooltip)</code>","text":"<p>\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.</p> Source code in <code>components\\modal_window_component.py</code> <pre><code>def check_toolbar_button_tooltip(self, name: str, tooltip: str) -&gt; None:\n \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0443 \u0443 \u043a\u043d\u043e\u043f\u043a\u0438 \u0432 \u043f\u0430\u043d\u0435\u043b\u0438 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432.\"\"\"\n\n self.toolbar.check_button_tooltip(name, tooltip)\n</code></pre>"},{"location":"components/modal_window_component/#components.modal_window_component.ModalWindowComponent.check_window_horizontal_scrolling","title":"<code>check_window_horizontal_scrolling()</code>","text":"<p>\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.</p> Source code in <code>components\\modal_window_component.py</code> <pre><code>def check_window_horizontal_scrolling(self) -&gt; bool:\n \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0433\u043e\u0440\u0438\u0437\u043e\u043d\u0442\u0430\u043b\u044c\u043d\u043e\u0439 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0438 \u043e\u043a\u043d\u0430.\"\"\"\n\n return self.is_scrollable_horizontally(ModalWindowLocators.MODAL_WINDOW)\n</code></pre>"},{"location":"components/modal_window_component/#components.modal_window_component.ModalWindowComponent.check_window_vertical_scrolling","title":"<code>check_window_vertical_scrolling()</code>","text":"<p>\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.</p> Source code in <code>components\\modal_window_component.py</code> <pre><code>def check_window_vertical_scrolling(self) -&gt; bool:\n \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u0439 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0438 \u043e\u043a\u043d\u0430.\"\"\"\n\n return self.is_scrollable_vertically(ModalWindowLocators.MODAL_WINDOW)\n</code></pre>"},{"location":"components/modal_window_component/#components.modal_window_component.ModalWindowComponent.click_button","title":"<code>click_button(name)</code>","text":"<p>\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.</p> Source code in <code>components\\modal_window_component.py</code> <pre><code>def click_button(self, name: str) -&gt; None:\n \"\"\"\u041a\u043b\u0438\u043a\u0430\u0435\u0442 \u043f\u043e \u043a\u043d\u043e\u043f\u043a\u0435 \u0441 \u0437\u0430\u0434\u0430\u043d\u043d\u044b\u043c \u0438\u043c\u0435\u043d\u0435\u043c. \u0412\u044b\u0437\u044b\u0432\u0430\u0435\u0442 \u043e\u0448\u0438\u0431\u043a\u0443, \u0435\u0441\u043b\u0438 \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u0430.\"\"\"\n\n button = self.get_button_by_name(name)\n if button is None:\n assert False, f\"Button with name '{name}' not found\"\n button.click()\n</code></pre>"},{"location":"components/modal_window_component/#components.modal_window_component.ModalWindowComponent.click_toolbar_close_button","title":"<code>click_toolbar_close_button()</code>","text":"<p>\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.</p> Source code in <code>components\\modal_window_component.py</code> <pre><code>def click_toolbar_close_button(self) -&gt; None:\n \"\"\"\u041a\u043b\u0438\u043a\u0430\u0435\u0442 \u043f\u043e \u043a\u043d\u043e\u043f\u043a\u0435 \u0437\u0430\u043a\u0440\u044b\u0442\u0438\u044f \u0432 \u043f\u0430\u043d\u0435\u043b\u0438 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432.\"\"\"\n\n self.toolbar.click_button(\"close\")\n</code></pre>"},{"location":"components/modal_window_component/#components.modal_window_component.ModalWindowComponent.get_button_by_name","title":"<code>get_button_by_name(name)</code>","text":"<p>\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.</p> Source code in <code>components\\modal_window_component.py</code> <pre><code>def get_button_by_name(self, name: str) -&gt; Button | None:\n \"\"\"\u0418\u0449\u0435\u0442 \u0438 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043a\u043d\u043e\u043f\u043a\u0443 \u043f\u043e \u0438\u043c\u0435\u043d\u0438 \u0438\u043b\u0438 None, \u0435\u0441\u043b\u0438 \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u0430.\"\"\"\n\n for button in self.buttons:\n if button.name == name:\n return button\n return None\n</code></pre>"},{"location":"components/modal_window_component/#components.modal_window_component.ModalWindowComponent.get_content_item","title":"<code>get_content_item(name)</code>","text":"<p>\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.</p> Source code in <code>components\\modal_window_component.py</code> <pre><code>def get_content_item(self, name: str) -&gt; object | None:\n \"\"\"\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0433\u043e \u043f\u043e \u0438\u043c\u0435\u043d\u0438 \u0438\u043b\u0438 None, \u0435\u0441\u043b\u0438 \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d.\"\"\"\n\n return self.content_items.get(name)\n</code></pre>"},{"location":"components/modal_window_component/#components.modal_window_component.ModalWindowComponent.scroll_window_down","title":"<code>scroll_window_down()</code>","text":"<p>\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.</p> Source code in <code>components\\modal_window_component.py</code> <pre><code>def scroll_window_down(self) -&gt; None:\n \"\"\"\u041f\u0440\u043e\u043a\u0440\u0443\u0447\u0438\u0432\u0430\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u043e\u043a\u043d\u0430 \u0432\u043d\u0438\u0437.\"\"\"\n\n self.scroll_down(ModalWindowLocators.MODAL_WINDOW)\n</code></pre>"},{"location":"components/modal_window_component/#components.modal_window_component.ModalWindowComponent.scroll_window_left","title":"<code>scroll_window_left()</code>","text":"<p>\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.</p> Source code in <code>components\\modal_window_component.py</code> <pre><code>def scroll_window_left(self) -&gt; None:\n \"\"\"\u041f\u0440\u043e\u043a\u0440\u0443\u0447\u0438\u0432\u0430\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u043e\u043a\u043d\u0430 \u0432\u043b\u0435\u0432\u043e.\"\"\"\n\n self.scroll_left(ModalWindowLocators.MODAL_WINDOW)\n</code></pre>"},{"location":"components/modal_window_component/#components.modal_window_component.ModalWindowComponent.scroll_window_right","title":"<code>scroll_window_right()</code>","text":"<p>\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.</p> Source code in <code>components\\modal_window_component.py</code> <pre><code>def scroll_window_right(self) -&gt; None:\n \"\"\"\u041f\u0440\u043e\u043a\u0440\u0443\u0447\u0438\u0432\u0430\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u043e\u043a\u043d\u0430 \u0432\u043f\u0440\u0430\u0432\u043e.\"\"\"\n\n self.scroll_right(ModalWindowLocators.MODAL_WINDOW)\n</code></pre>"},{"location":"components/modal_window_component/#components.modal_window_component.ModalWindowComponent.scroll_window_up","title":"<code>scroll_window_up()</code>","text":"<p>\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.</p> Source code in <code>components\\modal_window_component.py</code> <pre><code>def scroll_window_up(self) -&gt; None:\n \"\"\"\u041f\u0440\u043e\u043a\u0440\u0443\u0447\u0438\u0432\u0430\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u043e\u043a\u043d\u0430 \u0432\u0432\u0435\u0440\u0445.\"\"\"\n\n self.scroll_up(ModalWindowLocators.MODAL_WINDOW)\n</code></pre>"},{"location":"components/navbar_component/","title":"NavigationPanelComponent","text":"<p>\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.</p>"},{"location":"components/navbar_component/#components.navbar_component.NavigationPanelComponent","title":"<code>NavigationPanelComponent</code>","text":"<p> Bases: <code>BaseComponent</code></p> <p>\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.</p> Source code in <code>components\\navbar_component.py</code> <pre><code>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) -&gt; 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) -&gt; 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) -&gt; 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) -&gt; 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('&gt;div.v-treeview-node')\n # \u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0441\u043f\u0438\u0441\u043e\u043a \u0442\u0435\u043a\u0441\u0442\u043e\u0432\n root_node_texts = root_node.all_inner_texts()\n\n # \u0415\u0441\u043b\u0438 \u0438\u0441\u043a\u043e\u043c\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u043d\u0430 \u0434\u0430\u043d\u043d\u043e\u043c \u0443\u0440\u043e\u0432\u043d\u0435, \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u0435\u043c \u043b\u043e\u043a\u0430\u0442\u043e\u0440 \u0438 \u0434\u0435\u043b\u0430\u0435\u043c \u043a\u043b\u0438\u043a\n for index, node_text in enumerate(root_node_texts):\n node_text = node_text.replace(\"expand_more\\n\", \"\")\n if item_name == node_text:\n root_node.nth(index).click()\n return True\n\n # \u0415\u0441\u043b\u0438 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u043d\u0435\u0442, \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u043e \u0438\u0449\u0435\u043c \u0434\u0430\u043b\u044c\u0448\u0435\n nodes_count = root_locator.locator('&gt;div.v-treeview-node').count()\n\n for index in range(nodes_count):\n node = root_locator.locator(f\"&gt;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('&gt;div.v-treeview-node__children').count()\n content = node.locator('&gt;div.v-treeview-node__children').inner_html()\n if children_count &gt; 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\"&gt;div:nth-child({index + 1})\").locator('&gt;div.v-treeview-node__children')\n is_found = find_and_click_item(page, child_nodes_locator, item_name)\n if is_found:\n return True\n\n # \u0437\u0430\u043a\u0440\u044b\u0432\u0430\u0435\u043c \u0443\u0437\u0435\u043b, \u0435\u0441\u043b\u0438 \u0432 \u043d\u0435\u043c \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u043d\u0430\u0448\u043b\u0438\n if is_expanded:\n toggle_button = node.locator(NavigationPanelLocators.TOGGLE_BUTTON)\n toggle_button.click()\n\n # \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0441 \u0437\u0430\u0434\u0430\u043d\u043d\u044b\u043c \u0438\u043c\u0435\u043d\u0435\u043c \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\n return False\n\n root_locator = self.get_locator(node_root_locator)\n found = find_and_click_item(self.page, root_locator, item_name)\n assert found, f\"Navigation panel item {item_name} is missing\"\n\n def traverse_panel_tree(self, node_root_locator: str | Locator, level=0, debug=False):\n \"\"\"\n \u0420\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u043e \u043e\u0431\u0445\u043e\u0434\u0438\u0442 \u0434\u0435\u0440\u0435\u0432\u043e v-treeview \u0438 \u0432\u044b\u0432\u043e\u0434\u0438\u0442 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e\u0431 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u0445 \u0432 \u0440\u0435\u0436\u0438\u043c\u0435 \u043e\u0442\u043b\u0430\u0434\u043a\u0438 (debug=True).\n\n Args:\n node_root_locator: \u041b\u043e\u043a\u0430\u0442\u043e\u0440 \u0434\u043b\u044f \u043f\u043e\u0438\u0441\u043a\u0430 \u043a\u043e\u0440\u043d\u0435\u0432\u044b\u0445 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0434\u0435\u0440\u0435\u0432\u0430 (\u041b\u043e\u043a\u0430\u0442\u043e\u0440 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0438\u043b\u0438 \u0441\u0442\u0440\u043e\u043a\u0430 \u0441 CSS/XPath).\n \"\"\"\n def traverse_tree(page, root_locator, level=0, debug=False):\n # \u041d\u0430\u0445\u043e\u0434\u0438\u043c \u0432\u0441\u0435 \u043b\u043e\u043a\u0430\u0442\u043e\u0440\u044b \u043a\u043e\u0440\u043d\u0435\u0432\u044b\u0445 \u0443\u0437\u043b\u043e\u0432 \u043d\u0430 \u0442\u0435\u043a\u0443\u0449\u0435\u043c \u0443\u0440\u043e\u0432\u043d\u0435\n nodes_count = root_locator.locator('&gt;div.v-treeview-node').count()\n\n for index in range(nodes_count):\n node = root_locator.locator(f\"&gt;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('&gt;div.v-treeview-node__children').count()\n content = node.locator('&gt;div.v-treeview-node__children').inner_html()\n if children_count &gt; 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\"&gt;div:nth-child({index + 1})\").locator('&gt;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) -&gt; 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_presence(loc, msg)\n</code></pre>"},{"location":"components/navbar_component/#components.navbar_component.NavigationPanelComponent.__init__","title":"<code>__init__(page)</code>","text":"<p>\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.</p> <p>Parameters:</p> Name Type Description Default <code>page</code> <code>Page</code> <p>\u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.</p> required Source code in <code>components\\navbar_component.py</code> <pre><code>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</code></pre>"},{"location":"components/navbar_component/#components.navbar_component.NavigationPanelComponent.check_item_visibility","title":"<code>check_item_visibility(locator, item_name)</code>","text":"<p>\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.</p> <p>Parameters:</p> Name Type Description Default <code>locator</code> <code>str | Locator</code> <p>\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.</p> required <code>item_name</code> <code>str</code> <p>\u0422\u0435\u043a\u0441\u0442 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0434\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438.</p> required Note <p>\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'.</p> Source code in <code>components\\navbar_component.py</code> <pre><code>def check_item_visibility(self, locator: str | Locator, item_name: str) -&gt; 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_presence(loc, msg)\n</code></pre>"},{"location":"components/navbar_component/#components.navbar_component.NavigationPanelComponent.click_item","title":"<code>click_item(locator, item_name)</code>","text":"<p>\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.</p> <p>Parameters:</p> Name Type Description Default <code>locator</code> <code>str | Locator</code> <p>\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.</p> required <code>item_name</code> <code>str</code> <p>\u0422\u0435\u043a\u0441\u0442 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0434\u043b\u044f \u043a\u043b\u0438\u043a\u0430.</p> required Source code in <code>components\\navbar_component.py</code> <pre><code>def click_item(self, locator: str | Locator, item_name: str) -&gt; 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</code></pre>"},{"location":"components/navbar_component/#components.navbar_component.NavigationPanelComponent.click_sub_item","title":"<code>click_sub_item(node_root_locator, item_name)</code>","text":"<p>\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.</p> <p>Parameters:</p> Name Type Description Default <code>node_root_locator</code> <code>str | Locator</code> <p>\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).</p> required <code>item_name</code> <code>str</code> <p>\u0422\u0435\u043a\u0441\u0442 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0434\u043b\u044f \u043a\u043b\u0438\u043a\u0430.</p> required Source code in <code>components\\navbar_component.py</code> <pre><code>def click_sub_item(self, node_root_locator: str | Locator, item_name: str) -&gt; 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) -&gt; 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('&gt;div.v-treeview-node')\n # \u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0441\u043f\u0438\u0441\u043e\u043a \u0442\u0435\u043a\u0441\u0442\u043e\u0432\n root_node_texts = root_node.all_inner_texts()\n\n # \u0415\u0441\u043b\u0438 \u0438\u0441\u043a\u043e\u043c\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u043d\u0430 \u0434\u0430\u043d\u043d\u043e\u043c \u0443\u0440\u043e\u0432\u043d\u0435, \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u0435\u043c \u043b\u043e\u043a\u0430\u0442\u043e\u0440 \u0438 \u0434\u0435\u043b\u0430\u0435\u043c \u043a\u043b\u0438\u043a\n for index, node_text in enumerate(root_node_texts):\n node_text = node_text.replace(\"expand_more\\n\", \"\")\n if item_name == node_text:\n root_node.nth(index).click()\n return True\n\n # \u0415\u0441\u043b\u0438 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u043d\u0435\u0442, \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u043e \u0438\u0449\u0435\u043c \u0434\u0430\u043b\u044c\u0448\u0435\n nodes_count = root_locator.locator('&gt;div.v-treeview-node').count()\n\n for index in range(nodes_count):\n node = root_locator.locator(f\"&gt;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('&gt;div.v-treeview-node__children').count()\n content = node.locator('&gt;div.v-treeview-node__children').inner_html()\n if children_count &gt; 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\"&gt;div:nth-child({index + 1})\").locator('&gt;div.v-treeview-node__children')\n is_found = find_and_click_item(page, child_nodes_locator, item_name)\n if is_found:\n return True\n\n # \u0437\u0430\u043a\u0440\u044b\u0432\u0430\u0435\u043c \u0443\u0437\u0435\u043b, \u0435\u0441\u043b\u0438 \u0432 \u043d\u0435\u043c \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u043d\u0430\u0448\u043b\u0438\n if is_expanded:\n toggle_button = node.locator(NavigationPanelLocators.TOGGLE_BUTTON)\n toggle_button.click()\n\n # \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0441 \u0437\u0430\u0434\u0430\u043d\u043d\u044b\u043c \u0438\u043c\u0435\u043d\u0435\u043c \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\n return False\n\n root_locator = self.get_locator(node_root_locator)\n found = find_and_click_item(self.page, root_locator, item_name)\n assert found, f\"Navigation panel item {item_name} is missing\"\n</code></pre>"},{"location":"components/navbar_component/#components.navbar_component.NavigationPanelComponent.get_item_names","title":"<code>get_item_names(locator)</code>","text":"<p>\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.</p> <p>Parameters:</p> Name Type Description Default <code>locator</code> <code>str | Locator</code> <p>\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.</p> required <p>Returns:</p> Type Description <code>list[str]</code> <p>\u0421\u043f\u0438\u0441\u043e\u043a \u0442\u0435\u043a\u0441\u0442\u043e\u0432 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432.</p> Source code in <code>components\\navbar_component.py</code> <pre><code>def get_item_names(self, locator: str | Locator) -&gt; 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</code></pre>"},{"location":"components/navbar_component/#components.navbar_component.NavigationPanelComponent.traverse_panel_tree","title":"<code>traverse_panel_tree(node_root_locator, level=0, debug=False)</code>","text":"<p>\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).</p> <p>Parameters:</p> Name Type Description Default <code>node_root_locator</code> <code>str | Locator</code> <p>\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).</p> required Source code in <code>components\\navbar_component.py</code> <pre><code>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('&gt;div.v-treeview-node').count()\n\n for index in range(nodes_count):\n node = root_locator.locator(f\"&gt;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('&gt;div.v-treeview-node__children').count()\n content = node.locator('&gt;div.v-treeview-node__children').inner_html()\n if children_count &gt; 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\"&gt;div:nth-child({index + 1})\").locator('&gt;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</code></pre>"},{"location":"components/table_component/","title":"TableComponent","text":"<p>\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.</p>"},{"location":"components/table_component/#components.table_component.TableComponent","title":"<code>TableComponent</code>","text":"<p> Bases: <code>BaseComponent</code></p> <p>\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.</p> Source code in <code>components\\table_component.py</code> <pre><code>class TableComponent(BaseComponent):\n \"\"\"\u041a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 \u0442\u0430\u0431\u043b\u0438\u0446\u044b. \u041f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u043c\u0435\u0442\u043e\u0434\u044b \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0442\u0430\u0431\u043b\u0438\u0447\u043d\u044b\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u043c\u0438.\"\"\"\n\n def __init__(self, page: Page):\n \"\"\"\u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 \u0442\u0430\u0431\u043b\u0438\u0446\u044b.\n\n Args:\n page: \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.\n \"\"\"\n\n super().__init__(page)\n\n # \u0414\u0435\u0439\u0441\u0442\u0432\u0438\u044f:\n def get_row_locator(self, table_locator: str | Locator, row_index: int) -&gt; Locator | None:\n \"\"\"\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043b\u043e\u043a\u0430\u0442\u043e\u0440 \u0441\u0442\u0440\u043e\u043a\u0438 \u043f\u043e \u0438\u043d\u0434\u0435\u043a\u0441\u0443.\n\n Args:\n table_locator: \u041b\u043e\u043a\u0430\u0442\u043e\u0440 \u0442\u0430\u0431\u043b\u0438\u0446\u044b.\n row_index: \u0418\u043d\u0434\u0435\u043a\u0441 \u0441\u0442\u0440\u043e\u043a\u0438.\n\n Returns:\n \u041b\u043e\u043a\u0430\u0442\u043e\u0440 \u0441\u0442\u0440\u043e\u043a\u0438 \u0438\u043b\u0438 None, \u0435\u0441\u043b\u0438 \u0438\u043d\u0434\u0435\u043a\u0441 \u0432\u043d\u0435 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0430.\n \"\"\"\n\n table = self.get_locator(table_locator)\n\n rows = table.locator(\"//tbody/tr\")\n\n if row_index in range(rows.count()):\n return rows.nth(row_index)\n else:\n return None\n\n def read(self, locator: str | Locator) -&gt; list[list[str]]:\n \"\"\"\u0427\u0438\u0442\u0430\u0435\u0442 \u0434\u0430\u043d\u043d\u044b\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u044b, \u0432\u043a\u043b\u044e\u0447\u0430\u044f \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0438.\n\n Args:\n locator: \u041b\u043e\u043a\u0430\u0442\u043e\u0440 \u0442\u0430\u0431\u043b\u0438\u0446\u044b.\n\n Returns:\n \u0414\u0432\u0443\u043c\u0435\u0440\u043d\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a \u0441 \u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u044b.\n \"\"\"\n\n table_data = []\n table = self.get_locator(locator)\n\n # \u0427\u0442\u0435\u043d\u0438\u0435 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430 \u0442\u0430\u0431\u043b\u0438\u0446\u044b\n header_cells = table.locator(\"//thead/tr\")\n header_cell_text = header_cells.nth(0).inner_text()\n header_data = header_cell_text.split('\\n')\n table_data.append(header_data)\n\n # \u0427\u0442\u0435\u043d\u0438\u0435 \u044f\u0447\u0435\u0435\u043a \u0442\u0430\u0431\u043b\u0438\u0446\u044b\n rows = table.locator(\"//tbody/tr\")\n for i in range(rows.count()):\n row = rows.nth(i)\n cells = row.locator(\"td\")\n row_data = []\n for j in range(cells.count()):\n cell_text = cells.nth(j).inner_text()\n row_data.append(cell_text)\n table_data.append(row_data)\n\n return table_data\n\n # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0438:\n def check_first_row_visibility(self, locator: str | Locator) -&gt; 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) -&gt; 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) -&gt; 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 =&gt; window.getComputedStyle(el).backgroundColor\")\n\n row.hover()\n self.page.wait_for_timeout(300)\n\n new_color = hover_element.evaluate(\"el =&gt; window.getComputedStyle(el).backgroundColor\")\n assert initial_color != new_color, \"Color of row did not change when hovering the cursor\"\n</code></pre>"},{"location":"components/table_component/#components.table_component.TableComponent.__init__","title":"<code>__init__(page)</code>","text":"<p>\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.</p> <p>Parameters:</p> Name Type Description Default <code>page</code> <code>Page</code> <p>\u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.</p> required Source code in <code>components\\table_component.py</code> <pre><code>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</code></pre>"},{"location":"components/table_component/#components.table_component.TableComponent.check_first_row_visibility","title":"<code>check_first_row_visibility(locator)</code>","text":"<p>\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.</p> <p>Parameters:</p> Name Type Description Default <code>locator</code> <code>str | Locator</code> <p>\u041b\u043e\u043a\u0430\u0442\u043e\u0440 \u0442\u0430\u0431\u043b\u0438\u0446\u044b.</p> required Source code in <code>components\\table_component.py</code> <pre><code>def check_first_row_visibility(self, locator: str | Locator) -&gt; 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</code></pre>"},{"location":"components/table_component/#components.table_component.TableComponent.check_last_row_visibility","title":"<code>check_last_row_visibility(locator)</code>","text":"<p>\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.</p> <p>Parameters:</p> Name Type Description Default <code>locator</code> <code>str | Locator</code> <p>\u041b\u043e\u043a\u0430\u0442\u043e\u0440 \u0442\u0430\u0431\u043b\u0438\u0446\u044b.</p> required Source code in <code>components\\table_component.py</code> <pre><code>def check_last_row_visibility(self, locator: str | Locator) -&gt; 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</code></pre>"},{"location":"components/table_component/#components.table_component.TableComponent.check_row_highlighting","title":"<code>check_row_highlighting(locator, row_index)</code>","text":"<p>\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.</p> <p>Parameters:</p> Name Type Description Default <code>locator</code> <code>str | Locator</code> <p>\u041b\u043e\u043a\u0430\u0442\u043e\u0440 \u0442\u0430\u0431\u043b\u0438\u0446\u044b.</p> required <code>row_index</code> <code>int</code> <p>\u0418\u043d\u0434\u0435\u043a\u0441 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438.</p> required Source code in <code>components\\table_component.py</code> <pre><code>def check_row_highlighting(self, locator: str | Locator, row_index: int) -&gt; 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 =&gt; window.getComputedStyle(el).backgroundColor\")\n\n row.hover()\n self.page.wait_for_timeout(300)\n\n new_color = hover_element.evaluate(\"el =&gt; window.getComputedStyle(el).backgroundColor\")\n assert initial_color != new_color, \"Color of row did not change when hovering the cursor\"\n</code></pre>"},{"location":"components/table_component/#components.table_component.TableComponent.get_row_locator","title":"<code>get_row_locator(table_locator, row_index)</code>","text":"<p>\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.</p> <p>Parameters:</p> Name Type Description Default <code>table_locator</code> <code>str | Locator</code> <p>\u041b\u043e\u043a\u0430\u0442\u043e\u0440 \u0442\u0430\u0431\u043b\u0438\u0446\u044b.</p> required <code>row_index</code> <code>int</code> <p>\u0418\u043d\u0434\u0435\u043a\u0441 \u0441\u0442\u0440\u043e\u043a\u0438.</p> required <p>Returns:</p> Type Description <code>Locator | None</code> <p>\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.</p> Source code in <code>components\\table_component.py</code> <pre><code>def get_row_locator(self, table_locator: str | Locator, row_index: int) -&gt; 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</code></pre>"},{"location":"components/table_component/#components.table_component.TableComponent.read","title":"<code>read(locator)</code>","text":"<p>\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.</p> <p>Parameters:</p> Name Type Description Default <code>locator</code> <code>str | Locator</code> <p>\u041b\u043e\u043a\u0430\u0442\u043e\u0440 \u0442\u0430\u0431\u043b\u0438\u0446\u044b.</p> required <p>Returns:</p> Type Description <code>list[list[str]]</code> <p>\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.</p> Source code in <code>components\\table_component.py</code> <pre><code>def read(self, locator: str | Locator) -&gt; 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</code></pre>"},{"location":"components/toolbar_component/","title":"ToolbarComponent","text":"<p>\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).</p> <p>\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</p>"},{"location":"components/toolbar_component/#components.toolbar_component.ToolbarComponent","title":"<code>ToolbarComponent</code>","text":"<p> Bases: <code>BaseComponent</code></p> <p>\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.</p> <p>Parameters:</p> Name Type Description Default <code>page</code> <code>Page</code> <p>\u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright</p> required <code>title</code> <code>str</code> <p>\u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a \u0442\u0443\u043b\u0431\u0430\u0440\u0430</p> required Source code in <code>components\\toolbar_component.py</code> <pre><code>class ToolbarComponent(BaseComponent):\n \"\"\"\u041a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 \u0442\u0443\u043b\u0431\u0430\u0440\u0430. \u041f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u043c\u0435\u0442\u043e\u0434\u044b \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u043f\u0430\u043d\u0435\u043b\u044c\u044e \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432.\n\n Args:\n page (Page): \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright\n title (str): \u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a \u0442\u0443\u043b\u0431\u0430\u0440\u0430\n \"\"\"\n\n def __init__(self, page: Page, title: str):\n \"\"\"\u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 \u0442\u0443\u043b\u0431\u0430\u0440\u0430 \u0441 \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u044b\u043c \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u043e\u043c.\"\"\"\n\n super().__init__(page)\n self.title = title\n self.buttons = []\n\n def add_title(self, title: str) -&gt; None:\n \"\"\"\u0423\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442 \u043d\u043e\u0432\u044b\u0439 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a \u0442\u0443\u043b\u0431\u0430\u0440\u0430.\n\n Args:\n title (str): \u041d\u043e\u0432\u044b\u0439 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a\n \"\"\"\n\n self.title = title\n\n def add_button(self, locator: Locator, name: str) -&gt; None:\n \"\"\"\u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u043a\u043d\u043e\u043f\u043a\u0443 \u0432 \u0442\u0443\u043b\u0431\u0430\u0440.\n\n Args:\n locator (Locator): \u041b\u043e\u043a\u0430\u0442\u043e\u0440 \u043a\u043d\u043e\u043f\u043a\u0438\n name (str): \u0423\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u0435 \u0438\u043c\u044f \u043a\u043d\u043e\u043f\u043a\u0438\n \"\"\"\n\n self.buttons.append(TooltipButton(self.page, locator, name))\n\n def get_button_by_name(self, name: str) -&gt; TooltipButton | None:\n \"\"\"\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043a\u043d\u043e\u043f\u043a\u0443 \u043f\u043e \u0438\u043c\u0435\u043d\u0438.\n\n Args:\n name (str): \u0418\u043c\u044f \u043a\u043d\u043e\u043f\u043a\u0438\n\n Returns:\n TooltipButton | None: \u041d\u0430\u0439\u0434\u0435\u043d\u043d\u0430\u044f \u043a\u043d\u043e\u043f\u043a\u0430 \u0438\u043b\u0438 None\n \"\"\"\n\n for button in self.buttons:\n if button.name == name:\n return button\n return None\n\n def click_button(self, name: str) -&gt; None:\n \"\"\"\u041a\u043b\u0438\u043a\u0430\u0435\u0442 \u043f\u043e \u043a\u043d\u043e\u043f\u043a\u0435 \u0442\u0443\u043b\u0431\u0430\u0440\u0430.\n\n Args:\n name (str): \u0418\u043c\u044f \u043a\u043d\u043e\u043f\u043a\u0438\n\n Raises:\n AssertionError: \u0415\u0441\u043b\u0438 \u043a\u043d\u043e\u043f\u043a\u0430 \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u0430\n \"\"\"\n\n button = self.get_button_by_name(name)\n if button is None:\n raise AssertionError(f\"Unsupported button name {name}\")\n button.click()\n\n def is_button_present(self, name: str) -&gt; bool:\n \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u043a\u043d\u043e\u043f\u043a\u0438.\n\n Args:\n name (str): \u0418\u043c\u044f \u043a\u043d\u043e\u043f\u043a\u0438\n\n Returns:\n bool: True \u0435\u0441\u043b\u0438 \u043a\u043d\u043e\u043f\u043a\u0430 \u043f\u0440\u0438\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442\n\n Raises:\n AssertionError: \u0415\u0441\u043b\u0438 \u0438\u043c\u044f \u043a\u043d\u043e\u043f\u043a\u0438 \u043d\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442\u0441\u044f\n \"\"\"\n\n button = self.get_button_by_name(name)\n if button is None:\n raise AssertionError(f\"Unsupported button name {name}\")\n return button.is_present(timeout=1000) # \u041e\u0436\u0438\u0434\u0430\u043d\u0438\u0435 1 \u0441\u0435\u043a\u0443\u043d\u0434\u0430\n\n def is_button_not_present(self, name: str) -&gt; bool:\n \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u0435 \u043a\u043d\u043e\u043f\u043a\u0438.\n\n Args:\n name (str): \u0418\u043c\u044f \u043a\u043d\u043e\u043f\u043a\u0438\n\n Returns:\n bool: True \u0435\u0441\u043b\u0438 \u043a\u043d\u043e\u043f\u043a\u0430 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442\n\n Raises:\n AssertionError: \u0415\u0441\u043b\u0438 \u0438\u043c\u044f \u043a\u043d\u043e\u043f\u043a\u0438 \u043d\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442\u0441\u044f\n \"\"\"\n\n button = self.get_button_by_name(name)\n if button is None:\n raise AssertionError(f\"Unsupported button name {name}\")\n return button.is_not_present(timeout=1000) # \u041e\u0436\u0438\u0434\u0430\u043d\u0438\u0435 1 \u0441\u0435\u043a\u0443\u043d\u0434\u0430\n\n def check_toolbar_presence(self, message: str) -&gt; None:\n \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u0442\u0443\u043b\u0431\u0430\u0440\u0430.\n\n Args:\n message (str): \u0421\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u043e\u0431 \u043e\u0448\u0438\u0431\u043a\u0435 \u0435\u0441\u043b\u0438 \u0442\u0443\u043b\u0431\u0430\u0440 \u043d\u0435 \u0432\u0438\u0434\u0435\u043d\n \"\"\"\n\n locator = self.get_locator(ToolbarLocators.TITLE).filter(has_text=self.title)\n expect(locator).to_be_visible(), message\n\n def check_button_presence(self, name: str) -&gt; None:\n \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0438 \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u043a\u043d\u043e\u043f\u043a\u0438 \u0441 \u043f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0439 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u043e\u0439 \u043a \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0443.\n\n Args:\n name (str): \u0418\u043c\u044f \u043a\u043d\u043e\u043f\u043a\u0438\n\n Raises:\n AssertionError: \u0415\u0441\u043b\u0438 \u043a\u043d\u043e\u043f\u043a\u0430 \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u0430 \u0438\u043b\u0438 \u043d\u0435 \u0432\u0438\u0434\u043d\u0430\n \"\"\"\n\n button = self.get_button_by_name(name)\n\n if button is None:\n raise AssertionError(f\"Unsupported button name {name}\")\n\n button.locator.scroll_into_view_if_needed()\n button.check_presence(f\"Button with name {name} is missing\")\n\n def check_button_tooltip(self, name: str, tooltip: str) -&gt; None:\n \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0442\u0435\u043a\u0441\u0442 \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0438 \u043a\u043d\u043e\u043f\u043a\u0438.\n\n Args:\n name (str): \u0418\u043c\u044f \u043a\u043d\u043e\u043f\u043a\u0438\n tooltip (str): \u041e\u0436\u0438\u0434\u0430\u0435\u043c\u044b\u0439 \u0442\u0435\u043a\u0441\u0442 \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0438\n\n Raises:\n AssertionError: \u0415\u0441\u043b\u0438 \u0442\u0435\u043a\u0441\u0442 \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0438 \u043d\u0435 \u0441\u043e\u0432\u043f\u0430\u0434\u0430\u0435\u0442\n \"\"\"\n\n button = self.get_button_by_name(name)\n if button is None:\n raise AssertionError(f\"Unsupported button name {name}\")\n button.check_tooltip_with_text(ToolbarLocators.TOOLTIP, tooltip)\n</code></pre>"},{"location":"components/toolbar_component/#components.toolbar_component.ToolbarComponent.__init__","title":"<code>__init__(page, title)</code>","text":"<p>\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.</p> Source code in <code>components\\toolbar_component.py</code> <pre><code>def __init__(self, page: Page, title: str):\n \"\"\"\u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 \u0442\u0443\u043b\u0431\u0430\u0440\u0430 \u0441 \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u044b\u043c \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u043e\u043c.\"\"\"\n\n super().__init__(page)\n self.title = title\n self.buttons = []\n</code></pre>"},{"location":"components/toolbar_component/#components.toolbar_component.ToolbarComponent.add_button","title":"<code>add_button(locator, name)</code>","text":"<p>\u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u043a\u043d\u043e\u043f\u043a\u0443 \u0432 \u0442\u0443\u043b\u0431\u0430\u0440.</p> <p>Parameters:</p> Name Type Description Default <code>locator</code> <code>Locator</code> <p>\u041b\u043e\u043a\u0430\u0442\u043e\u0440 \u043a\u043d\u043e\u043f\u043a\u0438</p> required <code>name</code> <code>str</code> <p>\u0423\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u0435 \u0438\u043c\u044f \u043a\u043d\u043e\u043f\u043a\u0438</p> required Source code in <code>components\\toolbar_component.py</code> <pre><code>def add_button(self, locator: Locator, name: str) -&gt; None:\n \"\"\"\u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u043a\u043d\u043e\u043f\u043a\u0443 \u0432 \u0442\u0443\u043b\u0431\u0430\u0440.\n\n Args:\n locator (Locator): \u041b\u043e\u043a\u0430\u0442\u043e\u0440 \u043a\u043d\u043e\u043f\u043a\u0438\n name (str): \u0423\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u0435 \u0438\u043c\u044f \u043a\u043d\u043e\u043f\u043a\u0438\n \"\"\"\n\n self.buttons.append(TooltipButton(self.page, locator, name))\n</code></pre>"},{"location":"components/toolbar_component/#components.toolbar_component.ToolbarComponent.add_title","title":"<code>add_title(title)</code>","text":"<p>\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.</p> <p>Parameters:</p> Name Type Description Default <code>title</code> <code>str</code> <p>\u041d\u043e\u0432\u044b\u0439 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a</p> required Source code in <code>components\\toolbar_component.py</code> <pre><code>def add_title(self, title: str) -&gt; None:\n \"\"\"\u0423\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442 \u043d\u043e\u0432\u044b\u0439 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a \u0442\u0443\u043b\u0431\u0430\u0440\u0430.\n\n Args:\n title (str): \u041d\u043e\u0432\u044b\u0439 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a\n \"\"\"\n\n self.title = title\n</code></pre>"},{"location":"components/toolbar_component/#components.toolbar_component.ToolbarComponent.check_button_presence","title":"<code>check_button_presence(name)</code>","text":"<p>\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.</p> <p>Parameters:</p> Name Type Description Default <code>name</code> <code>str</code> <p>\u0418\u043c\u044f \u043a\u043d\u043e\u043f\u043a\u0438</p> required <p>Raises:</p> Type Description <code>AssertionError</code> <p>\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</p> Source code in <code>components\\toolbar_component.py</code> <pre><code>def check_button_presence(self, name: str) -&gt; None:\n \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0438 \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u043a\u043d\u043e\u043f\u043a\u0438 \u0441 \u043f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0439 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u043e\u0439 \u043a \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0443.\n\n Args:\n name (str): \u0418\u043c\u044f \u043a\u043d\u043e\u043f\u043a\u0438\n\n Raises:\n AssertionError: \u0415\u0441\u043b\u0438 \u043a\u043d\u043e\u043f\u043a\u0430 \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u0430 \u0438\u043b\u0438 \u043d\u0435 \u0432\u0438\u0434\u043d\u0430\n \"\"\"\n\n button = self.get_button_by_name(name)\n\n if button is None:\n raise AssertionError(f\"Unsupported button name {name}\")\n\n button.locator.scroll_into_view_if_needed()\n button.check_presence(f\"Button with name {name} is missing\")\n</code></pre>"},{"location":"components/toolbar_component/#components.toolbar_component.ToolbarComponent.check_button_tooltip","title":"<code>check_button_tooltip(name, tooltip)</code>","text":"<p>\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.</p> <p>Parameters:</p> Name Type Description Default <code>name</code> <code>str</code> <p>\u0418\u043c\u044f \u043a\u043d\u043e\u043f\u043a\u0438</p> required <code>tooltip</code> <code>str</code> <p>\u041e\u0436\u0438\u0434\u0430\u0435\u043c\u044b\u0439 \u0442\u0435\u043a\u0441\u0442 \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0438</p> required <p>Raises:</p> Type Description <code>AssertionError</code> <p>\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</p> Source code in <code>components\\toolbar_component.py</code> <pre><code>def check_button_tooltip(self, name: str, tooltip: str) -&gt; None:\n \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0442\u0435\u043a\u0441\u0442 \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0438 \u043a\u043d\u043e\u043f\u043a\u0438.\n\n Args:\n name (str): \u0418\u043c\u044f \u043a\u043d\u043e\u043f\u043a\u0438\n tooltip (str): \u041e\u0436\u0438\u0434\u0430\u0435\u043c\u044b\u0439 \u0442\u0435\u043a\u0441\u0442 \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0438\n\n Raises:\n AssertionError: \u0415\u0441\u043b\u0438 \u0442\u0435\u043a\u0441\u0442 \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0438 \u043d\u0435 \u0441\u043e\u0432\u043f\u0430\u0434\u0430\u0435\u0442\n \"\"\"\n\n button = self.get_button_by_name(name)\n if button is None:\n raise AssertionError(f\"Unsupported button name {name}\")\n button.check_tooltip_with_text(ToolbarLocators.TOOLTIP, tooltip)\n</code></pre>"},{"location":"components/toolbar_component/#components.toolbar_component.ToolbarComponent.check_toolbar_presence","title":"<code>check_toolbar_presence(message)</code>","text":"<p>\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.</p> <p>Parameters:</p> Name Type Description Default <code>message</code> <code>str</code> <p>\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</p> required Source code in <code>components\\toolbar_component.py</code> <pre><code>def check_toolbar_presence(self, message: str) -&gt; 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</code></pre>"},{"location":"components/toolbar_component/#components.toolbar_component.ToolbarComponent.click_button","title":"<code>click_button(name)</code>","text":"<p>\u041a\u043b\u0438\u043a\u0430\u0435\u0442 \u043f\u043e \u043a\u043d\u043e\u043f\u043a\u0435 \u0442\u0443\u043b\u0431\u0430\u0440\u0430.</p> <p>Parameters:</p> Name Type Description Default <code>name</code> <code>str</code> <p>\u0418\u043c\u044f \u043a\u043d\u043e\u043f\u043a\u0438</p> required <p>Raises:</p> Type Description <code>AssertionError</code> <p>\u0415\u0441\u043b\u0438 \u043a\u043d\u043e\u043f\u043a\u0430 \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u0430</p> Source code in <code>components\\toolbar_component.py</code> <pre><code>def click_button(self, name: str) -&gt; None:\n \"\"\"\u041a\u043b\u0438\u043a\u0430\u0435\u0442 \u043f\u043e \u043a\u043d\u043e\u043f\u043a\u0435 \u0442\u0443\u043b\u0431\u0430\u0440\u0430.\n\n Args:\n name (str): \u0418\u043c\u044f \u043a\u043d\u043e\u043f\u043a\u0438\n\n Raises:\n AssertionError: \u0415\u0441\u043b\u0438 \u043a\u043d\u043e\u043f\u043a\u0430 \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u0430\n \"\"\"\n\n button = self.get_button_by_name(name)\n if button is None:\n raise AssertionError(f\"Unsupported button name {name}\")\n button.click()\n</code></pre>"},{"location":"components/toolbar_component/#components.toolbar_component.ToolbarComponent.get_button_by_name","title":"<code>get_button_by_name(name)</code>","text":"<p>\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043a\u043d\u043e\u043f\u043a\u0443 \u043f\u043e \u0438\u043c\u0435\u043d\u0438.</p> <p>Parameters:</p> Name Type Description Default <code>name</code> <code>str</code> <p>\u0418\u043c\u044f \u043a\u043d\u043e\u043f\u043a\u0438</p> required <p>Returns:</p> Type Description <code>TooltipButton | None</code> <p>TooltipButton | None: \u041d\u0430\u0439\u0434\u0435\u043d\u043d\u0430\u044f \u043a\u043d\u043e\u043f\u043a\u0430 \u0438\u043b\u0438 None</p> Source code in <code>components\\toolbar_component.py</code> <pre><code>def get_button_by_name(self, name: str) -&gt; TooltipButton | None:\n \"\"\"\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043a\u043d\u043e\u043f\u043a\u0443 \u043f\u043e \u0438\u043c\u0435\u043d\u0438.\n\n Args:\n name (str): \u0418\u043c\u044f \u043a\u043d\u043e\u043f\u043a\u0438\n\n Returns:\n TooltipButton | None: \u041d\u0430\u0439\u0434\u0435\u043d\u043d\u0430\u044f \u043a\u043d\u043e\u043f\u043a\u0430 \u0438\u043b\u0438 None\n \"\"\"\n\n for button in self.buttons:\n if button.name == name:\n return button\n return None\n</code></pre>"},{"location":"components/toolbar_component/#components.toolbar_component.ToolbarComponent.is_button_not_present","title":"<code>is_button_not_present(name)</code>","text":"<p>\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.</p> <p>Parameters:</p> Name Type Description Default <code>name</code> <code>str</code> <p>\u0418\u043c\u044f \u043a\u043d\u043e\u043f\u043a\u0438</p> required <p>Returns:</p> Name Type Description <code>bool</code> <code>bool</code> <p>True \u0435\u0441\u043b\u0438 \u043a\u043d\u043e\u043f\u043a\u0430 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442</p> <p>Raises:</p> Type Description <code>AssertionError</code> <p>\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</p> Source code in <code>components\\toolbar_component.py</code> <pre><code>def is_button_not_present(self, name: str) -&gt; bool:\n \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u0435 \u043a\u043d\u043e\u043f\u043a\u0438.\n\n Args:\n name (str): \u0418\u043c\u044f \u043a\u043d\u043e\u043f\u043a\u0438\n\n Returns:\n bool: True \u0435\u0441\u043b\u0438 \u043a\u043d\u043e\u043f\u043a\u0430 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442\n\n Raises:\n AssertionError: \u0415\u0441\u043b\u0438 \u0438\u043c\u044f \u043a\u043d\u043e\u043f\u043a\u0438 \u043d\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442\u0441\u044f\n \"\"\"\n\n button = self.get_button_by_name(name)\n if button is None:\n raise AssertionError(f\"Unsupported button name {name}\")\n return button.is_not_present(timeout=1000) # \u041e\u0436\u0438\u0434\u0430\u043d\u0438\u0435 1 \u0441\u0435\u043a\u0443\u043d\u0434\u0430\n</code></pre>"},{"location":"components/toolbar_component/#components.toolbar_component.ToolbarComponent.is_button_present","title":"<code>is_button_present(name)</code>","text":"<p>\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u043a\u043d\u043e\u043f\u043a\u0438.</p> <p>Parameters:</p> Name Type Description Default <code>name</code> <code>str</code> <p>\u0418\u043c\u044f \u043a\u043d\u043e\u043f\u043a\u0438</p> required <p>Returns:</p> Name Type Description <code>bool</code> <code>bool</code> <p>True \u0435\u0441\u043b\u0438 \u043a\u043d\u043e\u043f\u043a\u0430 \u043f\u0440\u0438\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442</p> <p>Raises:</p> Type Description <code>AssertionError</code> <p>\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</p> Source code in <code>components\\toolbar_component.py</code> <pre><code>def is_button_present(self, name: str) -&gt; bool:\n \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u043a\u043d\u043e\u043f\u043a\u0438.\n\n Args:\n name (str): \u0418\u043c\u044f \u043a\u043d\u043e\u043f\u043a\u0438\n\n Returns:\n bool: True \u0435\u0441\u043b\u0438 \u043a\u043d\u043e\u043f\u043a\u0430 \u043f\u0440\u0438\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442\n\n Raises:\n AssertionError: \u0415\u0441\u043b\u0438 \u0438\u043c\u044f \u043a\u043d\u043e\u043f\u043a\u0438 \u043d\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442\u0441\u044f\n \"\"\"\n\n button = self.get_button_by_name(name)\n if button is None:\n raise AssertionError(f\"Unsupported button name {name}\")\n return button.is_present(timeout=1000) # \u041e\u0436\u0438\u0434\u0430\u043d\u0438\u0435 1 \u0441\u0435\u043a\u0443\u043d\u0434\u0430\n</code></pre>"},{"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":"<p>\u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 Docstring</p>"},{"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":"<ol> <li> <p>\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.</p> </li> <li> <p>\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.</p> </li> <li> <p>\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.</p> </li> <li> <p>\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c docstring \u043f\u0435\u0440\u0435\u0434 \u0438\u043c\u043f\u043e\u0440\u0442\u0430\u043c\u0438.</p> </li> <li> <p>\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.</p> </li> <li> <p>\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.</p> </li> <li> <p>\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).</p> </li> <li> <p>\u041d\u0435 \u0443\u0434\u0430\u043b\u044f\u0442\u044c \u043f\u0443\u0441\u0442\u044b\u0435 \u0441\u0442\u0440\u043e\u043a\u0438.</p> </li> <li> <p>\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.</p> </li> </ol>"},{"location":"config/add_docstring/#docstring-deepseek","title":"\u041f\u0440\u0438\u043c\u0435\u0440 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f Docstring \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0418\u0418 \"DeepSeek\":","text":"<ul> <li>\u0417\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c: DeepSeek \u0444\u0430\u0439\u043b \u043f\u0440\u043e\u0435\u043a\u0442\u0430 my_name.py \u0438 docs/config/add_docstring.md.</li> <li>\u0417\u0430\u043f\u0440\u043e\u0441\u0438\u0442\u044c: \u0418\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u0441\u0442\u0440\u043e\u0433\u043e \u0441\u043e\u0431\u043b\u044e\u0434\u0430\u044f \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u044f,\u0432\u044b\u0432\u0435\u0441\u0442\u0438 \u043f\u043e\u043b\u043d\u044b\u0439 \u0438\u0437\u043c\u0435\u043d\u0451\u043d\u043d\u044b\u0439 \u043a\u043e\u0434 \u0438 \u043e\u0442\u0447\u0435\u0442 \u043e \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0438 \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u0439.</li> <li>\u041f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435\u043c \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439 \u0441\u0434\u0435\u043b\u0430\u043d\u043d\u044b\u043c\u0438 \u0432 \u043a\u043e\u0434\u0435 \u0418\u0418 \"DeepSeek\" \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e notepad++.</li> </ul>"},{"location":"config/code_development_process/","title":"\u041f\u0440\u043e\u0446\u0435\u0441\u0441 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u043a\u043e\u0434\u0430","text":"<p>\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</p>"},{"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":"<pre><code>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</code></pre>"},{"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":"<p>powershell pip install mkdocs mkdocs-material mkdocstrings mkdocstrings-python</p>"},{"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":"<p>powershell mkdocs new .</p>"},{"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":"<pre><code>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</code></pre>"},{"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":"<pre><code>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</code></pre>"},{"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":"<p>docs/components/alert_component.md:</p> <pre><code>markdown\n# AlertComponent\n\n::: components.alert_component:AlertComponent\n handler: python\n options:\n show_source: true\n heading_level: 2\n</code></pre>"},{"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":"<p>bash</p> <p>mkdocs serve</p>"},{"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":"<p>bash</p> <p>rmdir /s /q site # \u041e\u0447\u0438\u0441\u0442\u043a\u0430 \u043a\u044d\u0448\u0430</p> <p>mkdocs build # \u041f\u0435\u0440\u0435\u0441\u0431\u043e\u0440\u043a\u0430</p>"},{"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":"<p>\u041e\u0448\u0438\u0431\u043a\u0438 \u0438\u043c\u043f\u043e\u0440\u0442\u0430:</p> <ul> <li> <p>\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.</p> </li> <li> <p>\u041f\u0440\u043e\u0432\u0435\u0440\u044c\u0442\u0435 \u043f\u0443\u0442\u0438 \u0432 mkdocs.yml.</p> </li> </ul> <p>\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:</p> <p>\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.</p>"},{"location":"config/mkdocs_guide/#6","title":"6 \u0417\u0430\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435","text":"<p>\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:</p> <ul> <li> <p>\u0412\u043d\u0435\u0441\u0438\u0442\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0432 docstrings Python-\u043a\u043e\u0434\u0430.</p> </li> <li> <p>\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.</p> </li> <li> <p>\u041f\u0435\u0440\u0435\u0441\u043e\u0431\u0435\u0440\u0438\u0442\u0435 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044e.</p> </li> </ul>"},{"location":"data/constants/","title":"Constants","text":"<p>\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.</p> <p>\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.</p>"},{"location":"data/constants/#data.constants.Constants","title":"<code>Constants</code>","text":"<p>\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.</p> <p>\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.</p> \u0410\u0442\u0440\u0438\u0431\u0443\u0442\u044b <p>login (str): \u041b\u043e\u0433\u0438\u043d \u0434\u043b\u044f \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438. password (str): \u041f\u0430\u0440\u043e\u043b\u044c \u0434\u043b\u044f \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438.</p> Source code in <code>data\\constants.py</code> <pre><code>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</code></pre>"},{"location":"data/environment/","title":"Environment","text":"<p>\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.</p> <p>\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.</p>"},{"location":"data/environment/#data.environment.Environment","title":"<code>Environment</code>","text":"<p>\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.</p> \u0410\u0442\u0440\u0438\u0431\u0443\u0442\u044b \u043a\u043b\u0430\u0441\u0441\u0430 <p>TEST (str): \u041a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u0430 \u0434\u043b\u044f \u0442\u0435\u0441\u0442\u043e\u0432\u043e\u0433\u043e \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f. DEVELOP (str): \u041a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u0430 \u0434\u043b\u044f dev-\u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f. URLS (Dict[str, str]): \u0421\u043b\u043e\u0432\u0430\u0440\u044c URL \u0434\u043b\u044f \u0440\u0430\u0437\u043d\u044b\u0445 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0439.</p> Source code in <code>data\\environment.py</code> <pre><code>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) -&gt; 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.access_token: str = \"\"\n self.token: str = \"\"\n except KeyError:\n self.env: str = self.TEST\n\n def get_base_url(self) -&gt; 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) -&gt; 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) -&gt; 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_access_token(self, token: str) -&gt; None:\n \"\"\"\u0423\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442 \u0442\u043e\u043a\u0435\u043d \u0434\u043e\u0441\u0442\u0443\u043f\u0430.\n\n \u0410\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u044b:\n token (str): \u0422\u043e\u043a\u0435\u043d \u0434\u043b\u044f \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438.\n \"\"\"\n\n self.token = token\n\n def get_access_token(self) -&gt; 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.token\n</code></pre>"},{"location":"data/environment/#data.environment.Environment.__init__","title":"<code>__init__()</code>","text":"<p>\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.</p> Source code in <code>data\\environment.py</code> <pre><code>def __init__(self) -&gt; 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.access_token: str = \"\"\n self.token: str = \"\"\n except KeyError:\n self.env: str = self.TEST\n</code></pre>"},{"location":"data/environment/#data.environment.Environment.get_access_token","title":"<code>get_access_token()</code>","text":"<p>\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.</p> \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 <p>str: \u0422\u0435\u043a\u0443\u0449\u0438\u0439 \u0442\u043e\u043a\u0435\u043d \u0434\u043e\u0441\u0442\u0443\u043f\u0430.</p> Source code in <code>data\\environment.py</code> <pre><code>def get_access_token(self) -&gt; 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.token\n</code></pre>"},{"location":"data/environment/#data.environment.Environment.get_base_url","title":"<code>get_base_url()</code>","text":"<p>\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.</p> \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 <p>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.</p> Source code in <code>data\\environment.py</code> <pre><code>def get_base_url(self) -&gt; 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</code></pre>"},{"location":"data/environment/#data.environment.Environment.get_env_name","title":"<code>get_env_name()</code>","text":"<p>\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.</p> \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 <p>str: \u0438\u043c\u044f \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f.</p> Source code in <code>data\\environment.py</code> <pre><code>def get_env_name(self) -&gt; 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</code></pre>"},{"location":"data/environment/#data.environment.Environment.get_request_url","title":"<code>get_request_url()</code>","text":"<p>\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 URL \u0434\u043b\u044f API-\u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432.</p> \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 <p>str: URL \u0434\u043b\u044f API-\u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432.</p> Source code in <code>data\\environment.py</code> <pre><code>def get_request_url(self) -&gt; 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</code></pre>"},{"location":"data/environment/#data.environment.Environment.set_access_token","title":"<code>set_access_token(token)</code>","text":"<p>\u0423\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442 \u0442\u043e\u043a\u0435\u043d \u0434\u043e\u0441\u0442\u0443\u043f\u0430.</p> \u0410\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u044b <p>token (str): \u0422\u043e\u043a\u0435\u043d \u0434\u043b\u044f \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438.</p> Source code in <code>data\\environment.py</code> <pre><code>def set_access_token(self, token: str) -&gt; None:\n \"\"\"\u0423\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442 \u0442\u043e\u043a\u0435\u043d \u0434\u043e\u0441\u0442\u0443\u043f\u0430.\n\n \u0410\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u044b:\n token (str): \u0422\u043e\u043a\u0435\u043d \u0434\u043b\u044f \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438.\n \"\"\"\n\n self.token = token\n</code></pre>"},{"location":"data/roles_dict/","title":"Roles_dict","text":"<p>\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.</p> <p>\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.</p>"},{"location":"elements/base_element/","title":"BaseElement","text":"<p>\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.</p> <p>\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.</p>"},{"location":"elements/base_element/#elements.base_element.BaseElement","title":"<code>BaseElement</code>","text":"<p>\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.</p> <p>\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.</p> Source code in <code>elements\\base_element.py</code> <pre><code>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) -&gt; 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) -&gt; 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) -&gt; 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) -&gt; 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 wait_for_element(self, timeout: int = 12000) -&gt; 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) -&gt; 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_presence(self, msg: str) -&gt; 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) -&gt; 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) -&gt; 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</code></pre>"},{"location":"elements/base_element/#elements.base_element.BaseElement.type_of","title":"<code>type_of</code> <code>property</code>","text":"<p>\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).</p>"},{"location":"elements/base_element/#elements.base_element.BaseElement.__init__","title":"<code>__init__(page, locator, name)</code>","text":"<p>\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.</p> <p>Parameters:</p> Name Type Description Default <code>page</code> <code>Page</code> <p>\u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright</p> required <code>locator</code> <code>str | Locator</code> <p>\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)</p> required <code>name</code> <code>str</code> <p>\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</p> required Source code in <code>elements\\base_element.py</code> <pre><code>def __init__(self, page: Page, locator: str | Locator, name: str) -&gt; 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</code></pre>"},{"location":"elements/base_element/#elements.base_element.BaseElement.check_have_text","title":"<code>check_have_text(text, msg)</code>","text":"<p>\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.</p> Source code in <code>elements\\base_element.py</code> <pre><code>def check_have_text(self, text: str, msg: str) -&gt; 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</code></pre>"},{"location":"elements/base_element/#elements.base_element.BaseElement.check_presence","title":"<code>check_presence(msg)</code>","text":"<p>\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.</p> Source code in <code>elements\\base_element.py</code> <pre><code>def check_presence(self, msg: str) -&gt; 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</code></pre>"},{"location":"elements/base_element/#elements.base_element.BaseElement.click","title":"<code>click()</code>","text":"<p>\u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u043a\u043b\u0438\u043a \u043f\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0443.</p> Source code in <code>elements\\base_element.py</code> <pre><code>def click(self) -&gt; 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</code></pre>"},{"location":"elements/base_element/#elements.base_element.BaseElement.get_text","title":"<code>get_text(index)</code>","text":"<p>\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.</p> Source code in <code>elements\\base_element.py</code> <pre><code>def get_text(self, index: int) -&gt; 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</code></pre>"},{"location":"elements/base_element/#elements.base_element.BaseElement.is_not_present","title":"<code>is_not_present(timeout=5000)</code>","text":"<p>\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.</p> Source code in <code>elements\\base_element.py</code> <pre><code>def is_not_present(self, timeout: int = 5000) -&gt; 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</code></pre>"},{"location":"elements/base_element/#elements.base_element.BaseElement.is_present","title":"<code>is_present(timeout=5000)</code>","text":"<p>\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.</p> Source code in <code>elements\\base_element.py</code> <pre><code>def is_present(self, timeout: int = 5000) -&gt; 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</code></pre>"},{"location":"elements/base_element/#elements.base_element.BaseElement.wait_for_element","title":"<code>wait_for_element(timeout=12000)</code>","text":"<p>\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.</p> Source code in <code>elements\\base_element.py</code> <pre><code>def wait_for_element(self, timeout: int = 12000) -&gt; 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</code></pre>"},{"location":"elements/button_element/","title":"Button","text":"<p>\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.</p> <p>\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'.</p>"},{"location":"elements/button_element/#elements.button_element.Button","title":"<code>Button</code>","text":"<p> Bases: <code>BaseElement</code></p> <p>\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.</p> <p>\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.</p> Source code in <code>elements\\button_element.py</code> <pre><code>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) -&gt; 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</code></pre>"},{"location":"elements/button_element/#elements.button_element.Button.type_of","title":"<code>type_of</code> <code>property</code>","text":"<p>\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').</p> <p>Returns:</p> Name Type Description <code>str</code> <code>str</code> <p>\u0422\u0438\u043f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 - '\u043a\u043d\u043e\u043f\u043a\u0430'.</p>"},{"location":"elements/checkbox_element/","title":"Checkbox","text":"<p>\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.</p> <p>\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'.</p>"},{"location":"elements/checkbox_element/#elements.checkbox_element.Checkbox","title":"<code>Checkbox</code>","text":"<p> Bases: <code>BaseElement</code></p> <p>\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.</p> <p>\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.</p> Source code in <code>elements\\checkbox_element.py</code> <pre><code>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) -&gt; 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) -&gt; 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 self.locator.check()\n\n def uncheck(self) -&gt; 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 self.locator.uncheck()\n\n # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0438:\n def is_checked(self) -&gt; 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</code></pre>"},{"location":"elements/checkbox_element/#elements.checkbox_element.Checkbox.type_of","title":"<code>type_of</code> <code>property</code>","text":"<p>\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').</p> <p>Returns:</p> Name Type Description <code>str</code> <code>str</code> <p>\u0422\u0438\u043f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 - '\u0447\u0435\u043a\u0431\u043e\u043a\u0441'.</p>"},{"location":"elements/checkbox_element/#elements.checkbox_element.Checkbox.check","title":"<code>check()</code>","text":"<p>\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).</p> Source code in <code>elements\\checkbox_element.py</code> <pre><code>def check(self) -&gt; 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 self.locator.check()\n</code></pre>"},{"location":"elements/checkbox_element/#elements.checkbox_element.Checkbox.is_checked","title":"<code>is_checked()</code>","text":"<p>\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.</p> <p>Returns:</p> Name Type Description <code>bool</code> <code>bool</code> <p>True \u0435\u0441\u043b\u0438 \u043e\u0442\u043c\u0435\u0447\u0435\u043d, False \u0435\u0441\u043b\u0438 \u043d\u0435\u0442.</p> Source code in <code>elements\\checkbox_element.py</code> <pre><code>def is_checked(self) -&gt; 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</code></pre>"},{"location":"elements/checkbox_element/#elements.checkbox_element.Checkbox.uncheck","title":"<code>uncheck()</code>","text":"<p>\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).</p> Source code in <code>elements\\checkbox_element.py</code> <pre><code>def uncheck(self) -&gt; 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 self.locator.uncheck()\n</code></pre>"},{"location":"elements/dropdown_list_element/","title":"DropdownList","text":"<p>\u041c\u043e\u0434\u0443\u043b\u044c dropdown_list_element \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.</p> <p>\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 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 \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.</p>"},{"location":"elements/dropdown_list_element/#elements.dropdown_list_element.DropdownList","title":"<code>DropdownList</code>","text":"<p> Bases: <code>BaseElement</code></p> <p>\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.</p> <p>\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.</p> Source code in <code>elements\\dropdown_list_element.py</code> <pre><code>class DropdownList(BaseElement):\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 @property\n def type_of(self) -&gt; str:\n \"\"\"\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0442\u0438\u043f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 ('\u0432\u044b\u043f\u0430\u0434\u0430\u044e\u0449\u0438\u0439 \u0441\u043f\u0438\u0441\u043e\u043a').\n\n Returns:\n str: \u0422\u0438\u043f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 - '\u0432\u044b\u043f\u0430\u0434\u0430\u044e\u0449\u0438\u0439 \u0441\u043f\u0438\u0441\u043e\u043a'.\n \"\"\"\n\n return \"dropdown list\"\n\n # \u0414\u0435\u0439\u0441\u0442\u0432\u0438\u044f:\n def click_item_with_text(self, text: str) -&gt; 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 logger.info(f'Selecting item with text \"{text}\" from dropdown \"{self.name}\"')\n self.page.get_by_role(\"listitem\").filter(has_text=text).click()\n\n # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0438:\n def check_item_with_text(self, text: str) -&gt; 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 logger.info(f'Checking item with text \"{text}\" in dropdown \"{self.name}\"')\n enabled = self.page.get_by_role(\"listitem\").filter(has_text=text).is_enabled()\n if not enabled:\n assert False, f\"Dropdown list item '{text}' is missing or disabled\"\n</code></pre>"},{"location":"elements/dropdown_list_element/#elements.dropdown_list_element.DropdownList.type_of","title":"<code>type_of</code> <code>property</code>","text":"<p>\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0442\u0438\u043f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 ('\u0432\u044b\u043f\u0430\u0434\u0430\u044e\u0449\u0438\u0439 \u0441\u043f\u0438\u0441\u043e\u043a').</p> <p>Returns:</p> Name Type Description <code>str</code> <code>str</code> <p>\u0422\u0438\u043f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 - '\u0432\u044b\u043f\u0430\u0434\u0430\u044e\u0449\u0438\u0439 \u0441\u043f\u0438\u0441\u043e\u043a'.</p>"},{"location":"elements/dropdown_list_element/#elements.dropdown_list_element.DropdownList.check_item_with_text","title":"<code>check_item_with_text(text)</code>","text":"<p>\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.</p> <p>Parameters:</p> Name Type Description Default <code>text</code> <code>str</code> <p>\u0422\u0435\u043a\u0441\u0442 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0434\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438.</p> required <p>Raises:</p> Type Description <code>AssertionError</code> <p>\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.</p> Source code in <code>elements\\dropdown_list_element.py</code> <pre><code>def check_item_with_text(self, text: str) -&gt; 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 logger.info(f'Checking item with text \"{text}\" in dropdown \"{self.name}\"')\n enabled = self.page.get_by_role(\"listitem\").filter(has_text=text).is_enabled()\n if not enabled:\n assert False, f\"Dropdown list item '{text}' is missing or disabled\"\n</code></pre>"},{"location":"elements/dropdown_list_element/#elements.dropdown_list_element.DropdownList.click_item_with_text","title":"<code>click_item_with_text(text)</code>","text":"<p>\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.</p> <p>Parameters:</p> Name Type Description Default <code>text</code> <code>str</code> <p>\u0422\u0435\u043a\u0441\u0442 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0434\u043b\u044f \u0432\u044b\u0431\u043e\u0440\u0430.</p> required Source code in <code>elements\\dropdown_list_element.py</code> <pre><code>def click_item_with_text(self, text: str) -&gt; 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 logger.info(f'Selecting item with text \"{text}\" from dropdown \"{self.name}\"')\n self.page.get_by_role(\"listitem\").filter(has_text=text).click()\n</code></pre>"},{"location":"elements/text_element/","title":"Text","text":"<p>\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.</p> <p>\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.</p>"},{"location":"elements/text_element/#elements.text_element.Text","title":"<code>Text</code>","text":"<p> Bases: <code>BaseElement</code></p> <p>\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.</p> <p>\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.</p> Source code in <code>elements\\text_element.py</code> <pre><code>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) -&gt; 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</code></pre>"},{"location":"elements/text_element/#elements.text_element.Text.type_of","title":"<code>type_of</code> <code>property</code>","text":"<p>\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').</p> <p>Returns:</p> Name Type Description <code>str</code> <code>str</code> <p>\u0422\u0438\u043f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 - '\u0442\u0435\u043a\u0441\u0442'.</p>"},{"location":"elements/text_input_element/","title":"TextInput","text":"<p>\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.</p> <p>\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.</p>"},{"location":"elements/text_input_element/#elements.text_input_element.TextInput","title":"<code>TextInput</code>","text":"<p> Bases: <code>BaseElement</code></p> <p>\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.</p> <p>\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.</p> Source code in <code>elements\\text_input_element.py</code> <pre><code>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) -&gt; 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) -&gt; 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 input_value(self, value: str) -&gt; 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) -&gt; 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) -&gt; 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</code></pre>"},{"location":"elements/text_input_element/#elements.text_input_element.TextInput.type_of","title":"<code>type_of</code> <code>property</code>","text":"<p>\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').</p> <p>Returns:</p> Name Type Description <code>str</code> <code>str</code> <p>\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'.</p>"},{"location":"elements/text_input_element/#elements.text_input_element.TextInput.check_empty_input","title":"<code>check_empty_input(msg)</code>","text":"<p>\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.</p> <p>Parameters:</p> Name Type Description Default <code>msg</code> <code>str</code> <p>\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.</p> required <p>Raises:</p> Type Description <code>AssertionError</code> <p>\u0415\u0441\u043b\u0438 \u043f\u043e\u043b\u0435 \u043d\u0435 \u043f\u0443\u0441\u0442\u043e\u0435.</p> Source code in <code>elements\\text_input_element.py</code> <pre><code>def check_empty_input(self, msg: str) -&gt; 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</code></pre>"},{"location":"elements/text_input_element/#elements.text_input_element.TextInput.clear","title":"<code>clear()</code>","text":"<p>\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.</p> Source code in <code>elements\\text_input_element.py</code> <pre><code>def clear(self) -&gt; 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</code></pre>"},{"location":"elements/text_input_element/#elements.text_input_element.TextInput.get_input_value","title":"<code>get_input_value()</code>","text":"<p>\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.</p> <p>Returns:</p> Name Type Description <code>str</code> <code>str</code> <p>\u0422\u0435\u043a\u0443\u0449\u0435\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0432 \u043f\u043e\u043b\u0435.</p> Source code in <code>elements\\text_input_element.py</code> <pre><code>def get_input_value(self) -&gt; 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</code></pre>"},{"location":"elements/text_input_element/#elements.text_input_element.TextInput.input_value","title":"<code>input_value(value)</code>","text":"<p>\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.</p> <p>Parameters:</p> Name Type Description Default <code>value</code> <code>str</code> <p>\u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0434\u043b\u044f \u0432\u0432\u043e\u0434\u0430.</p> required Source code in <code>elements\\text_input_element.py</code> <pre><code>def input_value(self, value: str) -&gt; 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</code></pre>"},{"location":"elements/tooltip_button_element/","title":"TooltipButton","text":"<p>\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.</p> <p>\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.</p>"},{"location":"elements/tooltip_button_element/#elements.tooltip_button_element.TooltipButton","title":"<code>TooltipButton</code>","text":"<p> Bases: <code>BaseElement</code></p> <p>\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.</p> <p>\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.</p> Source code in <code>elements\\tooltip_button_element.py</code> <pre><code>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) -&gt; 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 def check_tooltip_with_text(self, tooltip_locator: str, expected_text: str) -&gt; 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 tooltip_locator (str): \u041b\u043e\u043a\u0430\u0442\u043e\u0440 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0438.\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(tooltip_locator)\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\n def scroll_into_view(self) -&gt; None:\n \"\"\"\u041f\u0440\u043e\u043a\u0440\u0443\u0447\u0438\u0432\u0430\u0435\u0442 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0443/\u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440 \u043a \u043a\u043d\u043e\u043f\u043a\u0435, \u0447\u0442\u043e\u0431\u044b \u043e\u043d\u0430 \u0441\u0442\u0430\u043b\u0430 \u0432\u0438\u0434\u0438\u043c\u043e\u0439.\"\"\"\n\n self.locator.scroll_into_view_if_needed()\n logger.debug(f\"Scrolled to tooltip button '{self.name}'\")\n</code></pre>"},{"location":"elements/tooltip_button_element/#elements.tooltip_button_element.TooltipButton.type_of","title":"<code>type_of</code> <code>property</code>","text":"<p>\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0442\u0438\u043f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 ('tooltip_button').</p> <p>Returns:</p> Name Type Description <code>str</code> <code>str</code> <p>\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.</p>"},{"location":"elements/tooltip_button_element/#elements.tooltip_button_element.TooltipButton.check_tooltip_with_text","title":"<code>check_tooltip_with_text(tooltip_locator, expected_text)</code>","text":"<p>\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.</p> <p>Parameters:</p> Name Type Description Default <code>tooltip_locator</code> <code>str</code> <p>\u041b\u043e\u043a\u0430\u0442\u043e\u0440 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0438.</p> required <code>expected_text</code> <code>str</code> <p>\u041e\u0436\u0438\u0434\u0430\u0435\u043c\u044b\u0439 \u0442\u0435\u043a\u0441\u0442 \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0438.</p> required <p>Raises:</p> Type Description <code>AssertionError</code> <p>\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.</p> Source code in <code>elements\\tooltip_button_element.py</code> <pre><code>def check_tooltip_with_text(self, tooltip_locator: str, expected_text: str) -&gt; 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 tooltip_locator (str): \u041b\u043e\u043a\u0430\u0442\u043e\u0440 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0438.\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(tooltip_locator)\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</code></pre>"},{"location":"elements/tooltip_button_element/#elements.tooltip_button_element.TooltipButton.scroll_into_view","title":"<code>scroll_into_view()</code>","text":"<p>\u041f\u0440\u043e\u043a\u0440\u0443\u0447\u0438\u0432\u0430\u0435\u0442 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0443/\u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440 \u043a \u043a\u043d\u043e\u043f\u043a\u0435, \u0447\u0442\u043e\u0431\u044b \u043e\u043d\u0430 \u0441\u0442\u0430\u043b\u0430 \u0432\u0438\u0434\u0438\u043c\u043e\u0439.</p> Source code in <code>elements\\tooltip_button_element.py</code> <pre><code>def scroll_into_view(self) -&gt; None:\n \"\"\"\u041f\u0440\u043e\u043a\u0440\u0443\u0447\u0438\u0432\u0430\u0435\u0442 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0443/\u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440 \u043a \u043a\u043d\u043e\u043f\u043a\u0435, \u0447\u0442\u043e\u0431\u044b \u043e\u043d\u0430 \u0441\u0442\u0430\u043b\u0430 \u0432\u0438\u0434\u0438\u043c\u043e\u0439.\"\"\"\n\n self.locator.scroll_into_view_if_needed()\n logger.debug(f\"Scrolled to tooltip button '{self.name}'\")\n</code></pre>"},{"location":"fixtures/pages/","title":"Browser Fixtures","text":"<p>\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.</p> <p>\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.</p>"},{"location":"fixtures/pages/#fixtures.pages.browser","title":"<code>browser(request)</code>","text":"<p>\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.</p> <p>Parameters:</p> Name Type Description Default <code>request</code> <code>FixtureRequest</code> <p>\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.</p> required <p>Returns:</p> Name Type Description <code>Page</code> <code>Page</code> <p>\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.</p> <p>Yields:</p> Name Type Description <code>Page</code> <code>Page</code> <p>\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.</p> Note <p>\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.</p> Source code in <code>fixtures\\pages.py</code> <pre><code>@pytest.fixture(scope='class')\ndef browser(request: FixtureRequest) -&gt; 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</code></pre>"},{"location":"fixtures/pages/#fixtures.pages.get_chrome_browser","title":"<code>get_chrome_browser(playwright, request)</code>","text":"<p>\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.</p> <p>Parameters:</p> Name Type Description Default <code>playwright</code> <code>Playwright</code> <p>\u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 Playwright.</p> required <code>request</code> <code>FixtureRequest</code> <p>\u041e\u0431\u044a\u0435\u043a\u0442 \u0437\u0430\u043f\u0440\u043e\u0441\u0430 pytest.</p> required <p>Returns:</p> Name Type Description <code>Browser</code> <code>Browser</code> <p>\u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 Chrome.</p> Source code in <code>fixtures\\pages.py</code> <pre><code>def get_chrome_browser(playwright: Playwright, request: FixtureRequest) -&gt; 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</code></pre>"},{"location":"fixtures/pages/#fixtures.pages.get_context","title":"<code>get_context(browser, request, start)</code>","text":"<p>\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.</p> <p>Parameters:</p> Name Type Description Default <code>browser</code> <code>Browser</code> <p>\u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0430.</p> required <code>request</code> <code>FixtureRequest</code> <p>\u041e\u0431\u044a\u0435\u043a\u0442 \u0437\u0430\u043f\u0440\u043e\u0441\u0430 pytest.</p> required <code>start</code> <code>str</code> <p>\u0422\u0438\u043f \u0437\u0430\u043f\u0443\u0441\u043a\u0430 ('local' \u0438\u043b\u0438 'remote').</p> required <p>Returns:</p> Name Type Description <code>BrowserContext</code> <code>BrowserContext</code> <p>\u041d\u0430\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0439 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442.</p> Source code in <code>fixtures\\pages.py</code> <pre><code>def get_context(browser: Browser, request: FixtureRequest, start: str) -&gt; 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</code></pre>"},{"location":"fixtures/pages/#fixtures.pages.get_firefox_browser","title":"<code>get_firefox_browser(playwright, request)</code>","text":"<p>\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.</p> <p>Parameters:</p> Name Type Description Default <code>playwright</code> <code>Playwright</code> <p>\u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 Playwright.</p> required <code>request</code> <code>FixtureRequest</code> <p>\u041e\u0431\u044a\u0435\u043a\u0442 \u0437\u0430\u043f\u0440\u043e\u0441\u0430 pytest.</p> required <p>Returns:</p> Name Type Description <code>Browser</code> <code>Browser</code> <p>\u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 Firefox.</p> Source code in <code>fixtures\\pages.py</code> <pre><code>def get_firefox_browser(playwright: Playwright, request: FixtureRequest) -&gt; 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</code></pre>"},{"location":"fixtures/pages/#fixtures.pages.get_remote_chrome","title":"<code>get_remote_chrome(playwright, request)</code>","text":"<p>\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.</p> <p>Parameters:</p> Name Type Description Default <code>playwright</code> <code>Playwright</code> <p>\u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 Playwright.</p> required <code>request</code> <code>FixtureRequest</code> <p>\u041e\u0431\u044a\u0435\u043a\u0442 \u0437\u0430\u043f\u0440\u043e\u0441\u0430 pytest.</p> required <p>Returns:</p> Name Type Description <code>Browser</code> <code>Browser</code> <p>\u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 Chrome \u0432 headless \u0440\u0435\u0436\u0438\u043c\u0435.</p> Source code in <code>fixtures\\pages.py</code> <pre><code>def get_remote_chrome(playwright: Playwright, request: FixtureRequest) -&gt; 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</code></pre>"},{"location":"fixtures/pages/#fixtures.pages.pytest_addoption","title":"<code>pytest_addoption(parser)</code>","text":"<p>\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.</p> <p>Parameters:</p> Name Type Description Default <code>parser</code> <code>Parser</code> <p>\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.</p> required \u041e\u043f\u0446\u0438\u0438 <p>--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</p> Source code in <code>fixtures\\pages.py</code> <pre><code>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': 1200, 'height': 500}\",\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</code></pre>"},{"location":"fixtures/pages/#fixtures.pages.return_back","title":"<code>return_back(browser)</code>","text":"<p>\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.</p> <p>Parameters:</p> Name Type Description Default <code>browser</code> <code>Page</code> <p>\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.</p> required Source code in <code>fixtures\\pages.py</code> <pre><code>@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</code></pre>"},{"location":"locators/button_locators/","title":"ButtonLocators","text":"<p>\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.</p> <p>\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.</p>"},{"location":"locators/button_locators/#locators.button_locators.ButtonLocators","title":"<code>ButtonLocators</code>","text":"<p>\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.</p> <p>\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</p> Source code in <code>locators\\button_locators.py</code> <pre><code>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</code></pre>"},{"location":"locators/confirm_locators/","title":"ConfirmLocators","text":"<p>\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.</p> <p>\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.</p>"},{"location":"locators/confirm_locators/#locators.confirm_locators.ConfirmLocators","title":"<code>ConfirmLocators</code>","text":"<p>\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.</p> \u0421\u043e\u0434\u0435\u0440\u0436\u0438\u0442 XPath \u043b\u043e\u043a\u0430\u0442\u043e\u0440\u044b \u0434\u043b\u044f <p>CONFIRM (str): \u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0433\u043e \u0434\u0438\u0430\u043b\u043e\u0433\u043e\u0432\u043e\u0433\u043e \u043e\u043a\u043d\u0430. TITLE (str): \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430 \u0434\u0438\u0430\u043b\u043e\u0433\u043e\u0432\u043e\u0433\u043e \u043e\u043a\u043d\u0430. BUTTON_CLOSE (str): \u043a\u043d\u043e\u043f\u043a\u0438 \u0437\u0430\u043a\u0440\u044b\u0442\u0438\u044f \u0434\u0438\u0430\u043b\u043e\u0433\u0430. TEXT (str): \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u043e\u0433\u043e \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0433\u043e \u0434\u0438\u0430\u043b\u043e\u0433\u0430 (\u0444\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0438).</p> Source code in <code>locators\\confirm_locators.py</code> <pre><code>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</code></pre>"},{"location":"locators/event_panel_locators/","title":"EventPanelLocators","text":"<p>\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.</p> <p>\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.</p>"},{"location":"locators/event_panel_locators/#locators.event_panel_locators.EventPanelLocators","title":"<code>EventPanelLocators</code>","text":"<p>\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.</p> <p>\u0421\u043e\u0434\u0435\u0440\u0436\u0438\u0442 XPath \u043b\u043e\u043a\u0430\u0442\u043e\u0440\u044b \u0434\u043b\u044f: BUTTONS_BLOCK (str): \u0431\u043b\u043e\u043a\u0430 \u043a\u043d\u043e\u043f\u043e\u043a \u0432 \u043f\u0430\u043d\u0435\u043b\u0438 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432</p> Source code in <code>locators\\event_panel_locators.py</code> <pre><code>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\n \u0421\u043e\u0434\u0435\u0440\u0436\u0438\u0442 XPath \u043b\u043e\u043a\u0430\u0442\u043e\u0440\u044b \u0434\u043b\u044f:\n BUTTONS_BLOCK (str): \u0431\u043b\u043e\u043a\u0430 \u043a\u043d\u043e\u043f\u043e\u043a \u0432 \u043f\u0430\u043d\u0435\u043b\u0438 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432\n \"\"\"\n\n BUTTONS_BLOCK = \"//nav/div[@class='v-toolbar__content']/div[@class='v-toolbar__items'][2]\"\n</code></pre>"},{"location":"locators/input_locators/","title":"InputLocators","text":"<p>\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.</p> <p>\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.</p>"},{"location":"locators/input_locators/#locators.input_locators.InputLocators","title":"<code>InputLocators</code>","text":"<p>\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.</p> <p>\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</p> Source code in <code>locators\\input_locators.py</code> <pre><code>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</code></pre>"},{"location":"locators/json_container_locators/","title":"JsonContainerLocators","text":"<p>\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.</p> <p>\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.</p>"},{"location":"locators/json_container_locators/#locators.json_container_locators.JsonContainerLocators","title":"<code>JsonContainerLocators</code>","text":"<p>\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.</p> <p>\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</p> Source code in <code>locators\\json_container_locators.py</code> <pre><code>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</code></pre>"},{"location":"locators/modal_window_locators/","title":"ModalWindowLocators","text":"<p>\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.</p> <p>\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.</p>"},{"location":"locators/modal_window_locators/#locators.modal_window_locators.ModalWindowLocators","title":"<code>ModalWindowLocators</code>","text":"<p>\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.</p> <p>\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</p> <p>ROLES_FIELD_INPUT_FORM_USER_DATA (str): \u043f\u043e\u043b\u044f \u0432\u044b\u0431\u043e\u0440\u0430 \u0440\u043e\u043b\u0435\u0439</p> <p>ROLES_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</p> Source code in <code>locators\\modal_window_locators.py</code> <pre><code>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\n ROLES_FIELD_INPUT_FORM_USER_DATA (str): \u043f\u043e\u043b\u044f \u0432\u044b\u0431\u043e\u0440\u0430 \u0440\u043e\u043b\u0435\u0439\n\n ROLES_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 \"\"\"\n\n MODAL_WINDOW = \"//div[contains(@class, 'v-dialog--active')]\"\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 ROLES_FIELD_INPUT_FORM_USER_DATA = \"xpath=div[2]/div/div/div/div/div[1]\"\n ROLES_MENU_INPUT_FORM_USER_DATA = \"//div[contains(@class, 'menuable__content__active')]\"\n LABEL_INPUT_FORM_USER_DATA = \"//label[contains(@class,'v-label')]/span\"\n</code></pre>"},{"location":"locators/navigation_panel_locators/","title":"NavigationPanelLocators","text":"<p>\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.</p> <p>\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.</p>"},{"location":"locators/navigation_panel_locators/#locators.navigation_panel_locators.NavigationPanelLocators","title":"<code>NavigationPanelLocators</code>","text":"<p>\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.</p> <p>\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</p> Source code in <code>locators\\navigation_panel_locators.py</code> <pre><code>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</code></pre>"},{"location":"locators/table_locators/","title":"TableLocators","text":"<p>\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.</p> <p>\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.</p>"},{"location":"locators/table_locators/#locators.table_locators.TableLocators","title":"<code>TableLocators</code>","text":"<p>\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.</p> <p>\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</p> Source code in <code>locators\\table_locators.py</code> <pre><code>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</code></pre>"},{"location":"locators/text_locators/","title":"TextLocators","text":"<p>\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.</p> <p>\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.</p>"},{"location":"locators/text_locators/#locators.text_locators.TextLocators","title":"<code>TextLocators</code>","text":"<p>\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.</p> <p>\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)</p> Source code in <code>locators\\text_locators.py</code> <pre><code>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</code></pre>"},{"location":"locators/toolbar_locators/","title":"ToolbarLocators","text":"<p>\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.</p> <p>\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.</p>"},{"location":"locators/toolbar_locators/#locators.toolbar_locators.ToolbarLocators","title":"<code>ToolbarLocators</code>","text":"<p>\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).</p> <p>\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</p> Source code in <code>locators\\toolbar_locators.py</code> <pre><code>class ToolbarLocators:\n \"\"\"\u041b\u043e\u043a\u0430\u0442\u043e\u0440\u044b \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u043f\u0430\u043d\u0435\u043b\u0438 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432 (\u0442\u0443\u043b\u0431\u0430\u0440\u0430).\n\n \u0421\u043e\u0434\u0435\u0440\u0436\u0438\u0442 XPath \u043b\u043e\u043a\u0430\u0442\u043e\u0440\u044b \u0434\u043b\u044f:\n TITLE (str): \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430 \u0442\u0443\u043b\u0431\u0430\u0440\u0430\n\tTOOLTIP (str): \u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0439 \u0432\u0441\u043f\u043b\u044b\u0432\u0430\u044e\u0449\u0435\u0439 \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0438\n \"\"\"\n\n TITLE = \"//nav//div[contains(@class, 'v-toolbar__title')]\"\n TOOLTIP = \"//div[contains(@class,'v-tooltip__content menuable__content__active')]\"\n</code></pre>"},{"location":"modal_windows/modal_add_user/","title":"AddUserModalWindow","text":"<p>\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.</p> <p>\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.</p>"},{"location":"modal_windows/modal_add_user/#modal_windows.modal_add_user.AddUserModalWindow","title":"<code>AddUserModalWindow</code>","text":"<p> Bases: <code>ModalWindowComponent</code></p> <p>\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.</p> <p>\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</p> Source code in <code>modal_windows\\modal_add_user.py</code> <pre><code>class AddUserModalWindow(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 roles_field_locator = ModalWindowLocators.ROLES_FIELD_INPUT_FORM_USER_DATA\n input_form_locator = ModalWindowLocators.INPUT_FORM_USER_DATA\n label_locator = ModalWindowLocators.LABEL_INPUT_FORM_USER_DATA\n roles_menu_locator = ModalWindowLocators.ROLES_MENU_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 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).locator(\"xpath=div[3]\").locator(roles_field_locator)\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, roles_menu_locator, \"roles_list\")\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 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 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 \"active_directory_checked\" in fields:\n checkbox = self.get_content_item(\"active_directory_checkbox\")\n if user_data[\"active_directory_checked\"]:\n checkbox.check()\n else:\n checkbox.uncheck()\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 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.check_toolbar_button_presence(\"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_presence(\"Roles list is missing\")\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_presence(\n f\"Modal window content item with name '{name}' is missing\"\n )\n\n self.check_button_presence(\"add\")\n self.check_button_presence(\"close\")\n</code></pre>"},{"location":"modal_windows/modal_add_user/#modal_windows.modal_add_user.AddUserModalWindow.__init__","title":"<code>__init__(page)</code>","text":"<p>\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.</p> Source code in <code>modal_windows\\modal_add_user.py</code> <pre><code>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 roles_field_locator = ModalWindowLocators.ROLES_FIELD_INPUT_FORM_USER_DATA\n input_form_locator = ModalWindowLocators.INPUT_FORM_USER_DATA\n label_locator = ModalWindowLocators.LABEL_INPUT_FORM_USER_DATA\n roles_menu_locator = ModalWindowLocators.ROLES_MENU_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 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).locator(\"xpath=div[3]\").locator(roles_field_locator)\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, roles_menu_locator, \"roles_list\")\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 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</code></pre>"},{"location":"modal_windows/modal_add_user/#modal_windows.modal_add_user.AddUserModalWindow.check_content","title":"<code>check_content()</code>","text":"<p>\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.</p> Source code in <code>modal_windows\\modal_add_user.py</code> <pre><code>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.check_toolbar_button_presence(\"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_presence(\"Roles list is missing\")\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_presence(\n f\"Modal window content item with name '{name}' is missing\"\n )\n\n self.check_button_presence(\"add\")\n self.check_button_presence(\"close\")\n</code></pre>"},{"location":"modal_windows/modal_add_user/#modal_windows.modal_add_user.AddUserModalWindow.close_window","title":"<code>close_window()</code>","text":"<p>\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'.</p> Source code in <code>modal_windows\\modal_add_user.py</code> <pre><code>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</code></pre>"},{"location":"modal_windows/modal_add_user/#modal_windows.modal_add_user.AddUserModalWindow.close_window_by_toolbar_button","title":"<code>close_window_by_toolbar_button()</code>","text":"<p>\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.</p> Source code in <code>modal_windows\\modal_add_user.py</code> <pre><code>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</code></pre>"},{"location":"modal_windows/modal_add_user/#modal_windows.modal_add_user.AddUserModalWindow.new_user","title":"<code>new_user(user_data)</code>","text":"<p>\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.</p> <p>Parameters:</p> Name Type Description Default <code>user_data</code> <code>dict</code> <p>\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.)</p> required Source code in <code>modal_windows\\modal_add_user.py</code> <pre><code>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 \"active_directory_checked\" in fields:\n checkbox = self.get_content_item(\"active_directory_checkbox\")\n if user_data[\"active_directory_checked\"]:\n checkbox.check()\n else:\n checkbox.uncheck()\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</code></pre>"},{"location":"modal_windows/modal_edit_user/","title":"LicenseTab","text":"<p>\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.</p> <p>\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.</p>"},{"location":"modal_windows/modal_edit_user/#modal_windows.modal_edit_user.EditUserModalWindow","title":"<code>EditUserModalWindow</code>","text":"<p> Bases: <code>ModalWindowComponent</code></p> <p>\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.</p> <p>\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.)</p> Source code in <code>modal_windows\\modal_edit_user.py</code> <pre><code>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 roles_field_locator = ModalWindowLocators.ROLES_FIELD_INPUT_FORM_USER_DATA\n input_form_locator = ModalWindowLocators.INPUT_FORM_USER_DATA\n label_locator = ModalWindowLocators.LABEL_INPUT_FORM_USER_DATA\n roles_menu_locator = ModalWindowLocators.ROLES_MENU_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).locator(\"xpath=div[2]\").locator(roles_field_locator)\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, roles_menu_locator, \"roles_list\")\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 self.check_by_window_title()\n self.check_toolbar_button_presence(\"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_presence(\"Roles list is missing\")\n roles_list.check_item_with_text(role)\n elif name == \"roles_list\":\n continue\n else:\n item.check_presence(\n f\"Modal window content item with name '{name}' is missing\"\n )\n\n self.check_button_presence(\"save\")\n self.check_button_presence(\"delete\")\n self.check_button_presence(\"reset_password\")\n self.check_button_presence(\"close\")\n</code></pre>"},{"location":"modal_windows/modal_edit_user/#modal_windows.modal_edit_user.EditUserModalWindow.__init__","title":"<code>__init__(page, user_name)</code>","text":"<p>\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.</p> Source code in <code>modal_windows\\modal_edit_user.py</code> <pre><code>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 roles_field_locator = ModalWindowLocators.ROLES_FIELD_INPUT_FORM_USER_DATA\n input_form_locator = ModalWindowLocators.INPUT_FORM_USER_DATA\n label_locator = ModalWindowLocators.LABEL_INPUT_FORM_USER_DATA\n roles_menu_locator = ModalWindowLocators.ROLES_MENU_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).locator(\"xpath=div[2]\").locator(roles_field_locator)\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, roles_menu_locator, \"roles_list\")\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</code></pre>"},{"location":"modal_windows/modal_edit_user/#modal_windows.modal_edit_user.EditUserModalWindow.check_content","title":"<code>check_content(user_name, role)</code>","text":"<p>\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.</p> <p>Parameters:</p> Name Type Description Default <code>user_name</code> <code>str</code> <p>\u041e\u0436\u0438\u0434\u0430\u0435\u043c\u043e\u0435 \u0438\u043c\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f</p> required <code>role</code> <code>str</code> <p>\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</p> required Source code in <code>modal_windows\\modal_edit_user.py</code> <pre><code>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 self.check_by_window_title()\n self.check_toolbar_button_presence(\"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_presence(\"Roles list is missing\")\n roles_list.check_item_with_text(role)\n elif name == \"roles_list\":\n continue\n else:\n item.check_presence(\n f\"Modal window content item with name '{name}' is missing\"\n )\n\n self.check_button_presence(\"save\")\n self.check_button_presence(\"delete\")\n self.check_button_presence(\"reset_password\")\n self.check_button_presence(\"close\")\n</code></pre>"},{"location":"modal_windows/modal_edit_user/#modal_windows.modal_edit_user.EditUserModalWindow.close_window","title":"<code>close_window()</code>","text":"<p>\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'.</p> Source code in <code>modal_windows\\modal_edit_user.py</code> <pre><code>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</code></pre>"},{"location":"modal_windows/modal_edit_user/#modal_windows.modal_edit_user.EditUserModalWindow.close_window_by_toolbar_button","title":"<code>close_window_by_toolbar_button()</code>","text":"<p>\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.</p> Source code in <code>modal_windows\\modal_edit_user.py</code> <pre><code>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</code></pre>"},{"location":"modal_windows/modal_edit_user/#modal_windows.modal_edit_user.EditUserModalWindow.delete_user","title":"<code>delete_user()</code>","text":"<p>\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.</p> Source code in <code>modal_windows\\modal_edit_user.py</code> <pre><code>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</code></pre>"},{"location":"modal_windows/modal_edit_user/#modal_windows.modal_edit_user.EditUserModalWindow.edit_user","title":"<code>edit_user(user_data)</code>","text":"<p>\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.</p> <p>Parameters:</p> Name Type Description Default <code>user_data</code> <code>dict</code> <p>\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.)</p> required Source code in <code>modal_windows\\modal_edit_user.py</code> <pre><code>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</code></pre>"},{"location":"modal_windows/modal_edit_user/#modal_windows.modal_edit_user.EditUserModalWindow.reset_password","title":"<code>reset_password()</code>","text":"<p>\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.</p> Source code in <code>modal_windows\\modal_edit_user.py</code> <pre><code>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</code></pre>"},{"location":"pages/base_page/","title":"BasePage","text":"<p>\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.</p> <p>\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.</p>"},{"location":"pages/base_page/#pages.base_page.BasePage","title":"<code>BasePage</code>","text":"<p>\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.</p> \u0410\u0442\u0440\u0438\u0431\u0443\u0442\u044b <p>page (Page): \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.</p> Source code in <code>pages\\base_page.py</code> <pre><code>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) -&gt; 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) -&gt; 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) -&gt; 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) -&gt; 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) -&gt; 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) -&gt; 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 headers = {\"Accept\": \"application/json\", \"Authorization\": f\"Bearer {token}\"}\n response = api_request_context.get(\n f\"{host.get_request_url()}{uri}\",\n headers=headers\n )\n return response\n\n def send_post_api_request(self, uri: str, payload: Dict) -&gt; Response:\n \"\"\"\u041e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 POST-\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 payload (Dict): \u0414\u0430\u043d\u043d\u044b\u0435 \u0434\u043b\u044f \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0438 \u0432 \u0442\u0435\u043b\u0435 \u0437\u0430\u043f\u0440\u043e\u0441\u0430.\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 headers = {\"Accept\": \"application/json\", \"Authorization\": f\"Bearer {token}\"}\n response = api_request_context.post(\n f\"{host.get_request_url()}{uri}\",\n headers=headers,\n data=payload\n )\n return response\n\n def get_response_body(self, response: Response) -&gt; dict | 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 | 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 try:\n response_body = response.json()\n except json.JSONDecodeError:\n logger.error(\"Failed to decode JSON response\")\n return None\n return response_body\n\n # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0438:\n def check_URL(self, uri: str, msg: str) -&gt; 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(\n f\"{host.get_base_url()}{uri}\",\n timeout=60000\n ), msg\n\n def check_equals(self, actual: Any, expected: Any, msg: str) -&gt; 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) -&gt; 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) -&gt; 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</code></pre>"},{"location":"pages/base_page/#pages.base_page.BasePage.__init__","title":"<code>__init__(page)</code>","text":"<p>\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.</p> <p>Parameters:</p> Name Type Description Default <code>page</code> <code>Page</code> <p>\u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.</p> required Source code in <code>pages\\base_page.py</code> <pre><code>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</code></pre>"},{"location":"pages/base_page/#pages.base_page.BasePage.check_URL","title":"<code>check_URL(uri, msg)</code>","text":"<p>\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.</p> <p>Parameters:</p> Name Type Description Default <code>uri</code> <code>str</code> <p>\u041e\u0436\u0438\u0434\u0430\u0435\u043c\u044b\u0439 URI (\u0431\u0435\u0437 \u0431\u0430\u0437\u043e\u0432\u043e\u0433\u043e URL).</p> required <code>msg</code> <code>str</code> <p>\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.</p> required <p>Raises:</p> Type Description <code>AssertionError</code> <p>\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.</p> Source code in <code>pages\\base_page.py</code> <pre><code>def check_URL(self, uri: str, msg: str) -&gt; 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(\n f\"{host.get_base_url()}{uri}\",\n timeout=60000\n ), msg\n</code></pre>"},{"location":"pages/base_page/#pages.base_page.BasePage.check_equals","title":"<code>check_equals(actual, expected, msg)</code>","text":"<p>\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.</p> <p>Parameters:</p> Name Type Description Default <code>actual</code> <code>Any</code> <p>\u0424\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435.</p> required <code>expected</code> <code>Any</code> <p>\u041e\u0436\u0438\u0434\u0430\u0435\u043c\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435.</p> required <code>msg</code> <code>str</code> <p>\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.</p> required <p>Raises:</p> Type Description <code>AssertionError</code> <p>\u0415\u0441\u043b\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043d\u0435 \u0440\u0430\u0432\u043d\u044b.</p> Source code in <code>pages\\base_page.py</code> <pre><code>def check_equals(self, actual: Any, expected: Any, msg: str) -&gt; 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</code></pre>"},{"location":"pages/base_page/#pages.base_page.BasePage.check_lists_equals","title":"<code>check_lists_equals(actual, expected, msg)</code>","text":"<p>\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.</p> <p>Parameters:</p> Name Type Description Default <code>actual</code> <code>list</code> <p>\u0424\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0441\u043f\u0438\u0441\u043e\u043a.</p> required <code>expected</code> <code>list</code> <p>\u041e\u0436\u0438\u0434\u0430\u0435\u043c\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a.</p> required <code>msg</code> <code>str</code> <p>\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.</p> required <p>Raises:</p> Type Description <code>AssertionError</code> <p>\u0415\u0441\u043b\u0438 \u0441\u043f\u0438\u0441\u043a\u0438 \u043d\u0435 \u0440\u0430\u0432\u043d\u044b.</p> Source code in <code>pages\\base_page.py</code> <pre><code>def check_lists_equals(self, actual: list, expected: list, msg: str) -&gt; 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) -&gt; 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</code></pre>"},{"location":"pages/base_page/#pages.base_page.BasePage.current_url","title":"<code>current_url()</code>","text":"<p>\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.</p> <p>Returns:</p> Name Type Description <code>str</code> <code>str</code> <p>\u0422\u0435\u043a\u0443\u0449\u0438\u0439 URL \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b.</p> Source code in <code>pages\\base_page.py</code> <pre><code>def current_url(self) -&gt; 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</code></pre>"},{"location":"pages/base_page/#pages.base_page.BasePage.get_api_request_context","title":"<code>get_api_request_context()</code>","text":"<p>\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.</p> <p>Returns:</p> Name Type Description <code>APIRequestContext</code> <code>APIRequestContext</code> <p>\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.</p> Source code in <code>pages\\base_page.py</code> <pre><code>def get_api_request_context(self) -&gt; 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</code></pre>"},{"location":"pages/base_page/#pages.base_page.BasePage.get_response_body","title":"<code>get_response_body(response)</code>","text":"<p>\u0418\u0437\u0432\u043b\u0435\u043a\u0430\u0435\u0442 \u0442\u0435\u043b\u043e \u043e\u0442\u0432\u0435\u0442\u0430 \u0432 format JSON.</p> <p>Parameters:</p> Name Type Description Default <code>response</code> <code>Response</code> <p>\u041e\u0442\u0432\u0435\u0442 \u0441\u0435\u0440\u0432\u0435\u0440\u0430.</p> required <p>Returns:</p> Type Description <code>dict | None</code> <p>dict | 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.</p> Source code in <code>pages\\base_page.py</code> <pre><code>def get_response_body(self, response: Response) -&gt; dict | 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 | 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 try:\n response_body = response.json()\n except json.JSONDecodeError:\n logger.error(\"Failed to decode JSON response\")\n return None\n return response_body\n</code></pre>"},{"location":"pages/base_page/#pages.base_page.BasePage.open","title":"<code>open(uri)</code>","text":"<p>\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.</p> <p>Parameters:</p> Name Type Description Default <code>uri</code> <code>str</code> <p>URI \u0434\u043b\u044f \u043e\u0442\u043a\u0440\u044b\u0442\u0438\u044f (\u0431\u0435\u0437 \u0431\u0430\u0437\u043e\u0432\u043e\u0433\u043e URL).</p> required <p>Returns:</p> Type Description <code>Response | None</code> <p>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.</p> Source code in <code>pages\\base_page.py</code> <pre><code>def open(self, uri) -&gt; 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</code></pre>"},{"location":"pages/base_page/#pages.base_page.BasePage.page_reload","title":"<code>page_reload()</code>","text":"<p>\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.</p> Source code in <code>pages\\base_page.py</code> <pre><code>def page_reload(self) -&gt; 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</code></pre>"},{"location":"pages/base_page/#pages.base_page.BasePage.send_get_api_request","title":"<code>send_get_api_request(uri)</code>","text":"<p>\u041e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 GET-\u0437\u0430\u043f\u0440\u043e\u0441 \u043a API.</p> <p>Parameters:</p> Name Type Description Default <code>uri</code> <code>str</code> <p>URI API-\u044d\u043d\u0434\u043f\u043e\u0438\u043d\u0442\u0430 (\u0431\u0435\u0437 \u0431\u0430\u0437\u043e\u0432\u043e\u0433\u043e URL).</p> required <p>Returns:</p> Name Type Description <code>Response</code> <code>Response</code> <p>\u041e\u0442\u0432\u0435\u0442 \u0441\u0435\u0440\u0432\u0435\u0440\u0430.</p> Source code in <code>pages\\base_page.py</code> <pre><code>def send_get_api_request(self, uri: str) -&gt; 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 headers = {\"Accept\": \"application/json\", \"Authorization\": f\"Bearer {token}\"}\n response = api_request_context.get(\n f\"{host.get_request_url()}{uri}\",\n headers=headers\n )\n return response\n</code></pre>"},{"location":"pages/base_page/#pages.base_page.BasePage.send_post_api_request","title":"<code>send_post_api_request(uri, payload)</code>","text":"<p>\u041e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 POST-\u0437\u0430\u043f\u0440\u043e\u0441 \u043a API.</p> <p>Parameters:</p> Name Type Description Default <code>uri</code> <code>str</code> <p>URI API-\u044d\u043d\u0434\u043f\u043e\u0438\u043d\u0442\u0430 (\u0431\u0435\u0437 \u0431\u0430\u0437\u043e\u0432\u043e\u0433\u043e URL).</p> required <code>payload</code> <code>Dict</code> <p>\u0414\u0430\u043d\u043d\u044b\u0435 \u0434\u043b\u044f \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0438 \u0432 \u0442\u0435\u043b\u0435 \u0437\u0430\u043f\u0440\u043e\u0441\u0430.</p> required <p>Returns:</p> Name Type Description <code>Response</code> <code>Response</code> <p>\u041e\u0442\u0432\u0435\u0442 \u0441\u0435\u0440\u0432\u0435\u0440\u0430.</p> Source code in <code>pages\\base_page.py</code> <pre><code>def send_post_api_request(self, uri: str, payload: Dict) -&gt; Response:\n \"\"\"\u041e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 POST-\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 payload (Dict): \u0414\u0430\u043d\u043d\u044b\u0435 \u0434\u043b\u044f \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0438 \u0432 \u0442\u0435\u043b\u0435 \u0437\u0430\u043f\u0440\u043e\u0441\u0430.\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 headers = {\"Accept\": \"application/json\", \"Authorization\": f\"Bearer {token}\"}\n response = api_request_context.post(\n f\"{host.get_request_url()}{uri}\",\n headers=headers,\n data=payload\n )\n return response\n</code></pre>"},{"location":"pages/base_page/#pages.base_page.BasePage.wait_for_timeout","title":"<code>wait_for_timeout(timeout)</code>","text":"<p>\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.</p> <p>Parameters:</p> Name Type Description Default <code>timeout</code> <code>int</code> <p>\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.</p> required Source code in <code>pages\\base_page.py</code> <pre><code>def wait_for_timeout(self, timeout: int) -&gt; 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</code></pre>"},{"location":"pages/license_tab/","title":"LicenseTab","text":"<p>\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'.</p> <p>\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.</p>"},{"location":"pages/license_tab/#pages.license_tab.LicenseTab","title":"<code>LicenseTab</code>","text":"<p> Bases: <code>BasePage</code></p> <p>\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'.</p> <p>\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</p> Source code in <code>pages\\license_tab.py</code> <pre><code>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) -&gt; 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) -&gt; 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) -&gt; 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) -&gt; 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) -&gt; 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) -&gt; 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) -&gt; 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) -&gt; 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) -&gt; 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_presence(\n JsonContainerLocators.CONTAINER,\n \"Json container with license info is missing\"\n )\n\n def should_be_input_form_title(self) -&gt; 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) -&gt; 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) -&gt; 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) -&gt; 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</code></pre>"},{"location":"pages/license_tab/#pages.license_tab.LicenseTab.__init__","title":"<code>__init__(page)</code>","text":"<p>\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'.</p> <p>Parameters:</p> Name Type Description Default <code>page</code> <code>Page</code> <p>\u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright</p> required Source code in <code>pages\\license_tab.py</code> <pre><code>def __init__(self, page: Page) -&gt; 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</code></pre>"},{"location":"pages/license_tab/#pages.license_tab.LicenseTab.check_content","title":"<code>check_content()</code>","text":"<p>\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.</p> Source code in <code>pages\\license_tab.py</code> <pre><code>def check_content(self) -&gt; 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</code></pre>"},{"location":"pages/license_tab/#pages.license_tab.LicenseTab.check_json_container_verticall_scrolling","title":"<code>check_json_container_verticall_scrolling()</code>","text":"<p>\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.</p> <p>Returns:</p> Name Type Description <code>bool</code> <code>bool</code> <p>\u0414\u043e\u0441\u0442\u0443\u043f\u043d\u043e\u0441\u0442\u044c \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0438</p> Source code in <code>pages\\license_tab.py</code> <pre><code>def check_json_container_verticall_scrolling(self) -&gt; 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</code></pre>"},{"location":"pages/license_tab/#pages.license_tab.LicenseTab.fill_license_input_form","title":"<code>fill_license_input_form(value)</code>","text":"<p>\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.</p> <p>Parameters:</p> Name Type Description Default <code>value</code> <code>str</code> <p>\u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0434\u043b\u044f \u0432\u0432\u043e\u0434\u0430</p> required Source code in <code>pages\\license_tab.py</code> <pre><code>def fill_license_input_form(self, value: str) -&gt; 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</code></pre>"},{"location":"pages/license_tab/#pages.license_tab.LicenseTab.scroll_json_container_down","title":"<code>scroll_json_container_down()</code>","text":"<p>\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.</p> Source code in <code>pages\\license_tab.py</code> <pre><code>def scroll_json_container_down(self) -&gt; 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</code></pre>"},{"location":"pages/license_tab/#pages.license_tab.LicenseTab.scroll_json_container_up","title":"<code>scroll_json_container_up()</code>","text":"<p>\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.</p> Source code in <code>pages\\license_tab.py</code> <pre><code>def scroll_json_container_up(self) -&gt; 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</code></pre>"},{"location":"pages/license_tab/#pages.license_tab.LicenseTab.should_be_empty_input_form","title":"<code>should_be_empty_input_form()</code>","text":"<p>\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.</p> Source code in <code>pages\\license_tab.py</code> <pre><code>def should_be_empty_input_form(self) -&gt; 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</code></pre>"},{"location":"pages/license_tab/#pages.license_tab.LicenseTab.should_be_error_alert_window_with_text","title":"<code>should_be_error_alert_window_with_text(text)</code>","text":"<p>\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.</p> <p>Parameters:</p> Name Type Description Default <code>text</code> <code>str</code> <p>\u0422\u0435\u043a\u0441\u0442 \u0434\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438</p> required Source code in <code>pages\\license_tab.py</code> <pre><code>def should_be_error_alert_window_with_text(self, text: str) -&gt; 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</code></pre>"},{"location":"pages/license_tab/#pages.license_tab.LicenseTab.should_be_input_form_title","title":"<code>should_be_input_form_title()</code>","text":"<p>\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.</p> Source code in <code>pages\\license_tab.py</code> <pre><code>def should_be_input_form_title(self) -&gt; 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</code></pre>"},{"location":"pages/license_tab/#pages.license_tab.LicenseTab.should_be_json_container","title":"<code>should_be_json_container()</code>","text":"<p>\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.</p> Source code in <code>pages\\license_tab.py</code> <pre><code>def should_be_json_container(self) -&gt; 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_presence(\n JsonContainerLocators.CONTAINER,\n \"Json container with license info is missing\"\n )\n</code></pre>"},{"location":"pages/license_tab/#pages.license_tab.LicenseTab.should_be_toolbar","title":"<code>should_be_toolbar()</code>","text":"<p>\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.</p> Source code in <code>pages\\license_tab.py</code> <pre><code>def should_be_toolbar(self) -&gt; 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</code></pre>"},{"location":"pages/license_tab/#pages.license_tab.LicenseTab.should_be_update_button","title":"<code>should_be_update_button()</code>","text":"<p>\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.</p> Source code in <code>pages\\license_tab.py</code> <pre><code>def should_be_update_button(self) -&gt; 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</code></pre>"},{"location":"pages/license_tab/#pages.license_tab.LicenseTab.verify_json_container_content","title":"<code>verify_json_container_content()</code>","text":"<p>\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.</p> Source code in <code>pages\\license_tab.py</code> <pre><code>def verify_json_container_content(self) -&gt; 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</code></pre>"},{"location":"pages/login_page/","title":"LoginPage","text":"<p>\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.</p> <p>\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.</p>"},{"location":"pages/login_page/#pages.login_page.LoginPage","title":"<code>LoginPage</code>","text":"<p> Bases: <code>BasePage</code></p> <p>\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.</p> \u0410\u0442\u0440\u0438\u0431\u0443\u0442\u044b <p>page: \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright. login_input: \u041f\u043e\u043b\u0435 \u0432\u0432\u043e\u0434\u0430 \u043b\u043e\u0433\u0438\u043d\u0430. password_input: \u041f\u043e\u043b\u0435 \u0432\u0432\u043e\u0434\u0430 \u043f\u0430\u0440\u043e\u043b\u044f. login_button: \u041a\u043d\u043e\u043f\u043a\u0430 \u0432\u0445\u043e\u0434\u0430. alert: \u0410\u043b\u0435\u0440\u0442 \u043e\u043a\u043d\u043e \u0441 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435\u043c \u043e\u0431 \u043e\u0448\u0438\u0431\u043a\u0435.</p> Source code in <code>pages\\login_page.py</code> <pre><code>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) -&gt; 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 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 do_login(self, username: str = None, password: str = None) -&gt; 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 token = response_body.get(\"access_token\")\n host.set_access_token(token)\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\") -&gt; 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</code></pre>"},{"location":"pages/login_page/#pages.login_page.LoginPage.__init__","title":"<code>__init__(page)</code>","text":"<p>\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.</p> <p>Parameters:</p> Name Type Description Default <code>page</code> <code>Page</code> <p>\u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.</p> required Source code in <code>pages\\login_page.py</code> <pre><code>def __init__(self, page: Page) -&gt; 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 self.login_button = Button(page, page.get_by_role(\"button\"), \"login button\")\n\n self.alert = AlertComponent(page)\n</code></pre>"},{"location":"pages/login_page/#pages.login_page.LoginPage.do_login","title":"<code>do_login(username=None, password=None)</code>","text":"<p>\u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u0432\u0445\u043e\u0434 \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0443.</p> <p>\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.</p> <p>Parameters:</p> Name Type Description Default <code>username</code> <code>str</code> <p>\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.</p> <code>None</code> <code>password</code> <code>str</code> <p>\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.</p> <code>None</code> <p>Raises:</p> Type Description <code>AssertionError</code> <p>\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.</p> Source code in <code>pages\\login_page.py</code> <pre><code>def do_login(self, username: str = None, password: str = None) -&gt; 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 token = response_body.get(\"access_token\")\n host.set_access_token(token)\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</code></pre>"},{"location":"pages/login_page/#pages.login_page.LoginPage.do_unsuccessful_login","title":"<code>do_unsuccessful_login(username='someuser', password='password')</code>","text":"<p>\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.</p> <p>\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.</p> <p>Parameters:</p> Name Type Description Default <code>username</code> <code>str</code> <p>\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\".</p> <code>'someuser'</code> <code>password</code> <code>str</code> <p>\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\".</p> <code>'password'</code> Source code in <code>pages\\login_page.py</code> <pre><code>def do_unsuccessful_login(self, username: str = \"someuser\", password: str = \"password\") -&gt; 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</code></pre>"},{"location":"pages/main_page/","title":"MainPage","text":"<p>\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.</p> <p>\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.</p>"},{"location":"pages/main_page/#pages.main_page.MainPage","title":"<code>MainPage</code>","text":"<p> Bases: <code>BasePage</code></p> <p>\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.</p> \u0410\u0442\u0440\u0438\u0431\u0443\u0442\u044b <p>page: \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright. navigation_panel: \u041a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 \u043f\u0430\u043d\u0435\u043b\u0438 \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438. user_button: \u041a\u043d\u043e\u043f\u043a\u0430 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f. user_card: \u041a\u0430\u0440\u0442\u043e\u0447\u043a\u0430 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.</p> Source code in <code>pages\\main_page.py</code> <pre><code>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) -&gt; 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\n locators = self.page.locator(EventPanelLocators.BUTTONS_BLOCK).get_by_role(\"button\").all()\n self.user_button = Button(page, locators[0], \"search_button\")\n self.user_button = Button(page, locators[1], \"user_button\")\n\n self.user_card = CardComponent(page)\n\n # \u0414\u0435\u0439\u0441\u0442\u0432\u0438\u044f:\n def click_main_navigation_panel_item(self, item_name: str) -&gt; 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) -&gt; None:\n \"\"\"\u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u044b\u0439 \u043f\u043e\u0438\u0441\u043a \u043f\u043e \u043f\u0430\u043d\u0435\u043b\u0438 \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438 \u0437\u0430\u0434\u0430\u043d\u043d\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0438 \u0434\u0435\u043b\u0430\u0435\u0442 \u043a\u043b\u0438\u043a \u043f\u043e \u043d\u0435\u043c\u0443.\"\"\"\n\n active_item_locator = self.page.locator(NavigationPanelLocators.PANEL_MAIN).locator(NavigationPanelLocators.ACTIVE_CONTAINER)\n node_locator = active_item_locator.locator(NavigationPanelLocators.SUB_PANEL_MAIN).locator(NavigationPanelLocators.TREEVIEW).first\n\n # \u0420\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u044b\u0439 \u043f\u043e\u0438\u0441\u043a \u0432 \u0434\u0435\u0440\u0435\u0432\u0435 v-treeview \u0437\u0430\u0434\u0430\u043d\u043d\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0438 \u043a\u043b\u0438\u043a \u043f\u043e \u043d\u0435\u043c\u0443\n self.navigation_panel.click_sub_item(node_locator, item_name)\n\n def click_user_button(self) -&gt; None:\n \"\"\"\u041a\u043b\u0438\u043a\u0430\u0435\u0442 \u043f\u043e \u043a\u043d\u043e\u043f\u043a\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\"\"\"\n\n self.user_button.click()\n\n def do_logout(self) -&gt; 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.should_be_user_button()\n self.click_user_button()\n self.user_card.click_logout_button()\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 scroll_navigation_panel_up(self) -&gt; 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) -&gt; 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) -&gt; 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_presence(\n NavigationPanelLocators.PANEL_MAIN,\n \"Navigation panel is missing\"\n )\n\n def should_be_user_button(self) -&gt; 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_presence(\"User button is missing on event panel\")\n\n def check_navigation_panel_verticall_scrolling(self) -&gt; 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) -&gt; 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</code></pre>"},{"location":"pages/main_page/#pages.main_page.MainPage.__init__","title":"<code>__init__(page)</code>","text":"<p>\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.</p> <p>Parameters:</p> Name Type Description Default <code>page</code> <code>Page</code> <p>\u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.</p> required Source code in <code>pages\\main_page.py</code> <pre><code>def __init__(self, page: Page) -&gt; 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\n locators = self.page.locator(EventPanelLocators.BUTTONS_BLOCK).get_by_role(\"button\").all()\n self.user_button = Button(page, locators[0], \"search_button\")\n self.user_button = Button(page, locators[1], \"user_button\")\n\n self.user_card = CardComponent(page)\n</code></pre>"},{"location":"pages/main_page/#pages.main_page.MainPage.check_navigation_panel_item_visibility","title":"<code>check_navigation_panel_item_visibility(item_name)</code>","text":"<p>\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.</p> <p>Parameters:</p> Name Type Description Default <code>item_name</code> <code>str</code> <p>\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.</p> required Source code in <code>pages\\main_page.py</code> <pre><code>def check_navigation_panel_item_visibility(self, item_name: str) -&gt; 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</code></pre>"},{"location":"pages/main_page/#pages.main_page.MainPage.check_navigation_panel_verticall_scrolling","title":"<code>check_navigation_panel_verticall_scrolling()</code>","text":"<p>\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.</p> <p>Returns:</p> Name Type Description <code>bool</code> <code>bool</code> <p>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.</p> Source code in <code>pages\\main_page.py</code> <pre><code>def check_navigation_panel_verticall_scrolling(self) -&gt; 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</code></pre>"},{"location":"pages/main_page/#pages.main_page.MainPage.click_main_navigation_panel_item","title":"<code>click_main_navigation_panel_item(item_name)</code>","text":"<p>\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.</p> <p>Parameters:</p> Name Type Description Default <code>item_name</code> <code>str</code> <p>\u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0434\u043b\u044f \u043a\u043b\u0438\u043a\u0430.</p> required Source code in <code>pages\\main_page.py</code> <pre><code>def click_main_navigation_panel_item(self, item_name: str) -&gt; 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</code></pre>"},{"location":"pages/main_page/#pages.main_page.MainPage.click_subpanel_item","title":"<code>click_subpanel_item(item_name)</code>","text":"<p>\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.</p> Source code in <code>pages\\main_page.py</code> <pre><code>def click_subpanel_item(self, item_name: str) -&gt; None:\n \"\"\"\u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u044b\u0439 \u043f\u043e\u0438\u0441\u043a \u043f\u043e \u043f\u0430\u043d\u0435\u043b\u0438 \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438 \u0437\u0430\u0434\u0430\u043d\u043d\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0438 \u0434\u0435\u043b\u0430\u0435\u0442 \u043a\u043b\u0438\u043a \u043f\u043e \u043d\u0435\u043c\u0443.\"\"\"\n\n active_item_locator = self.page.locator(NavigationPanelLocators.PANEL_MAIN).locator(NavigationPanelLocators.ACTIVE_CONTAINER)\n node_locator = active_item_locator.locator(NavigationPanelLocators.SUB_PANEL_MAIN).locator(NavigationPanelLocators.TREEVIEW).first\n\n # \u0420\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u044b\u0439 \u043f\u043e\u0438\u0441\u043a \u0432 \u0434\u0435\u0440\u0435\u0432\u0435 v-treeview \u0437\u0430\u0434\u0430\u043d\u043d\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0438 \u043a\u043b\u0438\u043a \u043f\u043e \u043d\u0435\u043c\u0443\n self.navigation_panel.click_sub_item(node_locator, item_name)\n</code></pre>"},{"location":"pages/main_page/#pages.main_page.MainPage.click_user_button","title":"<code>click_user_button()</code>","text":"<p>\u041a\u043b\u0438\u043a\u0430\u0435\u0442 \u043f\u043e \u043a\u043d\u043e\u043f\u043a\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.</p> Source code in <code>pages\\main_page.py</code> <pre><code>def click_user_button(self) -&gt; None:\n \"\"\"\u041a\u043b\u0438\u043a\u0430\u0435\u0442 \u043f\u043e \u043a\u043d\u043e\u043f\u043a\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\"\"\"\n\n self.user_button.click()\n</code></pre>"},{"location":"pages/main_page/#pages.main_page.MainPage.do_logout","title":"<code>do_logout()</code>","text":"<p>\u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u0432\u044b\u0445\u043e\u0434 \u0438\u0437 \u0441\u0438\u0441\u0442\u0435\u043c\u044b.</p> Source code in <code>pages\\main_page.py</code> <pre><code>def do_logout(self) -&gt; 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.should_be_user_button()\n self.click_user_button()\n self.user_card.click_logout_button()\n</code></pre>"},{"location":"pages/main_page/#pages.main_page.MainPage.expand_navigation_subpanel","title":"<code>expand_navigation_subpanel()</code>","text":"<p>\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.</p> Source code in <code>pages\\main_page.py</code> <pre><code>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</code></pre>"},{"location":"pages/main_page/#pages.main_page.MainPage.scroll_navigation_panel_down","title":"<code>scroll_navigation_panel_down()</code>","text":"<p>\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.</p> Source code in <code>pages\\main_page.py</code> <pre><code>def scroll_navigation_panel_down(self) -&gt; 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</code></pre>"},{"location":"pages/main_page/#pages.main_page.MainPage.scroll_navigation_panel_up","title":"<code>scroll_navigation_panel_up()</code>","text":"<p>\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.</p> Source code in <code>pages\\main_page.py</code> <pre><code>def scroll_navigation_panel_up(self) -&gt; 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</code></pre>"},{"location":"pages/main_page/#pages.main_page.MainPage.should_be_navigation_panel","title":"<code>should_be_navigation_panel()</code>","text":"<p>\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.</p> Source code in <code>pages\\main_page.py</code> <pre><code>def should_be_navigation_panel(self) -&gt; 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_presence(\n NavigationPanelLocators.PANEL_MAIN,\n \"Navigation panel is missing\"\n )\n</code></pre>"},{"location":"pages/main_page/#pages.main_page.MainPage.should_be_user_button","title":"<code>should_be_user_button()</code>","text":"<p>\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.</p> Source code in <code>pages\\main_page.py</code> <pre><code>def should_be_user_button(self) -&gt; 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_presence(\"User button is missing on event panel\")\n</code></pre>"},{"location":"pages/service_status_tab/","title":"ServiceStatusTab","text":"<p>\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'.</p> <p>\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.</p>"},{"location":"pages/service_status_tab/#pages.service_status_tab.ServiceStatusTab","title":"<code>ServiceStatusTab</code>","text":"<p> Bases: <code>BasePage</code></p> <p>\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'.</p> <p>\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.</p> <p>Parameters:</p> Name Type Description Default <code>page</code> <code>Page</code> <p>\u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.</p> required Source code in <code>pages\\service_status_tab.py</code> <pre><code>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) -&gt; 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) -&gt; int:\n \"\"\"\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0441\u0442\u0440\u043e\u043a \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435 (\u0431\u0435\u0437 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430).\n\n Returns:\n int: \u041a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0441\u0442\u0440\u043e\u043a \u0441 \u0434\u0430\u043d\u043d\u044b\u043c\u0438.\n\n Raises:\n AssertionError: \u0415\u0441\u043b\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u043f\u0443\u0441\u0442\u0430.\n \"\"\"\n\n table_content = self.services_table.read(TableLocators.TABLE_WORK_AREA)\n rows_count = len(table_content)\n\n if rows_count == 0:\n assert False, \"The contents of the table are missing\"\n\n return rows_count - 1\n\n def scroll_services_table_up(self) -&gt; 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) -&gt; 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) -&gt; None:\n \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432.\n\n \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0438 \u0438 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435.\n\n\n\n\n Raises:\n AssertionError: \u0415\u0441\u043b\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u043f\u0443\u0441\u0442\u0430 \u0438\u043b\u0438 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0438 \u043d\u0435\u0432\u0435\u0440\u043d\u044b.\n \"\"\"\n\n expected_headers = [\n '\u041a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440',\n '\u0412\u0440\u0435\u043c\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f',\n '\u0421\u0442\u0430\u0442\u0443\u0441',\n '\u0412\u0440\u0435\u043c\u044f \u0440\u0430\u0431\u043e\u0442\u044b',\n 'Image ID',\n 'Image \u0422\u042d\u0413'\n ]\n\n table_content = self.services_table.read(TableLocators.TABLE_WORK_AREA)\n\n if len(table_content) == 0:\n assert False, \"The contents of the table are missing\"\n\n actual_headers = table_content[0]\n\n self.check_equals(\n actual_headers,\n expected_headers,\n f\"Expected table headers {expected_headers} are not equal {actual_headers}\"\n )\n\n if len(table_content) == 1:\n assert False, \"Table body is missing\"\n\n def check_services_table_verticall_scrolling(self) -&gt; 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) -&gt; 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) -&gt; 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) -&gt; 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) -&gt; 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) -&gt; 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_presence(\n TableLocators.TABLE_WORK_AREA,\n \"Service statuses table is missing\"\n )\n</code></pre>"},{"location":"pages/service_status_tab/#pages.service_status_tab.ServiceStatusTab.__init__","title":"<code>__init__(page)</code>","text":"<p>\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'.</p> Source code in <code>pages\\service_status_tab.py</code> <pre><code>def __init__(self, page: Page) -&gt; 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</code></pre>"},{"location":"pages/service_status_tab/#pages.service_status_tab.ServiceStatusTab.check_services_table_content","title":"<code>check_services_table_content()</code>","text":"<p>\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.</p> <p>\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.</p> <p>Raises:</p> Type Description <code>AssertionError</code> <p>\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.</p> Source code in <code>pages\\service_status_tab.py</code> <pre><code>def check_services_table_content(self) -&gt; None:\n \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432.\n\n \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0438 \u0438 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435.\n\n\n\n\n Raises:\n AssertionError: \u0415\u0441\u043b\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u043f\u0443\u0441\u0442\u0430 \u0438\u043b\u0438 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0438 \u043d\u0435\u0432\u0435\u0440\u043d\u044b.\n \"\"\"\n\n expected_headers = [\n '\u041a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440',\n '\u0412\u0440\u0435\u043c\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f',\n '\u0421\u0442\u0430\u0442\u0443\u0441',\n '\u0412\u0440\u0435\u043c\u044f \u0440\u0430\u0431\u043e\u0442\u044b',\n 'Image ID',\n 'Image \u0422\u042d\u0413'\n ]\n\n table_content = self.services_table.read(TableLocators.TABLE_WORK_AREA)\n\n if len(table_content) == 0:\n assert False, \"The contents of the table are missing\"\n\n actual_headers = table_content[0]\n\n self.check_equals(\n actual_headers,\n expected_headers,\n f\"Expected table headers {expected_headers} are not equal {actual_headers}\"\n )\n\n if len(table_content) == 1:\n assert False, \"Table body is missing\"\n</code></pre>"},{"location":"pages/service_status_tab/#pages.service_status_tab.ServiceStatusTab.check_services_table_first_row_visibility","title":"<code>check_services_table_first_row_visibility()</code>","text":"<p>\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.</p> <p>Raises:</p> Type Description <code>AssertionError</code> <p>\u0415\u0441\u043b\u0438 \u0441\u0442\u0440\u043e\u043a\u0430 \u043d\u0435 \u0432\u0438\u0434\u043d\u0430.</p> Source code in <code>pages\\service_status_tab.py</code> <pre><code>def check_services_table_first_row_visibility(self) -&gt; 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</code></pre>"},{"location":"pages/service_status_tab/#pages.service_status_tab.ServiceStatusTab.check_services_table_last_row_visibility","title":"<code>check_services_table_last_row_visibility()</code>","text":"<p>\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.</p> <p>Raises:</p> Type Description <code>AssertionError</code> <p>\u0415\u0441\u043b\u0438 \u0441\u0442\u0440\u043e\u043a\u0430 \u043d\u0435 \u0432\u0438\u0434\u043d\u0430.</p> Source code in <code>pages\\service_status_tab.py</code> <pre><code>def check_services_table_last_row_visibility(self) -&gt; 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</code></pre>"},{"location":"pages/service_status_tab/#pages.service_status_tab.ServiceStatusTab.check_services_table_row_highlighting","title":"<code>check_services_table_row_highlighting(row_index)</code>","text":"<p>\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.</p> <p>Parameters:</p> Name Type Description Default <code>row_index</code> <code>int</code> <p>\u0418\u043d\u0434\u0435\u043a\u0441 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438.</p> required <p>Raises:</p> Type Description <code>AssertionError</code> <p>\u0415\u0441\u043b\u0438 \u0441\u0442\u0440\u043e\u043a\u0430 \u043d\u0435 \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u0430.</p> Source code in <code>pages\\service_status_tab.py</code> <pre><code>def check_services_table_row_highlighting(self, row_index: int) -&gt; 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</code></pre>"},{"location":"pages/service_status_tab/#pages.service_status_tab.ServiceStatusTab.check_services_table_verticall_scrolling","title":"<code>check_services_table_verticall_scrolling()</code>","text":"<p>\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.</p> <p>Returns:</p> Name Type Description <code>bool</code> <code>bool</code> <p>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.</p> Source code in <code>pages\\service_status_tab.py</code> <pre><code>def check_services_table_verticall_scrolling(self) -&gt; 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</code></pre>"},{"location":"pages/service_status_tab/#pages.service_status_tab.ServiceStatusTab.get_rows_count","title":"<code>get_rows_count()</code>","text":"<p>\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).</p> <p>Returns:</p> Name Type Description <code>int</code> <code>int</code> <p>\u041a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0441\u0442\u0440\u043e\u043a \u0441 \u0434\u0430\u043d\u043d\u044b\u043c\u0438.</p> <p>Raises:</p> Type Description <code>AssertionError</code> <p>\u0415\u0441\u043b\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u043f\u0443\u0441\u0442\u0430.</p> Source code in <code>pages\\service_status_tab.py</code> <pre><code>def get_rows_count(self) -&gt; int:\n \"\"\"\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0441\u0442\u0440\u043e\u043a \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435 (\u0431\u0435\u0437 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430).\n\n Returns:\n int: \u041a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0441\u0442\u0440\u043e\u043a \u0441 \u0434\u0430\u043d\u043d\u044b\u043c\u0438.\n\n Raises:\n AssertionError: \u0415\u0441\u043b\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u043f\u0443\u0441\u0442\u0430.\n \"\"\"\n\n table_content = self.services_table.read(TableLocators.TABLE_WORK_AREA)\n rows_count = len(table_content)\n\n if rows_count == 0:\n assert False, \"The contents of the table are missing\"\n\n return rows_count - 1\n</code></pre>"},{"location":"pages/service_status_tab/#pages.service_status_tab.ServiceStatusTab.scroll_services_table_down","title":"<code>scroll_services_table_down()</code>","text":"<p>\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.</p> Source code in <code>pages\\service_status_tab.py</code> <pre><code>def scroll_services_table_down(self) -&gt; 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</code></pre>"},{"location":"pages/service_status_tab/#pages.service_status_tab.ServiceStatusTab.scroll_services_table_up","title":"<code>scroll_services_table_up()</code>","text":"<p>\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.</p> Source code in <code>pages\\service_status_tab.py</code> <pre><code>def scroll_services_table_up(self) -&gt; 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</code></pre>"},{"location":"pages/service_status_tab/#pages.service_status_tab.ServiceStatusTab.should_be_services_table","title":"<code>should_be_services_table()</code>","text":"<p>\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.</p> <p>Raises:</p> Type Description <code>AssertionError</code> <p>\u0415\u0441\u043b\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442.</p> Source code in <code>pages\\service_status_tab.py</code> <pre><code>def should_be_services_table(self) -&gt; 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_presence(\n TableLocators.TABLE_WORK_AREA,\n \"Service statuses table is missing\"\n )\n</code></pre>"},{"location":"pages/service_status_tab/#pages.service_status_tab.ServiceStatusTab.should_be_toolbar","title":"<code>should_be_toolbar()</code>","text":"<p>\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.</p> <p>Raises:</p> Type Description <code>AssertionError</code> <p>\u0415\u0441\u043b\u0438 \u0442\u0443\u043b\u0431\u0430\u0440 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442.</p> Source code in <code>pages\\service_status_tab.py</code> <pre><code>def should_be_toolbar(self) -&gt; 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</code></pre>"},{"location":"pages/session_tab/","title":"SessionTab","text":"<p>\u041c\u043e\u0434\u0443\u043b\u044c \u0432\u043a\u043b\u0430\u0434\u043a\u0438 '\u0421\u0435\u0441\u0441\u0438\u044f'.</p> <p>\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\u0441\u0441\u0438\u0439. \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.</p>"},{"location":"pages/session_tab/#pages.session_tab.SessionsTab","title":"<code>SessionsTab</code>","text":"<p> Bases: <code>BasePage</code></p> <p>\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\u0441\u0441\u0438\u044f'.</p> <p>\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\u0441\u0441\u0438\u0439 \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0435\u0451 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f.</p> <p>Parameters:</p> Name Type Description Default <code>page</code> <code>Page</code> <p>\u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.</p> required Source code in <code>pages\\session_tab.py</code> <pre><code>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\u0441\u0441\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\u0441\u0441\u0438\u0439 \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) -&gt; 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\u0441\u0441\u0438\u044f'.\"\"\"\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) -&gt; int:\n \"\"\"\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0441\u0442\u0440\u043e\u043a \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435 (\u0431\u0435\u0437 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430).\n\n Returns:\n int: \u041a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0441\u0442\u0440\u043e\u043a \u0441 \u0434\u0430\u043d\u043d\u044b\u043c\u0438.\n\n Raises:\n AssertionError: \u0415\u0441\u043b\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u043f\u0443\u0441\u0442\u0430.\n \"\"\"\n\n table_content = self.sessions_table.read(TableLocators.TABLE_WORK_AREA)\n rows_count = len(table_content)\n\n if rows_count == 0:\n assert False, \"The contents of the table are missing\"\n\n return rows_count - 1\n\n def get_delete_session_button_from_row(self, row_index: int) -&gt; 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\u0441\u0441\u0438\u0438 \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) -&gt; 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) -&gt; int:\n \"\"\"\u0418\u0449\u0435\u0442 \u0441\u0435\u0441\u0441\u0438\u044e \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\n def scroll_sessions_table_up(self) -&gt; None:\n \"\"\"\u041f\u0440\u043e\u043a\u0440\u0443\u0447\u0438\u0432\u0430\u0435\u0442 \u0442\u0430\u0431\u043b\u0438\u0446\u0443 \u0441\u0435\u0441\u0441\u0438\u0439 \u0432\u0432\u0435\u0440\u0445.\"\"\"\n\n self.sessions_table.scroll_up(TableLocators.TABLE_SCROLL_CONTAINER)\n\n def scroll_sessions_table_down(self) -&gt; None:\n \"\"\"\u041f\u0440\u043e\u043a\u0440\u0443\u0447\u0438\u0432\u0430\u0435\u0442 \u0442\u0430\u0431\u043b\u0438\u0446\u0443 \u0441\u0435\u0441\u0441\u0438\u0439 \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\u0441\u0441\u0438\u0438. \"\"\"\n\n # \u041f\u043e\u0438\u0441\u043a \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435 \u0441\u0435\u0441\u0441\u0438\u0439 \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\u0441\u0441\u0438\u0438 \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 \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) -&gt; 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\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\n expected_headers = [\n 'ID \u0441\u0435\u0441\u0441\u0438\u0438',\n 'ID \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f',\n '\u0412\u0440\u0435\u043c\u044f \u0436\u0438\u0437\u043d\u0438',\n '\u0420\u043e\u043b\u044c',\n '\u0410\u0434\u0440\u0435\u0441'\n ]\n\n table_content = self.sessions_table.read(TableLocators.TABLE_WORK_AREA)\n len_table_content = len(table_content)\n\n if len_table_content == 0:\n assert False, \"The contents of the table are missing\"\n\n actual_headers = table_content[0]\n\n self.check_equals(\n actual_headers,\n expected_headers,\n f\"Expected table headers {expected_headers} are not equal {actual_headers}\"\n )\n\n if len_table_content == 1:\n assert False, \"Table body is missing\"\n\n if verify:\n self.verify_sessions_table_content(table_content)\n\n for index in range(len_table_content - 1):\n self.should_be_delete_button_on_sessions_table_row(index, \"\u0423\u0434\u0430\u043b\u0438\u0442\u044c\")\n\n def check_sessions_table_verticall_scrolling(self) -&gt; 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) -&gt; 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) -&gt; 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) -&gt; 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) -&gt; 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) -&gt; 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\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.sessions_table.check_presence(\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 ) -&gt; 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_session_button_from_row(row_index)\n delete_button.check_presence(\n f\"Delete session button is missing on {row_index} row\"\n )\n delete_button.check_tooltip_with_text(ButtonLocators.TOOLTIP, tooltip)\n\n def should_be_session_in_table(self, token: str) -&gt; None:\n \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0441\u0435\u0441\u0441\u0438\u0438 \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\u0441\u0441\u0438\u044f \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u0430.\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) -&gt; None:\n \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u0435 \u0441\u0435\u0441\u0441\u0438\u0438 \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\u0441\u0441\u0438\u044f \u043d\u0430\u0439\u0434\u0435\u043d\u0430.\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) -&gt; 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\u0441\u0441\u0438\u044f\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\u0441\u0441\u0438\u0438\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</code></pre>"},{"location":"pages/session_tab/#pages.session_tab.SessionsTab.__init__","title":"<code>__init__(page)</code>","text":"<p>\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\u0441\u0441\u0438\u044f'.</p> Source code in <code>pages\\session_tab.py</code> <pre><code>def __init__(self, page: Page) -&gt; 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\u0441\u0441\u0438\u044f'.\"\"\"\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</code></pre>"},{"location":"pages/session_tab/#pages.session_tab.SessionsTab.check_delete_session_confirm_window","title":"<code>check_delete_session_confirm_window()</code>","text":"<p>\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\u0441\u0441\u0438\u0438.</p> Source code in <code>pages\\session_tab.py</code> <pre><code>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\u0441\u0441\u0438\u0438. \"\"\"\n\n # \u041f\u043e\u0438\u0441\u043a \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435 \u0441\u0435\u0441\u0441\u0438\u0439 \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\u0441\u0441\u0438\u0438 \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 \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</code></pre>"},{"location":"pages/session_tab/#pages.session_tab.SessionsTab.check_sessions_table_content","title":"<code>check_sessions_table_content(verify=False)</code>","text":"<p>\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\u0439.</p> <p>Parameters:</p> Name Type Description Default <code>verify</code> <code>bool</code> <p>\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.</p> <code>False</code> <p>Raises:</p> Type Description <code>AssertionError</code> <p>\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.</p> Source code in <code>pages\\session_tab.py</code> <pre><code>def check_sessions_table_content(self, verify: bool = False) -&gt; 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\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\n expected_headers = [\n 'ID \u0441\u0435\u0441\u0441\u0438\u0438',\n 'ID \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f',\n '\u0412\u0440\u0435\u043c\u044f \u0436\u0438\u0437\u043d\u0438',\n '\u0420\u043e\u043b\u044c',\n '\u0410\u0434\u0440\u0435\u0441'\n ]\n\n table_content = self.sessions_table.read(TableLocators.TABLE_WORK_AREA)\n len_table_content = len(table_content)\n\n if len_table_content == 0:\n assert False, \"The contents of the table are missing\"\n\n actual_headers = table_content[0]\n\n self.check_equals(\n actual_headers,\n expected_headers,\n f\"Expected table headers {expected_headers} are not equal {actual_headers}\"\n )\n\n if len_table_content == 1:\n assert False, \"Table body is missing\"\n\n if verify:\n self.verify_sessions_table_content(table_content)\n\n for index in range(len_table_content - 1):\n self.should_be_delete_button_on_sessions_table_row(index, \"\u0423\u0434\u0430\u043b\u0438\u0442\u044c\")\n</code></pre>"},{"location":"pages/session_tab/#pages.session_tab.SessionsTab.check_sessions_table_first_row_visibility","title":"<code>check_sessions_table_first_row_visibility()</code>","text":"<p>\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.</p> <p>Raises:</p> Type Description <code>AssertionError</code> <p>\u0415\u0441\u043b\u0438 \u0441\u0442\u0440\u043e\u043a\u0430 \u043d\u0435 \u0432\u0438\u0434\u043d\u0430.</p> Source code in <code>pages\\session_tab.py</code> <pre><code>def check_sessions_table_first_row_visibility(self) -&gt; 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</code></pre>"},{"location":"pages/session_tab/#pages.session_tab.SessionsTab.check_sessions_table_last_row_visibility","title":"<code>check_sessions_table_last_row_visibility()</code>","text":"<p>\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.</p> <p>Raises:</p> Type Description <code>AssertionError</code> <p>\u0415\u0441\u043b\u0438 \u0441\u0442\u0440\u043e\u043a\u0430 \u043d\u0435 \u0432\u0438\u0434\u043d\u0430.</p> Source code in <code>pages\\session_tab.py</code> <pre><code>def check_sessions_table_last_row_visibility(self) -&gt; 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</code></pre>"},{"location":"pages/session_tab/#pages.session_tab.SessionsTab.check_sessions_table_row_highlighting","title":"<code>check_sessions_table_row_highlighting(row_index)</code>","text":"<p>\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.</p> <p>Parameters:</p> Name Type Description Default <code>row_index</code> <code>int</code> <p>\u0418\u043d\u0434\u0435\u043a\u0441 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438.</p> required <p>Raises:</p> Type Description <code>AssertionError</code> <p>\u0415\u0441\u043b\u0438 \u0441\u0442\u0440\u043e\u043a\u0430 \u043d\u0435 \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u0430.</p> Source code in <code>pages\\session_tab.py</code> <pre><code>def check_sessions_table_row_highlighting(self, row_index: int) -&gt; 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</code></pre>"},{"location":"pages/session_tab/#pages.session_tab.SessionsTab.check_sessions_table_verticall_scrolling","title":"<code>check_sessions_table_verticall_scrolling()</code>","text":"<p>\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.</p> <p>Returns:</p> Name Type Description <code>bool</code> <code>bool</code> <p>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.</p> Source code in <code>pages\\session_tab.py</code> <pre><code>def check_sessions_table_verticall_scrolling(self) -&gt; 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</code></pre>"},{"location":"pages/session_tab/#pages.session_tab.SessionsTab.find_session_in_table","title":"<code>find_session_in_table(token)</code>","text":"<p>\u0418\u0449\u0435\u0442 \u0441\u0435\u0441\u0441\u0438\u044e \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.</p> <p>Parameters:</p> Name Type Description Default <code>token</code> <code>str</code> <p>\u0422\u043e\u043a\u0435\u043d \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f</p> required <p>Returns:</p> Name Type Description <code>int</code> <code>int</code> <p>\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</p> <p>Raises:</p> Type Description <code>AssertionError</code> <p>\u0415\u0441\u043b\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u043f\u0443\u0441\u0442\u0430.</p> Source code in <code>pages\\session_tab.py</code> <pre><code>def find_session_in_table(self, token: str) -&gt; int:\n \"\"\"\u0418\u0449\u0435\u0442 \u0441\u0435\u0441\u0441\u0438\u044e \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</code></pre>"},{"location":"pages/session_tab/#pages.session_tab.SessionsTab.get_delete_session_button_from_row","title":"<code>get_delete_session_button_from_row(row_index)</code>","text":"<p>\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\u0441\u0441\u0438\u0438 \u0434\u043b\u044f \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438.</p> <p>Parameters:</p> Name Type Description Default <code>row_index</code> <code>int</code> <p>\u0418\u043d\u0434\u0435\u043a\u0441 \u0441\u0442\u0440\u043e\u043a\u0438 \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435.</p> required <p>Returns:</p> Name Type Description <code>TooltipButton</code> <code>TooltipButton</code> <p>\u041a\u043d\u043e\u043f\u043a\u0430 \u0441 \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u043e\u0439.</p> <p>Raises:</p> Type Description <code>AssertionError</code> <p>\u0415\u0441\u043b\u0438 \u0441\u0442\u0440\u043e\u043a\u0430 \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u0430.</p> Source code in <code>pages\\session_tab.py</code> <pre><code>def get_delete_session_button_from_row(self, row_index: int) -&gt; 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\u0441\u0441\u0438\u0438 \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</code></pre>"},{"location":"pages/session_tab/#pages.session_tab.SessionsTab.get_rows_count","title":"<code>get_rows_count()</code>","text":"<p>\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).</p> <p>Returns:</p> Name Type Description <code>int</code> <code>int</code> <p>\u041a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0441\u0442\u0440\u043e\u043a \u0441 \u0434\u0430\u043d\u043d\u044b\u043c\u0438.</p> <p>Raises:</p> Type Description <code>AssertionError</code> <p>\u0415\u0441\u043b\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u043f\u0443\u0441\u0442\u0430.</p> Source code in <code>pages\\session_tab.py</code> <pre><code>def get_rows_count(self) -&gt; int:\n \"\"\"\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0441\u0442\u0440\u043e\u043a \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435 (\u0431\u0435\u0437 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430).\n\n Returns:\n int: \u041a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0441\u0442\u0440\u043e\u043a \u0441 \u0434\u0430\u043d\u043d\u044b\u043c\u0438.\n\n Raises:\n AssertionError: \u0415\u0441\u043b\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u043f\u0443\u0441\u0442\u0430.\n \"\"\"\n\n table_content = self.sessions_table.read(TableLocators.TABLE_WORK_AREA)\n rows_count = len(table_content)\n\n if rows_count == 0:\n assert False, \"The contents of the table are missing\"\n\n return rows_count - 1\n</code></pre>"},{"location":"pages/session_tab/#pages.session_tab.SessionsTab.get_session_token","title":"<code>get_session_token()</code>","text":"<p>\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.</p> <p>Args:</p> <p>Returns:</p> Name Type Description <code>str</code> <code>str</code> <p>\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</p> <p>Raises:</p> Source code in <code>pages\\session_tab.py</code> <pre><code>def get_session_token(self) -&gt; 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</code></pre>"},{"location":"pages/session_tab/#pages.session_tab.SessionsTab.scroll_sessions_table_down","title":"<code>scroll_sessions_table_down()</code>","text":"<p>\u041f\u0440\u043e\u043a\u0440\u0443\u0447\u0438\u0432\u0430\u0435\u0442 \u0442\u0430\u0431\u043b\u0438\u0446\u0443 \u0441\u0435\u0441\u0441\u0438\u0439 \u0432\u043d\u0438\u0437.</p> Source code in <code>pages\\session_tab.py</code> <pre><code>def scroll_sessions_table_down(self) -&gt; None:\n \"\"\"\u041f\u0440\u043e\u043a\u0440\u0443\u0447\u0438\u0432\u0430\u0435\u0442 \u0442\u0430\u0431\u043b\u0438\u0446\u0443 \u0441\u0435\u0441\u0441\u0438\u0439 \u0432\u043d\u0438\u0437.\"\"\"\n\n self.sessions_table.scroll_down(TableLocators.TABLE_SCROLL_CONTAINER)\n</code></pre>"},{"location":"pages/session_tab/#pages.session_tab.SessionsTab.scroll_sessions_table_up","title":"<code>scroll_sessions_table_up()</code>","text":"<p>\u041f\u0440\u043e\u043a\u0440\u0443\u0447\u0438\u0432\u0430\u0435\u0442 \u0442\u0430\u0431\u043b\u0438\u0446\u0443 \u0441\u0435\u0441\u0441\u0438\u0439 \u0432\u0432\u0435\u0440\u0445.</p> Source code in <code>pages\\session_tab.py</code> <pre><code>def scroll_sessions_table_up(self) -&gt; None:\n \"\"\"\u041f\u0440\u043e\u043a\u0440\u0443\u0447\u0438\u0432\u0430\u0435\u0442 \u0442\u0430\u0431\u043b\u0438\u0446\u0443 \u0441\u0435\u0441\u0441\u0438\u0439 \u0432\u0432\u0435\u0440\u0445.\"\"\"\n\n self.sessions_table.scroll_up(TableLocators.TABLE_SCROLL_CONTAINER)\n</code></pre>"},{"location":"pages/session_tab/#pages.session_tab.SessionsTab.should_be_delete_button_on_sessions_table_row","title":"<code>should_be_delete_button_on_sessions_table_row(row_index, tooltip)</code>","text":"<p>\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.</p> <p>Parameters:</p> Name Type Description Default <code>row_index</code> <code>int</code> <p>\u0418\u043d\u0434\u0435\u043a\u0441 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438.</p> required <code>tooltip</code> <code>str</code> <p>\u041e\u0436\u0438\u0434\u0430\u0435\u043c\u044b\u0439 \u0442\u0435\u043a\u0441\u0442 \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0438.</p> required <p>Raises:</p> Type Description <code>AssertionError</code> <p>\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.</p> Source code in <code>pages\\session_tab.py</code> <pre><code>def should_be_delete_button_on_sessions_table_row(\n self,\n row_index: int,\n tooltip: str\n) -&gt; 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_session_button_from_row(row_index)\n delete_button.check_presence(\n f\"Delete session button is missing on {row_index} row\"\n )\n delete_button.check_tooltip_with_text(ButtonLocators.TOOLTIP, tooltip)\n</code></pre>"},{"location":"pages/session_tab/#pages.session_tab.SessionsTab.should_be_session_in_table","title":"<code>should_be_session_in_table(token)</code>","text":"<p>\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0441\u0435\u0441\u0441\u0438\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435.</p> <p>Parameters:</p> Name Type Description Default <code>token</code> <code>str</code> <p>\u0422\u043e\u043a\u0435\u043d \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f</p> required <p>Raises:</p> Type Description <code>AssertionError</code> <p>\u0415\u0441\u043b\u0438 \u0441\u0435\u0441\u0441\u0438\u044f \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u0430.</p> Source code in <code>pages\\session_tab.py</code> <pre><code>def should_be_session_in_table(self, token: str) -&gt; None:\n \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0441\u0435\u0441\u0441\u0438\u0438 \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\u0441\u0441\u0438\u044f \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u0430.\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</code></pre>"},{"location":"pages/session_tab/#pages.session_tab.SessionsTab.should_be_sessions_table","title":"<code>should_be_sessions_table()</code>","text":"<p>\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\u0439.</p> <p>Raises:</p> Type Description <code>AssertionError</code> <p>\u0415\u0441\u043b\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442.</p> Source code in <code>pages\\session_tab.py</code> <pre><code>def should_be_sessions_table(self) -&gt; 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\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.sessions_table.check_presence(\n TableLocators.TABLE_WORK_AREA,\n \"Sessions table is missing\"\n )\n</code></pre>"},{"location":"pages/session_tab/#pages.session_tab.SessionsTab.should_be_toolbar","title":"<code>should_be_toolbar()</code>","text":"<p>\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.</p> <p>Raises:</p> Type Description <code>AssertionError</code> <p>\u0415\u0441\u043b\u0438 \u0442\u0443\u043b\u0431\u0430\u0440 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442.</p> Source code in <code>pages\\session_tab.py</code> <pre><code>def should_be_toolbar(self) -&gt; 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</code></pre>"},{"location":"pages/session_tab/#pages.session_tab.SessionsTab.should_not_be_session_in_table","title":"<code>should_not_be_session_in_table(token)</code>","text":"<p>\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u0435 \u0441\u0435\u0441\u0441\u0438\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435.</p> <p>Parameters:</p> Name Type Description Default <code>token</code> <code>str</code> <p>\u0422\u043e\u043a\u0435\u043d \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f</p> required <p>Raises:</p> Type Description <code>AssertionError</code> <p>\u0415\u0441\u043b\u0438 \u0441\u0435\u0441\u0441\u0438\u044f \u043d\u0430\u0439\u0434\u0435\u043d\u0430.</p> Source code in <code>pages\\session_tab.py</code> <pre><code>def should_not_be_session_in_table(self, token: str) -&gt; None:\n \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u0435 \u0441\u0435\u0441\u0441\u0438\u0438 \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\u0441\u0441\u0438\u044f \u043d\u0430\u0439\u0434\u0435\u043d\u0430.\n \"\"\"\n found = self.find_session_in_table(token) \n if found != -1:\n assert False, \"Session for this token has been found\"\n</code></pre>"},{"location":"pages/session_tab/#pages.session_tab.SessionsTab.verify_sessions_table_content","title":"<code>verify_sessions_table_content(sessions_table)</code>","text":"<p>\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.</p> <p>Parameters:</p> Name Type Description Default <code>sessions_table</code> <code>list</code> <p>\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.</p> required <p>Raises:</p> Type Description <code>AssertionError</code> <p>\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.</p> Source code in <code>pages\\session_tab.py</code> <pre><code>def verify_sessions_table_content(self, sessions_table: list) -&gt; 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\u0441\u0441\u0438\u044f\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\u0441\u0441\u0438\u0438\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</code></pre>"},{"location":"pages/users_tab/","title":"UsersTab","text":"<p>\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'.</p> <p>\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.</p>"},{"location":"pages/users_tab/#pages.users_tab.UsersTab","title":"<code>UsersTab</code>","text":"<p> Bases: <code>BasePage</code></p> <p>\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'.</p> <p>\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.</p> <p>Parameters:</p> Name Type Description Default <code>page</code> <code>Page</code> <p>\u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.</p> required Source code in <code>pages\\users_tab.py</code> <pre><code>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) -&gt; 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_button(locator_button_1, \"edit\")\n self.toolbar.add_button(locator_button_1, \"add_user\")\n self.toolbar.add_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) -&gt; 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_user\":\n self.modal_windows[\"add_user\"] = AddUserModalWindow(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) -&gt; None:\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) -&gt; 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) -&gt; 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) -&gt; 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_user_window_by_toolbar_button(self) -&gt; 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_user\")\n\n def close_add_user_window(self) -&gt; 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_user\")\n\n def close_edit_user_window_by_toolbar_button(self, title: str) -&gt; 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) -&gt; 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 def add_new_user(self, user_data: dict) -&gt; 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 self.get_modal_window(\"add_user\").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) -&gt; 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) -&gt; 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) -&gt; 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) &gt; 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) -&gt; 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) -&gt; 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_presence(\"edit\")\n self.toolbar.click_button(\"edit\")\n\n self.toolbar.check_button_presence(\"add_user\")\n self.toolbar.click_button(\"add_user\")\n self.add_modal_window(\"add_user\", \"\")\n self.get_modal_window(\"add_user\").check_by_window_title()\n\n def open_edit_user_page_by_index(self, row_index: int) -&gt; 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 &gt;= 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) -&gt; 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 # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0438:\n def check_users_table_content(self, verify: bool = False) -&gt; 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) -&gt; 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 self.get_modal_window(\"add_user\").check_content()\n\n def check_edit_user_window_content(self, user_name: str, role: str) -&gt; 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) -&gt; 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_presence(\"edit\")\n\n def should_be_toolbar_buttons(self) -&gt; 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_presence(\"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_presence(\"add_user\")\n self.toolbar.check_button_presence(\"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_presence(\"edit\")\n\n def should_be_users_table(self) -&gt; 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_presence(\n TableLocators.TABLE_WORK_AREA,\n \"Users table is missing\"\n )\n\n def should_be_user_in_table(self, name: str, role: str) -&gt; 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) -&gt; 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) -&gt; 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</code></pre>"},{"location":"pages/users_tab/#pages.users_tab.UsersTab.__init__","title":"<code>__init__(page)</code>","text":"<p>\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'.</p> Source code in <code>pages\\users_tab.py</code> <pre><code>def __init__(self, page: Page) -&gt; 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_button(locator_button_1, \"edit\")\n self.toolbar.add_button(locator_button_1, \"add_user\")\n self.toolbar.add_button(locator_button_2, \"close\")\n\n self.users_table = TableComponent(page)\n self.modal_windows = {}\n self.alert = AlertComponent(page)\n</code></pre>"},{"location":"pages/users_tab/#pages.users_tab.UsersTab.add_modal_window","title":"<code>add_modal_window(window_type, title)</code>","text":"<p>\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.</p> <p>Parameters:</p> Name Type Description Default <code>window_type</code> <code>str</code> <p>\u0422\u0438\u043f \u043e\u043a\u043d\u0430 ('add_user' \u0438\u043b\u0438 'edit_user').</p> required <code>title</code> <code>str</code> <p>\u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a \u043e\u043a\u043d\u0430.</p> required <p>Raises:</p> Type Description <code>AssertionError</code> <p>\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.</p> Source code in <code>pages\\users_tab.py</code> <pre><code>def add_modal_window(self, window_type: str, title: str) -&gt; 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_user\":\n self.modal_windows[\"add_user\"] = AddUserModalWindow(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</code></pre>"},{"location":"pages/users_tab/#pages.users_tab.UsersTab.add_new_user","title":"<code>add_new_user(user_data)</code>","text":"<p>\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.</p> <p>Parameters:</p> Name Type Description Default <code>user_data</code> <code>dict</code> <p>\u0414\u0430\u043d\u043d\u044b\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f (name, role, password).</p> required <p>Returns:</p> Name Type Description <code>bool</code> <code>bool</code> <p>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.</p> <p>Raises:</p> Type Description <code>AssertionError</code> <p>\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.</p> Source code in <code>pages\\users_tab.py</code> <pre><code>def add_new_user(self, user_data: dict) -&gt; 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 self.get_modal_window(\"add_user\").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</code></pre>"},{"location":"pages/users_tab/#pages.users_tab.UsersTab.check_add_user_window_content","title":"<code>check_add_user_window_content()</code>","text":"<p>\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.</p> Source code in <code>pages\\users_tab.py</code> <pre><code>def check_add_user_window_content(self) -&gt; 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 self.get_modal_window(\"add_user\").check_content()\n</code></pre>"},{"location":"pages/users_tab/#pages.users_tab.UsersTab.check_edit_user_window_content","title":"<code>check_edit_user_window_content(user_name, role)</code>","text":"<p>\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.</p> <p>Parameters:</p> Name Type Description Default <code>user_name</code> <code>str</code> <p>\u0418\u043c\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.</p> required <code>role</code> <code>str</code> <p>\u0420\u043e\u043b\u044c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.</p> required Source code in <code>pages\\users_tab.py</code> <pre><code>def check_edit_user_window_content(self, user_name: str, role: str) -&gt; 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</code></pre>"},{"location":"pages/users_tab/#pages.users_tab.UsersTab.check_users_table_content","title":"<code>check_users_table_content(verify=False)</code>","text":"<p>\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.</p> <p>Parameters:</p> Name Type Description Default <code>verify</code> <code>bool</code> <p>\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.</p> <code>False</code> <p>Raises:</p> Type Description <code>AssertionError</code> <p>\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.</p> Source code in <code>pages\\users_tab.py</code> <pre><code>def check_users_table_content(self, verify: bool = False) -&gt; 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</code></pre>"},{"location":"pages/users_tab/#pages.users_tab.UsersTab.close_add_user_window","title":"<code>close_add_user_window()</code>","text":"<p>\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.</p> Source code in <code>pages\\users_tab.py</code> <pre><code>def close_add_user_window(self) -&gt; 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_user\")\n</code></pre>"},{"location":"pages/users_tab/#pages.users_tab.UsersTab.close_add_user_window_by_toolbar_button","title":"<code>close_add_user_window_by_toolbar_button()</code>","text":"<p>\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.</p> Source code in <code>pages\\users_tab.py</code> <pre><code>def close_add_user_window_by_toolbar_button(self) -&gt; 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_user\")\n</code></pre>"},{"location":"pages/users_tab/#pages.users_tab.UsersTab.close_edit_user_window","title":"<code>close_edit_user_window(title)</code>","text":"<p>\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.</p> <p>Parameters:</p> Name Type Description Default <code>title</code> <code>str</code> <p>\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).</p> required Source code in <code>pages\\users_tab.py</code> <pre><code>def close_edit_user_window(self, title: str) -&gt; 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</code></pre>"},{"location":"pages/users_tab/#pages.users_tab.UsersTab.close_edit_user_window_by_toolbar_button","title":"<code>close_edit_user_window_by_toolbar_button(title)</code>","text":"<p>\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.</p> <p>Parameters:</p> Name Type Description Default <code>title</code> <code>str</code> <p>\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).</p> required Source code in <code>pages\\users_tab.py</code> <pre><code>def close_edit_user_window_by_toolbar_button(self, title: str) -&gt; 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</code></pre>"},{"location":"pages/users_tab/#pages.users_tab.UsersTab.close_modal_window","title":"<code>close_modal_window(title)</code>","text":"<p>\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.</p> <p>Parameters:</p> Name Type Description Default <code>title</code> <code>str</code> <p>\u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a \u043e\u043a\u043d\u0430.</p> required Source code in <code>pages\\users_tab.py</code> <pre><code>def close_modal_window(self, title: str) -&gt; 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</code></pre>"},{"location":"pages/users_tab/#pages.users_tab.UsersTab.close_modal_window_by_toolbar_button","title":"<code>close_modal_window_by_toolbar_button(title)</code>","text":"<p>\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.</p> <p>Parameters:</p> Name Type Description Default <code>title</code> <code>str</code> <p>\u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a \u043e\u043a\u043d\u0430.</p> required Source code in <code>pages\\users_tab.py</code> <pre><code>def close_modal_window_by_toolbar_button(self, title: str) -&gt; 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</code></pre>"},{"location":"pages/users_tab/#pages.users_tab.UsersTab.delete_modal_window","title":"<code>delete_modal_window(title)</code>","text":"<p>\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.</p> <p>Parameters:</p> Name Type Description Default <code>title</code> <code>str</code> <p>\u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a \u043e\u043a\u043d\u0430.</p> required <p>Raises:</p> Type Description <code>AssertionError</code> <p>\u0415\u0441\u043b\u0438 \u043e\u043a\u043d\u043e \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u043e.</p> Source code in <code>pages\\users_tab.py</code> <pre><code>def delete_modal_window(self, title: str) -&gt; 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</code></pre>"},{"location":"pages/users_tab/#pages.users_tab.UsersTab.delete_user","title":"<code>delete_user(user_name)</code>","text":"<p>\u0423\u0434\u0430\u043b\u044f\u0435\u0442 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.</p> <p>Parameters:</p> Name Type Description Default <code>user_name</code> <code>str</code> <p>\u0418\u043c\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.</p> required <p>Raises:</p> Type Description <code>AssertionError</code> <p>\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.</p> Source code in <code>pages\\users_tab.py</code> <pre><code>def delete_user(self, user_name: str) -&gt; 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</code></pre>"},{"location":"pages/users_tab/#pages.users_tab.UsersTab.edit_user","title":"<code>edit_user(user_name, user_data)</code>","text":"<p>\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.</p> <p>Parameters:</p> Name Type Description Default <code>user_name</code> <code>str</code> <p>\u0418\u043c\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.</p> required <code>user_data</code> <code>dict</code> <p>\u041d\u043e\u0432\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.</p> required <p>Raises:</p> Type Description <code>AssertionError</code> <p>\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.</p> Source code in <code>pages\\users_tab.py</code> <pre><code>def edit_user(self, user_name: str, user_data: dict) -&gt; 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</code></pre>"},{"location":"pages/users_tab/#pages.users_tab.UsersTab.find_user_in_table","title":"<code>find_user_in_table(name, role)</code>","text":"<p>\u0418\u0449\u0435\u0442 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435.</p> <p>Parameters:</p> Name Type Description Default <code>name</code> <code>str</code> <p>\u0418\u043c\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.</p> required <code>role</code> <code>str</code> <p>\u0420\u043e\u043b\u044c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.</p> required <p>Returns:</p> Name Type Description <code>int</code> <code>int</code> <p>\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.</p> <p>Raises:</p> Type Description <code>AssertionError</code> <p>\u0415\u0441\u043b\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u043f\u0443\u0441\u0442\u0430.</p> Source code in <code>pages\\users_tab.py</code> <pre><code>def find_user_in_table(self, name: str, role: str) -&gt; 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</code></pre>"},{"location":"pages/users_tab/#pages.users_tab.UsersTab.get_modal_window","title":"<code>get_modal_window(title)</code>","text":"<p>\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.</p> <p>Parameters:</p> Name Type Description Default <code>title</code> <code>str</code> <p>\u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a \u043e\u043a\u043d\u0430.</p> required <p>Returns:</p> Name Type Description <code>ModalWindowComponent</code> <code>None</code> <p>\u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430.</p> <p>Raises:</p> Type Description <code>AssertionError</code> <p>\u0415\u0441\u043b\u0438 \u043e\u043a\u043d\u043e \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u043e.</p> Source code in <code>pages\\users_tab.py</code> <pre><code>def get_modal_window(self, title: str) -&gt; None:\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</code></pre>"},{"location":"pages/users_tab/#pages.users_tab.UsersTab.open_add_user_window","title":"<code>open_add_user_window()</code>","text":"<p>\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.</p> <p>Raises:</p> Type Description <code>AssertionError</code> <p>\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.</p> Source code in <code>pages\\users_tab.py</code> <pre><code>def open_add_user_window(self) -&gt; 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_presence(\"edit\")\n self.toolbar.click_button(\"edit\")\n\n self.toolbar.check_button_presence(\"add_user\")\n self.toolbar.click_button(\"add_user\")\n self.add_modal_window(\"add_user\", \"\")\n self.get_modal_window(\"add_user\").check_by_window_title()\n</code></pre>"},{"location":"pages/users_tab/#pages.users_tab.UsersTab.open_edit_user_page_by_index","title":"<code>open_edit_user_page_by_index(row_index)</code>","text":"<p>\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.</p> <p>Parameters:</p> Name Type Description Default <code>row_index</code> <code>int</code> <p>\u0418\u043d\u0434\u0435\u043a\u0441 \u0441\u0442\u0440\u043e\u043a\u0438 \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435.</p> required <p>Returns:</p> Name Type Description <code>tuple</code> <code>tuple</code> <p>(\u0438\u043c\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f, \u0440\u043e\u043b\u044c).</p> <p>Raises:</p> Type Description <code>AssertionError</code> <p>\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.</p> Source code in <code>pages\\users_tab.py</code> <pre><code>def open_edit_user_page_by_index(self, row_index: int) -&gt; 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 &gt;= 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</code></pre>"},{"location":"pages/users_tab/#pages.users_tab.UsersTab.open_edit_user_page_by_user","title":"<code>open_edit_user_page_by_user(user_name, role)</code>","text":"<p>\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.</p> <p>Parameters:</p> Name Type Description Default <code>user_name</code> <code>str</code> <p>\u0418\u043c\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.</p> required <code>role</code> <code>str</code> <p>\u0420\u043e\u043b\u044c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.</p> required <p>Raises:</p> Type Description <code>AssertionError</code> <p>\u0415\u0441\u043b\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d.</p> Source code in <code>pages\\users_tab.py</code> <pre><code>def open_edit_user_page_by_user(self, user_name: str, role: str) -&gt; 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</code></pre>"},{"location":"pages/users_tab/#pages.users_tab.UsersTab.reset_password","title":"<code>reset_password(user_name)</code>","text":"<p>\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.</p> <p>Parameters:</p> Name Type Description Default <code>user_name</code> <code>str</code> <p>\u0418\u043c\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.</p> required <p>Returns:</p> Name Type Description <code>str</code> <code>str</code> <p>\u041d\u043e\u0432\u044b\u0439 \u043f\u0430\u0440\u043e\u043b\u044c (\u0435\u0441\u043b\u0438 \u043f\u043e\u043b\u0443\u0447\u0435\u043d).</p> Source code in <code>pages\\users_tab.py</code> <pre><code>def reset_password(self, user_name: str) -&gt; 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) &gt; 0:\n new_password = re.findall(r'[\\d]+', alert_message)[0]\n\n return new_password\n</code></pre>"},{"location":"pages/users_tab/#pages.users_tab.UsersTab.should_be_toolbar","title":"<code>should_be_toolbar()</code>","text":"<p>\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0442\u0443\u043b\u0431\u0430\u0440\u0430.</p> <p>Raises:</p> Type Description <code>AssertionError</code> <p>\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.</p> Source code in <code>pages\\users_tab.py</code> <pre><code>def should_be_toolbar(self) -&gt; 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_presence(\"edit\")\n</code></pre>"},{"location":"pages/users_tab/#pages.users_tab.UsersTab.should_be_toolbar_buttons","title":"<code>should_be_toolbar_buttons()</code>","text":"<p>\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.</p> <p>Raises:</p> Type Description <code>AssertionError</code> <p>\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.</p> Source code in <code>pages\\users_tab.py</code> <pre><code>def should_be_toolbar_buttons(self) -&gt; 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_presence(\"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_presence(\"add_user\")\n self.toolbar.check_button_presence(\"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_presence(\"edit\")\n</code></pre>"},{"location":"pages/users_tab/#pages.users_tab.UsersTab.should_be_user_in_table","title":"<code>should_be_user_in_table(name, role)</code>","text":"<p>\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.</p> <p>Parameters:</p> Name Type Description Default <code>name</code> <code>str</code> <p>\u0418\u043c\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.</p> required <code>role</code> <code>str</code> <p>\u0420\u043e\u043b\u044c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.</p> required <p>Raises:</p> Type Description <code>AssertionError</code> <p>\u0415\u0441\u043b\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d.</p> Source code in <code>pages\\users_tab.py</code> <pre><code>def should_be_user_in_table(self, name: str, role: str) -&gt; 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</code></pre>"},{"location":"pages/users_tab/#pages.users_tab.UsersTab.should_be_users_table","title":"<code>should_be_users_table()</code>","text":"<p>\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.</p> <p>Raises:</p> Type Description <code>AssertionError</code> <p>\u0415\u0441\u043b\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442.</p> Source code in <code>pages\\users_tab.py</code> <pre><code>def should_be_users_table(self) -&gt; 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_presence(\n TableLocators.TABLE_WORK_AREA,\n \"Users table is missing\"\n )\n</code></pre>"},{"location":"pages/users_tab/#pages.users_tab.UsersTab.should_not_be_user_in_table","title":"<code>should_not_be_user_in_table(name, role)</code>","text":"<p>\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.</p> <p>Parameters:</p> Name Type Description Default <code>name</code> <code>str</code> <p>\u0418\u043c\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.</p> required <code>role</code> <code>str</code> <p>\u0420\u043e\u043b\u044c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.</p> required <p>Raises:</p> Type Description <code>AssertionError</code> <p>\u0415\u0441\u043b\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u043d\u0430\u0439\u0434\u0435\u043d.</p> Source code in <code>pages\\users_tab.py</code> <pre><code>def should_not_be_user_in_table(self, name: str, role: str) -&gt; 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</code></pre>"},{"location":"pages/users_tab/#pages.users_tab.UsersTab.verify_users_table_content","title":"<code>verify_users_table_content(users_table)</code>","text":"<p>\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.</p> <p>Parameters:</p> Name Type Description Default <code>users_table</code> <code>list</code> <p>\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.</p> required <p>Raises:</p> Type Description <code>AssertionError</code> <p>\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.</p> Source code in <code>pages\\users_tab.py</code> <pre><code>def verify_users_table_content(self, users_table: list) -&gt; 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</code></pre>"},{"location":"tests/components/test_json_container/","title":"TestJsonContainer","text":"<p>\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.</p> <p>\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.</p>"},{"location":"tests/components/test_json_container/#tests.components.test_json_container.TestJsonContainer","title":"<code>TestJsonContainer</code>","text":"<p>\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.</p> Source code in <code>tests\\components\\test_json_container.py</code> <pre><code>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) -&gt; 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) -&gt; 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</code></pre>"},{"location":"tests/components/test_json_container/#tests.components.test_json_container.TestJsonContainer.setup","title":"<code>setup(browser)</code>","text":"<p>\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.</p> <p>Parameters:</p> Name Type Description Default <code>browser</code> <code>Page</code> <p>\u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.</p> required Source code in <code>tests\\components\\test_json_container.py</code> <pre><code>@pytest.fixture(scope=\"function\", autouse=True)\ndef setup(self, browser: Page) -&gt; 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</code></pre>"},{"location":"tests/components/test_json_container/#tests.components.test_json_container.TestJsonContainer.test_verticall_scrolling","title":"<code>test_verticall_scrolling(browser)</code>","text":"<p>\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.</p> <p>Parameters:</p> Name Type Description Default <code>browser</code> <code>Page</code> <p>\u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.</p> required Steps <ol> <li>\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</li> <li>\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</li> <li>\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</li> </ol> Source code in <code>tests\\components\\test_json_container.py</code> <pre><code>def test_verticall_scrolling(self, browser: Page) -&gt; 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</code></pre>"},{"location":"tests/components/test_navigation_panel/","title":"TestNavigationPanel","text":"<p>\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.</p> <p>\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.</p>"},{"location":"tests/components/test_navigation_panel/#tests.components.test_navigation_panel.TestNavigationPanel","title":"<code>TestNavigationPanel</code>","text":"<p>\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.</p> \u0410\u0442\u0440\u0438\u0431\u0443\u0442\u044b <p>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.</p> Source code in <code>tests\\components\\test_navigation_panel.py</code> <pre><code>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</code></pre>"},{"location":"tests/components/test_navigation_panel/#tests.components.test_navigation_panel.TestNavigationPanel.test_verticall_scrolling","title":"<code>test_verticall_scrolling(browser)</code>","text":"<p>\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.</p> <p>Parameters:</p> Name Type Description Default <code>browser</code> <code>Page</code> <p>\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.</p> required <p>Raises:</p> Type Description <code>AssertionError</code> <p>\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.</p> Source code in <code>tests\\components\\test_navigation_panel.py</code> <pre><code>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</code></pre>"},{"location":"tests/components/test_services_table/","title":"TestServiceStatusTable","text":"<p>\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.</p> <p>\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.</p>"},{"location":"tests/components/test_services_table/#tests.components.test_services_table.TestServiceStatusTable","title":"<code>TestServiceStatusTable</code>","text":"<p>\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.</p> Source code in <code>tests\\components\\test_services_table.py</code> <pre><code>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) -&gt; 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) -&gt; 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</code></pre>"},{"location":"tests/components/test_services_table/#tests.components.test_services_table.TestServiceStatusTable.setup","title":"<code>setup(browser)</code>","text":"<p>\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.</p> <p>Parameters:</p> Name Type Description Default <code>browser</code> <code>Page</code> <p>\u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.</p> required Source code in <code>tests\\components\\test_services_table.py</code> <pre><code>@pytest.fixture(scope=\"function\", autouse=True)\ndef setup(self, browser: Page) -&gt; 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</code></pre>"},{"location":"tests/components/test_services_table/#tests.components.test_services_table.TestServiceStatusTable.test_scrolling","title":"<code>test_scrolling(browser)</code>","text":"<p>\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.</p> <p>Parameters:</p> Name Type Description Default <code>browser</code> <code>Page</code> <p>\u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.</p> required Steps <ol> <li>\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</li> <li>\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</li> <li>\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</li> <li>\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</li> </ol> Source code in <code>tests\\components\\test_services_table.py</code> <pre><code>def test_scrolling(self, browser: Page) -&gt; 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</code></pre>"},{"location":"tests/components/test_user_modal_window/","title":"TestUsersModalWindow","text":"<p>\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.</p> <p>\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.</p>"},{"location":"tests/components/test_user_modal_window/#tests.components.test_user_modal_window.TestUsersModalWindow","title":"<code>TestUsersModalWindow</code>","text":"<p>\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.</p> Source code in <code>tests\\components\\test_user_modal_window.py</code> <pre><code>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) -&gt; 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) -&gt; 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_presence(\"close\")\n ut.wait_for_timeout(3000)\n\n modal_window.scroll_window_up()\n modal_window.check_toolbar_button_presence(\"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) -&gt; 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_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_presence(\"close\")\n ut.wait_for_timeout(3000)\n\n modal_window.scroll_window_up()\n modal_window.check_toolbar_button_presence(\"close\")\n ut.wait_for_timeout(3000)\n</code></pre>"},{"location":"tests/components/test_user_modal_window/#tests.components.test_user_modal_window.TestUsersModalWindow.setup","title":"<code>setup(browser)</code>","text":"<p>\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.</p> <p>Parameters:</p> Name Type Description Default <code>browser</code> <code>Page</code> <p>\u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.</p> required Source code in <code>tests\\components\\test_user_modal_window.py</code> <pre><code>@pytest.fixture(scope=\"function\", autouse=True)\ndef setup(self, browser: Page) -&gt; 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</code></pre>"},{"location":"tests/components/test_user_modal_window/#tests.components.test_user_modal_window.TestUsersModalWindow.test_add_user_window_scrolling","title":"<code>test_add_user_window_scrolling(browser)</code>","text":"<p>\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.</p> <p>Parameters:</p> Name Type Description Default <code>browser</code> <code>Page</code> <p>\u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.</p> required Steps <ol> <li>\u041e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u043e\u043a\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f</li> <li>\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</li> </ol> Source code in <code>tests\\components\\test_user_modal_window.py</code> <pre><code>def test_add_user_window_scrolling(self, browser: Page) -&gt; 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_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_presence(\"close\")\n ut.wait_for_timeout(3000)\n\n modal_window.scroll_window_up()\n modal_window.check_toolbar_button_presence(\"close\")\n ut.wait_for_timeout(3000)\n</code></pre>"},{"location":"tests/components/test_user_modal_window/#tests.components.test_user_modal_window.TestUsersModalWindow.test_edit_user_window_scrolling","title":"<code>test_edit_user_window_scrolling(browser)</code>","text":"<p>\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.</p> <p>Parameters:</p> Name Type Description Default <code>browser</code> <code>Page</code> <p>\u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.</p> required Steps <ol> <li>\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</li> <li>\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</li> <li>\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</li> </ol> Source code in <code>tests\\components\\test_user_modal_window.py</code> <pre><code>@pytest.mark.develop\ndef test_edit_user_window_scrolling(self, browser: Page) -&gt; 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_presence(\"close\")\n ut.wait_for_timeout(3000)\n\n modal_window.scroll_window_up()\n modal_window.check_toolbar_button_presence(\"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</code></pre>"},{"location":"tests/e2e/test_expand_navigation_panel/","title":"TestNavigationPanel","text":"<p>\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.</p> <p>\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.</p>"},{"location":"tests/e2e/test_expand_navigation_panel/#tests.e2e.test_expand_navigation_panel.TestNavigationPanel","title":"<code>TestNavigationPanel</code>","text":"<p>\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.</p> \u0410\u0442\u0440\u0438\u0431\u0443\u0442\u044b <p>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.</p> Source code in <code>tests\\e2e\\test_expand_navigation_panel.py</code> <pre><code>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_expand_panel(self, browser: Page):\n \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043f\u043e\u043b\u043d\u043e\u0435 \u0440\u0430\u0441\u043a\u0440\u044b\u0442\u0438\u0435 \u043f\u0430\u043d\u0435\u043b\u0438 \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438.\n\n Args:\n browser: \u0424\u0438\u043a\u0441\u0442\u0443\u0440\u0430 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u043e\u043c.\n\n \"\"\"\n\n # \u0414\u0435\u0439\u0441\u0442\u0432\u0438\u044f:\n lp = LoginPage(browser)\n lp.do_login()\n\n # \u041c\u044b \u043d\u0430 \u0433\u043b\u0430\u0432\u043d\u043e\u0439 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435\n mp = MainPage(browser)\n\n # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0438:\n # \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u043f\u0430\u043d\u0435\u043b\u0438 \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438\n mp.should_be_navigation_panel()\n\n # \u041e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u043c \u0432\u0441\u0435 \u043f\u0443\u043d\u043a\u0442\u044b \u043f\u0430\u043d\u0435\u043b\u0438\n mp.click_main_navigation_panel_item(\"\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438\")\n\n mp.expand_navigation_subpanel()\n\n mp.click_main_navigation_panel_item(\"\u041e\u0431\u044a\u0435\u043a\u0442\u044b\")\n mp.wait_for_timeout(300)\n\n mp.expand_navigation_subpanel()\n\n def test_sub_panel_item_click(self, browser: Page):\n \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043a\u043b\u0438\u043a\u0430 \u0437\u0430\u0434\u0430\u043d\u043d\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0432 \u043f\u043e\u0434\u043f\u0430\u043d\u0435\u043b\u0438 \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438.\n\n Args:\n browser: \u0424\u0438\u043a\u0441\u0442\u0443\u0440\u0430 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u043e\u043c.\n\n \"\"\"\n\n # \u0414\u0435\u0439\u0441\u0442\u0432\u0438\u044f:\n lp = LoginPage(browser)\n lp.do_login()\n\n # \u041c\u044b \u043d\u0430 \u0433\u043b\u0430\u0432\u043d\u043e\u0439 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435\n mp = MainPage(browser)\n\n # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0438:\n # \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u043f\u0430\u043d\u0435\u043b\u0438 \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438\n mp.should_be_navigation_panel()\n\n # \u041e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u043c \u0432\u0441\u0435 \u043f\u0443\u043d\u043a\u0442\u044b \u043f\u0430\u043d\u0435\u043b\u0438\n mp.click_main_navigation_panel_item(\"\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438\")\n\n mp.click_subpanel_item(\"\u041e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u043d\u0438\u0435 \u0438 \u0434\u0438\u0430\u0433\u043d\u043e\u0441\u0442\u0438\u043a\u0430\")\n mp.click_subpanel_item(\"\u0421\u0442\u0430\u0442\u0443\u0441 \u043e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u043d\u0438\u044f\")\n\n mp.wait_for_timeout(500)\n\n mp.click_subpanel_item(\"\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438\")\n mp.click_subpanel_item(\"\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438\")\n</code></pre>"},{"location":"tests/e2e/test_expand_navigation_panel/#tests.e2e.test_expand_navigation_panel.TestNavigationPanel.test_expand_panel","title":"<code>test_expand_panel(browser)</code>","text":"<p>\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.</p> <p>Parameters:</p> Name Type Description Default <code>browser</code> <code>Page</code> <p>\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.</p> required Source code in <code>tests\\e2e\\test_expand_navigation_panel.py</code> <pre><code>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</code></pre>"},{"location":"tests/e2e/test_expand_navigation_panel/#tests.e2e.test_expand_navigation_panel.TestNavigationPanel.test_sub_panel_item_click","title":"<code>test_sub_panel_item_click(browser)</code>","text":"<p>\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.</p> <p>Parameters:</p> Name Type Description Default <code>browser</code> <code>Page</code> <p>\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.</p> required Source code in <code>tests\\e2e\\test_expand_navigation_panel.py</code> <pre><code>def test_sub_panel_item_click(self, browser: Page):\n \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043a\u043b\u0438\u043a\u0430 \u0437\u0430\u0434\u0430\u043d\u043d\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0432 \u043f\u043e\u0434\u043f\u0430\u043d\u0435\u043b\u0438 \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438.\n\n Args:\n browser: \u0424\u0438\u043a\u0441\u0442\u0443\u0440\u0430 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u043e\u043c.\n\n \"\"\"\n\n # \u0414\u0435\u0439\u0441\u0442\u0432\u0438\u044f:\n lp = LoginPage(browser)\n lp.do_login()\n\n # \u041c\u044b \u043d\u0430 \u0433\u043b\u0430\u0432\u043d\u043e\u0439 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435\n mp = MainPage(browser)\n\n # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0438:\n # \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u043f\u0430\u043d\u0435\u043b\u0438 \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438\n mp.should_be_navigation_panel()\n\n # \u041e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u043c \u0432\u0441\u0435 \u043f\u0443\u043d\u043a\u0442\u044b \u043f\u0430\u043d\u0435\u043b\u0438\n mp.click_main_navigation_panel_item(\"\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438\")\n\n mp.click_subpanel_item(\"\u041e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u043d\u0438\u0435 \u0438 \u0434\u0438\u0430\u0433\u043d\u043e\u0441\u0442\u0438\u043a\u0430\")\n mp.click_subpanel_item(\"\u0421\u0442\u0430\u0442\u0443\u0441 \u043e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u043d\u0438\u044f\")\n\n mp.wait_for_timeout(500)\n\n mp.click_subpanel_item(\"\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438\")\n mp.click_subpanel_item(\"\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438\")\n</code></pre>"},{"location":"tests/e2e/test_license_tab/","title":"TestLicenseTab","text":"<p>\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'.</p> <p>\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.</p>"},{"location":"tests/e2e/test_license_tab/#tests.e2e.test_license_tab.TestLicenseTab","title":"<code>TestLicenseTab</code>","text":"<p>\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'.</p> Source code in <code>tests\\e2e\\test_license_tab.py</code> <pre><code>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 @pytest.fixture(scope=\"function\", autouse=True)\n def setup(self, browser: Page) -&gt; 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) -&gt; 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) -&gt; 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() -&gt; 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</code></pre>"},{"location":"tests/e2e/test_license_tab/#tests.e2e.test_license_tab.TestLicenseTab.setup","title":"<code>setup(browser)</code>","text":"<p>\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.</p> <p>Parameters:</p> Name Type Description Default <code>browser</code> <code>Page</code> <p>\u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.</p> required Source code in <code>tests\\e2e\\test_license_tab.py</code> <pre><code>@pytest.fixture(scope=\"function\", autouse=True)\ndef setup(self, browser: Page) -&gt; 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</code></pre>"},{"location":"tests/e2e/test_license_tab/#tests.e2e.test_license_tab.TestLicenseTab.test_license_tab_input_form_and_check_alert","title":"<code>test_license_tab_input_form_and_check_alert(browser)</code>","text":"<p>\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.</p> <p>Parameters:</p> Name Type Description Default <code>browser</code> <code>Page</code> <p>\u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.</p> required Source code in <code>tests\\e2e\\test_license_tab.py</code> <pre><code>def test_license_tab_input_form_and_check_alert(self, browser: Page) -&gt; 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() -&gt; 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</code></pre>"},{"location":"tests/e2e/test_license_tab/#tests.e2e.test_license_tab.TestLicenseTab.test_lisence_tab_content","title":"<code>test_lisence_tab_content(browser)</code>","text":"<p>\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'.</p> <p>Parameters:</p> Name Type Description Default <code>browser</code> <code>Page</code> <p>\u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.</p> required Source code in <code>tests\\e2e\\test_license_tab.py</code> <pre><code>def test_lisence_tab_content(self, browser: Page) -&gt; 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</code></pre>"},{"location":"tests/e2e/test_login/","title":"TestLogin","text":"<p>\u041c\u043e\u0434\u0443\u043b\u044c \u0442\u0435\u0441\u0442\u043e\u0432 \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u0438.</p> <p>\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.</p>"},{"location":"tests/e2e/test_login/#tests.e2e.test_login.TestLogin","title":"<code>TestLogin</code>","text":"<p>\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.</p> Source code in <code>tests\\e2e\\test_login.py</code> <pre><code>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 def test_successful_login(self, browser: Page) -&gt; 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) -&gt; 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) -&gt; 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</code></pre>"},{"location":"tests/e2e/test_login/#tests.e2e.test_login.TestLogin.test_successful_login","title":"<code>test_successful_login(browser)</code>","text":"<p>\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.</p> <p>Parameters:</p> Name Type Description Default <code>browser</code> <code>Page</code> <p>\u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.</p> required Source code in <code>tests\\e2e\\test_login.py</code> <pre><code>def test_successful_login(self, browser: Page) -&gt; 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</code></pre>"},{"location":"tests/e2e/test_login/#tests.e2e.test_login.TestLogin.test_successful_login_and_logout","title":"<code>test_successful_login_and_logout(browser)</code>","text":"<p>\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.</p> <p>Parameters:</p> Name Type Description Default <code>browser</code> <code>Page</code> <p>\u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.</p> required Source code in <code>tests\\e2e\\test_login.py</code> <pre><code>def test_successful_login_and_logout(self, browser: Page) -&gt; 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</code></pre>"},{"location":"tests/e2e/test_login/#tests.e2e.test_login.TestLogin.test_unsuccessful_login","title":"<code>test_unsuccessful_login(browser)</code>","text":"<p>\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.</p> <p>Parameters:</p> Name Type Description Default <code>browser</code> <code>Page</code> <p>\u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.</p> required Source code in <code>tests\\e2e\\test_login.py</code> <pre><code>def test_unsuccessful_login(self, browser: Page) -&gt; 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</code></pre>"},{"location":"tests/e2e/test_service_status_tab/","title":"TestServiceStatusTab","text":"<p>\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'.</p> <p>\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.</p>"},{"location":"tests/e2e/test_service_status_tab/#tests.e2e.test_service_status_tab.TestServiceStatusTab","title":"<code>TestServiceStatusTab</code>","text":"<p>\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'.</p> Source code in <code>tests\\e2e\\test_service_status_tab.py</code> <pre><code>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 @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</code></pre>"},{"location":"tests/e2e/test_service_status_tab/#tests.e2e.test_service_status_tab.TestServiceStatusTab.setup","title":"<code>setup(browser)</code>","text":"<p>\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.</p> <p>Parameters:</p> Name Type Description Default <code>browser</code> <code>Page</code> <p>\u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.</p> required Source code in <code>tests\\e2e\\test_service_status_tab.py</code> <pre><code>@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</code></pre>"},{"location":"tests/e2e/test_service_status_tab/#tests.e2e.test_service_status_tab.TestServiceStatusTab.test_service_status_tab_content","title":"<code>test_service_status_tab_content(browser)</code>","text":"<p>\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'.</p> <p>Parameters:</p> Name Type Description Default <code>browser</code> <code>Page</code> <p>\u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.</p> required Source code in <code>tests\\e2e\\test_service_status_tab.py</code> <pre><code>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</code></pre>"},{"location":"tests/e2e/test_service_status_tab/#tests.e2e.test_service_status_tab.TestServiceStatusTab.test_service_status_table_row_highlighting","title":"<code>test_service_status_table_row_highlighting(browser)</code>","text":"<p>\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.</p> <p>Parameters:</p> Name Type Description Default <code>browser</code> <code>Page</code> <p>\u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.</p> required Source code in <code>tests\\e2e\\test_service_status_tab.py</code> <pre><code>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</code></pre>"},{"location":"tests/e2e/test_sessions_tab/","title":"TestSessionTab","text":"<p>\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'.</p> <p>\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\u0441\u0441\u0438\u044f\u043c\u0438.</p>"},{"location":"tests/e2e/test_sessions_tab/#tests.e2e.test_sessions_tab.TestSessionsTab","title":"<code>TestSessionsTab</code>","text":"<p>\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'.</p> <p>\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.</p> Source code in <code>tests\\e2e\\test_sessions_tab.py</code> <pre><code>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 \"\"\"\n\n @pytest.fixture(scope=\"function\", autouse=True)\n def setup(self, browser):\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_user(self, browser: Page) -&gt; None:\n \"\"\"\u0424\u0438\u043a\u0441\u0442\u0443\u0440\u0430 \u0434\u043b\u044f \u043e\u0447\u0438\u0441\u0442\u043a\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f NewUser \u043f\u043e\u0441\u043b\u0435 \u0442\u0435\u0441\u0442\u0430.\"\"\"\n\n yield\n\n mp = MainPage(browser)\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\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u043f\u043e\u0441\u043b\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0442\u0435\u0441\u0442\u0430\n user_data: Dict[str, str] = {\"name\": \"NewUser\", \"role\": \"\u0410\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440\"}\n\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 if ut.find_user_in_table(user_data[\"name\"], user_data[\"role\"]) != -1:\n ut.open_edit_user_page_by_user(user_data[\"name\"], user_data[\"role\"])\n ut.delete_user(user_data[\"name\"])\n\n def test_sessions_tab_content(self, browser):\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\u043a\u0430 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0433\u043e \u0442\u0430\u0431\u043b\u0438\u0446\u044b \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 def test_sessions_table_row_highlighting(self, browser):\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 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0441\u0435\u0430\u043d\u0441\u043e\u0432\n 2. \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043f\u043e\u0434\u0441\u0432\u0435\u0442\u043a\u0438 \u0441\u0442\u0440\u043e\u043a\u0438 \u043f\u0440\u0438 \u043d\u0430\u0432\u0435\u0434\u0435\u043d\u0438\u0438 \u043d\u0430 \u043d\u0435\u0435 \u043a\u0443\u0440\u0441\u043e\u0440\u043e\u043c\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_sessions_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 \u0431\u0435\u0437 \u0443\u0447\u0435\u0442\u0430 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430\n rows_count = sessions_tab.get_rows_count()\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 \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 &gt; 1:\n sessions_tab.check_sessions_table_row_highlighting(rows_count - 1)\n\n def test_delete_session_confirm_window(self, browser):\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 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0441\u0435\u0430\u043d\u0441\u043e\u0432\n 2. \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043a\u043e\u043d\u0442\u0435\u043d\u0442\u0430 \u0438 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \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\u0441\u0441\u0438\u0438\n \"\"\"\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_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\u0441\u0441\u0438\u0438\n sessions_tab.check_delete_session_confirm_window()\n\n # @pytest.mark.develop\n def test_session_for_new_user(self, browser, cleanup_user):\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. \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\u0441\u0441\u0438\u0438 \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\u0435\u0440\u0432\u043e\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\n 6. \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u044f \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 7. \u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u043d\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\n \"\"\"\n user_data = {\"name\": \"NewUser\", \"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 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430\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\u0441\u0441\u0438\u0438 \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 prev_lp = LoginPage(browser)\n prev_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 prev_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 prev_mp.should_be_navigation_panel()\n prev_mp.click_main_navigation_panel_item(\"\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438\")\n prev_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 prev_mp.click_subpanel_item(\"\u0421\u0435\u0430\u043d\u0441\u044b\")\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 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 \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\n prev_ut = UsersTab(browser)\n prev_ut.open_edit_user_page_by_user(user_data[\"name\"], user_data[\"role\"])\n prev_ut.delete_user(user_data[\"name\"])\n</code></pre>"},{"location":"tests/e2e/test_sessions_tab/#tests.e2e.test_sessions_tab.TestSessionsTab.cleanup_user","title":"<code>cleanup_user(browser)</code>","text":"<p>\u0424\u0438\u043a\u0441\u0442\u0443\u0440\u0430 \u0434\u043b\u044f \u043e\u0447\u0438\u0441\u0442\u043a\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f NewUser \u043f\u043e\u0441\u043b\u0435 \u0442\u0435\u0441\u0442\u0430.</p> Source code in <code>tests\\e2e\\test_sessions_tab.py</code> <pre><code>@pytest.fixture(scope=\"function\")\ndef cleanup_user(self, browser: Page) -&gt; None:\n \"\"\"\u0424\u0438\u043a\u0441\u0442\u0443\u0440\u0430 \u0434\u043b\u044f \u043e\u0447\u0438\u0441\u0442\u043a\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f NewUser \u043f\u043e\u0441\u043b\u0435 \u0442\u0435\u0441\u0442\u0430.\"\"\"\n\n yield\n\n mp = MainPage(browser)\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\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u043f\u043e\u0441\u043b\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0442\u0435\u0441\u0442\u0430\n user_data: Dict[str, str] = {\"name\": \"NewUser\", \"role\": \"\u0410\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440\"}\n\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 if ut.find_user_in_table(user_data[\"name\"], user_data[\"role\"]) != -1:\n ut.open_edit_user_page_by_user(user_data[\"name\"], user_data[\"role\"])\n ut.delete_user(user_data[\"name\"])\n</code></pre>"},{"location":"tests/e2e/test_sessions_tab/#tests.e2e.test_sessions_tab.TestSessionsTab.setup","title":"<code>setup(browser)</code>","text":"<p>\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.</p> <p>\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</p> Source code in <code>tests\\e2e\\test_sessions_tab.py</code> <pre><code>@pytest.fixture(scope=\"function\", autouse=True)\ndef setup(self, browser):\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</code></pre>"},{"location":"tests/e2e/test_sessions_tab/#tests.e2e.test_sessions_tab.TestSessionsTab.test_delete_session_confirm_window","title":"<code>test_delete_session_confirm_window(browser)</code>","text":"<p>\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'.</p> <p>\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. \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043a\u043e\u043d\u0442\u0435\u043d\u0442\u0430 \u0438 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \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\u0441\u0441\u0438\u0438</p> Source code in <code>tests\\e2e\\test_sessions_tab.py</code> <pre><code>def test_delete_session_confirm_window(self, browser):\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 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0441\u0435\u0430\u043d\u0441\u043e\u0432\n 2. \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043a\u043e\u043d\u0442\u0435\u043d\u0442\u0430 \u0438 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \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\u0441\u0441\u0438\u0438\n \"\"\"\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_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\u0441\u0441\u0438\u0438\n sessions_tab.check_delete_session_confirm_window()\n</code></pre>"},{"location":"tests/e2e/test_sessions_tab/#tests.e2e.test_sessions_tab.TestSessionsTab.test_session_for_new_user","title":"<code>test_session_for_new_user(browser, cleanup_user)</code>","text":"<p>\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'.</p> <p>\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\u0441\u0441\u0438\u0438 \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\u0435\u0440\u0432\u043e\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f 6. \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u044f \u0441\u0435\u0441\u0441\u0438\u0438 \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 \u043d\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f</p> Source code in <code>tests\\e2e\\test_sessions_tab.py</code> <pre><code>def test_session_for_new_user(self, browser, cleanup_user):\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. \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\u0441\u0441\u0438\u0438 \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\u0435\u0440\u0432\u043e\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\n 6. \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u044f \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 7. \u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u043d\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\n \"\"\"\n user_data = {\"name\": \"NewUser\", \"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 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430\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\u0441\u0441\u0438\u0438 \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 prev_lp = LoginPage(browser)\n prev_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 prev_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 prev_mp.should_be_navigation_panel()\n prev_mp.click_main_navigation_panel_item(\"\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438\")\n prev_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 prev_mp.click_subpanel_item(\"\u0421\u0435\u0430\u043d\u0441\u044b\")\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 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 \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\n prev_ut = UsersTab(browser)\n prev_ut.open_edit_user_page_by_user(user_data[\"name\"], user_data[\"role\"])\n prev_ut.delete_user(user_data[\"name\"])\n</code></pre>"},{"location":"tests/e2e/test_sessions_tab/#tests.e2e.test_sessions_tab.TestSessionsTab.test_sessions_tab_content","title":"<code>test_sessions_tab_content(browser)</code>","text":"<p>\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'.</p> <p>\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</p> Source code in <code>tests\\e2e\\test_sessions_tab.py</code> <pre><code>def test_sessions_tab_content(self, browser):\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\u043a\u0430 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0433\u043e \u0442\u0430\u0431\u043b\u0438\u0446\u044b \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</code></pre>"},{"location":"tests/e2e/test_sessions_tab/#tests.e2e.test_sessions_tab.TestSessionsTab.test_sessions_table_row_highlighting","title":"<code>test_sessions_table_row_highlighting(browser)</code>","text":"<p>\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'.</p> <p>\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. \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043f\u043e\u0434\u0441\u0432\u0435\u0442\u043a\u0438 \u0441\u0442\u0440\u043e\u043a\u0438 \u043f\u0440\u0438 \u043d\u0430\u0432\u0435\u0434\u0435\u043d\u0438\u0438 \u043d\u0430 \u043d\u0435\u0435 \u043a\u0443\u0440\u0441\u043e\u0440\u043e\u043c</p> Source code in <code>tests\\e2e\\test_sessions_tab.py</code> <pre><code>def test_sessions_table_row_highlighting(self, browser):\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 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0441\u0435\u0430\u043d\u0441\u043e\u0432\n 2. \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043f\u043e\u0434\u0441\u0432\u0435\u0442\u043a\u0438 \u0441\u0442\u0440\u043e\u043a\u0438 \u043f\u0440\u0438 \u043d\u0430\u0432\u0435\u0434\u0435\u043d\u0438\u0438 \u043d\u0430 \u043d\u0435\u0435 \u043a\u0443\u0440\u0441\u043e\u0440\u043e\u043c\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_sessions_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 \u0431\u0435\u0437 \u0443\u0447\u0435\u0442\u0430 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430\n rows_count = sessions_tab.get_rows_count()\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 \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 &gt; 1:\n sessions_tab.check_sessions_table_row_highlighting(rows_count - 1)\n</code></pre>"},{"location":"tests/e2e/test_users_tab/","title":"TestUsersTab","text":"<p>\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'.</p> <p>\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.</p>"},{"location":"tests/e2e/test_users_tab/#tests.e2e.test_users_tab.TestUsersTab","title":"<code>TestUsersTab</code>","text":"<p>\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'.</p> Source code in <code>tests\\e2e\\test_users_tab.py</code> <pre><code>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 @pytest.fixture(scope=\"function\", autouse=True)\n def setup(self, browser: Page) -&gt; 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_user(self, browser: Page) -&gt; None:\n \"\"\"\u0424\u0438\u043a\u0441\u0442\u0443\u0440\u0430 \u0434\u043b\u044f \u043e\u0447\u0438\u0441\u0442\u043a\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f User \u043f\u043e\u0441\u043b\u0435 \u0442\u0435\u0441\u0442\u0430.\"\"\"\n yield\n # \u0423\u0434\u0430\u043b\u044f\u0435\u043c \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 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0442\u0435\u0441\u0442\u0430\n user_data: Dict[str, str] = {\"name\": \"User\", \"role\": \"\u0410\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440\", \"password\": \"987654\"}\n ut = UsersTab(browser)\n\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 if ut.find_user_in_table(user_data[\"name\"], user_data[\"role\"]) != -1:\n ut.open_edit_user_page_by_user(user_data[\"name\"], user_data[\"role\"])\n ut.delete_user(user_data[\"name\"])\n\n @pytest.fixture(scope=\"function\")\n def cleanup_autoadmin(self, browser: Page) -&gt; None:\n \"\"\"\u0424\u0438\u043a\u0441\u0442\u0443\u0440\u0430 \u0434\u043b\u044f \u043e\u0447\u0438\u0441\u0442\u043a\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f autoadmin \u043f\u043e\u0441\u043b\u0435 \u0442\u0435\u0441\u0442\u0430.\"\"\"\n yield\n user_data: Dict[str, str] = {\"name\": \"autoadmin\", \"role\": \"\u0410\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440\", \"password\": \"123456\"}\n ut = UsersTab(browser)\n if ut.find_user_in_table(user_data[\"name\"], user_data[\"role\"]) != -1:\n ut.open_edit_user_page_by_user(user_data[\"name\"], user_data[\"role\"])\n ut.delete_user(user_data[\"name\"])\n\n @pytest.fixture(scope=\"function\")\n def cleanup_autooperator(self, browser: Page) -&gt; None:\n \"\"\"\u0424\u0438\u043a\u0441\u0442\u0443\u0440\u0430 \u0434\u043b\u044f \u043e\u0447\u0438\u0441\u0442\u043a\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f autooperator \u043f\u043e\u0441\u043b\u0435 \u0442\u0435\u0441\u0442\u0430.\"\"\"\n yield\n user_data: Dict[str, str] = {\"name\": \"autooperator\", \"role\": \"\u041e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\", \"password\": \"123245\"}\n ut = UsersTab(browser)\n if ut.find_user_in_table(user_data[\"name\"], user_data[\"role\"]) != -1:\n ut.open_edit_user_page_by_user(user_data[\"name\"], user_data[\"role\"])\n ut.delete_user(user_data[\"name\"])\n\n def test_users_tab_content(self, browser: Page) -&gt; 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) -&gt; 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 def test_add_user_window_content(self, browser: Page) -&gt; 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\n def test_add_user_window_close_buttons(self, browser: Page) -&gt; 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 def test_edit_user_window_content(self, browser: Page) -&gt; 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) -&gt; 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 def test_add_and_delete_user(self, browser: Page, cleanup_user: None) -&gt; 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_user: \u0424\u0438\u043a\u0441\u0442\u0443\u0440\u0430 \u0434\u043b\u044f \u043e\u0447\u0438\u0441\u0442\u043a\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\n \"\"\"\n\n user_data: Dict[str, str] = {\"name\": \"User\", \"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 def test_reset_password(self, browser: Page, cleanup_autoadmin: None) -&gt; 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_autoadmin: \u0424\u0438\u043a\u0441\u0442\u0443\u0440\u0430 \u0434\u043b\u044f \u043e\u0447\u0438\u0441\u0442\u043a\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f autoadmin.\n \"\"\"\n\n user_data: Dict[str, str] = {\"name\": \"autoadmin\", \"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_autooperator: None) -&gt; 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_autooperator: \u0424\u0438\u043a\u0441\u0442\u0443\u0440\u0430 \u0434\u043b\u044f \u043e\u0447\u0438\u0441\u0442\u043a\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f autooperator.\n \"\"\"\n\n user_data: Dict[str, str] = {\"name\": \"autooperator\", \"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</code></pre>"},{"location":"tests/e2e/test_users_tab/#tests.e2e.test_users_tab.TestUsersTab.cleanup_autoadmin","title":"<code>cleanup_autoadmin(browser)</code>","text":"<p>\u0424\u0438\u043a\u0441\u0442\u0443\u0440\u0430 \u0434\u043b\u044f \u043e\u0447\u0438\u0441\u0442\u043a\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f autoadmin \u043f\u043e\u0441\u043b\u0435 \u0442\u0435\u0441\u0442\u0430.</p> Source code in <code>tests\\e2e\\test_users_tab.py</code> <pre><code>@pytest.fixture(scope=\"function\")\ndef cleanup_autoadmin(self, browser: Page) -&gt; None:\n \"\"\"\u0424\u0438\u043a\u0441\u0442\u0443\u0440\u0430 \u0434\u043b\u044f \u043e\u0447\u0438\u0441\u0442\u043a\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f autoadmin \u043f\u043e\u0441\u043b\u0435 \u0442\u0435\u0441\u0442\u0430.\"\"\"\n yield\n user_data: Dict[str, str] = {\"name\": \"autoadmin\", \"role\": \"\u0410\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440\", \"password\": \"123456\"}\n ut = UsersTab(browser)\n if ut.find_user_in_table(user_data[\"name\"], user_data[\"role\"]) != -1:\n ut.open_edit_user_page_by_user(user_data[\"name\"], user_data[\"role\"])\n ut.delete_user(user_data[\"name\"])\n</code></pre>"},{"location":"tests/e2e/test_users_tab/#tests.e2e.test_users_tab.TestUsersTab.cleanup_autooperator","title":"<code>cleanup_autooperator(browser)</code>","text":"<p>\u0424\u0438\u043a\u0441\u0442\u0443\u0440\u0430 \u0434\u043b\u044f \u043e\u0447\u0438\u0441\u0442\u043a\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f autooperator \u043f\u043e\u0441\u043b\u0435 \u0442\u0435\u0441\u0442\u0430.</p> Source code in <code>tests\\e2e\\test_users_tab.py</code> <pre><code>@pytest.fixture(scope=\"function\")\ndef cleanup_autooperator(self, browser: Page) -&gt; None:\n \"\"\"\u0424\u0438\u043a\u0441\u0442\u0443\u0440\u0430 \u0434\u043b\u044f \u043e\u0447\u0438\u0441\u0442\u043a\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f autooperator \u043f\u043e\u0441\u043b\u0435 \u0442\u0435\u0441\u0442\u0430.\"\"\"\n yield\n user_data: Dict[str, str] = {\"name\": \"autooperator\", \"role\": \"\u041e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\", \"password\": \"123245\"}\n ut = UsersTab(browser)\n if ut.find_user_in_table(user_data[\"name\"], user_data[\"role\"]) != -1:\n ut.open_edit_user_page_by_user(user_data[\"name\"], user_data[\"role\"])\n ut.delete_user(user_data[\"name\"])\n</code></pre>"},{"location":"tests/e2e/test_users_tab/#tests.e2e.test_users_tab.TestUsersTab.cleanup_user","title":"<code>cleanup_user(browser)</code>","text":"<p>\u0424\u0438\u043a\u0441\u0442\u0443\u0440\u0430 \u0434\u043b\u044f \u043e\u0447\u0438\u0441\u0442\u043a\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f User \u043f\u043e\u0441\u043b\u0435 \u0442\u0435\u0441\u0442\u0430.</p> Source code in <code>tests\\e2e\\test_users_tab.py</code> <pre><code>@pytest.fixture(scope=\"function\")\ndef cleanup_user(self, browser: Page) -&gt; None:\n \"\"\"\u0424\u0438\u043a\u0441\u0442\u0443\u0440\u0430 \u0434\u043b\u044f \u043e\u0447\u0438\u0441\u0442\u043a\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f User \u043f\u043e\u0441\u043b\u0435 \u0442\u0435\u0441\u0442\u0430.\"\"\"\n yield\n # \u0423\u0434\u0430\u043b\u044f\u0435\u043c \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 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0442\u0435\u0441\u0442\u0430\n user_data: Dict[str, str] = {\"name\": \"User\", \"role\": \"\u0410\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440\", \"password\": \"987654\"}\n ut = UsersTab(browser)\n\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 if ut.find_user_in_table(user_data[\"name\"], user_data[\"role\"]) != -1:\n ut.open_edit_user_page_by_user(user_data[\"name\"], user_data[\"role\"])\n ut.delete_user(user_data[\"name\"])\n</code></pre>"},{"location":"tests/e2e/test_users_tab/#tests.e2e.test_users_tab.TestUsersTab.setup","title":"<code>setup(browser)</code>","text":"<p>\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.</p> <p>Parameters:</p> Name Type Description Default <code>browser</code> <code>Page</code> <p>\u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.</p> required Source code in <code>tests\\e2e\\test_users_tab.py</code> <pre><code>@pytest.fixture(scope=\"function\", autouse=True)\ndef setup(self, browser: Page) -&gt; 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</code></pre>"},{"location":"tests/e2e/test_users_tab/#tests.e2e.test_users_tab.TestUsersTab.test_add_and_delete_user","title":"<code>test_add_and_delete_user(browser, cleanup_user)</code>","text":"<p>\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.</p> <p>Parameters:</p> Name Type Description Default <code>browser</code> <code>Page</code> <p>\u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.</p> required <code>cleanup_user</code> <code>None</code> <p>\u0424\u0438\u043a\u0441\u0442\u0443\u0440\u0430 \u0434\u043b\u044f \u043e\u0447\u0438\u0441\u0442\u043a\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.</p> required Source code in <code>tests\\e2e\\test_users_tab.py</code> <pre><code>def test_add_and_delete_user(self, browser: Page, cleanup_user: None) -&gt; 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_user: \u0424\u0438\u043a\u0441\u0442\u0443\u0440\u0430 \u0434\u043b\u044f \u043e\u0447\u0438\u0441\u0442\u043a\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\n \"\"\"\n\n user_data: Dict[str, str] = {\"name\": \"User\", \"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</code></pre>"},{"location":"tests/e2e/test_users_tab/#tests.e2e.test_users_tab.TestUsersTab.test_add_user_window_close_buttons","title":"<code>test_add_user_window_close_buttons(browser)</code>","text":"<p>\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.</p> <p>Parameters:</p> Name Type Description Default <code>browser</code> <code>Page</code> <p>\u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.</p> required Source code in <code>tests\\e2e\\test_users_tab.py</code> <pre><code>def test_add_user_window_close_buttons(self, browser: Page) -&gt; 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</code></pre>"},{"location":"tests/e2e/test_users_tab/#tests.e2e.test_users_tab.TestUsersTab.test_add_user_window_content","title":"<code>test_add_user_window_content(browser)</code>","text":"<p>\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.</p> <p>Parameters:</p> Name Type Description Default <code>browser</code> <code>Page</code> <p>\u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.</p> required Source code in <code>tests\\e2e\\test_users_tab.py</code> <pre><code>def test_add_user_window_content(self, browser: Page) -&gt; 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</code></pre>"},{"location":"tests/e2e/test_users_tab/#tests.e2e.test_users_tab.TestUsersTab.test_edit_user_role","title":"<code>test_edit_user_role(browser, cleanup_autooperator)</code>","text":"<p>\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.</p> <p>Parameters:</p> Name Type Description Default <code>browser</code> <code>Page</code> <p>\u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.</p> required <code>cleanup_autooperator</code> <code>None</code> <p>\u0424\u0438\u043a\u0441\u0442\u0443\u0440\u0430 \u0434\u043b\u044f \u043e\u0447\u0438\u0441\u0442\u043a\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f autooperator.</p> required Source code in <code>tests\\e2e\\test_users_tab.py</code> <pre><code>def test_edit_user_role(self, browser: Page, cleanup_autooperator: None) -&gt; 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_autooperator: \u0424\u0438\u043a\u0441\u0442\u0443\u0440\u0430 \u0434\u043b\u044f \u043e\u0447\u0438\u0441\u0442\u043a\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f autooperator.\n \"\"\"\n\n user_data: Dict[str, str] = {\"name\": \"autooperator\", \"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</code></pre>"},{"location":"tests/e2e/test_users_tab/#tests.e2e.test_users_tab.TestUsersTab.test_edit_user_window_close_buttons","title":"<code>test_edit_user_window_close_buttons(browser)</code>","text":"<p>\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.</p> <p>Parameters:</p> Name Type Description Default <code>browser</code> <code>Page</code> <p>\u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.</p> required Source code in <code>tests\\e2e\\test_users_tab.py</code> <pre><code>def test_edit_user_window_close_buttons(self, browser: Page) -&gt; 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</code></pre>"},{"location":"tests/e2e/test_users_tab/#tests.e2e.test_users_tab.TestUsersTab.test_edit_user_window_content","title":"<code>test_edit_user_window_content(browser)</code>","text":"<p>\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.</p> <p>Parameters:</p> Name Type Description Default <code>browser</code> <code>Page</code> <p>\u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.</p> required Source code in <code>tests\\e2e\\test_users_tab.py</code> <pre><code>def test_edit_user_window_content(self, browser: Page) -&gt; 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</code></pre>"},{"location":"tests/e2e/test_users_tab/#tests.e2e.test_users_tab.TestUsersTab.test_reset_password","title":"<code>test_reset_password(browser, cleanup_autoadmin)</code>","text":"<p>\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.</p> <p>Parameters:</p> Name Type Description Default <code>browser</code> <code>Page</code> <p>\u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.</p> required <code>cleanup_autoadmin</code> <code>None</code> <p>\u0424\u0438\u043a\u0441\u0442\u0443\u0440\u0430 \u0434\u043b\u044f \u043e\u0447\u0438\u0441\u0442\u043a\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f autoadmin.</p> required Source code in <code>tests\\e2e\\test_users_tab.py</code> <pre><code>def test_reset_password(self, browser: Page, cleanup_autoadmin: None) -&gt; 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_autoadmin: \u0424\u0438\u043a\u0441\u0442\u0443\u0440\u0430 \u0434\u043b\u044f \u043e\u0447\u0438\u0441\u0442\u043a\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f autoadmin.\n \"\"\"\n\n user_data: Dict[str, str] = {\"name\": \"autoadmin\", \"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</code></pre>"},{"location":"tests/e2e/test_users_tab/#tests.e2e.test_users_tab.TestUsersTab.test_users_tab_content","title":"<code>test_users_tab_content(browser)</code>","text":"<p>\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'.</p> <p>Parameters:</p> Name Type Description Default <code>browser</code> <code>Page</code> <p>\u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.</p> required Source code in <code>tests\\e2e\\test_users_tab.py</code> <pre><code>def test_users_tab_content(self, browser: Page) -&gt; 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</code></pre>"},{"location":"tests/e2e/test_users_tab/#tests.e2e.test_users_tab.TestUsersTab.test_users_tab_toolbar_buttons","title":"<code>test_users_tab_toolbar_buttons(browser)</code>","text":"<p>\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.</p> <p>Parameters:</p> Name Type Description Default <code>browser</code> <code>Page</code> <p>\u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.</p> required Source code in <code>tests\\e2e\\test_users_tab.py</code> <pre><code>def test_users_tab_toolbar_buttons(self, browser: Page) -&gt; 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</code></pre>"},{"location":"tools/fix_python_project/","title":"Python Project Fixer","text":"<p>\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.</p> <p>\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</p> <p>\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]</p>"},{"location":"tools/fix_python_project/#tools.fix_python_project.ProjectFixer","title":"<code>ProjectFixer</code>","text":"<p>\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.</p> \u0410\u0442\u0440\u0438\u0431\u0443\u0442\u044b <p>root_dir: \u041a\u043e\u0440\u043d\u0435\u0432\u0430\u044f \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044f \u043f\u0440\u043e\u0435\u043a\u0442\u0430. log: \u041b\u043e\u0433 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u043d\u044b\u0445 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439.</p> Source code in <code>tools\\fix_python_project.py</code> <pre><code>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) -&gt; 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) -&gt; 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) -&gt; 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) -&gt; 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</code></pre>"},{"location":"tools/fix_python_project/#tools.fix_python_project.ProjectFixer.__init__","title":"<code>__init__(root_dir='.')</code>","text":"<p>\u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442 \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 ProjectFixer.</p> <p>Parameters:</p> Name Type Description Default <code>root_dir</code> <code>str</code> <p>\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 '.'.</p> <code>'.'</code> Source code in <code>tools\\fix_python_project.py</code> <pre><code>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</code></pre>"},{"location":"tools/fix_python_project/#tools.fix_python_project.ProjectFixer.create_init_py","title":"<code>create_init_py(dir_path)</code>","text":"<p>\u0421\u043e\u0437\u0434\u0430\u0451\u0442 \u0444\u0430\u0439\u043b init.py.</p> <p>Parameters:</p> Name Type Description Default <code>dir_path</code> <code>str</code> <p>\u041f\u0443\u0442\u044c \u043a \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438.</p> required <p>Returns:</p> Name Type Description <code>bool</code> <code>bool</code> <p>True \u0435\u0441\u043b\u0438 \u0444\u0430\u0439\u043b \u0441\u043e\u0437\u0434\u0430\u043d.</p> <p>Raises:</p> Type Description <code>Exception</code> <p>\u041f\u0440\u0438 \u043e\u0448\u0438\u0431\u043a\u0435 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f.</p> Source code in <code>tools\\fix_python_project.py</code> <pre><code>def create_init_py(self, dir_path: str) -&gt; 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</code></pre>"},{"location":"tools/fix_python_project/#tools.fix_python_project.ProjectFixer.needs_init_py","title":"<code>needs_init_py(dir_path)</code>","text":"<p>\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.</p> <p>Parameters:</p> Name Type Description Default <code>dir_path</code> <code>str</code> <p>\u041f\u0443\u0442\u044c \u043a \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438.</p> required <p>Returns:</p> Name Type Description <code>bool</code> <code>bool</code> <p>True \u0435\u0441\u043b\u0438 init.py \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f.</p> Source code in <code>tools\\fix_python_project.py</code> <pre><code>def needs_init_py(self, dir_path: str) -&gt; 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</code></pre>"},{"location":"tools/fix_python_project/#tools.fix_python_project.ProjectFixer.process_directory","title":"<code>process_directory()</code>","text":"<p>\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.</p> Source code in <code>tools\\fix_python_project.py</code> <pre><code>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</code></pre>"},{"location":"tools/fix_python_project/#tools.fix_python_project.ProjectFixer.remove_bom","title":"<code>remove_bom(filepath)</code>","text":"<p>\u0423\u0434\u0430\u043b\u044f\u0435\u0442 BOM-\u043c\u0430\u0440\u043a\u0435\u0440 \u0438\u0437 \u0444\u0430\u0439\u043b\u0430.</p> <p>Parameters:</p> Name Type Description Default <code>filepath</code> <code>str</code> <p>\u041f\u0443\u0442\u044c \u043a \u0444\u0430\u0439\u043b\u0443.</p> required <p>Returns:</p> Name Type Description <code>bool</code> <code>bool</code> <p>True \u0435\u0441\u043b\u0438 BOM \u0431\u044b\u043b \u0443\u0434\u0430\u043b\u0451\u043d.</p> <p>Raises:</p> Type Description <code>Exception</code> <p>\u041f\u0440\u0438 \u043e\u0448\u0438\u0431\u043a\u0435 \u0447\u0442\u0435\u043d\u0438\u044f/\u0437\u0430\u043f\u0438\u0441\u0438.</p> Source code in <code>tools\\fix_python_project.py</code> <pre><code>def remove_bom(self, filepath: str) -&gt; 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</code></pre>"},{"location":"tools/fix_python_project/#tools.fix_python_project.ProjectFixer.save_log","title":"<code>save_log(log_file='project_fix.log')</code>","text":"<p>\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.</p> <p>Parameters:</p> Name Type Description Default <code>log_file</code> <code>str</code> <p>\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'.</p> <code>'project_fix.log'</code> Source code in <code>tools\\fix_python_project.py</code> <pre><code>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</code></pre>"},{"location":"tools/fix_python_project/#tools.fix_python_project.ProjectFixer.should_skip_init","title":"<code>should_skip_init(dir_path)</code>","text":"<p>\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.</p> <p>Parameters:</p> Name Type Description Default <code>dir_path</code> <code>str</code> <p>\u041f\u0443\u0442\u044c \u043a \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438.</p> required <p>Returns:</p> Name Type Description <code>bool</code> <code>bool</code> <p>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.</p> Source code in <code>tools\\fix_python_project.py</code> <pre><code>def should_skip_init(self, dir_path: str) -&gt; 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</code></pre>"},{"location":"tools/logger/","title":"Logging","text":"<p>\u041c\u043e\u0434\u0443\u043b\u044c \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u043b\u043e\u0433\u0433\u0435\u0440\u0430.</p> <p>\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.</p>"},{"location":"tools/logger/#tools.logger.get_logger","title":"<code>get_logger(name)</code>","text":"<p>\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.</p> <p>Parameters:</p> Name Type Description Default <code>name</code> <code>str</code> <p>\u0418\u043c\u044f \u043b\u043e\u0433\u0433\u0435\u0440\u0430 (\u043e\u0431\u044b\u0447\u043d\u043e name \u043c\u043e\u0434\u0443\u043b\u044f).</p> required <p>Returns:</p> Type Description <code>Logger</code> <p>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.</p> \u041f\u0440\u0438\u043c\u0435\u0440 <p>logger = get_logger(name) logger.debug(\"\u0422\u0435\u0441\u0442\u043e\u0432\u043e\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435\")</p> Source code in <code>tools\\logger.py</code> <pre><code>def get_logger(name: str) -&gt; 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</code></pre>"}]}