e-nms_qa_automation/pages/login_page.py

137 lines
5.7 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

"""Модуль страницы авторизации.
Содержит класс LoginPage для работы с элементами страницы входа в систему.
Использует Playwright для взаимодействия с UI и обработки ответов сервера.
"""
from playwright.sync_api import Page
from locators.text_input_locators import TextInputLocators
from elements.text_input_element import TextInput
from elements.icon_element import Icon
from elements.button_element import Button
from data.environment import host
from data.constants import Constants
from components.alert_component import AlertComponent
from pages.base_page import BasePage
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"