1 line
685 KiB
JSON
1 line
685 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 NMS","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 Network Management System (NMS).</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: - Playwright - \u0434\u043b\u044f \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0430\u0446\u0438\u0438 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0430 - Pytest - \u043a\u0430\u043a \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u0442\u0435\u0441\u0442\u043e\u0432\u044b\u0439 \u0434\u0432\u0438\u0436\u043e\u043a - Page Object Model - \u043f\u0430\u0442\u0442\u0435\u0440\u043d \u0434\u043b\u044f \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u0430\u0446\u0438\u0438 \u0442\u0435\u0441\u0442\u043e\u0432\u043e\u0433\u043e \u043a\u043e\u0434\u0430 - MkDocs - \u0434\u043b\u044f \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438 - Python 3.8+ - \u044f\u0437\u044b\u043a \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438</p>"},{"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) - <code>base_component.py</code> - \u0431\u0430\u0437\u043e\u0432\u044b\u0439 \u043a\u043b\u0430\u0441\u0441 \u0434\u043b\u044f \u0432\u0441\u0435\u0445 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043e\u0432 - <code>card_component.py</code> - \u043a\u0430\u0440\u0442\u043e\u0447\u043a\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 - <code>confirm_component.py</code> - \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u044b\u0435 \u043e\u043a\u043d\u0430 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u044f - <code>modal_window_component.py</code> - \u0431\u0430\u0437\u043e\u0432\u044b\u0435 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u044b\u0435 \u043e\u043a\u043d\u0430 - <code>navbar_component.py</code> - \u043f\u0430\u043d\u0435\u043b\u044c \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438 - <code>table_component.py</code> - \u0440\u0430\u0431\u043e\u0442\u0430 \u0441 \u0442\u0430\u0431\u043b\u0438\u0446\u0430\u043c\u0438 - <code>toolbar_component.py</code> - \u0442\u0443\u043b\u0431\u0430\u0440\u044b \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\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>api/</code> - \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f API \u043a\u043b\u0430\u0441\u0441\u043e\u0432 - <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</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":"<ol> <li>\u0423\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438: ```bash pip install -e . \u0417\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u0435 \u0442\u0435\u0441\u0442\u044b:</li> </ol> <p>bash</p>"},{"location":"#_7","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 \u0421\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0439\u0442\u0435 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044e:</p> <p>bash mkdocs serve \u041f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u043c\u044b\u0435 \u0442\u0435\u0441\u0442\u044b \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> <p>\u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0442\u0430\u0431\u043b\u0438\u0446\u044b</p> <p>\u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u0441\u0435\u0441\u0441\u0438\u0439</p> <p>\u041c\u043e\u0434\u0430\u043b\u044c\u043d\u044b\u0435 \u043e\u043a\u043d\u0430</p> <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> <p>\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435/\u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0435</p> <p>\u0418\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u0440\u043e\u043b\u0435\u0439</p> <p>\u0421\u0431\u0440\u043e\u0441 \u043f\u0430\u0440\u043e\u043b\u0435\u0439</p> <p>\u0421\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0435 \u0442\u0435\u0441\u0442\u044b:</p> <p>\u0421\u0442\u0430\u0442\u0443\u0441 \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432</p> <p>\u041b\u0438\u0446\u0435\u043d\u0437\u0438\u0438</p>"},{"location":"components/alert_component/","title":"AlertComponent","text":""},{"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.</p> <p>\u041f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0435 \u0442\u0438\u043f\u044b alert-\u043e\u043a\u043e\u043d: error, success, info, warning.</p> \u0410\u0442\u0440\u0438\u0431\u0443\u0442\u044b <p>page: \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright alert_type: \u0442\u0438\u043f alert-\u043e\u043a\u043d\u0430 (error/success/info/warning) text: \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f alert-\u043e\u043a\u043d\u0430</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.\n\n \u041f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0435 \u0442\u0438\u043f\u044b alert-\u043e\u043a\u043e\u043d: error, success, info, warning.\n\n \u0410\u0442\u0440\u0438\u0431\u0443\u0442\u044b:\n page: \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright\n alert_type: \u0442\u0438\u043f alert-\u043e\u043a\u043d\u0430 (error/success/info/warning)\n text: \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f alert-\u043e\u043a\u043d\u0430\n \"\"\"\n\n def __init__(self, page: Page, alert_type: 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 alert-\u043e\u043a\u043d\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 alert_type: \u0442\u0438\u043f alert-\u043e\u043a\u043d\u0430 (error/success/info/warning)\n\n Raises:\n ValueError: \u0435\u0441\u043b\u0438 \u043f\u0435\u0440\u0435\u0434\u0430\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 super().__init__(page)\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 self.alert_type = alert_type\n self.text = Text(page, f\"//div[@class='v-alert {self.alert_type}']/div\", \"Alert message\") \n\n # \u0414\u0435\u0439\u0441\u0442\u0432\u0438\u044f:\n def get_text(self):\n \"\"\"\u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0442\u0435\u043a\u0441\u0442\u0430 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0438\u0437 alert-\u043e\u043a\u043d\u0430.\n\n Returns:\n str: \u0442\u0435\u043a\u0441\u0442 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f alert-\u043e\u043a\u043d\u0430\n \"\"\"\n return self.text.get_text(0)\n\n # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0438:\n def check_presence(self, text):\n \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043d\u0430\u043b\u0438\u0447\u0438\u044f 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: \u0442\u0435\u043a\u0441\u0442 \u0434\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 (\u0435\u0441\u043b\u0438 \u043f\u0443\u0441\u0442\u0430\u044f \u0441\u0442\u0440\u043e\u043a\u0430 - \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u043e\u043a\u043d\u0430)\n\n Raises:\n AssertionError: \u0435\u0441\u043b\u0438 alert-\u043e\u043a\u043d\u043e \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u043e\n \"\"\"\n msg = f\"No {self.alert_type} alert window on page\"\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_absence(self, text, timeout=30000):\n \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u044f 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: \u0442\u0435\u043a\u0441\u0442 \u0434\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438\n timeout: \u0432\u0440\u0435\u043c\u044f \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u044f \u0438\u0441\u0447\u0435\u0437\u043d\u043e\u0432\u0435\u043d\u0438\u044f (\u0432 \u043c\u0438\u043b\u043b\u0438\u0441\u0435\u043a\u0443\u043d\u0434\u0430\u0445)\n\n Raises:\n AssertionError: \u0435\u0441\u043b\u0438 alert-\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 seconds = int(timeout/1000)\n msg = f\"Alert {self.alert_type} 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):\n \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0442\u043e\u0447\u043d\u043e\u0433\u043e \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u044f \u0442\u0435\u043a\u0441\u0442\u0430 \u0432 alert-\u043e\u043a\u043d\u0435.\n\n Args:\n alert_text: \u043e\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: \u0435\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 self.text.check_have_text(alert_text, f\"Unexpected message in alert {self.alert_type} window\")\n</code></pre>"},{"location":"components/alert_component/#components.alert_component.AlertComponent.__init__","title":"<code>__init__(page, alert_type)</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 alert-\u043e\u043a\u043d\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 <code>alert_type</code> <code>str</code> <p>\u0442\u0438\u043f alert-\u043e\u043a\u043d\u0430 (error/success/info/warning)</p> required <p>Raises:</p> Type Description <code>ValueError</code> <p>\u0435\u0441\u043b\u0438 \u043f\u0435\u0440\u0435\u0434\u0430\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 __init__(self, page: Page, alert_type: 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 alert-\u043e\u043a\u043d\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 alert_type: \u0442\u0438\u043f alert-\u043e\u043a\u043d\u0430 (error/success/info/warning)\n\n Raises:\n ValueError: \u0435\u0441\u043b\u0438 \u043f\u0435\u0440\u0435\u0434\u0430\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 super().__init__(page)\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 self.alert_type = alert_type\n self.text = Text(page, f\"//div[@class='v-alert {self.alert_type}']/div\", \"Alert message\") \n</code></pre>"},{"location":"components/alert_component/#components.alert_component.AlertComponent.check_absence","title":"<code>check_absence(text, timeout=30000)</code>","text":"<p>\u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u044f 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> <p>\u0442\u0435\u043a\u0441\u0442 \u0434\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438</p> required <code>timeout</code> <p>\u0432\u0440\u0435\u043c\u044f \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u044f \u0438\u0441\u0447\u0435\u0437\u043d\u043e\u0432\u0435\u043d\u0438\u044f (\u0432 \u043c\u0438\u043b\u043b\u0438\u0441\u0435\u043a\u0443\u043d\u0434\u0430\u0445)</p> <code>30000</code> <p>Raises:</p> Type Description <code>AssertionError</code> <p>\u0435\u0441\u043b\u0438 alert-\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_absence(self, text, timeout=30000):\n \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u044f 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: \u0442\u0435\u043a\u0441\u0442 \u0434\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438\n timeout: \u0432\u0440\u0435\u043c\u044f \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u044f \u0438\u0441\u0447\u0435\u0437\u043d\u043e\u0432\u0435\u043d\u0438\u044f (\u0432 \u043c\u0438\u043b\u043b\u0438\u0441\u0435\u043a\u0443\u043d\u0434\u0430\u0445)\n\n Raises:\n AssertionError: \u0435\u0441\u043b\u0438 alert-\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 seconds = int(timeout/1000)\n msg = f\"Alert {self.alert_type} 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_presence","title":"<code>check_presence(text)</code>","text":"<p>\u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043d\u0430\u043b\u0438\u0447\u0438\u044f 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> <p>\u0442\u0435\u043a\u0441\u0442 \u0434\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 (\u0435\u0441\u043b\u0438 \u043f\u0443\u0441\u0442\u0430\u044f \u0441\u0442\u0440\u043e\u043a\u0430 - \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442\u0441\u044f \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>\u0435\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_presence(self, text):\n \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043d\u0430\u043b\u0438\u0447\u0438\u044f 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: \u0442\u0435\u043a\u0441\u0442 \u0434\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 (\u0435\u0441\u043b\u0438 \u043f\u0443\u0441\u0442\u0430\u044f \u0441\u0442\u0440\u043e\u043a\u0430 - \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u043e\u043a\u043d\u0430)\n\n Raises:\n AssertionError: \u0435\u0441\u043b\u0438 alert-\u043e\u043a\u043d\u043e \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u043e\n \"\"\"\n msg = f\"No {self.alert_type} alert window on page\"\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\u043a\u0430 \u0442\u043e\u0447\u043d\u043e\u0433\u043e \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u044f \u0442\u0435\u043a\u0441\u0442\u0430 \u0432 alert-\u043e\u043a\u043d\u0435.</p> <p>Parameters:</p> Name Type Description Default <code>alert_text</code> <p>\u043e\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>\u0435\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):\n \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0442\u043e\u0447\u043d\u043e\u0433\u043e \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u044f \u0442\u0435\u043a\u0441\u0442\u0430 \u0432 alert-\u043e\u043a\u043d\u0435.\n\n Args:\n alert_text: \u043e\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: \u0435\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 self.text.check_have_text(alert_text, f\"Unexpected message in alert {self.alert_type} window\")\n</code></pre>"},{"location":"components/alert_component/#components.alert_component.AlertComponent.get_text","title":"<code>get_text()</code>","text":"<p>\u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0442\u0435\u043a\u0441\u0442\u0430 \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> <p>\u0442\u0435\u043a\u0441\u0442 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f alert-\u043e\u043a\u043d\u0430</p> Source code in <code>components\\alert_component.py</code> <pre><code>def get_text(self):\n \"\"\"\u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0442\u0435\u043a\u0441\u0442\u0430 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0438\u0437 alert-\u043e\u043a\u043d\u0430.\n\n Returns:\n str: \u0442\u0435\u043a\u0441\u0442 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f alert-\u043e\u043a\u043d\u0430\n \"\"\"\n return self.text.get_text(0)\n</code></pre>"},{"location":"components/base_component/","title":"BaseComponent","text":""},{"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> \u0410\u0442\u0440\u0438\u0431\u0443\u0442\u044b <p>page: \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright</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 \u0410\u0442\u0440\u0438\u0431\u0443\u0442\u044b:\n page: \u044d\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\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 self.page = page\n\n # \u0414\u0435\u0439\u0441\u0442\u0432\u0438\u044f:\n def get_locator(self, locator: str | Locator) -> Locator:\n \"\"\"\u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u0430 Locator \u0438\u0437 \u0441\u0442\u0440\u043e\u043a\u0438 \u0438\u043b\u0438 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0433\u043e Locator.\n\n Args:\n locator: \u0441\u0442\u0440\u043e\u043a\u0430 \u0441 CSS/XPath \u0441\u0435\u043b\u0435\u043a\u0442\u043e\u0440\u043e\u043c \u0438\u043b\u0438 \u043e\u0431\u044a\u0435\u043a\u0442 Locator\n\n Returns:\n Locator: \u043e\u0431\u044a\u0435\u043a\u0442 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u043c\n\n Raises:\n TypeError: \u0435\u0441\u043b\u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u043d \u043d\u0435\u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u044b\u0439 \u0442\u0438\u043f \u043b\u043e\u043a\u0430\u0442\u043e\u0440\u0430\n \"\"\"\n 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, msg):\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 loc = self.get_locator(locator)\n expect(loc).to_be_visible(visible=True, timeout=12000), msg\n\n def is_scrollable_vertically(self, locator) -> bool:\n \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u0439 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0438 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430.\n\n Args:\n locator: \u043b\u043e\u043a\u0430\u0442\u043e\u0440 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\n\n Returns:\n bool: True \u0435\u0441\u043b\u0438 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u0438\u0442\u044c \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u043e\n \"\"\"\n loc = self.get_locator(locator)\n return loc.evaluate(\"el => el.scrollHeight > el.clientHeight\")\n\n def is_scrollable_horizontally(self, locator) -> bool:\n \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0433\u043e\u0440\u0438\u0437\u043e\u043d\u0442\u0430\u043b\u044c\u043d\u043e\u0439 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0438 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430.\n\n Args:\n locator: \u043b\u043e\u043a\u0430\u0442\u043e\u0440 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\n\n Returns:\n bool: True \u0435\u0441\u043b\u0438 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u0438\u0442\u044c \u0433\u043e\u0440\u0438\u0437\u043e\u043d\u0442\u0430\u043b\u044c\u043d\u043e\n \"\"\"\n loc = self.get_locator(locator)\n return loc.evaluate(\"el => el.scrollWidth > el.clientWidth\")\n\n # \u041c\u0435\u0442\u043e\u0434\u044b \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0438:\n def scroll_up(self, locator):\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 loc = self.get_locator(locator)\n loc.evaluate(\"el => el.scrollTo(0, 0)\")\n loc.wait_for(timeout=2000)\n\n # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043f\u043e\u0437\u0438\u0446\u0438\u0438 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0438\n scroll_position = loc.evaluate(\"el => el.scrollTop\")\n assert scroll_position == 0, \"Invalid postion after scroll up\"\n\n def scroll_down(self, locator):\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 loc = self.get_locator(locator)\n loc.evaluate(\"el => el.scrollTo(0, el.scrollHeight)\")\n loc.wait_for(timeout=2000)\n\n # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043f\u043e\u0437\u0438\u0446\u0438\u0438 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0438\n scroll_position = loc.evaluate(\"el => el.scrollTop\")\n assert scroll_position > 0, \"Invalid postion after scroll down\"\n\n def scroll_left(self, locator):\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 loc = self.get_locator(locator)\n\n width = loc.evaluate(\"el => el.scrollWidth\")\n loc.scroll_into_view_if_needed()\n self.page.mouse.wheel(-width, 0)\n\n loc.wait_for(timeout=2000)\n\n # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043f\u043e\u0437\u0438\u0446\u0438\u0438 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0438\n scroll_position = loc.evaluate(\"el => el.scrollLeft\")\n assert scroll_position == 0, \"Invalid postion after scroll left\"\n\n def scroll_right(self, locator):\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 loc = self.get_locator(locator)\n\n width = loc.evaluate(\"el => el.scrollWidth\")\n loc.scroll_into_view_if_needed()\n self.page.mouse.wheel(width, 0)\n\n loc.wait_for(timeout=2000)\n\n # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043f\u043e\u0437\u0438\u0446\u0438\u0438 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0438\n scroll_position = loc.evaluate(\"el => el.scrollLeft\")\n max_scroll_x = loc.evaluate(\"el => el.scrollWidth - el.clientWidth\")\n assert scroll_position >= max_scroll_x, \"Invalid postion after scroll right\"\n</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 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> <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> <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, msg):\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 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) -> 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 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> <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) -> 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 loc = self.get_locator(locator)\n return loc.evaluate(\"el => el.scrollWidth > 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> <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) -> 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 loc = self.get_locator(locator)\n return loc.evaluate(\"el => el.scrollHeight > 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> <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):\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 loc = self.get_locator(locator)\n loc.evaluate(\"el => el.scrollTo(0, el.scrollHeight)\")\n loc.wait_for(timeout=2000)\n\n # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043f\u043e\u0437\u0438\u0446\u0438\u0438 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0438\n scroll_position = loc.evaluate(\"el => el.scrollTop\")\n assert scroll_position > 0, \"Invalid postion after scroll down\"\n</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> <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):\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 loc = self.get_locator(locator)\n\n width = loc.evaluate(\"el => el.scrollWidth\")\n loc.scroll_into_view_if_needed()\n self.page.mouse.wheel(-width, 0)\n\n loc.wait_for(timeout=2000)\n\n # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043f\u043e\u0437\u0438\u0446\u0438\u0438 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0438\n scroll_position = loc.evaluate(\"el => el.scrollLeft\")\n assert scroll_position == 0, \"Invalid postion after scroll left\"\n</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> <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):\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 loc = self.get_locator(locator)\n\n width = loc.evaluate(\"el => el.scrollWidth\")\n loc.scroll_into_view_if_needed()\n self.page.mouse.wheel(width, 0)\n\n loc.wait_for(timeout=2000)\n\n # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043f\u043e\u0437\u0438\u0446\u0438\u0438 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0438\n scroll_position = loc.evaluate(\"el => el.scrollLeft\")\n max_scroll_x = loc.evaluate(\"el => el.scrollWidth - el.clientWidth\")\n assert scroll_position >= max_scroll_x, \"Invalid postion after scroll right\"\n</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> <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):\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 loc = self.get_locator(locator)\n loc.evaluate(\"el => el.scrollTo(0, 0)\")\n loc.wait_for(timeout=2000)\n\n # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043f\u043e\u0437\u0438\u0446\u0438\u0438 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0438\n scroll_position = loc.evaluate(\"el => el.scrollTop\")\n assert scroll_position == 0, \"Invalid postion after scroll up\"\n</code></pre>"},{"location":"components/card_component/","title":"CardComponent","text":""},{"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 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.</p> \u0410\u0442\u0440\u0438\u0431\u0443\u0442\u044b <p>page: \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright logout_button: \u043a\u043d\u043e\u043f\u043a\u0430 \u0432\u044b\u0445\u043e\u0434\u0430 \u0438\u0437 \u0441\u0438\u0441\u0442\u0435\u043c\u044b</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 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\n\n \u0410\u0442\u0440\u0438\u0431\u0443\u0442\u044b:\n page: \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright\n logout_button: \u043a\u043d\u043e\u043f\u043a\u0430 \u0432\u044b\u0445\u043e\u0434\u0430 \u0438\u0437 \u0441\u0438\u0441\u0442\u0435\u043c\u044b\n \"\"\"\n\n def __init__(self, page: Page):\n \"\"\"\u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \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.\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 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\u0430\u0442\u0438\u0435 \u043a\u043d\u043e\u043f\u043a\u0438 \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 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\u0430\u0446\u0438\u044f \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>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\\card_component.py</code> <pre><code>def __init__(self, page: Page):\n \"\"\"\u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \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.\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 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\u0430\u0442\u0438\u0435 \u043a\u043d\u043e\u043f\u043a\u0438 \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\u0430\u0442\u0438\u0435 \u043a\u043d\u043e\u043f\u043a\u0438 \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 self.logout_button.click()\n</code></pre>"},{"location":"components/confirm_component/","title":"ConfirmComponent","text":""},{"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> <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 \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, \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0438\u043c\u0438 \u043a\u043d\u043e\u043f\u043a\u0438 \u043e\u0442\u043c\u0435\u043d\u044b \u0438 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u044f \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f.</p> \u0410\u0442\u0440\u0438\u0431\u0443\u0442\u044b <p>page: \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright title: \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430 \u043e\u043a\u043d\u0430 text: \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0433\u043e \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f close_button: \u043a\u043d\u043e\u043f\u043a\u0430 \u0437\u0430\u043a\u0440\u044b\u0442\u0438\u044f \u043e\u043a\u043d\u0430 cancel_button: \u043a\u043d\u043e\u043f\u043a\u0430 \u043e\u0442\u043c\u0435\u043d\u044b \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f allow_button: \u043a\u043d\u043e\u043f\u043a\u0430 \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>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 \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 \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,\n \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0438\u043c\u0438 \u043a\u043d\u043e\u043f\u043a\u0438 \u043e\u0442\u043c\u0435\u043d\u044b \u0438 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u044f \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f.\n\n \u0410\u0442\u0440\u0438\u0431\u0443\u0442\u044b:\n page: \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright\n title: \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430 \u043e\u043a\u043d\u0430\n text: \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0433\u043e \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f\n close_button: \u043a\u043d\u043e\u043f\u043a\u0430 \u0437\u0430\u043a\u0440\u044b\u0442\u0438\u044f \u043e\u043a\u043d\u0430\n cancel_button: \u043a\u043d\u043e\u043f\u043a\u0430 \u043e\u0442\u043c\u0435\u043d\u044b \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f\n allow_button: \u043a\u043d\u043e\u043f\u043a\u0430 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u044f \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f\n \"\"\"\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 \u043e\u043a\u043d\u0430 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u044f.\n\n Args:\n page: \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright\n cancel_button_text: \u0442\u0435\u043a\u0441\u0442 \u043d\u0430 \u043a\u043d\u043e\u043f\u043a\u0435 \u043e\u0442\u043c\u0435\u043d\u044b\n allow_button_text: \u0442\u0435\u043a\u0441\u0442 \u043d\u0430 \u043a\u043d\u043e\u043f\u043a\u0435 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u044f\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):\n \"\"\"\u041d\u0430\u0436\u0430\u0442\u0438\u0435 \u043a\u043d\u043e\u043f\u043a\u0438 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u044f \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f.\n\n \u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u043a\u043b\u0438\u043a \u043f\u043e \u043a\u043d\u043e\u043f\u043a\u0435 \u0441 \u0442\u0435\u043a\u0441\u0442\u043e\u043c, \u043f\u0435\u0440\u0435\u0434\u0430\u043d\u043d\u044b\u043c \u0432 allow_button_text.\n \"\"\"\n self.allow_button.click()\n\n def click_cancel_button(self):\n \"\"\"\u041d\u0430\u0436\u0430\u0442\u0438\u0435 \u043a\u043d\u043e\u043f\u043a\u0438 \u043e\u0442\u043c\u0435\u043d\u044b \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f.\n\n \u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u043a\u043b\u0438\u043a \u043f\u043e \u043a\u043d\u043e\u043f\u043a\u0435 \u0441 \u0442\u0435\u043a\u0441\u0442\u043e\u043c, \u043f\u0435\u0440\u0435\u0434\u0430\u043d\u043d\u044b\u043c \u0432 cancel_button_text.\n \"\"\"\n self.cancel_button.click()\n\n def click_close_button(self):\n \"\"\"\u041d\u0430\u0436\u0430\u0442\u0438\u0435 \u043a\u043d\u043e\u043f\u043a\u0438 \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 self.close_button.click()\n\n # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0438:\n def check_title(self, title, msg):\n \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0442\u0435\u043a\u0441\u0442\u0430 \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: \u043e\u0436\u0438\u0434\u0430\u0435\u043c\u044b\u0439 \u0442\u0435\u043a\u0441\u0442 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430\n msg: \u0441\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: \u0435\u0441\u043b\u0438 \u0442\u0435\u043a\u0441\u0442 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430 \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 self.title.check_have_text(title, msg)\n\n def check_text(self, text, msg):\n \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0442\u0435\u043a\u0441\u0442\u0430 \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: \u043e\u0436\u0438\u0434\u0430\u0435\u043c\u044b\u0439 \u0442\u0435\u043a\u0441\u0442 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f\n msg: \u0441\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: \u0435\u0441\u043b\u0438 \u0442\u0435\u043a\u0441\u0442 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \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 self.text.check_have_text(text, msg)\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 \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>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 <code>cancel_button_text</code> <code>str</code> <p>\u0442\u0435\u043a\u0441\u0442 \u043d\u0430 \u043a\u043d\u043e\u043f\u043a\u0435 \u043e\u0442\u043c\u0435\u043d\u044b</p> required <code>allow_button_text</code> <code>str</code> <p>\u0442\u0435\u043a\u0441\u0442 \u043d\u0430 \u043a\u043d\u043e\u043f\u043a\u0435 \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 \u043e\u043a\u043d\u0430 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u044f.\n\n Args:\n page: \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright\n cancel_button_text: \u0442\u0435\u043a\u0441\u0442 \u043d\u0430 \u043a\u043d\u043e\u043f\u043a\u0435 \u043e\u0442\u043c\u0435\u043d\u044b\n allow_button_text: \u0442\u0435\u043a\u0441\u0442 \u043d\u0430 \u043a\u043d\u043e\u043f\u043a\u0435 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u044f\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\u043a\u0430 \u0442\u0435\u043a\u0441\u0442\u0430 \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> <p>\u043e\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> <p>\u0441\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>\u0435\u0441\u043b\u0438 \u0442\u0435\u043a\u0441\u0442 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \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\\confirm_component.py</code> <pre><code>def check_text(self, text, msg):\n \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0442\u0435\u043a\u0441\u0442\u0430 \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: \u043e\u0436\u0438\u0434\u0430\u0435\u043c\u044b\u0439 \u0442\u0435\u043a\u0441\u0442 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f\n msg: \u0441\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: \u0435\u0441\u043b\u0438 \u0442\u0435\u043a\u0441\u0442 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \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 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\u043a\u0430 \u0442\u0435\u043a\u0441\u0442\u0430 \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> <p>\u043e\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> <p>\u0441\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>\u0435\u0441\u043b\u0438 \u0442\u0435\u043a\u0441\u0442 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430 \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\\confirm_component.py</code> <pre><code>def check_title(self, title, msg):\n \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0442\u0435\u043a\u0441\u0442\u0430 \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: \u043e\u0436\u0438\u0434\u0430\u0435\u043c\u044b\u0439 \u0442\u0435\u043a\u0441\u0442 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430\n msg: \u0441\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: \u0435\u0441\u043b\u0438 \u0442\u0435\u043a\u0441\u0442 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430 \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 self.title.check_have_text(title, msg)\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\u0430\u0442\u0438\u0435 \u043a\u043d\u043e\u043f\u043a\u0438 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u044f \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f.</p> <p>\u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u043a\u043b\u0438\u043a \u043f\u043e \u043a\u043d\u043e\u043f\u043a\u0435 \u0441 \u0442\u0435\u043a\u0441\u0442\u043e\u043c, \u043f\u0435\u0440\u0435\u0434\u0430\u043d\u043d\u044b\u043c \u0432 allow_button_text.</p> Source code in <code>components\\confirm_component.py</code> <pre><code>def click_allow_button(self):\n \"\"\"\u041d\u0430\u0436\u0430\u0442\u0438\u0435 \u043a\u043d\u043e\u043f\u043a\u0438 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u044f \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f.\n\n \u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u043a\u043b\u0438\u043a \u043f\u043e \u043a\u043d\u043e\u043f\u043a\u0435 \u0441 \u0442\u0435\u043a\u0441\u0442\u043e\u043c, \u043f\u0435\u0440\u0435\u0434\u0430\u043d\u043d\u044b\u043c \u0432 allow_button_text.\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\u0430\u0442\u0438\u0435 \u043a\u043d\u043e\u043f\u043a\u0438 \u043e\u0442\u043c\u0435\u043d\u044b \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f.</p> <p>\u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u043a\u043b\u0438\u043a \u043f\u043e \u043a\u043d\u043e\u043f\u043a\u0435 \u0441 \u0442\u0435\u043a\u0441\u0442\u043e\u043c, \u043f\u0435\u0440\u0435\u0434\u0430\u043d\u043d\u044b\u043c \u0432 cancel_button_text.</p> Source code in <code>components\\confirm_component.py</code> <pre><code>def click_cancel_button(self):\n \"\"\"\u041d\u0430\u0436\u0430\u0442\u0438\u0435 \u043a\u043d\u043e\u043f\u043a\u0438 \u043e\u0442\u043c\u0435\u043d\u044b \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f.\n\n \u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u043a\u043b\u0438\u043a \u043f\u043e \u043a\u043d\u043e\u043f\u043a\u0435 \u0441 \u0442\u0435\u043a\u0441\u0442\u043e\u043c, \u043f\u0435\u0440\u0435\u0434\u0430\u043d\u043d\u044b\u043c \u0432 cancel_button_text.\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\u0430\u0442\u0438\u0435 \u043a\u043d\u043e\u043f\u043a\u0438 \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):\n \"\"\"\u041d\u0430\u0436\u0430\u0442\u0438\u0435 \u043a\u043d\u043e\u043f\u043a\u0438 \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 self.close_button.click()\n</code></pre>"},{"location":"components/modal_window_component/","title":"ModalWindowComponent","text":""},{"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.</p> <p>\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 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u044b\u043c\u0438 \u043e\u043a\u043d\u0430\u043c\u0438: - \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u044b\u043c \u0438 \u043a\u043d\u043e\u043f\u043a\u0430\u043c\u0438 - \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0430 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0433\u043e - \u043f\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</p> \u0410\u0442\u0440\u0438\u0431\u0443\u0442\u044b <p>page: \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright toolbar: \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 \u043f\u0430\u043d\u0435\u043b\u0438 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u043e\u043a\u043d\u0430 content_items: \u0441\u043b\u043e\u0432\u0430\u0440\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0433\u043e buttons: \u0441\u043f\u0438\u0441\u043e\u043a \u043a\u043d\u043e\u043f\u043e\u043a \u043e\u043a\u043d\u0430</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.\n\n \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 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u044b\u043c\u0438 \u043e\u043a\u043d\u0430\u043c\u0438:\n - \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u044b\u043c \u0438 \u043a\u043d\u043e\u043f\u043a\u0430\u043c\u0438\n - \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0430 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0433\u043e\n - \u043f\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\n \u0410\u0442\u0440\u0438\u0431\u0443\u0442\u044b:\n page: \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright\n toolbar: \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 \u043f\u0430\u043d\u0435\u043b\u0438 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u043e\u043a\u043d\u0430\n content_items: \u0441\u043b\u043e\u0432\u0430\u0440\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0433\u043e\n buttons: \u0441\u043f\u0438\u0441\u043e\u043a \u043a\u043d\u043e\u043f\u043e\u043a \u043e\u043a\u043d\u0430\n \"\"\"\n\n def __init__(self, page: Page):\n \"\"\"\u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\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 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, item):\n \"\"\"\u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0433\u043e \u0432 \u043e\u043a\u043d\u043e.\n\n Args:\n name: \u0438\u043c\u044f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\n item: \u043e\u0431\u044a\u0435\u043a\u0442 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\n \"\"\"\n self.content_items[name] = item\n\n def get_content_item(self, name):\n \"\"\"\u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0433\u043e \u043f\u043e \u0438\u043c\u0435\u043d\u0438.\n\n Args:\n name: \u0438\u043c\u044f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\n\n Returns:\n \u042d\u043b\u0435\u043c\u0435\u043d\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0433\u043e \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):\n \"\"\"\u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430 \u0432 \u043f\u0430\u043d\u0435\u043b\u044c \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432.\n\n Args:\n title: \u0442\u0435\u043a\u0441\u0442 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430\n \"\"\"\n self.toolbar.add_title(title)\n\n def add_toolbar_button(self, locator, name):\n \"\"\"\u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043a\u043d\u043e\u043f\u043a\u0438 \u0432 \u043f\u0430\u043d\u0435\u043b\u044c \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432.\n\n Args:\n locator: \u043b\u043e\u043a\u0430\u0442\u043e\u0440 \u043a\u043d\u043e\u043f\u043a\u0438\n name: \u0438\u043c\u044f \u043a\u043d\u043e\u043f\u043a\u0438\n \"\"\"\n self.toolbar.add_button(locator, name)\n\n def add_button(self, locator, name):\n \"\"\"\u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043a\u043d\u043e\u043f\u043a\u0438 \u0432 \u043e\u043a\u043d\u043e.\n\n Args:\n locator: \u043b\u043e\u043a\u0430\u0442\u043e\u0440 \u043a\u043d\u043e\u043f\u043a\u0438\n name: \u0438\u043c\u044f \u043a\u043d\u043e\u043f\u043a\u0438\n \"\"\"\n self.buttons.append(Button(self.page, locator, name))\n\n def get_button_by_name(self, name) -> Button | None:\n \"\"\"\u041f\u043e\u0438\u0441\u043a \u043a\u043d\u043e\u043f\u043a\u0438 \u043f\u043e \u0438\u043c\u0435\u043d\u0438.\n\n Args:\n name: \u0438\u043c\u044f \u043a\u043d\u043e\u043f\u043a\u0438\n\n Returns:\n Button: \u043d\u0430\u0439\u0434\u0435\u043d\u043d\u0430\u044f \u043a\u043d\u043e\u043f\u043a\u0430 \u0438\u043b\u0438 None\n \"\"\"\n for button in self.buttons:\n if button.name == name:\n return button\n return None\n\n def click_button(self, name):\n \"\"\"\u041d\u0430\u0436\u0430\u0442\u0438\u0435 \u043a\u043d\u043e\u043f\u043a\u0438 \u043f\u043e \u0438\u043c\u0435\u043d\u0438.\n\n Args:\n name: \u0438\u043c\u044f \u043a\u043d\u043e\u043f\u043a\u0438\n\n Raises:\n AssertionError: \u0435\u0441\u043b\u0438 \u043a\u043d\u043e\u043f\u043a\u0430 \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u0430\n \"\"\"\n button = self.get_button_by_name(name)\n if button is None:\n assert False, f\"Button with name '{name}' not found\"\n button.click()\n\n def click_toolbar_close_button(self):\n \"\"\"\u041d\u0430\u0436\u0430\u0442\u0438\u0435 \u043a\u043d\u043e\u043f\u043a\u0438 \u0437\u0430\u043a\u0440\u044b\u0442\u0438\u044f \u0432 \u043f\u0430\u043d\u0435\u043b\u0438 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432.\"\"\"\n self.toolbar.click_button(\"close\")\n\n def scroll_window_down(self):\n \"\"\"\u041f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0430 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0433\u043e \u043e\u043a\u043d\u0430 \u0432\u043d\u0438\u0437.\"\"\"\n self.scroll_down(ModalWindowLocators.MODAL_WINDOW)\n\n def scroll_window_up(self):\n \"\"\"\u041f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0430 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0433\u043e \u043e\u043a\u043d\u0430 \u0432\u0432\u0435\u0440\u0445.\"\"\"\n self.scroll_up(ModalWindowLocators.MODAL_WINDOW)\n\n def scroll_window_left(self):\n \"\"\"\u041f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0430 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0433\u043e \u043e\u043a\u043d\u0430 \u0432\u043b\u0435\u0432\u043e.\"\"\"\n self.scroll_left(ModalWindowLocators.MODAL_WINDOW)\n\n def scroll_window_right(self):\n \"\"\"\u041f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0430 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0433\u043e \u043e\u043a\u043d\u0430 \u0432\u043f\u0440\u0430\u0432\u043e.\"\"\"\n self.scroll_right(ModalWindowLocators.MODAL_WINDOW)\n\n # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0438:\n def check_window_vertical_scrolling(self):\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.\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\n \"\"\"\n return self.is_scrollable_vertically(ModalWindowLocators.MODAL_WINDOW)\n\n def check_window_horizontal_scrolling(self):\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.\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\n \"\"\"\n return self.is_scrollable_horizontally(ModalWindowLocators.MODAL_WINDOW)\n\n def check_by_window_title(self):\n \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043d\u0430\u043b\u0438\u0447\u0438\u044f \u043e\u043a\u043d\u0430 \u043f\u043e \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0443.\n\n Raises:\n AssertionError: \u0435\u0441\u043b\u0438 \u043e\u043a\u043d\u043e \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u043e\n \"\"\"\n self.toolbar.check_presence(f\"Modal window with '{self.toolbar.title}' is missing\")\n\n def check_button_presence(self, name):\n \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043d\u0430\u043b\u0438\u0447\u0438\u044f \u043a\u043d\u043e\u043f\u043a\u0438 \u043f\u043e \u0438\u043c\u0435\u043d\u0438.\n\n Args:\n name: \u0438\u043c\u044f \u043a\u043d\u043e\u043f\u043a\u0438\n\n Raises:\n AssertionError: \u0435\u0441\u043b\u0438 \u043a\u043d\u043e\u043f\u043a\u0430 \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u0430\n \"\"\"\n button = self.get_button_by_name(name)\n if button is None:\n 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):\n \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043d\u0430\u043b\u0438\u0447\u0438\u044f \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 Args:\n name: \u0438\u043c\u044f \u043a\u043d\u043e\u043f\u043a\u0438\n \"\"\"\n self.toolbar.check_button_presence(name)\n\n def check_toolbar_button_tooltip(self, name, tooltip):\n \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0438 \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 Args:\n name: \u0438\u043c\u044f \u043a\u043d\u043e\u043f\u043a\u0438\n tooltip: \u043e\u0436\u0438\u0434\u0430\u0435\u043c\u044b\u0439 \u0442\u0435\u043a\u0441\u0442 \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0438\n \"\"\"\n self.toolbar.check_button_tooltip(name, tooltip)\n</code></pre>"},{"location":"components/modal_window_component/#components.modal_window_component.ModalWindowComponent.__init__","title":"<code>__init__(page)</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 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\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\\modal_window_component.py</code> <pre><code>def __init__(self, page: Page):\n \"\"\"\u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\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 super().__init__(page)\n self.toolbar = ToolbarComponent(page, \"\")\n self.content_items = {}\n self.buttons = []\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\u0435\u043d\u0438\u0435 \u043a\u043d\u043e\u043f\u043a\u0438 \u0432 \u043e\u043a\u043d\u043e.</p> <p>Parameters:</p> Name Type Description Default <code>locator</code> <p>\u043b\u043e\u043a\u0430\u0442\u043e\u0440 \u043a\u043d\u043e\u043f\u043a\u0438</p> required <code>name</code> <p>\u0438\u043c\u044f \u043a\u043d\u043e\u043f\u043a\u0438</p> required Source code in <code>components\\modal_window_component.py</code> <pre><code>def add_button(self, locator, name):\n \"\"\"\u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043a\u043d\u043e\u043f\u043a\u0438 \u0432 \u043e\u043a\u043d\u043e.\n\n Args:\n locator: \u043b\u043e\u043a\u0430\u0442\u043e\u0440 \u043a\u043d\u043e\u043f\u043a\u0438\n name: \u0438\u043c\u044f \u043a\u043d\u043e\u043f\u043a\u0438\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\u0435\u043d\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0433\u043e \u0432 \u043e\u043a\u043d\u043e.</p> <p>Parameters:</p> Name Type Description Default <code>name</code> <p>\u0438\u043c\u044f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430</p> required <code>item</code> <p>\u043e\u0431\u044a\u0435\u043a\u0442 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430</p> required Source code in <code>components\\modal_window_component.py</code> <pre><code>def add_content_item(self, name, item):\n \"\"\"\u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0433\u043e \u0432 \u043e\u043a\u043d\u043e.\n\n Args:\n name: \u0438\u043c\u044f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\n item: \u043e\u0431\u044a\u0435\u043a\u0442 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\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\u0435\u043d\u0438\u0435 \u043a\u043d\u043e\u043f\u043a\u0438 \u0432 \u043f\u0430\u043d\u0435\u043b\u044c \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432.</p> <p>Parameters:</p> Name Type Description Default <code>locator</code> <p>\u043b\u043e\u043a\u0430\u0442\u043e\u0440 \u043a\u043d\u043e\u043f\u043a\u0438</p> required <code>name</code> <p>\u0438\u043c\u044f \u043a\u043d\u043e\u043f\u043a\u0438</p> required Source code in <code>components\\modal_window_component.py</code> <pre><code>def add_toolbar_button(self, locator, name):\n \"\"\"\u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043a\u043d\u043e\u043f\u043a\u0438 \u0432 \u043f\u0430\u043d\u0435\u043b\u044c \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432.\n\n Args:\n locator: \u043b\u043e\u043a\u0430\u0442\u043e\u0440 \u043a\u043d\u043e\u043f\u043a\u0438\n name: \u0438\u043c\u044f \u043a\u043d\u043e\u043f\u043a\u0438\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\u0435\u043d\u0438\u0435 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430 \u0432 \u043f\u0430\u043d\u0435\u043b\u044c \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432.</p> <p>Parameters:</p> Name Type Description Default <code>title</code> <code>str</code> <p>\u0442\u0435\u043a\u0441\u0442 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430</p> required Source code in <code>components\\modal_window_component.py</code> <pre><code>def add_toolbar_title(self, title: str):\n \"\"\"\u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430 \u0432 \u043f\u0430\u043d\u0435\u043b\u044c \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432.\n\n Args:\n title: \u0442\u0435\u043a\u0441\u0442 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\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\u043a\u0430 \u043d\u0430\u043b\u0438\u0447\u0438\u044f \u043a\u043d\u043e\u043f\u043a\u0438 \u043f\u043e \u0438\u043c\u0435\u043d\u0438.</p> <p>Parameters:</p> Name Type Description Default <code>name</code> <p>\u0438\u043c\u044f \u043a\u043d\u043e\u043f\u043a\u0438</p> required <p>Raises:</p> Type Description <code>AssertionError</code> <p>\u0435\u0441\u043b\u0438 \u043a\u043d\u043e\u043f\u043a\u0430 \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):\n \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043d\u0430\u043b\u0438\u0447\u0438\u044f \u043a\u043d\u043e\u043f\u043a\u0438 \u043f\u043e \u0438\u043c\u0435\u043d\u0438.\n\n Args:\n name: \u0438\u043c\u044f \u043a\u043d\u043e\u043f\u043a\u0438\n\n Raises:\n AssertionError: \u0435\u0441\u043b\u0438 \u043a\u043d\u043e\u043f\u043a\u0430 \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u0430\n \"\"\"\n button = self.get_button_by_name(name)\n if button is None:\n 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\u043a\u0430 \u043d\u0430\u043b\u0438\u0447\u0438\u044f \u043e\u043a\u043d\u0430 \u043f\u043e \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0443.</p> <p>Raises:</p> Type Description <code>AssertionError</code> <p>\u0435\u0441\u043b\u0438 \u043e\u043a\u043d\u043e \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u043e</p> Source code in <code>components\\modal_window_component.py</code> <pre><code>def check_by_window_title(self):\n \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043d\u0430\u043b\u0438\u0447\u0438\u044f \u043e\u043a\u043d\u0430 \u043f\u043e \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0443.\n\n Raises:\n AssertionError: \u0435\u0441\u043b\u0438 \u043e\u043a\u043d\u043e \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u043e\n \"\"\"\n self.toolbar.check_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\u043a\u0430 \u043d\u0430\u043b\u0438\u0447\u0438\u044f \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> <p>Parameters:</p> Name Type Description Default <code>name</code> <p>\u0438\u043c\u044f \u043a\u043d\u043e\u043f\u043a\u0438</p> required Source code in <code>components\\modal_window_component.py</code> <pre><code>def check_toolbar_button_presence(self, name):\n \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043d\u0430\u043b\u0438\u0447\u0438\u044f \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 Args:\n name: \u0438\u043c\u044f \u043a\u043d\u043e\u043f\u043a\u0438\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\u043a\u0430 \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0438 \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> <p>Parameters:</p> Name Type Description Default <code>name</code> <p>\u0438\u043c\u044f \u043a\u043d\u043e\u043f\u043a\u0438</p> required <code>tooltip</code> <p>\u043e\u0436\u0438\u0434\u0430\u0435\u043c\u044b\u0439 \u0442\u0435\u043a\u0441\u0442 \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0438</p> required Source code in <code>components\\modal_window_component.py</code> <pre><code>def check_toolbar_button_tooltip(self, name, tooltip):\n \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0438 \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 Args:\n name: \u0438\u043c\u044f \u043a\u043d\u043e\u043f\u043a\u0438\n tooltip: \u043e\u0436\u0438\u0434\u0430\u0435\u043c\u044b\u0439 \u0442\u0435\u043a\u0441\u0442 \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0438\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\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.</p> <p>Returns:</p> Name Type Description <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</p> Source code in <code>components\\modal_window_component.py</code> <pre><code>def check_window_horizontal_scrolling(self):\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.\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\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\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.</p> <p>Returns:</p> Name Type Description <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</p> Source code in <code>components\\modal_window_component.py</code> <pre><code>def check_window_vertical_scrolling(self):\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.\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\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>\u041d\u0430\u0436\u0430\u0442\u0438\u0435 \u043a\u043d\u043e\u043f\u043a\u0438 \u043f\u043e \u0438\u043c\u0435\u043d\u0438.</p> <p>Parameters:</p> Name Type Description Default <code>name</code> <p>\u0438\u043c\u044f \u043a\u043d\u043e\u043f\u043a\u0438</p> required <p>Raises:</p> Type Description <code>AssertionError</code> <p>\u0435\u0441\u043b\u0438 \u043a\u043d\u043e\u043f\u043a\u0430 \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):\n \"\"\"\u041d\u0430\u0436\u0430\u0442\u0438\u0435 \u043a\u043d\u043e\u043f\u043a\u0438 \u043f\u043e \u0438\u043c\u0435\u043d\u0438.\n\n Args:\n name: \u0438\u043c\u044f \u043a\u043d\u043e\u043f\u043a\u0438\n\n Raises:\n AssertionError: \u0435\u0441\u043b\u0438 \u043a\u043d\u043e\u043f\u043a\u0430 \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u0430\n \"\"\"\n button = self.get_button_by_name(name)\n if button is None:\n 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>\u041d\u0430\u0436\u0430\u0442\u0438\u0435 \u043a\u043d\u043e\u043f\u043a\u0438 \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):\n \"\"\"\u041d\u0430\u0436\u0430\u0442\u0438\u0435 \u043a\u043d\u043e\u043f\u043a\u0438 \u0437\u0430\u043a\u0440\u044b\u0442\u0438\u044f \u0432 \u043f\u0430\u043d\u0435\u043b\u0438 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432.\"\"\"\n self.toolbar.click_button(\"close\")\n</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>\u041f\u043e\u0438\u0441\u043a \u043a\u043d\u043e\u043f\u043a\u0438 \u043f\u043e \u0438\u043c\u0435\u043d\u0438.</p> <p>Parameters:</p> Name Type Description Default <code>name</code> <p>\u0438\u043c\u044f \u043a\u043d\u043e\u043f\u043a\u0438</p> required <p>Returns:</p> Name Type Description <code>Button</code> <code>Button | None</code> <p>\u043d\u0430\u0439\u0434\u0435\u043d\u043d\u0430\u044f \u043a\u043d\u043e\u043f\u043a\u0430 \u0438\u043b\u0438 None</p> Source code in <code>components\\modal_window_component.py</code> <pre><code>def get_button_by_name(self, name) -> Button | None:\n \"\"\"\u041f\u043e\u0438\u0441\u043a \u043a\u043d\u043e\u043f\u043a\u0438 \u043f\u043e \u0438\u043c\u0435\u043d\u0438.\n\n Args:\n name: \u0438\u043c\u044f \u043a\u043d\u043e\u043f\u043a\u0438\n\n Returns:\n Button: \u043d\u0430\u0439\u0434\u0435\u043d\u043d\u0430\u044f \u043a\u043d\u043e\u043f\u043a\u0430 \u0438\u043b\u0438 None\n \"\"\"\n for button in self.buttons:\n if button.name == name:\n return button\n return None\n</code></pre>"},{"location":"components/modal_window_component/#components.modal_window_component.ModalWindowComponent.get_content_item","title":"<code>get_content_item(name)</code>","text":"<p>\u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0433\u043e \u043f\u043e \u0438\u043c\u0435\u043d\u0438.</p> <p>Parameters:</p> Name Type Description Default <code>name</code> <p>\u0438\u043c\u044f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430</p> required <p>Returns:</p> Type Description <p>\u042d\u043b\u0435\u043c\u0435\u043d\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0433\u043e \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):\n \"\"\"\u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0433\u043e \u043f\u043e \u0438\u043c\u0435\u043d\u0438.\n\n Args:\n name: \u0438\u043c\u044f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\n\n Returns:\n \u042d\u043b\u0435\u043c\u0435\u043d\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0433\u043e \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\u0442\u043a\u0430 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0433\u043e \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):\n \"\"\"\u041f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0430 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0433\u043e \u043e\u043a\u043d\u0430 \u0432\u043d\u0438\u0437.\"\"\"\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\u0442\u043a\u0430 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0433\u043e \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):\n \"\"\"\u041f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0430 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0433\u043e \u043e\u043a\u043d\u0430 \u0432\u043b\u0435\u0432\u043e.\"\"\"\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\u0442\u043a\u0430 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0433\u043e \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):\n \"\"\"\u041f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0430 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0433\u043e \u043e\u043a\u043d\u0430 \u0432\u043f\u0440\u0430\u0432\u043e.\"\"\"\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\u0442\u043a\u0430 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0433\u043e \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):\n \"\"\"\u041f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0430 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0433\u043e \u043e\u043a\u043d\u0430 \u0432\u0432\u0435\u0440\u0445.\"\"\"\n self.scroll_up(ModalWindowLocators.MODAL_WINDOW)\n</code></pre>"},{"location":"components/navbar_component/","title":"NavigationPanelComponent","text":""},{"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.</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 \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u043e\u043d\u043d\u043e\u0439 \u043f\u0430\u043d\u0435\u043b\u0438. \u041d\u0430\u0441\u043b\u0435\u0434\u0443\u0435\u0442\u0441\u044f \u043e\u0442 BaseComponent.</p> \u0410\u0442\u0440\u0438\u0431\u0443\u0442\u044b <p>page: Page - \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright</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.\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 \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u043e\u043d\u043d\u043e\u0439 \u043f\u0430\u043d\u0435\u043b\u0438.\n \u041d\u0430\u0441\u043b\u0435\u0434\u0443\u0435\u0442\u0441\u044f \u043e\u0442 BaseComponent.\n\n \u0410\u0442\u0440\u0438\u0431\u0443\u0442\u044b:\n page: Page - \u044d\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\u0430\u0446\u0438\u044f \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.\n\n Args:\n page: Page - \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright\n \"\"\"\n super().__init__(page)\n\n # \u0414\u0435\u0439\u0441\u0442\u0432\u0438\u044f:\n def get_item_names(self, locator):\n \"\"\"\u041f\u043e\u043b\u0443\u0447\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 \u0434\u043b\u044f \u043f\u043e\u0438\u0441\u043a\u0430 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432\n\n Returns:\n list: \u0421\u043f\u0438\u0441\u043e\u043a \u0442\u0435\u043a\u0441\u0442\u043e\u0432 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432\n \"\"\"\n loc = self.get_locator(locator)\n return loc.all_inner_texts()\n\n def click_item(self, locator, item_name):\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 \u0434\u043b\u044f \u043f\u043e\u0438\u0441\u043a\u0430 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\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 loc = self.get_locator(locator)\n loc.get_by_text(item_name).click()\n\n def click_sub_item(self, locator, sublevel_number, item_name):\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 locator: \u041b\u043e\u043a\u0430\u0442\u043e\u0440 \u0434\u043b\u044f \u043f\u043e\u0438\u0441\u043a\u0430 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\n sublevel_number: \u0423\u0440\u043e\u0432\u0435\u043d\u044c \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u043e\u0441\u0442\u0438 (1 \u0438\u043b\u0438 2)\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 Raises:\n ValueError: \u0415\u0441\u043b\u0438 \u0443\u043a\u0430\u0437\u0430\u043d \u043d\u0435\u0434\u043e\u043f\u0443\u0441\u0442\u0438\u043c\u044b\u0439 \u0443\u0440\u043e\u0432\u0435\u043d\u044c \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u043e\u0441\u0442\u0438\n \"\"\"\n root_locator = self.get_locator(NavigationPanelLocators.NODE_ROOT)\n children_locator = self.get_locator(NavigationPanelLocators.NODE_CHILDREN)\n\n loc = self.get_locator(locator)\n\n if sublevel_number == 1:\n loc.locator(root_locator).get_by_text(item_name).click()\n elif sublevel_number == 2:\n loc.locator(children_locator).locator(root_locator).get_by_text(item_name).click()\n else:\n raise ValueError(\"the navigation panel has two levels of nesting only\")\n\n # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0438:\n def check_item_visibility(self, locator, item_name):\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 \u0434\u043b\u044f \u043f\u043e\u0438\u0441\u043a\u0430 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\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 loc = self.get_locator(locator).get_by_text(item_name)\n msg = f\"Navigation panel item '{item_name}' is not visible\"\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\u0430\u0446\u0438\u044f \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.</p> <p>Parameters:</p> Name Type Description Default <code>page</code> <code>Page</code> <p>Page - \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\\navbar_component.py</code> <pre><code>def __init__(self, page: Page):\n \"\"\"\u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \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.\n\n Args:\n page: Page - \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright\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> <p>\u041b\u043e\u043a\u0430\u0442\u043e\u0440 \u0434\u043b\u044f \u043f\u043e\u0438\u0441\u043a\u0430 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430</p> required <code>item_name</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 Source code in <code>components\\navbar_component.py</code> <pre><code>def check_item_visibility(self, locator, item_name):\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 \u0434\u043b\u044f \u043f\u043e\u0438\u0441\u043a\u0430 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\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 loc = self.get_locator(locator).get_by_text(item_name)\n msg = f\"Navigation panel item '{item_name}' is not visible\"\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> <p>\u041b\u043e\u043a\u0430\u0442\u043e\u0440 \u0434\u043b\u044f \u043f\u043e\u0438\u0441\u043a\u0430 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430</p> required <code>item_name</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, item_name):\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 \u0434\u043b\u044f \u043f\u043e\u0438\u0441\u043a\u0430 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\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 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(locator, sublevel_number, 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>locator</code> <p>\u041b\u043e\u043a\u0430\u0442\u043e\u0440 \u0434\u043b\u044f \u043f\u043e\u0438\u0441\u043a\u0430 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430</p> required <code>sublevel_number</code> <p>\u0423\u0440\u043e\u0432\u0435\u043d\u044c \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u043e\u0441\u0442\u0438 (1 \u0438\u043b\u0438 2)</p> required <code>item_name</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 <p>Raises:</p> Type Description <code>ValueError</code> <p>\u0415\u0441\u043b\u0438 \u0443\u043a\u0430\u0437\u0430\u043d \u043d\u0435\u0434\u043e\u043f\u0443\u0441\u0442\u0438\u043c\u044b\u0439 \u0443\u0440\u043e\u0432\u0435\u043d\u044c \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u043e\u0441\u0442\u0438</p> Source code in <code>components\\navbar_component.py</code> <pre><code>def click_sub_item(self, locator, sublevel_number, item_name):\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 locator: \u041b\u043e\u043a\u0430\u0442\u043e\u0440 \u0434\u043b\u044f \u043f\u043e\u0438\u0441\u043a\u0430 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\n sublevel_number: \u0423\u0440\u043e\u0432\u0435\u043d\u044c \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u043e\u0441\u0442\u0438 (1 \u0438\u043b\u0438 2)\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 Raises:\n ValueError: \u0415\u0441\u043b\u0438 \u0443\u043a\u0430\u0437\u0430\u043d \u043d\u0435\u0434\u043e\u043f\u0443\u0441\u0442\u0438\u043c\u044b\u0439 \u0443\u0440\u043e\u0432\u0435\u043d\u044c \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u043e\u0441\u0442\u0438\n \"\"\"\n root_locator = self.get_locator(NavigationPanelLocators.NODE_ROOT)\n children_locator = self.get_locator(NavigationPanelLocators.NODE_CHILDREN)\n\n loc = self.get_locator(locator)\n\n if sublevel_number == 1:\n loc.locator(root_locator).get_by_text(item_name).click()\n elif sublevel_number == 2:\n loc.locator(children_locator).locator(root_locator).get_by_text(item_name).click()\n else:\n raise ValueError(\"the navigation panel has two levels of nesting only\")\n</code></pre>"},{"location":"components/navbar_component/#components.navbar_component.NavigationPanelComponent.get_item_names","title":"<code>get_item_names(locator)</code>","text":"<p>\u041f\u043e\u043b\u0443\u0447\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> <p>\u041b\u043e\u043a\u0430\u0442\u043e\u0440 \u0434\u043b\u044f \u043f\u043e\u0438\u0441\u043a\u0430 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432</p> required <p>Returns:</p> Name Type Description <code>list</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):\n \"\"\"\u041f\u043e\u043b\u0443\u0447\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 \u0434\u043b\u044f \u043f\u043e\u0438\u0441\u043a\u0430 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432\n\n Returns:\n list: \u0421\u043f\u0438\u0441\u043e\u043a \u0442\u0435\u043a\u0441\u0442\u043e\u0432 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432\n \"\"\"\n loc = self.get_locator(locator)\n return loc.all_inner_texts()\n</code></pre>"},{"location":"components/table_component/","title":"TableComponent","text":""},{"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.</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\u0430\u043c\u0438 \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0438\u0445 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f. \u041d\u0430\u0441\u043b\u0435\u0434\u0443\u0435\u0442\u0441\u044f \u043e\u0442 BaseComponent.</p> \u0410\u0442\u0440\u0438\u0431\u0443\u0442\u044b <p>page: Page - \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright</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.\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\u0430\u043c\u0438 \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0438\u0445 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f.\n \u041d\u0430\u0441\u043b\u0435\u0434\u0443\u0435\u0442\u0441\u044f \u043e\u0442 BaseComponent.\n\n \u0410\u0442\u0440\u0438\u0431\u0443\u0442\u044b:\n page: Page - \u044d\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\u0430\u0446\u0438\u044f \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430 \u0442\u0430\u0431\u043b\u0438\u0446\u044b.\n\n Args:\n page: Page - \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright\n \"\"\"\n super().__init__(page)\n\n # \u0414\u0435\u0439\u0441\u0442\u0432\u0438\u044f:\n def read(self, locator) -> []:\n \"\"\"\u0427\u0438\u0442\u0430\u0435\u0442 \u0434\u0430\u043d\u043d\u044b\u0435 \u0438\u0437 \u0442\u0430\u0431\u043b\u0438\u0446\u044b, \u0432\u043a\u043b\u044e\u0447\u0430\u044f \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0438 \u0438 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u044f\u0447\u0435\u0435\u043a.\n\n Args:\n locator: \u041b\u043e\u043a\u0430\u0442\u043e\u0440 \u0442\u0430\u0431\u043b\u0438\u0446\u044b\n\n Returns:\n list: \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 (\u043f\u0435\u0440\u0432\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 - \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0438)\n \"\"\"\n table_data = []\n\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 \u043f\u043e \u0441\u0442\u0440\u043e\u043a\u0430\u043c\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):\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 Raises:\n AssertionError: \u0415\u0441\u043b\u0438 \u043f\u0435\u0440\u0432\u0430\u044f \u0441\u0442\u0440\u043e\u043a\u0430 \u043d\u0435 \u0432\u0438\u0434\u0438\u043c\u0430\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):\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 Raises:\n AssertionError: \u0415\u0441\u043b\u0438 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u044f\u044f \u0441\u0442\u0440\u043e\u043a\u0430 \u043d\u0435 \u0432\u0438\u0434\u0438\u043c\u0430\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, row_index):\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 \u043a\u0443\u0440\u0441\u043e\u0440\u0430.\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 Raises:\n AssertionError: \u0415\u0441\u043b\u0438 \u0446\u0432\u0435\u0442 \u0441\u0442\u0440\u043e\u043a\u0438 \u043d\u0435 \u0438\u0437\u043c\u0435\u043d\u0438\u043b\u0441\u044f \u043f\u0440\u0438 \u043d\u0430\u0432\u0435\u0434\u0435\u043d\u0438\u0438\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\n # \u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0441 \u043f\u043e\u0434\u0441\u0432\u0435\u0442\u043a\u043e\u0439 \u0438 \u0435\u0433\u043e \u0446\u0432\u0435\u0442\u0430\n hover_element = row.locator(\".body-row-hover\")\n initial_color = hover_element.evaluate(\"el => window.getComputedStyle(el).backgroundColor\")\n\n # \u041d\u0430\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u043d\u0430 \u0441\u0442\u0440\u043e\u043a\u0443\n row.hover()\n self.page.wait_for_timeout(300) # 0.3 \u0441\u0435\u043a\u0443\u043d\u0434\u044b\n\n # \u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u043d\u043e\u0432\u043e\u0433\u043e \u0446\u0432\u0435\u0442\u0430\n new_color = hover_element.evaluate(\"el => window.getComputedStyle(el).backgroundColor\")\n\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\u0430\u0446\u0438\u044f \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430 \u0442\u0430\u0431\u043b\u0438\u0446\u044b.</p> <p>Parameters:</p> Name Type Description Default <code>page</code> <code>Page</code> <p>Page - \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\\table_component.py</code> <pre><code>def __init__(self, page: Page):\n \"\"\"\u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430 \u0442\u0430\u0431\u043b\u0438\u0446\u044b.\n\n Args:\n page: Page - \u044d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright\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> <p>\u041b\u043e\u043a\u0430\u0442\u043e\u0440 \u0442\u0430\u0431\u043b\u0438\u0446\u044b</p> required <p>Raises:</p> Type Description <code>AssertionError</code> <p>\u0415\u0441\u043b\u0438 \u043f\u0435\u0440\u0432\u0430\u044f \u0441\u0442\u0440\u043e\u043a\u0430 \u043d\u0435 \u0432\u0438\u0434\u0438\u043c\u0430</p> Source code in <code>components\\table_component.py</code> <pre><code>def check_first_row_visibility(self, locator):\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 Raises:\n AssertionError: \u0415\u0441\u043b\u0438 \u043f\u0435\u0440\u0432\u0430\u044f \u0441\u0442\u0440\u043e\u043a\u0430 \u043d\u0435 \u0432\u0438\u0434\u0438\u043c\u0430\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> <p>\u041b\u043e\u043a\u0430\u0442\u043e\u0440 \u0442\u0430\u0431\u043b\u0438\u0446\u044b</p> required <p>Raises:</p> Type Description <code>AssertionError</code> <p>\u0415\u0441\u043b\u0438 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u044f\u044f \u0441\u0442\u0440\u043e\u043a\u0430 \u043d\u0435 \u0432\u0438\u0434\u0438\u043c\u0430</p> Source code in <code>components\\table_component.py</code> <pre><code>def check_last_row_visibility(self, locator):\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 Raises:\n AssertionError: \u0415\u0441\u043b\u0438 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u044f\u044f \u0441\u0442\u0440\u043e\u043a\u0430 \u043d\u0435 \u0432\u0438\u0434\u0438\u043c\u0430\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 \u043a\u0443\u0440\u0441\u043e\u0440\u0430.</p> <p>Parameters:</p> Name Type Description Default <code>locator</code> <p>\u041b\u043e\u043a\u0430\u0442\u043e\u0440 \u0442\u0430\u0431\u043b\u0438\u0446\u044b</p> required <code>row_index</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 \u0446\u0432\u0435\u0442 \u0441\u0442\u0440\u043e\u043a\u0438 \u043d\u0435 \u0438\u0437\u043c\u0435\u043d\u0438\u043b\u0441\u044f \u043f\u0440\u0438 \u043d\u0430\u0432\u0435\u0434\u0435\u043d\u0438\u0438</p> Source code in <code>components\\table_component.py</code> <pre><code>def check_row_highlighting(self, locator, row_index):\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 \u043a\u0443\u0440\u0441\u043e\u0440\u0430.\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 Raises:\n AssertionError: \u0415\u0441\u043b\u0438 \u0446\u0432\u0435\u0442 \u0441\u0442\u0440\u043e\u043a\u0438 \u043d\u0435 \u0438\u0437\u043c\u0435\u043d\u0438\u043b\u0441\u044f \u043f\u0440\u0438 \u043d\u0430\u0432\u0435\u0434\u0435\u043d\u0438\u0438\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\n # \u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0441 \u043f\u043e\u0434\u0441\u0432\u0435\u0442\u043a\u043e\u0439 \u0438 \u0435\u0433\u043e \u0446\u0432\u0435\u0442\u0430\n hover_element = row.locator(\".body-row-hover\")\n initial_color = hover_element.evaluate(\"el => window.getComputedStyle(el).backgroundColor\")\n\n # \u041d\u0430\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u043d\u0430 \u0441\u0442\u0440\u043e\u043a\u0443\n row.hover()\n self.page.wait_for_timeout(300) # 0.3 \u0441\u0435\u043a\u0443\u043d\u0434\u044b\n\n # \u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u043d\u043e\u0432\u043e\u0433\u043e \u0446\u0432\u0435\u0442\u0430\n new_color = hover_element.evaluate(\"el => window.getComputedStyle(el).backgroundColor\")\n\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.read","title":"<code>read(locator)</code>","text":"<p>\u0427\u0438\u0442\u0430\u0435\u0442 \u0434\u0430\u043d\u043d\u044b\u0435 \u0438\u0437 \u0442\u0430\u0431\u043b\u0438\u0446\u044b, \u0432\u043a\u043b\u044e\u0447\u0430\u044f \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0438 \u0438 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u044f\u0447\u0435\u0435\u043a.</p> <p>Parameters:</p> Name Type Description Default <code>locator</code> <p>\u041b\u043e\u043a\u0430\u0442\u043e\u0440 \u0442\u0430\u0431\u043b\u0438\u0446\u044b</p> required <p>Returns:</p> Name Type Description <code>list</code> <code>[]</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 (\u043f\u0435\u0440\u0432\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 - \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0438)</p> Source code in <code>components\\table_component.py</code> <pre><code>def read(self, locator) -> []:\n \"\"\"\u0427\u0438\u0442\u0430\u0435\u0442 \u0434\u0430\u043d\u043d\u044b\u0435 \u0438\u0437 \u0442\u0430\u0431\u043b\u0438\u0446\u044b, \u0432\u043a\u043b\u044e\u0447\u0430\u044f \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0438 \u0438 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u044f\u0447\u0435\u0435\u043a.\n\n Args:\n locator: \u041b\u043e\u043a\u0430\u0442\u043e\u0440 \u0442\u0430\u0431\u043b\u0438\u0446\u044b\n\n Returns:\n list: \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 (\u043f\u0435\u0440\u0432\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 - \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0438)\n \"\"\"\n table_data = []\n\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 \u043f\u043e \u0441\u0442\u0440\u043e\u043a\u0430\u043c\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":""},{"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 (\u043f\u0430\u043d\u0435\u043b\u0438 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432).</p> <p>\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: - \u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435/\u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043a\u043d\u043e\u043f\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 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u043c\u0438 \u0442\u0443\u043b\u0431\u0430\u0440\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>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 (\u043f\u0430\u043d\u0435\u043b\u0438 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432).\n\n \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 - \u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435/\u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043a\u043d\u043e\u043f\u043a\u0430\u043c\u0438\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\u043e\u0432\n - \u0412\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u0441 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u043c\u0438 \u0442\u0443\u043b\u0431\u0430\u0440\u0430\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\u0430\u0446\u0438\u044f \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430 \u0442\u0443\u043b\u0431\u0430\u0440\u0430.\"\"\"\n super().__init__(page)\n self.title = title\n self.buttons = []\n\n def add_title(self, title: str) -> None:\n \"\"\"\u0423\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442 \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 \u0442\u0443\u043b\u0431\u0430\u0440\u0430\n \"\"\"\n self.title = title\n\n def add_button(self, locator: Locator, name: str) -> None:\n \"\"\"\u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u043a\u043d\u043e\u043f\u043a\u0443 \u0432 \u0442\u0443\u043b\u0431\u0430\u0440.\n\n Args:\n locator (Locator): \u041b\u043e\u043a\u0430\u0442\u043e\u0440 \u043a\u043d\u043e\u043f\u043a\u0438\n name (str): \u0423\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u0435 \u0438\u043c\u044f \u043a\u043d\u043e\u043f\u043a\u0438\n \"\"\"\n self.buttons.append(TooltipButton(self.page, locator, name))\n\n def get_button_by_name(self, name: str) -> TooltipButton | None:\n \"\"\"\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043a\u043d\u043e\u043f\u043a\u0443 \u043f\u043e \u0438\u043c\u0435\u043d\u0438.\n\n Args:\n name (str): \u0418\u043c\u044f \u043a\u043d\u043e\u043f\u043a\u0438\n\n Returns:\n TooltipButton | None: \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u043a\u043d\u043e\u043f\u043a\u0438 \u0438\u043b\u0438 None \u0435\u0441\u043b\u0438 \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u0430\n \"\"\"\n for button in self.buttons:\n if button.name == name:\n return button\n return None\n\n def click_button(self, name: str) -> None:\n \"\"\"\u041a\u043b\u0438\u043a\u0430\u0435\u0442 \u043f\u043e \u043a\u043d\u043e\u043f\u043a\u0435 \u0442\u0443\u043b\u0431\u0430\u0440\u0430.\n\n Args:\n name (str): \u0418\u043c\u044f \u043a\u043d\u043e\u043f\u043a\u0438\n\n Raises:\n AssertionError: \u0415\u0441\u043b\u0438 \u043a\u043d\u043e\u043f\u043a\u0430 \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u0430\n \"\"\"\n button = self.get_button_by_name(name)\n if button is None:\n raise AssertionError(f\"Unsupported button name {name}\")\n button.click()\n\n def is_button_present(self, name: str) -> bool:\n \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u043a\u043d\u043e\u043f\u043a\u0438.\n\n Args:\n name (str): \u0418\u043c\u044f \u043a\u043d\u043e\u043f\u043a\u0438\n\n Returns:\n bool: True \u0435\u0441\u043b\u0438 \u043a\u043d\u043e\u043f\u043a\u0430 \u043f\u0440\u0438\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442\n\n Raises:\n AssertionError: \u0415\u0441\u043b\u0438 \u0438\u043c\u044f \u043a\u043d\u043e\u043f\u043a\u0438 \u043d\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442\u0441\u044f\n \"\"\"\n button = self.get_button_by_name(name)\n if button is None:\n raise AssertionError(f\"Unsupported button name {name}\")\n return button.is_present(timeout=1000) # \u041e\u0436\u0438\u0434\u0430\u043d\u0438\u0435 1 \u0441\u0435\u043a\u0443\u043d\u0434\u0430\n\n def is_button_not_present(self, name: str) -> bool:\n \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u0435 \u043a\u043d\u043e\u043f\u043a\u0438.\n\n Args:\n name (str): \u0418\u043c\u044f \u043a\u043d\u043e\u043f\u043a\u0438\n\n Returns:\n bool: True \u0435\u0441\u043b\u0438 \u043a\u043d\u043e\u043f\u043a\u0430 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442\n\n Raises:\n AssertionError: \u0415\u0441\u043b\u0438 \u0438\u043c\u044f \u043a\u043d\u043e\u043f\u043a\u0438 \u043d\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442\u0441\u044f\n \"\"\"\n button = self.get_button_by_name(name)\n if button is None:\n raise AssertionError(f\"Unsupported button name {name}\")\n return button.is_not_present(timeout=1000) # \u041e\u0436\u0438\u0434\u0430\u043d\u0438\u0435 1 \u0441\u0435\u043a\u0443\u043d\u0434\u0430\n\n def check_presence(self, message: str) -> None:\n \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u0442\u0443\u043b\u0431\u0430\u0440\u0430.\n\n Args:\n message (str): \u0421\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u043e\u0431 \u043e\u0448\u0438\u0431\u043a\u0435 \u0435\u0441\u043b\u0438 \u0442\u0443\u043b\u0431\u0430\u0440 \u043d\u0435 \u0432\u0438\u0434\u0435\u043d\n \"\"\"\n 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) -> 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.\n\n Args:\n name (str): \u0418\u043c\u044f \u043a\u043d\u043e\u043f\u043a\u0438\n\n Raises:\n AssertionError: \u0415\u0441\u043b\u0438 \u043a\u043d\u043e\u043f\u043a\u0430 \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u0430 \u0438\u043b\u0438 \u043d\u0435 \u0432\u0438\u0434\u043d\u0430\n \"\"\"\n button = self.get_button_by_name(name)\n if button is None:\n raise AssertionError(f\"Unsupported button name {name}\")\n button.check_presence(f\"Button with name {name} is missing\")\n\n def check_button_tooltip(self, name: str, tooltip: str) -> None:\n \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0442\u0435\u043a\u0441\u0442 \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0438 \u043a\u043d\u043e\u043f\u043a\u0438.\n\n Args:\n name (str): \u0418\u043c\u044f \u043a\u043d\u043e\u043f\u043a\u0438\n tooltip (str): \u041e\u0436\u0438\u0434\u0430\u0435\u043c\u044b\u0439 \u0442\u0435\u043a\u0441\u0442 \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0438\n\n Raises:\n AssertionError: \u0415\u0441\u043b\u0438 \u043a\u043d\u043e\u043f\u043a\u0430 \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u0430 \u0438\u043b\u0438 \u0442\u0435\u043a\u0441\u0442 \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0438 \u043d\u0435 \u0441\u043e\u0432\u043f\u0430\u0434\u0430\u0435\u0442\n \"\"\"\n button = self.get_button_by_name(name)\n if button is None:\n raise AssertionError(f\"Unsupported button name {name}\")\n button.check_tooltip_with_text(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\u0430\u0446\u0438\u044f \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430 \u0442\u0443\u043b\u0431\u0430\u0440\u0430.</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\u0430\u0446\u0438\u044f \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430 \u0442\u0443\u043b\u0431\u0430\u0440\u0430.\"\"\"\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) -> None:\n \"\"\"\u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u043a\u043d\u043e\u043f\u043a\u0443 \u0432 \u0442\u0443\u043b\u0431\u0430\u0440.\n\n Args:\n locator (Locator): \u041b\u043e\u043a\u0430\u0442\u043e\u0440 \u043a\u043d\u043e\u043f\u043a\u0438\n name (str): \u0423\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u0435 \u0438\u043c\u044f \u043a\u043d\u043e\u043f\u043a\u0438\n \"\"\"\n self.buttons.append(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 \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 \u0442\u0443\u043b\u0431\u0430\u0440\u0430</p> required Source code in <code>components\\toolbar_component.py</code> <pre><code>def add_title(self, title: str) -> None:\n \"\"\"\u0423\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442 \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 \u0442\u0443\u043b\u0431\u0430\u0440\u0430\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.</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) -> 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.\n\n Args:\n name (str): \u0418\u043c\u044f \u043a\u043d\u043e\u043f\u043a\u0438\n\n Raises:\n AssertionError: \u0415\u0441\u043b\u0438 \u043a\u043d\u043e\u043f\u043a\u0430 \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u0430 \u0438\u043b\u0438 \u043d\u0435 \u0432\u0438\u0434\u043d\u0430\n \"\"\"\n button = self.get_button_by_name(name)\n if button is None:\n raise AssertionError(f\"Unsupported button name {name}\")\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 \u043a\u043d\u043e\u043f\u043a\u0430 \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u0430 \u0438\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) -> 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 \u043a\u043d\u043e\u043f\u043a\u0430 \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u0430 \u0438\u043b\u0438 \u0442\u0435\u043a\u0441\u0442 \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0438 \u043d\u0435 \u0441\u043e\u0432\u043f\u0430\u0434\u0430\u0435\u0442\n \"\"\"\n button = self.get_button_by_name(name)\n if button is None:\n raise AssertionError(f\"Unsupported button name {name}\")\n button.check_tooltip_with_text(ToolbarLocators.TOOLTIP, tooltip)\n</code></pre>"},{"location":"components/toolbar_component/#components.toolbar_component.ToolbarComponent.check_presence","title":"<code>check_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_presence(self, message: str) -> None:\n \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u0442\u0443\u043b\u0431\u0430\u0440\u0430.\n\n Args:\n message (str): \u0421\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u043e\u0431 \u043e\u0448\u0438\u0431\u043a\u0435 \u0435\u0441\u043b\u0438 \u0442\u0443\u043b\u0431\u0430\u0440 \u043d\u0435 \u0432\u0438\u0434\u0435\u043d\n \"\"\"\n 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) -> None:\n \"\"\"\u041a\u043b\u0438\u043a\u0430\u0435\u0442 \u043f\u043e \u043a\u043d\u043e\u043f\u043a\u0435 \u0442\u0443\u043b\u0431\u0430\u0440\u0430.\n\n Args:\n name (str): \u0418\u043c\u044f \u043a\u043d\u043e\u043f\u043a\u0438\n\n Raises:\n AssertionError: \u0415\u0441\u043b\u0438 \u043a\u043d\u043e\u043f\u043a\u0430 \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u0430\n \"\"\"\n button = self.get_button_by_name(name)\n if button is None:\n raise AssertionError(f\"Unsupported button name {name}\")\n button.click()\n</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: \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u043a\u043d\u043e\u043f\u043a\u0438 \u0438\u043b\u0438 None \u0435\u0441\u043b\u0438 \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u0430</p> Source code in <code>components\\toolbar_component.py</code> <pre><code>def get_button_by_name(self, name: str) -> TooltipButton | None:\n \"\"\"\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043a\u043d\u043e\u043f\u043a\u0443 \u043f\u043e \u0438\u043c\u0435\u043d\u0438.\n\n Args:\n name (str): \u0418\u043c\u044f \u043a\u043d\u043e\u043f\u043a\u0438\n\n Returns:\n TooltipButton | None: \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u043a\u043d\u043e\u043f\u043a\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/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) -> bool:\n \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u0435 \u043a\u043d\u043e\u043f\u043a\u0438.\n\n Args:\n name (str): \u0418\u043c\u044f \u043a\u043d\u043e\u043f\u043a\u0438\n\n Returns:\n bool: True \u0435\u0441\u043b\u0438 \u043a\u043d\u043e\u043f\u043a\u0430 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442\n\n Raises:\n AssertionError: \u0415\u0441\u043b\u0438 \u0438\u043c\u044f \u043a\u043d\u043e\u043f\u043a\u0438 \u043d\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442\u0441\u044f\n \"\"\"\n button = self.get_button_by_name(name)\n if button is None:\n raise AssertionError(f\"Unsupported button name {name}\")\n return button.is_not_present(timeout=1000) # \u041e\u0436\u0438\u0434\u0430\u043d\u0438\u0435 1 \u0441\u0435\u043a\u0443\u043d\u0434\u0430\n</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) -> bool:\n \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u043a\u043d\u043e\u043f\u043a\u0438.\n\n Args:\n name (str): \u0418\u043c\u044f \u043a\u043d\u043e\u043f\u043a\u0438\n\n Returns:\n bool: True \u0435\u0441\u043b\u0438 \u043a\u043d\u043e\u043f\u043a\u0430 \u043f\u0440\u0438\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442\n\n Raises:\n AssertionError: \u0415\u0441\u043b\u0438 \u0438\u043c\u044f \u043a\u043d\u043e\u043f\u043a\u0438 \u043d\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442\u0441\u044f\n \"\"\"\n button = self.get_button_by_name(name)\n if button is None:\n raise AssertionError(f\"Unsupported button name {name}\")\n return button.is_present(timeout=1000) # \u041e\u0436\u0438\u0434\u0430\u043d\u0438\u0435 1 \u0441\u0435\u043a\u0443\u043d\u0434\u0430\n</code></pre>"},{"location":"config/README_%D1%84%D0%BE%D1%80%D0%BC%D0%B0%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_%D0%BA%D0%BE%D0%B4%D0%B0/","title":"\u0424\u043e\u0440\u043c\u0430\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043a\u043e\u0434\u0430 \u0432 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0438 \u0441 PEP 8 \u0438 Google Python Style Guide","text":""},{"location":"config/README_%D1%84%D0%BE%D1%80%D0%BC%D0%B0%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_%D0%BA%D0%BE%D0%B4%D0%B0/#_1","title":"\u0422\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u044f \u043a \u0444\u043e\u0440\u043c\u0430\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044e","text":"<ol> <li>\u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 Docstring:</li> <li>\u0414\u043b\u044f \u043a\u043b\u0430\u0441\u0441\u0430: \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0438 \u0430\u0442\u0440\u0438\u0431\u0443\u0442\u043e\u0432 \u0432 Google-\u0444\u043e\u0440\u043c\u0430\u0442\u0435 \u043d\u0430 \u0440\u0443\u0441\u0441\u043a\u043e\u043c \u044f\u0437\u044b\u043a\u0435</li> <li> <p>\u0414\u043b\u044f \u043c\u0435\u0442\u043e\u0434\u043e\u0432: \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u043e\u0432, \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c\u044b\u0445 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u0438 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0445 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0439</p> </li> <li> <p>\u0421\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0435\u0432:</p> </li> <li>\u0420\u0430\u0437\u0434\u0435\u043b\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0438 (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, <code>#actions:</code>, <code># assertions:</code>) \u043e\u0441\u0442\u0430\u044e\u0442\u0441\u044f \u0431\u0435\u0437 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439</li> <li>\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\u044f\u0435\u0442\u0441\u044f \u0432 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b\u044c\u043d\u043e\u043c \u0432\u0438\u0434\u0435</li> <li> <p>\u0422\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0438 \u0432 \u043c\u0435\u0442\u043e\u0434\u0430\u0445 \u043d\u0435 \u0438\u0437\u043c\u0435\u043d\u044f\u044e\u0442\u0441\u044f</p> </li> <li> <p>\u041f\u0435\u0440\u0435\u0432\u043e\u0434 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0435\u0432:</p> </li> <li>\u0420\u0430\u0437\u0434\u0435\u043b\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0438 \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u044f\u0442\u0441\u044f (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, <code># \u0414\u0435\u0439\u0441\u0442\u0432\u0438\u044f:</code>, <code># \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0438:</code>)</li> <li>\u041f\u043e\u044f\u0441\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0438 \u043a \u043b\u043e\u0433\u0438\u043a\u0435 \u043a\u043e\u0434\u0430 \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u044f\u0442\u0441\u044f</li> <li> <p>\u041d\u0435 \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u044f\u0442\u0441\u044f:</p> <ul> <li>\u0422\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0432 <code>assert</code>, <code>raise</code> \u0438 \u0434\u0440\u0443\u0433\u0438\u0445 \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0445 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f\u0445</li> <li>\u0417\u0430\u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u043a\u043e\u0434</li> <li>\u0421\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0432 \u043b\u043e\u0433\u0430\u0445 \u0438 \u043e\u0448\u0438\u0431\u043a\u0430\u0445</li> </ul> </li> <li> <p>\u0424\u043e\u0440\u043c\u0430\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043a\u043e\u0434\u0430:</p> </li> <li>\u0421\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0435 PEP 8 (\u043e\u0442\u0441\u0442\u0443\u043f\u044b, \u043f\u0440\u043e\u0431\u0435\u043b\u044b \u0432\u043e\u043a\u0440\u0443\u0433 \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u043e\u0432)</li> <li>\u0421\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435 \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0439 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u043a\u043e\u0434\u0430</li> <li>\u0411\u0435\u0437 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439 \u0440\u0430\u0431\u043e\u0447\u0435\u0439 \u043b\u043e\u0433\u0438\u043a\u0438 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b</li> </ol>"},{"location":"config/mkdocs_guide/","title":"\u0420\u0443\u043a\u043e\u0432\u043e\u0434\u0441\u0442\u0432\u043e \u043f\u043e \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0435 MkDocs \u0441 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0435\u0439 \u0434\u043b\u044f Python","text":""},{"location":"config/mkdocs_guide/#_1","title":"\u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0445 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043e\u0432","text":""},{"location":"data/constants/","title":"Constants","text":""},{"location":"data/constants/#data.constants.Constants","title":"<code>Constants</code>","text":"<p>\u041a\u043b\u0430\u0441\u0441 \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442 \u0438 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f.</p> <p>\u0421\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0435 \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. \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.</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 \"\"\"\u041a\u043b\u0430\u0441\u0441 \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442 \u0438 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f.\n\n \u0421\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0435 \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.\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.\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":""},{"location":"data/environment/#data.environment.Environment","title":"<code>Environment</code>","text":"<p>\u041a\u043b\u0430\u0441\u0441 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0435\u043c \u0438 URL-\u0430\u0434\u0440\u0435\u0441\u0430\u043c\u0438.</p> <p>\u0421\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0434\u043b\u044f \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0445 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0439 (test, develop) \u0438 \u043c\u0435\u0442\u043e\u0434\u044b \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u043d\u0438\u043c\u0438. \u041f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u0442\u0435\u043a\u0443\u0449\u0435\u0435 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0435 \u0438\u0437 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f \u0441\u0438\u0441\u0442\u0435\u043c\u044b.</p> \u0410\u0442\u0440\u0438\u0431\u0443\u0442\u044b <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 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 URLS (dict): \u0421\u043b\u043e\u0432\u0430\u0440\u044c \u0441 \u0431\u0430\u0437\u043e\u0432\u044b\u043c\u0438 URL \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f env (str): \u0422\u0435\u043a\u0443\u0449\u0435\u0435 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0435 access_token (str): \u0422\u043e\u043a\u0435\u043d \u0434\u043e\u0441\u0442\u0443\u043f\u0430</p> Source code in <code>data\\environment.py</code> <pre><code>class Environment:\n \"\"\"\u041a\u043b\u0430\u0441\u0441 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0435\u043c \u0438 URL-\u0430\u0434\u0440\u0435\u0441\u0430\u043c\u0438.\n\n \u0421\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0434\u043b\u044f \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0445 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0439 (test, develop) \u0438 \u043c\u0435\u0442\u043e\u0434\u044b \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u043d\u0438\u043c\u0438.\n \u041f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u0442\u0435\u043a\u0443\u0449\u0435\u0435 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0435 \u0438\u0437 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f \u0441\u0438\u0441\u0442\u0435\u043c\u044b.\n\n \u0410\u0442\u0440\u0438\u0431\u0443\u0442\u044b:\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 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438\n URLS (dict): \u0421\u043b\u043e\u0432\u0430\u0440\u044c \u0441 \u0431\u0430\u0437\u043e\u0432\u044b\u043c\u0438 URL \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f\n env (str): \u0422\u0435\u043a\u0443\u0449\u0435\u0435 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0435\n access_token (str): \u0422\u043e\u043a\u0435\u043d \u0434\u043e\u0441\u0442\u0443\u043f\u0430\n \"\"\"\n\n TEST = 'test'\n DEVELOP = 'develop'\n\n URLS = {\n TEST: 'http://192.168.2.76/',\n DEVELOP: 'http://192.168.2.69/'\n }\n\n def __init__(self):\n \"\"\"\u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f.\n\n \u0423\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0435 \u0438\u0437 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f ENV \u0438\u043b\u0438 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e TEST.\n \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442 \u043f\u0443\u0441\u0442\u043e\u0439 access_token.\n \"\"\"\n try:\n self.env = os.getenv('ENV')\n self.access_token = \"\"\n except KeyError:\n self.env = self.TEST\n\n def get_base_url(self):\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 Returns:\n str: \u0411\u0430\u0437\u043e\u0432\u044b\u0439 URL \u0441 \u0443\u0447\u0451\u0442\u043e\u043c \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u0435\u0439 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f\n\n Raises:\n Exception: \u0415\u0441\u043b\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 ENV \u043d\u0435\u0438\u0437\u0432\u0435\u0441\u0442\u043d\u043e\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_request_url(self):\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 Returns:\n str: URL \u0434\u043b\u044f \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432\n\n Raises:\n Exception: \u0415\u0441\u043b\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 ENV \u043d\u0435\u0438\u0437\u0432\u0435\u0441\u0442\u043d\u043e\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):\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 Args:\n token (str): \u041d\u043e\u0432\u044b\u0439 \u0442\u043e\u043a\u0435\u043d \u0434\u043e\u0441\u0442\u0443\u043f\u0430\n \"\"\"\n self.token = token\n\n def get_access_token(self):\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 Returns:\n str: \u0422\u0435\u043a\u0443\u0449\u0438\u0439 \u0442\u043e\u043a\u0435\u043d \u0434\u043e\u0441\u0442\u0443\u043f\u0430\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\u0430\u0446\u0438\u044f \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f.</p> <p>\u0423\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0435 \u0438\u0437 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f ENV \u0438\u043b\u0438 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e TEST. \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442 \u043f\u0443\u0441\u0442\u043e\u0439 access_token.</p> Source code in <code>data\\environment.py</code> <pre><code>def __init__(self):\n \"\"\"\u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f.\n\n \u0423\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0435 \u0438\u0437 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f ENV \u0438\u043b\u0438 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e TEST.\n \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442 \u043f\u0443\u0441\u0442\u043e\u0439 access_token.\n \"\"\"\n try:\n self.env = os.getenv('ENV')\n self.access_token = \"\"\n except KeyError:\n self.env = 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> <p>Returns:</p> Name Type Description <code>str</code> <p>\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):\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 Returns:\n str: \u0422\u0435\u043a\u0443\u0449\u0438\u0439 \u0442\u043e\u043a\u0435\u043d \u0434\u043e\u0441\u0442\u0443\u043f\u0430\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> <p>Returns:</p> Name Type Description <code>str</code> <p>\u0411\u0430\u0437\u043e\u0432\u044b\u0439 URL \u0441 \u0443\u0447\u0451\u0442\u043e\u043c \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u0435\u0439 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f</p> <p>Raises:</p> Type Description <code>Exception</code> <p>\u0415\u0441\u043b\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 ENV \u043d\u0435\u0438\u0437\u0432\u0435\u0441\u0442\u043d\u043e</p> Source code in <code>data\\environment.py</code> <pre><code>def get_base_url(self):\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 Returns:\n str: \u0411\u0430\u0437\u043e\u0432\u044b\u0439 URL \u0441 \u0443\u0447\u0451\u0442\u043e\u043c \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u0435\u0439 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f\n\n Raises:\n Exception: \u0415\u0441\u043b\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 ENV \u043d\u0435\u0438\u0437\u0432\u0435\u0441\u0442\u043d\u043e\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_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> <p>Returns:</p> Name Type Description <code>str</code> <p>URL \u0434\u043b\u044f \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432</p> <p>Raises:</p> Type Description <code>Exception</code> <p>\u0415\u0441\u043b\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 ENV \u043d\u0435\u0438\u0437\u0432\u0435\u0441\u0442\u043d\u043e</p> Source code in <code>data\\environment.py</code> <pre><code>def get_request_url(self):\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 Returns:\n str: URL \u0434\u043b\u044f \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432\n\n Raises:\n Exception: \u0415\u0441\u043b\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 ENV \u043d\u0435\u0438\u0437\u0432\u0435\u0441\u0442\u043d\u043e\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> <p>Parameters:</p> Name Type Description Default <code>token</code> <code>str</code> <p>\u041d\u043e\u0432\u044b\u0439 \u0442\u043e\u043a\u0435\u043d \u0434\u043e\u0441\u0442\u0443\u043f\u0430</p> required Source code in <code>data\\environment.py</code> <pre><code>def set_access_token(self, token):\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 Args:\n token (str): \u041d\u043e\u0432\u044b\u0439 \u0442\u043e\u043a\u0435\u043d \u0434\u043e\u0441\u0442\u0443\u043f\u0430\n \"\"\"\n self.token = token\n</code></pre>"},{"location":"data/roles_dict/","title":"Roles_dict","text":""},{"location":"elements/base_element/","title":"BaseElement","text":""},{"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.</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. name: \u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 (\u0434\u043b\u044f \u043b\u043e\u0433\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f). 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).</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.\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 name: \u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 (\u0434\u043b\u044f \u043b\u043e\u0433\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f).\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 \"\"\"\n\n def __init__(self, page: Page, locator: str | Locator, name: str) -> None:\n \"\"\"\u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442 \u0431\u0430\u0437\u043e\u0432\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b.\n\n Args:\n page: \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.\n locator: \u041b\u043e\u043a\u0430\u0442\u043e\u0440 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 (\u0441\u0442\u0440\u043e\u043a\u0430 \u0438\u043b\u0438 \u043e\u0431\u044a\u0435\u043a\u0442 Locator).\n name: \u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 (\u0434\u043b\u044f \u043b\u043e\u0433\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f).\n\n Raises:\n TypeError: \u0415\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 self.page = page\n self.name = name\n\n if isinstance(locator, Locator):\n self.locator = locator\n elif isinstance(locator, str):\n self.locator = self.page.locator(locator)\n else:\n raise TypeError(\"locator value should be string type or Locator type\")\n\n @property\n def type_of(self) -> str:\n \"\"\"\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0442\u0438\u043f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430.\n\n Returns:\n \u0421\u0442\u0440\u043e\u043a\u0430 \u0441 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435\u043c \u0442\u0438\u043f\u0430 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430.\n \"\"\"\n return \"base element\"\n\n # \u0414\u0435\u0439\u0441\u0442\u0432\u0438\u044f:\n def click(self) -> None:\n \"\"\"\u041a\u043b\u0438\u043a\u0430\u0435\u0442 \u043d\u0430 \u044d\u043b\u0435\u043c\u0435\u043d\u0442.\"\"\"\n logger.info(f'Clicking {self.type_of} \"{self.name}\"')\n self.locator.click()\n\n def get_text(self, index: int) -> str:\n \"\"\"\u041f\u043e\u043b\u0443\u0447\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 Args:\n index: \u0418\u043d\u0434\u0435\u043a\u0441 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 (0 \u0434\u043b\u044f \u0435\u0434\u0438\u043d\u0438\u0447\u043d\u043e\u0433\u043e \u043b\u043e\u043a\u0430\u0442\u043e\u0440\u0430).\n\n Returns:\n \u0422\u0435\u043a\u0441\u0442 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430.\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=12000) -> None:\n \"\"\"\u041e\u0436\u0438\u0434\u0430\u0435\u0442 \u043f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u044f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u043d\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435.\n\n Args:\n timeout: \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 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):\n \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442, \u0447\u0442\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u044b\u0439 \u0442\u0435\u043a\u0441\u0442.\n\n Args:\n text: \u041e\u0436\u0438\u0434\u0430\u0435\u043c\u044b\u0439 \u0442\u0435\u043a\u0441\u0442.\n msg: \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 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):\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 Args:\n msg: \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 logger.info(f'Check that {self.type_of} \"{self.name}\" is present')\n print(self.locator)\n expect(self.locator).to_be_visible(visible=True, timeout=12000), msg\n\n def is_present(self, timeout: int = 5000) -> bool:\n \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u043d\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435.\n\n Args:\n timeout: \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 Returns:\n True, \u0435\u0441\u043b\u0438 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043f\u0440\u0438\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442, \u0438\u043d\u0430\u0447\u0435 False.\n \"\"\"\n logger.info(f'Check that {self.type_of} \"{self.name}\" is present')\n try:\n self.locator.wait_for(timeout=timeout)\n except TimeoutError:\n return False\n return True\n\n def is_not_present(self, timeout: int = 5000) -> bool:\n \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u043d\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435.\n\n Args:\n timeout: \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 Returns:\n True, \u0435\u0441\u043b\u0438 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442, \u0438\u043d\u0430\u0447\u0435 False.\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.</p> <p>Returns:</p> Type Description <code>str</code> <p>\u0421\u0442\u0440\u043e\u043a\u0430 \u0441 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435\u043c \u0442\u0438\u043f\u0430 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430.</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>\u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 (\u0434\u043b\u044f \u043b\u043e\u0433\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f).</p> required <p>Raises:</p> Type Description <code>TypeError</code> <p>\u0415\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>elements\\base_element.py</code> <pre><code>def __init__(self, page: Page, locator: str | Locator, name: str) -> None:\n \"\"\"\u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442 \u0431\u0430\u0437\u043e\u0432\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b.\n\n Args:\n page: \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.\n locator: \u041b\u043e\u043a\u0430\u0442\u043e\u0440 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 (\u0441\u0442\u0440\u043e\u043a\u0430 \u0438\u043b\u0438 \u043e\u0431\u044a\u0435\u043a\u0442 Locator).\n name: \u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 (\u0434\u043b\u044f \u043b\u043e\u0433\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f).\n\n Raises:\n TypeError: \u0415\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 self.page = page\n self.name = name\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, \u0447\u0442\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u044b\u0439 \u0442\u0435\u043a\u0441\u0442.</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.</p> required <code>msg</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 Source code in <code>elements\\base_element.py</code> <pre><code>def check_have_text(self, text: str, msg):\n \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442, \u0447\u0442\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u044b\u0439 \u0442\u0435\u043a\u0441\u0442.\n\n Args:\n text: \u041e\u0436\u0438\u0434\u0430\u0435\u043c\u044b\u0439 \u0442\u0435\u043a\u0441\u0442.\n msg: \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 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> <p>Parameters:</p> Name Type Description Default <code>msg</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 Source code in <code>elements\\base_element.py</code> <pre><code>def check_presence(self, msg):\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 Args:\n msg: \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 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>\u041a\u043b\u0438\u043a\u0430\u0435\u0442 \u043d\u0430 \u044d\u043b\u0435\u043c\u0435\u043d\u0442.</p> Source code in <code>elements\\base_element.py</code> <pre><code>def click(self) -> None:\n \"\"\"\u041a\u043b\u0438\u043a\u0430\u0435\u0442 \u043d\u0430 \u044d\u043b\u0435\u043c\u0435\u043d\u0442.\"\"\"\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>\u041f\u043e\u043b\u0443\u0447\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> <p>Parameters:</p> Name Type Description Default <code>index</code> <code>int</code> <p>\u0418\u043d\u0434\u0435\u043a\u0441 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 (0 \u0434\u043b\u044f \u0435\u0434\u0438\u043d\u0438\u0447\u043d\u043e\u0433\u043e \u043b\u043e\u043a\u0430\u0442\u043e\u0440\u0430).</p> required <p>Returns:</p> Type Description <code>str</code> <p>\u0422\u0435\u043a\u0441\u0442 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430.</p> Source code in <code>elements\\base_element.py</code> <pre><code>def get_text(self, index: int) -> str:\n \"\"\"\u041f\u043e\u043b\u0443\u0447\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 Args:\n index: \u0418\u043d\u0434\u0435\u043a\u0441 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 (0 \u0434\u043b\u044f \u0435\u0434\u0438\u043d\u0438\u0447\u043d\u043e\u0433\u043e \u043b\u043e\u043a\u0430\u0442\u043e\u0440\u0430).\n\n Returns:\n \u0422\u0435\u043a\u0441\u0442 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430.\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 \u043d\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435.</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> <code>5000</code> <p>Returns:</p> Type Description <code>bool</code> <p>True, \u0435\u0441\u043b\u0438 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442, \u0438\u043d\u0430\u0447\u0435 False.</p> Source code in <code>elements\\base_element.py</code> <pre><code>def is_not_present(self, timeout: int = 5000) -> bool:\n \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u043d\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435.\n\n Args:\n timeout: \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 Returns:\n True, \u0435\u0441\u043b\u0438 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442, \u0438\u043d\u0430\u0447\u0435 False.\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 \u043d\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435.</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> <code>5000</code> <p>Returns:</p> Type Description <code>bool</code> <p>True, \u0435\u0441\u043b\u0438 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043f\u0440\u0438\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442, \u0438\u043d\u0430\u0447\u0435 False.</p> Source code in <code>elements\\base_element.py</code> <pre><code>def is_present(self, timeout: int = 5000) -> bool:\n \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u043d\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435.\n\n Args:\n timeout: \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 Returns:\n True, \u0435\u0441\u043b\u0438 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u043f\u0440\u0438\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442, \u0438\u043d\u0430\u0447\u0435 False.\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\u044f \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>timeout</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> <code>12000</code> Source code in <code>elements\\base_element.py</code> <pre><code>def wait_for_element(self, timeout=12000) -> None:\n \"\"\"\u041e\u0436\u0438\u0434\u0430\u0435\u0442 \u043f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u044f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u043d\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435.\n\n Args:\n timeout: \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 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":""},{"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 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u043c\u0438 \u0442\u0438\u043f\u0430 '\u043a\u043d\u043e\u043f\u043a\u0430' \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 \u0431\u0430\u0437\u043e\u0432\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \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.</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 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u043c\u0438 \u0442\u0438\u043f\u0430 '\u043a\u043d\u043e\u043f\u043a\u0430' \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 \u0431\u0430\u0437\u043e\u0432\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \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.\n \"\"\"\n\n @property\n def type_of(self) -> str:\n \"\"\"\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0442\u0438\u043f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 - '\u043a\u043d\u043e\u043f\u043a\u0430'.\n\n Returns:\n \u0421\u0442\u0440\u043e\u043a\u0430 \u0441 \u0442\u0438\u043f\u043e\u043c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430.\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> Type Description <code>str</code> <p>\u0421\u0442\u0440\u043e\u043a\u0430 \u0441 \u0442\u0438\u043f\u043e\u043c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430.</p>"},{"location":"elements/checkbox_element/","title":"Checkbox","text":""},{"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 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u043c\u0438 \u0442\u0438\u043f\u0430 '\u0447\u0435\u043a\u0431\u043e\u043a\u0441' \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 \u0431\u0430\u0437\u043e\u0432\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u0447\u043d\u044b\u0435 \u0434\u043b\u044f \u0447\u0435\u043a\u0431\u043e\u043a\u0441\u043e\u0432 \u043c\u0435\u0442\u043e\u0434\u044b.</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 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u043c\u0438 \u0442\u0438\u043f\u0430 '\u0447\u0435\u043a\u0431\u043e\u043a\u0441' \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 \u0431\u0430\u0437\u043e\u0432\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u0447\u043d\u044b\u0435 \u0434\u043b\u044f \u0447\u0435\u043a\u0431\u043e\u043a\u0441\u043e\u0432 \u043c\u0435\u0442\u043e\u0434\u044b.\n \"\"\"\n\n @property\n def type_of(self) -> str:\n \"\"\"\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0442\u0438\u043f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 - '\u0447\u0435\u043a\u0431\u043e\u043a\u0441'.\n\n Returns:\n \u0421\u0442\u0440\u043e\u043a\u0430 \u0441 \u0442\u0438\u043f\u043e\u043c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430.\n \"\"\"\n return \"checkbox\"\n\n # \u0414\u0435\u0439\u0441\u0442\u0432\u0438\u044f:\n def check(self) -> None:\n \"\"\"\u0423\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442 \u0447\u0435\u043a\u0431\u043e\u043a\u0441 \u0432 \u043e\u0442\u043c\u0435\u0447\u0435\u043d\u043d\u043e\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435.\"\"\"\n logger.info(f'Checking checkbox \"{self.name}\"')\n self.locator.check()\n\n def uncheck(self) -> 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.\"\"\"\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) -> 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 True, \u0435\u0441\u043b\u0438 \u0447\u0435\u043a\u0431\u043e\u043a\u0441 \u043e\u0442\u043c\u0435\u0447\u0435\u043d, \u0438\u043d\u0430\u0447\u0435 False.\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> Type Description <code>str</code> <p>\u0421\u0442\u0440\u043e\u043a\u0430 \u0441 \u0442\u0438\u043f\u043e\u043c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430.</p>"},{"location":"elements/checkbox_element/#elements.checkbox_element.Checkbox.check","title":"<code>check()</code>","text":"<p>\u0423\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442 \u0447\u0435\u043a\u0431\u043e\u043a\u0441 \u0432 \u043e\u0442\u043c\u0435\u0447\u0435\u043d\u043d\u043e\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435.</p> Source code in <code>elements\\checkbox_element.py</code> <pre><code>def check(self) -> None:\n \"\"\"\u0423\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442 \u0447\u0435\u043a\u0431\u043e\u043a\u0441 \u0432 \u043e\u0442\u043c\u0435\u0447\u0435\u043d\u043d\u043e\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435.\"\"\"\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> Type Description <code>bool</code> <p>True, \u0435\u0441\u043b\u0438 \u0447\u0435\u043a\u0431\u043e\u043a\u0441 \u043e\u0442\u043c\u0435\u0447\u0435\u043d, \u0438\u043d\u0430\u0447\u0435 False.</p> Source code in <code>elements\\checkbox_element.py</code> <pre><code>def is_checked(self) -> bool:\n \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442, \u043e\u0442\u043c\u0435\u0447\u0435\u043d \u043b\u0438 \u0447\u0435\u043a\u0431\u043e\u043a\u0441.\n\n Returns:\n True, \u0435\u0441\u043b\u0438 \u0447\u0435\u043a\u0431\u043e\u043a\u0441 \u043e\u0442\u043c\u0435\u0447\u0435\u043d, \u0438\u043d\u0430\u0447\u0435 False.\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.</p> Source code in <code>elements\\checkbox_element.py</code> <pre><code>def uncheck(self) -> 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.\"\"\"\n logger.info(f'Unchecking checkbox \"{self.name}\"')\n self.locator.uncheck()\n</code></pre>"},{"location":"elements/dropdown_list_element/","title":"DropdownList","text":""},{"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 \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 \u0431\u0430\u0437\u043e\u0432\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u0447\u043d\u044b\u0435 \u0434\u043b\u044f dropdown-\u0441\u043f\u0438\u0441\u043a\u043e\u0432 \u043c\u0435\u0442\u043e\u0434\u044b.</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 \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 \u0431\u0430\u0437\u043e\u0432\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u0447\u043d\u044b\u0435 \u0434\u043b\u044f dropdown-\u0441\u043f\u0438\u0441\u043a\u043e\u0432 \u043c\u0435\u0442\u043e\u0434\u044b.\n \"\"\"\n\n @property\n def type_of(self) -> str:\n \"\"\"\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0442\u0438\u043f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 - '\u0432\u044b\u043f\u0430\u0434\u0430\u044e\u0449\u0438\u0439 \u0441\u043f\u0438\u0441\u043e\u043a'.\n\n Returns:\n \u0421\u0442\u0440\u043e\u043a\u0430 \u0441 \u0442\u0438\u043f\u043e\u043c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430.\n \"\"\"\n return \"dropdown list\"\n\n # \u0414\u0435\u0439\u0441\u0442\u0432\u0438\u044f:\n def click_item_with_text(self, text: str) -> None:\n \"\"\"\u041a\u043b\u0438\u043a\u0430\u0435\u0442 \u043d\u0430 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0441\u043f\u0438\u0441\u043a\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 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0443\u0436\u043d\u043e \u0432\u044b\u0431\u0440\u0430\u0442\u044c.\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) -> 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 \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 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0443\u0436\u043d\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c.\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 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> Type Description <code>str</code> <p>\u0421\u0442\u0440\u043e\u043a\u0430 \u0441 \u0442\u0438\u043f\u043e\u043c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430.</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 \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 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0443\u0436\u043d\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c.</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) -> 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 \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 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0443\u0436\u043d\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c.\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 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>\u041a\u043b\u0438\u043a\u0430\u0435\u0442 \u043d\u0430 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0441\u043f\u0438\u0441\u043a\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 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0443\u0436\u043d\u043e \u0432\u044b\u0431\u0440\u0430\u0442\u044c.</p> required Source code in <code>elements\\dropdown_list_element.py</code> <pre><code>def click_item_with_text(self, text: str) -> None:\n \"\"\"\u041a\u043b\u0438\u043a\u0430\u0435\u0442 \u043d\u0430 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0441\u043f\u0438\u0441\u043a\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 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0443\u0436\u043d\u043e \u0432\u044b\u0431\u0440\u0430\u0442\u044c.\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":""},{"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 \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 \u0431\u0430\u0437\u043e\u0432\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u0447\u043d\u044b\u0435 \u0434\u043b\u044f \u0442\u0435\u043a\u0441\u0442\u0430 \u043c\u0435\u0442\u043e\u0434\u044b.</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 \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 \u0431\u0430\u0437\u043e\u0432\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u0447\u043d\u044b\u0435 \u0434\u043b\u044f \u0442\u0435\u043a\u0441\u0442\u0430 \u043c\u0435\u0442\u043e\u0434\u044b.\n \"\"\"\n\n @property\n def type_of(self) -> str:\n \"\"\"\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0442\u0438\u043f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 - '\u0442\u0435\u043a\u0441\u0442'.\n\n Returns:\n \u0421\u0442\u0440\u043e\u043a\u0430 \u0441 \u0442\u0438\u043f\u043e\u043c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430.\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> Type Description <code>str</code> <p>\u0421\u0442\u0440\u043e\u043a\u0430 \u0441 \u0442\u0438\u043f\u043e\u043c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430.</p>"},{"location":"elements/text_input_element/","title":"TextInput","text":""},{"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 \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 \u0431\u0430\u0437\u043e\u0432\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u0447\u043d\u044b\u0435 \u0434\u043b\u044f \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u044b\u0445 \u043f\u043e\u043b\u0435\u0439 \u043c\u0435\u0442\u043e\u0434\u044b.</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 \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 \u0431\u0430\u0437\u043e\u0432\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u0447\u043d\u044b\u0435 \u0434\u043b\u044f \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u044b\u0445 \u043f\u043e\u043b\u0435\u0439 \u043c\u0435\u0442\u043e\u0434\u044b.\n \"\"\"\n\n @property\n def type_of(self) -> str:\n \"\"\"\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0442\u0438\u043f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 - '\u0442\u0435\u043a\u0441\u0442\u043e\u0432\u043e\u0435 \u043f\u043e\u043b\u0435 \u0432\u0432\u043e\u0434\u0430'.\n\n Returns:\n \u0421\u0442\u0440\u043e\u043a\u0430 \u0441 \u0442\u0438\u043f\u043e\u043c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430.\n \"\"\"\n return \"text input\"\n\n # \u0414\u0435\u0439\u0441\u0442\u0432\u0438\u044f:\n def get_input_value(self) -> str:\n \"\"\"\u041f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u0442\u0435\u043a\u0443\u0449\u0435\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u043b\u044f.\n\n Returns:\n \u0422\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 logger.info(f'Getting value from text input \"{self.name}\"')\n return self.locator.input_value()\n\n def input_value(self, value: str) -> None:\n \"\"\"\u0412\u0432\u043e\u0434\u0438\u0442 \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0432 \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u043e\u0435 \u043f\u043e\u043b\u0435.\n\n Args:\n value: \u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0434\u043b\u044f \u0432\u0432\u043e\u0434\u0430.\n \"\"\"\n logger.info(f'Inputting value \"{value}\" to text input \"{self.name}\"')\n self.locator.fill(value)\n\n def clear(self) -> None:\n \"\"\"\u041e\u0447\u0438\u0449\u0430\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u043b\u044f.\"\"\"\n logger.info(f'Clearing text input \"{self.name}\"')\n self.locator.press('Control+A')\n self.locator.press('Backspace')\n\n # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0438:\n def check_empty_input(self, msg: str) -> None:\n \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442, \u0447\u0442\u043e \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u043e\u0435 \u043f\u043e\u043b\u0435 \u043f\u0443\u0441\u0442\u043e\u0435.\n\n Args:\n msg: \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 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> Type Description <code>str</code> <p>\u0421\u0442\u0440\u043e\u043a\u0430 \u0441 \u0442\u0438\u043f\u043e\u043c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\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 \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u043e\u0435 \u043f\u043e\u043b\u0435 \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) -> None:\n \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442, \u0447\u0442\u043e \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u043e\u0435 \u043f\u043e\u043b\u0435 \u043f\u0443\u0441\u0442\u043e\u0435.\n\n Args:\n msg: \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 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) -> 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 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>\u041f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u0442\u0435\u043a\u0443\u0449\u0435\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u043b\u044f.</p> <p>Returns:</p> Type Description <code>str</code> <p>\u0422\u0435\u043a\u0443\u0449\u0435\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043f\u043e\u043b\u044f \u0432\u0432\u043e\u0434\u0430.</p> Source code in <code>elements\\text_input_element.py</code> <pre><code>def get_input_value(self) -> str:\n \"\"\"\u041f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u0442\u0435\u043a\u0443\u0449\u0435\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u043b\u044f.\n\n Returns:\n \u0422\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 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 \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u043e\u0435 \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) -> 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 \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u043e\u0435 \u043f\u043e\u043b\u0435.\n\n Args:\n value: \u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0434\u043b\u044f \u0432\u0432\u043e\u0434\u0430.\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":""},{"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 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u043a\u043d\u043e\u043f\u043a\u0438 \u0441 \u0432\u0441\u043f\u043b\u044b\u0432\u0430\u044e\u0449\u0435\u0439 \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u043e\u0439.</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 \u0431\u0430\u0437\u043e\u0432\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u043c\u0435\u0442\u043e\u0434\u044b \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0430\u043c\u0438.</p> Source code in <code>elements\\tooltip_button_element.py</code> <pre><code>class TooltipButton(BaseElement):\n \"\"\"\u041a\u043b\u0430\u0441\u0441 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u043a\u043d\u043e\u043f\u043a\u0438 \u0441 \u0432\u0441\u043f\u043b\u044b\u0432\u0430\u044e\u0449\u0435\u0439 \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u043e\u0439.\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 \u0431\u0430\u0437\u043e\u0432\u043e\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u043c\u0435\u0442\u043e\u0434\u044b \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0430\u043c\u0438.\n \"\"\"\n\n @property\n def type_of(self) -> str:\n \"\"\"\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0442\u0438\u043f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430.\n\n Returns:\n str: \u0422\u0438\u043f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 ('tooltip_button')\n \"\"\"\n return \"tooltip_button\"\n\n def check_tooltip_with_text(self, tooltip_locator: str, expected_text: str) -> None:\n \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0442\u0435\u043a\u0441\u0442 \u0432\u0441\u043f\u043b\u044b\u0432\u0430\u044e\u0449\u0435\u0439 \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0438.\n\n 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 # \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 # \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.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.</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 ('tooltip_button')</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 \u0442\u0435\u043a\u0441\u0442 \u0432\u0441\u043f\u043b\u044b\u0432\u0430\u044e\u0449\u0435\u0439 \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0438.</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) -> None:\n \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0442\u0435\u043a\u0441\u0442 \u0432\u0441\u043f\u043b\u044b\u0432\u0430\u044e\u0449\u0435\u0439 \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0438.\n\n 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 # \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 # \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":"fixtures/pages/","title":"Browser Fixtures","text":"<p>\u041c\u043e\u0434\u0443\u043b\u044c \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 Playwright \u0432 \u0442\u0435\u0441\u0442\u0430\u0445 pytest.</p> <p>\u0421\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0444\u0438\u043a\u0441\u0442\u0443\u0440\u044b \u0438 \u0432\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0434\u043b\u044f \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u043e\u043c.</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 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0438 \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> <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>\u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b \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 \u0438 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u044b \u043f\u043e\u0441\u043b\u0435 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f \u0442\u0435\u0441\u0442\u043e\u0432.</p> Source code in <code>fixtures\\pages.py</code> <pre><code>@pytest.fixture(scope='class')\ndef browser(request) -> Page:\n \"\"\"\u0424\u0438\u043a\u0441\u0442\u0443\u0440\u0430 \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0438 \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: \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b \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 \u0438 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u044b \u043f\u043e\u0441\u043b\u0435 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f \u0442\u0435\u0441\u0442\u043e\u0432.\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> <p>\u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 Playwright.</p> required <code>request</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>Browser</code> <code>Browser</code> <p>\u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 Chrome \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0430.</p> Source code in <code>fixtures\\pages.py</code> <pre><code>def get_chrome_browser(playwright, request) -> 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 \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 Browser: \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 Chrome \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0430.\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> <p>\u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0430.</p> required <code>request</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 <code>start</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 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0430.</p> Source code in <code>fixtures\\pages.py</code> <pre><code>def get_context(browser, request, start) -> 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 \u0434\u043b\u044f \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u043a \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438.\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 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0430.\n \"\"\"\n if start == 'local':\n context = browser.new_context(\n # no_viewport=True,\n viewport=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=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> <p>\u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 Playwright.</p> required <code>request</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>Browser</code> <code>Browser</code> <p>\u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 Firefox \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0430.</p> Source code in <code>fixtures\\pages.py</code> <pre><code>def get_firefox_browser(playwright, request) -> 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 \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 Browser: \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 Firefox \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0430.\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 \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 \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> <p>\u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 Playwright.</p> required <code>request</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>Browser</code> <code>Browser</code> <p>\u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 Chrome \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0430 \u0432 \u0440\u0435\u0436\u0438\u043c\u0435 headless.</p> Source code in <code>fixtures\\pages.py</code> <pre><code>def get_remote_chrome(playwright, request) -> 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 \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 \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 Browser: \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 Chrome \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0430 \u0432 \u0440\u0435\u0436\u0438\u043c\u0435 headless.\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 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0435 \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> <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 \u0414\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0435 \u043e\u043f\u0446\u0438\u0438 <p>--bn: \u0412\u044b\u0431\u043e\u0440 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0430 (chrome, remote_chrome \u0438\u043b\u0438 firefox) --h: \u0420\u0435\u0436\u0438\u043c headless (True/False) --s: \u0420\u0430\u0437\u043c\u0435\u0440 \u043e\u043a\u043d\u0430 \u0432 \u0444\u043e\u0440\u043c\u0430\u0442\u0435 {'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 (slow_mo) --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):\n \"\"\"\u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0435 \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 \u0414\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0435 \u043e\u043f\u0446\u0438\u0438:\n --bn: \u0412\u044b\u0431\u043e\u0440 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0430 (chrome, remote_chrome \u0438\u043b\u0438 firefox)\n --h: \u0420\u0435\u0436\u0438\u043c headless (True/False)\n --s: \u0420\u0430\u0437\u043c\u0435\u0440 \u043e\u043a\u043d\u0430 \u0432 \u0444\u043e\u0440\u043c\u0430\u0442\u0435 {'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 (slow_mo)\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 parser.addoption('--bn', action='store', default=\"chrome\", \n help=\"Choose browser: chrome, remote_chrome or firefox\")\n parser.addoption('--h', action='store', default=False, \n help='Choose headless: True or False')\n parser.addoption('--s', action='store', default={'width': 1600, 'height': 900}, \n help='Size window: width,height')\n # \u0417\u0430\u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u0430\u043b\u044c\u0442\u0435\u0440\u043d\u0430\u0442\u0438\u0432\u043d\u044b\u0435 \u0440\u0430\u0437\u043c\u0435\u0440\u044b \u043e\u043a\u043e\u043d\n # parser.addoption('--s', action='store', default={'width': 1920, 'height': 1080}, help='Size window: width,height')\n # parser.addoption('--s', action='store', default={'width': 1920, 'height': 300}, 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 \u0432 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0435.</p> <p>Parameters:</p> Name Type Description Default <code>browser</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):\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 \u0432 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0435.\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 browser.go_back()\n</code></pre>"},{"location":"locators/confirm_locators/","title":"ConfirmLocators","text":""},{"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> \u0410\u0442\u0440\u0438\u0431\u0443\u0442\u044b <p>CONFIRM (str): XPath \u043b\u043e\u043a\u0430\u0442\u043e\u0440 \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): XPath \u043b\u043e\u043a\u0430\u0442\u043e\u0440 \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): XPath \u043b\u043e\u043a\u0430\u0442\u043e\u0440 \u043a\u043d\u043e\u043f\u043a\u0438 \u0437\u0430\u043a\u0440\u044b\u0442\u0438\u044f \u0434\u0438\u0430\u043b\u043e\u0433\u0430. TEXT (str): XPath \u043b\u043e\u043a\u0430\u0442\u043e\u0440 \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 \u0410\u0442\u0440\u0438\u0431\u0443\u0442\u044b:\n CONFIRM (str): XPath \u043b\u043e\u043a\u0430\u0442\u043e\u0440 \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): XPath \u043b\u043e\u043a\u0430\u0442\u043e\u0440 \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): XPath \u043b\u043e\u043a\u0430\u0442\u043e\u0440 \u043a\u043d\u043e\u043f\u043a\u0438 \u0437\u0430\u043a\u0440\u044b\u0442\u0438\u044f \u0434\u0438\u0430\u043b\u043e\u0433\u0430.\n TEXT (str): XPath \u043b\u043e\u043a\u0430\u0442\u043e\u0440 \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 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":""},{"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> \u0410\u0442\u0440\u0438\u0431\u0443\u0442\u044b <p>BUTTONS_BLOCK (str): XPath \u043b\u043e\u043a\u0430\u0442\u043e\u0440 \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. \u041d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432\u043e \u0432\u0442\u043e\u0440\u043e\u043c \u0431\u043b\u043e\u043a\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 toolbar'\u0430 \u0432\u043d\u0443\u0442\u0440\u0438 \u043a\u043e\u043d\u0442\u0435\u043d\u0442\u043d\u043e\u0439 \u043e\u0431\u043b\u0430\u0441\u0442\u0438.</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 \u0410\u0442\u0440\u0438\u0431\u0443\u0442\u044b:\n BUTTONS_BLOCK (str): XPath \u043b\u043e\u043a\u0430\u0442\u043e\u0440 \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 \u041d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432\u043e \u0432\u0442\u043e\u0440\u043e\u043c \u0431\u043b\u043e\u043a\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 toolbar'\u0430 \u0432\u043d\u0443\u0442\u0440\u0438 \u043a\u043e\u043d\u0442\u0435\u043d\u0442\u043d\u043e\u0439 \u043e\u0431\u043b\u0430\u0441\u0442\u0438.\n \"\"\"\n BUTTONS_BLOCK = \"//nav/div[@class='v-toolbar__content']/div[@class='v-toolbar__items'][2]\"\n</code></pre>"},{"location":"locators/modal_window_locators/","title":"ModalWindowLocators","text":""},{"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> \u0410\u0442\u0440\u0438\u0431\u0443\u0442\u044b <p>MODAL_WINDOW (str): XPath \u043b\u043e\u043a\u0430\u0442\u043e\u0440 \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): XPath \u043b\u043e\u043a\u0430\u0442\u043e\u0440 \u0444\u043e\u0440\u043c\u044b \u0434\u043b\u044f \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): \u041e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 XPath \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u043b\u044f \u0432\u0432\u043e\u0434\u0430 \u0432\u043d\u0443\u0442\u0440\u0438 \u0444\u043e\u0440\u043c\u044b \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0445 \u0434\u0430\u043d\u043d\u044b\u0445. ROLES_FIELD_INPUT_FORM_USER_DATA (str): \u041e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 XPath \u043f\u043e\u043b\u044f \u0432\u044b\u0431\u043e\u0440\u0430 \u0440\u043e\u043b\u0435\u0439 \u0432\u043d\u0443\u0442\u0440\u0438 \u0444\u043e\u0440\u043c\u044b \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0445 \u0434\u0430\u043d\u043d\u044b\u0445. ROLES_MENU_INPUT_FORM_USER_DATA (str): XPath \u043b\u043e\u043a\u0430\u0442\u043e\u0440 \u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0433\u043e \u043c\u0435\u043d\u044e \u0432\u044b\u0431\u043e\u0440\u0430 \u0440\u043e\u043b\u0435\u0439. LABEL_INPUT_FORM_USER_DATA (str): XPath \u043b\u043e\u043a\u0430\u0442\u043e\u0440 \u043c\u0435\u0442\u043a\u0438 \u043f\u043e\u043b\u044f \u0432\u0432\u043e\u0434\u0430 \u0432 \u0444\u043e\u0440\u043c\u0435.</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 \u0410\u0442\u0440\u0438\u0431\u0443\u0442\u044b:\n MODAL_WINDOW (str): XPath \u043b\u043e\u043a\u0430\u0442\u043e\u0440 \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): XPath \u043b\u043e\u043a\u0430\u0442\u043e\u0440 \u0444\u043e\u0440\u043c\u044b \u0434\u043b\u044f \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): \u041e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 XPath \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u043b\u044f \u0432\u0432\u043e\u0434\u0430 \n \u0432\u043d\u0443\u0442\u0440\u0438 \u0444\u043e\u0440\u043c\u044b \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0445 \u0434\u0430\u043d\u043d\u044b\u0445.\n ROLES_FIELD_INPUT_FORM_USER_DATA (str): \u041e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 XPath \u043f\u043e\u043b\u044f \u0432\u044b\u0431\u043e\u0440\u0430 \u0440\u043e\u043b\u0435\u0439 \n \u0432\u043d\u0443\u0442\u0440\u0438 \u0444\u043e\u0440\u043c\u044b \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0445 \u0434\u0430\u043d\u043d\u044b\u0445.\n ROLES_MENU_INPUT_FORM_USER_DATA (str): XPath \u043b\u043e\u043a\u0430\u0442\u043e\u0440 \u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0433\u043e \u043c\u0435\u043d\u044e \u0432\u044b\u0431\u043e\u0440\u0430 \u0440\u043e\u043b\u0435\u0439.\n LABEL_INPUT_FORM_USER_DATA (str): XPath \u043b\u043e\u043a\u0430\u0442\u043e\u0440 \u043c\u0435\u0442\u043a\u0438 \u043f\u043e\u043b\u044f \u0432\u0432\u043e\u0434\u0430 \u0432 \u0444\u043e\u0440\u043c\u0435.\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":""},{"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> \u0410\u0442\u0440\u0438\u0431\u0443\u0442\u044b <p>PANEL_MAIN (str): XPath \u043b\u043e\u043a\u0430\u0442\u043e\u0440 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u043f\u0430\u043d\u0435\u043b\u0438 \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438. \u0418\u0449\u0435\u0442 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 ul \u0441 \u043a\u043b\u0430\u0441\u0441\u043e\u043c, \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0438\u043c 'v-expansion-panel'. PANEL_SCROLL_CONTAINER (str): XPath \u043b\u043e\u043a\u0430\u0442\u043e\u0440 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430 \u0441 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u043e\u0439, \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0435\u0433\u043e \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u043e\u043d\u043d\u0443\u044e \u043f\u0430\u043d\u0435\u043b\u044c. \u0418\u0449\u0435\u0442 div \u0441 \u043a\u043b\u0430\u0441\u0441\u043e\u043c 'scrollarea__body', \u0432\u043d\u0443\u0442\u0440\u0438 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u043f\u0430\u043d\u0435\u043b\u044c \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438. NODE_ROOT (str): XPath \u043b\u043e\u043a\u0430\u0442\u043e\u0440 \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0433\u043e \u0443\u0437\u043b\u0430 \u0434\u0435\u0440\u0435\u0432\u0430 \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438. \u0418\u0449\u0435\u0442 div \u0441 \u043a\u043b\u0430\u0441\u0441\u043e\u043c, \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0438\u043c 'v-treeview-node__root'. NODE_CHILDREN (str): XPath \u043b\u043e\u043a\u0430\u0442\u043e\u0440 \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0445 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0443\u0437\u043b\u0430 \u0434\u0435\u0440\u0435\u0432\u0430. \u0418\u0449\u0435\u0442 div \u0441 \u043a\u043b\u0430\u0441\u0441\u043e\u043c, \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0438\u043c 'v-treeview-node__children'.</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 \u0410\u0442\u0440\u0438\u0431\u0443\u0442\u044b:\n PANEL_MAIN (str): XPath \u043b\u043e\u043a\u0430\u0442\u043e\u0440 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u043f\u0430\u043d\u0435\u043b\u0438 \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438.\n \u0418\u0449\u0435\u0442 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 ul \u0441 \u043a\u043b\u0430\u0441\u0441\u043e\u043c, \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0438\u043c 'v-expansion-panel'.\n PANEL_SCROLL_CONTAINER (str): XPath \u043b\u043e\u043a\u0430\u0442\u043e\u0440 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430 \u0441 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u043e\u0439,\n \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0435\u0433\u043e \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u043e\u043d\u043d\u0443\u044e \u043f\u0430\u043d\u0435\u043b\u044c. \u0418\u0449\u0435\u0442 div \u0441 \u043a\u043b\u0430\u0441\u0441\u043e\u043c 'scrollarea__body',\n \u0432\u043d\u0443\u0442\u0440\u0438 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u043f\u0430\u043d\u0435\u043b\u044c \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438.\n NODE_ROOT (str): XPath \u043b\u043e\u043a\u0430\u0442\u043e\u0440 \u043a\u043e\u0440\u043d\u0435\u0432\u043e\u0433\u043e \u0443\u0437\u043b\u0430 \u0434\u0435\u0440\u0435\u0432\u0430 \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438.\n \u0418\u0449\u0435\u0442 div \u0441 \u043a\u043b\u0430\u0441\u0441\u043e\u043c, \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0438\u043c 'v-treeview-node__root'.\n NODE_CHILDREN (str): XPath \u043b\u043e\u043a\u0430\u0442\u043e\u0440 \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0445 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0443\u0437\u043b\u0430 \u0434\u0435\u0440\u0435\u0432\u0430.\n \u0418\u0449\u0435\u0442 div \u0441 \u043a\u043b\u0430\u0441\u0441\u043e\u043c, \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0438\u043c 'v-treeview-node__children'.\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 NODE_ROOT = \"//div[contains(@class,'v-treeview-node__root')]\"\n NODE_CHILDREN = \"//div[contains(@class,'v-treeview-node__children')]\"\n</code></pre>"},{"location":"locators/table_locators/","title":"TableLocators","text":""},{"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> \u0410\u0442\u0440\u0438\u0431\u0443\u0442\u044b <p>TABLE_WORK_AREA (str): XPath \u043b\u043e\u043a\u0430\u0442\u043e\u0440 \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. \u0418\u0449\u0435\u0442 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 table, \u043d\u0430\u0445\u043e\u0434\u044f\u0449\u0438\u0439\u0441\u044f \u043f\u043e \u043f\u0443\u0442\u0438: scrollarea__body -> div -> div -> div -> table TABLE_SCROLL_CONTAINER (str): XPath \u043b\u043e\u043a\u0430\u0442\u043e\u0440 \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. \u0418\u0449\u0435\u0442 tbody \u0432\u043d\u0443\u0442\u0440\u0438 div \u0441 \u043a\u043b\u0430\u0441\u0441\u043e\u043c scrollarea__body, \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0435\u0433\u043e \u0442\u0430\u0431\u043b\u0438\u0446\u0443 \u0441 \u043a\u043b\u0430\u0441\u0441\u043e\u043c scrolltable__container.</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 \u0410\u0442\u0440\u0438\u0431\u0443\u0442\u044b:\n TABLE_WORK_AREA (str): XPath \u043b\u043e\u043a\u0430\u0442\u043e\u0440 \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 \u0418\u0449\u0435\u0442 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 table, \u043d\u0430\u0445\u043e\u0434\u044f\u0449\u0438\u0439\u0441\u044f \u043f\u043e \u043f\u0443\u0442\u0438:\n scrollarea__body -> div -> div -> div -> table\n TABLE_SCROLL_CONTAINER (str): XPath \u043b\u043e\u043a\u0430\u0442\u043e\u0440 \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 \u0418\u0449\u0435\u0442 tbody \u0432\u043d\u0443\u0442\u0440\u0438 div \u0441 \u043a\u043b\u0430\u0441\u0441\u043e\u043c scrollarea__body,\n \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0435\u0433\u043e \u0442\u0430\u0431\u043b\u0438\u0446\u0443 \u0441 \u043a\u043b\u0430\u0441\u0441\u043e\u043c scrolltable__container.\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/toolbar_locators/","title":"ToolbarLocators","text":""},{"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 \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> \u0410\u0442\u0440\u0438\u0431\u0443\u0442\u044b <p>TITLE (str): XPath \u043b\u043e\u043a\u0430\u0442\u043e\u0440 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430 \u0442\u0443\u043b\u0431\u0430\u0440\u0430. \u041d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u043e\u043d\u043d\u043e\u0439 \u043f\u0430\u043d\u0435\u043b\u0438 (nav) \u0432\u043d\u0443\u0442\u0440\u0438 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0441 \u043a\u043b\u0430\u0441\u0441\u043e\u043c, \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0438\u043c 'v-toolbar__title'.</p> <p>TOOLTIP (str): XPath \u043b\u043e\u043a\u0430\u0442\u043e\u0440 \u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0433\u043e \u0432\u0441\u043f\u043b\u044b\u0432\u0430\u044e\u0449\u0435\u0433\u043e \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0449\u0435\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430. \u0418\u0449\u0435\u0442 div \u0441 \u043a\u043b\u0430\u0441\u0441\u0430\u043c\u0438, \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0438\u043c\u0438: - 'v-tooltip__content' (\u043e\u0441\u043d\u043e\u0432\u0430 \u0442\u0443\u043b\u0442\u0438\u043f\u0430) - 'menuable__content__active' (\u043f\u043e\u043a\u0430\u0437\u0430\u043d\u043d\u043e\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435)</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 \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).\n\n \u0410\u0442\u0440\u0438\u0431\u0443\u0442\u044b:\n TITLE (str): XPath \u043b\u043e\u043a\u0430\u0442\u043e\u0440 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430 \u0442\u0443\u043b\u0431\u0430\u0440\u0430.\n \u041d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u043e\u043d\u043d\u043e\u0439 \u043f\u0430\u043d\u0435\u043b\u0438 (nav) \u0432\u043d\u0443\u0442\u0440\u0438 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0441 \u043a\u043b\u0430\u0441\u0441\u043e\u043c,\n \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0438\u043c 'v-toolbar__title'.\n\n TOOLTIP (str): XPath \u043b\u043e\u043a\u0430\u0442\u043e\u0440 \u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0433\u043e \u0432\u0441\u043f\u043b\u044b\u0432\u0430\u044e\u0449\u0435\u0433\u043e \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0449\u0435\u0433\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430.\n \u0418\u0449\u0435\u0442 div \u0441 \u043a\u043b\u0430\u0441\u0441\u0430\u043c\u0438, \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0438\u043c\u0438:\n - 'v-tooltip__content' (\u043e\u0441\u043d\u043e\u0432\u0430 \u0442\u0443\u043b\u0442\u0438\u043f\u0430)\n - 'menuable__content__active' (\u043f\u043e\u043a\u0430\u0437\u0430\u043d\u043d\u043e\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435)\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":"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) -> str:\n \"\"\"\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0442\u0435\u043a\u0443\u0449\u0438\u0439 URL \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b.\n\n Returns:\n str: \u0422\u0435\u043a\u0443\u0449\u0438\u0439 URL \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b.\n \"\"\"\n return self.page.url\n\n def open(self, uri) -> Response | None:\n \"\"\"\u041e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u044b\u0439 URI \u0432 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0435.\n\n Args:\n uri (str): URI \u0434\u043b\u044f \u043e\u0442\u043a\u0440\u044b\u0442\u0438\u044f (\u0431\u0435\u0437 \u0431\u0430\u0437\u043e\u0432\u043e\u0433\u043e URL).\n\n Returns:\n Response | None: \u041e\u0442\u0432\u0435\u0442 \u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u0438\u043b\u0438 None \u0432 \u0441\u043b\u0443\u0447\u0430\u0435 \u043e\u0448\u0438\u0431\u043a\u0438.\n \"\"\"\n return self.page.goto(f\"{host.get_base_url()}{uri}\", wait_until='domcontentloaded')\n\n def page_reload(self) -> None:\n \"\"\"\u041f\u0435\u0440\u0435\u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u0442 \u0442\u0435\u043a\u0443\u0449\u0443\u044e \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0443.\"\"\"\n self.page.reload()\n\n def wait_for_timeout(self, timeout):\n \"\"\"\u041e\u0436\u0438\u0434\u0430\u0435\u0442 \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043c\u0438\u043b\u043b\u0438\u0441\u0435\u043a\u0443\u043d\u0434.\n\n Args:\n timeout (int): \u0412\u0440\u0435\u043c\u044f \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u044f \u0432 \u043c\u0438\u043b\u043b\u0438\u0441\u0435\u043a\u0443\u043d\u0434\u0430\u0445.\n \"\"\"\n self.page.wait_for_timeout(timeout)\n\n def get_api_request_context(self) -> APIRequestContext:\n \"\"\"\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 API-\u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432.\n\n Returns:\n APIRequestContext: \u041a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 \u0434\u043b\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f API-\u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432.\n \"\"\"\n return self.page.context.request\n\n def send_get_api_request(self, uri) -> 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, payload) -> 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: \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) -> dict | None:\n \"\"\"\u0418\u0437\u0432\u043b\u0435\u043a\u0430\u0435\u0442 \u0442\u0435\u043b\u043e \u043e\u0442\u0432\u0435\u0442\u0430 \u0432 \u0444\u043e\u0440\u043c\u0430\u0442\u0435 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) -> 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, expected, msg: str) -> None:\n \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0440\u0430\u0432\u0435\u043d\u0441\u0442\u0432\u043e \u0444\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0438 \u043e\u0436\u0438\u0434\u0430\u0435\u043c\u043e\u0433\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439.\n\n Args:\n actual: \u0424\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435.\n expected: \u041e\u0436\u0438\u0434\u0430\u0435\u043c\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435.\n msg (str): \u0421\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u043e\u0431 \u043e\u0448\u0438\u0431\u043a\u0435 \u043f\u0440\u0438 \u043d\u0435\u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0438.\n\n Raises:\n AssertionError: \u0415\u0441\u043b\u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043d\u0435 \u0440\u0430\u0432\u043d\u044b.\n \"\"\"\n assert actual == expected, msg\n\n def check_lists_equals(self, actual: list, expected: list, msg: str) -> None:\n \"\"\"\u0420\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0440\u0430\u0432\u0435\u043d\u0441\u0442\u0432\u043e \u0434\u0432\u0443\u0445 \u0441\u043f\u0438\u0441\u043a\u043e\u0432.\n\n Args:\n actual (list): \u0424\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0441\u043f\u0438\u0441\u043e\u043a.\n expected (list): \u041e\u0436\u0438\u0434\u0430\u0435\u043c\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a.\n msg (str): \u0421\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u043e\u0431 \u043e\u0448\u0438\u0431\u043a\u0435 \u043f\u0440\u0438 \u043d\u0435\u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0438.\n\n Raises:\n AssertionError: \u0415\u0441\u043b\u0438 \u0441\u043f\u0438\u0441\u043a\u0438 \u043d\u0435 \u0440\u0430\u0432\u043d\u044b.\n \"\"\"\n def compare_lists(list1: list, list2: list) -> bool:\n \"\"\"\u0412\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0434\u043b\u044f \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u043e\u0433\u043e \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044f \u0441\u043f\u0438\u0441\u043a\u043e\u0432.\n\n Args:\n list1 (list): \u041f\u0435\u0440\u0432\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a \u0434\u043b\u044f \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044f.\n list2 (list): \u0412\u0442\u043e\u0440\u043e\u0439 \u0441\u043f\u0438\u0441\u043e\u043a \u0434\u043b\u044f \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044f.\n\n Returns:\n bool: True \u0435\u0441\u043b\u0438 \u0441\u043f\u0438\u0441\u043a\u0438 \u0438\u0434\u0435\u043d\u0442\u0438\u0447\u043d\u044b, \u0438\u043d\u0430\u0447\u0435 False.\n \"\"\"\n if len(list1) != len(list2):\n return False\n for item1, item2 in zip(list1, list2):\n if isinstance(item1, list) and isinstance(item2, list):\n if not compare_lists(item1, item2):\n return False\n elif item1 != item2:\n return False\n return True\n\n assert compare_lists(actual, expected), msg\n</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) -> 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> <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> <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, expected, msg: str) -> None:\n \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0440\u0430\u0432\u0435\u043d\u0441\u0442\u0432\u043e \u0444\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0438 \u043e\u0436\u0438\u0434\u0430\u0435\u043c\u043e\u0433\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439.\n\n Args:\n actual: \u0424\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435.\n expected: \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) -> None:\n \"\"\"\u0420\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0440\u0430\u0432\u0435\u043d\u0441\u0442\u0432\u043e \u0434\u0432\u0443\u0445 \u0441\u043f\u0438\u0441\u043a\u043e\u0432.\n\n Args:\n actual (list): \u0424\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0441\u043f\u0438\u0441\u043e\u043a.\n expected (list): \u041e\u0436\u0438\u0434\u0430\u0435\u043c\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a.\n msg (str): \u0421\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u043e\u0431 \u043e\u0448\u0438\u0431\u043a\u0435 \u043f\u0440\u0438 \u043d\u0435\u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0438.\n\n Raises:\n AssertionError: \u0415\u0441\u043b\u0438 \u0441\u043f\u0438\u0441\u043a\u0438 \u043d\u0435 \u0440\u0430\u0432\u043d\u044b.\n \"\"\"\n def compare_lists(list1: list, list2: list) -> bool:\n \"\"\"\u0412\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0434\u043b\u044f \u0440\u0435\u043a\u0443\u0440\u0441\u0438\u0432\u043d\u043e\u0433\u043e \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044f \u0441\u043f\u0438\u0441\u043a\u043e\u0432.\n\n Args:\n list1 (list): \u041f\u0435\u0440\u0432\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a \u0434\u043b\u044f \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044f.\n list2 (list): \u0412\u0442\u043e\u0440\u043e\u0439 \u0441\u043f\u0438\u0441\u043e\u043a \u0434\u043b\u044f \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044f.\n\n Returns:\n bool: True \u0435\u0441\u043b\u0438 \u0441\u043f\u0438\u0441\u043a\u0438 \u0438\u0434\u0435\u043d\u0442\u0438\u0447\u043d\u044b, \u0438\u043d\u0430\u0447\u0435 False.\n \"\"\"\n if len(list1) != len(list2):\n return False\n for item1, item2 in zip(list1, list2):\n if isinstance(item1, list) and isinstance(item2, list):\n if not compare_lists(item1, item2):\n return False\n elif item1 != item2:\n return False\n return True\n\n assert compare_lists(actual, expected), msg\n</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) -> 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) -> 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 \u0444\u043e\u0440\u043c\u0430\u0442\u0435 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) -> dict | None:\n \"\"\"\u0418\u0437\u0432\u043b\u0435\u043a\u0430\u0435\u0442 \u0442\u0435\u043b\u043e \u043e\u0442\u0432\u0435\u0442\u0430 \u0432 \u0444\u043e\u0440\u043c\u0430\u0442\u0435 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) -> 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) -> 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) -> 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> <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, payload) -> 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: \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):\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/login_page/","title":"LoginPage","text":""},{"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 (Page): \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright. login_input (TextInput): \u041f\u043e\u043b\u0435 \u0432\u0432\u043e\u0434\u0430 \u043b\u043e\u0433\u0438\u043d\u0430. password_input (TextInput): \u041f\u043e\u043b\u0435 \u0432\u0432\u043e\u0434\u0430 \u043f\u0430\u0440\u043e\u043b\u044f. login_button (Button): \u041a\u043d\u043e\u043f\u043a\u0430 \u0432\u0445\u043e\u0434\u0430. error_alert (AlertComponent): \u041a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 \u0430\u043b\u0435\u0440\u0442\u0430 \u0441 \u043e\u0448\u0438\u0431\u043a\u043e\u0439.</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 (Page): \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.\n login_input (TextInput): \u041f\u043e\u043b\u0435 \u0432\u0432\u043e\u0434\u0430 \u043b\u043e\u0433\u0438\u043d\u0430.\n password_input (TextInput): \u041f\u043e\u043b\u0435 \u0432\u0432\u043e\u0434\u0430 \u043f\u0430\u0440\u043e\u043b\u044f.\n login_button (Button): \u041a\u043d\u043e\u043f\u043a\u0430 \u0432\u0445\u043e\u0434\u0430.\n error_alert (AlertComponent): \u041a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 \u0430\u043b\u0435\u0440\u0442\u0430 \u0441 \u043e\u0448\u0438\u0431\u043a\u043e\u0439.\n \"\"\"\n\n def __init__(self, page: Page) -> None:\n \"\"\"\u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u0438.\n\n Args:\n page: \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.\n \"\"\"\n 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.error_alert = AlertComponent(page, \"error\")\n\n def do_login(self, username: str = None, password: str = None) -> None:\n \"\"\"\u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u0432\u0445\u043e\u0434 \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0443.\n\n \u0415\u0441\u043b\u0438 username/password \u043d\u0435 \u0443\u043a\u0430\u0437\u0430\u043d\u044b, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \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. \u0415\u0441\u043b\u0438 None, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0438\u0437 Constants.\n password: \u041f\u0430\u0440\u043e\u043b\u044c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f. \u0415\u0441\u043b\u0438 None, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \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 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\") -> 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 \u041c\u043e\u0436\u043d\u043e \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u044c \u0441\u0432\u043e\u0438 \u043d\u0435\u0432\u0435\u0440\u043d\u044b\u0435 \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.\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.\n\n Args:\n username: \u041d\u0435\u0432\u0435\u0440\u043d\u044b\u0439 \u043b\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 \"someuser\".\n password: \u041d\u0435\u0432\u0435\u0440\u043d\u044b\u0439 \u043f\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 \"password\".\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 self.error_alert.check_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.error_alert.check_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) -> 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 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.error_alert = AlertComponent(page, \"error\")\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>\u0415\u0441\u043b\u0438 username/password \u043d\u0435 \u0443\u043a\u0430\u0437\u0430\u043d\u044b, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \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. \u0415\u0441\u043b\u0438 None, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \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. \u0415\u0441\u043b\u0438 None, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \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) -> 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 \u0415\u0441\u043b\u0438 username/password \u043d\u0435 \u0443\u043a\u0430\u0437\u0430\u043d\u044b, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \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. \u0415\u0441\u043b\u0438 None, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0438\u0437 Constants.\n password: \u041f\u0430\u0440\u043e\u043b\u044c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f. \u0415\u0441\u043b\u0438 None, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \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 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>\u041c\u043e\u0436\u043d\u043e \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u044c \u0441\u0432\u043e\u0438 \u043d\u0435\u0432\u0435\u0440\u043d\u044b\u0435 \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. \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.</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 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f. \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 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f. \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\") -> 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 \u041c\u043e\u0436\u043d\u043e \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u044c \u0441\u0432\u043e\u0438 \u043d\u0435\u0432\u0435\u0440\u043d\u044b\u0435 \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.\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.\n\n Args:\n username: \u041d\u0435\u0432\u0435\u0440\u043d\u044b\u0439 \u043b\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 \"someuser\".\n password: \u041d\u0435\u0432\u0435\u0440\u043d\u044b\u0439 \u043f\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 \"password\".\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 self.error_alert.check_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.error_alert.check_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":""},{"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 (Page): \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright. navigation_panel (NavigationPanelComponent): \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 (Button): \u041a\u043d\u043e\u043f\u043a\u0430 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f. user_card (CardComponent): \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 (Page): \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.\n navigation_panel (NavigationPanelComponent): \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 (Button): \u041a\u043d\u043e\u043f\u043a\u0430 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\n user_card (CardComponent): \u041a\u0430\u0440\u0442\u043e\u0447\u043a\u0430 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\n \"\"\"\n\n def __init__(self, page: Page) -> None:\n \"\"\"\u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u0442 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0433\u043b\u0430\u0432\u043d\u043e\u0439 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b.\n\n Args:\n page: \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.\n \"\"\"\n 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) -> 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 self.navigation_panel.click_item(NavigationPanelLocators.PANEL_MAIN, item_name)\n\n def click_configuration_navigation_panel_item(self, item_name: str) -> None:\n \"\"\"\u041a\u043b\u0438\u043a\u0430\u0435\u0442 \u043f\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0443 \u043f\u043e\u0434\u0440\u0430\u0437\u0434\u0435\u043b\u0430 '\u041a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f' \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 \u043a\u043b\u0438\u043a\u0430.\n \"\"\"\n self.navigation_panel.click_sub_item(NavigationPanelLocators.PANEL_MAIN, 1, item_name)\n\n def click_maintenance_navigation_panel_item(self, item_name: str) -> None:\n \"\"\"\u041a\u043b\u0438\u043a\u0430\u0435\u0442 \u043f\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0443 \u043f\u043e\u0434\u0440\u0430\u0437\u0434\u0435\u043b\u0430 '\u041e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u043d\u0438\u0435' \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 \u043a\u043b\u0438\u043a\u0430.\n \"\"\"\n self.navigation_panel.click_sub_item(NavigationPanelLocators.PANEL_MAIN, 2, item_name)\n\n def click_user_button(self) -> 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 self.user_button.click()\n\n def do_logout(self) -> None:\n \"\"\"\u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u0432\u044b\u0445\u043e\u0434 \u0438\u0437 \u0441\u0438\u0441\u0442\u0435\u043c\u044b.\"\"\"\n self.should_be_user_button()\n self.click_user_button()\n self.user_card.click_logout_button()\n\n def scroll_navigation_panel_up(self) -> None:\n \"\"\"\u041f\u0440\u043e\u043a\u0440\u0443\u0447\u0438\u0432\u0430\u0435\u0442 \u043f\u0430\u043d\u0435\u043b\u044c \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438 \u0432\u0432\u0435\u0440\u0445.\"\"\"\n self.navigation_panel.scroll_up(NavigationPanelLocators.PANEL_SCROLL_CONTAINER)\n\n def scroll_navigation_panel_down(self) -> None:\n \"\"\"\u041f\u0440\u043e\u043a\u0440\u0443\u0447\u0438\u0432\u0430\u0435\u0442 \u043f\u0430\u043d\u0435\u043b\u044c \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438 \u0432\u043d\u0438\u0437.\"\"\"\n self.navigation_panel.scroll_down(NavigationPanelLocators.PANEL_SCROLL_CONTAINER)\n\n # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0438:\n def should_be_navigation_panel(self) -> None:\n \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u043f\u0430\u043d\u0435\u043b\u0438 \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438.\"\"\"\n self.navigation_panel.check_presence(\n NavigationPanelLocators.PANEL_MAIN,\n \"Navigation panel is missing\"\n )\n\n def should_be_user_button(self) -> None:\n \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u043a\u043d\u043e\u043f\u043a\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\"\"\"\n self.user_button.check_presence(\"User button is missing on event panel\")\n\n def check_navigation_panel_verticall_scrolling(self) -> bool:\n \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u0439 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0438 \u043f\u0430\u043d\u0435\u043b\u0438 \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438.\n\n Returns:\n bool: True \u0435\u0441\u043b\u0438 \u043f\u0430\u043d\u0435\u043b\u044c \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u043e\u043a\u0440\u0443\u0447\u0438\u0432\u0430\u0442\u044c, \u0438\u043d\u0430\u0447\u0435 False.\n \"\"\"\n return self.navigation_panel.is_scrollable_vertically(\n NavigationPanelLocators.PANEL_SCROLL_CONTAINER\n )\n\n def check_navigation_panel_item_visibility(self, item_name: str) -> None:\n \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0432 \u043f\u0430\u043d\u0435\u043b\u0438 \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438.\n\n Args:\n item_name: \u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0434\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438.\n \"\"\"\n 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) -> 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 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) -> 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 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 \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438.</p> <p>Returns:</p> Name Type Description <code>bool</code> <code>bool</code> <p>True \u0435\u0441\u043b\u0438 \u043f\u0430\u043d\u0435\u043b\u044c \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u043e\u043a\u0440\u0443\u0447\u0438\u0432\u0430\u0442\u044c, \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) -> 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 \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438.\n\n Returns:\n bool: True \u0435\u0441\u043b\u0438 \u043f\u0430\u043d\u0435\u043b\u044c \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u043e\u043a\u0440\u0443\u0447\u0438\u0432\u0430\u0442\u044c, \u0438\u043d\u0430\u0447\u0435 False.\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_configuration_navigation_panel_item","title":"<code>click_configuration_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 \u043f\u043e\u0434\u0440\u0430\u0437\u0434\u0435\u043b\u0430 '\u041a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f' \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 \u043a\u043b\u0438\u043a\u0430.</p> required Source code in <code>pages\\main_page.py</code> <pre><code>def click_configuration_navigation_panel_item(self, item_name: str) -> None:\n \"\"\"\u041a\u043b\u0438\u043a\u0430\u0435\u0442 \u043f\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0443 \u043f\u043e\u0434\u0440\u0430\u0437\u0434\u0435\u043b\u0430 '\u041a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f' \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 \u043a\u043b\u0438\u043a\u0430.\n \"\"\"\n self.navigation_panel.click_sub_item(NavigationPanelLocators.PANEL_MAIN, 1, item_name)\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) -> 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 self.navigation_panel.click_item(NavigationPanelLocators.PANEL_MAIN, item_name)\n</code></pre>"},{"location":"pages/main_page/#pages.main_page.MainPage.click_maintenance_navigation_panel_item","title":"<code>click_maintenance_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 \u043f\u043e\u0434\u0440\u0430\u0437\u0434\u0435\u043b\u0430 '\u041e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u043d\u0438\u0435' \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 \u043a\u043b\u0438\u043a\u0430.</p> required Source code in <code>pages\\main_page.py</code> <pre><code>def click_maintenance_navigation_panel_item(self, item_name: str) -> None:\n \"\"\"\u041a\u043b\u0438\u043a\u0430\u0435\u0442 \u043f\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0443 \u043f\u043e\u0434\u0440\u0430\u0437\u0434\u0435\u043b\u0430 '\u041e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u043d\u0438\u0435' \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 \u043a\u043b\u0438\u043a\u0430.\n \"\"\"\n self.navigation_panel.click_sub_item(NavigationPanelLocators.PANEL_MAIN, 2, 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) -> 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 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) -> 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 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.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) -> 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 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) -> 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 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) -> 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 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) -> 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 self.user_button.check_presence(\"User button is missing on event panel\")\n</code></pre>"},{"location":"pages/service_status_tab/","title":"ServiceStatusTab","text":""},{"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 \u0435\u0451 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f.\n\n Args:\n page (Page): \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.\n \"\"\"\n\n def __init__(self, page: Page) -> None:\n \"\"\"\u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\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'.\"\"\"\n super().__init__(page)\n\n self.toolbar = ToolbarComponent(page, \"\u0421\u0442\u0430\u0442\u0443\u0441 \u043e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u043d\u0438\u044f\")\n self.services_table = TableComponent(page)\n\n def get_rows_count(self) -> int:\n \"\"\"\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0441\u0442\u0440\u043e\u043a \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435 \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432 (\u0431\u0435\u0437 \u0443\u0447\u0451\u0442\u0430 \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 table_content = self.services_table.read(TableLocators.TABLE_WORK_AREA)\n rows_count = len(table_content)\n\n if rows_count == 0:\n assert False, \"The contents of the table are missing\"\n\n return rows_count - 1\n\n def scroll_services_table_up(self) -> None:\n \"\"\"\u041f\u0440\u043e\u043a\u0440\u0443\u0447\u0438\u0432\u0430\u0435\u0442 \u0442\u0430\u0431\u043b\u0438\u0446\u0443 \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432 \u0432\u0432\u0435\u0440\u0445.\"\"\"\n self.services_table.scroll_up(TableLocators.TABLE_SCROLL_CONTAINER)\n\n def scroll_services_table_down(self) -> None:\n \"\"\"\u041f\u0440\u043e\u043a\u0440\u0443\u0447\u0438\u0432\u0430\u0435\u0442 \u0442\u0430\u0431\u043b\u0438\u0446\u0443 \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432 \u0432\u043d\u0438\u0437.\"\"\"\n self.services_table.scroll_down(TableLocators.TABLE_SCROLL_CONTAINER)\n\n def check_services_table_content(self) -> None:\n \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432.\n\n \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442:\n - \u041d\u0430\u043b\u0438\u0447\u0438\u0435 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u043e\u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u044b\n - \u0421\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0435 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u043e\u0432 \u043e\u0436\u0438\u0434\u0430\u0435\u043c\u044b\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f\u043c\n - \u041d\u0430\u043b\u0438\u0447\u0438\u0435 \u0445\u043e\u0442\u044f \u0431\u044b \u043e\u0434\u043d\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438 \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 \u0438\u043b\u0438 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0438 \u043d\u0435 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0442 \u043e\u0436\u0438\u0434\u0430\u0435\u043c\u044b\u043c.\n \"\"\"\n expected_headers = [\n '\u041a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440', \n '\u0412\u0440\u0435\u043c\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f', \n '\u0421\u0442\u0430\u0442\u0443\u0441', \n '\u0412\u0440\u0435\u043c\u044f \u0440\u0430\u0431\u043e\u0442\u044b', \n 'Image ID', \n 'Image \u0422\u042d\u0413'\n ]\n\n table_content = self.services_table.read(TableLocators.TABLE_WORK_AREA)\n\n if len(table_content) == 0:\n assert False, \"The contents of the table are missing\"\n\n actual_headers = table_content[0]\n\n self.check_equals(\n actual_headers, \n expected_headers,\n f\"Expected table headers {expected_headers} are not equal {actual_headers}\"\n )\n\n if len(table_content) == 1:\n assert False, \"Table body is missing\"\n\n def check_services_table_verticall_scrolling(self) -> bool:\n \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u0439 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u044b.\n\n Returns:\n bool: True \u0435\u0441\u043b\u0438 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0430 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u0430, \u0438\u043d\u0430\u0447\u0435 False.\n \"\"\"\n return self.services_table.is_scrollable_vertically(\n TableLocators.TABLE_SCROLL_CONTAINER\n ) \n\n def check_services_table_first_row_visibility(self) -> None:\n \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u043f\u0435\u0440\u0432\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u044b.\n\n Raises:\n AssertionError: \u0415\u0441\u043b\u0438 \u043f\u0435\u0440\u0432\u0430\u044f \u0441\u0442\u0440\u043e\u043a\u0430 \u043d\u0435 \u0432\u0438\u0434\u043d\u0430.\n \"\"\"\n self.services_table.check_first_row_visibility(TableLocators.TABLE_WORK_AREA)\n\n def check_services_table_last_row_visibility(self) -> None:\n \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0439 \u0441\u0442\u0440\u043e\u043a\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u044b.\n\n Raises:\n AssertionError: \u0415\u0441\u043b\u0438 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u044f\u044f \u0441\u0442\u0440\u043e\u043a\u0430 \u043d\u0435 \u0432\u0438\u0434\u043d\u0430.\n \"\"\"\n self.services_table.check_last_row_visibility(TableLocators.TABLE_WORK_AREA)\n\n def check_services_table_row_highlighting(self, row_index: int) -> None:\n \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u044b.\n\n Args:\n row_index (int): \u0418\u043d\u0434\u0435\u043a\u0441 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438.\n\n Raises:\n AssertionError: \u0415\u0441\u043b\u0438 \u0441\u0442\u0440\u043e\u043a\u0430 \u043d\u0435 \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u0430.\n \"\"\"\n self.services_table.check_row_highlighting(\n TableLocators.TABLE_WORK_AREA, \n row_index\n )\n\n def should_be_toolbar(self) -> None:\n \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0442\u0443\u043b\u0431\u0430\u0440\u0430 \u043d\u0430 \u0432\u043a\u043b\u0430\u0434\u043a\u0435.\n\n Raises:\n AssertionError: \u0415\u0441\u043b\u0438 \u0442\u0443\u043b\u0431\u0430\u0440 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442.\n \"\"\"\n self.toolbar.check_presence(\"Toolbar is missing\")\n\n def should_be_services_table(self) -> None:\n \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432.\n\n Raises:\n AssertionError: \u0415\u0441\u043b\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u0430 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442.\n \"\"\"\n 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\u0430\u0446\u0438\u044f \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\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> Source code in <code>pages\\service_status_tab.py</code> <pre><code>def __init__(self, page: Page) -> None:\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 \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 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: - \u041d\u0430\u043b\u0438\u0447\u0438\u0435 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u043e\u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u044b - \u0421\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0435 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u043e\u0432 \u043e\u0436\u0438\u0434\u0430\u0435\u043c\u044b\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f\u043c - \u041d\u0430\u043b\u0438\u0447\u0438\u0435 \u0445\u043e\u0442\u044f \u0431\u044b \u043e\u0434\u043d\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438 \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 \u0438\u043b\u0438 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0438 \u043d\u0435 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0442 \u043e\u0436\u0438\u0434\u0430\u0435\u043c\u044b\u043c.</p> Source code in <code>pages\\service_status_tab.py</code> <pre><code>def check_services_table_content(self) -> None:\n \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432.\n\n \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442:\n - \u041d\u0430\u043b\u0438\u0447\u0438\u0435 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u043e\u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u044b\n - \u0421\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0435 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u043e\u0432 \u043e\u0436\u0438\u0434\u0430\u0435\u043c\u044b\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f\u043c\n - \u041d\u0430\u043b\u0438\u0447\u0438\u0435 \u0445\u043e\u0442\u044f \u0431\u044b \u043e\u0434\u043d\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438 \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 \u0438\u043b\u0438 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0438 \u043d\u0435 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0442 \u043e\u0436\u0438\u0434\u0430\u0435\u043c\u044b\u043c.\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 \u043f\u0435\u0440\u0432\u0430\u044f \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) -> 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 \u043f\u0435\u0440\u0432\u0430\u044f \u0441\u0442\u0440\u043e\u043a\u0430 \u043d\u0435 \u0432\u0438\u0434\u043d\u0430.\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 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u044f\u044f \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) -> 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 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u044f\u044f \u0441\u0442\u0440\u043e\u043a\u0430 \u043d\u0435 \u0432\u0438\u0434\u043d\u0430.\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) -> 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 (int): \u0418\u043d\u0434\u0435\u043a\u0441 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438.\n\n Raises:\n AssertionError: \u0415\u0441\u043b\u0438 \u0441\u0442\u0440\u043e\u043a\u0430 \u043d\u0435 \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u0430.\n \"\"\"\n self.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) -> bool:\n \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u0439 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u044b.\n\n Returns:\n bool: True \u0435\u0441\u043b\u0438 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0430 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u0430, \u0438\u043d\u0430\u0447\u0435 False.\n \"\"\"\n return self.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 \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432 (\u0431\u0435\u0437 \u0443\u0447\u0451\u0442\u0430 \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) -> 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 \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432 (\u0431\u0435\u0437 \u0443\u0447\u0451\u0442\u0430 \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 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) -> 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 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) -> 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 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) -> 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 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) -> None:\n \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0442\u0443\u043b\u0431\u0430\u0440\u0430 \u043d\u0430 \u0432\u043a\u043b\u0430\u0434\u043a\u0435.\n\n Raises:\n AssertionError: \u0415\u0441\u043b\u0438 \u0442\u0443\u043b\u0431\u0430\u0440 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442.\n \"\"\"\n self.toolbar.check_presence(\"Toolbar is missing\")\n</code></pre>"},{"location":"pages/users_tab/","title":"UsersTab","text":""},{"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 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f/\u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \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 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f/\u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \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 (Page): \u042d\u043a\u0437\u0435\u043c\u043f\u043b\u044f\u0440 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b Playwright.\n \"\"\"\n\n def __init__(self, page: Page) -> None:\n \"\"\"\u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043e\u0432 \u0432\u043a\u043b\u0430\u0434\u043a\u0438 '\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438'.\"\"\"\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.success_alert = AlertComponent(page, \"success\")\n\n def add_modal_window(self, window_type: str, title: str) -> None:\n \"\"\"\u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043a\u043d\u043e \u0432 \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u044e \u043e\u043a\u043e\u043d.\n\n Args:\n window_type (str): \u0422\u0438\u043f \u043e\u043a\u043d\u0430 ('add_user' \u0438\u043b\u0438 'edit_user')\n title (str): \u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a \u043e\u043a\u043d\u0430 (\u0438\u043c\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0434\u043b\u044f \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f)\n\n Raises:\n AssertionError: \u0415\u0441\u043b\u0438 \u0443\u043a\u0430\u0437\u0430\u043d \u043d\u0435\u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u043c\u044b\u0439 \u0442\u0438\u043f \u043e\u043a\u043d\u0430.\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) -> 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 (str): \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 modal_window = self.modal_windows.get(title)\n if modal_window is None:\n assert False, f\"Modal window with title '{title}' not found\"\n return modal_window\n\n def delete_modal_window(self, title: str) -> None:\n \"\"\"\u0423\u0434\u0430\u043b\u044f\u0435\u0442 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043a\u043d\u043e \u0438\u0437 \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u0438.\n\n Args:\n title (str): \u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a \u043e\u043a\u043d\u0430\n\n Raises:\n AssertionError: \u0415\u0441\u043b\u0438 \u043e\u043a\u043d\u043e \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u043e.\n \"\"\"\n if self.modal_windows.get(title) is None:\n assert False, f\"Modal window with title '{title}' not found\"\n self.modal_windows[title] = None\n\n def close_modal_window_by_toolbar_button(self, title: str) -> None:\n \"\"\"\u0417\u0430\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043a\u043d\u043e \u0447\u0435\u0440\u0435\u0437 \u043a\u043d\u043e\u043f\u043a\u0443 \u0432 \u0442\u0443\u043b\u0431\u0430\u0440\u0435.\n\n Args:\n title (str): \u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a \u043e\u043a\u043d\u0430\n \"\"\"\n modal_window = self.get_modal_window(title)\n modal_window.close_window_by_toolbar_button()\n self.delete_modal_window(title)\n\n def close_modal_window(self, title: str) -> None:\n \"\"\"\u0417\u0430\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043a\u043d\u043e \u0447\u0435\u0440\u0435\u0437 \u043a\u043d\u043e\u043f\u043a\u0443 \u0437\u0430\u043a\u0440\u044b\u0442\u0438\u044f.\n\n Args:\n title (str): \u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a \u043e\u043a\u043d\u0430\n \"\"\"\n modal_window = self.get_modal_window(title)\n modal_window.close_window()\n self.delete_modal_window(title)\n\n def close_add_user_window_by_toolbar_button(self) -> None:\n \"\"\"\u0417\u0430\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u043e\u043a\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0447\u0435\u0440\u0435\u0437 \u043a\u043d\u043e\u043f\u043a\u0443 \u0432 \u0442\u0443\u043b\u0431\u0430\u0440\u0435.\"\"\"\n self.close_modal_window_by_toolbar_button(\"add_user\")\n\n def close_add_user_window(self) -> None:\n \"\"\"\u0417\u0430\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u043e\u043a\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\"\"\"\n self.close_modal_window(\"add_user\")\n\n def close_edit_user_window_by_toolbar_button(self, title: str) -> None:\n \"\"\"\u0417\u0430\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u043e\u043a\u043d\u043e \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\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 (str): \u0418\u043c\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f (\u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a \u043e\u043a\u043d\u0430)\n \"\"\"\n self.close_modal_window_by_toolbar_button(title)\n\n def close_edit_user_window(self, title: str) -> None:\n \"\"\"\u0417\u0430\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u043e\u043a\u043d\u043e \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\n\n Args:\n title (str): \u0418\u043c\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f (\u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a \u043e\u043a\u043d\u0430)\n \"\"\"\n self.close_modal_window(title)\n\n def add_new_user(self, user_data: dict) -> None:\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.\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\n\n Raises:\n AssertionError: \u0415\u0441\u043b\u0438 \u043d\u0435 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0435\u0442\u0441\u044f \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u043e\u0431 \u0443\u0441\u043f\u0435\u0448\u043d\u043e\u043c \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0438.\n \"\"\"\n self.get_modal_window(\"add_user\").new_user(user_data)\n self.success_alert.check_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.success_alert.check_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\n def delete_user(self, user_name: str) -> None:\n \"\"\"\u0423\u0434\u0430\u043b\u044f\u0435\u0442 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\n\n Args:\n user_name (str): \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 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0435\u0442\u0441\u044f \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u043e\u0431 \u0443\u0441\u043f\u0435\u0448\u043d\u043e\u043c \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0438.\n \"\"\"\n self.get_modal_window(user_name).delete_user()\n self.success_alert.check_presence('\\n\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u0443\u0434\u0430\u043b\u0451\u043d\\n')\n self.success_alert.check_absence('\\n\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u0443\u0434\u0430\u043b\u0451\u043d\\n')\n\n def edit_user(self, user_name: str, user_data: dict) -> None:\n \"\"\"\u0420\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u0443\u0435\u0442 \u0434\u0430\u043d\u043d\u044b\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\n\n Args:\n user_name (str): \u0418\u043c\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\n user_data (dict): \u041d\u043e\u0432\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\n\n Raises:\n AssertionError: \u0415\u0441\u043b\u0438 \u043d\u0435 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0435\u0442\u0441\u044f \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u043e\u0431 \u0443\u0441\u043f\u0435\u0448\u043d\u043e\u043c \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0438.\n \"\"\"\n self.get_modal_window(user_name).edit_user(user_data)\n self.success_alert.check_presence('\\n\u041e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u0443\u0441\u043f\u0435\u0448\u043d\u043e\\n')\n self.success_alert.check_absence('\\n\u041e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u0443\u0441\u043f\u0435\u0448\u043d\u043e\\n')\n\n def reset_password(self, user_name: str) -> str:\n \"\"\"\u0421\u0431\u0440\u0430\u0441\u044b\u0432\u0430\u0435\u0442 \u043f\u0430\u0440\u043e\u043b\u044c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\n\n Args:\n user_name (str): \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 new_password = \"\"\n self.get_modal_window(user_name).reset_password()\n\n self.success_alert.check_presence(\"\")\n alert_message = self.success_alert.get_text()\n if len(alert_message) > 0:\n new_password = re.findall(r'[\\d]+', alert_message)[0]\n\n return new_password\n\n def find_user_in_table(self, name: str, role: str) -> int:\n \"\"\"\u0418\u0449\u0435\u0442 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435.\n\n Args:\n name (str): \u0418\u043c\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\n role (str): \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 table_content = self.users_table.read(TableLocators.TABLE_WORK_AREA)\n if len(table_content) == 0:\n assert False, \"The contents of the table are missing\"\n\n del table_content[0] # \u0423\u0434\u0430\u043b\u044f\u0435\u043c \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a\n\n for row_index, user_info in enumerate(table_content):\n if name in user_info and role in user_info:\n return row_index\n return -1\n\n def open_add_user_window(self) -> None:\n \"\"\"\u041e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u043e\u043a\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\n\n Raises:\n AssertionError: \u0415\u0441\u043b\u0438 \u043a\u043d\u043e\u043f\u043a\u0438 \u043d\u0435\u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b \u0438\u043b\u0438 \u043e\u043a\u043d\u043e \u043d\u0435 \u043e\u0442\u043a\u0440\u044b\u043b\u043e\u0441\u044c.\n \"\"\"\n 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) -> 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 (int): \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 tmp_dict = {\"admin\": \"\u0410\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440\", \"manager\": \"\u041a\u043e\u043d\u0442\u0430\u043a\u0442\u043d\u043e\u0435 \u043b\u0438\u0446\u043e\", \"operator\": \"\u041e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\"}\n table_content = self.users_table.read(TableLocators.TABLE_WORK_AREA)\n\n if len(table_content) == 0:\n assert False, \"The contents of the table are missing\" \n\n del table_content[0] # \u0423\u0434\u0430\u043b\u044f\u0435\u043c \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a\n\n if row_index >= len(table_content):\n assert False, \"Row_index is out of range\"\n\n user_name = table_content[row_index][0]\n for key, val in tmp_dict.items():\n if user_name == val:\n user_name = key \n\n role = table_content[row_index][1]\n\n self.page.locator(TableLocators.TABLE_WORK_AREA).locator(\"//tbody/tr\").nth(row_index).click()\n self.add_modal_window(\"edit_user\", user_name)\n self.get_modal_window(user_name).check_by_window_title()\n\n return user_name, role\n\n def open_edit_user_page_by_user(self, user_name: str, role: str) -> None:\n \"\"\"\u041e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u043e\u043a\u043d\u043e \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043f\u043e \u0438\u043c\u0435\u043d\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0438 \u0440\u043e\u043b\u0438.\n\n Args:\n user_name (str): \u0418\u043c\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\n role (str): \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 row_index = self.find_user_in_table(user_name, role) \n if row_index == -1:\n assert False, f\"User with name {user_name} and role {role} has not been found\"\n\n self.page.locator(TableLocators.TABLE_WORK_AREA).locator(\"//tbody/tr\").nth(row_index).click()\n self.add_modal_window(\"edit_user\", user_name)\n self.get_modal_window(user_name).check_by_window_title()\n\n def check_users_table_content(self, verify: bool = False) -> None:\n \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439.\n\n Args:\n verify (bool, optional): \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 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0442.\n \"\"\"\n expected_headers = ['\u0418\u043c\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f', '\u0420\u043e\u043b\u044c', 'E-mail', '\u041d\u043e\u043c\u0435\u0440 \u0434\u043b\u044f \u0421\u041c\u0421']\n table_content = self.users_table.read(TableLocators.TABLE_WORK_AREA)\n\n if len(table_content) == 0:\n assert False, \"The contents of the table are missing\"\n\n actual_headers = table_content[0]\n self.check_equals(\n actual_headers, \n expected_headers,\n f\"Expected table headers {expected_headers} are not equal {actual_headers}\"\n )\n\n if len(table_content) == 1:\n assert False, \"Table body is missing\"\n\n if verify:\n self.verify_users_table_content(table_content)\n\n def check_add_user_window_content(self) -> None:\n \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u043e\u043a\u043d\u0430 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\"\"\"\n self.get_modal_window(\"add_user\").check_content()\n\n def check_edit_user_window_content(self, user_name: str, role: str) -> None:\n \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u043e\u043a\u043d\u0430 \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\n\n Args:\n user_name (str): \u0418\u043c\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\n role (str): \u0420\u043e\u043b\u044c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\n \"\"\"\n edit_user_window = self.get_modal_window(user_name) \n edit_user_window.check_content(user_name, role)\n\n def should_be_toolbar(self) -> None:\n \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0442\u0443\u043b\u0431\u0430\u0440\u0430.\n\n Raises:\n AssertionError: \u0415\u0441\u043b\u0438 \u0442\u0443\u043b\u0431\u0430\u0440 \u0438\u043b\u0438 \u043a\u043d\u043e\u043f\u043a\u0430 \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u044e\u0442.\n \"\"\"\n self.toolbar.check_presence(\"Toolbar is missing\")\n self.toolbar.check_button_presence(\"edit\")\n\n def should_be_toolbar_buttons(self) -> None:\n \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u043a\u043d\u043e\u043f\u043e\u043a \u0442\u0443\u043b\u0431\u0430\u0440\u0430.\n\n Raises:\n AssertionError: \u0415\u0441\u043b\u0438 \u043a\u043d\u043e\u043f\u043a\u0438 \u043d\u0435\u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b \u0438\u043b\u0438 \u0438\u043c\u0435\u044e\u0442 \u043d\u0435\u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u044b\u0435 \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0438.\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) -> 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 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) -> 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 (str): \u0418\u043c\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\n role (str): \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 found = self.find_user_in_table(name, role) \n if found == -1:\n assert False, f\"User with name {name} and role {role} has not been found\"\n\n def should_not_be_user_in_table(self, name: str, role: str) -> None:\n \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435.\n\n Args:\n name (str): \u0418\u043c\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\n role (str): \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 found = self.find_user_in_table(name, role) \n if found != -1:\n assert False, f\"User with name {name} and role {role} has been found\"\n\n def verify_users_table_content(self, users_table: list) -> None:\n \"\"\"\u0421\u0432\u0435\u0440\u044f\u0435\u0442 \u0434\u0430\u043d\u043d\u044b\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0441 \u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u0438\u0437 \u0411\u0414.\n\n Args:\n users_table (list): \u0414\u0430\u043d\u043d\u044b\u0435 \u0438\u0437 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u043d\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435\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 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[\"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\u0430\u0446\u0438\u044f \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043e\u0432 \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) -> None:\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 \u0432\u043a\u043b\u0430\u0434\u043a\u0438 '\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438'.\"\"\"\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.success_alert = AlertComponent(page, \"success\")\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 \u043e\u043a\u043e\u043d.</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 (\u0438\u043c\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0434\u043b\u044f \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f)</p> required <p>Raises:</p> Type Description <code>AssertionError</code> <p>\u0415\u0441\u043b\u0438 \u0443\u043a\u0430\u0437\u0430\u043d \u043d\u0435\u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u043c\u044b\u0439 \u0442\u0438\u043f \u043e\u043a\u043d\u0430.</p> Source code in <code>pages\\users_tab.py</code> <pre><code>def add_modal_window(self, window_type: str, title: str) -> None:\n \"\"\"\u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0435 \u043e\u043a\u043d\u043e \u0432 \u043a\u043e\u043b\u043b\u0435\u043a\u0446\u0438\u044e \u043e\u043a\u043e\u043d.\n\n Args:\n window_type (str): \u0422\u0438\u043f \u043e\u043a\u043d\u0430 ('add_user' \u0438\u043b\u0438 'edit_user')\n title (str): \u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a \u043e\u043a\u043d\u0430 (\u0438\u043c\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0434\u043b\u044f \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f)\n\n Raises:\n AssertionError: \u0415\u0441\u043b\u0438 \u0443\u043a\u0430\u0437\u0430\u043d \u043d\u0435\u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u043c\u044b\u0439 \u0442\u0438\u043f \u043e\u043a\u043d\u0430.\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.</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</p> required <p>Raises:</p> Type Description <code>AssertionError</code> <p>\u0415\u0441\u043b\u0438 \u043d\u0435 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0435\u0442\u0441\u044f \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u043e\u0431 \u0443\u0441\u043f\u0435\u0448\u043d\u043e\u043c \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0438.</p> Source code in <code>pages\\users_tab.py</code> <pre><code>def add_new_user(self, user_data: dict) -> None:\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.\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\n\n Raises:\n AssertionError: \u0415\u0441\u043b\u0438 \u043d\u0435 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0435\u0442\u0441\u044f \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u043e\u0431 \u0443\u0441\u043f\u0435\u0448\u043d\u043e\u043c \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0438.\n \"\"\"\n self.get_modal_window(\"add_user\").new_user(user_data)\n self.success_alert.check_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.success_alert.check_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</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) -> 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 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 \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>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) -> 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 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\n\n Args:\n user_name (str): \u0418\u043c\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\n role (str): \u0420\u043e\u043b\u044c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\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 \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 check_users_table_content(self, verify: bool = False) -> None:\n \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439.\n\n Args:\n verify (bool, optional): \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 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0442.\n \"\"\"\n expected_headers = ['\u0418\u043c\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f', '\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) -> 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 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 \u043a\u043d\u043e\u043f\u043a\u0443 \u0432 \u0442\u0443\u043b\u0431\u0430\u0440\u0435.</p> Source code in <code>pages\\users_tab.py</code> <pre><code>def close_add_user_window_by_toolbar_button(self) -> None:\n \"\"\"\u0417\u0430\u043a\u0440\u044b\u0432\u0430\u0435\u0442 \u043e\u043a\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0447\u0435\u0440\u0435\u0437 \u043a\u043d\u043e\u043f\u043a\u0443 \u0432 \u0442\u0443\u043b\u0431\u0430\u0440\u0435.\"\"\"\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) -> 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 (str): \u0418\u043c\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f (\u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a \u043e\u043a\u043d\u0430)\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 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\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) -> 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 \u0447\u0435\u0440\u0435\u0437 \u043a\u043d\u043e\u043f\u043a\u0443 \u0432 \u0442\u0443\u043b\u0431\u0430\u0440\u0435.\n\n Args:\n title (str): \u0418\u043c\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f (\u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a \u043e\u043a\u043d\u0430)\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) -> 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 (str): \u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a \u043e\u043a\u043d\u0430\n \"\"\"\n modal_window = self.get_modal_window(title)\n modal_window.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) -> 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 (str): \u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a \u043e\u043a\u043d\u0430\n \"\"\"\n modal_window = self.get_modal_window(title)\n modal_window.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) -> 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 (str): \u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a \u043e\u043a\u043d\u0430\n\n Raises:\n AssertionError: \u0415\u0441\u043b\u0438 \u043e\u043a\u043d\u043e \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u043e.\n \"\"\"\n if self.modal_windows.get(title) is None:\n assert False, f\"Modal window with title '{title}' not found\"\n self.modal_windows[title] = None\n</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 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0435\u0442\u0441\u044f \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \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) -> 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 (str): \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 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0435\u0442\u0441\u044f \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u043e\u0431 \u0443\u0441\u043f\u0435\u0448\u043d\u043e\u043c \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0438.\n \"\"\"\n self.get_modal_window(user_name).delete_user()\n self.success_alert.check_presence('\\n\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u0443\u0434\u0430\u043b\u0451\u043d\\n')\n self.success_alert.check_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 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0435\u0442\u0441\u044f \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \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) -> 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 (str): \u0418\u043c\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\n user_data (dict): \u041d\u043e\u0432\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\n\n Raises:\n AssertionError: \u0415\u0441\u043b\u0438 \u043d\u0435 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0435\u0442\u0441\u044f \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u043e\u0431 \u0443\u0441\u043f\u0435\u0448\u043d\u043e\u043c \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0438.\n \"\"\"\n self.get_modal_window(user_name).edit_user(user_data)\n self.success_alert.check_presence('\\n\u041e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u0443\u0441\u043f\u0435\u0448\u043d\u043e\\n')\n self.success_alert.check_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) -> 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 (str): \u0418\u043c\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\n role (str): \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 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) -> 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 (str): \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 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) -> 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 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) -> 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 (int): \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 tmp_dict = {\"admin\": \"\u0410\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440\", \"manager\": \"\u041a\u043e\u043d\u0442\u0430\u043a\u0442\u043d\u043e\u0435 \u043b\u0438\u0446\u043e\", \"operator\": \"\u041e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\"}\n table_content = self.users_table.read(TableLocators.TABLE_WORK_AREA)\n\n if len(table_content) == 0:\n assert False, \"The contents of the table are missing\" \n\n del table_content[0] # \u0423\u0434\u0430\u043b\u044f\u0435\u043c \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a\n\n if row_index >= len(table_content):\n assert False, \"Row_index is out of range\"\n\n user_name = table_content[row_index][0]\n for key, val in tmp_dict.items():\n if user_name == val:\n user_name = key \n\n role = table_content[row_index][1]\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 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \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) -> 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 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0438 \u0440\u043e\u043b\u0438.\n\n Args:\n user_name (str): \u0418\u043c\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\n role (str): \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 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) -> 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 (str): \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 new_password = \"\"\n self.get_modal_window(user_name).reset_password()\n\n self.success_alert.check_presence(\"\")\n alert_message = self.success_alert.get_text()\n if len(alert_message) > 0:\n new_password = re.findall(r'[\\d]+', alert_message)[0]\n\n return new_password\n</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) -> 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 self.toolbar.check_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 \u0438\u043c\u0435\u044e\u0442 \u043d\u0435\u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u044b\u0435 \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0438.</p> Source code in <code>pages\\users_tab.py</code> <pre><code>def should_be_toolbar_buttons(self) -> None:\n \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u043a\u043d\u043e\u043f\u043e\u043a \u0442\u0443\u043b\u0431\u0430\u0440\u0430.\n\n Raises:\n AssertionError: \u0415\u0441\u043b\u0438 \u043a\u043d\u043e\u043f\u043a\u0438 \u043d\u0435\u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b \u0438\u043b\u0438 \u0438\u043c\u0435\u044e\u0442 \u043d\u0435\u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u044b\u0435 \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0438.\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) -> 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 (str): \u0418\u043c\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\n role (str): \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 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) -> 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 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) -> 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 (str): \u0418\u043c\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\n role (str): \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 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) -> 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 (list): \u0414\u0430\u043d\u043d\u044b\u0435 \u0438\u0437 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u043d\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435\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 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[\"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":""},{"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):\n \"\"\"\u0424\u0438\u043a\u0441\u0442\u0443\u0440\u0430 \u0434\u043b\u044f \u043d\u0430\u0441\u0442\u0440\u043e\u0439\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 \u0433\u043b\u0430\u0432\u043d\u0443\u044e \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0443\n 3. \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0443 \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u043f\u0430\u043d\u0435\u043b\u0438 \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438\n 4. \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u043d\u0430 \u0432\u043a\u043b\u0430\u0434\u043a\u0443 '\u041b\u0438\u0446\u0435\u043d\u0437\u0438\u0438' \u0447\u0435\u0440\u0435\u0437 \u043c\u0435\u043d\u044e \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043a\n\n Args:\n browser: \u0424\u0438\u043a\u0441\u0442\u0443\u0440\u0430 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0430\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 \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \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\u043c \u043c\u0435\u043d\u044e\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 \u043c\u0435\u043d\u044e \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438\n mp.click_configuration_navigation_panel_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 \"\u041b\u0438\u0446\u0435\u043d\u0437\u0438\u0438\" \u0432 \u043c\u0435\u043d\u044e \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438\n mp.click_configuration_navigation_panel_item(\"\u041b\u0438\u0446\u0435\u043d\u0437\u0438\u0438\")\n\n def test_verticall_scrolling(self, browser):\n \"\"\"\u0422\u0435\u0441\u0442 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u0439 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0438 \u0432 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0435 \u0441 JSON-\u0434\u0430\u043d\u043d\u044b\u043c\u0438.\n\n \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442:\n 1. \u041d\u0430\u043b\u0438\u0447\u0438\u0435 \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\n 2. \u041a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0441\u0442\u044c \u0440\u0430\u0431\u043e\u0442\u044b \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0438 \u0432\u043d\u0438\u0437 \u0438 \u0432\u0432\u0435\u0440\u0445\n\n Args:\n browser: \u0424\u0438\u043a\u0441\u0442\u0443\u0440\u0430 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0430\n \"\"\"\n # \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u0441 \u043b\u0438\u0446\u0435\u043d\u0437\u0438\u044f\u043c\u0438\n lt = LicenseTab(browser)\n\n # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043d\u0430\u043b\u0438\u0447\u0438\u044f \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u0439 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0438\n is_scrollable = lt.check_json_container_verticall_scrolling()\n assert is_scrollable, \"Should be verticall scrolling\"\n\n # \u041f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0430 \u0432\u043d\u0438\u0437 \u0441 \u0437\u0430\u0434\u0435\u0440\u0436\u043a\u043e\u0439\n lt.scroll_json_container_down()\n lt.wait_for_timeout(3000)\n\n # \u041f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0430 \u0432\u0432\u0435\u0440\u0445 \u0441 \u0437\u0430\u0434\u0435\u0440\u0436\u043a\u043e\u0439\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>\u0424\u0438\u043a\u0441\u0442\u0443\u0440\u0430 \u0434\u043b\u044f \u043d\u0430\u0441\u0442\u0440\u043e\u0439\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 \u0433\u043b\u0430\u0432\u043d\u0443\u044e \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0443 3. \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0443 \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u043f\u0430\u043d\u0435\u043b\u0438 \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438 4. \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u043d\u0430 \u0432\u043a\u043b\u0430\u0434\u043a\u0443 '\u041b\u0438\u0446\u0435\u043d\u0437\u0438\u0438' \u0447\u0435\u0440\u0435\u0437 \u043c\u0435\u043d\u044e \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043a</p> <p>Parameters:</p> Name Type Description Default <code>browser</code> <p>\u0424\u0438\u043a\u0441\u0442\u0443\u0440\u0430 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0430</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):\n \"\"\"\u0424\u0438\u043a\u0441\u0442\u0443\u0440\u0430 \u0434\u043b\u044f \u043d\u0430\u0441\u0442\u0440\u043e\u0439\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 \u0433\u043b\u0430\u0432\u043d\u0443\u044e \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0443\n 3. \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0443 \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u043f\u0430\u043d\u0435\u043b\u0438 \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438\n 4. \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u043d\u0430 \u0432\u043a\u043b\u0430\u0434\u043a\u0443 '\u041b\u0438\u0446\u0435\u043d\u0437\u0438\u0438' \u0447\u0435\u0440\u0435\u0437 \u043c\u0435\u043d\u044e \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043a\n\n Args:\n browser: \u0424\u0438\u043a\u0441\u0442\u0443\u0440\u0430 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0430\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 \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \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\u043c \u043c\u0435\u043d\u044e\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 \u043c\u0435\u043d\u044e \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438\n mp.click_configuration_navigation_panel_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 \"\u041b\u0438\u0446\u0435\u043d\u0437\u0438\u0438\" \u0432 \u043c\u0435\u043d\u044e \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438\n mp.click_configuration_navigation_panel_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>\u0422\u0435\u0441\u0442 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u0439 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0438 \u0432 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0435 \u0441 JSON-\u0434\u0430\u043d\u043d\u044b\u043c\u0438.</p> <p>\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442: 1. \u041d\u0430\u043b\u0438\u0447\u0438\u0435 \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 2. \u041a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0441\u0442\u044c \u0440\u0430\u0431\u043e\u0442\u044b \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0438 \u0432\u043d\u0438\u0437 \u0438 \u0432\u0432\u0435\u0440\u0445</p> <p>Parameters:</p> Name Type Description Default <code>browser</code> <p>\u0424\u0438\u043a\u0441\u0442\u0443\u0440\u0430 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0430</p> required Source code in <code>tests\\components\\test_json_container.py</code> <pre><code>def test_verticall_scrolling(self, browser):\n \"\"\"\u0422\u0435\u0441\u0442 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u0439 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0438 \u0432 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0435 \u0441 JSON-\u0434\u0430\u043d\u043d\u044b\u043c\u0438.\n\n \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442:\n 1. \u041d\u0430\u043b\u0438\u0447\u0438\u0435 \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\n 2. \u041a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0441\u0442\u044c \u0440\u0430\u0431\u043e\u0442\u044b \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0438 \u0432\u043d\u0438\u0437 \u0438 \u0432\u0432\u0435\u0440\u0445\n\n Args:\n browser: \u0424\u0438\u043a\u0441\u0442\u0443\u0440\u0430 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0430\n \"\"\"\n # \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u0441 \u043b\u0438\u0446\u0435\u043d\u0437\u0438\u044f\u043c\u0438\n lt = LicenseTab(browser)\n\n # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043d\u0430\u043b\u0438\u0447\u0438\u044f \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u0439 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0438\n is_scrollable = lt.check_json_container_verticall_scrolling()\n assert is_scrollable, \"Should be verticall scrolling\"\n\n # \u041f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0430 \u0432\u043d\u0438\u0437 \u0441 \u0437\u0430\u0434\u0435\u0440\u0436\u043a\u043e\u0439\n lt.scroll_json_container_down()\n lt.wait_for_timeout(3000)\n\n # \u041f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0430 \u0432\u0432\u0435\u0440\u0445 \u0441 \u0437\u0430\u0434\u0435\u0440\u0436\u043a\u043e\u0439\n lt.scroll_json_container_up()\n lt.wait_for_timeout(2000)\n</code></pre>"},{"location":"tests/components/test_navigation_panel/","title":"TestNavigationPanel","text":""},{"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: \u0444\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: \u0444\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):\n \"\"\"\u0422\u0435\u0441\u0442 \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 \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438.\n\n \u0410\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u044b:\n browser: \u0444\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 \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442:\n None\n\n \u0418\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f:\n AssertionError: \u0435\u0441\u043b\u0438 \u043f\u0430\u043d\u0435\u043b\u044c \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438 \u043d\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\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 # \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.click_configuration_navigation_panel_item(\"\u0410\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f\") \n mp.click_configuration_navigation_panel_item(\"\u0423\u0432\u0435\u0434\u043e\u043c\u043b\u0435\u043d\u0438\u044f\") \n mp.click_configuration_navigation_panel_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_configuration_navigation_panel_item(\"Zero Touch Provisioning\")\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\n mp.scroll_navigation_panel_down()\n mp.check_navigation_panel_item_visibility(\"\u0428\u0430\u0431\u043b\u043e\u043d\u044b\")\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>\u0422\u0435\u0441\u0442 \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 \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438.</p> \u0410\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u044b <p>browser: \u0444\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> \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 <p>None</p> \u0418\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f <p>AssertionError: \u0435\u0441\u043b\u0438 \u043f\u0430\u043d\u0435\u043b\u044c \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438 \u043d\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u0443\u044e \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):\n \"\"\"\u0422\u0435\u0441\u0442 \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 \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438.\n\n \u0410\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u044b:\n browser: \u0444\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 \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442:\n None\n\n \u0418\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f:\n AssertionError: \u0435\u0441\u043b\u0438 \u043f\u0430\u043d\u0435\u043b\u044c \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438 \u043d\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\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 # \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.click_configuration_navigation_panel_item(\"\u0410\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f\") \n mp.click_configuration_navigation_panel_item(\"\u0423\u0432\u0435\u0434\u043e\u043c\u043b\u0435\u043d\u0438\u044f\") \n mp.click_configuration_navigation_panel_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_configuration_navigation_panel_item(\"Zero Touch Provisioning\")\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\n mp.scroll_navigation_panel_down()\n mp.check_navigation_panel_item_visibility(\"\u0428\u0430\u0431\u043b\u043e\u043d\u044b\")\n mp.wait_for_timeout(2000)\n</code></pre>"},{"location":"tests/components/test_services_table/","title":"TestServiceStatusTable","text":""},{"location":"tests/components/test_services_table/#tests.components.test_services_table.TestServiceStatusTable","title":"<code>TestServiceStatusTable</code>","text":"<p>\u0422\u0435\u0441\u0442\u044b \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> <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: - \u041e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\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 - \u0421\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0433\u043e \u0442\u0430\u0431\u043b\u0438\u0446\u044b - \u0412\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</p> Source code in <code>tests\\components\\test_services_table.py</code> <pre><code>class TestServiceStatusTable:\n \"\"\"\u0422\u0435\u0441\u0442\u044b \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 \u0421\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0442\u0435\u0441\u0442\u044b \u0434\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438:\n - \u041e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\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 - \u0421\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0433\u043e \u0442\u0430\u0431\u043b\u0438\u0446\u044b\n - \u0412\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\n \"\"\"\n\n # @pytest.mark.smoke\n @pytest.fixture(scope=\"function\", autouse=True)\n def setup(self, browser):\n \"\"\"\u0424\u0438\u043a\u0441\u0442\u0443\u0440\u0430 \u0434\u043b\u044f \u043d\u0430\u0441\u0442\u0440\u043e\u0439\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 \u0433\u043b\u0430\u0432\u043d\u0443\u044e \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0443\n 3. \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0443 \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u043f\u0430\u043d\u0435\u043b\u0438 \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438\n 4. \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u043d\u0430 \u0432\u043a\u043b\u0430\u0434\u043a\u0443 '\u0421\u0442\u0430\u0442\u0443\u0441 \u043e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u043d\u0438\u044f'\n\n Args:\n browser: \u0424\u0438\u043a\u0441\u0442\u0443\u0440\u0430 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0430\n \"\"\"\n # \u0410\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u044f \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0435\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 \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \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\u043c \u043c\u0435\u043d\u044e\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 \u043c\u0435\u043d\u044e \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438\n mp.click_configuration_navigation_panel_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 \u043c\u0435\u043d\u044e \u043e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u043d\u0438\u044f\n mp.click_maintenance_navigation_panel_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):\n \"\"\"\u0422\u0435\u0441\u0442 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\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.\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\u0442\u0430\u0442\u0443\u0441\u043e\u0432 \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432\n 2. \u0421\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u044b\n 3. \u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u0439 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0438\n 4. \u0412\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u0441\u0442\u0440\u043e\u043a \u043f\u043e\u0441\u043b\u0435 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0438\n\n Args:\n browser: \u0424\u0438\u043a\u0441\u0442\u0443\u0440\u0430 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0430\n \"\"\"\n # \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u0441 \u0442\u0430\u0431\u043b\u0438\u0446\u0435\u0439 \u0441\u0442\u0430\u0442\u0443\u0441\u043e\u0432 \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432\n sst = ServiceStatusTab(browser)\n\n # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043d\u0430\u043b\u0438\u0447\u0438\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u044b\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\n sst.check_services_table_content()\n\n # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u0439 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0438\n is_scrollable_vertically = sst.check_services_table_verticall_scrolling()\n assert is_scrollable_vertically, \"Should be verticall scrolling\"\n\n # \u041f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0430 \u0432\u043d\u0438\u0437 \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0439 \u0441\u0442\u0440\u043e\u043a\u0438\n sst.scroll_services_table_down()\n sst.check_services_table_last_row_visibility()\n sst.wait_for_timeout(3000)\n\n # \u041f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0430 \u0432\u0432\u0435\u0440\u0445 \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u043f\u0435\u0440\u0432\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438\n 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>\u0424\u0438\u043a\u0441\u0442\u0443\u0440\u0430 \u0434\u043b\u044f \u043d\u0430\u0441\u0442\u0440\u043e\u0439\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 \u0433\u043b\u0430\u0432\u043d\u0443\u044e \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0443 3. \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0443 \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u043f\u0430\u043d\u0435\u043b\u0438 \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438 4. \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u043d\u0430 \u0432\u043a\u043b\u0430\u0434\u043a\u0443 '\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> <p>\u0424\u0438\u043a\u0441\u0442\u0443\u0440\u0430 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0430</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):\n \"\"\"\u0424\u0438\u043a\u0441\u0442\u0443\u0440\u0430 \u0434\u043b\u044f \u043d\u0430\u0441\u0442\u0440\u043e\u0439\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 \u0433\u043b\u0430\u0432\u043d\u0443\u044e \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0443\n 3. \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0443 \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u043f\u0430\u043d\u0435\u043b\u0438 \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438\n 4. \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u043d\u0430 \u0432\u043a\u043b\u0430\u0434\u043a\u0443 '\u0421\u0442\u0430\u0442\u0443\u0441 \u043e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u043d\u0438\u044f'\n\n Args:\n browser: \u0424\u0438\u043a\u0441\u0442\u0443\u0440\u0430 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0430\n \"\"\"\n # \u0410\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u044f \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0435\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 \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \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\u043c \u043c\u0435\u043d\u044e\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 \u043c\u0435\u043d\u044e \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438\n mp.click_configuration_navigation_panel_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 \u043c\u0435\u043d\u044e \u043e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u043d\u0438\u044f\n mp.click_maintenance_navigation_panel_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>\u0422\u0435\u0441\u0442 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\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.</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\u0442\u0430\u0442\u0443\u0441\u043e\u0432 \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432 2. \u0421\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u044b 3. \u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u0439 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0438 4. \u0412\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u0441\u0442\u0440\u043e\u043a \u043f\u043e\u0441\u043b\u0435 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0438</p> <p>Parameters:</p> Name Type Description Default <code>browser</code> <p>\u0424\u0438\u043a\u0441\u0442\u0443\u0440\u0430 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0430</p> required Source code in <code>tests\\components\\test_services_table.py</code> <pre><code>def test_scrolling(self, browser):\n \"\"\"\u0422\u0435\u0441\u0442 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\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.\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\u0442\u0430\u0442\u0443\u0441\u043e\u0432 \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432\n 2. \u0421\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u044b\n 3. \u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u0439 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0438\n 4. \u0412\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u0441\u0442\u0440\u043e\u043a \u043f\u043e\u0441\u043b\u0435 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0438\n\n Args:\n browser: \u0424\u0438\u043a\u0441\u0442\u0443\u0440\u0430 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0430\n \"\"\"\n # \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u0441 \u0442\u0430\u0431\u043b\u0438\u0446\u0435\u0439 \u0441\u0442\u0430\u0442\u0443\u0441\u043e\u0432 \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432\n sst = ServiceStatusTab(browser)\n\n # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043d\u0430\u043b\u0438\u0447\u0438\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u044b\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\n sst.check_services_table_content()\n\n # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u0439 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0438\n is_scrollable_vertically = sst.check_services_table_verticall_scrolling()\n assert is_scrollable_vertically, \"Should be verticall scrolling\"\n\n # \u041f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0430 \u0432\u043d\u0438\u0437 \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0439 \u0441\u0442\u0440\u043e\u043a\u0438\n sst.scroll_services_table_down()\n sst.check_services_table_last_row_visibility()\n sst.wait_for_timeout(3000)\n\n # \u041f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0430 \u0432\u0432\u0435\u0440\u0445 \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u043f\u0435\u0440\u0432\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438\n 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":""},{"location":"tests/components/test_user_modal_window/#tests.components.test_user_modal_window.TestUsersModalWindow","title":"<code>TestUsersModalWindow</code>","text":"<p>\u0422\u0435\u0441\u0442\u044b \u0434\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\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> <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: - \u041f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0438 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u044b\u0445 \u043e\u043a\u043e\u043d (\u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u0439 \u0438 \u0433\u043e\u0440\u0438\u0437\u043e\u043d\u0442\u0430\u043b\u044c\u043d\u043e\u0439) - \u0412\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u043f\u043e\u0441\u043b\u0435 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0438 - \u0424\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u043e\u043a\u043e\u043d \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \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> Source code in <code>tests\\components\\test_user_modal_window.py</code> <pre><code>class TestUsersModalWindow:\n \"\"\"\u0422\u0435\u0441\u0442\u044b \u0434\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\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.\n\n \u0421\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0442\u0435\u0441\u0442\u044b \u0434\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438:\n - \u041f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0438 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u044b\u0445 \u043e\u043a\u043e\u043d (\u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u0439 \u0438 \u0433\u043e\u0440\u0438\u0437\u043e\u043d\u0442\u0430\u043b\u044c\u043d\u043e\u0439)\n - \u0412\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u043f\u043e\u0441\u043b\u0435 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0438\n - \u0424\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u043e\u043a\u043e\u043d \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439\n \"\"\"\n\n # @pytest.mark.smoke\n @pytest.fixture(scope=\"function\", autouse=True)\n def setup(self, browser):\n \"\"\"\u0424\u0438\u043a\u0441\u0442\u0443\u0440\u0430 \u0434\u043b\u044f \u043d\u0430\u0441\u0442\u0440\u043e\u0439\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 \u0433\u043b\u0430\u0432\u043d\u0443\u044e \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0443\n 3. \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0443 \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u043f\u0430\u043d\u0435\u043b\u0438 \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438\n 4. \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u043d\u0430 \u0432\u043a\u043b\u0430\u0434\u043a\u0443 '\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438'\n\n Args:\n browser: \u0424\u0438\u043a\u0441\u0442\u0443\u0440\u0430 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0430\n \"\"\"\n # \u0410\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u044f \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0435\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 \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \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\u043c \u043c\u0435\u043d\u044e\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 \"\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438\" \u0432 \u043c\u0435\u043d\u044e \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438\n mp.click_configuration_navigation_panel_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):\n \"\"\"\u0422\u0435\u0441\u0442 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0438 \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 \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442:\n 1. \u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u0439 \u0438 \u0433\u043e\u0440\u0438\u0437\u043e\u043d\u0442\u0430\u043b\u044c\u043d\u043e\u0439 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0438\n 2. \u0412\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u043a\u043d\u043e\u043f\u043e\u043a \u043f\u043e\u0441\u043b\u0435 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0438\n 3. \u041a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0441\u0442\u044c \u0440\u0430\u0431\u043e\u0442\u044b \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0438 \u0432 \u0440\u0430\u0437\u043d\u044b\u0445 \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f\u0445\n\n Args:\n browser: \u0424\u0438\u043a\u0441\u0442\u0443\u0440\u0430 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0430\n \"\"\"\n # \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\u043c\u0438\n ut = UsersTab(browser)\n\n # \u041e\u0442\u043a\u0440\u044b\u0442\u0438\u0435 \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 user_name, role = ut.open_edit_user_page_by_index(0)\n\n # \u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430\n modal_window = ut.get_modal_window(user_name)\n\n # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u0439 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0438\n is_scrollable_vertically = modal_window.check_window_vertical_scrolling()\n assert is_scrollable_vertically, \"Should be vertical scrolling\"\n\n # \u041f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0430 \u0432\u043d\u0438\u0437 \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043a\u043d\u043e\u043f\u043a\u0438 \"close\"\n modal_window.scroll_window_down()\n modal_window.check_button_presence(\"close\")\n ut.wait_for_timeout(3000)\n\n # \u041f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0430 \u0432\u0432\u0435\u0440\u0445 \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043a\u043d\u043e\u043f\u043a\u0438 \"close\" \u0432 \u0442\u0443\u043b\u0431\u0430\u0440\u0435\n modal_window.scroll_window_up()\n modal_window.check_toolbar_button_presence(\"close\")\n ut.wait_for_timeout(3000)\n\n # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0433\u043e\u0440\u0438\u0437\u043e\u043d\u0442\u0430\u043b\u044c\u043d\u043e\u0439 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0438\n is_scrollable_horizontally = modal_window.check_window_horizontal_scrolling()\n assert is_scrollable_horizontally, \"Should be horizontal scrolling\"\n\n # \u041f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0430 \u0432\u043f\u0440\u0430\u0432\u043e \u0438 \u0432\u043b\u0435\u0432\u043e\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):\n \"\"\"\u0422\u0435\u0441\u0442 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0438 \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 \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442:\n 1. \u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u0439 \u0438 \u0433\u043e\u0440\u0438\u0437\u043e\u043d\u0442\u0430\u043b\u044c\u043d\u043e\u0439 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0438\n 2. \u0412\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u043a\u043d\u043e\u043f\u043e\u043a \u043f\u043e\u0441\u043b\u0435 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0438\n 3. \u041a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0441\u0442\u044c \u0440\u0430\u0431\u043e\u0442\u044b \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0438 \u0432 \u0440\u0430\u0437\u043d\u044b\u0445 \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f\u0445\n\n Args:\n browser: \u0424\u0438\u043a\u0441\u0442\u0443\u0440\u0430 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0430\n \"\"\"\n # \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\u043c\u0438\n ut = UsersTab(browser)\n\n # \u041e\u0442\u043a\u0440\u044b\u0442\u0438\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 ut.open_add_user_window()\n\n # \u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430\n modal_window = ut.get_modal_window(\"add_user\")\n\n # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u0439 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0438\n is_scrollable_vertically = modal_window.check_window_vertical_scrolling()\n assert is_scrollable_vertically, \"Should be vertical scrolling\"\n\n # \u041f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0430 \u0432\u043d\u0438\u0437 \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043a\u043d\u043e\u043f\u043a\u0438 \"close\"\n modal_window.scroll_window_down()\n modal_window.check_button_presence(\"close\")\n ut.wait_for_timeout(3000)\n\n # \u041f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0430 \u0432\u0432\u0435\u0440\u0445 \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043a\u043d\u043e\u043f\u043a\u0438 \"close\" \u0432 \u0442\u0443\u043b\u0431\u0430\u0440\u0435\n modal_window.scroll_window_up()\n modal_window.check_toolbar_button_presence(\"close\")\n ut.wait_for_timeout(3000)\n\n # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0433\u043e\u0440\u0438\u0437\u043e\u043d\u0442\u0430\u043b\u044c\u043d\u043e\u0439 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0438\n is_scrollable_horizontally = modal_window.check_window_horizontal_scrolling()\n assert is_scrollable_horizontally, \"Should be horizontal scrolling\"\n\n # \u041f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0430 \u0432\u043f\u0440\u0430\u0432\u043e \u0438 \u0432\u043b\u0435\u0432\u043e\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/components/test_user_modal_window/#tests.components.test_user_modal_window.TestUsersModalWindow.setup","title":"<code>setup(browser)</code>","text":"<p>\u0424\u0438\u043a\u0441\u0442\u0443\u0440\u0430 \u0434\u043b\u044f \u043d\u0430\u0441\u0442\u0440\u043e\u0439\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 \u0433\u043b\u0430\u0432\u043d\u0443\u044e \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0443 3. \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0443 \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u043f\u0430\u043d\u0435\u043b\u0438 \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438 4. \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u043d\u0430 \u0432\u043a\u043b\u0430\u0434\u043a\u0443 '\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438'</p> <p>Parameters:</p> Name Type Description Default <code>browser</code> <p>\u0424\u0438\u043a\u0441\u0442\u0443\u0440\u0430 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0430</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):\n \"\"\"\u0424\u0438\u043a\u0441\u0442\u0443\u0440\u0430 \u0434\u043b\u044f \u043d\u0430\u0441\u0442\u0440\u043e\u0439\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 \u0433\u043b\u0430\u0432\u043d\u0443\u044e \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0443\n 3. \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0443 \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u043f\u0430\u043d\u0435\u043b\u0438 \u043d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u0438\n 4. \u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u043d\u0430 \u0432\u043a\u043b\u0430\u0434\u043a\u0443 '\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438'\n\n Args:\n browser: \u0424\u0438\u043a\u0441\u0442\u0443\u0440\u0430 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0430\n \"\"\"\n # \u0410\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u044f \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0435\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 \u0432\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \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\u043c \u043c\u0435\u043d\u044e\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 \"\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438\" \u0432 \u043c\u0435\u043d\u044e \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438\n mp.click_configuration_navigation_panel_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>\u0422\u0435\u0441\u0442 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0438 \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>\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442: 1. \u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u0439 \u0438 \u0433\u043e\u0440\u0438\u0437\u043e\u043d\u0442\u0430\u043b\u044c\u043d\u043e\u0439 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0438 2. \u0412\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u043a\u043d\u043e\u043f\u043e\u043a \u043f\u043e\u0441\u043b\u0435 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0438 3. \u041a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0441\u0442\u044c \u0440\u0430\u0431\u043e\u0442\u044b \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0438 \u0432 \u0440\u0430\u0437\u043d\u044b\u0445 \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f\u0445</p> <p>Parameters:</p> Name Type Description Default <code>browser</code> <p>\u0424\u0438\u043a\u0441\u0442\u0443\u0440\u0430 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0430</p> required Source code in <code>tests\\components\\test_user_modal_window.py</code> <pre><code>def test_add_user_window_scrolling(self, browser):\n \"\"\"\u0422\u0435\u0441\u0442 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0438 \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 \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442:\n 1. \u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u0439 \u0438 \u0433\u043e\u0440\u0438\u0437\u043e\u043d\u0442\u0430\u043b\u044c\u043d\u043e\u0439 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0438\n 2. \u0412\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u043a\u043d\u043e\u043f\u043e\u043a \u043f\u043e\u0441\u043b\u0435 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0438\n 3. \u041a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0441\u0442\u044c \u0440\u0430\u0431\u043e\u0442\u044b \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0438 \u0432 \u0440\u0430\u0437\u043d\u044b\u0445 \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f\u0445\n\n Args:\n browser: \u0424\u0438\u043a\u0441\u0442\u0443\u0440\u0430 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0430\n \"\"\"\n # \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\u043c\u0438\n ut = UsersTab(browser)\n\n # \u041e\u0442\u043a\u0440\u044b\u0442\u0438\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 ut.open_add_user_window()\n\n # \u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430\n modal_window = ut.get_modal_window(\"add_user\")\n\n # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u0439 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0438\n is_scrollable_vertically = modal_window.check_window_vertical_scrolling()\n assert is_scrollable_vertically, \"Should be vertical scrolling\"\n\n # \u041f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0430 \u0432\u043d\u0438\u0437 \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043a\u043d\u043e\u043f\u043a\u0438 \"close\"\n modal_window.scroll_window_down()\n modal_window.check_button_presence(\"close\")\n ut.wait_for_timeout(3000)\n\n # \u041f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0430 \u0432\u0432\u0435\u0440\u0445 \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043a\u043d\u043e\u043f\u043a\u0438 \"close\" \u0432 \u0442\u0443\u043b\u0431\u0430\u0440\u0435\n modal_window.scroll_window_up()\n modal_window.check_toolbar_button_presence(\"close\")\n ut.wait_for_timeout(3000)\n\n # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0433\u043e\u0440\u0438\u0437\u043e\u043d\u0442\u0430\u043b\u044c\u043d\u043e\u0439 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0438\n is_scrollable_horizontally = modal_window.check_window_horizontal_scrolling()\n assert is_scrollable_horizontally, \"Should be horizontal scrolling\"\n\n # \u041f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0430 \u0432\u043f\u0440\u0430\u0432\u043e \u0438 \u0432\u043b\u0435\u0432\u043e\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/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>\u0422\u0435\u0441\u0442 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0438 \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>\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442: 1. \u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u0439 \u0438 \u0433\u043e\u0440\u0438\u0437\u043e\u043d\u0442\u0430\u043b\u044c\u043d\u043e\u0439 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0438 2. \u0412\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u043a\u043d\u043e\u043f\u043e\u043a \u043f\u043e\u0441\u043b\u0435 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0438 3. \u041a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0441\u0442\u044c \u0440\u0430\u0431\u043e\u0442\u044b \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0438 \u0432 \u0440\u0430\u0437\u043d\u044b\u0445 \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f\u0445</p> <p>Parameters:</p> Name Type Description Default <code>browser</code> <p>\u0424\u0438\u043a\u0441\u0442\u0443\u0440\u0430 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0430</p> required 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):\n \"\"\"\u0422\u0435\u0441\u0442 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0438 \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 \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442:\n 1. \u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u0439 \u0438 \u0433\u043e\u0440\u0438\u0437\u043e\u043d\u0442\u0430\u043b\u044c\u043d\u043e\u0439 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0438\n 2. \u0412\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u043a\u043d\u043e\u043f\u043e\u043a \u043f\u043e\u0441\u043b\u0435 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0438\n 3. \u041a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0441\u0442\u044c \u0440\u0430\u0431\u043e\u0442\u044b \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0438 \u0432 \u0440\u0430\u0437\u043d\u044b\u0445 \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f\u0445\n\n Args:\n browser: \u0424\u0438\u043a\u0441\u0442\u0443\u0440\u0430 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0430\n \"\"\"\n # \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\u043c\u0438\n ut = UsersTab(browser)\n\n # \u041e\u0442\u043a\u0440\u044b\u0442\u0438\u0435 \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 user_name, role = ut.open_edit_user_page_by_index(0)\n\n # \u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u043c\u043e\u0434\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430\n modal_window = ut.get_modal_window(user_name)\n\n # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u0439 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0438\n is_scrollable_vertically = modal_window.check_window_vertical_scrolling()\n assert is_scrollable_vertically, \"Should be vertical scrolling\"\n\n # \u041f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0430 \u0432\u043d\u0438\u0437 \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043a\u043d\u043e\u043f\u043a\u0438 \"close\"\n modal_window.scroll_window_down()\n modal_window.check_button_presence(\"close\")\n ut.wait_for_timeout(3000)\n\n # \u041f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0430 \u0432\u0432\u0435\u0440\u0445 \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043a\u043d\u043e\u043f\u043a\u0438 \"close\" \u0432 \u0442\u0443\u043b\u0431\u0430\u0440\u0435\n modal_window.scroll_window_up()\n modal_window.check_toolbar_button_presence(\"close\")\n ut.wait_for_timeout(3000)\n\n # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0433\u043e\u0440\u0438\u0437\u043e\u043d\u0442\u0430\u043b\u044c\u043d\u043e\u0439 \u043f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0438\n is_scrollable_horizontally = modal_window.check_window_horizontal_scrolling()\n assert is_scrollable_horizontally, \"Should be horizontal scrolling\"\n\n # \u041f\u0440\u043e\u043a\u0440\u0443\u0442\u043a\u0430 \u0432\u043f\u0440\u0430\u0432\u043e \u0438 \u0432\u043b\u0435\u0432\u043e\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_license_tab/","title":"TestLicenseTab","text":""},{"location":"tests/e2e/test_license_tab/#tests.e2e.test_license_tab.TestLisenceTab","title":"<code>TestLisenceTab</code>","text":"<p>\u0422\u0435\u0441\u0442\u044b \u0434\u043b\u044f \u0432\u043a\u043b\u0430\u0434\u043a\u0438 '\u041b\u0438\u0446\u0435\u043d\u0437\u0438\u0438'.</p> \u0410\u0442\u0440\u0438\u0431\u0443\u0442\u044b <p>browser: \u0444\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_license_tab.py</code> <pre><code>class TestLisenceTab:\n \"\"\"\u0422\u0435\u0441\u0442\u044b \u0434\u043b\u044f \u0432\u043a\u043b\u0430\u0434\u043a\u0438 '\u041b\u0438\u0446\u0435\u043d\u0437\u0438\u0438'.\n\n \u0410\u0442\u0440\u0438\u0431\u0443\u0442\u044b:\n browser: \u0444\u0438\u043a\u0441\u0442\u0443\u0440\u0430 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u043e\u043c.\n \"\"\"\n\n @pytest.fixture(scope=\"function\", autouse=True)\n def setup(self, browser):\n \"\"\"\u041f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0430 \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 \u0432\u0445\u043e\u0434 \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0443 \u0438 \u043f\u0435\u0440\u0435\u0445\u043e\u0434 \u043d\u0430 \u0432\u043a\u043b\u0430\u0434\u043a\u0443 '\u041b\u0438\u0446\u0435\u043d\u0437\u0438\u0438'.\n\n Args:\n browser: \u0444\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 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 \u043a\u043d\u043e\u043f\u043a\u0435 \"\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 \u043a\u043d\u043e\u043f\u043a\u0435 \"\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_configuration_navigation_panel_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 \u043a\u043d\u043e\u043f\u043a\u0435 \"\u041b\u0438\u0446\u0435\u043d\u0437\u0438\u0438\" \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_configuration_navigation_panel_item(\"\u041b\u0438\u0446\u0435\u043d\u0437\u0438\u0438\")\n\n def test_lisence_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 '\u041b\u0438\u0446\u0435\u043d\u0437\u0438\u0438'.\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 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0433\u043e \u0432\u043a\u043b\u0430\u0434\u043a\u0438.\n\n Args:\n browser: \u0444\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 # \u0412\u043a\u043b\u0430\u0434\u043a\u0430 \u043b\u0438\u0446\u0435\u043d\u0437\u0438\u0439 \u043e\u0442\u043a\u0440\u044b\u0442\u0430\n lt = LicenseTab(browser)\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\u0442\u0430\u0442\u0443\u0441\u043e\u0432 \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432\n lt.check_content()\n\n def test_license_tab_input_form_and_check_alert(self, browser):\n \"\"\"\u0422\u0435\u0441\u0442 \u0444\u043e\u0440\u043c\u044b \u0432\u0432\u043e\u0434\u0430 \u043b\u0438\u0446\u0435\u043d\u0437\u0438\u0438 \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0430\u043b\u0435\u0440\u0442\u043e\u0432.\n\n \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0443 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0445 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u0432 \u0432\u0432\u043e\u0434\u0430 \u0432 \u0444\u043e\u0440\u043c\u0443 \u043b\u0438\u0446\u0435\u043d\u0437\u0438\u0438.\n\n Args:\n browser: \u0444\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 def gen_test_data():\n \"\"\"\u0413\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f \u0442\u0435\u0441\u0442\u043e\u0432\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u0434\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0444\u043e\u0440\u043c\u044b \u0432\u0432\u043e\u0434\u0430 \u043b\u0438\u0446\u0435\u043d\u0437\u0438\u0438.\n\n Returns:\n list: \u0421\u043f\u0438\u0441\u043e\u043a \u0442\u0435\u0441\u0442\u043e\u0432\u044b\u0445 \u0441\u0442\u0440\u043e\u043a \u0434\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438.\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 # \u0412\u043a\u043b\u0430\u0434\u043a\u0430 \u043b\u0438\u0446\u0435\u043d\u0437\u0438\u0439 \u043e\u0442\u043a\u0440\u044b\u0442\u0430\n lt = LicenseTab(browser)\n\n # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043d\u0430\u043b\u0438\u0447\u0438\u044f \u043f\u0443\u0441\u0442\u043e\u0439 \u0444\u043e\u0440\u043c\u044b \u0432\u0432\u043e\u0434\u0430 \u043b\u0438\u0446\u0435\u043d\u0437\u0438\u0438\n lt.should_be_empty_input_form()\n\n # \u0412\u0432\u043e\u0434 \u043f\u0443\u0441\u0442\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438\n lt.fill_license_input_form(\"\")\n # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043e\u043a\u043d\u0430 \u0441 \u043e\u0448\u0438\u0431\u043a\u043e\u0439\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 # \u0412\u0432\u043e\u0434 \u043d\u0435\u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0433\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f\n lt.fill_license_input_form(data_string) \n # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043e\u043a\u043d\u0430 \u0441 \u043e\u0448\u0438\u0431\u043a\u043e\u0439\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.TestLisenceTab.setup","title":"<code>setup(browser)</code>","text":"<p>\u041f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0430 \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 \u0432\u0445\u043e\u0434 \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0443 \u0438 \u043f\u0435\u0440\u0435\u0445\u043e\u0434 \u043d\u0430 \u0432\u043a\u043b\u0430\u0434\u043a\u0443 '\u041b\u0438\u0446\u0435\u043d\u0437\u0438\u0438'.</p> <p>Parameters:</p> Name Type Description Default <code>browser</code> <p>\u0444\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_license_tab.py</code> <pre><code>@pytest.fixture(scope=\"function\", autouse=True)\ndef setup(self, browser):\n \"\"\"\u041f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0430 \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 \u0432\u0445\u043e\u0434 \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0443 \u0438 \u043f\u0435\u0440\u0435\u0445\u043e\u0434 \u043d\u0430 \u0432\u043a\u043b\u0430\u0434\u043a\u0443 '\u041b\u0438\u0446\u0435\u043d\u0437\u0438\u0438'.\n\n Args:\n browser: \u0444\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 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 \u043a\u043d\u043e\u043f\u043a\u0435 \"\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 \u043a\u043d\u043e\u043f\u043a\u0435 \"\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_configuration_navigation_panel_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 \u043a\u043d\u043e\u043f\u043a\u0435 \"\u041b\u0438\u0446\u0435\u043d\u0437\u0438\u0438\" \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_configuration_navigation_panel_item(\"\u041b\u0438\u0446\u0435\u043d\u0437\u0438\u0438\")\n</code></pre>"},{"location":"tests/e2e/test_license_tab/#tests.e2e.test_license_tab.TestLisenceTab.test_license_tab_input_form_and_check_alert","title":"<code>test_license_tab_input_form_and_check_alert(browser)</code>","text":"<p>\u0422\u0435\u0441\u0442 \u0444\u043e\u0440\u043c\u044b \u0432\u0432\u043e\u0434\u0430 \u043b\u0438\u0446\u0435\u043d\u0437\u0438\u0438 \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0430\u043b\u0435\u0440\u0442\u043e\u0432.</p> <p>\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0443 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0445 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u0432 \u0432\u0432\u043e\u0434\u0430 \u0432 \u0444\u043e\u0440\u043c\u0443 \u043b\u0438\u0446\u0435\u043d\u0437\u0438\u0438.</p> <p>Parameters:</p> Name Type Description Default <code>browser</code> <p>\u0444\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_license_tab.py</code> <pre><code>def test_license_tab_input_form_and_check_alert(self, browser):\n \"\"\"\u0422\u0435\u0441\u0442 \u0444\u043e\u0440\u043c\u044b \u0432\u0432\u043e\u0434\u0430 \u043b\u0438\u0446\u0435\u043d\u0437\u0438\u0438 \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0430\u043b\u0435\u0440\u0442\u043e\u0432.\n\n \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0443 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0445 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u0432 \u0432\u0432\u043e\u0434\u0430 \u0432 \u0444\u043e\u0440\u043c\u0443 \u043b\u0438\u0446\u0435\u043d\u0437\u0438\u0438.\n\n Args:\n browser: \u0444\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 def gen_test_data():\n \"\"\"\u0413\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f \u0442\u0435\u0441\u0442\u043e\u0432\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u0434\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0444\u043e\u0440\u043c\u044b \u0432\u0432\u043e\u0434\u0430 \u043b\u0438\u0446\u0435\u043d\u0437\u0438\u0438.\n\n Returns:\n list: \u0421\u043f\u0438\u0441\u043e\u043a \u0442\u0435\u0441\u0442\u043e\u0432\u044b\u0445 \u0441\u0442\u0440\u043e\u043a \u0434\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438.\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 # \u0412\u043a\u043b\u0430\u0434\u043a\u0430 \u043b\u0438\u0446\u0435\u043d\u0437\u0438\u0439 \u043e\u0442\u043a\u0440\u044b\u0442\u0430\n lt = LicenseTab(browser)\n\n # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043d\u0430\u043b\u0438\u0447\u0438\u044f \u043f\u0443\u0441\u0442\u043e\u0439 \u0444\u043e\u0440\u043c\u044b \u0432\u0432\u043e\u0434\u0430 \u043b\u0438\u0446\u0435\u043d\u0437\u0438\u0438\n lt.should_be_empty_input_form()\n\n # \u0412\u0432\u043e\u0434 \u043f\u0443\u0441\u0442\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438\n lt.fill_license_input_form(\"\")\n # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043e\u043a\u043d\u0430 \u0441 \u043e\u0448\u0438\u0431\u043a\u043e\u0439\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 # \u0412\u0432\u043e\u0434 \u043d\u0435\u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0433\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f\n lt.fill_license_input_form(data_string) \n # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043e\u043a\u043d\u0430 \u0441 \u043e\u0448\u0438\u0431\u043a\u043e\u0439\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.TestLisenceTab.test_lisence_tab_content","title":"<code>test_lisence_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 '\u041b\u0438\u0446\u0435\u043d\u0437\u0438\u0438'.</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 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0433\u043e \u0432\u043a\u043b\u0430\u0434\u043a\u0438.</p> <p>Parameters:</p> Name Type Description Default <code>browser</code> <p>\u0444\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_license_tab.py</code> <pre><code>def test_lisence_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 '\u041b\u0438\u0446\u0435\u043d\u0437\u0438\u0438'.\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 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0433\u043e \u0432\u043a\u043b\u0430\u0434\u043a\u0438.\n\n Args:\n browser: \u0444\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 # \u0412\u043a\u043b\u0430\u0434\u043a\u0430 \u043b\u0438\u0446\u0435\u043d\u0437\u0438\u0439 \u043e\u0442\u043a\u0440\u044b\u0442\u0430\n lt = LicenseTab(browser)\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\u0442\u0430\u0442\u0443\u0441\u043e\u0432 \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432\n lt.check_content()\n</code></pre>"},{"location":"tests/e2e/test_login/","title":"TestLogin","text":""},{"location":"tests/e2e/test_login/#tests.e2e.test_login.TestLogin","title":"<code>TestLogin</code>","text":"<p>\u0422\u0435\u0441\u0442\u044b \u0434\u043b\u044f \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> \u0410\u0442\u0440\u0438\u0431\u0443\u0442\u044b <p>browser: \u0444\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_login.py</code> <pre><code>class TestLogin:\n \"\"\"\u0422\u0435\u0441\u0442\u044b \u0434\u043b\u044f \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.\n\n \u0410\u0442\u0440\u0438\u0431\u0443\u0442\u044b:\n browser: \u0444\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_successful_login(self, browser):\n \"\"\"\u0422\u0435\u0441\u0442 \u0443\u0441\u043f\u0435\u0448\u043d\u043e\u0433\u043e \u0432\u0445\u043e\u0434\u0430 \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0443.\n\n \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0441\u0442\u044c \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u0438 \u0441 \u0432\u0430\u043b\u0438\u0434\u043d\u044b\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u043c\u0438.\n\n Args:\n browser: \u0444\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 lp = LoginPage(browser)\n lp.do_login()\n\n def test_unsuccessful_login(self, browser):\n \"\"\"\u0422\u0435\u0441\u0442 \u043d\u0435\u0443\u0434\u0430\u0447\u043d\u043e\u0433\u043e \u0432\u0445\u043e\u0434\u0430 \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0443.\n\n \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0443 \u043d\u0435\u0432\u0430\u043b\u0438\u0434\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u043f\u0440\u0438 \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u0438.\n\n Args:\n browser: \u0444\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 lp = LoginPage(browser)\n lp.do_unsuccessful_login()\n\n def test_successful_login_and_logout(self, browser):\n \"\"\"\u0422\u0435\u0441\u0442 \u0443\u0441\u043f\u0435\u0448\u043d\u043e\u0433\u043e \u0432\u0445\u043e\u0434\u0430 \u0438 \u0432\u044b\u0445\u043e\u0434\u0430 \u0438\u0437 \u0441\u0438\u0441\u0442\u0435\u043c\u044b.\n\n \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043f\u043e\u043b\u043d\u044b\u0439 \u0446\u0438\u043a\u043b \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u0438 \u0438 \u0434\u0435\u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u0438.\n\n Args:\n browser: \u0444\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 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 # \u0412\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u0432\u044b\u0445\u043e\u0434\u0430 \u0438\u0437 \u0441\u0438\u0441\u0442\u0435\u043c\u044b\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>\u0422\u0435\u0441\u0442 \u0443\u0441\u043f\u0435\u0448\u043d\u043e\u0433\u043e \u0432\u0445\u043e\u0434\u0430 \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0443.</p> <p>\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0441\u0442\u044c \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u0438 \u0441 \u0432\u0430\u043b\u0438\u0434\u043d\u044b\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u043c\u0438.</p> <p>Parameters:</p> Name Type Description Default <code>browser</code> <p>\u0444\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_login.py</code> <pre><code>def test_successful_login(self, browser):\n \"\"\"\u0422\u0435\u0441\u0442 \u0443\u0441\u043f\u0435\u0448\u043d\u043e\u0433\u043e \u0432\u0445\u043e\u0434\u0430 \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0443.\n\n \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0441\u0442\u044c \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u0438 \u0441 \u0432\u0430\u043b\u0438\u0434\u043d\u044b\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u043c\u0438.\n\n Args:\n browser: \u0444\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 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>\u0422\u0435\u0441\u0442 \u0443\u0441\u043f\u0435\u0448\u043d\u043e\u0433\u043e \u0432\u0445\u043e\u0434\u0430 \u0438 \u0432\u044b\u0445\u043e\u0434\u0430 \u0438\u0437 \u0441\u0438\u0441\u0442\u0435\u043c\u044b.</p> <p>\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043f\u043e\u043b\u043d\u044b\u0439 \u0446\u0438\u043a\u043b \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u0438 \u0438 \u0434\u0435\u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u0438.</p> <p>Parameters:</p> Name Type Description Default <code>browser</code> <p>\u0444\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_login.py</code> <pre><code>def test_successful_login_and_logout(self, browser):\n \"\"\"\u0422\u0435\u0441\u0442 \u0443\u0441\u043f\u0435\u0448\u043d\u043e\u0433\u043e \u0432\u0445\u043e\u0434\u0430 \u0438 \u0432\u044b\u0445\u043e\u0434\u0430 \u0438\u0437 \u0441\u0438\u0441\u0442\u0435\u043c\u044b.\n\n \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043f\u043e\u043b\u043d\u044b\u0439 \u0446\u0438\u043a\u043b \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u0438 \u0438 \u0434\u0435\u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u0438.\n\n Args:\n browser: \u0444\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 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 # \u0412\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u0432\u044b\u0445\u043e\u0434\u0430 \u0438\u0437 \u0441\u0438\u0441\u0442\u0435\u043c\u044b\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>\u0422\u0435\u0441\u0442 \u043d\u0435\u0443\u0434\u0430\u0447\u043d\u043e\u0433\u043e \u0432\u0445\u043e\u0434\u0430 \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0443.</p> <p>\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0443 \u043d\u0435\u0432\u0430\u043b\u0438\u0434\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u043f\u0440\u0438 \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u0438.</p> <p>Parameters:</p> Name Type Description Default <code>browser</code> <p>\u0444\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_login.py</code> <pre><code>def test_unsuccessful_login(self, browser):\n \"\"\"\u0422\u0435\u0441\u0442 \u043d\u0435\u0443\u0434\u0430\u0447\u043d\u043e\u0433\u043e \u0432\u0445\u043e\u0434\u0430 \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0443.\n\n \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0443 \u043d\u0435\u0432\u0430\u043b\u0438\u0434\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u043f\u0440\u0438 \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u0438.\n\n Args:\n browser: \u0444\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 lp = LoginPage(browser)\n lp.do_unsuccessful_login()\n</code></pre>"},{"location":"tests/e2e/test_service_status_tab/","title":"TestServiceStatusTab","text":""},{"location":"tests/e2e/test_service_status_tab/#tests.e2e.test_service_status_tab.TestServiceStatusTab","title":"<code>TestServiceStatusTab</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\u0442\u0430\u0442\u0443\u0441 \u043e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u043d\u0438\u044f'.</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.</p> Source code in <code>tests\\e2e\\test_service_status_tab.py</code> <pre><code>class TestServiceStatusTab:\n \"\"\"\u041d\u0430\u0431\u043e\u0440 \u0442\u0435\u0441\u0442\u043e\u0432 \u0434\u043b\u044f \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 \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.\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\u0442\u0430\u0442\u0443\u0441 \u043e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u043d\u0438\u044f'\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_configuration_navigation_panel_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_maintenance_navigation_panel_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):\n \"\"\"\u0422\u0435\u0441\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0433\u043e \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 \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442:\n 1. \u041d\u0430\u043b\u0438\u0447\u0438\u0435 \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\u0440\u0432\u0438\u0441\u043e\u0432\n 3. \u041a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0441\u0442\u044c \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0433\u043e \u0442\u0430\u0431\u043b\u0438\u0446\u044b\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):\n \"\"\"\u0422\u0435\u0441\u0442 \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0441\u0442\u0440\u043e\u043a \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435 \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432.\n\n \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0441\u0442\u0440\u043e\u043a:\n 1. \u041f\u0435\u0440\u0432\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438\n 2. \u041f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0439 \u0441\u0442\u0440\u043e\u043a\u0438\n 3. \u0421\u0442\u0440\u043e\u043a\u0438 \u0432 \u0441\u0435\u0440\u0435\u0434\u0438\u043d\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u044b\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>\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\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>@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\u0442\u0430\u0442\u0443\u0441 \u043e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u043d\u0438\u044f'\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_configuration_navigation_panel_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_maintenance_navigation_panel_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>\u0422\u0435\u0441\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0433\u043e \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>\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442: 1. \u041d\u0430\u043b\u0438\u0447\u0438\u0435 \u0442\u0443\u043b\u0431\u0430\u0440\u0430 2. \u041d\u0430\u043b\u0438\u0447\u0438\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432 3. \u041a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0441\u0442\u044c \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0433\u043e \u0442\u0430\u0431\u043b\u0438\u0446\u044b</p> Source code in <code>tests\\e2e\\test_service_status_tab.py</code> <pre><code>def test_service_status_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\u0442\u0430\u0442\u0443\u0441 \u043e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u043d\u0438\u044f'.\n\n \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442:\n 1. \u041d\u0430\u043b\u0438\u0447\u0438\u0435 \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\u0440\u0432\u0438\u0441\u043e\u0432\n 3. \u041a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0441\u0442\u044c \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0433\u043e \u0442\u0430\u0431\u043b\u0438\u0446\u044b\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>\u0422\u0435\u0441\u0442 \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0441\u0442\u0440\u043e\u043a \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435 \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432.</p> <p>\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0441\u0442\u0440\u043e\u043a: 1. \u041f\u0435\u0440\u0432\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438 2. \u041f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0439 \u0441\u0442\u0440\u043e\u043a\u0438 3. \u0421\u0442\u0440\u043e\u043a\u0438 \u0432 \u0441\u0435\u0440\u0435\u0434\u0438\u043d\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u044b</p> Source code in <code>tests\\e2e\\test_service_status_tab.py</code> <pre><code>def test_service_status_table_row_highlighting(self, browser):\n \"\"\"\u0422\u0435\u0441\u0442 \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0441\u0442\u0440\u043e\u043a \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435 \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432.\n\n \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0441\u0442\u0440\u043e\u043a:\n 1. \u041f\u0435\u0440\u0432\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438\n 2. \u041f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0439 \u0441\u0442\u0440\u043e\u043a\u0438\n 3. \u0421\u0442\u0440\u043e\u043a\u0438 \u0432 \u0441\u0435\u0440\u0435\u0434\u0438\u043d\u0435 \u0442\u0430\u0431\u043b\u0438\u0446\u044b\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_users_tab/","title":"TestUsersTab","text":""},{"location":"tests/e2e/test_users_tab/#tests.e2e.test_users_tab.TestUsersTab","title":"<code>TestUsersTab</code>","text":"<p>\u0422\u0435\u0441\u0442\u044b \u0434\u043b\u044f \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\u0430 \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\u043c\u0438: - \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0441\u043f\u0438\u0441\u043a\u0430 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 - \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435/\u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 - \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u0440\u043e\u043b\u0435\u0439 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 - \u0441\u0431\u0440\u043e\u0441 \u043f\u0430\u0440\u043e\u043b\u0435\u0439</p> \u0410\u0442\u0440\u0438\u0431\u0443\u0442\u044b <p>browser: \u0444\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_users_tab.py</code> <pre><code>class TestUsersTab:\n \"\"\"\u0422\u0435\u0441\u0442\u044b \u0434\u043b\u044f \u0432\u043a\u043b\u0430\u0434\u043a\u0438 '\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438'.\n\n \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 \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\u043c\u0438:\n - \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0441\u043f\u0438\u0441\u043a\u0430 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439\n - \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435/\u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439\n - \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u0440\u043e\u043b\u0435\u0439 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439\n - \u0441\u0431\u0440\u043e\u0441 \u043f\u0430\u0440\u043e\u043b\u0435\u0439\n\n \u0410\u0442\u0440\u0438\u0431\u0443\u0442\u044b:\n browser: \u0444\u0438\u043a\u0441\u0442\u0443\u0440\u0430 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u043e\u043c.\n \"\"\"\n\n @pytest.fixture(scope=\"function\", autouse=True)\n def setup(self, browser):\n \"\"\"\u041f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0430 \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 \u0432\u0445\u043e\u0434 \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0443 \u0438 \u043f\u0435\u0440\u0435\u0445\u043e\u0434 \u043d\u0430 \u0432\u043a\u043b\u0430\u0434\u043a\u0443 '\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438'.\n\n Args:\n browser: \u0444\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 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 \u043a\u043d\u043e\u043f\u043a\u0435 \"\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 \u043a\u043d\u043e\u043f\u043a\u0435 \"\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438\" \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_configuration_navigation_panel_item(\"\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438\")\n\n def test_users_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 '\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438'.\n\n \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0445 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430 \u0438 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0433\u043e \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439.\n\n Args:\n browser: \u0444\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 # \u0412\u043a\u043b\u0430\u0434\u043a\u0430 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 \u043e\u0442\u043a\u0440\u044b\u0442\u0430\n ut = UsersTab(browser)\n\n # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043d\u0430\u043b\u0438\u0447\u0438\u044f \u043f\u0430\u043d\u0435\u043b\u0438 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432\n ut.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 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439\n ut.should_be_users_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 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 \u0438 \u0441\u0432\u0435\u0440\u043a\u0430 \u0441 \u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u0438\u0437 \u0411\u0414\n ut.check_users_table_content(True)\n\n def test_users_tab_toolbar_buttons(self, browser):\n \"\"\"\u0422\u0435\u0441\u0442 \u043a\u043d\u043e\u043f\u043e\u043a \u043d\u0430 \u043f\u0430\u043d\u0435\u043b\u0438 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432.\n\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 \u043a\u043d\u043e\u043f\u043e\u043a \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\u043c\u0438.\n\n Args:\n browser: \u0444\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 ut = UsersTab(browser)\n ut.should_be_toolbar_buttons()\n\n def test_add_user_window_content(self, browser):\n \"\"\"\u0422\u0435\u0441\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0433\u043e \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 \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0441\u0442\u044c \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0444\u043e\u0440\u043c\u044b \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 Args:\n browser: \u0444\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 ut = UsersTab(browser)\n\n # \u041e\u0442\u043a\u0440\u044b\u0442\u0438\u0435 \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 ut.open_add_user_window()\n\n # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0433\u043e \u0444\u043e\u0440\u043c\u044b\n ut.check_add_user_window_content()\n\n def test_add_user_window_close_buttons(self, browser):\n \"\"\"\u0422\u0435\u0441\u0442 \u043a\u043d\u043e\u043f\u043e\u043a \u0437\u0430\u043a\u0440\u044b\u0442\u0438\u044f \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 \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0443 \u043a\u043d\u043e\u043f\u043e\u043a \u0437\u0430\u043a\u0440\u044b\u0442\u0438\u044f \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 Args:\n browser: \u0444\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 ut = UsersTab(browser)\n\n # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0437\u0430\u043a\u0440\u044b\u0442\u0438\u044f \u0447\u0435\u0440\u0435\u0437 \u043a\u043d\u043e\u043f\u043a\u0443 \u043d\u0430 \u043f\u0430\u043d\u0435\u043b\u0438 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432\n ut.open_add_user_window() \n ut.close_add_user_window_by_toolbar_button()\n\n # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0437\u0430\u043a\u0440\u044b\u0442\u0438\u044f \u0447\u0435\u0440\u0435\u0437 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u0443\u044e \u043a\u043d\u043e\u043f\u043a\u0443 \u0437\u0430\u043a\u0440\u044b\u0442\u0438\u044f\n ut.open_add_user_window()\n ut.close_add_user_window()\n\n def test_edit_user_window_content(self, browser):\n \"\"\"\u0422\u0435\u0441\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0433\u043e \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 \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0441\u0442\u044c \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0444\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 Args:\n browser: \u0444\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 ut = UsersTab(browser)\n\n # \u041e\u0442\u043a\u0440\u044b\u0442\u0438\u0435 \u0444\u043e\u0440\u043c\u044b \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435\n user_name, role = ut.open_edit_user_page_by_index(0)\n\n # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0433\u043e \u0444\u043e\u0440\u043c\u044b\n ut.check_edit_user_window_content(user_name, role)\n\n def test_edit_user_window_close_buttons(self, browser):\n \"\"\"\u0422\u0435\u0441\u0442 \u043a\u043d\u043e\u043f\u043e\u043a \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 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\n\n \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0443 \u043a\u043d\u043e\u043f\u043e\u043a \u0437\u0430\u043a\u0440\u044b\u0442\u0438\u044f \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 Args:\n browser: \u0444\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 ut = UsersTab(browser)\n\n # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0437\u0430\u043a\u0440\u044b\u0442\u0438\u044f \u0447\u0435\u0440\u0435\u0437 \u043a\u043d\u043e\u043f\u043a\u0443 \u043d\u0430 \u043f\u0430\u043d\u0435\u043b\u0438 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432\n user_name, role = ut.open_edit_user_page_by_index(0) \n ut.close_edit_user_window_by_toolbar_button(user_name)\n\n # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0437\u0430\u043a\u0440\u044b\u0442\u0438\u044f \u0447\u0435\u0440\u0435\u0437 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u0443\u044e \u043a\u043d\u043e\u043f\u043a\u0443 \u0437\u0430\u043a\u0440\u044b\u0442\u0438\u044f\n user_name, role = 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):\n \"\"\"\u0422\u0435\u0441\u0442 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0438 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\n\n \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043f\u043e\u043b\u043d\u044b\u0439 \u0446\u0438\u043a\u043b \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0438 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\n\n Args:\n browser: \u0444\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 user_data = {\"name\": \"User\", \"role\": \"\u0410\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440\"}\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 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_configuration_navigation_panel_item(\"\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438\")\n mp.click_configuration_navigation_panel_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 # \u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\n ut.open_edit_user_page_by_user(user_data[\"name\"], user_data[\"role\"])\n ut.delete_user(user_data[\"name\"])\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_configuration_navigation_panel_item(\"\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438\")\n mp.click_configuration_navigation_panel_item(\"\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438\")\n\n # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\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_not_be_user_in_table(user_data[\"name\"], user_data[\"role\"])\n\n # @pytest.mark.develop\n def test_reset_password(self, browser):\n \"\"\"\u0422\u0435\u0441\u0442 \u0441\u0431\u0440\u043e\u0441\u0430 \u043f\u0430\u0440\u043e\u043b\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\n\n \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b \u0441\u0431\u0440\u043e\u0441\u0430 \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u043d\u043e\u0432\u043e\u0433\u043e \u043f\u0430\u0440\u043e\u043b\u044f.\n\n Args:\n browser: \u0444\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 user_data = {\"name\": \"autoadmin\", \"role\": \"\u0410\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440\"}\n\n mp = MainPage(browser)\n ut = UsersTab(browser)\n\n # \u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0442\u0435\u0441\u0442\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\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_configuration_navigation_panel_item(\"\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438\")\n mp.click_configuration_navigation_panel_item(\"\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438\")\n\n # \u0421\u0431\u0440\u043e\u0441 \u043f\u0430\u0440\u043e\u043b\u044f\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 # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0432\u0445\u043e\u0434\u0430 \u0441 \u043d\u043e\u0432\u044b\u043c \u043f\u0430\u0440\u043e\u043b\u0435\u043c\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\n # \u0412\u043e\u0437\u0432\u0440\u0430\u0442 \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0443 \u043f\u043e\u0434 \u0430\u0434\u043c\u0438\u043d\u043e\u043c\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_configuration_navigation_panel_item(\"\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438\")\n\n # \u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u0442\u0435\u0441\u0442\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\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\n # \u0424\u0438\u043d\u0430\u043b\u043d\u0430\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430\n mp_1.click_configuration_navigation_panel_item(\"\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438\")\n mp_1.click_configuration_navigation_panel_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 # @pytest.mark.develop\n def test_edit_user_role(self, browser):\n \"\"\"\u0422\u0435\u0441\u0442 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0440\u043e\u043b\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\n\n \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0440\u043e\u043b\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\n\n Args:\n browser: \u0444\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 user_data = {\"name\": \"autooperator\", \"role\": \"\u041e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\"}\n\n mp = MainPage(browser)\n ut = UsersTab(browser)\n\n # \u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0442\u0435\u0441\u0442\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\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_configuration_navigation_panel_item(\"\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438\")\n mp.click_configuration_navigation_panel_item(\"\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438\")\n\n # \u0418\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 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\n # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f\n mp.click_configuration_navigation_panel_item(\"\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438\")\n mp.click_configuration_navigation_panel_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\n # \u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u0442\u0435\u0441\u0442\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\n ut.open_edit_user_page_by_user(user_data[\"name\"], new_user_data[\"role\"])\n ut.delete_user(user_data[\"name\"])\n\n # \u0424\u0438\u043d\u0430\u043b\u044c\u043d\u0430\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430\n mp.click_configuration_navigation_panel_item(\"\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438\")\n mp.click_configuration_navigation_panel_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.setup","title":"<code>setup(browser)</code>","text":"<p>\u041f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0430 \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 \u0432\u0445\u043e\u0434 \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0443 \u0438 \u043f\u0435\u0440\u0435\u0445\u043e\u0434 \u043d\u0430 \u0432\u043a\u043b\u0430\u0434\u043a\u0443 '\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438'.</p> <p>Parameters:</p> Name Type Description Default <code>browser</code> <p>\u0444\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_users_tab.py</code> <pre><code>@pytest.fixture(scope=\"function\", autouse=True)\ndef setup(self, browser):\n \"\"\"\u041f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0430 \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 \u0432\u0445\u043e\u0434 \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0443 \u0438 \u043f\u0435\u0440\u0435\u0445\u043e\u0434 \u043d\u0430 \u0432\u043a\u043b\u0430\u0434\u043a\u0443 '\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438'.\n\n Args:\n browser: \u0444\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 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 \u043a\u043d\u043e\u043f\u043a\u0435 \"\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 \u043a\u043d\u043e\u043f\u043a\u0435 \"\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438\" \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_configuration_navigation_panel_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)</code>","text":"<p>\u0422\u0435\u0441\u0442 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0438 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.</p> <p>\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043f\u043e\u043b\u043d\u044b\u0439 \u0446\u0438\u043a\u043b \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0438 \u0443\u0434\u0430\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> <p>\u0444\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_users_tab.py</code> <pre><code>def test_add_and_delete_user(self, browser):\n \"\"\"\u0422\u0435\u0441\u0442 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0438 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\n\n \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043f\u043e\u043b\u043d\u044b\u0439 \u0446\u0438\u043a\u043b \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0438 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\n\n Args:\n browser: \u0444\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 user_data = {\"name\": \"User\", \"role\": \"\u0410\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440\"}\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 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_configuration_navigation_panel_item(\"\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438\")\n mp.click_configuration_navigation_panel_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 # \u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\n ut.open_edit_user_page_by_user(user_data[\"name\"], user_data[\"role\"])\n ut.delete_user(user_data[\"name\"])\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_configuration_navigation_panel_item(\"\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438\")\n mp.click_configuration_navigation_panel_item(\"\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438\")\n\n # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\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_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>\u0422\u0435\u0441\u0442 \u043a\u043d\u043e\u043f\u043e\u043a \u0437\u0430\u043a\u0440\u044b\u0442\u0438\u044f \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>\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0443 \u043a\u043d\u043e\u043f\u043e\u043a \u0437\u0430\u043a\u0440\u044b\u0442\u0438\u044f \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> <p>Parameters:</p> Name Type Description Default <code>browser</code> <p>\u0444\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_users_tab.py</code> <pre><code>def test_add_user_window_close_buttons(self, browser):\n \"\"\"\u0422\u0435\u0441\u0442 \u043a\u043d\u043e\u043f\u043e\u043a \u0437\u0430\u043a\u0440\u044b\u0442\u0438\u044f \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 \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0443 \u043a\u043d\u043e\u043f\u043e\u043a \u0437\u0430\u043a\u0440\u044b\u0442\u0438\u044f \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 Args:\n browser: \u0444\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 ut = UsersTab(browser)\n\n # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0437\u0430\u043a\u0440\u044b\u0442\u0438\u044f \u0447\u0435\u0440\u0435\u0437 \u043a\u043d\u043e\u043f\u043a\u0443 \u043d\u0430 \u043f\u0430\u043d\u0435\u043b\u0438 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432\n ut.open_add_user_window() \n ut.close_add_user_window_by_toolbar_button()\n\n # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0437\u0430\u043a\u0440\u044b\u0442\u0438\u044f \u0447\u0435\u0440\u0435\u0437 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u0443\u044e \u043a\u043d\u043e\u043f\u043a\u0443 \u0437\u0430\u043a\u0440\u044b\u0442\u0438\u044f\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>\u0422\u0435\u0441\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0433\u043e \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>\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0441\u0442\u044c \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0444\u043e\u0440\u043c\u044b \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>Parameters:</p> Name Type Description Default <code>browser</code> <p>\u0444\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_users_tab.py</code> <pre><code>def test_add_user_window_content(self, browser):\n \"\"\"\u0422\u0435\u0441\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0433\u043e \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 \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0441\u0442\u044c \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0444\u043e\u0440\u043c\u044b \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 Args:\n browser: \u0444\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 ut = UsersTab(browser)\n\n # \u041e\u0442\u043a\u0440\u044b\u0442\u0438\u0435 \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 ut.open_add_user_window()\n\n # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0433\u043e \u0444\u043e\u0440\u043c\u044b\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)</code>","text":"<p>\u0422\u0435\u0441\u0442 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0440\u043e\u043b\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.</p> <p>\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \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> <p>\u0444\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_users_tab.py</code> <pre><code>def test_edit_user_role(self, browser):\n \"\"\"\u0422\u0435\u0441\u0442 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0440\u043e\u043b\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\n\n \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0440\u043e\u043b\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\n\n Args:\n browser: \u0444\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 user_data = {\"name\": \"autooperator\", \"role\": \"\u041e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\"}\n\n mp = MainPage(browser)\n ut = UsersTab(browser)\n\n # \u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0442\u0435\u0441\u0442\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\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_configuration_navigation_panel_item(\"\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438\")\n mp.click_configuration_navigation_panel_item(\"\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438\")\n\n # \u0418\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 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\n # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f\n mp.click_configuration_navigation_panel_item(\"\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438\")\n mp.click_configuration_navigation_panel_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\n # \u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u0442\u0435\u0441\u0442\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\n ut.open_edit_user_page_by_user(user_data[\"name\"], new_user_data[\"role\"])\n ut.delete_user(user_data[\"name\"])\n\n # \u0424\u0438\u043d\u0430\u043b\u044c\u043d\u0430\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430\n mp.click_configuration_navigation_panel_item(\"\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438\")\n mp.click_configuration_navigation_panel_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>\u0422\u0435\u0441\u0442 \u043a\u043d\u043e\u043f\u043e\u043a \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 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.</p> <p>\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0443 \u043a\u043d\u043e\u043f\u043e\u043a \u0437\u0430\u043a\u0440\u044b\u0442\u0438\u044f \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> <p>Parameters:</p> Name Type Description Default <code>browser</code> <p>\u0444\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_users_tab.py</code> <pre><code>def test_edit_user_window_close_buttons(self, browser):\n \"\"\"\u0422\u0435\u0441\u0442 \u043a\u043d\u043e\u043f\u043e\u043a \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 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\n\n \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0443 \u043a\u043d\u043e\u043f\u043e\u043a \u0437\u0430\u043a\u0440\u044b\u0442\u0438\u044f \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 Args:\n browser: \u0444\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 ut = UsersTab(browser)\n\n # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0437\u0430\u043a\u0440\u044b\u0442\u0438\u044f \u0447\u0435\u0440\u0435\u0437 \u043a\u043d\u043e\u043f\u043a\u0443 \u043d\u0430 \u043f\u0430\u043d\u0435\u043b\u0438 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432\n user_name, role = ut.open_edit_user_page_by_index(0) \n ut.close_edit_user_window_by_toolbar_button(user_name)\n\n # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0437\u0430\u043a\u0440\u044b\u0442\u0438\u044f \u0447\u0435\u0440\u0435\u0437 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u0443\u044e \u043a\u043d\u043e\u043f\u043a\u0443 \u0437\u0430\u043a\u0440\u044b\u0442\u0438\u044f\n user_name, role = 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>\u0422\u0435\u0441\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0433\u043e \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>\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0441\u0442\u044c \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0444\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> <p>Parameters:</p> Name Type Description Default <code>browser</code> <p>\u0444\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_users_tab.py</code> <pre><code>def test_edit_user_window_content(self, browser):\n \"\"\"\u0422\u0435\u0441\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0433\u043e \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 \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0441\u0442\u044c \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0444\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 Args:\n browser: \u0444\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 ut = UsersTab(browser)\n\n # \u041e\u0442\u043a\u0440\u044b\u0442\u0438\u0435 \u0444\u043e\u0440\u043c\u044b \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435\n user_name, role = ut.open_edit_user_page_by_index(0)\n\n # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0433\u043e \u0444\u043e\u0440\u043c\u044b\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)</code>","text":"<p>\u0422\u0435\u0441\u0442 \u0441\u0431\u0440\u043e\u0441\u0430 \u043f\u0430\u0440\u043e\u043b\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.</p> <p>\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b \u0441\u0431\u0440\u043e\u0441\u0430 \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u043d\u043e\u0432\u043e\u0433\u043e \u043f\u0430\u0440\u043e\u043b\u044f.</p> <p>Parameters:</p> Name Type Description Default <code>browser</code> <p>\u0444\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_users_tab.py</code> <pre><code>def test_reset_password(self, browser):\n \"\"\"\u0422\u0435\u0441\u0442 \u0441\u0431\u0440\u043e\u0441\u0430 \u043f\u0430\u0440\u043e\u043b\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.\n\n \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b \u0441\u0431\u0440\u043e\u0441\u0430 \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u043d\u043e\u0432\u043e\u0433\u043e \u043f\u0430\u0440\u043e\u043b\u044f.\n\n Args:\n browser: \u0444\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 user_data = {\"name\": \"autoadmin\", \"role\": \"\u0410\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440\"}\n\n mp = MainPage(browser)\n ut = UsersTab(browser)\n\n # \u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0442\u0435\u0441\u0442\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\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_configuration_navigation_panel_item(\"\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438\")\n mp.click_configuration_navigation_panel_item(\"\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438\")\n\n # \u0421\u0431\u0440\u043e\u0441 \u043f\u0430\u0440\u043e\u043b\u044f\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 # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0432\u0445\u043e\u0434\u0430 \u0441 \u043d\u043e\u0432\u044b\u043c \u043f\u0430\u0440\u043e\u043b\u0435\u043c\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\n # \u0412\u043e\u0437\u0432\u0440\u0430\u0442 \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0443 \u043f\u043e\u0434 \u0430\u0434\u043c\u0438\u043d\u043e\u043c\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_configuration_navigation_panel_item(\"\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438\")\n\n # \u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u0442\u0435\u0441\u0442\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\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\n # \u0424\u0438\u043d\u0430\u043b\u043d\u0430\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430\n mp_1.click_configuration_navigation_panel_item(\"\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438\")\n mp_1.click_configuration_navigation_panel_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>\u0422\u0435\u0441\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0433\u043e \u0432\u043a\u043b\u0430\u0434\u043a\u0438 '\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438'.</p> <p>\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0445 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430 \u0438 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0433\u043e \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>browser</code> <p>\u0444\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_users_tab.py</code> <pre><code>def test_users_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 '\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438'.\n\n \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0445 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430 \u0438 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0433\u043e \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439.\n\n Args:\n browser: \u0444\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 # \u0412\u043a\u043b\u0430\u0434\u043a\u0430 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 \u043e\u0442\u043a\u0440\u044b\u0442\u0430\n ut = UsersTab(browser)\n\n # \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043d\u0430\u043b\u0438\u0447\u0438\u044f \u043f\u0430\u043d\u0435\u043b\u0438 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432\n ut.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 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439\n ut.should_be_users_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 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 \u0438 \u0441\u0432\u0435\u0440\u043a\u0430 \u0441 \u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u0438\u0437 \u0411\u0414\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>\u0422\u0435\u0441\u0442 \u043a\u043d\u043e\u043f\u043e\u043a \u043d\u0430 \u043f\u0430\u043d\u0435\u043b\u0438 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432.</p> <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 \u043a\u043d\u043e\u043f\u043e\u043a \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\u043c\u0438.</p> <p>Parameters:</p> Name Type Description Default <code>browser</code> <p>\u0444\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_users_tab.py</code> <pre><code>def test_users_tab_toolbar_buttons(self, browser):\n \"\"\"\u0422\u0435\u0441\u0442 \u043a\u043d\u043e\u043f\u043e\u043a \u043d\u0430 \u043f\u0430\u043d\u0435\u043b\u0438 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432.\n\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 \u043a\u043d\u043e\u043f\u043e\u043a \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\u043c\u0438.\n\n Args:\n browser: \u0444\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 ut = UsersTab(browser)\n ut.should_be_toolbar_buttons()\n</code></pre>"},{"location":"tools/fix_python_project/","title":"Python Project Fixer","text":""},{"location":"tools/fix_python_project/#tools.fix_python_project--python-project-fixer-fix_python_projectpy","title":"Python Project Fixer (fix_python_project.py)","text":"<p>\u0410\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0438\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: 1. \u0423\u0434\u0430\u043b\u044f\u0435\u0442 BOM-\u043c\u0430\u0440\u043a\u0435\u0440\u044b \u0438\u0437 \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u044b\u0445 \u0444\u0430\u0439\u043b\u043e\u0432 (.py, .json, .txt) 2. \u0421\u043e\u0437\u0434\u0430\u0451\u0442 \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u044e\u0449\u0438\u0435 init.py \u0444\u0430\u0439\u043b\u044b (\u0438\u0433\u043d\u043e\u0440\u0438\u0440\u0443\u044f \u0441\u043b\u0443\u0436\u0435\u0431\u043d\u044b\u0435 \u043f\u0430\u043f\u043a\u0438) 3. \u0421\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u0442 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u044b\u0439 \u043b\u043e\u0433 \u0432\u0441\u0435\u0445 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u043d\u044b\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>\u041e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u043a\u043b\u0430\u0441\u0441 \u0434\u043b\u044f \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> \u0410\u0442\u0440\u0438\u0431\u0443\u0442\u044b <p>root_dir (str): \u041a\u043e\u0440\u043d\u0435\u0432\u0430\u044f \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044f \u043f\u0440\u043e\u0435\u043a\u0442\u0430. log (List[str]): \u0421\u043f\u0438\u0441\u043e\u043a \u0437\u0430\u043f\u0438\u0441\u0435\u0439 \u043b\u043e\u0433\u0430 \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 \"\"\"\u041e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u043a\u043b\u0430\u0441\u0441 \u0434\u043b\u044f \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.\n\n \u0410\u0442\u0440\u0438\u0431\u0443\u0442\u044b:\n root_dir (str): \u041a\u043e\u0440\u043d\u0435\u0432\u0430\u044f \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044f \u043f\u0440\u043e\u0435\u043a\u0442\u0430.\n log (List[str]): \u0421\u043f\u0438\u0441\u043e\u043a \u0437\u0430\u043f\u0438\u0441\u0435\u0439 \u043b\u043e\u0433\u0430 \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 (str): \u041a\u043e\u0440\u043d\u0435\u0432\u0430\u044f \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044f \u043f\u0440\u043e\u0435\u043a\u0442\u0430. \u041f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u0442\u0435\u043a\u0443\u0449\u0430\u044f \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044f ('.').\n \"\"\"\n self.root_dir = os.path.abspath(root_dir)\n self.log: List[str] = []\n\n def remove_bom(self, filepath: str) -> bool:\n \"\"\"\u0423\u0434\u0430\u043b\u044f\u0435\u0442 BOM-\u043c\u0430\u0440\u043a\u0435\u0440 \u0438\u0437 \u0444\u0430\u0439\u043b\u0430, \u0435\u0441\u043b\u0438 \u043e\u043d \u043f\u0440\u0438\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442.\n\n \u041e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442 \u0432\u0441\u0435 \u0444\u0430\u0439\u043b\u044b, \u0432\u043a\u043b\u044e\u0447\u0430\u044f \u043d\u0430\u0445\u043e\u0434\u044f\u0449\u0438\u0435\u0441\u044f \u0432 tests/.\n\n Args:\n filepath (str): \u041f\u0443\u0442\u044c \u043a \u0444\u0430\u0439\u043b\u0443 \u0434\u043b\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438.\n\n Returns:\n bool: True, \u0435\u0441\u043b\u0438 BOM \u0431\u044b\u043b \u0443\u0434\u0430\u043b\u0451\u043d, False \u0432 \u043f\u0440\u043e\u0442\u0438\u0432\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435.\n\n Raises:\n Exception: \u0415\u0441\u043b\u0438 \u043f\u0440\u043e\u0438\u0437\u043e\u0448\u043b\u0430 \u043e\u0448\u0438\u0431\u043a\u0430 \u043f\u0440\u0438 \u0447\u0442\u0435\u043d\u0438\u0438/\u0437\u0430\u043f\u0438\u0441\u0438 \u0444\u0430\u0439\u043b\u0430.\n \"\"\"\n try:\n with open(filepath, 'rb') as f:\n content = f.read()\n\n if content.startswith(b'\\xEF\\xBB\\xBF'):\n with open(filepath, 'wb') as f:\n f.write(content[3:])\n self.log.append(f\"REMOVED BOM: {filepath}\")\n return True\n except Exception as e:\n self.log.append(f\"ERROR processing {filepath}: {str(e)}\")\n return False\n\n def should_skip_init(self, dir_path: str) -> bool:\n \"\"\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442, \u043d\u0443\u0436\u043d\u043e \u043b\u0438 \u043f\u0440\u043e\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 __init__.py \u0432 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438.\n\n \u0418\u0433\u043d\u043e\u0440\u0438\u0440\u0443\u0435\u0442 \u0441\u043b\u0443\u0436\u0435\u0431\u043d\u044b\u0435 \u043f\u0430\u043f\u043a\u0438 (tests/, .git/ \u0438 \u0434\u0440.).\n\n Args:\n dir_path (str): \u041f\u0443\u0442\u044c \u043a \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c\u043e\u0439 \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 \u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u043f\u0440\u043e\u043f\u0443\u0441\u0442\u0438\u0442\u044c.\n \"\"\"\n dir_name = os.path.basename(dir_path)\n return (dir_name in INIT_IGNORED_DIRS or \n dir_name.startswith('.'))\n\n def needs_init_py(self, dir_path: str) -> bool:\n \"\"\"\u041e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442, \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u043b\u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 __init__.py \u0432 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438.\n\n Args:\n dir_path (str): \u041f\u0443\u0442\u044c \u043a \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c\u043e\u0439 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438.\n\n Returns:\n bool: True, \u0435\u0441\u043b\u0438 __init__.py \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442, \u043d\u043e \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f.\n \"\"\"\n if self.should_skip_init(dir_path):\n return False\n\n try:\n items = os.listdir(dir_path)\n has_py_files = any(f.endswith('.py') and f != '__init__.py' for f in items)\n has_init = '__init__.py' in items\n return has_py_files and not has_init\n except Exception:\n return False\n\n def create_init_py(self, dir_path: str) -> bool:\n \"\"\"\u0421\u043e\u0437\u0434\u0430\u0451\u0442 \u0444\u0430\u0439\u043b __init__.py \u0432 \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u043e\u0439 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438.\n\n Args:\n dir_path (str): \u041f\u0443\u0442\u044c \u043a \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438 \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f __init__.py.\n\n Returns:\n bool: True, \u0435\u0441\u043b\u0438 \u0444\u0430\u0439\u043b \u0431\u044b\u043b \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u043d.\n\n Raises:\n Exception: \u0415\u0441\u043b\u0438 \u043f\u0440\u043e\u0438\u0437\u043e\u0448\u043b\u0430 \u043e\u0448\u0438\u0431\u043a\u0430 \u043f\u0440\u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0438 \u0444\u0430\u0439\u043b\u0430.\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, \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u044f \u0432\u0441\u0435 \u0438\u0441\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f.\"\"\"\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 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u043d\u044b\u0445 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 \u0432 \u0444\u0430\u0439\u043b.\n\n Args:\n log_file (str): \u0418\u043c\u044f \u0444\u0430\u0439\u043b\u0430 \u0434\u043b\u044f \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u043b\u043e\u0433\u0430. \u041f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e 'project_fix.log'.\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 \u0442\u0435\u043a\u0443\u0449\u0430\u044f \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044f ('.').</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 (str): \u041a\u043e\u0440\u043d\u0435\u0432\u0430\u044f \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044f \u043f\u0440\u043e\u0435\u043a\u0442\u0430. \u041f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u0442\u0435\u043a\u0443\u0449\u0430\u044f \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044f ('.').\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 \u0432 \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u043e\u0439 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438.</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 \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f init.py.</p> required <p>Returns:</p> Name Type Description <code>bool</code> <code>bool</code> <p>True, \u0435\u0441\u043b\u0438 \u0444\u0430\u0439\u043b \u0431\u044b\u043b \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u043d.</p> <p>Raises:</p> Type Description <code>Exception</code> <p>\u0415\u0441\u043b\u0438 \u043f\u0440\u043e\u0438\u0437\u043e\u0448\u043b\u0430 \u043e\u0448\u0438\u0431\u043a\u0430 \u043f\u0440\u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0438 \u0444\u0430\u0439\u043b\u0430.</p> Source code in <code>tools\\fix_python_project.py</code> <pre><code>def create_init_py(self, dir_path: str) -> bool:\n \"\"\"\u0421\u043e\u0437\u0434\u0430\u0451\u0442 \u0444\u0430\u0439\u043b __init__.py \u0432 \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u043e\u0439 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438.\n\n Args:\n dir_path (str): \u041f\u0443\u0442\u044c \u043a \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438 \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f __init__.py.\n\n Returns:\n bool: True, \u0435\u0441\u043b\u0438 \u0444\u0430\u0439\u043b \u0431\u044b\u043b \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u043d.\n\n Raises:\n Exception: \u0415\u0441\u043b\u0438 \u043f\u0440\u043e\u0438\u0437\u043e\u0448\u043b\u0430 \u043e\u0448\u0438\u0431\u043a\u0430 \u043f\u0440\u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0438 \u0444\u0430\u0439\u043b\u0430.\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>\u041e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442, \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u043b\u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 init.py \u0432 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438.</p> <p>Parameters:</p> Name Type Description Default <code>dir_path</code> <code>str</code> <p>\u041f\u0443\u0442\u044c \u043a \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c\u043e\u0439 \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 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442, \u043d\u043e \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) -> bool:\n \"\"\"\u041e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442, \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u043b\u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 __init__.py \u0432 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438.\n\n Args:\n dir_path (str): \u041f\u0443\u0442\u044c \u043a \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c\u043e\u0439 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438.\n\n Returns:\n bool: True, \u0435\u0441\u043b\u0438 __init__.py \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442, \u043d\u043e \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f.\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, \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u044f \u0432\u0441\u0435 \u0438\u0441\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f.</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, \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u044f \u0432\u0441\u0435 \u0438\u0441\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f.\"\"\"\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, \u0435\u0441\u043b\u0438 \u043e\u043d \u043f\u0440\u0438\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442.</p> <p>\u041e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442 \u0432\u0441\u0435 \u0444\u0430\u0439\u043b\u044b, \u0432\u043a\u043b\u044e\u0447\u0430\u044f \u043d\u0430\u0445\u043e\u0434\u044f\u0449\u0438\u0435\u0441\u044f \u0432 tests/.</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 \u0434\u043b\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438.</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, False \u0432 \u043f\u0440\u043e\u0442\u0438\u0432\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435.</p> <p>Raises:</p> Type Description <code>Exception</code> <p>\u0415\u0441\u043b\u0438 \u043f\u0440\u043e\u0438\u0437\u043e\u0448\u043b\u0430 \u043e\u0448\u0438\u0431\u043a\u0430 \u043f\u0440\u0438 \u0447\u0442\u0435\u043d\u0438\u0438/\u0437\u0430\u043f\u0438\u0441\u0438 \u0444\u0430\u0439\u043b\u0430.</p> Source code in <code>tools\\fix_python_project.py</code> <pre><code>def remove_bom(self, filepath: str) -> bool:\n \"\"\"\u0423\u0434\u0430\u043b\u044f\u0435\u0442 BOM-\u043c\u0430\u0440\u043a\u0435\u0440 \u0438\u0437 \u0444\u0430\u0439\u043b\u0430, \u0435\u0441\u043b\u0438 \u043e\u043d \u043f\u0440\u0438\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442.\n\n \u041e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442 \u0432\u0441\u0435 \u0444\u0430\u0439\u043b\u044b, \u0432\u043a\u043b\u044e\u0447\u0430\u044f \u043d\u0430\u0445\u043e\u0434\u044f\u0449\u0438\u0435\u0441\u044f \u0432 tests/.\n\n Args:\n filepath (str): \u041f\u0443\u0442\u044c \u043a \u0444\u0430\u0439\u043b\u0443 \u0434\u043b\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438.\n\n Returns:\n bool: True, \u0435\u0441\u043b\u0438 BOM \u0431\u044b\u043b \u0443\u0434\u0430\u043b\u0451\u043d, False \u0432 \u043f\u0440\u043e\u0442\u0438\u0432\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435.\n\n Raises:\n Exception: \u0415\u0441\u043b\u0438 \u043f\u0440\u043e\u0438\u0437\u043e\u0448\u043b\u0430 \u043e\u0448\u0438\u0431\u043a\u0430 \u043f\u0440\u0438 \u0447\u0442\u0435\u043d\u0438\u0438/\u0437\u0430\u043f\u0438\u0441\u0438 \u0444\u0430\u0439\u043b\u0430.\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 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u043d\u044b\u0445 \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 \u0434\u043b\u044f \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \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 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u043d\u044b\u0445 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 \u0432 \u0444\u0430\u0439\u043b.\n\n Args:\n log_file (str): \u0418\u043c\u044f \u0444\u0430\u0439\u043b\u0430 \u0434\u043b\u044f \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u043b\u043e\u0433\u0430. \u041f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e 'project_fix.log'.\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 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 init.py \u0432 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438.</p> <p>\u0418\u0433\u043d\u043e\u0440\u0438\u0440\u0443\u0435\u0442 \u0441\u043b\u0443\u0436\u0435\u0431\u043d\u044b\u0435 \u043f\u0430\u043f\u043a\u0438 (tests/, .git/ \u0438 \u0434\u0440.).</p> <p>Parameters:</p> Name Type Description Default <code>dir_path</code> <code>str</code> <p>\u041f\u0443\u0442\u044c \u043a \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c\u043e\u0439 \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 \u0441\u043b\u0435\u0434\u0443\u0435\u0442 \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) -> 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 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 __init__.py \u0432 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438.\n\n \u0418\u0433\u043d\u043e\u0440\u0438\u0440\u0443\u0435\u0442 \u0441\u043b\u0443\u0436\u0435\u0431\u043d\u044b\u0435 \u043f\u0430\u043f\u043a\u0438 (tests/, .git/ \u0438 \u0434\u0440.).\n\n Args:\n dir_path (str): \u041f\u0443\u0442\u044c \u043a \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c\u043e\u0439 \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 \u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u043f\u0440\u043e\u043f\u0443\u0441\u0442\u0438\u0442\u044c.\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 \u0434\u043b\u044f \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0438 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u043b\u043e\u0433\u0433\u0435\u0440\u0430.</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 \u0441 \u0437\u0430\u0434\u0430\u043d\u043d\u044b\u043c \u0438\u043c\u0435\u043d\u0435\u043c.</p> <p>\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u043b\u043e\u0433\u0433\u0435\u0440\u0430: - \u0423\u0440\u043e\u0432\u0435\u043d\u044c \u043b\u043e\u0433\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f: DEBUG - \u0424\u043e\u0440\u043c\u0430\u0442 \u0432\u044b\u0432\u043e\u0434\u0430: \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 - \u0412\u044b\u0432\u043e\u0434: \u0432 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0439 \u043f\u043e\u0442\u043e\u043a (stdout)</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. \u041e\u0431\u044b\u0447\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f 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 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f <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) -> 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 \u0441 \u0437\u0430\u0434\u0430\u043d\u043d\u044b\u043c \u0438\u043c\u0435\u043d\u0435\u043c.\n\n \u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u043b\u043e\u0433\u0433\u0435\u0440\u0430:\n - \u0423\u0440\u043e\u0432\u0435\u043d\u044c \u043b\u043e\u0433\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f: DEBUG\n - \u0424\u043e\u0440\u043c\u0430\u0442 \u0432\u044b\u0432\u043e\u0434\u0430: \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 - \u0412\u044b\u0432\u043e\u0434: \u0432 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0439 \u043f\u043e\u0442\u043e\u043a (stdout)\n\n Args:\n name (str): \u0418\u043c\u044f \u043b\u043e\u0433\u0433\u0435\u0440\u0430. \u041e\u0431\u044b\u0447\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f __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 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f:\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 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>"}]} |