From 5960b27e0b47b79da6155de3a885d41b1ce5be6a Mon Sep 17 00:00:00 2001 From: nsubbot Date: Wed, 4 Feb 2026 14:59:07 +0300 Subject: [PATCH] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=D0=B8=D0=B5=20=D0=B2=20=D0=BB=D0=BE=D0=BA=D0=B0=D1=82?= =?UTF-8?q?=D0=BE=D1=80=D1=8B=20data-testid=20=D0=B4=D0=BB=D1=8F=20=D1=8D?= =?UTF-8?q?=D0=BB=D0=B5=D0=BC=D0=B5=D0=BD=D1=82=D0=BE=D0=B2=20=D0=B2=D0=BA?= =?UTF-8?q?=D0=BB=D0=B0=D0=B4=D0=BA=D0=B8=20'=D0=9D=D0=B0=D1=81=D1=82?= =?UTF-8?q?=D1=80=D0=BE=D0=B9=D0=BA=D0=B8/=D0=A3=D0=B2=D0=B5=D0=B4=D0=BE?= =?UTF-8?q?=D0=BC=D0=BB=D0=B5=D0=BD=D0=B8=D1=8F'?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../interactive_dropdown_list.py | 10 +++- pages/email_notifications_settings_tab.py | 49 +++++++++++-------- pages/push_notifications_settings_tab.py | 15 ++---- pages/sms_notifications_settings_tab.py | 27 +++++----- 4 files changed, 56 insertions(+), 45 deletions(-) diff --git a/components_derived/interactive_dropdown_list.py b/components_derived/interactive_dropdown_list.py index f53bbf2..e85fd30 100644 --- a/components_derived/interactive_dropdown_list.py +++ b/components_derived/interactive_dropdown_list.py @@ -5,6 +5,7 @@ методы для взаимодействия с интерактивными выпадающими списками на странице. """ +import re from playwright.sync_api import Page, Locator, expect from tools.logger import get_logger from components.base_component import BaseComponent @@ -35,8 +36,13 @@ class InteractiveDropdownList(BaseComponent): text (str): Текст элемента для выбора. """ - checkbox_locator = self.get_locator('div.v-list__tile__title').get_by_text(text). \ - locator("../..").locator("//input[@role='checkbox']") + checkbox_locator = self.page.get_by_role("listitem").filter(has_text=text).get_by_role("checkbox") + if checkbox_locator.count() > 1: + rtext = f"^{text}$" + checkbox_locator = self.page.get_by_role("listitem").filter( + has_text=re.compile(rtext) + ).get_by_role("checkbox") + expect(checkbox_locator).to_be_visible(), \ f"Checkbox for dropdown list item with text {text} is missing" return checkbox_locator diff --git a/pages/email_notifications_settings_tab.py b/pages/email_notifications_settings_tab.py index b89fda9..b35c325 100644 --- a/pages/email_notifications_settings_tab.py +++ b/pages/email_notifications_settings_tab.py @@ -33,16 +33,19 @@ class EmailNotificationsSettingsTab(BasePage): super().__init__(page) - toolbar_button_1 = self.page.get_by_role("navigation").filter( - has_text=re.compile("e-mail")).get_by_role("button").nth(0) - toolbar_button_2 = self.page.get_by_role("navigation").filter( - has_text=re.compile("e-mail")).get_by_role("button").nth(1) - self.toolbar = ToolbarComponent(page, "e-mail") - self.toolbar.add_tooltip_button(toolbar_button_1, "edit") - self.toolbar.add_tooltip_button(toolbar_button_1, "save") - self.toolbar.add_tooltip_button(toolbar_button_2, "cancel") + toolbar_button_edit = self.page.get_by_role("navigation").filter(has_text=re.compile("e-mail")). \ + locator("//button[@data-testid='NOTIFICATIONS_SMTP__btn__edit']") + self.toolbar.add_tooltip_button(toolbar_button_edit, "edit") + + toolbar_button_save = self.page.get_by_role("navigation").filter(has_text=re.compile("e-mail")). \ + locator("//button[@data-testid='NOTIFICATIONS_SMTP__btn__submit']") + self.toolbar.add_tooltip_button(toolbar_button_save, "save") + + toolbar_button_cancel = self.page.get_by_role("navigation").filter(has_text=re.compile("e-mail")). \ + locator("//button[@data-testid='NOTIFICATIONS_SMTP__btn__cancelEdit']") + self.toolbar.add_tooltip_button(toolbar_button_cancel, "cancel") # Форма для отображения/редактирования общих полей настроек self.common_settings = SettingsFormComponent(page) @@ -53,28 +56,29 @@ class EmailNotificationsSettingsTab(BasePage): self.common_input_fields_locators = self.common_settings.get_input_fields_locators(container_locator) loc = self.common_input_fields_locators.get("Сервер") - loc_server_input = loc.locator(SettingsFormLocators.SETTINGS_FORM_INPUT_FIELD).first + loc_server_input = loc.locator("//input[@data-testid='NOTIFICATIONS_SMTP__common_text-field__smtp_host']") server_setting_input = TextInput(page, loc_server_input, "server_setting_input") self.common_settings.add_content_item("server_setting_input", server_setting_input) loc = self.common_input_fields_locators.get("Порт") - loc_port_input = loc.locator(SettingsFormLocators.SETTINGS_FORM_INPUT_FIELD).first + loc_port_input = loc.locator("//input[@data-testid='NOTIFICATIONS_SMTP__common_text-field__smtp_port']") port_setting_input = TextInput(page, loc_port_input, "port_setting_input") self.common_settings.add_content_item("port_setting_input", port_setting_input) loc = self.common_input_fields_locators.get("Отправитель") - loc_sender_input = loc.locator(SettingsFormLocators.SETTINGS_FORM_INPUT_FIELD).first + loc_sender_input = loc.locator("//input[@data-testid='NOTIFICATIONS_SMTP__common_text-field__from_email']") sender_setting_input = TextInput(page, loc_sender_input, "sender_setting_input") self.common_settings.add_content_item("sender_setting_input", sender_setting_input) + field_locator = container_locator.locator("//div[@data-testid='NOTIFICATIONS_SMTP__common_checkbox__active']") # Метка "Активировать" - label_activate_locator = container_locator.locator("//label").get_by_text("Активировать") + label_activate_locator = field_locator.locator("//label").get_by_text("Активировать") label_activate = Text(page, label_activate_locator, "checkbox_activate_label") self.common_settings.add_content_item("checkbox_activate_label", label_activate) # Чекбокс "Активировать" checkbox_activate = Checkbox(page, - label_activate_locator.locator("../..").get_by_role("checkbox"), + field_locator.locator("//input[@data-testid='NOTIFICATIONS_SMTP__common_checkbox__active']"), "activate" ) self.common_settings.add_content_item("checkbox_activate", checkbox_activate) @@ -90,15 +94,18 @@ class EmailNotificationsSettingsTab(BasePage): loc = self.tls_input_fields_locators.get("Использовать TLS-туннель") self.tls_settings.add_content_item("tunnel_setting_selector", SelectionBarComponent(page, loc)) + field_locator = container_locator. \ + locator("//div[@data-testid='NOTIFICATIONS_SMTP__TLS_checkbox__reject_unauthorized']") + # Метка "Принимать самоподписанные сертификаты" - label_accept_certificates_locator = container_locator. \ + label_accept_certificates_locator = field_locator. \ locator("//label").get_by_text("Принимать самоподписанные сертификаты") label_accept_certificates = Text(page, label_accept_certificates_locator, "checkbox_accept_certificates_label") self.tls_settings.add_content_item("checkbox_accept_certificates_label", label_accept_certificates) # Чекбокс "Принимать самоподписанные сертификаты" checkbox_accept_certificates = Checkbox(page, - label_accept_certificates_locator.locator("../..").get_by_role("checkbox"), + field_locator.locator("//input[@data-testid='NOTIFICATIONS_SMTP__TLS_checkbox__reject_unauthorized']"), "accept_certificates" ) self.tls_settings.add_content_item("checkbox_accept_certificates", checkbox_accept_certificates) @@ -115,30 +122,30 @@ class EmailNotificationsSettingsTab(BasePage): self.auth_settings.add_content_item("auth_method_setting_selector", SelectionBarComponent(page, loc)) loc = self.auth_input_fields_locators.get("Имя пользователя") - loc_user_input = loc.locator(SettingsFormLocators.SETTINGS_FORM_INPUT_FIELD).first + loc_user_input = loc.locator("//input[@data-testid='NOTIFICATIONS_SMTP__auth_text-field__login']") user_setting_input = TextInput(page, loc_user_input, "user_setting_input") self.auth_settings.add_content_item("user_setting_input", user_setting_input) loc = self.auth_input_fields_locators.get("Пароль") - loc_password_input = loc.locator(SettingsFormLocators.SETTINGS_FORM_INPUT_FIELD).first + loc_password_input = loc.locator("//input[@data-testid='NOTIFICATIONS_SMTP__auth_text-field__password']") password_setting_input = TextInput(page, loc_password_input, "password_password_input") self.auth_settings.add_content_item("password_setting_input", password_setting_input) loc = self.auth_input_fields_locators.get("Домен") - loc_domain_input = loc.locator(SettingsFormLocators.SETTINGS_FORM_INPUT_FIELD).first + loc_domain_input = loc.locator("//input[@data-testid='NOTIFICATIONS_SMTP__auth_text-field__domain']") domain_setting_input = TextInput(page, loc_domain_input, "domain_setting_input") self.auth_settings.add_content_item("domain_setting_input", domain_setting_input) loc = self.auth_input_fields_locators.get("Рабочая станция") - loc_workstation_input = loc.locator(SettingsFormLocators.SETTINGS_FORM_INPUT_FIELD).first + loc_workstation_input = loc.locator("//input[@data-testid='NOTIFICATIONS_SMTP__auth_text-field__workstation']") workstation_setting_input = TextInput(page, loc_workstation_input, "workstation_setting_input") self.auth_settings.add_content_item("workstation_setting_input", workstation_setting_input) # Кнопка 'Тест' self.test_button = TooltipButton(page, page.locator(SettingsFormLocators.SETTTINGS_FORM_SCROLL_CONTAINER).\ - get_by_role("button", name='Тест'), - "test_button") + locator("//button[@data-testid='NOTIFICATIONS_SMTP__common_btn__test']"), + "test_button") self.alert = AlertComponent(page) diff --git a/pages/push_notifications_settings_tab.py b/pages/push_notifications_settings_tab.py index b904a4a..b612b2c 100644 --- a/pages/push_notifications_settings_tab.py +++ b/pages/push_notifications_settings_tab.py @@ -38,23 +38,21 @@ class PushNotificationsSettingsTab(BasePage): container_locator = self.page.locator(SettingsFormLocators.SETTINGS_FORM_INPUT_FORM_CONTAINER) self.input_fields_locators = self.settings_form.get_input_fields_locators(container_locator) + print(self.input_fields_locators) loc = self.input_fields_locators.get("Сообщение") - loc_message_input = loc.locator(SettingsFormLocators.SETTINGS_FORM_INPUT_FIELD).first + loc_message_input = loc.locator("//input[@data-testid='PUSH_NOTIFICATIONS__text-field__message']") message_setting_input = TextInput(page, loc_message_input, "message_setting_input") self.settings_form.add_content_item("message_setting_input", message_setting_input) loc = self.input_fields_locators.get("Пользователи") users_setting_input = TextInput(page, - loc. get_by_role("combobox"), + loc.get_by_role("combobox"), "users_setting_input") self.settings_form.add_content_item("users_setting_input", users_setting_input) self.settings_form.add_content_item("users_list", InteractiveDropdownList(page)) - # self.settings_form.add_tooltip_button(page.locator(SettingsFormLocators.SETTTINGS_FORM_SCROLL_CONTAINER).\ - # locator(SettingsFormLocators.PUSH_NOTIFICATION_BUTTON_SUBMIT), - # "submit_button") self.settings_form.add_tooltip_button(page.locator(SettingsFormLocators.PUSH_NOTIFICATIONS_BUTTON_SUBMIT), "submit_button") @@ -66,7 +64,7 @@ class PushNotificationsSettingsTab(BasePage): selected_users = self.get_users_setting_value() if len(selected_users) > 0: - clear_selection_button = self.page.locator(SettingsFormLocators.SETTTINGS_FORM_SCROLL_CONTAINER).\ + clear_selection_button = self.page.locator(SettingsFormLocators.SETTINGS_FORM_INPUT_FORM_CONTAINER).\ get_by_role("combobox").locator(SettingsFormLocators.CLEAR_SELECTION_BUTTON) clear_selection_button.click() @@ -93,7 +91,7 @@ class PushNotificationsSettingsTab(BasePage): str : Текущее значение поля настроек 'Пользователи'. """ - users_setting_field_loc = self.page.locator(SettingsFormLocators.SETTTINGS_FORM_SCROLL_CONTAINER).\ + users_setting_field_loc = self.page.locator(SettingsFormLocators.SETTINGS_FORM_INPUT_FORM_CONTAINER).\ get_by_role("combobox").locator(SettingsFormLocators.SELECTED_VALUES) return users_setting_field_loc.text_content().strip() @@ -162,9 +160,6 @@ class PushNotificationsSettingsTab(BasePage): f"Push notifications settings input form item with name '{name}' is missing" ) - # self.settings_form.check_button_visibility("submit_button") - # self.settings_form.check_button_tooltip("submit_button", "Отправить Push уведомление") - def should_be_toolbar(self) -> None: """Проверяет наличие тулбара страницы. diff --git a/pages/sms_notifications_settings_tab.py b/pages/sms_notifications_settings_tab.py index b75cd58..18310f1 100644 --- a/pages/sms_notifications_settings_tab.py +++ b/pages/sms_notifications_settings_tab.py @@ -30,16 +30,19 @@ class SMSNotificationsSettingsTab(BasePage): super().__init__(page) - toolbar_button_1 = self.page.get_by_role("navigation").filter( - has_text=re.compile("СМС")).get_by_role("button").nth(0) - toolbar_button_2 = self.page.get_by_role("navigation").filter( - has_text=re.compile("СМС")).get_by_role("button").nth(1) - self.toolbar = ToolbarComponent(page, "СМС") - self.toolbar.add_tooltip_button(toolbar_button_1, "edit") - self.toolbar.add_tooltip_button(toolbar_button_1, "save") - self.toolbar.add_tooltip_button(toolbar_button_2, "cancel") + toolbar_button_edit = self.page.get_by_role("navigation").filter(has_text=re.compile("СМС")). \ + locator("//button[@data-testid='NOTIFICATIONS_SMS__btn__edit']") + self.toolbar.add_tooltip_button(toolbar_button_edit, "edit") + + toolbar_button_save = self.page.get_by_role("navigation").filter(has_text=re.compile("СМС")). \ + locator("//button[@data-testid='NOTIFICATIONS_SMS__btn__submit']") + self.toolbar.add_tooltip_button(toolbar_button_save, "save") + + toolbar_button_cancel = self.page.get_by_role("navigation").filter(has_text=re.compile("СМС")). \ + locator("//button[@data-testid='NOTIFICATIONS_SMS__btn__cancelEdit']") + self.toolbar.add_tooltip_button(toolbar_button_cancel, "cancel") # Форма для отображения/редактирования полей настроек СМС уведомлений self.settings_form = SettingsFormComponent(page) @@ -48,17 +51,17 @@ class SMSNotificationsSettingsTab(BasePage): self.input_fields_locators = self.settings_form.get_input_fields_locators(container_locator) loc = self.input_fields_locators.get("ip") - loc_message_input = loc.locator(SettingsFormLocators.SETTINGS_FORM_INPUT_FIELD).first + loc_message_input = loc.locator("//input[@data-testid='NOTIFICATIONS_SMS__text-field__ip']") ip_setting_input = TextInput(page, loc_message_input, "ip_setting_input") self.settings_form.add_content_item("ip_setting_input", ip_setting_input) loc = self.input_fields_locators.get("Имя пользователя") - loc_user_input = loc.locator(SettingsFormLocators.SETTINGS_FORM_INPUT_FIELD).first + loc_user_input = loc.locator("//input[@data-testid='NOTIFICATIONS_SMS__text-field__login']") user_setting_input = TextInput(page, loc_user_input, "user_setting_input") self.settings_form.add_content_item("user_setting_input", user_setting_input) loc = self.input_fields_locators.get("Пароль") - loc_password_input = loc.locator(SettingsFormLocators.SETTINGS_FORM_INPUT_FIELD).first + loc_password_input = loc.locator("//input[@data-testid='NOTIFICATIONS_SMS__text-field__password']") password_setting_input = TextInput(page, loc_password_input, "password_setting_input") self.settings_form.add_content_item("password_setting_input", password_setting_input) @@ -68,7 +71,7 @@ class SMSNotificationsSettingsTab(BasePage): self.settings_form.add_content_item("password_hidden_icon", password_hidden_icon) self.settings_form.add_tooltip_button(page.locator(SettingsFormLocators.SETTTINGS_FORM_SCROLL_CONTAINER).\ - get_by_role("button", name='Тест'), + locator("//button[@data-testid='NOTIFICATIONS_SMS__btn__onSelect']"), "test_button") # Действия: def click_cancel_button(self) -> None: