184 lines
6.2 KiB
Python
184 lines
6.2 KiB
Python
"""
|
|
Swarm 前端完整测试
|
|
测试所有页面功能和 API
|
|
"""
|
|
from playwright.sync_api import sync_playwright
|
|
import json
|
|
import time
|
|
|
|
BASE_URL = "http://localhost:3000"
|
|
API_BASE = "http://localhost:8000/api"
|
|
|
|
def test_api_endpoints():
|
|
"""测试后端 API 端点"""
|
|
print("\n=== 测试后端 API ===")
|
|
import urllib.request
|
|
|
|
endpoints = [
|
|
"/health",
|
|
"/agents/",
|
|
"/locks/",
|
|
"/heartbeats/",
|
|
"/workflows/list",
|
|
"/workflows/files",
|
|
"/status",
|
|
"/humans/summary",
|
|
]
|
|
|
|
results = {}
|
|
for endpoint in endpoints:
|
|
try:
|
|
url = f"{API_BASE}{endpoint}"
|
|
with urllib.request.urlopen(url, timeout=5) as response:
|
|
data = response.read().decode('utf-8')
|
|
results[endpoint] = {"status": response.status, "data": data[:100]}
|
|
print(f" ✓ {endpoint}: {response.status}")
|
|
except Exception as e:
|
|
results[endpoint] = {"status": "error", "error": str(e)}
|
|
print(f" ✗ {endpoint}: {e}")
|
|
|
|
# 测试 agents_control 端点
|
|
control_endpoints = [
|
|
"/api/agents/control/summary",
|
|
"/api/agents/control/list",
|
|
]
|
|
|
|
print("\n=== 测试 agents_control API ===")
|
|
for endpoint in control_endpoints:
|
|
try:
|
|
url = f"http://localhost:8000{endpoint}"
|
|
with urllib.request.urlopen(url, timeout=5) as response:
|
|
data = response.read().decode('utf-8')
|
|
results[endpoint] = {"status": response.status}
|
|
print(f" ✓ {endpoint}: {response.status}")
|
|
except Exception as e:
|
|
results[endpoint] = {"status": "error", "error": str(e)}
|
|
print(f" ✗ {endpoint}: {e}")
|
|
|
|
return results
|
|
|
|
def test_frontend_pages():
|
|
"""测试前端页面"""
|
|
print("\n=== 测试前端页面 ===")
|
|
|
|
with sync_playwright() as p:
|
|
browser = p.chromium.launch(headless=False)
|
|
context = browser.new_context()
|
|
page = context.new_page()
|
|
|
|
# 收集控制台错误
|
|
console_errors = []
|
|
def on_console(msg):
|
|
if msg.type == "error":
|
|
console_errors.append(msg.text)
|
|
|
|
page.on("console", on_console)
|
|
|
|
issues = {}
|
|
|
|
try:
|
|
# 1. Dashboard 页面
|
|
print("\n1. 测试 Dashboard 页面...")
|
|
page.goto(f"{BASE_URL}/")
|
|
page.wait_for_load_state("networkidle", timeout=10000)
|
|
page.screenshot(path="D:/ccProg/swarm/test_screenshots/dashboard.png")
|
|
|
|
dashboard_errors = [e for e in console_errors if "dashboard" in e.lower()]
|
|
issues["dashboard"] = {
|
|
"url": page.url,
|
|
"title": page.title(),
|
|
"console_errors": dashboard_errors,
|
|
"has_content": len(page.content()) > 1000
|
|
}
|
|
print(f" 标题: {page.title()}")
|
|
print(f" 控制台错误数: {len(dashboard_errors)}")
|
|
|
|
# 2. Agents 页面
|
|
print("\n2. 测试 Agents 页面...")
|
|
page.goto(f"{BASE_URL}/#/agents")
|
|
page.wait_for_load_state("networkidle", timeout=10000)
|
|
time.sleep(2) # 等待动态内容加载
|
|
page.screenshot(path="D:/ccProg/swarm/test_screenshots/agents.png")
|
|
|
|
# 检查 agents/control API 调用
|
|
agents_errors = [e for e in console_errors if "agent" in e.lower()]
|
|
issues["agents"] = {
|
|
"url": page.url,
|
|
"console_errors": agents_errors,
|
|
"has_agent_cards": page.locator('[class*="agent"]').count() > 0
|
|
}
|
|
print(f" 控制台错误数: {len(agents_errors)}")
|
|
|
|
# 3. Meetings 页面
|
|
print("\n3. 测试 Meetings 页面...")
|
|
page.goto(f"{BASE_URL}/#/meetings")
|
|
page.wait_for_load_state("networkidle", timeout=10000)
|
|
time.sleep(2)
|
|
page.screenshot(path="D:/ccProg/swarm/test_screenshots/meetings.png")
|
|
|
|
meeting_errors = [e for e in console_errors if "meeting" in e.lower()]
|
|
issues["meetings"] = {
|
|
"url": page.url,
|
|
"console_errors": meeting_errors
|
|
}
|
|
print(f" 控制台错误数: {len(meeting_errors)}")
|
|
|
|
# 4. Resources 页面
|
|
print("\n4. 测试 Resources 页面...")
|
|
page.goto(f"{BASE_URL}/#/resources")
|
|
page.wait_for_load_state("networkidle", timeout=10000)
|
|
time.sleep(2)
|
|
page.screenshot(path="D:/ccProg/swarm/test_screenshots/resources.png")
|
|
|
|
resource_errors = [e for e in console_errors if "resource" in e.lower()]
|
|
issues["resources"] = {
|
|
"url": page.url,
|
|
"console_errors": resource_errors
|
|
}
|
|
print(f" 控制台错误数: {len(resource_errors)}")
|
|
|
|
# 5. Workflow 页面
|
|
print("\n5. 测试 Workflow 页面...")
|
|
page.goto(f"{BASE_URL}/#/workflow")
|
|
page.wait_for_load_state("networkidle", timeout=10000)
|
|
time.sleep(2)
|
|
page.screenshot(path="D:/ccProg/swarm/test_screenshots/workflow.png")
|
|
|
|
workflow_errors = [e for e in console_errors if "workflow" in e.lower()]
|
|
issues["workflow"] = {
|
|
"url": page.url,
|
|
"console_errors": workflow_errors
|
|
}
|
|
print(f" 控制台错误数: {len(workflow_errors)}")
|
|
|
|
except Exception as e:
|
|
print(f" 错误: {e}")
|
|
issues["error"] = str(e)
|
|
|
|
# 输出所有控制台错误
|
|
print("\n=== 所有控制台错误 ===")
|
|
for error in console_errors:
|
|
print(f" - {error}")
|
|
|
|
browser.close()
|
|
|
|
return issues
|
|
|
|
if __name__ == "__main__":
|
|
import os
|
|
os.makedirs("D:/ccProg/swarm/test_screenshots", exist_ok=True)
|
|
|
|
api_results = test_api_endpoints()
|
|
frontend_issues = test_frontend_pages()
|
|
|
|
# 保存结果
|
|
with open("D:/ccProg/swarm/test_results.json", "w") as f:
|
|
json.dump({
|
|
"api": api_results,
|
|
"frontend": frontend_issues
|
|
}, f, indent=2)
|
|
|
|
print("\n=== 测试结果已保存 ===")
|
|
print(" 截图: D:/ccProg/swarm/test_screenshots/")
|
|
print(" 结果: D:/ccProg/swarm/test_results.json")
|