Skip to content

# ChangePasswordModalWindow

Модуль modal_change_password содержит класс для работы с окном изменения пароля текущего пользователя.

Класс ChangePasswordModalWindow наследует базовый функционал ModalWindowComponent и реализует методы для изменения пароля пользователя.

## `ChangePasswordModalWindow`

Bases: `ModalWindowComponent`

Модальное окно изменения пароля текущего пользователя.

Наследует ModalWindowComponent и добавляет: - Поля задания пароля - Кнопки действий (Сохранить, Отменить)

Source code in `components_derived\modal_change_password.py`

     21
     22
     23
     24
     25
     26
     27
     28
     29
     30
     31
     32
     33
     34
     35
     36
     37
     38
     39
     40
     41
     42
     43
     44
     45
     46
     47
     48
     49
     50
     51
     52
     53
     54
     55
     56
     57
     58
     59
     60
     61
     62
     63
     64
     65
     66
     67
     68
     69
     70
     71
     72
     73
     74
     75
     76
     77
     78
     79
     80
     81
     82
     83
     84
     85
     86
     87
     88
     89
     90
     91
     92
     93
     94
     95
     96
     97
     98
     99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    class ChangePasswordModalWindow(ModalWindowComponent):
        """Модальное окно изменения пароля текущего пользователя.

        Наследует ModalWindowComponent и добавляет:
        - Поля задания пароля
        - Кнопки действий (Сохранить, Отменить)
        """

        def __init__(self, page: Page):
            """Инициализирует элементы формы редактирования пользователя."""

            super().__init__(page)

            modal_window_locator = page.locator(ModalWindowLocators.MODAL_WINDOW)

            # Тулбар с заголовком
            user_name = host.get_current_user_name()
            self.add_toolbar_title(f"Изменить пароль для пользователя {user_name}?")

            # Поля ввода пароля
            loc = modal_window_locator.get_by_label("Введите текущий пароль *")
            old_password_input = TextInput(page, loc, "old_password_input")
            self.add_content_item("old_password_input", old_password_input)

            icon_locator = loc.locator("xpath=../..").locator(TextInputLocators.ICON_PASSWORD_HIDING)
            old_password_hidden_icon = Icon(page, icon_locator,
                                             "old password hidden icon")
            self.add_content_item("old_password_hidden_icon", old_password_hidden_icon)

            loc = modal_window_locator.get_by_label("Введите новый пароль *")
            new_password_input = TextInput(page, loc, "new_password_input")
            self.add_content_item("new_password_input", new_password_input)

            icon_locator = loc.locator("xpath=../..").locator(TextInputLocators.ICON_PASSWORD_HIDING)
            new_password_hidden_icon = Icon(page, icon_locator,
                                             "new password hidden icon")
            self.add_content_item("new_password_hidden_icon", new_password_hidden_icon)

            loc = modal_window_locator.get_by_label("Введите повторно новый пароль *")
            confirm_password_input = TextInput(page, loc, "confirm_password_input")
            self.add_content_item("confirm_password_input", confirm_password_input)

            icon_locator = loc.locator("xpath=../..").locator(TextInputLocators.ICON_PASSWORD_HIDING)
            confirm_password_hidden_icon = Icon(page, icon_locator,
                                               "confirm password hidden icon")
            self.add_content_item("confirm_password_hidden_icon", confirm_password_hidden_icon)

            input_form_error_message = Text(page,
                                           modal_window_locator.locator(TextInputLocators.INPUT_FORM_MESSAGE),
                                           "input form error message")
            self.add_content_item("input_form_error_message", input_form_error_message)

            # Добавление кнопок действий
            locator_button_save = self.page.get_by_role("button", name="Сохранить")
            self.add_button(locator_button_save, "save")

            locator_button_cancel = self.page.get_by_role("button", name="Отменить")
            self.add_button(locator_button_cancel, "cancel")

            # Alert при успешном добавлении пользователя
            self.alert = AlertComponent(page)

        # Действия:
        def click_cancel_button(self) -> None:
            """Нажимает кнопку 'Отменить'"""

            self.get_button_by_name("cancel").click()

        def click_old_password_hidden_icon(self) -> None:
            """Нажатие на иконку скрытия старого пароля."""

            self.get_content_item("old_password_hidden_icon").click()

        def click_new_password_hidden_icon(self) -> None:
            """Нажатие на иконку скрытия нового пароля."""

            self.get_content_item("new_password_hidden_icon").click()

        def click_confirm_password_hidden_icon(self) -> None:
            """Нажатие на иконку скрытия пароля подтверждения."""

            self.get_content_item("confirm_password_hidden_icon").click()

        def change_password(self, old_password: str, new_password: str):
            """Заполняет элементы формы, нажимает кнопку 'Сохранить'"""

            error = ""

            self.get_content_item("old_password_input").input_value(old_password)
            self.get_content_item("new_password_input").input_value(new_password)
            self.get_content_item("confirm_password_input").input_value(new_password)

            button_save = self.get_button_by_name("save")

            if button_save.is_disabled():
                error_message = self.get_content_item("input_form_error_message")
                error = error_message.get_text(0)
                return False, error

            button_save.click()

            is_changed = False

            alert_type = self.alert.get_alert_type()
            if alert_type == "success":
                self.alert.check_alert_presence(' Пароль успешно изменён ')
                self.alert.check_alert_absence(' Пароль успешно изменён ')
                is_changed = True
            elif alert_type == "error":
                # to do: fix message after translation
                self.alert.check_alert_presence(' Old password not equal ')
                self.alert.check_alert_absence(' Old password not equal ')

                error = "Old password is not equal real password"
            else:
                error = f"Got unexpected alert type {alert_type}"

            return is_changed, error

        def get_password_inputs(self) -> []:
            """Возвращает список полей ввода пароля (для тестовых целей)."""

            text_inputs = []
            text_inputs.append(self.get_content_item("old_password_input"))
            text_inputs.append(self.get_content_item("new_password_input"))
            text_inputs.append(self.get_content_item("confirm_password_input"))
            return text_inputs

        # Проверки:
        def check_content(self):
            """Проверяет наличие и корректность всех элементов формы."""

            self.check_by_window_title()

            self.get_content_item("old_password_input").check_visibility(
                                      "Old password input form is missing"
                                 )
            old_password_hidden_icon = self.get_content_item("old_password_hidden_icon")
            old_password_hidden_icon.check_visibility(
                                      "Old password hidden icon is missing"
                                 )
            is_hidden_state = old_password_hidden_icon.is_password_hidden()
            assert is_hidden_state, "Old password hidden icon should be in hidden state"

            self.get_content_item("new_password_input").check_visibility(
                                      "New password input form is missing"
                                 )
            new_password_hidden_icon = self.get_content_item("new_password_hidden_icon")
            new_password_hidden_icon.check_visibility(
                                      "New password hidden icon is missing"
                                 )
            is_hidden_state = new_password_hidden_icon.is_password_hidden()
            assert is_hidden_state, "New password hidden icon should be in hidden state"

            self.get_content_item("confirm_password_input").check_visibility(
                                      "Confirm password input form is missing"
                                 )
            confirm_password_hidden_icon = self.get_content_item("confirm_password_hidden_icon")
            confirm_password_hidden_icon.check_visibility(
                                      "Confirm password hidden icon is missing"
                                 )
            is_hidden_state = confirm_password_hidden_icon.is_password_hidden()
            assert is_hidden_state, "Confirm password hidden icon should be in hidden state"

            self.check_button_visibility("cancel")

            button_save = self.get_button_by_name("save")
            is_disabled = button_save.is_disabled()
            assert is_disabled, "Button 'Сохранить' should be hidden"

        def check_error_message(self, text: str) -> None:
            """Проверяет сообщение об ошибке, возникшее при заполнении полей формы."""

            error_message = self.get_content_item("input_form_error_message")
            error_message.check_have_text(text, "Unexpected error message")

