Добавлены тесты для иконок скрытия пароля
parent
c67460b486
commit
8a875caaca
|
|
@ -10,6 +10,7 @@ from locators.text_input_locators import TextInputLocators
|
|||
from locators.modal_window_locators import ModalWindowLocators
|
||||
from elements.text_element import Text
|
||||
from elements.text_input_element import TextInput
|
||||
from elements.icon_element import Icon
|
||||
from data.environment import host
|
||||
from components.modal_window_component import ModalWindowComponent
|
||||
from components.alert_component import AlertComponent
|
||||
|
|
@ -41,14 +42,29 @@ class ChangePasswordModalWindow(ModalWindowComponent):
|
|||
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")
|
||||
|
|
@ -70,6 +86,21 @@ class ChangePasswordModalWindow(ModalWindowComponent):
|
|||
|
||||
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):
|
||||
"""Заполняет элементы формы, нажимает кнопку 'Сохранить'"""
|
||||
|
||||
|
|
@ -124,12 +155,32 @@ class ChangePasswordModalWindow(ModalWindowComponent):
|
|||
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")
|
||||
|
||||
|
|
|
|||
|
|
@ -0,0 +1,40 @@
|
|||
"""Модуль icon_element содержит класс для работы с элементом типа иконка.
|
||||
|
||||
Класс Icon наследует базовый функционал BaseElement и предоставляет
|
||||
методы для работы с текстовыми элементами на странице.
|
||||
"""
|
||||
|
||||
from tools.logger import get_logger
|
||||
from elements.base_element import BaseElement
|
||||
|
||||
logger = get_logger("ICON")
|
||||
|
||||
class Icon(BaseElement):
|
||||
"""Класс для работы с элементом типа иконка.
|
||||
|
||||
Наследует функциональность BaseElement и добавляет специфичные
|
||||
методы для взаимодействия с элементом типа иконка.
|
||||
"""
|
||||
|
||||
@property
|
||||
def type_of(self) -> str:
|
||||
"""Возвращает тип элемента ('иконка').
|
||||
|
||||
Returns:
|
||||
str: Тип элемента - 'иконка'.
|
||||
"""
|
||||
|
||||
return "icon"
|
||||
|
||||
# Действия:
|
||||
# (Методы действий будут добавлены по мере необходимости)
|
||||
|
||||
# Проверки:
|
||||
def is_password_hidden(self) -> bool:
|
||||
"""Проверяет состояние иконки скрытия пароля."""
|
||||
|
||||
state_text = self.locator.text_content()
|
||||
state = True
|
||||
if state_text == "visibility":
|
||||
state = False
|
||||
return state
|
||||
|
|
@ -39,6 +39,15 @@ class TextInput(BaseElement):
|
|||
logger.info(f'Getting value from text input "{self.name}"')
|
||||
return self.locator.input_value()
|
||||
|
||||
def get_input_type(self) -> str:
|
||||
"""Возвращает значение аттрибута type поля ввода.
|
||||
|
||||
Returns:
|
||||
str: Значение аттрибута type.
|
||||
"""
|
||||
|
||||
return self.locator.get_attribute("type")
|
||||
|
||||
def input_value(self, value: str) -> None:
|
||||
"""Вводит указанное значение в поле.
|
||||
|
||||
|
|
|
|||
|
|
@ -12,3 +12,4 @@ class TextInputLocators:
|
|||
"""
|
||||
|
||||
INPUT_FORM_MESSAGE = "//div[contains(@class,'v-messages__message')]"
|
||||
ICON_PASSWORD_HIDING = "//i[contains(@class,'v-icon')]"
|
||||
|
|
|
|||
|
|
@ -5,7 +5,9 @@
|
|||
"""
|
||||
|
||||
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
|
||||
|
|
@ -34,11 +36,21 @@ class LoginPage(BasePage):
|
|||
|
||||
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:
|
||||
"""Выполняет вход в систему.
|
||||
|
||||
|
|
@ -103,3 +115,22 @@ class LoginPage(BasePage):
|
|||
|
||||
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"
|
||||
|
|
|
|||
|
|
@ -4,6 +4,7 @@
|
|||
входа и выхода из системы.
|
||||
"""
|
||||
|
||||
# import pytest
|
||||
from playwright.sync_api import Page
|
||||
from pages.main_page import MainPage
|
||||
from pages.login_page import LoginPage
|
||||
|
|
@ -15,6 +16,7 @@ class TestLogin:
|
|||
1. test_successful_login: Проверяет успешный вход в систему
|
||||
2. test_unsuccessful_login: Проверяет вход с неверными учетными данными
|
||||
3. test_successful_login_and_logout: Проверяет успешный вход и выход из системы
|
||||
4. test_password_visibility: Проверяет видимость символов пароля
|
||||
"""
|
||||
|
||||
def test_successful_login(self, browser: Page) -> None:
|
||||
|
|
@ -49,3 +51,38 @@ class TestLogin:
|
|||
|
||||
mp = MainPage(browser)
|
||||
mp.do_logout()
|
||||
|
||||
def test_password_visibility(self, browser: Page) -> None:
|
||||
"""Проверяет видимость символов пароля.
|
||||
|
||||
Args:
|
||||
browser: Экземпляр страницы Playwright.
|
||||
"""
|
||||
|
||||
lp = LoginPage(browser)
|
||||
lp.open("")
|
||||
|
||||
is_hidden_icon = lp.is_password_icon_hidden()
|
||||
|
||||
if is_hidden_icon:
|
||||
is_hidden = lp.is_password_hidden()
|
||||
assert is_hidden, "Password should be hidden"
|
||||
|
||||
# Нажатие на иконку скрытия пароля, пароль видим
|
||||
lp.click_password_hidden_icon()
|
||||
is_hidden_icon = lp.is_password_icon_hidden()
|
||||
is_hidden = lp.is_password_hidden()
|
||||
|
||||
assert not is_hidden_icon, "Password hidden icon should not be in hidden state"
|
||||
assert not is_hidden, "Password should be visible"
|
||||
else:
|
||||
is_hidden = lp.is_password_hidden()
|
||||
assert not is_hidden, "Password should be visible"
|
||||
|
||||
# Нажатие на иконку скрытия пароля, пароль скрыт
|
||||
lp.click_password_hidden_icon()
|
||||
is_hidden_icon = lp.is_password_icon_hidden()
|
||||
is_hidden = lp.is_password_hidden()
|
||||
|
||||
assert is_hidden_icon, "Password hidden icon should be in hidden state"
|
||||
assert is_hidden, "Password should be hidden"
|
||||
|
|
|
|||
|
|
@ -4,7 +4,7 @@
|
|||
карточки пользователя в приложении.
|
||||
"""
|
||||
|
||||
import pytest
|
||||
# import pytest
|
||||
from playwright.sync_api import Page
|
||||
from pages.users_tab import UsersTab
|
||||
from pages.main_page import MainPage
|
||||
|
|
@ -18,6 +18,11 @@ class TestUserCard:
|
|||
|
||||
Тесты покрывают следующие сценарии:
|
||||
1. test_user_card_content: Проверяет содержимое карточки пользователя
|
||||
2. test_open_close_user_settings_window: Проверяет возможность открытия и закрытия диалогового окна просмотра сессионных данных пользователя
|
||||
3. test_user_settings_window_content: Проверяет наличие и корректность элементов диалогового окна просмотра сессионных данных пользователя
|
||||
4. test_change_password_window_content: Проверяет наличие и корректность элементов окна изменения пароля текущего пользователя
|
||||
5. test_change_password_successful: Проверяет успешное изменение пароля текущего пользователя
|
||||
6. test_change_password_unsuccessful: Проверяет неуспешное изменение пароля текущего пользователя
|
||||
|
||||
Атрибуты:
|
||||
browser: Фикстура для работы с браузером.
|
||||
|
|
@ -167,7 +172,7 @@ class TestUserCard:
|
|||
is_changed, error = change_password_window.change_password(user_data["password"], user_data["new_password"])
|
||||
assert is_changed, f"Unsucessful attempt to change password: {error}"
|
||||
|
||||
@pytest.mark.develop
|
||||
# @pytest.mark.develop
|
||||
def test_change_password_unsuccessful(self, browser: Page,
|
||||
create_user: None,
|
||||
cleanup_user: None) -> None:
|
||||
|
|
|
|||
Loading…
Reference in New Issue