Актуализация тестов после перехода на версию приложения 1.40

main
nsubbot 2026-04-28 13:34:05 +03:00
parent a07cb43b80
commit e3804bd9c9
11 changed files with 161 additions and 57 deletions

3
.env.12 Normal file
View File

@ -0,0 +1,3 @@
ENV=test
AUTH_LOGIN = admin
AUTH_PASSWORD = enodemon-admin

View File

@ -31,6 +31,37 @@ class CheckboxGroupComponent(BaseComponent):
def get_checkbox_locator(self, text: str, container_locator: Locator | None = None) -> Locator: def get_checkbox_locator(self, text: str, container_locator: Locator | None = None) -> Locator:
"""Возвращает локатор чек-бокса с указанным текстом. """Возвращает локатор чек-бокса с указанным текстом.
Args:
text (str): Текст элемента для выбора.
container_locator (Locator | None): Локатор контейнера с чек-боксами.
Если не указан, поиск по всей странице.
Returns:
Locator: Локатор чек-бокса.
"""
if container_locator:
listitem_locator = container_locator.get_by_role("listitem")
else:
listitem_locator = self.page.locator("//div[contains(@class, 'menuable__content__active')]"). \
get_by_role("listitem")
listitem_locator.last.scroll_into_view_if_needed()
listitem_locator.last.wait_for(state="visible")
all_items = listitem_locator.all()
for i, item in enumerate(all_items):
if item.inner_text() == text:
checkbox_locator = item.get_by_role("checkbox")
expect(checkbox_locator).to_be_visible(), \
f"Checkbox with text '{text}' is missing or not visible"
return checkbox_locator
assert False, f"Checkbox locator for {text} has not been found"
def get_checkbox_locator_or(self, text: str, container_locator: Locator | None = None) -> Locator:
"""Возвращает локатор чек-бокса с указанным текстом.
Args: Args:
text (str): Текст элемента для выбора. text (str): Текст элемента для выбора.
container_locator (Locator | None): Локатор контейнера с чек-боксами. container_locator (Locator | None): Локатор контейнера с чек-боксами.

View File

@ -106,3 +106,16 @@ class SendTestEmailModalWindow(ModalWindowComponent):
self.alert.check_alert_presence('\nТестовое сообщение\nотправлено\n') self.alert.check_alert_presence('\nТестовое сообщение\nотправлено\n')
self.alert.check_alert_absence('\nТестовое сообщение\nотправлено\n') self.alert.check_alert_absence('\nТестовое сообщение\nотправлено\n')
def should_be_error_alert(self, alert_text: str) -> None:
"""Проверяет наличие сообщения об неуспешной отправке тестового сообщения.
Raises:
AssertionError: Если тулбар отсутствует.
"""
alert_type = self.alert.get_alert_type()
assert alert_type == "error", f"Expected error alert, but got {alert_type} alert"
self.alert.check_alert_presence(alert_text)
self.alert.check_alert_absence(alert_text)

View File

@ -55,6 +55,10 @@ class SelectionBarComponent(BaseComponent):
clear_button_locator = self.selection_bar_locator.locator( clear_button_locator = self.selection_bar_locator.locator(
SelectionBarLocators.CLEAR_SELECTION_BUTTON SelectionBarLocators.CLEAR_SELECTION_BUTTON
) )
if clear_button_locator.count() == 0:
clear_button_locator = self.selection_bar_locator.locator("../..").locator(
SelectionBarLocators.CLEAR_SELECTION_BUTTON
)
clear_button_locator.click() clear_button_locator.click()
def get_available_options(self) -> list[str]: def get_available_options(self) -> list[str]:
@ -87,8 +91,13 @@ class SelectionBarComponent(BaseComponent):
def get_selection_bar_title(self) -> str: def get_selection_bar_title(self) -> str:
"""Возвращает название панели выбора значения""" """Возвращает название панели выбора значения"""
title_text = ""
title_locator = self.selection_bar_locator.locator(SelectionBarLocators.TITLE_LOCATOR) title_locator = self.selection_bar_locator.locator(SelectionBarLocators.TITLE_LOCATOR)
return title_locator.text_content() if title_locator.count() > 0:
title_text = title_locator.text_content()
else:
title_text = self.selection_bar_locator.get_attribute("placeholder")
return title_text
def get_selected_values(self) -> list[str]: def get_selected_values(self) -> list[str]:
"""Возвращает список выбранных значений""" """Возвращает список выбранных значений"""
@ -96,6 +105,11 @@ class SelectionBarComponent(BaseComponent):
selected_values_locator = self.selection_bar_locator.locator( selected_values_locator = self.selection_bar_locator.locator(
SelectionBarLocators.PARAMETERS_SELECTED SelectionBarLocators.PARAMETERS_SELECTED
) )
if selected_values_locator.count() == 0:
selected_values_locator = self.selection_bar_locator.locator("../..").locator(
SelectionBarLocators.PARAMETERS_SELECTED
)
print(selected_values_locator)
selected_values = selected_values_locator.all_inner_texts() selected_values = selected_values_locator.all_inner_texts()
return selected_values[0].splitlines() return selected_values[0].splitlines()
@ -153,6 +167,9 @@ class SelectionBarComponent(BaseComponent):
self.selection_bar_locator.click(force=True) self.selection_bar_locator.click(force=True)
# Ждем появления выпадающего списка # Ждем появления выпадающего списка
if self.page.locator(SelectionBarLocators.LIST_ACTIVE).count() == 0:
assert False, "Values list is empty"
if self.page.locator(SelectionBarLocators.LIST_ACTIVE).count() > 1: if self.page.locator(SelectionBarLocators.LIST_ACTIVE).count() > 1:
self.page.locator(SelectionBarLocators.LIST_ACTIVE).last.wait_for(state="attached") self.page.locator(SelectionBarLocators.LIST_ACTIVE).last.wait_for(state="attached")
else: else:

View File

@ -20,7 +20,7 @@ class Environment:
DEVELOP: str = 'develop' DEVELOP: str = 'develop'
URLS: Dict[str, str] = { URLS: Dict[str, str] = {
TEST: 'https://192.168.2.76/', TEST: 'https://192.168.236.12/',
DEVELOP: 'https://192.168.2.69/' DEVELOP: 'https://192.168.2.69/'
} }

View File

@ -414,8 +414,8 @@ class EmailNotificationsSettingsTab(BasePage):
if name == "checkbox_activate": if name == "checkbox_activate":
is_activate_checked = item.is_checked() is_activate_checked = item.is_checked()
assert not is_activate_checked, ( assert is_activate_checked, (
"Checkbox 'Активировать' should not be checked by default" "Checkbox 'Активировать' should be checked"
) )
def _check_tls_settings_content(self): def _check_tls_settings_content(self):

View File

@ -81,6 +81,8 @@ class TestActionsEventsContainer:
browser: Экземпляр страницы Playwright. browser: Экземпляр страницы Playwright.
""" """
rows_to_start_scrolling = 20
lp = LoginPage(browser) lp = LoginPage(browser)
lp.do_login() lp.do_login()
@ -90,58 +92,62 @@ class TestActionsEventsContainer:
actions_events_container = mp.click_events_panel_actions_tab() actions_events_container = mp.click_events_panel_actions_tab()
actions_events_container.click_archive_button() actions_events_container.click_archive_button()
events_panel_position = mp.get_events_panel_position() rows_count = actions_events_container.get_events_table_rows_count()
if rows_count > rows_to_start_scrolling:
events_panel_position = mp.get_events_panel_position()
# Проверка, что панель с таблицей открыта # Проверка, что панель с таблицей открыта
assert events_panel_position != "bottom", "Panel with actions events should be opened" assert events_panel_position != "bottom", "Panel with actions events should be opened"
is_scrollable = actions_events_container.check_events_table_verticall_scrolling() is_scrollable = actions_events_container.check_events_table_verticall_scrolling()
# Убеждаемся, что панель открыта наполовину и проверяем скроллинг # Убеждаемся, что панель открыта наполовину и проверяем скроллинг
assert events_panel_position == "center",\ assert events_panel_position == "center",\
"Panel with actions events should be located on the main page center" "Panel with actions events should be located on the main page center"
assert is_scrollable, "Actions events table should be scrollable" assert is_scrollable, "Actions events table should be scrollable"
# Скроллинг вниз # Скроллинг вниз
actions_events_container.scroll_events_table_down() actions_events_container.scroll_events_table_down()
browser.wait_for_timeout(1000) browser.wait_for_timeout(1000)
# Проверка видимости последней строки после прокрутки # Проверка видимости последней строки после прокрутки
actions_events_container.check_events_table_last_row_visibility() actions_events_container.check_events_table_last_row_visibility()
# Скроллинг вверх # Скроллинг вверх
actions_events_container.scroll_events_table_up() actions_events_container.scroll_events_table_up()
browser.wait_for_timeout(1000) browser.wait_for_timeout(1000)
# Проверка видимости первой строки после прокрутки # Проверка видимости первой строки после прокрутки
actions_events_container.check_events_table_first_row_visibility() actions_events_container.check_events_table_first_row_visibility()
# Раскрываем панель полностью и проверяем скроллинг # Раскрываем панель полностью и проверяем скроллинг
assert mp.check_expand_more_button(), \ assert mp.check_expand_more_button(), \
"Expand more button should be present" "Expand more button should be present"
mp.click_events_panel_expand_more_button() mp.click_events_panel_expand_more_button()
mp.wait_for_timeout(500) mp.wait_for_timeout(500)
events_panel_position = mp.get_events_panel_position() events_panel_position = mp.get_events_panel_position()
assert events_panel_position == "top",\ assert events_panel_position == "top",\
"Panel with actions events should be located on the main page top" "Panel with actions events should be located on the main page top"
is_scrollable = actions_events_container.check_events_table_verticall_scrolling() is_scrollable = actions_events_container.check_events_table_verticall_scrolling()
assert is_scrollable, "Actions events table should be scrollable in the full window" assert is_scrollable, "Actions events table should be scrollable in the full window"
# Скроллинг вниз # Скроллинг вниз
actions_events_container.scroll_events_table_down() actions_events_container.scroll_events_table_down()
browser.wait_for_timeout(1000) browser.wait_for_timeout(1000)
# Проверка видимости последней строки после прокрутки # Проверка видимости последней строки после прокрутки
actions_events_container.check_events_table_last_row_visibility() actions_events_container.check_events_table_last_row_visibility()
# Скроллинг вверх # Скроллинг вверх
actions_events_container.scroll_events_table_up() actions_events_container.scroll_events_table_up()
browser.wait_for_timeout(1000) browser.wait_for_timeout(1000)
# Проверка видимости первой строки после прокрутки # Проверка видимости первой строки после прокрутки
actions_events_container.check_events_table_first_row_visibility() actions_events_container.check_events_table_first_row_visibility()
else:
print("Not enough data to check vertical scrolling")
# @pytest.mark.develop # @pytest.mark.develop
def test_real_time_task_view(self, browser: Page): def test_real_time_task_view(self, browser: Page):
@ -255,7 +261,7 @@ class TestActionsEventsContainer:
# convert2timestamp=True) # convert2timestamp=True)
# assert is_descending_order, "Column data should be in descending order" # assert is_descending_order, "Column data should be in descending order"
@pytest.mark.develop # @pytest.mark.develop
def test_real_time_events_table_pagination(self, browser: Page): def test_real_time_events_table_pagination(self, browser: Page):
"""Проверяет возможность пагинации таблицы событий на примере вкладки 'Реальное время'. """Проверяет возможность пагинации таблицы событий на примере вкладки 'Реальное время'.

View File

@ -157,16 +157,14 @@ class TestEmailNotificationsSettingsTab:
send_test_email_window.close_by_toolbar_button() send_test_email_window.close_by_toolbar_button()
# @pytest.mark.develop # @pytest.mark.develop
# TO-DO: rewrite tescase after feature release def test_send_test_email_successful(self, browser: Page) -> None:
def test_send_test_email(self, browser: Page) -> None:
"""Тест модального окна для посылки тестового E-mail. """Тест модального окна для посылки тестового E-mail.
Проверяет: Проверяет:
Возможность посылки тестового E-mail. Возможность посылки тестового E-mail по существующему адресу.
""" """
# Адрес куда отправлять e-mail # Адрес куда отправлять e-mail
# Пока фейковый sent_address = "audiomine.platform@gmail.com"
fake_address = "test@grandpas_village.com"
# Инициализация вкладки # Инициализация вкладки
email_notification_settings_tab = EmailNotificationsSettingsTab(browser) email_notification_settings_tab = EmailNotificationsSettingsTab(browser)
@ -176,17 +174,50 @@ class TestEmailNotificationsSettingsTab:
send_test_email_window = email_notification_settings_tab.click_test_button() send_test_email_window = email_notification_settings_tab.click_test_button()
send_test_email_window.input_email(fake_address) send_test_email_window.input_email(sent_address)
with browser.expect_response("**/e-nms/email/testEmail") as response_info: with browser.expect_response("**/e-nms/email/testEmail") as response_info:
send_test_email_window.click_test_button() send_test_email_window.click_test_button()
send_test_email_window.should_be_success_alert() send_test_email_window.should_be_success_alert()
response = response_info.value response = response_info.value
assert response.ok, "Unsuccessful test e-mail request" assert response.ok, "Unsuccessful test e-mail request"
send_test_email_window.close() send_test_email_window.close()
# @pytest.mark.develop
def test_send_test_email_address_validation(self, browser: Page) -> None:
"""Тест модального окна для посылки тестового E-mail.
Проверяет:
Валидацию вводимого адреса E-mail.
"""
# Адрес куда отправлять e-mail - фейковый
incorrect_addresses = ["rrrrr", "@mail.ru", "rrrmail.ru", "rr@mail", "rrrr@@mail.ru", "rr@mailru", "rr@my_mail.ru"]
# Инициализация вкладки
email_notification_settings_tab = EmailNotificationsSettingsTab(browser)
send_test_email_window = email_notification_settings_tab.click_test_button()
# Пустое поле ввода адреса
send_test_email_window.click_test_button()
send_test_email_window.should_be_error_alert('\nПоле должно быть заполнено\n')
for address in incorrect_addresses:
send_test_email_window.input_email(address)
send_test_email_window.click_test_button()
send_test_email_window.should_be_error_alert('\nНекорректный e-mail\n')
# нет проверки валидности домена
# fake_address = "test@grandpasvillage.com"
# send_test_email_window.input_email(fake_address)
# send_test_email_window.click_test_button()
# send_test_email_window.should_be_error_alert('\Ошибка входа в систему\n')
send_test_email_window.close()
def _get_default_value(self, setting_name: str, default_settings: dict) -> str| None: def _get_default_value(self, setting_name: str, default_settings: dict) -> str| None:
for setting in default_settings: for setting in default_settings:
if setting["name"] == setting_name: if setting["name"] == setting_name:

View File

@ -62,7 +62,7 @@ class TestPushNotificationsSettingsTab:
assert msg_value == expected_msg_value, \ assert msg_value == expected_msg_value, \
f"Actual message field value {msg_value} is not equal expected message field value {expected_msg_value}" f"Actual message field value {msg_value} is not equal expected message field value {expected_msg_value}"
# @pytest.mark.develop @pytest.mark.develop
def test_send_push_notification(self, browser: Page) -> None: def test_send_push_notification(self, browser: Page) -> None:
"""Тест содержимого вкладки настройки Push уведомлений. """Тест содержимого вкладки настройки Push уведомлений.

View File

@ -46,7 +46,7 @@ class TestBackupSettingsTab:
main_page.click_subpanel_item("Обслуживание и диагностика") main_page.click_subpanel_item("Обслуживание и диагностика")
main_page.click_subpanel_item("Резервное копирование") main_page.click_subpanel_item("Резервное копирование")
# @pytest.mark.develop @pytest.mark.develop
def test_backup_settings_tab_content(self, browser: Page) -> None: def test_backup_settings_tab_content(self, browser: Page) -> None:
"""Тест содержимого вкладки 'Резервное копирование'. """Тест содержимого вкладки 'Резервное копирование'.
@ -166,10 +166,12 @@ class TestBackupSettingsTab:
for setting in settings_list: for setting in settings_list:
expected = expected_sd_settings[setting] expected = expected_sd_settings[setting]
if dates.get(expected): if dates.get(expected):
expected = dates[expected] expected_setting = dates[expected]
else:
expected_setting = str(expected)
actual = streaming_data_settings[setting] actual = streaming_data_settings[setting]
assert actual == expected,\ assert actual == expected_setting,\
f"Actual value {actual} is not equal expected {expected} for field '{setting}'" f"Actual value {actual} is not equal expected {expected_setting} for field '{setting}'"
# @pytest.mark.develop # @pytest.mark.develop
def test_backup_settings_tab_check_backup_copies_amount(self, browser: Page) -> None: def test_backup_settings_tab_check_backup_copies_amount(self, browser: Page) -> None:
@ -341,7 +343,7 @@ class TestBackupSettingsTab:
backup_settings_tab.input_inventory_backups_number(orig_backup_limitation) backup_settings_tab.input_inventory_backups_number(orig_backup_limitation)
backup_settings_tab.click_save_button() backup_settings_tab.click_save_button()
@pytest.mark.develop # @pytest.mark.develop
def test_backup_settings_tab_set_streaming_data_settings(self, browser: Page) -> None: def test_backup_settings_tab_set_streaming_data_settings(self, browser: Page) -> None:
"""Тест проверки возможности изменения значения настроек 'Потоковые данные'.""" """Тест проверки возможности изменения значения настроек 'Потоковые данные'."""

View File

@ -69,6 +69,7 @@ class TestCertificatesTab:
certificates_tab = CertificatesTab(browser) certificates_tab = CertificatesTab(browser)
certificates_tab.click_certificate_tab_button() certificates_tab.click_certificate_tab_button()
certificates_tab.wait_for_timeout(5000)
viewed_certificate = certificates_tab.get_certificate() viewed_certificate = certificates_tab.get_certificate()
db_certificate_response = certificates_tab.send_get_api_request("api/certs/infoCert") db_certificate_response = certificates_tab.send_get_api_request("api/certs/infoCert")