### `__init__(page)`

Инициализирует элементы формы редактирования пользователя.

Source code in `components_derived\modal_change_password.py`

    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    def __init__(self, page: Page):
        """Инициализирует элементы формы редактирования пользователя."""

        super().__init__(page)

        modal_window_locator = page.locator(ModalWindowLocators.MODAL_WINDOW)

        # Тулбар с заголовком
        user_name = host.get_current_user_name()
        self.add_toolbar_title(f"Изменить пароль для пользователя {user_name}?")

        # Поля ввода пароля
        loc = modal_window_locator.get_by_label("Введите текущий пароль *")
        old_password_input = TextInput(page, loc, "old_password_input")
        self.add_content_item("old_password_input", old_password_input)

        icon_locator = loc.locator("xpath=../..").locator(TextInputLocators.ICON_PASSWORD_HIDING)
        old_password_hidden_icon = Icon(page, icon_locator,
                                         "old password hidden icon")
        self.add_content_item("old_password_hidden_icon", old_password_hidden_icon)

        loc = modal_window_locator.get_by_label("Введите новый пароль *")
        new_password_input = TextInput(page, loc, "new_password_input")
        self.add_content_item("new_password_input", new_password_input)

        icon_locator = loc.locator("xpath=../..").locator(TextInputLocators.ICON_PASSWORD_HIDING)
        new_password_hidden_icon = Icon(page, icon_locator,
                                         "new password hidden icon")
        self.add_content_item("new_password_hidden_icon", new_password_hidden_icon)

        loc = modal_window_locator.get_by_label("Введите повторно новый пароль *")
        confirm_password_input = TextInput(page, loc, "confirm_password_input")
        self.add_content_item("confirm_password_input", confirm_password_input)

        icon_locator = loc.locator("xpath=../..").locator(TextInputLocators.ICON_PASSWORD_HIDING)
        confirm_password_hidden_icon = Icon(page, icon_locator,
                                           "confirm password hidden icon")
        self.add_content_item("confirm_password_hidden_icon", confirm_password_hidden_icon)

        input_form_error_message = Text(page,
                                       modal_window_locator.locator(TextInputLocators.INPUT_FORM_MESSAGE),
                                       "input form error message")
        self.add_content_item("input_form_error_message", input_form_error_message)

        # Добавление кнопок действий
        locator_button_save = self.page.get_by_role("button", name="Сохранить")
        self.add_button(locator_button_save, "save")

        locator_button_cancel = self.page.get_by_role("button", name="Отменить")
        self.add_button(locator_button_cancel, "cancel")

        # Alert при успешном добавлении пользователя
        self.alert = AlertComponent(page)

### `change_password(old_password, new_password)`

Заполняет элементы формы, нажимает кнопку 'Сохранить'

Source code in `components_derived\modal_change_password.py`

    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    def change_password(self, old_password: str, new_password: str):
        """Заполняет элементы формы, нажимает кнопку 'Сохранить'"""

        error = ""

        self.get_content_item("old_password_input").input_value(old_password)
        self.get_content_item("new_password_input").input_value(new_password)
        self.get_content_item("confirm_password_input").input_value(new_password)

        button_save = self.get_button_by_name("save")

        if button_save.is_disabled():
            error_message = self.get_content_item("input_form_error_message")
            error = error_message.get_text(0)
            return False, error

        button_save.click()

        is_changed = False

        alert_type = self.alert.get_alert_type()
        if alert_type == "success":
            self.alert.check_alert_presence(' Пароль успешно изменён ')
            self.alert.check_alert_absence(' Пароль успешно изменён ')
            is_changed = True
        elif alert_type == "error":
            # to do: fix message after translation
            self.alert.check_alert_presence(' Old password not equal ')
            self.alert.check_alert_absence(' Old password not equal ')

            error = "Old password is not equal real password"
        else:
            error = f"Got unexpected alert type {alert_type}"

        return is_changed, error

### `check_content()`

Проверяет наличие и корректность всех элементов формы.

Source code in `components_derived\modal_change_password.py`

    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    def check_content(self):
        """Проверяет наличие и корректность всех элементов формы."""

        self.check_by_window_title()

        self.get_content_item("old_password_input").check_visibility(
                                  "Old password input form is missing"
                             )
        old_password_hidden_icon = self.get_content_item("old_password_hidden_icon")
        old_password_hidden_icon.check_visibility(
                                  "Old password hidden icon is missing"
                             )
        is_hidden_state = old_password_hidden_icon.is_password_hidden()
        assert is_hidden_state, "Old password hidden icon should be in hidden state"

        self.get_content_item("new_password_input").check_visibility(
                                  "New password input form is missing"
                             )
        new_password_hidden_icon = self.get_content_item("new_password_hidden_icon")
        new_password_hidden_icon.check_visibility(
                                  "New password hidden icon is missing"
                             )
        is_hidden_state = new_password_hidden_icon.is_password_hidden()
        assert is_hidden_state, "New password hidden icon should be in hidden state"

        self.get_content_item("confirm_password_input").check_visibility(
                                  "Confirm password input form is missing"
                             )
        confirm_password_hidden_icon = self.get_content_item("confirm_password_hidden_icon")
        confirm_password_hidden_icon.check_visibility(
                                  "Confirm password hidden icon is missing"
                             )
        is_hidden_state = confirm_password_hidden_icon.is_password_hidden()
        assert is_hidden_state, "Confirm password hidden icon should be in hidden state"

        self.check_button_visibility("cancel")

        button_save = self.get_button_by_name("save")
        is_disabled = button_save.is_disabled()
        assert is_disabled, "Button 'Сохранить' should be hidden"

### `check_error_message(text)`

Проверяет сообщение об ошибке, возникшее при заполнении полей формы.

Source code in `components_derived\modal_change_password.py`

    191
    192
    193
    194
    195
    def check_error_message(self, text: str) -> None:
        """Проверяет сообщение об ошибке, возникшее при заполнении полей формы."""

        error_message = self.get_content_item("input_form_error_message")
        error_message.check_have_text(text, "Unexpected error message")

### `click_cancel_button()`

Нажимает кнопку 'Отменить'

Source code in `components_derived\modal_change_password.py`

    84
    85
    86
    87
    def click_cancel_button(self) -> None:
        """Нажимает кнопку 'Отменить'"""

        self.get_button_by_name("cancel").click()

### `click_confirm_password_hidden_icon()`

Нажатие на иконку скрытия пароля подтверждения.

Source code in `components_derived\modal_change_password.py`

     99
    100
    101
    102
    def click_confirm_password_hidden_icon(self) -> None:
        """Нажатие на иконку скрытия пароля подтверждения."""

        self.get_content_item("confirm_password_hidden_icon").click()

### `click_new_password_hidden_icon()`

Нажатие на иконку скрытия нового пароля.

Source code in `components_derived\modal_change_password.py`

    94
    95
    96
    97
    def click_new_password_hidden_icon(self) -> None:
        """Нажатие на иконку скрытия нового пароля."""

        self.get_content_item("new_password_hidden_icon").click()

### `click_old_password_hidden_icon()`

Нажатие на иконку скрытия старого пароля.

Source code in `components_derived\modal_change_password.py`

    89
    90
    91
    92
    def click_old_password_hidden_icon(self) -> None:
        """Нажатие на иконку скрытия старого пароля."""

        self.get_content_item("old_password_hidden_icon").click()

### `get_password_inputs()`

Возвращает список полей ввода пароля (для тестовых целей).

Source code in `components_derived\modal_change_password.py`

    140
    141
    142
    143
    144
    145
    146
    147
    def get_password_inputs(self) -> []:
        """Возвращает список полей ввода пароля (для тестовых целей)."""

        text_inputs = []
        text_inputs.append(self.get_content_item("old_password_input"))
        text_inputs.append(self.get_content_item("new_password_input"))
        text_inputs.append(self.get_content_item("confirm_password_input"))
        return text_inputs