From 8f5aa882b556da337f38b5e39ba0d57864ddc57d Mon Sep 17 00:00:00 2001 From: Radislav Date: Thu, 11 Sep 2025 15:01:09 +0300 Subject: [PATCH] =?UTF-8?q?=D0=9F=D0=B5=D1=80=D0=B5=D0=B8=D0=BC=D0=B5?= =?UTF-8?q?=D0=BD=D0=BE=D0=B2=D0=B0=D0=BD=D0=BE=20check=5Ftoolbar=5Fbutton?= =?UTF-8?q?=5Fpresence=20=D0=B2=20chek=5Ftoolbar=5Fbutton=5Fvisibility.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- changelog.txt | 15 -- components/base_component.py | 4 +- components/confirm_component.py | 4 +- components/modal_window_component.py | 8 +- components/navbar_component.py | 2 +- components/toolbar_component.py | 4 +- components/Реестр_изменений_companents.txt | 113 --------------- data/environment.py | 4 +- data/Реестр_изменений_data.txt | 33 ----- elements/base_element.py | 2 +- elements/button_element.py | 2 +- elements/Реестр_изменений_elements.txt | 102 ------------- fixtures/pages.py | 4 +- fixtures/Реестр_изменений_fixtures.txt | 12 -- locators/Реестр_изменений_locators.txt | 136 ------------------ modal_windows/modal_add_AD_user.py | 26 ++-- modal_windows/modal_add_local_user.py | 11 +- modal_windows/modal_edit_user.py | 12 +- .../Реестр_изменений_modal_windows.txt | 39 ----- pages/base_page.py | 116 +++++++++++---- pages/license_tab.py | 2 +- pages/main_page.py | 4 +- pages/service_status_tab.py | 3 +- pages/session_tab.py | 5 +- pages/users_tab.py | 16 +-- pages/Реестр_изменений_pages.txt | 108 -------------- tests/components/test_user_modal_window.py | 8 +- .../Реестр_изменений_tests_componets.txt | 52 ------- ...igation_panel.cpython-313-pytest-8.4.1.pyc | Bin 3177 -> 0 bytes ...t_license_tab.cpython-313-pytest-8.4.1.pyc | Bin 4577 -> 0 bytes .../test_login.cpython-313-pytest-8.4.1.pyc | Bin 2455 -> 0 bytes ...ce_status_tab.cpython-313-pytest-8.4.1.pyc | Bin 3707 -> 0 bytes ..._sessions_tab.cpython-313-pytest-8.4.1.pyc | Bin 25319 -> 0 bytes ...est_users_tab.cpython-313-pytest-8.4.1.pyc | Bin 13871 -> 0 bytes tools/Реестр_изменений_tools.txt | 9 -- 35 files changed, 152 insertions(+), 704 deletions(-) delete mode 100644 changelog.txt delete mode 100644 components/Реестр_изменений_companents.txt delete mode 100644 data/Реестр_изменений_data.txt delete mode 100644 elements/Реестр_изменений_elements.txt delete mode 100644 fixtures/Реестр_изменений_fixtures.txt delete mode 100644 locators/Реестр_изменений_locators.txt delete mode 100644 modal_windows/Реестр_изменений_modal_windows.txt delete mode 100644 pages/Реестр_изменений_pages.txt delete mode 100644 tests/components/Реестр_изменений_tests_componets.txt delete mode 100644 tests/e2e/__pycache__/test_expand_navigation_panel.cpython-313-pytest-8.4.1.pyc delete mode 100644 tests/e2e/__pycache__/test_license_tab.cpython-313-pytest-8.4.1.pyc delete mode 100644 tests/e2e/__pycache__/test_login.cpython-313-pytest-8.4.1.pyc delete mode 100644 tests/e2e/__pycache__/test_service_status_tab.cpython-313-pytest-8.4.1.pyc delete mode 100644 tests/e2e/__pycache__/test_sessions_tab.cpython-313-pytest-8.4.1.pyc delete mode 100644 tests/e2e/__pycache__/test_users_tab.cpython-313-pytest-8.4.1.pyc delete mode 100644 tools/Реестр_изменений_tools.txt diff --git a/changelog.txt b/changelog.txt deleted file mode 100644 index b7a0781..0000000 --- a/changelog.txt +++ /dev/null @@ -1,15 +0,0 @@ -====== V3 ========= -- pages\service_status_tab.py: Добавлено получение количества строк в таблице - get_rows_count(self) -- tests\e2e\test_service_status_tab.py: Добавлен тест проверки подсветки строк в таблице при наведении на них курсора - test_service_status_table_row_highlighting(self, browser) -- data\roles_dict.py: Добавлена роль "user" -- elements\toolbar_button_element.py переименован в tooltip_button_elememt.py, класс ToolbarButton стал TooltipButton, в сигнатуру функции check_tooltip_with_text добавился аргумент -tooltiplocator -- components\toolbar_component.py - добавлен tooltiplocator в сигнатуру функции check_button_tooltip, изменены функции add_button и get_button_by_name -- pages\users_tab.py - переписана функция should_be_toolbar_buttons -- pages\session_tab.py - вкладка "Сессии" -- tests\e2e\test_sessions_tab.py - тест вкладки "Сессии" -===================23.07.2025========================== -- Все файлы прошли проверку pylint, внесены исправления для фикса замечаний линтера -- Возвращено заведение пользователя с введением пароля -- Актуализированы тесты под текущее состояние интерфейса пользователя версии 1.7 - \ No newline at end of file diff --git a/components/base_component.py b/components/base_component.py index 614f428..8855159 100644 --- a/components/base_component.py +++ b/components/base_component.py @@ -59,7 +59,7 @@ class BaseComponent: # return elements # Проверки: - def check_presence(self, locator: str | Locator, msg: str) -> None: + def check_visibility(self, locator: str | Locator, msg: str) -> None: """Проверка видимости элемента на странице. Args: @@ -168,7 +168,7 @@ class BaseComponent: loc = self.get_locator(locator) - loc.evaluate("el => el.scrollBy(el.scrollWidth, 0)") + loc.evaluate("el => el.scrollBy(el.scrollWidth, 0)") loc.wait_for(timeout=2000) diff --git a/components/confirm_component.py b/components/confirm_component.py index ba2f462..5ee0e37 100644 --- a/components/confirm_component.py +++ b/components/confirm_component.py @@ -97,11 +97,11 @@ class ConfirmComponent(BaseComponent): def should_be_cancel_button(self) -> None: """Проверяет наличие и видимость кнопки Отмены.""" - self.cancel_button.check_presence("Cancel button is missing") + self.cancel_button.check_visibility("Cancel button is missing") def should_be_allow_button(self) -> None: """Проверяет наличие и видимость кнопки Подтверждения.""" - self.allow_button.check_presence("Allow button is missing") + self.allow_button.check_visibility("Allow button is missing") def check_cancel_button_text(self, expected_text: str) -> None: """Проверяет текст кнопки Отмены.""" diff --git a/components/modal_window_component.py b/components/modal_window_component.py index f78fff1..0929ba0 100644 --- a/components/modal_window_component.py +++ b/components/modal_window_component.py @@ -104,18 +104,18 @@ class ModalWindowComponent(BaseComponent): self.toolbar.check_toolbar_presence(f"Modal window with '{self.toolbar.title}' is missing") - def check_button_presence(self, name: str) -> None: + def check_button_visibility(self, name: str) -> None: """Проверяет наличие кнопки по имени. Вызывает ошибку, если не найдена.""" button = self.get_button_by_name(name) if button is None: assert False, f"Button with name '{name}' not found" - button.check_presence(f"Button with name '{name}' is missing") + button.check_visibility(f"Button with name '{name}' is missing") - def check_toolbar_button_presence(self, name: str) -> None: + def check_toolbar_button_visibility(self, name: str) -> None: """Проверяет наличие кнопки в панели инструментов.""" - self.toolbar.check_button_presence(name) + self.toolbar.check_button_visibility(name) def check_toolbar_button_tooltip(self, name: str, tooltip: str) -> None: """Проверяет подсказку у кнопки в панели инструментов.""" diff --git a/components/navbar_component.py b/components/navbar_component.py index 43ad6e4..1add89b 100644 --- a/components/navbar_component.py +++ b/components/navbar_component.py @@ -207,4 +207,4 @@ class NavigationPanelComponent(BaseComponent): loc = loc.get_by_text("Шаблоны").nth(1) else: loc = loc.get_by_text(item_name) - self.check_presence(loc, msg) + self.check_visibility(loc, msg) diff --git a/components/toolbar_component.py b/components/toolbar_component.py index dc0e4bd..847ff64 100644 --- a/components/toolbar_component.py +++ b/components/toolbar_component.py @@ -125,7 +125,7 @@ class ToolbarComponent(BaseComponent): locator = self.get_locator(ToolbarLocators.TITLE).filter(has_text=self.title) expect(locator).to_be_visible(), message - def check_button_presence(self, name: str) -> None: + def check_button_visibility(self, name: str) -> None: """Проверяет наличие и видимость кнопки с предварительной прокруткой к элементу. Args: @@ -141,7 +141,7 @@ class ToolbarComponent(BaseComponent): raise AssertionError(f"Unsupported button name {name}") button.locator.scroll_into_view_if_needed() - button.check_presence(f"Button with name {name} is missing") + button.check_visibility(f"Button with name {name} is missing") def check_button_tooltip(self, name: str, tooltip: str) -> None: """Проверяет текст подсказки кнопки. diff --git a/components/Реестр_изменений_companents.txt b/components/Реестр_изменений_companents.txt deleted file mode 100644 index 63a190a..0000000 --- a/components/Реестр_изменений_companents.txt +++ /dev/null @@ -1,113 +0,0 @@ -components - -alert_component.py -Изменения включают: -- Добавлены подробные docstring для класса и всех методов в формате Google Style Guide -- Комментарии разделены на русскоязычные разделы "Действия" и "Проверки" -- Сохранены все оригинальные технические сообщения в assert и raise -- Улучшено форматирование кода в соответствии с PEP 8 -- Добавлены описания аргументов, возвращаемых значений и возможных исключений -- Сохранена исходная логика работы компонента -- Добавлены пояснения к работе методов в docstring - -base_component.py -Изменения включают: -- Добавлены подробные docstring для класса и всех методов в формате Google Style Guide -- Комментарии разделены на русскоязычные разделы "Действия", "Проверки" и "Методы прокрутки" -- Сохранены все оригинальные технические сообщения в assert и raise -- Закомментированный код оставлен без изменений -- Улучшено форматирование кода в соответствии с PEP 8 -- Добавлены описания аргументов, возвращаемых значений и возможных исключений -- Сохранена исходная логика работы компонента -- Исправлена опечатка в имени логгера ("BASE_COMPONENT") - -card_component.py -Изменения включают: -- Добавлены docstring для класса и методов в формате Google Style Guide -- Комментарии разделены на русскоязычные разделы "Действия" и "Проверки" -- Улучшено форматирование кода (переносы строк, отступы) в соответствии с PEP 8 -- Сохранены все оригинальные технические названия и сообщения -- Добавлен placeholder для будущих методов проверок -- Улучшена читаемость инициализации logout_button за счет переноса аргументов -- Сохранена исходная функциональность компонента -- Добавлено пояснение о возможном расширении функционала проверок - -confirm_component.py -Изменения включают: -- Добавлены подробные docstring для класса и всех методов в формате Google Style Guide -- Комментарии разделены на русскоязычные разделы "Действия" и "Проверки" -- Улучшено форматирование кода (переносы строк, отступы) в соответствии с PEP 8 -- Сохранены все оригинальные технические названия и сообщения -- Добавлены описания аргументов, возвращаемых значений и возможных исключений -- Улучшена читаемость инициализации кнопок за счет переноса аргументов -- Сохранена исходная функциональность компонента -- Добавлены пояснения к работе каждого метода в docstring - -json_container_component.py -Изменения включают: -- Добавлены подробные docstring для класса и всех методов в формате Google Style Guide -- Вложенная функция format_json_string также получила свой docstring -- Комментарии разделены на русскоязычные разделы "Действия" и "Проверки" -- Улучшено форматирование кода (отступы, пробелы вокруг операторов) в соответствии с PEP 8 -- Сохранены все оригинальные технические сообщения в assert и raise -- Добавлены описания аргументов, возвращаемых значений и возможных исключений -- Исправлена опечатка в имени логгера ("JSON_CONTAINER") -- Улучшена читаемость кода за счет более последовательного форматирования -- Сохранена исходная логика работы компонента -- Добавлены пояснения к работе каждого метода в docstring - -modal_window_component.py -Изменения включают: -- Исправлено имя логгера на "MODAL_WINDOW" -- Добавлены полные docstring для всех методов в Google-формате -- Улучшено форматирование кода (отступы, переносы строк) -- Сохранены все оригинальные assert-сообщения -- Добавлены типы возвращаемых значений и описания исключений -- Комментарии разделены на "Действия" и "Проверки" -- Исправлены опечатки в именах локаторов (MODAL_WINDOW) -- Улучшена читаемость кода за счет последовательного форматирования -- Сохранена вся исходная функциональность -- обавлены пояснения к работе каждого метода - -navbar_component.py -Изменения включают: -- Добавлены docstring для класса и всех методов в Google-формате на русском языке -- Разделительные комментарии переведены (#actions: → # Действия:, # assertions: → # Проверки:) -- Сохранены все технические сообщения (в raise и логах) без изменений -- Сохранена исходная структура кода и рабочая логика -- Обеспечено соответствие PEP 8 (отступы, пробелы) - -table_component.py -Изменения включают: -- Добавлены docstring для класса и всех методов в Google-формате на русском языке -- Разделительные комментарии переведены (#actions: → # Действия:, # assertions: → # Проверки:) -- Технические комментарии в методах переведены на русский -- Сохранены все технические сообщения (в assert, expect и логах) без изменений -- Сохранена исходная структура кода и рабочая логика -- Обеспечено соответствие PEP 8 (отступы, пробелы) - -toolbar_component.py -Изменения включают: -- Полная документация: - Добавлены docstring для класса и всех методов - Указаны типы аргументов и возвращаемых значений - Описаны возможные исключения - Добавлены пояснения к важным параметрам -- Оптимизированное форматирование: - Соблюдение PEP 8 (отступы, длина строк, пробелы) - Логическая группировка методов - Улучшенные переносы длинных строк -- Улучшенная читаемость: - Последовательные именования переменных - Четкое разделение блоков - Единый стиль оформления -- Соответствие требованиям: - PEP 8 - Google Python Style Guide - Требованиям из README_форматирование_кода.md -- Дополнительные улучшения: - Более информативные сообщения об ошибках - Явное указание timeout для методов ожидания - Использование raise вместо assert для ошибок - Улучшенные названия переменных - diff --git a/data/environment.py b/data/environment.py index edc6f16..ddcecf6 100644 --- a/data/environment.py +++ b/data/environment.py @@ -46,13 +46,13 @@ class Environment: return self.URLS[self.env] + "e-nms-ui/" return self.URLS[self.env] raise Exception(f"Unknown value of ENV variable {self.env}") - + def get_env_name(self) -> str: """Возвращает имя текущего окружения. Возвращает: str: имя текущего окружения. - """ + """ return self.env def get_request_url(self) -> str: diff --git a/data/Реестр_изменений_data.txt b/data/Реестр_изменений_data.txt deleted file mode 100644 index e10aaf0..0000000 --- a/data/Реестр_изменений_data.txt +++ /dev/null @@ -1,33 +0,0 @@ -data - -constants.py -Изменения включают: -- Добавлен docstring для класса в Google-формате на русском языке -- Добавлено описание атрибутов класса -- Сохранена оригинальная логика работы и сообщения об ошибках -- Добавлены пробелы вокруг операторов и между классами/функциями (PEP 8) -- Сохранены все технические сообщения без перевода -- Улучшено форматирование кода (отступы, переносы строк) - -environment.py -Изменения включают: -- Добавлены docstring для класса и всех методов в Google-формате -- Описаны все атрибуты класса -- Сохранена оригинальная логика работы -- Улучшено форматирование (отступы, пробелы, переносы строк) -- Сохранены все технические сообщения без перевода -- Упрощены некоторые условные конструкции -- Добавлены описания возвращаемых значений и возможных исключений -- Сохранена инициализация host в конце файла - -roles_dict.py -Изменения включают: -- Добавлен комментарий, поясняющий назначение словаря -- Выровнены отступы и форматирование словаря: - Каждая пара ключ-значение на отдельной строке - Единообразные отступы - Пробелы после двоеточий -- Улучшена читаемость за счет: - Логического расположения элементов - Последовательного форматирования - Сохранена оригинальная функциональность без изменений \ No newline at end of file diff --git a/elements/base_element.py b/elements/base_element.py index c71fa1f..fe0b504 100644 --- a/elements/base_element.py +++ b/elements/base_element.py @@ -74,7 +74,7 @@ class BaseElement: logger.info(f"Check that {self.type_of} '{self.name}' has text '{text}'") expect(self.locator).to_have_text(text), msg - def check_presence(self, msg: str) -> None: + def check_visibility(self, msg: str) -> None: """Проверяет видимость элемента на странице.""" logger.info(f"Check that {self.type_of} '{self.name}' is present") diff --git a/elements/button_element.py b/elements/button_element.py index 8569d1b..71d5867 100644 --- a/elements/button_element.py +++ b/elements/button_element.py @@ -27,7 +27,7 @@ class Button(BaseElement): return "button" - # Действия: + # Действия: # (Методы действий будут добавлены по мере необходимости) # Проверки: diff --git a/elements/Реестр_изменений_elements.txt b/elements/Реестр_изменений_elements.txt deleted file mode 100644 index 286eb86..0000000 --- a/elements/Реестр_изменений_elements.txt +++ /dev/null @@ -1,102 +0,0 @@ -elements - -base_element.py -Изменения включают: -- Добавлены docstring для класса и всех методов в Google-формате на русском языке -- Разделительные комментарии переведены на русский (# Действия:, # Проверки:) -- Сохранены все технические комментарии и сообщения в логах без изменений -- Сохранена исходная структура кода и рабочая логика -- Соблюдены требования PEP 8 к форматированию кода - -button_element.py -Изменения включают: -- Добавлены docstring для класса и метода type_of в Google-формате на русском языке -- Разделительные комментарии переведены на русский (# Действия:, # Проверки:) -- Добавлены поясняющие комментарии в разделах действий и проверок -- Сохранена исходная структура кода и рабочая логика -- Улучшено форматирование в соответствии с PEP 8: - Единообразные отступы - Пробелы вокруг операторов - Пустые строки между логическими блоками -- Сохранены все технические аспекты без изменений - -checkbox_element.py -Изменения включают: -- Добавлены docstring для класса и всех методов в Google-формате на русском языке -- Разделительные комментарии переведены на русский (# Действия:, # Проверки:) -- Добавлено логирование операций с чекбоксом -- Указаны типы возвращаемых значений для методов -- Сохранена исходная структура кода и рабочая логика -- Улучшено форматирование в соответствии с PEP 8: - Единообразные отступы - Пробелы вокруг операторов - Пустые строки между логическими блоками -- Сохранены все технические аспекты без изменений - -dropdown_list_element.py -Изменения включают: -- Добавлены полные docstring для класса и всех методов в Google-формате -- Указаны типы аргументов и возвращаемых значений -- Переведены разделительные комментарии -- Добавлено логирование всех операций -- Улучшено сообщение об ошибке в assert -- Удален неиспользуемый импорт re -- Сохранена рабочая логика -- Приведено к соответствию с PEP 8: - Правильные отступы - Пробелы вокруг операторов - Логические блоки разделены пустыми строками -- Улучшена структура кода и читаемость - -text_element.py -Изменения включают: -- Добавлены docstring для класса и метода type_of в Google-формате на русском языке -- Разделительные комментарии переведены на русский (# Действия:, # Проверки:) -- Добавлены поясняющие комментарии в разделах действий и проверок -- Сохранена исходная структура кода и рабочая логика -- Улучшено форматирование в соответствии с PEP 8: - Единообразные отступы - Пробелы вокруг операторов - Пустые строки между логическими блоками -- Упорядочены импорты (стандартные, сторонние, локальные) -- Сохранены все технические аспекты без изменений - -text_input_element.py -Изменения включают: -- Добавлены полные docstring для класса и всех методов -- Указаны типы аргументов и возвращаемых значений -- Переведены разделительные комментарии -- Добавлено логирование всех операций -- Исправлена опечатка в методе get_input_value (было self.locator, стало self.locator) -- Улучшено форматирование в соответствии с PEP 8 -- Сохранена вся исходная функциональность -- Упорядочены импорты -- Добавлены комментарии к исключениям в документации -- Улучшена читаемость кода за счет: - Последовательного стиля - Логического разделения блоков - Единообразного именования - -tooltip_button_element.py -Изменения включают: -- Добавлена документация: - Docstring класса с описанием назначения - Документация для всех методов - Описание аргументов и возвращаемых значений -- Улучшено форматирование: - Соблюдение PEP 8 (отступы, пробелы) - Логическое разделение блоков кода - Четкие комментарии к действиям -- Улучшена читаемость: - Более информативные имена переменных - Подробное сообщение об ошибке - Логическая структура метода проверки -- Соответствие требованиям: - Полное соответствие Google Python Style Guide - Соответствие PEP 8 - Учет рекомендаций из README_форматирование_кода.md -- Дополнительные улучшения: - Более информативное сообщение об ошибке - Разделение логики на четкие этапы - Типизация аргументов методов - diff --git a/fixtures/pages.py b/fixtures/pages.py index 37ff8be..b90a6b1 100644 --- a/fixtures/pages.py +++ b/fixtures/pages.py @@ -30,7 +30,7 @@ def pytest_addoption(parser: Parser): help="Choose browser: chrome, remote_chrome or firefox") parser.addoption('--h', action='store', default=False, help='Choose headless: True or False') - parser.addoption('--s', action='store', default="{'width': 1600, 'height': 900}", + parser.addoption('--s', action='store', default="{'width': 1920, 'height': 400}", help='Size window: width,height') # Закомментированные альтернативные размеры окон # parser.addoption('--s', action='store', default="{'width': 1920, 'height': 1080}", @@ -161,7 +161,7 @@ def get_context(browser: Browser, request: FixtureRequest, start: str) -> Browse if start == 'local': # current_viewport = json.loads(request.config.getoption('--s')) - + context = browser.new_context( # no_viewport=True, viewport= ast.literal_eval(request.config.getoption('--s')), diff --git a/fixtures/Реестр_изменений_fixtures.txt b/fixtures/Реестр_изменений_fixtures.txt deleted file mode 100644 index b45a0d1..0000000 --- a/fixtures/Реестр_изменений_fixtures.txt +++ /dev/null @@ -1,12 +0,0 @@ -fixtures - -pages.py -Изменения включают: -- Добавлен модульный docstring с описанием назначения модуля -- Добавлены подробные docstrings для всех функций в Google-стиле -- Сохранены все технические комментарии без изменений -- Добавлены пояснения к закомментированному коду -- Улучшено форматирование кода в соответствии с PEP 8 -- Добавлены описания аргументов, возвращаемых значений и заметки для функций -- Сохранена оригинальная логика без изменений -- Добавлены разделительные пустые строки между функциями для лучшей читаемости \ No newline at end of file diff --git a/locators/Реестр_изменений_locators.txt b/locators/Реестр_изменений_locators.txt deleted file mode 100644 index 8df4ea0..0000000 --- a/locators/Реестр_изменений_locators.txt +++ /dev/null @@ -1,136 +0,0 @@ -locators - -confirm_locators.py -Изменения включают: -- Добавлен подробный docstring класса в формате Google Style Guide на русском языке -- Описаны все атрибуты класса с пояснениями -- Сохранена оригинальная структура кода и рабочая логика -- Соблюдены требования PEP 8: - Отступы и пробелы - Пустые строки между блоками - Форматирование f-строки -- Комментарии не требовались, так как их не было в исходном файле - -event_panel_locators.py -Изменения включают: -- Добавлен docstring класса в формате Google Style Guide на русском языке -- Подробно описан атрибут BUTTONS_BLOCK с уточнением его расположения -- Сохранена оригинальная структура кода и рабочая логика -- Соблюдены требования PEP 8: - Отступы и пробелы - Длина строки не превышает 79 символов - Форматирование строки локатора - -input_locators.py -Изменения включают: -- Добавлен подробный docstring класса в формате Google Style Guide на русском языке -- Детально описан атрибут LICENSE_ID_UPDATE с разбором структуры XPath -- Сохранена оригинальная структура кода без изменения логики -- Соблюдены требования PEP 8: - Отступы и пробелы - Перенос длинного описания атрибута - Четкое форматирование строки локатора - -json_container_locators.py -Изменения включают: -- Добавлен полный docstring класса в Google-формате на русском языке -- Каждый атрибут получил: - Четкое описание назначения - Пояснение логики работы XPath (использование contains) -- Сохранена оригинальная структура и функциональность кода -- Соблюдены стандарты PEP 8: - Единообразные кавычки - Правильные отступы - Отсутствие лишних пробелов -- Улучшена читаемость за счет: - Логического разделения атрибутов - Подробных, но лаконичных описаний - Соответствия максимальной длине строки - -modal_window_locators.py -Изменения включают: -- Добавлен полный docstring класса с описанием всех атрибутов -- Устранены проблемы с форматированием: - Удалены лишние пробелы вокруг '=' в XPath - Приведены к единому формату строки локаторов -- Логически сгруппированы связанные элементы (форма и её поля) -- Сохранена оригинальная функциональность без изменений логики -- Улучшена читаемость за счет: - Четких описаний каждого локатора - Правильных переносов длинных описаний - Последовательного форматирования - -navigation_panel_locators.py -Изменения включают: -- Добавлен подробный docstring класса в формате Google Style Guide -- Каждый атрибут содержит: - Четкое описание назначения - Пояснение логики работы XPath - Указание типа искомого элемента -- Сохранена оригинальная группировка связанных элементов -- Соблюдены требования PEP 8: - Единообразное форматирование строк - Правильные отступы -Отсутствие лишних пробелов -- Улучшена читаемость за счет: - Логической структуры описаний - Использования терминологии компонентов (панель, узел) - Последовательного стиля документации - -table_locators.py -Изменения включают: -- Добавлен детальный docstring класса в Google-формате: -- Общее описание назначения класса -- Подробное описание каждого атрибута -- Указание полного пути для сложных локаторов -- Улучшена читаемость кода: - Четкое форматирование XPath выражений - Логическое структурирование документации - Использование терминов, соответствующих элементам интерфейса -- Полное соответствие требованиям: - PEP 8 (длина строк, отступы, форматирование) - Google Python Style Guide (стиль документации) - Указаний из README (перевод на русский, сохранение структуры) -- Особенности: - Подробное описание сложных XPath путей - Указание точного расположения элементов в DOM - Четкое разделение разных типов табличных контейнеров - -text_locators.py -Изменения включают: -- Добавлен полный docstring класса в Google-формате: - Общее описание назначения класса - Подробные описания каждого локатора - Указание особенностей элементов (выделяемый текст) -- Оптимизировано оформление кода: - Четкое разделение документации и кода - Единообразное форматирование XPath - Соответствие PEP 8 (длина строк, отступы) -- Улучшена информативность: - Указание типа элемента (span) - Описание классов CSS и их назначения - Четкое различие между похожими локаторами -- Полное соответствие требованиям: - Google Python Style Guide для docstring - PEP 8 для форматирования кода - Правилам из README (русский язык, сохранение логики) - -toolbar_locators.py -Изменения включают: -- Полноценный docstring класса: - Четкое описание назначения класса - Детальное описание каждого атрибута - Разбор составных частей классов CSS -- Оптимизация структуры: - Логические блоки с пояснениями - Группировка связанной информации - Четкое разделение атрибутов -- Стилевые улучшения: - Единообразное форматирование XPath - Соответствие PEP 8 (79 символов в строке) - Правильные отступы и выравнивание -- Особенности документации: - Указание родительского элемента (nav) - Разбор составных классов CSS - Описание состояний элементов (активное) - diff --git a/modal_windows/modal_add_AD_user.py b/modal_windows/modal_add_AD_user.py index b1343f5..b614a3b 100644 --- a/modal_windows/modal_add_AD_user.py +++ b/modal_windows/modal_add_AD_user.py @@ -277,7 +277,7 @@ class AddADUserModalWindow(ModalWindowComponent): assert False, \ "The checkbox 'Active Directory'should be checked for the add user from Active Directory window" - self.check_toolbar_button_presence("close") + self.check_toolbar_button_visibility("close") self.check_toolbar_button_tooltip("close", "Закрыть") no_op_names = ["roles_list", "group_list"] @@ -298,7 +298,7 @@ class AddADUserModalWindow(ModalWindowComponent): elif name == "group_input": item.click() group_list = self.get_content_item("group_list") - group_list.check_presence(menu_locator, + group_list.check_visibility(menu_locator, "Groups list is missing") is_scrollable_vertically = group_list.check_vertical_scrolling(menu_locator) @@ -307,7 +307,7 @@ class AddADUserModalWindow(ModalWindowComponent): elif name == "role_input": item.click() roles_list = self.get_content_item("roles_list") - roles_list.check_presence(menu_locator, + roles_list.check_visibility(menu_locator, "Roles list is missing") is_scrollable_vertically = roles_list.check_vertical_scrolling(menu_locator) @@ -323,13 +323,13 @@ class AddADUserModalWindow(ModalWindowComponent): elif name in no_op_names: continue else: - item.check_presence( + item.check_visibility( f"Modal window content item with name '{name}' is missing" ) - self.check_button_presence("search") - self.check_button_presence("add") - self.check_button_presence("close") + self.check_button_visibility("search") + self.check_button_visibility("add") + self.check_button_visibility("close") search_button = self.get_button_by_name("search") search_button.click() @@ -344,7 +344,7 @@ class AddADUserModalWindow(ModalWindowComponent): user_AD_input.click() user_AD_list = self.get_content_item("user_AD_list") - user_AD_list.check_presence(menu_locator, + user_AD_list.check_visibility(menu_locator, "Users AD list is missing") is_scrollable_vertically = user_AD_list.check_vertical_scrolling(menu_locator) assert is_scrollable_vertically, "Users AD list should be scrollable_vertically" @@ -352,13 +352,13 @@ class AddADUserModalWindow(ModalWindowComponent): self.update_input_form_fields(expand=True) - self.get_content_item("name_input").check_presence( + self.get_content_item("name_input").check_visibility( "Modal window content item with name 'name_input' is missing") - self.get_content_item("role_input").check_presence( + self.get_content_item("role_input").check_visibility( "Modal window content item with name 'role_input' is missing") - self.get_content_item("commentary_input").check_presence( + self.get_content_item("commentary_input").check_visibility( "Modal window content item with name 'commentary_input' is missing") - self.get_content_item("email_input").check_presence( + self.get_content_item("email_input").check_visibility( "Modal window content item with name 'email_input' is missing") - self.get_content_item("phone_input").check_presence( + self.get_content_item("phone_input").check_visibility( "Modal window content item with name 'phone_input' is missing") diff --git a/modal_windows/modal_add_local_user.py b/modal_windows/modal_add_local_user.py index 5355c80..6d71a22 100644 --- a/modal_windows/modal_add_local_user.py +++ b/modal_windows/modal_add_local_user.py @@ -207,7 +207,7 @@ class AddLocalUserModalWindow(ModalWindowComponent): assert False, \ "The checkbox 'Active Directory'should not be checked for the add local user window" - self.check_toolbar_button_presence("close") + self.check_toolbar_button_visibility("close") self.check_toolbar_button_tooltip("close", "Закрыть") for name in self.content_items.keys(): @@ -226,7 +226,7 @@ class AddLocalUserModalWindow(ModalWindowComponent): elif name == "role_input": item.click() roles_list = self.get_content_item("roles_list") - roles_list.check_presence(menu_locator, + roles_list.check_visibility(menu_locator, "Roles list is missing") is_scrollable_vertically = roles_list.check_vertical_scrolling(menu_locator) @@ -241,9 +241,10 @@ class AddLocalUserModalWindow(ModalWindowComponent): elif name == "roles_list": continue else: - item.check_presence( + item.check_visibility( f"Modal window content item with name '{name}' is missing" ) - self.check_button_presence("add") - self.check_button_presence("close") + self.check_button_visibility("add") + self.check_button_visibility("close") + diff --git a/modal_windows/modal_edit_user.py b/modal_windows/modal_edit_user.py index 287e963..6ed13ee 100644 --- a/modal_windows/modal_edit_user.py +++ b/modal_windows/modal_edit_user.py @@ -215,17 +215,17 @@ class EditUserModalWindow(ModalWindowComponent): elif name == "role_input": item.click() roles_list = self.get_content_item("roles_list") - roles_list.check_presence(menu_locator, + roles_list.check_visibility(menu_locator, "Roles list is missing") roles_list.check_item_with_text(role) elif name == "roles_list": continue else: - item.check_presence( + item.check_visibility( f"Modal window content item with name '{name}' is missing" ) - self.check_button_presence("save") - self.check_button_presence("delete") - self.check_button_presence("reset_password") - self.check_button_presence("close") + self.check_button_visibility("save") + self.check_button_visibility("delete") + self.check_button_visibility("reset_password") + self.check_button_visibility("close") diff --git a/modal_windows/Реестр_изменений_modal_windows.txt b/modal_windows/Реестр_изменений_modal_windows.txt deleted file mode 100644 index a9688ea..0000000 --- a/modal_windows/Реестр_изменений_modal_windows.txt +++ /dev/null @@ -1,39 +0,0 @@ -modal_windows - -modal_add_user.py -Изменения включают: -- Добавлена полная документация: - Docstring класса с описанием назначения - Подробные docstring методов с описанием аргументов и возможных исключений - Комментарии к сложным блокам кода -- Улучшено форматирование: - Соблюдение PEP 8 (отступы, длина строк, пробелы) - Логическое группирование кода - Четкое разделение блоков -- Оптимизирована читаемость: - Последовательное именование переменных - Улучшенные переносы длинных строк - Единый стиль оформления -- Сохранена функциональность: - Без изменений рабочей логики - Сохранение всех оригинальных вызовов методов - Оставлены закомментированные блоки без изменений - -modal_edit_user.py -Изменения включают: -- Полная документация: - Добавлены docstring для класса и всех методов - Подробные описания аргументов и возвращаемых значений - Указание возможных исключений -- Оптимизированное форматирование: - Соблюдение PEP 8 (отступы, длина строк, пробелы) - Логическая группировка кода - Четкое разделение блоков -- Улучшенная читаемость: - Последовательные именования - Улучшенные переносы длинных строк - Единый стиль оформления -- Сохранение функциональности: - Без изменений рабочей логики - Сохранение всех оригинальных вызовов - Оставление закомментированных блоков без изменений \ No newline at end of file diff --git a/pages/base_page.py b/pages/base_page.py index 99953d5..025927e 100644 --- a/pages/base_page.py +++ b/pages/base_page.py @@ -2,6 +2,7 @@ Содержит общие методы для взаимодействия со страницей и API. """ +import time from typing import Dict, Any from playwright.sync_api import Page, Response, APIRequestContext, expect @@ -78,50 +79,113 @@ class BasePage: """ api_request_context = self.get_api_request_context() token = host.get_access_token() + + # Проверяем что токен получен + if not token: + logger.error("Failed to get access token: token is None or empty") + # Возвращаем заглушечный response или бросаем исключение + # В Playwright можно создать mock response если нужно + return None + headers = {"Accept": "application/json", "Authorization": f"Bearer {token}"} - response = api_request_context.get( - f"{host.get_request_url()}{uri}", - headers=headers - ) + full_url = f"{host.get_request_url()}{uri}" + + logger.debug("Sending GET request to: %s", full_url) + response = api_request_context.get(full_url, headers=headers) + + # Логируем статус ответа + logger.debug("GET response status: %s", response.status) + return response def send_post_api_request(self, uri: str, payload: Dict) -> Response: - """Отправляет POST-запрос к API. - - Args: - uri (str): URI API-эндпоинта (без базового URL). - payload (Dict): Данные для отправки в теле запроса. - - Returns: - Response: Ответ сервера. - """ + """Отправляет POST-запрос к API.""" api_request_context = self.get_api_request_context() token = host.get_access_token() - headers = {"Accept": "application/json", "Authorization": f"Bearer {token}"} + + if not token: + logger.error("Failed to get access token: token is None or empty") + return None + + headers = { + "Accept": "application/json", + "Content-Type": "application/json", + "Authorization": f"Bearer {token}" + } + full_url = f"{host.get_request_url()}{uri}" + + logger.debug("Sending POST request to: %s", full_url) + + # Сериализуем payload в JSON + json_data = json.dumps(payload) + + # Проверяем что сериализация прошла успешно + if json_data is None: + logger.error("Failed to serialize payload to JSON: result is None") + return None + + if not isinstance(json_data, str): + logger.error("Failed to serialize payload to JSON: expected string got %s", type(json_data)) + return None + response = api_request_context.post( - f"{host.get_request_url()}{uri}", + full_url, headers=headers, - data=payload + data=json_data # Передаем сериализованный JSON как data ) + + logger.debug("POST response status: %s", response.status) + return response - def get_response_body(self, response: Response) -> dict | None: + def get_response_body(self, response: Response) -> dict | list | None: """Извлекает тело ответа в format JSON. Args: response (Response): Ответ сервера. Returns: - dict | None: Распарсенное тело ответа или None в случае ошибки. + dict | list | None: Распарсенное тело ответа или None в случае ошибки. """ - try: - response_body = response.json() - except json.JSONDecodeError: - logger.error("Failed to decode JSON response") - return None - return response_body + start_time = time.time() - # Проверки: + # Проверяем что response не None + if response is None: + logger.error("Response object is None") + processing_time = time.time() - start_time + logger.debug("Response processing time1: %.3f seconds", processing_time) + return None + + # Проверяем статус ответа + if response.status >= 400: + logger.error("API request failed with status %s", response.status) + processing_time = time.time() - start_time + logger.debug("Response processing time2: %.3f seconds", processing_time) + return None + + # Пытаемся получить JSON + json_result = response.json() + + # Проверяем что результат не None + if json_result is None: + logger.error("JSON parsing returned None") + processing_time = time.time() - start_time + logger.debug("Response processing time3: %.3f seconds", processing_time) + return None + + # Принимаем как словари, так и списки + if not isinstance(json_result, (dict, list)): + logger.error("Expected dict or list but got %s", type(json_result)) + processing_time = time.time() - start_time + logger.debug("Response processing time4: %.3f seconds", processing_time) + return None + + processing_time = time.time() - start_time + logger.debug("Response processing time5: %.3f seconds", processing_time) + + return json_result + + # Проверки: def check_URL(self, uri: str, msg: str) -> None: """Проверяет, что текущий URL соответствует ожидаемому. @@ -132,7 +196,7 @@ class BasePage: Raises: AssertionError: Если URL не соответствует ожидаемому. """ - expect(self.page).to_have_url( + expect(self.page).to_have_url( # pylint: disable=expression-not-assigned f"{host.get_base_url()}{uri}", timeout=60000 ), msg diff --git a/pages/license_tab.py b/pages/license_tab.py index 94fe899..00b2991 100644 --- a/pages/license_tab.py +++ b/pages/license_tab.py @@ -113,7 +113,7 @@ class LicenseTab(BasePage): def should_be_json_container(self) -> None: """Проверяет наличие JSON-контейнера.""" - self.json_container.check_presence( + self.json_container.check_visibility( JsonContainerLocators.CONTAINER, "Json container with license info is missing" ) diff --git a/pages/main_page.py b/pages/main_page.py index a2b093f..20fae66 100644 --- a/pages/main_page.py +++ b/pages/main_page.py @@ -93,7 +93,7 @@ class MainPage(BasePage): def should_be_navigation_panel(self) -> None: """Проверяет наличие панели навигации.""" - self.navigation_panel.check_presence( + self.navigation_panel.check_visibility( NavigationPanelLocators.PANEL_MAIN, "Navigation panel is missing" ) @@ -101,7 +101,7 @@ class MainPage(BasePage): def should_be_user_button(self) -> None: """Проверяет наличие кнопки пользователя.""" - self.user_button.check_presence("User button is missing on event panel") + self.user_button.check_visibility("User button is missing on event panel") def check_navigation_panel_verticall_scrolling(self) -> bool: """Проверяет возможность вертикальной прокрутки панели. diff --git a/pages/service_status_tab.py b/pages/service_status_tab.py index bcf9bca..5afbec6 100644 --- a/pages/service_status_tab.py +++ b/pages/service_status_tab.py @@ -154,7 +154,8 @@ class ServiceStatusTab(BasePage): AssertionError: Если таблица отсутствует. """ - self.services_table.check_presence( + self.services_table.check_visibility( TableLocators.TABLE_WORK_AREA, "Service statuses table is missing" ) + diff --git a/pages/session_tab.py b/pages/session_tab.py index d4bf184..9d412a8 100644 --- a/pages/session_tab.py +++ b/pages/session_tab.py @@ -139,6 +139,7 @@ class SessionsTab(BasePage): # Находим кнопку удаления сеанса и нажимаем на нее delete_session_button = self.get_delete_session_button_from_row(row_index) delete_session_button.click() + self.page.wait_for_timeout(1000) # Подтверждаем удаление self.delete_session_confirm.click_allow_button() @@ -311,7 +312,7 @@ class SessionsTab(BasePage): AssertionError: Если таблица отсутствует. """ - self.sessions_table.check_presence( + self.sessions_table.check_visibility( TableLocators.TABLE_WORK_AREA, "Sessions table is missing" ) @@ -335,7 +336,7 @@ class SessionsTab(BasePage): self.wait_for_tooltip_to_disappear() delete_button = self.get_delete_session_button_from_row(row_index) - delete_button.check_presence( + delete_button.check_visibility( f"Delete session button is missing on {row_index} row" ) delete_button.check_tooltip_with_text(ButtonLocators.TOOLTIP, tooltip) diff --git a/pages/users_tab.py b/pages/users_tab.py index 679c0c0..0563adf 100644 --- a/pages/users_tab.py +++ b/pages/users_tab.py @@ -293,10 +293,10 @@ class UsersTab(BasePage): """ if self.toolbar.is_button_not_present("close"): - self.toolbar.check_button_presence("edit") + self.toolbar.check_button_visibility("edit") self.toolbar.click_button("edit") - self.toolbar.check_button_presence("add_user") + self.toolbar.check_button_visibility("add_user") self.toolbar.click_button("add_user") self.add_modal_window("add_local_user", "") self.get_modal_window("add_local_user").check_by_window_title() @@ -441,7 +441,7 @@ class UsersTab(BasePage): """ self.toolbar.check_toolbar_presence("Toolbar is missing") - self.toolbar.check_button_presence("edit") + self.toolbar.check_button_visibility("edit") def should_be_toolbar_buttons(self) -> None: """Проверяет наличие и функциональность кнопок тулбара. @@ -450,17 +450,17 @@ class UsersTab(BasePage): AssertionError: Если кнопки недоступны или подсказки неверны. """ - self.toolbar.check_button_presence("edit") + self.toolbar.check_button_visibility("edit") self.toolbar.check_button_tooltip("edit", "Редактировать") self.toolbar.get_button_by_name("edit").click() - self.toolbar.check_button_presence("add_user") - self.toolbar.check_button_presence("close") + self.toolbar.check_button_visibility("add_user") + self.toolbar.check_button_visibility("close") self.toolbar.check_button_tooltip("add_user", "Добавить") self.toolbar.check_button_tooltip("close", "Закрыть") self.toolbar.get_button_by_name("close").click() - self.toolbar.check_button_presence("edit") + self.toolbar.check_button_visibility("edit") def should_be_users_table(self) -> None: """Проверяет наличие таблицы пользователей. @@ -469,7 +469,7 @@ class UsersTab(BasePage): AssertionError: Если таблица отсутствует. """ - self.users_table.check_presence( + self.users_table.check_visibility( TableLocators.TABLE_WORK_AREA, "Users table is missing" ) diff --git a/pages/Реестр_изменений_pages.txt b/pages/Реестр_изменений_pages.txt deleted file mode 100644 index 88c1978..0000000 --- a/pages/Реестр_изменений_pages.txt +++ /dev/null @@ -1,108 +0,0 @@ -pages - -base_page.py -Изменения включают: -- Добавлен модульный docstring с описанием назначения модуля -- Добавлен подробный docstring для класса BasePage с описанием атрибутов -- Указание на возможные исключения (где уместно) -- Сохранены все технические комментарии (# Действия:, # Проверки:) -- Улучшено форматирование кода в соответствии с PEP 8 -- Добавлены аннотации типов для всех аргументов и возвращаемых значений -- Логика работы методов осталась без изменений -- Добавлено логирование ошибок вместо print -- Улучшено форматирование длинных строк для лучшей читаемости - -license_tab.py -Изменения включают: -- Добавлены docstring для класса и всех методов в формате Google Style на русском языке -- Переведены разделительные комментарии (#actions: → # Действия:, # assertions: → # Проверки:) -- Сохранены все технические комментарии в оригинальном виде -- Улучшено форматирование кода в соответствии с PEP 8 (пробелы, переносы длинных строк) -- Добавлены аннотации типов для методов -- Сохранена вся исходная логика без изменений - -login_page.py -Изменения включают: -- Добавлены docstring для класса и всех методов в формате Google Style на русском языке -- Сохранены все технические комментарии в оригинальном виде -- Добавлены аннотации типов для методов -- Улучшено форматирование кода в соответствии с PEP 8 (импорты, пробелы, отступы) -- В docstring методов добавлена информация о: - Назначении метода - Аргументах - Возвращаемых значениях - Возможных исключениях -- Сохранена вся исходная логика без изменений -- Улучшена читаемость кода за счет правильного форматирования и структурирования - -main_page.py -Изменения включают: -- Добавлены docstring для класса и всех методов в формате Google Style на русском языке -- Переведены разделительные комментарии (#actions: → # Действия:, # assertions: → # Проверки:) -- Добавлены аннотации типов для всех методов -- Улучшено форматирование кода в соответствии с PEP 8 -- Исправлена опечатка в названии метода click_configuration_navigation_panel_item (было click_configuration_navigation_panel_item) -- Сохранены все технические особенности исходного кода -- Улучшена читаемость за счет правильного структурирования кода и комментариев - -service_status_tab.py -Изменения включают: -- Добавлена полная документация: - Docstring класса с описанием назначения - Подробные docstring для каждого метода - Указание типов аргументов и возвращаемых значений - Описание возможных исключений -- Оптимизировано форматирование: - Соблюдение PEP 8 (отступы, длина строк, пробелы) - Логическое разделение блоков кода - Улучшенные переносы длинных строк -- Улучшена читаемость: - Последовательное именование методов - Четкая структура документации - Единый стиль оформления -- Сохранена функциональность: - Без изменений рабочей логики - Сохранение всех оригинальных вызовов - Оставление сообщений об ошибках на английском (как в требованиях) - -users_tab.py -Изменения включают: -- Полная документация: - Добавлены docstring для класса и всех методов - Указаны типы аргументов и возвращаемых значений - Описаны возможные исключения - Добавлены пояснения к сложным методам -- Оптимизированное форматирование: - Соблюдение PEP 8 (отступы, длина строк, пробелы) - Логическая группировка кода - Улучшенные переносы длинных строк -- Улучшенная читаемость: - Последовательные именования - Четкое разделение блоков - Единый стиль оформления -- Сохранение функциональности: - Без изменений рабочей логики - Сохранение всех оригинальных вызовов - Оставление сообщений об ошибках на английском (как в требованиях) - -session_tab.py -Изменения включают: -- Полная документация: - Добавлены docstring для класса и всех методов - Указаны типы аргументов и возвращаемых значений - Описаны возможные исключения - Добавлены пояснения к сложным методам -- Оптимизированное форматирование: - Соблюдение PEP 8 (отступы, длина строк, пробелы) - Логическая группировка кода - Улучшенные переносы длинных строк -- Улучшенная читаемость: - Последовательные именования - Четкое разделение блоков - Единый стиль оформления -- Сохранение функциональности: - Без изменений рабочей логики - Сохранение всех оригинальных вызовов - Оставление сообщений об ошибках на английском (как в требованиях) - - diff --git a/tests/components/test_user_modal_window.py b/tests/components/test_user_modal_window.py index 0c63e92..96c2403 100644 --- a/tests/components/test_user_modal_window.py +++ b/tests/components/test_user_modal_window.py @@ -50,11 +50,11 @@ class TestUsersModalWindow: assert is_scrollable_vertically, "Should be vertical scrolling" modal_window.scroll_window_down() - modal_window.check_button_presence("close") + modal_window.check_button_visibility("close") ut.wait_for_timeout(3000) modal_window.scroll_window_up() - modal_window.check_toolbar_button_presence("close") + modal_window.check_toolbar_button_visibility("close") ut.wait_for_timeout(3000) is_scrollable_horizontally = modal_window.check_window_horizontal_scrolling() @@ -84,11 +84,11 @@ class TestUsersModalWindow: assert is_scrollable_vertically, "Should be vertical scrolling" modal_window.scroll_window_down() - modal_window.check_button_presence("close") + modal_window.check_button_visibility("close") ut.wait_for_timeout(3000) modal_window.scroll_window_up() - modal_window.check_toolbar_button_presence("close") + modal_window.check_toolbar_button_visibility("close") ut.wait_for_timeout(3000) ## Временно закомментарено - для окна добавления пользователя убрали горизонтальный скроллинг - BUG??? diff --git a/tests/components/Реестр_изменений_tests_componets.txt b/tests/components/Реестр_изменений_tests_componets.txt deleted file mode 100644 index 51e7207..0000000 --- a/tests/components/Реестр_изменений_tests_componets.txt +++ /dev/null @@ -1,52 +0,0 @@ -tests/componets - -run.bat -- файл для запуска тестов скроллинга компонент в уменьшенном окне браузера - -test_json_container.py -Изменения включают: -- Добавлены docstring для класса и всех методов в Google-формате -- Переведены и оформлены комментарии в коде -- Сохранены все оригинальные технические сообщения и assert -- Улучшено форматирование (отступы, пробелы, переносы строк) -- Добавлены описания действий в тестовом методе -- Сохранена оригинальная логика теста -- Добавлены пояснения к фикстуре setup -- Соответствие PEP 8 и Google Python Style Guide - -test_navigation_panel.py -Изменения включают: -- Добавлены docstring для класса и метода в Google-формате -- Переведены и оформлены комментарии в коде -- Сохранены все оригинальные технические сообщения и assert -- Улучшено форматирование (отступы, пробелы, переносы строк) -- Добавлены пояснения к закомментированным маркерам тестов -- Сохранена оригинальная логика теста -- Добавлены описания шагов теста -- Соответствие PEP 8 и Google Python Style Guide -- Комментарии о viewport и smoke-тесте сохранены в оригинальном виде, но перемещены в более подходящее место - -test_services_table.py -Изменения включают: -- Добавлены docstring для класса и методов в Google-формате -- Переведены и структурированы комментарии -- Сохранены все оригинальные технические сообщения и assert -- Улучшено форматирование (отступы, пробелы, переносы строк) -- Добавлены пояснения к закомментированному smoke-маркеру -- Сохранена оригинальная логика теста -- Добавлены описания проверок в тестовом методе -- Соответствие PEP 8 и Google Python Style Guide -- Комментарии о smoke-тесте сохранены в оригинальном виде, но перемещены в более подходящее место - -test_user_modal_window.py -Изменения включают: -- Добавлены подробные docstring для класса и всех методов -- Сохранены все оригинальные технические сообщения и маркеры -- Улучшено форматирование кода (отступы, пробелы, переносы строк) -- Добавлены пояснения к закомментированному smoke-маркеру -- Переведены и структурированы комментарии -- Сохранена оригинальная логика тестов -- Добавлены описания проверок в тестовых методах -- Соответствие PEP 8 и Google Python Style Guide -- Четкое разделение на разделы с комментариями -- Сохранены все технические детали (таймауты, названия кнопок) \ No newline at end of file diff --git a/tests/e2e/__pycache__/test_expand_navigation_panel.cpython-313-pytest-8.4.1.pyc b/tests/e2e/__pycache__/test_expand_navigation_panel.cpython-313-pytest-8.4.1.pyc deleted file mode 100644 index d378be423c4b33f4b4f3f2b879dca89a0cf86366..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3177 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 h$HMo}>VKfH$8}r|sI2TaZ{ECl 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 XhwR9QM4x|{{Fb5|SN_FhBmMLrl_nKj diff --git a/tests/e2e/__pycache__/test_sessions_tab.cpython-313-pytest-8.4.1.pyc b/tests/e2e/__pycache__/test_sessions_tab.cpython-313-pytest-8.4.1.pyc deleted file mode 100644 index 2fb2f194d64f5878fe866504c267bb3351d16f2b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 25319 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 diff --git a/tests/e2e/__pycache__/test_users_tab.cpython-313-pytest-8.4.1.pyc b/tests/e2e/__pycache__/test_users_tab.cpython-313-pytest-8.4.1.pyc deleted file mode 100644 index 4a2b71e8f0ad6a1c26a54897882a9818701e5ae2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13871 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 diff --git a/tools/Реестр_изменений_tools.txt b/tools/Реестр_изменений_tools.txt deleted file mode 100644 index e2dea1c..0000000 --- a/tools/Реестр_изменений_tools.txt +++ /dev/null @@ -1,9 +0,0 @@ -tools - -logger.py -Изменения включают: -- Добавлен модульный docstring с описанием назначения модуля -- Добавлен подробный docstring для функции get_logger в Google-стиле -- Добавлены поясняющие комментарии к ключевым настройкам логгера -- Сохранена оригинальная логика и технические детали без изменений -- Соблюдены требования PEP 8 по форматированию кода \ No newline at end of file