b0f91d74f5
修复前端签名生成中bodyString硬编码问题 添加start-frontend.sh脚本启动前端服务 统一manage-app和gateway的JWT密钥配置 修复Repository扫描路径问题 更新测试配置和依赖 重构表名映射为sys_user和sys_role 完善用户实体类字段映射 添加集成测试配置和测试用例
128 lines
4.7 KiB
Python
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()
|