初始提交
This commit is contained in:
@@ -0,0 +1,202 @@
|
||||
import pytest
|
||||
from playwright.async_api import async_playwright
|
||||
|
||||
from common.config import Config
|
||||
from common.login_helper import LoginHelper
|
||||
|
||||
|
||||
@pytest.mark.asyncio
|
||||
async def test_login_page_loads() -> None:
|
||||
"""测试登录页面是否能正常加载"""
|
||||
async with async_playwright() as p:
|
||||
browser = await p.chromium.launch(headless=True)
|
||||
page = await browser.new_page()
|
||||
|
||||
# 访问登录页面
|
||||
await page.goto(Config.frontend_url + '/login')
|
||||
|
||||
# 检查页面标题或特定元素是否存在
|
||||
title = await page.title()
|
||||
assert 'vfadmin' in title
|
||||
|
||||
# 检查登录表单元素是否存在
|
||||
username_input = await page.query_selector('input[placeholder="账号"]')
|
||||
password_input = await page.query_selector('input[placeholder="密码"]')
|
||||
|
||||
assert username_input is not None
|
||||
assert password_input is not None
|
||||
|
||||
await browser.close()
|
||||
|
||||
|
||||
@pytest.mark.asyncio
|
||||
async def test_captcha_generation() -> None:
|
||||
"""测试验证码是否正常生成(在测试环境中,验证码已禁用,但仍应能访问登录页面)"""
|
||||
async with async_playwright() as p:
|
||||
browser = await p.chromium.launch(headless=True)
|
||||
page = await browser.new_page()
|
||||
|
||||
# 访问登录页面
|
||||
await page.goto(Config.frontend_url + '/login')
|
||||
|
||||
# 在测试环境中验证码已禁用,但仍应能访问登录页面
|
||||
title = await page.title()
|
||||
assert 'vfadmin' in title
|
||||
|
||||
await browser.close()
|
||||
|
||||
|
||||
def test_login_without_captcha() -> None:
|
||||
"""测试在禁用验证码的情况下登录流程"""
|
||||
helper = LoginHelper()
|
||||
|
||||
# 尝试登录(测试环境中验证码已禁用)
|
||||
token = helper.login(username='admin', password='admin123')
|
||||
|
||||
# 验证登录结果
|
||||
assert token is not None, '登录应该成功'
|
||||
assert len(token) > 0, '应该返回有效的token'
|
||||
|
||||
|
||||
@pytest.mark.asyncio
|
||||
async def test_login_flow_with_playwright() -> None:
|
||||
"""使用Playwright测试完整的登录流程(测试环境中验证码已禁用)"""
|
||||
async with async_playwright() as p:
|
||||
browser = await p.chromium.launch(headless=True)
|
||||
page = await browser.new_page()
|
||||
|
||||
# 访问登录页面
|
||||
await page.goto(Config.frontend_url + '/login')
|
||||
|
||||
# 等待页面加载
|
||||
await page.wait_for_selector('input[placeholder="账号"]')
|
||||
|
||||
# 输入用户名和密码
|
||||
await page.fill('input[placeholder="账号"]', 'admin')
|
||||
await page.fill('input[placeholder="密码"]', 'admin123')
|
||||
|
||||
# 在测试环境中验证码已禁用,所以不需要处理验证码
|
||||
# 直接点击登录按钮
|
||||
# 尝试多种可能的选择器
|
||||
try:
|
||||
await page.click('button:has-text("登录")')
|
||||
except Exception:
|
||||
try:
|
||||
await page.click('button[type="submit"]')
|
||||
except Exception:
|
||||
await page.click('button.el-button')
|
||||
|
||||
# 等待页面跳转或检查登录结果
|
||||
try:
|
||||
# 等待跳转到主页或检查登录成功消息
|
||||
await page.wait_for_url('**/index**', timeout=10000)
|
||||
success = True
|
||||
except Exception:
|
||||
# 检查是否有错误消息
|
||||
error_message = await page.query_selector('.el-message')
|
||||
if error_message:
|
||||
error_text = await error_message.text_content()
|
||||
print(f'登录失败: {error_text}')
|
||||
success = False
|
||||
else:
|
||||
success = False
|
||||
|
||||
assert success, '登录应该成功'
|
||||
|
||||
await browser.close()
|
||||
|
||||
|
||||
@pytest.mark.asyncio
|
||||
async def test_protected_routes_require_auth() -> None:
|
||||
"""测试受保护的路由需要认证"""
|
||||
async with async_playwright() as p:
|
||||
browser = await p.chromium.launch(headless=True)
|
||||
page = await browser.new_page()
|
||||
|
||||
# 直接访问受保护的页面(如用户管理)
|
||||
await page.goto(Config.frontend_url + '/system/user')
|
||||
|
||||
# 检查是否被重定向到登录页面
|
||||
current_url = page.url
|
||||
|
||||
# 检查页面是否包含登录相关的元素(如账号密码输入框)
|
||||
try:
|
||||
has_username_input = await page.is_visible('input[placeholder*="账号" i], input[placeholder*="username" i]')
|
||||
except Exception:
|
||||
has_username_input = False
|
||||
|
||||
try:
|
||||
has_password_input = await page.is_visible('input[placeholder*="密码" i], input[placeholder*="password" i]')
|
||||
except Exception:
|
||||
has_password_input = False
|
||||
|
||||
try:
|
||||
has_login_button = await page.is_visible('button:has-text("登录"), button:has-text("Login"), .login-btn')
|
||||
except Exception:
|
||||
has_login_button = False
|
||||
|
||||
# 检查URL是否包含login路径
|
||||
is_redirected_to_login = '/login' in current_url.lower() or '/#/login' in current_url
|
||||
|
||||
# 断言:应该重定向到登录页面或页面包含登录相关元素
|
||||
assert is_redirected_to_login or has_username_input or has_password_input or has_login_button, (
|
||||
f'未登录用户访问受保护页面时,没有重定向到登录页。当前URL: {current_url}, 页面内容: {await page.content()}'
|
||||
)
|
||||
|
||||
await browser.close()
|
||||
|
||||
|
||||
@pytest.mark.asyncio
|
||||
async def test_authenticated_access() -> None:
|
||||
"""测试认证后的访问"""
|
||||
# 首先通过API登录获取token
|
||||
helper = LoginHelper()
|
||||
token = helper.login(username='admin', password='admin123')
|
||||
|
||||
assert token is not None, '登录应该成功'
|
||||
|
||||
# 使用Playwright测试带认证的访问
|
||||
async with async_playwright() as p:
|
||||
browser = await p.chromium.launch(headless=True)
|
||||
context = await browser.new_context(
|
||||
storage_state={ # 使用storage state来保持登录状态
|
||||
'cookies': [
|
||||
{
|
||||
'name': 'Admin-Token',
|
||||
'value': token,
|
||||
'domain': 'localhost',
|
||||
'path': '/',
|
||||
'httpOnly': False,
|
||||
'secure': False,
|
||||
'sameSite': 'Lax',
|
||||
}
|
||||
],
|
||||
'origins': [],
|
||||
}
|
||||
)
|
||||
page = await context.new_page()
|
||||
|
||||
# 访问受保护的页面
|
||||
await page.goto(Config.frontend_url + '/system/user')
|
||||
|
||||
# 检查是否能够访问受保护的页面(而不是被重定向到登录页)
|
||||
current_url = page.url
|
||||
assert '/login' not in current_url, '已登录用户应该能够访问受保护页面'
|
||||
|
||||
# 检查页面是否包含用户管理相关的元素
|
||||
try:
|
||||
# 等待页面加载
|
||||
await page.wait_for_selector('div:has-text("用户管理")', timeout=10000)
|
||||
has_user_management = True
|
||||
except Exception:
|
||||
has_user_management = False
|
||||
|
||||
# 或者检查是否有表格或其他用户管理组件
|
||||
table_element = await page.query_selector('el-table')
|
||||
if not has_user_management and table_element:
|
||||
has_user_management = True
|
||||
|
||||
assert has_user_management, '应该能够访问用户管理页面'
|
||||
|
||||
await context.close()
|
||||
await browser.close()
|
||||
Reference in New Issue
Block a user