Skip to content

# LoginPage

Модуль страницы авторизации.

Содержит класс LoginPage для работы с элементами страницы входа в систему. Использует Playwright для взаимодействия с UI и обработки ответов сервера.

## `LoginPage`

Bases: `BasePage`

Класс для работы со страницей авторизации.

Атрибуты

page: Экземпляр страницы Playwright. login_input: Поле ввода логина. password_input: Поле ввода пароля. login_button: Кнопка входа. alert: Алерт окно с сообщением об ошибке.

Source code in `pages\login_page.py`

     17
     18
     19
     20
     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
    class LoginPage(BasePage):
        """Класс для работы со страницей авторизации.

        Атрибуты:
            page: Экземпляр страницы Playwright.
            login_input: Поле ввода логина.
            password_input: Поле ввода пароля.
            login_button: Кнопка входа.
            alert: Алерт окно с сообщением об ошибке.
        """

        def __init__(self, page: Page) -> None:
            """Инициализирует элементы страницы авторизации.

            Args:
                page: Экземпляр страницы Playwright.
            """

            super().__init__(page)

            self.login_input = TextInput(page, page.get_by_label("Имя пользователя"), "login input")
            self.password_input = TextInput(page, page.get_by_label("Пароль"), "password input")

            icon_locator = page.get_by_label("Пароль").locator("xpath=../..").locator(TextInputLocators.ICON_PASSWORD_HIDING)
            self.password_hidden_icon = Icon(page,
                                             icon_locator,
                                             "password hidden icon")
            self.login_button = Button(page, page.get_by_role("button"), "login button")

            self.alert = AlertComponent(page)

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

            self.password_hidden_icon.click()

        def do_login(self, username: str = None, password: str = None) -> None:
            """Выполняет вход в систему.

            Использует переданные учетные данные или значения из Constants.
            Обрабатывает ответ сервера для получения токена доступа.

            Args:
                username: Логин пользователя. По умолчанию из Constants.
                password: Пароль пользователя. По умолчанию из Constants.

            Raises:
                AssertionError: Если после входа открылась неожиданная страница.
            """

            def handle_response(response):
                if "login" in response.url:
                    response_body = self.get_response_body(response)
                    if response_body:
                        host.set_current_user_credential(response_body)

            self.page.on("response", handle_response)

            self.open("")

            # Используем переданные значения или значения по умолчанию из Constants
            actual_username = username if username is not None else Constants.login
            actual_password = password if password is not None else Constants.password

            self.login_input.clear()
            self.login_input.input_value(actual_username)

            self.password_input.clear()
            self.password_input.input_value(actual_password)

            self.login_button.click()

            self.check_URL("dashboard", "An unexpected page has been opened")

        def do_unsuccessful_login(self, username: str = "someuser", password: str = "password") -> None:
            """Выполняет попытку входа с неверными учетными данными.

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

            Args:
                username: Неверный логин. По умолчанию "someuser".
                password: Неверный пароль. По умолчанию "password".
            """

            self.open("")

            self.login_input.clear()
            self.login_input.input_value(username)

            self.password_input.clear()
            self.password_input.input_value(password)

            self.login_button.click()

            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("Неверная пара логин/пароль")
            self.alert.check_alert_absence("Неверная пара логин/пароль")

        # Проверки:
        def is_password_icon_hidden(self) -> bool:
            """Проверяет состояние иконки скрытия символов пароля.
               Возвращает True если пароль будет скрыт, иначе False
            """

            return self.password_hidden_icon.is_password_hidden()

        def is_password_hidden(self) -> bool:
            """Проверяет видимость символов пароля."""

            input_type = self.password_input.get_input_type()
            if input_type == "password":
                return True
            elif input_type == "text":
                return False
            else:
                assert False, "Check password hidden error"

### `__init__(page)`

Инициализирует элементы страницы авторизации.

Parameters:

Name | Type | Description | Default
--- | --- | --- | ---
`page` | `Page` | Экземпляр страницы Playwright. | required

