Some checks failed
AI Web Tester CI / test (push) Has been cancelled
主要改进: - 新增统一测试器 (universal_tester.py) 支持多种测试模式 - 优化测试报告生成器,支持汇总报告和操作截图 - 增强探索器 DFS 算法和状态指纹识别 - 新增智能测试配置 (smart_test.yaml) - 改进 AI 模型集成 (GLM/Gemini 支持) - 添加开发调试工具和文档
150 lines
5.2 KiB
Python
150 lines
5.2 KiB
Python
#!/usr/bin/env python3
|
||
"""
|
||
零配置智能测试 - 无需预先了解系统功能
|
||
"""
|
||
|
||
import sys
|
||
sys.path.insert(0, ".")
|
||
|
||
from src import WebTester
|
||
|
||
def auto_discover_and_test(url: str, model: str = "glm", headless: bool = False):
|
||
"""
|
||
自动发现并测试系统功能
|
||
适合完全未知的系统
|
||
"""
|
||
|
||
print("=" * 60)
|
||
print("🤖 零配置智能测试")
|
||
print("=" * 60)
|
||
print(f"🌐 目标URL: {url}")
|
||
print(f"🤖 AI模型: {model}")
|
||
print(f"🖥️ 无头模式: {'是' if headless else '否'}")
|
||
print("-" * 60)
|
||
|
||
tester = WebTester(model=model, headless=headless)
|
||
|
||
try:
|
||
# 启动并导航
|
||
tester.start()
|
||
tester.goto(url)
|
||
|
||
# 步骤1: 智能登录(如果需要)
|
||
print("\n📝 步骤1: 检测登录状态")
|
||
current_url = tester.browser.page.url
|
||
|
||
# 简单判断是否在登录页
|
||
if "login" in current_url.lower() or tester.browser.page.locator("input[type='password']").count() > 0:
|
||
print(" 检测到登录页面,尝试智能登录...")
|
||
# 尝试常见的用户名密码
|
||
login_goals = [
|
||
"输入用户名admin和密码password,点击登录",
|
||
"输入admin/admin,点击登录",
|
||
"输入test/123456,点击登录"
|
||
]
|
||
|
||
login_success = False
|
||
for goal in login_goals:
|
||
try:
|
||
result = tester.test(goal)
|
||
tester.browser.wait(2000)
|
||
new_url = tester.browser.page.url
|
||
if new_url != current_url and "login" not in new_url.lower():
|
||
print(f" ✅ 登录成功: {goal}")
|
||
login_success = True
|
||
break
|
||
except:
|
||
continue
|
||
|
||
if not login_success:
|
||
print(" ⚠️ 自动登录失败,继续探索...")
|
||
|
||
# 步骤2: 全面探索
|
||
print("\n🔍 步骤2: 开始智能探索")
|
||
explore_config = {
|
||
"max_depth": 3, # 适中的深度
|
||
"max_clicks": 100, # 充足的点击
|
||
"focus_patterns": [], # 不设限制,让AI自由发现
|
||
"dangerous_patterns": ["删除", "退出", "注销", "delete", "logout", "exit"]
|
||
}
|
||
|
||
explore_result = tester.explore(explore_config)
|
||
|
||
# 步骤3: 分析发现的功能
|
||
print("\n📊 步骤3: 分析测试结果")
|
||
action_log = explore_result.get("action_log", [])
|
||
|
||
# 统计功能类型
|
||
clicked_elements = []
|
||
forms_filled = []
|
||
pages_visited = set()
|
||
|
||
for action in action_log:
|
||
if action.get("action_taken"):
|
||
element_name = action.get("element_name", "")
|
||
clicked_elements.append(element_name)
|
||
|
||
if action.get("action_type") == "form_input":
|
||
forms_filled.append(element_name)
|
||
|
||
if action.get("url_changed"):
|
||
pages_visited.add(action.get("after_url", ""))
|
||
|
||
# 输出发现的功能
|
||
print(f"\n✅ 测试完成!发现的功能:")
|
||
print(f" 🖱️ 点击的元素: {len(clicked_elements)} 个")
|
||
print(f" 📝 填写的表单: {len(forms_filled)} 个")
|
||
print(f" 📄 访问的页面: {len(pages_visited)} 个")
|
||
|
||
# 显示主要功能模块
|
||
if clicked_elements:
|
||
print(f"\n🎯 主要功能模块:")
|
||
unique_elements = list(set(clicked_elements))[:10] # 显示前10个
|
||
for i, elem in enumerate(unique_elements, 1):
|
||
print(f" {i}. {elem}")
|
||
|
||
# 生成简化报告
|
||
report = {
|
||
"url": url,
|
||
"total_clicks": len(clicked_elements),
|
||
"forms_filled": len(forms_filled),
|
||
"pages_visited": len(pages_visited),
|
||
"discovered_elements": unique_elements,
|
||
"success": True
|
||
}
|
||
|
||
return report
|
||
|
||
except Exception as e:
|
||
print(f"\n❌ 测试失败: {e}")
|
||
return {"success": False, "error": str(e)}
|
||
finally:
|
||
tester.stop()
|
||
|
||
def main():
|
||
import argparse
|
||
|
||
parser = argparse.ArgumentParser(description="零配置智能测试工具")
|
||
parser.add_argument("url", help="要测试的网站URL")
|
||
parser.add_argument("--model", default="glm",
|
||
choices=["claude", "openai", "glm", "mimo"],
|
||
help="AI模型")
|
||
parser.add_argument("--headless", action="store_true",
|
||
help="无头模式")
|
||
parser.add_argument("--output", "-o", help="保存报告到文件")
|
||
|
||
args = parser.parse_args()
|
||
|
||
# 运行测试
|
||
result = auto_discover_and_test(args.url, args.model, args.headless)
|
||
|
||
# 保存报告
|
||
if args.output and result.get("success"):
|
||
import json
|
||
with open(args.output, 'w', encoding='utf-8') as f:
|
||
json.dump(result, f, ensure_ascii=False, indent=2)
|
||
print(f"\n📄 报告已保存到: {args.output}")
|
||
|
||
if __name__ == "__main__":
|
||
main()
|