Правка code style, актуализация тестов под текущие изменения GUI
parent
ce6fe0390c
commit
10315ba38f
|
|
@ -8,3 +8,8 @@ tooltiplocator
|
||||||
- pages\users_tab.py - переписана функция should_be_toolbar_buttons
|
- pages\users_tab.py - переписана функция should_be_toolbar_buttons
|
||||||
- pages\session_tab.py - вкладка "Сессии"
|
- pages\session_tab.py - вкладка "Сессии"
|
||||||
- tests\e2e\test_sessions_tab.py - тест вкладки "Сессии"
|
- tests\e2e\test_sessions_tab.py - тест вкладки "Сессии"
|
||||||
|
===================23.07.2025==========================
|
||||||
|
- Все файлы прошли проверку pylint, внесены исправления для фикса замечаний линтера
|
||||||
|
- Возвращено заведение пользователя с введением пароля
|
||||||
|
- Актуализированы тесты под текущее состояние интерфейса пользователя версии 1.7
|
||||||
|
|
||||||
|
|
@ -1,9 +1,7 @@
|
||||||
from playwright.sync_api import Page, expect
|
from playwright.sync_api import Page, expect
|
||||||
|
|
||||||
from components.base_component import BaseComponent
|
|
||||||
from elements.text_element import Text
|
|
||||||
|
|
||||||
from tools.logger import get_logger
|
from tools.logger import get_logger
|
||||||
|
from elements.text_element import Text
|
||||||
|
from components.base_component import BaseComponent
|
||||||
|
|
||||||
logger = get_logger("ALERT")
|
logger = get_logger("ALERT")
|
||||||
|
|
||||||
|
|
@ -29,6 +27,7 @@ class AlertComponent(BaseComponent):
|
||||||
Raises:
|
Raises:
|
||||||
ValueError: если передан неподдерживаемый тип alert-окна
|
ValueError: если передан неподдерживаемый тип alert-окна
|
||||||
"""
|
"""
|
||||||
|
|
||||||
super().__init__(page)
|
super().__init__(page)
|
||||||
|
|
||||||
alert_types = ["error", "success", "info", "warning"]
|
alert_types = ["error", "success", "info", "warning"]
|
||||||
|
|
@ -45,10 +44,11 @@ class AlertComponent(BaseComponent):
|
||||||
Returns:
|
Returns:
|
||||||
str: текст сообщения alert-окна
|
str: текст сообщения alert-окна
|
||||||
"""
|
"""
|
||||||
|
|
||||||
return self.text.get_text(0)
|
return self.text.get_text(0)
|
||||||
|
|
||||||
# Проверки:
|
# Проверки:
|
||||||
def check_presence(self, text: str):
|
def check_alert_presence(self, text: str):
|
||||||
"""Проверка наличия alert-окна с заданным текстом.
|
"""Проверка наличия alert-окна с заданным текстом.
|
||||||
|
|
||||||
Args:
|
Args:
|
||||||
|
|
@ -57,13 +57,14 @@ class AlertComponent(BaseComponent):
|
||||||
Raises:
|
Raises:
|
||||||
AssertionError: если alert-окно не найдено
|
AssertionError: если alert-окно не найдено
|
||||||
"""
|
"""
|
||||||
|
|
||||||
msg = f"No {self.alert_type} alert window on page"
|
msg = f"No {self.alert_type} alert window on page"
|
||||||
if text == "":
|
if text == "":
|
||||||
expect(self.page.get_by_role("alert")).to_be_visible(), msg
|
expect(self.page.get_by_role("alert")).to_be_visible(), msg
|
||||||
else:
|
else:
|
||||||
expect(self.page.get_by_role("alert").filter(has_text=text)).to_be_visible(), msg
|
expect(self.page.get_by_role("alert").filter(has_text=text)).to_be_visible(), msg
|
||||||
|
|
||||||
def check_absence(self, text: str, timeout: int = 30000):
|
def check_alert_absence(self, text: str, timeout: int = 30000):
|
||||||
"""Проверка отсутствия alert-окна с заданным текстом.
|
"""Проверка отсутствия alert-окна с заданным текстом.
|
||||||
|
|
||||||
Args:
|
Args:
|
||||||
|
|
@ -86,4 +87,6 @@ class AlertComponent(BaseComponent):
|
||||||
Raises:
|
Raises:
|
||||||
AssertionError: если текст не соответствует ожидаемому
|
AssertionError: если текст не соответствует ожидаемому
|
||||||
"""
|
"""
|
||||||
self.text.check_have_text(alert_text, f"Unexpected message in alert {self.alert_type} window")
|
|
||||||
|
self.text.check_have_text(alert_text,
|
||||||
|
f"Unexpected message in alert {self.alert_type} window")
|
||||||
|
|
|
||||||
|
|
@ -1,17 +1,42 @@
|
||||||
from playwright.sync_api import Page, Locator, expect
|
from playwright.sync_api import Page, Locator, expect
|
||||||
|
|
||||||
from tools.logger import get_logger
|
from tools.logger import get_logger
|
||||||
|
|
||||||
logger = get_logger("BASE_COMPONENT")
|
logger = get_logger("BASE_COMPONENT")
|
||||||
|
|
||||||
|
|
||||||
class BaseComponent:
|
class BaseComponent:
|
||||||
"""Базовый компонент для работы с элементами страницы."""
|
"""Базовый компонент для работы с элементами страницы.
|
||||||
|
|
||||||
|
Предоставляет общие методы для взаимодействия с элементами:
|
||||||
|
- получение локаторов
|
||||||
|
- проверка видимости элементов
|
||||||
|
- работа с прокруткой
|
||||||
|
|
||||||
|
Атрибуты:
|
||||||
|
page: экземпляр страницы Playwright
|
||||||
|
"""
|
||||||
|
|
||||||
def __init__(self, page: Page):
|
def __init__(self, page: Page):
|
||||||
|
"""Инициализация базового компонента.
|
||||||
|
|
||||||
|
Args:
|
||||||
|
page: экземпляр страницы Playwright
|
||||||
|
"""
|
||||||
self.page = page
|
self.page = page
|
||||||
|
|
||||||
|
# Действия:
|
||||||
def get_locator(self, locator: str | Locator) -> Locator:
|
def get_locator(self, locator: str | Locator) -> Locator:
|
||||||
|
"""Получение объекта Locator из строки или существующего Locator.
|
||||||
|
|
||||||
|
Args:
|
||||||
|
locator: строка с CSS/XPath селектором или объект Locator
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
Locator: объект для работы с элементом
|
||||||
|
|
||||||
|
Raises:
|
||||||
|
TypeError: если передан некорректный тип локатора
|
||||||
|
"""
|
||||||
if isinstance(locator, Locator):
|
if isinstance(locator, Locator):
|
||||||
return locator
|
return locator
|
||||||
elif isinstance(locator, str):
|
elif isinstance(locator, str):
|
||||||
|
|
@ -19,30 +44,128 @@ class BaseComponent:
|
||||||
else:
|
else:
|
||||||
raise TypeError("locator value should be string type or Locator type")
|
raise TypeError("locator value should be string type or Locator type")
|
||||||
|
|
||||||
def check_presence(self, locator: str | Locator, msg: str):
|
# Закомментированный код сохранен без изменений
|
||||||
|
# def wait_for_all_elements(self, locator: Locator, timeout=5000):
|
||||||
|
# loc = self.get_locator(locator)
|
||||||
|
# elements = self.page.locator(loc).all()
|
||||||
|
#
|
||||||
|
# for element in elements:
|
||||||
|
# self.page.locator(loc).wait_for(timeout=timeout)
|
||||||
|
#
|
||||||
|
# return elements
|
||||||
|
|
||||||
|
# Проверки:
|
||||||
|
def check_presence(self, locator, msg):
|
||||||
|
"""Проверка видимости элемента на странице.
|
||||||
|
|
||||||
|
Args:
|
||||||
|
locator: локатор элемента (строка или объект Locator)
|
||||||
|
msg: сообщение об ошибке при неудачной проверке
|
||||||
|
|
||||||
|
Raises:
|
||||||
|
AssertionError: если элемент не виден на странице
|
||||||
|
"""
|
||||||
loc = self.get_locator(locator)
|
loc = self.get_locator(locator)
|
||||||
expect(loc).to_be_visible(visible=True, timeout=12000), msg
|
expect(loc).to_be_visible(visible=True, timeout=12000), msg
|
||||||
|
|
||||||
def is_scrollable_vertically(self, locator: str | Locator) -> bool:
|
def is_scrollable_vertically(self, locator) -> bool:
|
||||||
|
"""Проверка возможности вертикальной прокрутки элемента.
|
||||||
|
|
||||||
|
Args:
|
||||||
|
locator: локатор элемента
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
bool: True если элемент можно прокрутить вертикально
|
||||||
|
"""
|
||||||
loc = self.get_locator(locator)
|
loc = self.get_locator(locator)
|
||||||
return loc.evaluate("el => el.scrollHeight > el.clientHeight")
|
return loc.evaluate("el => el.scrollHeight > el.clientHeight")
|
||||||
|
|
||||||
def is_scrollable_horizontally(self, locator: str | Locator) -> bool:
|
def is_scrollable_horizontally(self, locator) -> bool:
|
||||||
|
"""Проверка возможности горизонтальной прокрутки элемента.
|
||||||
|
|
||||||
|
Args:
|
||||||
|
locator: локатор элемента
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
bool: True если элемент можно прокрутить горизонтально
|
||||||
|
"""
|
||||||
loc = self.get_locator(locator)
|
loc = self.get_locator(locator)
|
||||||
return loc.evaluate("el => el.scrollWidth > el.clientWidth")
|
return loc.evaluate("el => el.scrollWidth > el.clientWidth")
|
||||||
|
|
||||||
def scroll_up(self, locator: str | Locator):
|
# Методы прокрутки:
|
||||||
|
def scroll_up(self, locator):
|
||||||
|
"""Прокрутка элемента вверх.
|
||||||
|
|
||||||
|
Args:
|
||||||
|
locator: локатор элемента
|
||||||
|
|
||||||
|
Raises:
|
||||||
|
AssertionError: если прокрутка не выполнена до конца
|
||||||
|
"""
|
||||||
loc = self.get_locator(locator)
|
loc = self.get_locator(locator)
|
||||||
loc.evaluate("el => el.scrollTo(0, 0)")
|
loc.evaluate("el => el.scrollTo(0, 0)")
|
||||||
|
loc.wait_for(timeout=2000)
|
||||||
|
|
||||||
def scroll_down(self, locator: str | Locator):
|
# Проверка позиции прокрутки
|
||||||
|
scroll_position = loc.evaluate("el => el.scrollTop")
|
||||||
|
assert scroll_position == 0, "Invalid postion after scroll up"
|
||||||
|
|
||||||
|
def scroll_down(self, locator):
|
||||||
|
"""Прокрутка элемента вниз.
|
||||||
|
|
||||||
|
Args:
|
||||||
|
locator: локатор элемента
|
||||||
|
|
||||||
|
Raises:
|
||||||
|
AssertionError: если прокрутка не выполнена до конца
|
||||||
|
"""
|
||||||
loc = self.get_locator(locator)
|
loc = self.get_locator(locator)
|
||||||
loc.evaluate("el => el.scrollTo(0, el.scrollHeight)")
|
loc.evaluate("el => el.scrollTo(0, el.scrollHeight)")
|
||||||
|
loc.wait_for(timeout=2000)
|
||||||
|
|
||||||
def scroll_left(self, locator: str | Locator):
|
# Проверка позиции прокрутки
|
||||||
loc = self.get_locator(locator)
|
scroll_position = loc.evaluate("el => el.scrollTop")
|
||||||
width = loc.evaluate("el => el.scrollWidth")
|
assert scroll_position > 0, "Invalid postion after scroll down"
|
||||||
|
|
||||||
def scroll_right(self, locator: str | Locator):
|
def scroll_left(self, locator):
|
||||||
|
"""Прокрутка элемента влево.
|
||||||
|
|
||||||
|
Args:
|
||||||
|
locator: локатор элемента
|
||||||
|
|
||||||
|
Raises:
|
||||||
|
AssertionError: если прокрутка не выполнена до конца
|
||||||
|
"""
|
||||||
loc = self.get_locator(locator)
|
loc = self.get_locator(locator)
|
||||||
|
|
||||||
width = loc.evaluate("el => el.scrollWidth")
|
width = loc.evaluate("el => el.scrollWidth")
|
||||||
|
loc.scroll_into_view_if_needed()
|
||||||
|
self.page.mouse.wheel(-width, 0)
|
||||||
|
|
||||||
|
loc.wait_for(timeout=2000)
|
||||||
|
|
||||||
|
# Проверка позиции прокрутки
|
||||||
|
scroll_position = loc.evaluate("el => el.scrollLeft")
|
||||||
|
assert scroll_position == 0, "Invalid postion after scroll left"
|
||||||
|
|
||||||
|
def scroll_right(self, locator):
|
||||||
|
"""Прокрутка элемента вправо.
|
||||||
|
|
||||||
|
Args:
|
||||||
|
locator: локатор элемента
|
||||||
|
|
||||||
|
Raises:
|
||||||
|
AssertionError: если прокрутка не выполнена до конца
|
||||||
|
"""
|
||||||
|
loc = self.get_locator(locator)
|
||||||
|
|
||||||
|
width = loc.evaluate("el => el.scrollWidth")
|
||||||
|
loc.scroll_into_view_if_needed()
|
||||||
|
self.page.mouse.wheel(width, 0)
|
||||||
|
|
||||||
|
loc.wait_for(timeout=2000)
|
||||||
|
|
||||||
|
# Проверка позиции прокрутки
|
||||||
|
scroll_position = loc.evaluate("el => el.scrollLeft")
|
||||||
|
max_scroll_x = loc.evaluate("el => el.scrollWidth - el.clientWidth")
|
||||||
|
assert scroll_position >= max_scroll_x, "Invalid postion after scroll right"
|
||||||
|
|
|
||||||
|
|
@ -1,9 +1,7 @@
|
||||||
from playwright.sync_api import Page
|
from playwright.sync_api import Page
|
||||||
|
|
||||||
from components.base_component import BaseComponent
|
|
||||||
from elements.button_element import Button
|
|
||||||
|
|
||||||
from tools.logger import get_logger
|
from tools.logger import get_logger
|
||||||
|
from elements.button_element import Button
|
||||||
|
from components.base_component import BaseComponent
|
||||||
|
|
||||||
logger = get_logger("USER_CARD")
|
logger = get_logger("USER_CARD")
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,11 +1,9 @@
|
||||||
from playwright.sync_api import Page
|
from playwright.sync_api import Page
|
||||||
|
|
||||||
from components.base_component import BaseComponent
|
|
||||||
from elements.button_element import Button
|
|
||||||
from elements.text_element import Text
|
|
||||||
from locators.confirm_locators import ConfirmLocators
|
|
||||||
|
|
||||||
from tools.logger import get_logger
|
from tools.logger import get_logger
|
||||||
|
from locators.confirm_locators import ConfirmLocators
|
||||||
|
from elements.text_element import Text
|
||||||
|
from elements.button_element import Button
|
||||||
|
from components.base_component import BaseComponent
|
||||||
|
|
||||||
logger = get_logger("CONFIRM_WINDOW")
|
logger = get_logger("CONFIRM_WINDOW")
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,9 +1,8 @@
|
||||||
from playwright.sync_api import Page
|
|
||||||
import json
|
import json
|
||||||
import jsondiff
|
import jsondiff
|
||||||
|
from playwright.sync_api import Page
|
||||||
from components.base_component import BaseComponent
|
|
||||||
from tools.logger import get_logger
|
from tools.logger import get_logger
|
||||||
|
from components.base_component import BaseComponent
|
||||||
|
|
||||||
logger = get_logger("JSON_CONTAINER")
|
logger = get_logger("JSON_CONTAINER")
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,11 +1,9 @@
|
||||||
from playwright.sync_api import Page
|
from playwright.sync_api import Page
|
||||||
|
|
||||||
from components.base_component import BaseComponent
|
|
||||||
from components.toolbar_component import ToolbarComponent
|
|
||||||
from elements.button_element import Button
|
|
||||||
from locators.modal_window_locators import ModalWindowLocators
|
|
||||||
|
|
||||||
from tools.logger import get_logger
|
from tools.logger import get_logger
|
||||||
|
from locators.modal_window_locators import ModalWindowLocators
|
||||||
|
from elements.button_element import Button
|
||||||
|
from components.toolbar_component import ToolbarComponent
|
||||||
|
from components.base_component import BaseComponent
|
||||||
|
|
||||||
logger = get_logger("MODAL_WINDOW")
|
logger = get_logger("MODAL_WINDOW")
|
||||||
|
|
||||||
|
|
@ -85,7 +83,7 @@ class ModalWindowComponent(BaseComponent):
|
||||||
|
|
||||||
def check_by_window_title(self) -> None:
|
def check_by_window_title(self) -> None:
|
||||||
"""Проверка наличия окна по заголовку."""
|
"""Проверка наличия окна по заголовку."""
|
||||||
self.toolbar.check_presence(f"Modal window with '{self.toolbar.title}' is missing")
|
self.toolbar.check_toolbar_presence(f"Modal window with '{self.toolbar.title}' is missing")
|
||||||
|
|
||||||
def check_button_presence(self, name: str) -> None:
|
def check_button_presence(self, name: str) -> None:
|
||||||
"""Проверка наличия кнопки по имени."""
|
"""Проверка наличия кнопки по имени."""
|
||||||
|
|
|
||||||
|
|
@ -1,9 +1,7 @@
|
||||||
from playwright.sync_api import Page, Locator
|
from playwright.sync_api import Page, Locator
|
||||||
|
|
||||||
from components.base_component import BaseComponent
|
|
||||||
from locators.navigation_panel_locators import NavigationPanelLocators
|
|
||||||
|
|
||||||
from tools.logger import get_logger
|
from tools.logger import get_logger
|
||||||
|
from locators.navigation_panel_locators import NavigationPanelLocators
|
||||||
|
from components.base_component import BaseComponent
|
||||||
|
|
||||||
logger = get_logger("NAVIGATION_PANEL")
|
logger = get_logger("NAVIGATION_PANEL")
|
||||||
|
|
||||||
|
|
@ -42,6 +40,17 @@ class NavigationPanelComponent(BaseComponent):
|
||||||
# Проверки:
|
# Проверки:
|
||||||
def check_item_visibility(self, locator: str | Locator, item_name: str) -> None:
|
def check_item_visibility(self, locator: str | Locator, item_name: str) -> None:
|
||||||
"""Проверяет видимость элемента с указанным текстом."""
|
"""Проверяет видимость элемента с указанным текстом."""
|
||||||
loc = self.get_locator(locator).get_by_text(item_name)
|
|
||||||
msg = f"Navigation panel item '{item_name}' is not visible"
|
msg = f"Navigation panel item '{item_name}' is not visible"
|
||||||
|
|
||||||
|
## временно: в навигационной панели есть две панели с именем Шаблоны
|
||||||
|
## для их различия добавлены индексы Шаблоны_1 для Настройки/Шаблоны
|
||||||
|
## Шаблоны_2 для Настройки/ZTP/Шаблоны
|
||||||
|
loc = self.get_locator(locator)
|
||||||
|
if item_name == "Шаблоны_1":
|
||||||
|
loc = loc.get_by_text("Шаблоны").first
|
||||||
|
elif item_name == "Шаблоны_2":
|
||||||
|
loc = loc.get_by_text("Шаблоны").nth(1)
|
||||||
|
else:
|
||||||
|
loc = loc.get_by_text(item_name)
|
||||||
self.check_presence(loc, msg)
|
self.check_presence(loc, msg)
|
||||||
|
|
@ -1,8 +1,6 @@
|
||||||
from playwright.sync_api import Page, expect, Locator
|
from playwright.sync_api import Page, expect, Locator
|
||||||
|
|
||||||
from components.base_component import BaseComponent
|
|
||||||
|
|
||||||
from tools.logger import get_logger
|
from tools.logger import get_logger
|
||||||
|
from components.base_component import BaseComponent
|
||||||
|
|
||||||
logger = get_logger("TABLE")
|
logger = get_logger("TABLE")
|
||||||
|
|
||||||
|
|
@ -14,6 +12,17 @@ class TableComponent(BaseComponent):
|
||||||
super().__init__(page)
|
super().__init__(page)
|
||||||
|
|
||||||
# Действия:
|
# Действия:
|
||||||
|
def get_row_locator(self, table_locator, row_index) -> Locator | None:
|
||||||
|
"""Конструирует локатор для строки с заданным индексом."""
|
||||||
|
table = self.get_locator(table_locator)
|
||||||
|
|
||||||
|
rows = table.locator("//tbody/tr")
|
||||||
|
|
||||||
|
if row_index in range(rows.count()):
|
||||||
|
return rows.nth(row_index)
|
||||||
|
else:
|
||||||
|
return None
|
||||||
|
|
||||||
def read(self, locator: str | Locator) -> list[list[str]]:
|
def read(self, locator: str | Locator) -> list[list[str]]:
|
||||||
"""Читает данные из таблицы."""
|
"""Читает данные из таблицы."""
|
||||||
table_data = []
|
table_data = []
|
||||||
|
|
@ -65,4 +74,4 @@ class TableComponent(BaseComponent):
|
||||||
self.page.wait_for_timeout(300)
|
self.page.wait_for_timeout(300)
|
||||||
|
|
||||||
new_color = hover_element.evaluate("el => window.getComputedStyle(el).backgroundColor")
|
new_color = hover_element.evaluate("el => window.getComputedStyle(el).backgroundColor")
|
||||||
assert initial_color == new_color, "Color of row did not change when hovering the cursor"
|
assert initial_color != new_color, "Color of row did not change when hovering the cursor"
|
||||||
|
|
|
||||||
|
|
@ -1,8 +1,8 @@
|
||||||
from playwright.sync_api import Page, expect, Locator
|
from playwright.sync_api import Page, expect, Locator
|
||||||
from components.base_component import BaseComponent
|
|
||||||
from elements.tooltip_button_element import TooltipButton
|
|
||||||
from locators.toolbar_locators import ToolbarLocators
|
|
||||||
from tools.logger import get_logger
|
from tools.logger import get_logger
|
||||||
|
from locators.toolbar_locators import ToolbarLocators
|
||||||
|
from elements.tooltip_button_element import TooltipButton
|
||||||
|
from components.base_component import BaseComponent
|
||||||
|
|
||||||
logger = get_logger("TOOLBAR")
|
logger = get_logger("TOOLBAR")
|
||||||
|
|
||||||
|
|
@ -105,7 +105,7 @@ class ToolbarComponent(BaseComponent):
|
||||||
raise AssertionError(f"Unsupported button name {name}")
|
raise AssertionError(f"Unsupported button name {name}")
|
||||||
return button.is_not_present(timeout=1000) # Ожидание 1 секунда
|
return button.is_not_present(timeout=1000) # Ожидание 1 секунда
|
||||||
|
|
||||||
def check_presence(self, message: str) -> None:
|
def check_toolbar_presence(self, message: str) -> None:
|
||||||
"""Проверяет видимость тулбара.
|
"""Проверяет видимость тулбара.
|
||||||
|
|
||||||
Args:
|
Args:
|
||||||
|
|
|
||||||
|
|
@ -1,8 +1,7 @@
|
||||||
from dotenv import load_dotenv
|
|
||||||
import inspect
|
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
import pytest
|
|
||||||
import os
|
import os
|
||||||
|
import inspect
|
||||||
|
from dotenv import load_dotenv
|
||||||
|
|
||||||
load_dotenv()
|
load_dotenv()
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,5 @@
|
||||||
import os
|
import os
|
||||||
|
|
||||||
|
|
||||||
class Constants:
|
class Constants:
|
||||||
"""Класс для хранения констант и переменных окружения.
|
"""Класс для хранения констант и переменных окружения.
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,5 @@
|
||||||
import os
|
import os
|
||||||
from typing import Dict, Optional
|
from typing import Dict
|
||||||
|
|
||||||
|
|
||||||
class Environment:
|
class Environment:
|
||||||
"""Класс для работы с окружением и URL-адресами."""
|
"""Класс для работы с окружением и URL-адресами."""
|
||||||
|
|
|
||||||
|
|
@ -1,11 +1,8 @@
|
||||||
from playwright.sync_api import Page, Locator, expect, TimeoutError
|
from playwright.sync_api import Page, Locator, expect, TimeoutError
|
||||||
from typing import Optional
|
|
||||||
|
|
||||||
from tools.logger import get_logger
|
from tools.logger import get_logger
|
||||||
|
|
||||||
logger = get_logger("BASE_ELEMENT")
|
logger = get_logger("BASE_ELEMENT")
|
||||||
|
|
||||||
|
|
||||||
class BaseElement:
|
class BaseElement:
|
||||||
"""Базовый класс для работы с элементами страницы."""
|
"""Базовый класс для работы с элементами страницы."""
|
||||||
|
|
||||||
|
|
@ -27,29 +24,29 @@ class BaseElement:
|
||||||
|
|
||||||
# Действия:
|
# Действия:
|
||||||
def click(self) -> None:
|
def click(self) -> None:
|
||||||
logger.info(f'Clicking {self.type_of} "{self.name}"')
|
logger.info(f"Clicking {self.type_of} '{self.name}'")
|
||||||
self.locator.click()
|
self.locator.click()
|
||||||
|
|
||||||
def get_text(self, index: int) -> str:
|
def get_text(self, index: int) -> str:
|
||||||
logger.info(f'Get text for {self.type_of} "{self.name}"')
|
logger.info(f"Get text for {self.type_of} '{self.name}'")
|
||||||
return self.locator.nth(index).text_content()
|
return self.locator.nth(index).text_content()
|
||||||
|
|
||||||
def wait_for_element(self, timeout: int = 12000) -> None:
|
def wait_for_element(self, timeout: int = 12000) -> None:
|
||||||
logger.info(f'Wait for {self.type_of} "{self.name}"')
|
logger.info(f"Wait for {self.type_of} '{self.name}'")
|
||||||
self.locator.wait_for(timeout=timeout)
|
self.locator.wait_for(timeout=timeout)
|
||||||
|
|
||||||
# Проверки:
|
# Проверки:
|
||||||
def check_have_text(self, text: str, msg: str) -> None:
|
def check_have_text(self, text: str, msg: str) -> None:
|
||||||
logger.info(f'Check that {self.type_of} "{self.name}" has text "{text}"')
|
logger.info(f"Check that {self.type_of} '{self.name}' has text '{text}'")
|
||||||
expect(self.locator).to_have_text(text), msg
|
expect(self.locator).to_have_text(text), msg
|
||||||
|
|
||||||
def check_presence(self, msg: str) -> None:
|
def check_presence(self, msg: str) -> None:
|
||||||
logger.info(f'Check that {self.type_of} "{self.name}" is present')
|
logger.info(f"Check that {self.type_of} '{self.name}' is present")
|
||||||
print(self.locator)
|
print(self.locator)
|
||||||
expect(self.locator).to_be_visible(visible=True, timeout=12000), msg
|
expect(self.locator).to_be_visible(visible=True, timeout=12000), msg
|
||||||
|
|
||||||
def is_present(self, timeout: int = 5000) -> bool:
|
def is_present(self, timeout: int = 5000) -> bool:
|
||||||
logger.info(f'Check that {self.type_of} "{self.name}" is present')
|
logger.info(f"Check that {self.type_of} '{self.name}' is present")
|
||||||
try:
|
try:
|
||||||
self.locator.wait_for(timeout=timeout)
|
self.locator.wait_for(timeout=timeout)
|
||||||
except TimeoutError:
|
except TimeoutError:
|
||||||
|
|
@ -57,7 +54,7 @@ class BaseElement:
|
||||||
return True
|
return True
|
||||||
|
|
||||||
def is_not_present(self, timeout: int = 5000) -> bool:
|
def is_not_present(self, timeout: int = 5000) -> bool:
|
||||||
logger.info(f'Check that {self.type_of} "{self.name}" is missing')
|
logger.info(f"Check that {self.type_of} '{self.name}' is missing")
|
||||||
try:
|
try:
|
||||||
self.locator.wait_for(timeout=timeout)
|
self.locator.wait_for(timeout=timeout)
|
||||||
except TimeoutError:
|
except TimeoutError:
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,5 @@
|
||||||
from playwright.sync_api import expect
|
|
||||||
|
|
||||||
from elements.base_element import BaseElement
|
|
||||||
from tools.logger import get_logger
|
from tools.logger import get_logger
|
||||||
|
from elements.base_element import BaseElement
|
||||||
|
|
||||||
logger = get_logger("BUTTON")
|
logger = get_logger("BUTTON")
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,5 @@
|
||||||
from elements.base_element import BaseElement
|
|
||||||
from tools.logger import get_logger
|
from tools.logger import get_logger
|
||||||
|
from elements.base_element import BaseElement
|
||||||
|
|
||||||
logger = get_logger("CHECKBOX")
|
logger = get_logger("CHECKBOX")
|
||||||
|
|
||||||
|
|
@ -22,12 +22,12 @@ class Checkbox(BaseElement):
|
||||||
# Действия:
|
# Действия:
|
||||||
def check(self) -> None:
|
def check(self) -> None:
|
||||||
"""Устанавливает чекбокс в отмеченное состояние."""
|
"""Устанавливает чекбокс в отмеченное состояние."""
|
||||||
logger.info(f'Checking checkbox "{self.name}"')
|
logger.info(f"Checking checkbox '{self.name}'")
|
||||||
self.locator.check()
|
self.locator.check()
|
||||||
|
|
||||||
def uncheck(self) -> None:
|
def uncheck(self) -> None:
|
||||||
"""Снимает отметку с чекбокса."""
|
"""Снимает отметку с чекбокса."""
|
||||||
logger.info(f'Unchecking checkbox "{self.name}"')
|
logger.info(f"Unchecking checkbox '{self.name}'")
|
||||||
self.locator.uncheck()
|
self.locator.uncheck()
|
||||||
|
|
||||||
# Проверки:
|
# Проверки:
|
||||||
|
|
@ -37,5 +37,5 @@ class Checkbox(BaseElement):
|
||||||
Returns:
|
Returns:
|
||||||
True, если чекбокс отмечен, иначе False.
|
True, если чекбокс отмечен, иначе False.
|
||||||
"""
|
"""
|
||||||
logger.info(f'Checking if checkbox "{self.name}" is checked')
|
logger.info(f"Checking if checkbox '{self.name}' is checked")
|
||||||
return self.locator.is_checked()
|
return self.locator.is_checked()
|
||||||
|
|
@ -1,10 +1,8 @@
|
||||||
from playwright.sync_api import expect
|
|
||||||
from elements.base_element import BaseElement
|
|
||||||
from tools.logger import get_logger
|
from tools.logger import get_logger
|
||||||
|
from elements.base_element import BaseElement
|
||||||
|
|
||||||
logger = get_logger("DROPDOWN_LIST")
|
logger = get_logger("DROPDOWN_LIST")
|
||||||
|
|
||||||
|
|
||||||
class DropdownList(BaseElement):
|
class DropdownList(BaseElement):
|
||||||
"""Класс для работы с выпадающими списками на странице.
|
"""Класс для работы с выпадающими списками на странице.
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,9 +1,8 @@
|
||||||
from elements.base_element import BaseElement
|
|
||||||
from tools.logger import get_logger
|
from tools.logger import get_logger
|
||||||
|
from elements.base_element import BaseElement
|
||||||
|
|
||||||
logger = get_logger("TEXT")
|
logger = get_logger("TEXT")
|
||||||
|
|
||||||
|
|
||||||
class Text(BaseElement):
|
class Text(BaseElement):
|
||||||
"""Класс для работы с текстовыми элементами на странице.
|
"""Класс для работы с текстовыми элементами на странице.
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
from playwright.sync_api import expect
|
from playwright.sync_api import expect
|
||||||
from elements.base_element import BaseElement
|
|
||||||
from tools.logger import get_logger
|
from tools.logger import get_logger
|
||||||
|
from elements.base_element import BaseElement
|
||||||
|
|
||||||
logger = get_logger("TEXT_INPUT")
|
logger = get_logger("TEXT_INPUT")
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,9 +1,8 @@
|
||||||
from elements.base_element import BaseElement
|
|
||||||
from tools.logger import get_logger
|
from tools.logger import get_logger
|
||||||
|
from elements.base_element import BaseElement
|
||||||
|
|
||||||
logger = get_logger("TOOLTIP_BUTTON")
|
logger = get_logger("TOOLTIP_BUTTON")
|
||||||
|
|
||||||
|
|
||||||
class TooltipButton(BaseElement):
|
class TooltipButton(BaseElement):
|
||||||
"""Класс элемента кнопки с всплывающей подсказкой.
|
"""Класс элемента кнопки с всплывающей подсказкой.
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -5,7 +5,6 @@
|
||||||
|
|
||||||
import pytest
|
import pytest
|
||||||
from playwright.sync_api import Browser, BrowserContext, Page, sync_playwright, Playwright
|
from playwright.sync_api import Browser, BrowserContext, Page, sync_playwright, Playwright
|
||||||
import os
|
|
||||||
from _pytest.config.argparsing import Parser
|
from _pytest.config.argparsing import Parser
|
||||||
from _pytest.fixtures import FixtureRequest
|
from _pytest.fixtures import FixtureRequest
|
||||||
|
|
||||||
|
|
@ -31,8 +30,12 @@ def pytest_addoption(parser: Parser):
|
||||||
parser.addoption('--s', action='store', default={'width': 1600, 'height': 900},
|
parser.addoption('--s', action='store', default={'width': 1600, 'height': 900},
|
||||||
help='Size window: width,height')
|
help='Size window: width,height')
|
||||||
# Закомментированные альтернативные размеры окон
|
# Закомментированные альтернативные размеры окон
|
||||||
# parser.addoption('--s', action='store', default={'width': 1920, 'height': 1080}, help='Size window: width,height')
|
# parser.addoption('--s', action='store', default={'width': 1920, 'height': 1080},
|
||||||
# parser.addoption('--s', action='store', default={'width': 1920, 'height': 300}, help='Size window: width,height')
|
# help='Size window: width,height')
|
||||||
|
# parser.addoption('--s', action='store', default={'width': 1920, 'height': 300},
|
||||||
|
# help='Size window: width,height')
|
||||||
|
# parser.addoption('--s', action='store', default={'width': 300, 'height': 420},
|
||||||
|
# help='Size window: width,height')
|
||||||
parser.addoption('--slow', action='store', default=200,
|
parser.addoption('--slow', action='store', default=200,
|
||||||
help='Choose slow_mo for robot action')
|
help='Choose slow_mo for robot action')
|
||||||
parser.addoption('--t', action='store', default=60000,
|
parser.addoption('--t', action='store', default=60000,
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,4 @@
|
||||||
class ButtonLocators:
|
class ButtonLocators:
|
||||||
BUTTON_LICENSE_UPDATE = "//div[@class='scrollarea__footer']//button"
|
BUTTON_LICENSE_UPDATE = "//div[@class='scrollarea__footer']//button"
|
||||||
|
TOOLTIP = "//div[contains(@class,'v-tooltip__content menuable__content__active')]"
|
||||||
|
BUTTON_DELETE_SESSION = "button.v-btn--icon svg[fill='#4caf50']"
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,14 +1,15 @@
|
||||||
from playwright.sync_api import Page
|
|
||||||
from components.confirm_component import ConfirmComponent
|
|
||||||
from components.modal_window_component import ModalWindowComponent
|
|
||||||
from elements.checkbox_element import Checkbox
|
|
||||||
from elements.dropdown_list_element import DropdownList
|
|
||||||
from elements.text_element import Text
|
|
||||||
from elements.text_input_element import TextInput
|
|
||||||
from locators.modal_window_locators import ModalWindowLocators
|
|
||||||
from data.roles_dict import roles_dict
|
|
||||||
import re
|
import re
|
||||||
|
from playwright.sync_api import Page
|
||||||
from tools.logger import get_logger
|
from tools.logger import get_logger
|
||||||
|
from locators.modal_window_locators import ModalWindowLocators
|
||||||
|
from elements.text_input_element import TextInput
|
||||||
|
from elements.text_element import Text
|
||||||
|
from elements.dropdown_list_element import DropdownList
|
||||||
|
from elements.checkbox_element import Checkbox
|
||||||
|
from data.roles_dict import roles_dict
|
||||||
|
from components.modal_window_component import ModalWindowComponent
|
||||||
|
from components.confirm_component import ConfirmComponent
|
||||||
|
|
||||||
|
|
||||||
logger = get_logger("ADD_USER_MODAL_WINDOW")
|
logger = get_logger("ADD_USER_MODAL_WINDOW")
|
||||||
|
|
||||||
|
|
@ -62,14 +63,10 @@ class AddUserModalWindow(ModalWindowComponent):
|
||||||
self.add_content_item("active_directory_checkbox_label", label_1)
|
self.add_content_item("active_directory_checkbox_label", label_1)
|
||||||
|
|
||||||
loc = self.page.locator(input_form_locator).locator("xpath=div[2]").locator(text_field_locator)
|
loc = self.page.locator(input_form_locator).locator("xpath=div[2]").locator(text_field_locator)
|
||||||
type_auth_input = TextInput(page, loc, "type_auth_input")
|
|
||||||
self.add_content_item("type_auth_input", type_auth_input)
|
|
||||||
|
|
||||||
loc = self.page.locator(input_form_locator).locator("xpath=div[3]").locator(text_field_locator)
|
|
||||||
name_input = TextInput(page, loc, "name_input")
|
name_input = TextInput(page, loc, "name_input")
|
||||||
self.add_content_item("name_input", name_input)
|
self.add_content_item("name_input", name_input)
|
||||||
|
|
||||||
role_loc = self.page.locator(input_form_locator).locator("xpath=div[4]").locator(roles_field_locator)
|
role_loc = self.page.locator(input_form_locator).locator("xpath=div[3]").locator(roles_field_locator)
|
||||||
role_input = TextInput(page, role_loc, "role_input")
|
role_input = TextInput(page, role_loc, "role_input")
|
||||||
self.add_content_item("role_input", role_input)
|
self.add_content_item("role_input", role_input)
|
||||||
self.add_content_item(
|
self.add_content_item(
|
||||||
|
|
@ -77,6 +74,10 @@ class AddUserModalWindow(ModalWindowComponent):
|
||||||
DropdownList(page, roles_menu_locator, "roles_list")
|
DropdownList(page, roles_menu_locator, "roles_list")
|
||||||
)
|
)
|
||||||
|
|
||||||
|
loc = self.page.locator(input_form_locator).locator("xpath=div[4]").locator(text_field_locator)
|
||||||
|
password_input = TextInput(page, loc, "password_input")
|
||||||
|
self.add_content_item("password_input", password_input)
|
||||||
|
|
||||||
loc = self.page.locator(input_form_locator).locator("xpath=div[5]").locator(text_field_locator)
|
loc = self.page.locator(input_form_locator).locator("xpath=div[5]").locator(text_field_locator)
|
||||||
commentary_input = TextInput(page, loc, "commentary_input")
|
commentary_input = TextInput(page, loc, "commentary_input")
|
||||||
self.add_content_item("commentary_input", commentary_input)
|
self.add_content_item("commentary_input", commentary_input)
|
||||||
|
|
@ -118,9 +119,9 @@ class AddUserModalWindow(ModalWindowComponent):
|
||||||
Args:
|
Args:
|
||||||
user_data (dict): Словарь с данными пользователя. Может содержать ключи:
|
user_data (dict): Словарь с данными пользователя. Может содержать ключи:
|
||||||
- active_directory_checked (bool): Состояние чекбокса Active Directory
|
- active_directory_checked (bool): Состояние чекбокса Active Directory
|
||||||
- type_auth (str): Тип авторизации
|
|
||||||
- name (str): Имя пользователя
|
- name (str): Имя пользователя
|
||||||
- role (str): Роль пользователя
|
- role (str): Роль пользователя
|
||||||
|
- password (str): Пароль пользователя
|
||||||
- commentary (str): Комментарий
|
- commentary (str): Комментарий
|
||||||
- email (str): Email
|
- email (str): Email
|
||||||
- phone_number (str): Номер телефона
|
- phone_number (str): Номер телефона
|
||||||
|
|
@ -138,10 +139,6 @@ class AddUserModalWindow(ModalWindowComponent):
|
||||||
else:
|
else:
|
||||||
checkbox.uncheck()
|
checkbox.uncheck()
|
||||||
|
|
||||||
if "type_auth" in fields:
|
|
||||||
input_field = self.get_content_item("type_auth_input")
|
|
||||||
input_field.input_value(user_data["type_auth"])
|
|
||||||
|
|
||||||
if "name" in fields:
|
if "name" in fields:
|
||||||
input_field = self.get_content_item("name_input")
|
input_field = self.get_content_item("name_input")
|
||||||
input_field.input_value(user_data["name"])
|
input_field.input_value(user_data["name"])
|
||||||
|
|
@ -154,6 +151,10 @@ class AddUserModalWindow(ModalWindowComponent):
|
||||||
roles_list.check_item_with_text(user_data["role"])
|
roles_list.check_item_with_text(user_data["role"])
|
||||||
roles_list.click_item_with_text(user_data["role"])
|
roles_list.click_item_with_text(user_data["role"])
|
||||||
|
|
||||||
|
if "password" in fields:
|
||||||
|
input_field = self.get_content_item("password_input")
|
||||||
|
input_field.input_value(user_data["password"])
|
||||||
|
|
||||||
if "commentary" in fields:
|
if "commentary" in fields:
|
||||||
input_field = self.get_content_item("commentary_input")
|
input_field = self.get_content_item("commentary_input")
|
||||||
input_field.input_value(user_data["commentary"])
|
input_field.input_value(user_data["commentary"])
|
||||||
|
|
@ -224,6 +225,9 @@ class AddUserModalWindow(ModalWindowComponent):
|
||||||
roles_list.check_presence("Roles list is missing")
|
roles_list.check_presence("Roles list is missing")
|
||||||
|
|
||||||
for role in roles_dict.values():
|
for role in roles_dict.values():
|
||||||
|
# временно, пока есть несоответствие со списком ролей в вкладке Сессии
|
||||||
|
if role == "Пользователь":
|
||||||
|
continue
|
||||||
roles_list.check_item_with_text(role)
|
roles_list.check_item_with_text(role)
|
||||||
elif name == "roles_list":
|
elif name == "roles_list":
|
||||||
continue
|
continue
|
||||||
|
|
|
||||||
|
|
@ -1,13 +1,13 @@
|
||||||
from playwright.sync_api import Page
|
|
||||||
from components.confirm_component import ConfirmComponent
|
|
||||||
from components.modal_window_component import ModalWindowComponent
|
|
||||||
from elements.checkbox_element import Checkbox
|
|
||||||
from elements.dropdown_list_element import DropdownList
|
|
||||||
from elements.text_element import Text
|
|
||||||
from elements.text_input_element import TextInput
|
|
||||||
from locators.modal_window_locators import ModalWindowLocators
|
|
||||||
import re
|
import re
|
||||||
|
from playwright.sync_api import Page
|
||||||
from tools.logger import get_logger
|
from tools.logger import get_logger
|
||||||
|
from locators.modal_window_locators import ModalWindowLocators
|
||||||
|
from elements.text_input_element import TextInput
|
||||||
|
from elements.text_element import Text
|
||||||
|
from elements.dropdown_list_element import DropdownList
|
||||||
|
from elements.checkbox_element import Checkbox
|
||||||
|
from components.modal_window_component import ModalWindowComponent
|
||||||
|
from components.confirm_component import ConfirmComponent
|
||||||
|
|
||||||
logger = get_logger("EDIT_USER_MODAL_WINDOW")
|
logger = get_logger("EDIT_USER_MODAL_WINDOW")
|
||||||
|
|
||||||
|
|
@ -48,14 +48,10 @@ class EditUserModalWindow(ModalWindowComponent):
|
||||||
|
|
||||||
# Добавление полей формы
|
# Добавление полей формы
|
||||||
loc = self.page.locator(input_form_locator).locator("xpath=div[1]").locator(text_field_locator)
|
loc = self.page.locator(input_form_locator).locator("xpath=div[1]").locator(text_field_locator)
|
||||||
type_auth_input = TextInput(page, loc, "type_auth_input")
|
|
||||||
self.add_content_item("type_auth_input", type_auth_input)
|
|
||||||
|
|
||||||
loc = self.page.locator(input_form_locator).locator("xpath=div[2]").locator(text_field_locator)
|
|
||||||
name_input = TextInput(page, loc, "name_input")
|
name_input = TextInput(page, loc, "name_input")
|
||||||
self.add_content_item("name_input", name_input)
|
self.add_content_item("name_input", name_input)
|
||||||
|
|
||||||
role_loc = self.page.locator(input_form_locator).locator("xpath=div[3]").locator(roles_field_locator)
|
role_loc = self.page.locator(input_form_locator).locator("xpath=div[2]").locator(roles_field_locator)
|
||||||
role_input = TextInput(page, role_loc, "role_input")
|
role_input = TextInput(page, role_loc, "role_input")
|
||||||
self.add_content_item("role_input", role_input)
|
self.add_content_item("role_input", role_input)
|
||||||
self.add_content_item(
|
self.add_content_item(
|
||||||
|
|
@ -63,15 +59,15 @@ class EditUserModalWindow(ModalWindowComponent):
|
||||||
DropdownList(page, roles_menu_locator, "roles_list")
|
DropdownList(page, roles_menu_locator, "roles_list")
|
||||||
)
|
)
|
||||||
|
|
||||||
loc = self.page.locator(input_form_locator).locator("xpath=div[4]").locator(text_field_locator)
|
loc = self.page.locator(input_form_locator).locator("xpath=div[3]").locator(text_field_locator)
|
||||||
commentary_input = TextInput(page, loc, "commentary_input")
|
commentary_input = TextInput(page, loc, "commentary_input")
|
||||||
self.add_content_item("commentary_input", commentary_input)
|
self.add_content_item("commentary_input", commentary_input)
|
||||||
|
|
||||||
loc = self.page.locator(input_form_locator).locator("xpath=div[5]").locator(text_field_locator)
|
loc = self.page.locator(input_form_locator).locator("xpath=div[4]").locator(text_field_locator)
|
||||||
email_input = TextInput(page, loc, "email_input")
|
email_input = TextInput(page, loc, "email_input")
|
||||||
self.add_content_item("email_input", email_input)
|
self.add_content_item("email_input", email_input)
|
||||||
|
|
||||||
loc = self.page.locator(input_form_locator).locator("xpath=div[6]").locator(text_field_locator)
|
loc = self.page.locator(input_form_locator).locator("xpath=div[5]").locator(text_field_locator)
|
||||||
phone_input = TextInput(page, loc, "phone_input")
|
phone_input = TextInput(page, loc, "phone_input")
|
||||||
self.add_content_item("phone_input", phone_input)
|
self.add_content_item("phone_input", phone_input)
|
||||||
|
|
||||||
|
|
@ -137,7 +133,6 @@ class EditUserModalWindow(ModalWindowComponent):
|
||||||
|
|
||||||
Args:
|
Args:
|
||||||
user_data (dict): Словарь с обновляемыми данными пользователя. Может содержать:
|
user_data (dict): Словарь с обновляемыми данными пользователя. Может содержать:
|
||||||
- type_auth (str): Тип авторизации
|
|
||||||
- name (str): Имя пользователя
|
- name (str): Имя пользователя
|
||||||
- role (str): Роль пользователя
|
- role (str): Роль пользователя
|
||||||
- commentary (str): Комментарий
|
- commentary (str): Комментарий
|
||||||
|
|
@ -147,10 +142,6 @@ class EditUserModalWindow(ModalWindowComponent):
|
||||||
"""
|
"""
|
||||||
fields = user_data.keys()
|
fields = user_data.keys()
|
||||||
|
|
||||||
if "type_auth" in fields:
|
|
||||||
input_field = self.get_content_item("type_auth_input")
|
|
||||||
input_field.input_value(user_data["type_auth"])
|
|
||||||
|
|
||||||
if "name" in fields:
|
if "name" in fields:
|
||||||
input_field = self.get_content_item("name_input")
|
input_field = self.get_content_item("name_input")
|
||||||
input_field.input_value(user_data["name"])
|
input_field.input_value(user_data["name"])
|
||||||
|
|
|
||||||
|
|
@ -1,10 +1,10 @@
|
||||||
"""Базовый класс страницы для работы с Playwright."""
|
"""Базовый класс страницы для работы с Playwright."""
|
||||||
|
|
||||||
from playwright.sync_api import Page, Response, APIRequestContext, expect
|
|
||||||
from typing import Any, Dict, List, Optional
|
|
||||||
from data.environment import host
|
|
||||||
from tools.logger import get_logger
|
|
||||||
import json
|
import json
|
||||||
|
from typing import Any, Dict, List, Optional
|
||||||
|
from playwright.sync_api import Page, Response, APIRequestContext, expect
|
||||||
|
from tools.logger import get_logger
|
||||||
|
from data.environment import host
|
||||||
|
|
||||||
logger = get_logger("BASE_PAGE")
|
logger = get_logger("BASE_PAGE")
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,16 +1,15 @@
|
||||||
from pages.base_page import BasePage
|
|
||||||
from components.alert_component import AlertComponent
|
|
||||||
from elements.button_element import Button
|
|
||||||
from components.json_container_component import JsonContainerComponent
|
|
||||||
from elements.text_element import Text
|
|
||||||
from elements.text_input_element import TextInput
|
|
||||||
from components.toolbar_component import ToolbarComponent
|
|
||||||
from locators.button_locators import ButtonLocators
|
|
||||||
from locators.json_container_locators import JsonContainerLocators
|
|
||||||
from locators.input_locators import InputLocators
|
|
||||||
from locators.text_locators import TextLocators
|
|
||||||
from playwright.sync_api import Page
|
from playwright.sync_api import Page
|
||||||
|
from locators.text_locators import TextLocators
|
||||||
|
from locators.input_locators import InputLocators
|
||||||
|
from locators.json_container_locators import JsonContainerLocators
|
||||||
|
from locators.button_locators import ButtonLocators
|
||||||
|
from elements.text_input_element import TextInput
|
||||||
|
from elements.text_element import Text
|
||||||
|
from elements.button_element import Button
|
||||||
|
from components.toolbar_component import ToolbarComponent
|
||||||
|
from components.json_container_component import JsonContainerComponent
|
||||||
|
from components.alert_component import AlertComponent
|
||||||
|
from pages.base_page import BasePage
|
||||||
|
|
||||||
class LicenseTab(BasePage):
|
class LicenseTab(BasePage):
|
||||||
"""Класс для работы с вкладкой 'Лицензии'.
|
"""Класс для работы с вкладкой 'Лицензии'.
|
||||||
|
|
@ -89,12 +88,12 @@ class LicenseTab(BasePage):
|
||||||
Args:
|
Args:
|
||||||
text: Текст для проверки в алерте.
|
text: Текст для проверки в алерте.
|
||||||
"""
|
"""
|
||||||
self.error_alert.check_presence(text)
|
self.error_alert.check_alert_presence(text)
|
||||||
self.error_alert.check_absence(text)
|
self.error_alert.check_alert_absence(text)
|
||||||
|
|
||||||
def should_be_toolbar(self) -> None:
|
def should_be_toolbar(self) -> None:
|
||||||
"""Проверяет наличие панели инструментов."""
|
"""Проверяет наличие панели инструментов."""
|
||||||
self.toolbar.check_presence("Toolbar is missing")
|
self.toolbar.check_toolbar_presence("Toolbar is missing")
|
||||||
|
|
||||||
def should_be_json_container(self) -> None:
|
def should_be_json_container(self) -> None:
|
||||||
"""Проверяет наличие JSON-контейнера с информацией о лицензии."""
|
"""Проверяет наличие JSON-контейнера с информацией о лицензии."""
|
||||||
|
|
|
||||||
|
|
@ -1,14 +1,11 @@
|
||||||
from playwright.sync_api import Page
|
from playwright.sync_api import Page
|
||||||
|
|
||||||
from elements.button_element import Button
|
|
||||||
from elements.text_input_element import TextInput
|
from elements.text_input_element import TextInput
|
||||||
|
from elements.button_element import Button
|
||||||
|
from data.environment import host
|
||||||
|
from data.constants import Constants
|
||||||
from components.alert_component import AlertComponent
|
from components.alert_component import AlertComponent
|
||||||
from pages.base_page import BasePage
|
from pages.base_page import BasePage
|
||||||
|
|
||||||
from data.constants import Constants
|
|
||||||
from data.environment import host
|
|
||||||
|
|
||||||
|
|
||||||
class LoginPage(BasePage):
|
class LoginPage(BasePage):
|
||||||
"""Класс для работы со страницей авторизации.
|
"""Класс для работы со страницей авторизации.
|
||||||
|
|
||||||
|
|
@ -92,5 +89,5 @@ class LoginPage(BasePage):
|
||||||
|
|
||||||
self.login_button.click()
|
self.login_button.click()
|
||||||
|
|
||||||
self.error_alert.check_presence("Неверная пара логин/пароль")
|
self.error_alert.check_alert_presence("Неверная пара логин/пароль")
|
||||||
self.error_alert.check_absence("Неверная пара логин/пароль")
|
self.error_alert.check_alert_absence("Неверная пара логин/пароль")
|
||||||
|
|
|
||||||
|
|
@ -1,11 +1,10 @@
|
||||||
from pages.base_page import BasePage
|
from playwright.sync_api import Page
|
||||||
from elements.button_element import Button
|
|
||||||
from components.card_component import CardComponent
|
|
||||||
from components.navbar_component import NavigationPanelComponent
|
|
||||||
from locators.navigation_panel_locators import NavigationPanelLocators
|
from locators.navigation_panel_locators import NavigationPanelLocators
|
||||||
from locators.event_panel_locators import EventPanelLocators
|
from locators.event_panel_locators import EventPanelLocators
|
||||||
from playwright.sync_api import Page
|
from elements.button_element import Button
|
||||||
|
from components.navbar_component import NavigationPanelComponent
|
||||||
|
from components.card_component import CardComponent
|
||||||
|
from pages.base_page import BasePage
|
||||||
|
|
||||||
class MainPage(BasePage):
|
class MainPage(BasePage):
|
||||||
"""Класс для работы с главной страницей приложения.
|
"""Класс для работы с главной страницей приложения.
|
||||||
|
|
|
||||||
|
|
@ -1,8 +1,8 @@
|
||||||
from pages.base_page import BasePage
|
from playwright.sync_api import Page
|
||||||
|
from locators.table_locators import TableLocators
|
||||||
from components.toolbar_component import ToolbarComponent
|
from components.toolbar_component import ToolbarComponent
|
||||||
from components.table_component import TableComponent
|
from components.table_component import TableComponent
|
||||||
from locators.table_locators import TableLocators
|
from pages.base_page import BasePage
|
||||||
from playwright.sync_api import Page
|
|
||||||
|
|
||||||
|
|
||||||
class ServiceStatusTab(BasePage):
|
class ServiceStatusTab(BasePage):
|
||||||
|
|
@ -128,7 +128,7 @@ class ServiceStatusTab(BasePage):
|
||||||
Raises:
|
Raises:
|
||||||
AssertionError: Если тулбар отсутствует.
|
AssertionError: Если тулбар отсутствует.
|
||||||
"""
|
"""
|
||||||
self.toolbar.check_presence("Toolbar is missing")
|
self.toolbar.check_toolbar_presence("Toolbar is missing")
|
||||||
|
|
||||||
def should_be_services_table(self) -> None:
|
def should_be_services_table(self) -> None:
|
||||||
"""Проверяет наличие таблицы сервисов.
|
"""Проверяет наличие таблицы сервисов.
|
||||||
|
|
|
||||||
|
|
@ -1,12 +1,11 @@
|
||||||
from pages.base_page import BasePage
|
from playwright.sync_api import Page, Locator
|
||||||
|
from locators.table_locators import TableLocators
|
||||||
|
from locators.button_locators import ButtonLocators
|
||||||
from elements.tooltip_button_element import TooltipButton
|
from elements.tooltip_button_element import TooltipButton
|
||||||
|
from data.roles_dict import roles_dict
|
||||||
from components.toolbar_component import ToolbarComponent
|
from components.toolbar_component import ToolbarComponent
|
||||||
from components.table_component import TableComponent
|
from components.table_component import TableComponent
|
||||||
from locators.button_locators import ButtonLocators
|
from pages.base_page import BasePage
|
||||||
from locators.table_locators import TableLocators
|
|
||||||
from playwright.sync_api import Page, Locator
|
|
||||||
from data.roles_dict import roles_dict
|
|
||||||
|
|
||||||
|
|
||||||
class SessionsTab(BasePage):
|
class SessionsTab(BasePage):
|
||||||
"""Класс для работы с вкладкой 'Сессия'.
|
"""Класс для работы с вкладкой 'Сессия'.
|
||||||
|
|
@ -156,7 +155,7 @@ class SessionsTab(BasePage):
|
||||||
Raises:
|
Raises:
|
||||||
AssertionError: Если тулбар отсутствует.
|
AssertionError: Если тулбар отсутствует.
|
||||||
"""
|
"""
|
||||||
self.toolbar.check_presence("Toolbar is missing")
|
self.toolbar.check_toolbar_presence("Toolbar is missing")
|
||||||
|
|
||||||
def should_be_sessions_table(self) -> None:
|
def should_be_sessions_table(self) -> None:
|
||||||
"""Проверяет наличие таблицы сессий.
|
"""Проверяет наличие таблицы сессий.
|
||||||
|
|
|
||||||
|
|
@ -1,14 +1,13 @@
|
||||||
from pages.base_page import BasePage
|
import re
|
||||||
from components.alert_component import AlertComponent
|
from playwright.sync_api import Page
|
||||||
from components.toolbar_component import ToolbarComponent
|
|
||||||
from components.table_component import TableComponent
|
|
||||||
from modal_windows.modal_add_user import AddUserModalWindow
|
|
||||||
from modal_windows.modal_edit_user import EditUserModalWindow
|
from modal_windows.modal_edit_user import EditUserModalWindow
|
||||||
|
from modal_windows.modal_add_user import AddUserModalWindow
|
||||||
from locators.table_locators import TableLocators
|
from locators.table_locators import TableLocators
|
||||||
from data.roles_dict import roles_dict
|
from data.roles_dict import roles_dict
|
||||||
from playwright.sync_api import Page
|
from components.toolbar_component import ToolbarComponent
|
||||||
import re
|
from components.table_component import TableComponent
|
||||||
|
from components.alert_component import AlertComponent
|
||||||
|
from pages.base_page import BasePage
|
||||||
|
|
||||||
class UsersTab(BasePage):
|
class UsersTab(BasePage):
|
||||||
"""Класс для работы с вкладкой 'Пользователи'.
|
"""Класс для работы с вкладкой 'Пользователи'.
|
||||||
|
|
@ -141,8 +140,8 @@ class UsersTab(BasePage):
|
||||||
AssertionError: Если не отображается сообщение об успешном добавлении.
|
AssertionError: Если не отображается сообщение об успешном добавлении.
|
||||||
"""
|
"""
|
||||||
self.get_modal_window("add_user").new_user(user_data)
|
self.get_modal_window("add_user").new_user(user_data)
|
||||||
self.success_alert.check_presence(' Новый пользователь \n успешно добавлен! ')
|
self.success_alert.check_alert_presence(' Новый пользователь \n успешно добавлен! ')
|
||||||
self.success_alert.check_absence(' Новый пользователь \n успешно добавлен! ')
|
self.success_alert.check_alert_absence(' Новый пользователь \n успешно добавлен! ')
|
||||||
|
|
||||||
def delete_user(self, user_name: str) -> None:
|
def delete_user(self, user_name: str) -> None:
|
||||||
"""Удаляет пользователя.
|
"""Удаляет пользователя.
|
||||||
|
|
@ -154,8 +153,8 @@ class UsersTab(BasePage):
|
||||||
AssertionError: Если не отображается сообщение об успешном удалении.
|
AssertionError: Если не отображается сообщение об успешном удалении.
|
||||||
"""
|
"""
|
||||||
self.get_modal_window(user_name).delete_user()
|
self.get_modal_window(user_name).delete_user()
|
||||||
self.success_alert.check_presence('\nПользователь удалён\n')
|
self.success_alert.check_alert_presence('\nПользователь удалён\n')
|
||||||
self.success_alert.check_absence('\nПользователь удалён\n')
|
self.success_alert.check_alert_absence('\nПользователь удалён\n')
|
||||||
|
|
||||||
def edit_user(self, user_name: str, user_data: dict) -> None:
|
def edit_user(self, user_name: str, user_data: dict) -> None:
|
||||||
"""Редактирует данные пользователя.
|
"""Редактирует данные пользователя.
|
||||||
|
|
@ -168,8 +167,8 @@ class UsersTab(BasePage):
|
||||||
AssertionError: Если не отображается сообщение об успешном обновлении.
|
AssertionError: Если не отображается сообщение об успешном обновлении.
|
||||||
"""
|
"""
|
||||||
self.get_modal_window(user_name).edit_user(user_data)
|
self.get_modal_window(user_name).edit_user(user_data)
|
||||||
self.success_alert.check_presence('\nОбновление успешно\n')
|
self.success_alert.check_alert_presence('\nОбновление успешно\n')
|
||||||
self.success_alert.check_absence('\nОбновление успешно\n')
|
self.success_alert.check_alert_absence('\nОбновление успешно\n')
|
||||||
|
|
||||||
def reset_password(self, user_name: str) -> str:
|
def reset_password(self, user_name: str) -> str:
|
||||||
"""Сбрасывает пароль пользователя.
|
"""Сбрасывает пароль пользователя.
|
||||||
|
|
@ -183,7 +182,7 @@ class UsersTab(BasePage):
|
||||||
new_password = ""
|
new_password = ""
|
||||||
self.get_modal_window(user_name).reset_password()
|
self.get_modal_window(user_name).reset_password()
|
||||||
|
|
||||||
self.success_alert.check_presence("")
|
self.success_alert.check_alert_presence("")
|
||||||
alert_message = self.success_alert.get_text()
|
alert_message = self.success_alert.get_text()
|
||||||
if len(alert_message) > 0:
|
if len(alert_message) > 0:
|
||||||
new_password = re.findall(r'[\d]+', alert_message)[0]
|
new_password = re.findall(r'[\d]+', alert_message)[0]
|
||||||
|
|
@ -257,7 +256,7 @@ class UsersTab(BasePage):
|
||||||
if user_name == val:
|
if user_name == val:
|
||||||
user_name = key
|
user_name = key
|
||||||
|
|
||||||
role = table_content[row_index][1]
|
role = table_content[row_index][2]
|
||||||
|
|
||||||
self.page.locator(TableLocators.TABLE_WORK_AREA).locator("//tbody/tr").nth(row_index).click()
|
self.page.locator(TableLocators.TABLE_WORK_AREA).locator("//tbody/tr").nth(row_index).click()
|
||||||
self.add_modal_window("edit_user", user_name)
|
self.add_modal_window("edit_user", user_name)
|
||||||
|
|
@ -292,7 +291,7 @@ class UsersTab(BasePage):
|
||||||
Raises:
|
Raises:
|
||||||
AssertionError: Если таблица пуста или заголовки не соответствуют.
|
AssertionError: Если таблица пуста или заголовки не соответствуют.
|
||||||
"""
|
"""
|
||||||
expected_headers = ['Имя пользователя', 'Роль', 'E-mail', 'Номер для СМС']
|
expected_headers = ['Имя пользователя', 'Тип авторизации', 'Роль', 'E-mail', 'Номер для СМС']
|
||||||
table_content = self.users_table.read(TableLocators.TABLE_WORK_AREA)
|
table_content = self.users_table.read(TableLocators.TABLE_WORK_AREA)
|
||||||
|
|
||||||
if len(table_content) == 0:
|
if len(table_content) == 0:
|
||||||
|
|
@ -331,7 +330,7 @@ class UsersTab(BasePage):
|
||||||
Raises:
|
Raises:
|
||||||
AssertionError: Если тулбар или кнопка редактирования отсутствуют.
|
AssertionError: Если тулбар или кнопка редактирования отсутствуют.
|
||||||
"""
|
"""
|
||||||
self.toolbar.check_presence("Toolbar is missing")
|
self.toolbar.check_toolbar_presence("Toolbar is missing")
|
||||||
self.toolbar.check_button_presence("edit")
|
self.toolbar.check_button_presence("edit")
|
||||||
|
|
||||||
def should_be_toolbar_buttons(self) -> None:
|
def should_be_toolbar_buttons(self) -> None:
|
||||||
|
|
@ -422,6 +421,11 @@ class UsersTab(BasePage):
|
||||||
item["name"] = tmp_dict[user_name]
|
item["name"] = tmp_dict[user_name]
|
||||||
user_info.append(item["name"])
|
user_info.append(item["name"])
|
||||||
|
|
||||||
|
if item["type_auth"] is not None:
|
||||||
|
user_info.append(item["type_auth"])
|
||||||
|
else:
|
||||||
|
user_info.append("")
|
||||||
|
|
||||||
if item["role"] is not None:
|
if item["role"] is not None:
|
||||||
role = item["role"]
|
role = item["role"]
|
||||||
if role in roles_dict.keys():
|
if role in roles_dict.keys():
|
||||||
|
|
|
||||||
|
|
@ -1,8 +1,8 @@
|
||||||
from pages.login_page import LoginPage
|
|
||||||
from pages.main_page import MainPage
|
|
||||||
from pages.license_tab import LicenseTab
|
|
||||||
from playwright.sync_api import Page
|
|
||||||
import pytest
|
import pytest
|
||||||
|
from playwright.sync_api import Page
|
||||||
|
from pages.main_page import MainPage
|
||||||
|
from pages.login_page import LoginPage
|
||||||
|
from pages.license_tab import LicenseTab
|
||||||
|
|
||||||
|
|
||||||
class TestJsonContainer:
|
class TestJsonContainer:
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,5 @@
|
||||||
from pages.login_page import LoginPage
|
|
||||||
from pages.main_page import MainPage
|
from pages.main_page import MainPage
|
||||||
|
from pages.login_page import LoginPage
|
||||||
|
|
||||||
# Запуск с viewport: {'width': 300, 'height': 420}
|
# Запуск с viewport: {'width': 300, 'height': 420}
|
||||||
|
|
||||||
|
|
@ -52,7 +51,7 @@ class TestNavigationPanel:
|
||||||
mp.check_navigation_panel_item_visibility("Панель приборов")
|
mp.check_navigation_panel_item_visibility("Панель приборов")
|
||||||
mp.wait_for_timeout(3000)
|
mp.wait_for_timeout(3000)
|
||||||
|
|
||||||
# Прокручиваем вниз и проверяем видимость элемента
|
# Прокручиваем вниз и проверяем видимость элемента Настройки/ZTP/Шаблоны
|
||||||
mp.scroll_navigation_panel_down()
|
mp.scroll_navigation_panel_down()
|
||||||
mp.check_navigation_panel_item_visibility("Шаблоны")
|
mp.check_navigation_panel_item_visibility("Шаблоны_2")
|
||||||
mp.wait_for_timeout(2000)
|
mp.wait_for_timeout(2000)
|
||||||
|
|
@ -1,9 +1,8 @@
|
||||||
from pages.login_page import LoginPage
|
|
||||||
from pages.main_page import MainPage
|
|
||||||
from pages.service_status_tab import ServiceStatusTab
|
|
||||||
from playwright.sync_api import Page
|
|
||||||
import pytest
|
import pytest
|
||||||
|
from playwright.sync_api import Page
|
||||||
|
from pages.service_status_tab import ServiceStatusTab
|
||||||
|
from pages.main_page import MainPage
|
||||||
|
from pages.login_page import LoginPage
|
||||||
|
|
||||||
class TestServiceStatusTable:
|
class TestServiceStatusTable:
|
||||||
"""Тесты для проверки таблицы статусов сервисов."""
|
"""Тесты для проверки таблицы статусов сервисов."""
|
||||||
|
|
|
||||||
|
|
@ -1,9 +1,8 @@
|
||||||
from pages.login_page import LoginPage
|
|
||||||
from pages.main_page import MainPage
|
|
||||||
from pages.users_tab import UsersTab
|
|
||||||
from playwright.sync_api import Page
|
|
||||||
import pytest
|
import pytest
|
||||||
|
from playwright.sync_api import Page
|
||||||
|
from pages.users_tab import UsersTab
|
||||||
|
from pages.main_page import MainPage
|
||||||
|
from pages.login_page import LoginPage
|
||||||
|
|
||||||
class TestUsersModalWindow:
|
class TestUsersModalWindow:
|
||||||
"""Тесты для проверки модальных окон работы с пользователями."""
|
"""Тесты для проверки модальных окон работы с пользователями."""
|
||||||
|
|
@ -62,10 +61,11 @@ class TestUsersModalWindow:
|
||||||
modal_window.check_toolbar_button_presence("close")
|
modal_window.check_toolbar_button_presence("close")
|
||||||
ut.wait_for_timeout(3000)
|
ut.wait_for_timeout(3000)
|
||||||
|
|
||||||
is_scrollable_horizontally = modal_window.check_window_horizontal_scrolling()
|
## Временно закомментарено - для окна добавления пользователя убрали горизонтальный скроллинг - BUG???
|
||||||
assert is_scrollable_horizontally, "Should be horizontal scrolling"
|
# is_scrollable_horizontally = modal_window.check_window_horizontal_scrolling()
|
||||||
|
# assert is_scrollable_horizontally, "Should be horizontal scrolling"
|
||||||
|
|
||||||
modal_window.scroll_window_right()
|
# modal_window.scroll_window_right()
|
||||||
ut.wait_for_timeout(3000)
|
# ut.wait_for_timeout(3000)
|
||||||
modal_window.scroll_window_left()
|
# modal_window.scroll_window_left()
|
||||||
ut.wait_for_timeout(2000)
|
# ut.wait_for_timeout(2000)
|
||||||
|
|
|
||||||
|
|
@ -1,11 +1,10 @@
|
||||||
from pages.login_page import LoginPage
|
|
||||||
from pages.main_page import MainPage
|
|
||||||
from pages.license_tab import LicenseTab
|
|
||||||
from playwright.sync_api import Page
|
|
||||||
import pytest
|
|
||||||
import uuid
|
import uuid
|
||||||
from typing import List
|
from typing import List
|
||||||
|
import pytest
|
||||||
|
from playwright.sync_api import Page
|
||||||
|
from pages.main_page import MainPage
|
||||||
|
from pages.login_page import LoginPage
|
||||||
|
from pages.license_tab import LicenseTab
|
||||||
|
|
||||||
class TestLicenseTab:
|
class TestLicenseTab:
|
||||||
"""Тесты для вкладки 'Лицензии'."""
|
"""Тесты для вкладки 'Лицензии'."""
|
||||||
|
|
|
||||||
|
|
@ -1,8 +1,6 @@
|
||||||
import pytest
|
|
||||||
from pages.login_page import LoginPage
|
|
||||||
from pages.main_page import MainPage
|
|
||||||
from playwright.sync_api import Page
|
from playwright.sync_api import Page
|
||||||
|
from pages.main_page import MainPage
|
||||||
|
from pages.login_page import LoginPage
|
||||||
|
|
||||||
class TestLogin:
|
class TestLogin:
|
||||||
"""Тесты для функционала входа и выхода из системы."""
|
"""Тесты для функционала входа и выхода из системы."""
|
||||||
|
|
|
||||||
|
|
@ -1,8 +1,7 @@
|
||||||
from pages.login_page import LoginPage
|
|
||||||
from pages.main_page import MainPage
|
|
||||||
from pages.service_status_tab import ServiceStatusTab
|
|
||||||
import pytest
|
import pytest
|
||||||
|
from pages.service_status_tab import ServiceStatusTab
|
||||||
|
from pages.main_page import MainPage
|
||||||
|
from pages.login_page import LoginPage
|
||||||
|
|
||||||
class TestServiceStatusTab:
|
class TestServiceStatusTab:
|
||||||
"""Набор тестов для вкладки 'Статус обслуживания'.
|
"""Набор тестов для вкладки 'Статус обслуживания'.
|
||||||
|
|
|
||||||
|
|
@ -1,8 +1,7 @@
|
||||||
from pages.login_page import LoginPage
|
|
||||||
from pages.main_page import MainPage
|
|
||||||
from pages.session_tab import SessionsTab
|
|
||||||
import pytest
|
import pytest
|
||||||
|
from pages.session_tab import SessionsTab
|
||||||
|
from pages.main_page import MainPage
|
||||||
|
from pages.login_page import LoginPage
|
||||||
|
|
||||||
class TestSessionsTab:
|
class TestSessionsTab:
|
||||||
"""Набор тестов для вкладки 'Сеансы'.
|
"""Набор тестов для вкладки 'Сеансы'.
|
||||||
|
|
|
||||||
|
|
@ -1,10 +1,9 @@
|
||||||
from pages.login_page import LoginPage
|
|
||||||
from pages.main_page import MainPage
|
|
||||||
from pages.users_tab import UsersTab
|
|
||||||
from playwright.sync_api import Page
|
|
||||||
import pytest
|
|
||||||
from typing import Dict
|
from typing import Dict
|
||||||
|
import pytest
|
||||||
|
from playwright.sync_api import Page
|
||||||
|
from pages.users_tab import UsersTab
|
||||||
|
from pages.main_page import MainPage
|
||||||
|
from pages.login_page import LoginPage
|
||||||
|
|
||||||
class TestUsersTab:
|
class TestUsersTab:
|
||||||
"""Тесты для вкладки 'Пользователи'."""
|
"""Тесты для вкладки 'Пользователи'."""
|
||||||
|
|
@ -43,6 +42,7 @@ class TestUsersTab:
|
||||||
ut = UsersTab(browser)
|
ut = UsersTab(browser)
|
||||||
ut.open_add_user_window()
|
ut.open_add_user_window()
|
||||||
ut.close_add_user_window_by_toolbar_button()
|
ut.close_add_user_window_by_toolbar_button()
|
||||||
|
|
||||||
ut.open_add_user_window()
|
ut.open_add_user_window()
|
||||||
ut.close_add_user_window()
|
ut.close_add_user_window()
|
||||||
|
|
||||||
|
|
@ -62,7 +62,7 @@ class TestUsersTab:
|
||||||
|
|
||||||
def test_add_and_delete_user(self, browser: Page) -> None:
|
def test_add_and_delete_user(self, browser: Page) -> None:
|
||||||
"""Тест добавления и удаления пользователя."""
|
"""Тест добавления и удаления пользователя."""
|
||||||
user_data: Dict[str, str] = {"name": "User", "role": "Администратор"}
|
user_data: Dict[str, str] = {"name": "User", "role": "Администратор", "password": "987654"}
|
||||||
|
|
||||||
mp = MainPage(browser)
|
mp = MainPage(browser)
|
||||||
ut = UsersTab(browser)
|
ut = UsersTab(browser)
|
||||||
|
|
@ -80,7 +80,7 @@ class TestUsersTab:
|
||||||
|
|
||||||
def test_reset_password(self, browser: Page) -> None:
|
def test_reset_password(self, browser: Page) -> None:
|
||||||
"""Тест сброса пароля пользователя."""
|
"""Тест сброса пароля пользователя."""
|
||||||
user_data: Dict[str, str] = {"name": "autoadmin", "role": "Администратор"}
|
user_data: Dict[str, str] = {"name": "autoadmin", "role": "Администратор", "password": "123456"}
|
||||||
|
|
||||||
mp = MainPage(browser)
|
mp = MainPage(browser)
|
||||||
ut = UsersTab(browser)
|
ut = UsersTab(browser)
|
||||||
|
|
@ -114,7 +114,7 @@ class TestUsersTab:
|
||||||
|
|
||||||
def test_edit_user_role(self, browser: Page) -> None:
|
def test_edit_user_role(self, browser: Page) -> None:
|
||||||
"""Тест изменения роли пользователя."""
|
"""Тест изменения роли пользователя."""
|
||||||
user_data: Dict[str, str] = {"name": "autooperator", "role": "Оператор"}
|
user_data: Dict[str, str] = {"name": "autooperator", "role": "Оператор", "password": "123245"}
|
||||||
|
|
||||||
mp = MainPage(browser)
|
mp = MainPage(browser)
|
||||||
ut = UsersTab(browser)
|
ut = UsersTab(browser)
|
||||||
|
|
|
||||||
|
|
@ -159,4 +159,4 @@ if __name__ == '__main__':
|
||||||
|
|
||||||
# Вывод результатов
|
# Вывод результатов
|
||||||
print(f"Готово! Внесено {len(fixer.log)} изменений.")
|
print(f"Готово! Внесено {len(fixer.log)} изменений.")
|
||||||
print(f"Подробности сохранены в project_fix.log")
|
print("Подробности сохранены в project_fix.log")
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue