Переименовано check_toolbar_button_presence в chek_toolbar_button_visibility.

pull/1/head
Radislav 2025-09-11 15:01:09 +03:00
parent e9f3f79f0b
commit 8f5aa882b5
35 changed files with 152 additions and 704 deletions

View File

@ -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

View File

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

View File

@ -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:
"""Проверяет текст кнопки Отмены."""

View File

@ -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:
"""Проверяет подсказку у кнопки в панели инструментов."""

View File

@ -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)

View File

@ -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:
"""Проверяет текст подсказки кнопки.

View File

@ -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 для ошибок
Улучшенные названия переменных

View File

@ -1,33 +0,0 @@
data
constants.py
Изменения включают:
- Добавлен docstring для класса в Google-формате на русском языке
- Добавлено описание атрибутов класса
- Сохранена оригинальная логика работы и сообщения об ошибках
- Добавлены пробелы вокруг операторов и между классами/функциями (PEP 8)
- Сохранены все технические сообщения без перевода
- Улучшено форматирование кода (отступы, переносы строк)
environment.py
Изменения включают:
- Добавлены docstring для класса и всех методов в Google-формате
- Описаны все атрибуты класса
- Сохранена оригинальная логика работы
- Улучшено форматирование (отступы, пробелы, переносы строк)
- Сохранены все технические сообщения без перевода
- Упрощены некоторые условные конструкции
- Добавлены описания возвращаемых значений и возможных исключений
- Сохранена инициализация host в конце файла
roles_dict.py
Изменения включают:
- Добавлен комментарий, поясняющий назначение словаря
- Выровнены отступы и форматирование словаря:
Каждая пара ключ-значение на отдельной строке
Единообразные отступы
Пробелы после двоеточий
- Улучшена читаемость за счет:
Логического расположения элементов
Последовательного форматирования
Сохранена оригинальная функциональность без изменений

View File

@ -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")

View File

@ -27,7 +27,7 @@ class Button(BaseElement):
return "button"
# Действия:
# Действия:
# (Методы действий будут добавлены по мере необходимости)
# Проверки:

View File

@ -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
- Дополнительные улучшения:
Более информативное сообщение об ошибке
Разделение логики на четкие этапы
Типизация аргументов методов

View File

@ -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}",

View File

@ -1,12 +0,0 @@
fixtures
pages.py
Изменения включают:
- Добавлен модульный docstring с описанием назначения модуля
- Добавлены подробные docstrings для всех функций в Google-стиле
- Сохранены все технические комментарии без изменений
- Добавлены пояснения к закомментированному коду
- Улучшено форматирование кода в соответствии с PEP 8
- Добавлены описания аргументов, возвращаемых значений и заметки для функций
- Сохранена оригинальная логика без изменений
- Добавлены разделительные пустые строки между функциями для лучшей читаемости

View File

@ -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
Описание состояний элементов (активное)

View File

@ -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")

View File

@ -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")

View File

@ -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")

View File

@ -1,39 +0,0 @@
modal_windows
modal_add_user.py
Изменения включают:
- Добавлена полная документация:
Docstring класса с описанием назначения
Подробные docstring методов с описанием аргументов и возможных исключений
Комментарии к сложным блокам кода
- Улучшено форматирование:
Соблюдение PEP 8 (отступы, длина строк, пробелы)
Логическое группирование кода
Четкое разделение блоков
- Оптимизирована читаемость:
Последовательное именование переменных
Улучшенные переносы длинных строк
Единый стиль оформления
- Сохранена функциональность:
Без изменений рабочей логики
Сохранение всех оригинальных вызовов методов
Оставлены закомментированные блоки без изменений
modal_edit_user.py
Изменения включают:
- Полная документация:
Добавлены docstring для класса и всех методов
Подробные описания аргументов и возвращаемых значений
Указание возможных исключений
- Оптимизированное форматирование:
Соблюдение PEP 8 (отступы, длина строк, пробелы)
Логическая группировка кода
Четкое разделение блоков
- Улучшенная читаемость:
Последовательные именования
Улучшенные переносы длинных строк
Единый стиль оформления
- Сохранение функциональности:
Без изменений рабочей логики
Сохранение всех оригинальных вызовов
Оставление закомментированных блоков без изменений

View File

@ -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

View File

@ -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"
)

View File

@ -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:
"""Проверяет возможность вертикальной прокрутки панели.

View File

@ -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"
)

View File

@ -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)

View File

@ -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"
)

View File

@ -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 (отступы, длина строк, пробелы)
Логическая группировка кода
Улучшенные переносы длинных строк
- Улучшенная читаемость:
Последовательные именования
Четкое разделение блоков
Единый стиль оформления
- Сохранение функциональности:
Без изменений рабочей логики
Сохранение всех оригинальных вызовов
Оставление сообщений об ошибках на английском (как в требованиях)

View File

@ -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???

View File

@ -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
- Четкое разделение на разделы с комментариями
- Сохранены все технические детали (таймауты, названия кнопок)

View File

@ -1,9 +0,0 @@
tools
logger.py
Изменения включают:
- Добавлен модульный docstring с описанием назначения модуля
- Добавлен подробный docstring для функции get_logger в Google-стиле
- Добавлены поясняющие комментарии к ключевым настройкам логгера
- Сохранена оригинальная логика и технические детали без изменений
- Соблюдены требования PEP 8 по форматированию кода