Files
novalon-manage-system/test-suite/tests/e2e/debug_login.py
T
张翔 b0f91d74f5 feat: 统一JWT密钥配置并修复签名验证问题
修复前端签名生成中bodyString硬编码问题
添加start-frontend.sh脚本启动前端服务
统一manage-app和gateway的JWT密钥配置
修复Repository扫描路径问题
更新测试配置和依赖
重构表名映射为sys_user和sys_role
完善用户实体类字段映射
添加集成测试配置和测试用例
2026-04-02 12:28:49 +08:00

128 lines
4.7 KiB
Python

"""
E2E登录功能调试测试
捕获浏览器控制台日志和网络请求
"""
from playwright.sync_api import sync_playwright
import time
def debug_login():
"""调试登录功能"""
with sync_playwright() as p:
browser = p.chromium.launch(headless=True)
context = browser.new_context()
page = context.new_page()
console_messages = []
network_requests = []
def handle_console(msg):
console_messages.append({
'type': msg.type,
'text': msg.text,
'location': msg.location
})
print(f"[Console {msg.type}] {msg.text}")
def handle_request(request):
if 'login' in request.url or 'auth' in request.url:
network_requests.append({
'method': request.method,
'url': request.url,
'headers': dict(request.headers)
})
print(f"[Request {request.method}] {request.url}")
def handle_response(response):
if 'login' in response.url or 'auth' in response.url:
print(f"[Response {response.status}] {response.url}")
try:
body = response.text()
print(f" Response Body: {body[:500]}")
except:
pass
page.on('console', handle_console)
page.on('request', handle_request)
page.on('response', handle_response)
try:
print("=" * 60)
print("开始调试登录流程...")
print("=" * 60)
print("\n1. 访问登录页面...")
page.goto('http://localhost:3002')
page.wait_for_load_state('networkidle')
time.sleep(2)
print("\n2. 查找登录表单元素...")
username_input = page.locator('input[type="text"], input[placeholder*="用户名"], input[placeholder*="账号"]').first
password_input = page.locator('input[type="password"]').first
login_button = page.locator('button:has-text("登录"), button:has-text("Login")').first
print(f" 用户名输入框数量: {username_input.count()}")
print(f" 密码输入框数量: {password_input.count()}")
print(f" 登录按钮数量: {login_button.count()}")
print("\n3. 填写登录表单...")
username_input.fill('admin')
password_input.fill('admin123')
print(" 已填写用户名和密码")
print("\n4. 点击登录按钮...")
login_button.click()
print("\n5. 等待响应...")
time.sleep(5)
page.wait_for_load_state('networkidle')
print("\n6. 检查结果...")
current_url = page.url
print(f" 当前URL: {current_url}")
page.screenshot(path='/tmp/login_debug_full.png', full_page=True)
print(" 截图已保存到 /tmp/login_debug_full.png")
print("\n7. 检查页面内容...")
page_content = page.content()
if '登录失败' in page_content or 'login failed' in page_content.lower():
print(" 发现登录失败提示")
error_elements = page.locator('.error, .alert-danger, [class*="error"]').all()
if error_elements:
print(f" 发现 {len(error_elements)} 个错误提示元素")
for elem in error_elements[:3]:
print(f" - {elem.text_content()}")
print("\n" + "=" * 60)
print("调试信息汇总:")
print("=" * 60)
print(f"控制台消息数量: {len(console_messages)}")
if console_messages:
print("最近的控制台消息:")
for msg in console_messages[-5:]:
print(f" [{msg['type']}] {msg['text']}")
print(f"\n网络请求数量: {len(network_requests)}")
if network_requests:
print("登录相关请求:")
for req in network_requests:
print(f" {req['method']} {req['url']}")
print("=" * 60)
return 'login' not in current_url.lower()
except Exception as e:
print(f"\n❌ 错误: {str(e)}")
import traceback
traceback.print_exc()
page.screenshot(path='/tmp/login_error_debug.png', full_page=True)
return False
finally:
browser.close()
if __name__ == "__main__":
debug_login()