Source code in `pages\login_page.py`

    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    def __init__(self, page: Page) -> None:
        """Инициализирует элементы страницы авторизации.

        Args:
            page: Экземпляр страницы Playwright.
        """

        super().__init__(page)

        self.login_input = TextInput(page, page.get_by_label("Имя пользователя"), "login input")
        self.password_input = TextInput(page, page.get_by_label("Пароль"), "password input")

        icon_locator = page.get_by_label("Пароль").locator("xpath=../..").locator(TextInputLocators.ICON_PASSWORD_HIDING)
        self.password_hidden_icon = Icon(page,
                                         icon_locator,
                                         "password hidden icon")
        self.login_button = Button(page, page.get_by_role("button"), "login button")

        self.alert = AlertComponent(page)

### `click_password_hidden_icon()`

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

Source code in `pages\login_page.py`

    49
    50
    51
    52
    def click_password_hidden_icon(self) -> None:
        """Нажатие на иконку скрытия пароля."""

        self.password_hidden_icon.click()

### `do_login(username=None, password=None)`

Выполняет вход в систему.

Использует переданные учетные данные или значения из Constants. Обрабатывает ответ сервера для получения токена доступа.

Parameters:

Name | Type | Description | Default
--- | --- | --- | ---
`username` | `str` | Логин пользователя. По умолчанию из Constants. | `None`
`password` | `str` | Пароль пользователя. По умолчанию из Constants. | `None`

Raises:

Type | Description
--- | ---
`AssertionError` | Если после входа открылась неожиданная страница.

Source code in `pages\login_page.py`

    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
    def do_login(self, username: str = None, password: str = None) -> None:
        """Выполняет вход в систему.

        Использует переданные учетные данные или значения из Constants.
        Обрабатывает ответ сервера для получения токена доступа.

        Args:
            username: Логин пользователя. По умолчанию из Constants.
            password: Пароль пользователя. По умолчанию из Constants.

        Raises:
            AssertionError: Если после входа открылась неожиданная страница.
        """

        def handle_response(response):
            if "login" in response.url:
                response_body = self.get_response_body(response)
                if response_body:
                    host.set_current_user_credential(response_body)

        self.page.on("response", handle_response)

        self.open("")

        # Используем переданные значения или значения по умолчанию из Constants
        actual_username = username if username is not None else Constants.login
        actual_password = password if password is not None else Constants.password

        self.login_input.clear()
        self.login_input.input_value(actual_username)

        self.password_input.clear()
        self.password_input.input_value(actual_password)

        self.login_button.click()

        self.check_URL("dashboard", "An unexpected page has been opened")

### `do_unsuccessful_login(username='someuser', password='password')`

Выполняет попытку входа с неверными учетными данными.

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

Parameters:

Name | Type | Description | Default
--- | --- | --- | ---
`username` | `str` | Неверный логин. По умолчанию "someuser". | `'someuser'`
`password` | `str` | Неверный пароль. По умолчанию "password". | `'password'`

Source code in `pages\login_page.py`

     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
    def do_unsuccessful_login(self, username: str = "someuser", password: str = "password") -> None:
        """Выполняет попытку входа с неверными учетными данными.

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

        Args:
            username: Неверный логин. По умолчанию "someuser".
            password: Неверный пароль. По умолчанию "password".
        """

        self.open("")

        self.login_input.clear()
        self.login_input.input_value(username)

        self.password_input.clear()
        self.password_input.input_value(password)

        self.login_button.click()

        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("Неверная пара логин/пароль")
        self.alert.check_alert_absence("Неверная пара логин/пароль")

### `is_password_hidden()`

Проверяет видимость символов пароля.

Source code in `pages\login_page.py`

    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    def is_password_hidden(self) -> bool:
        """Проверяет видимость символов пароля."""

        input_type = self.password_input.get_input_type()
        if input_type == "password":
            return True
        elif input_type == "text":
            return False
        else:
            assert False, "Check password hidden error"

### `is_password_icon_hidden()`

Проверяет состояние иконки скрытия символов пароля. Возвращает True если пароль будет скрыт, иначе False

Source code in `pages\login_page.py`

    120
    121
    122
    123
    124
    125
    def is_password_icon_hidden(self) -> bool:
        """Проверяет состояние иконки скрытия символов пароля.
           Возвращает True если пароль будет скрыт, иначе False
        """

        return self.password_hidden_icon.is_password_hidden()