Some checks failed
AI Web Tester CI / test (push) Has been cancelled
主要改进: - 新增统一测试器 (universal_tester.py) 支持多种测试模式 - 优化测试报告生成器,支持汇总报告和操作截图 - 增强探索器 DFS 算法和状态指纹识别 - 新增智能测试配置 (smart_test.yaml) - 改进 AI 模型集成 (GLM/Gemini 支持) - 添加开发调试工具和文档
369 lines
9.1 KiB
Markdown
369 lines
9.1 KiB
Markdown
# AI Web Tester
|
||
|
||
基于 AI 视觉模型的智能 Web 自动化测试框架。使用自然语言描述测试目标,AI 会自动分析页面并执行操作。
|
||
|
||
## ✨ 特性
|
||
|
||
- 🤖 **AI 驱动** - 使用 Claude/GPT-4V 视觉模型理解页面内容
|
||
- 📝 **自然语言** - 用自然语言描述测试目标,无需编写选择器
|
||
- 🌐 **通用测试** - 支持测试任意网站,不局限于特定系统
|
||
- 🎯 **智能定位** - 语义化定位器,自动识别元素
|
||
- 📊 **自动报告** - 生成嵌入截图的 HTML 报告 + JSON 结果
|
||
- 🔧 **灵活配置** - 支持 JSON/YAML 配置文件
|
||
- 🚀 **多种模式** - 探索模式、目标模式、混合模式
|
||
- 🔄 **自动重试** - 指数退避重试机制
|
||
- 👁️ **视觉回归** - 基线对比检测 UI 变化
|
||
- ⚡ **并行执行** - 多线程运行测试用例
|
||
- 📦 **开箱即用** - 简单命令行即可开始测试
|
||
|
||
## 🚀 快速开始
|
||
|
||
### 1. 安装依赖
|
||
|
||
```bash
|
||
pip install -r requirements.txt
|
||
playwright install chromium
|
||
```
|
||
|
||
### 2. 配置环境变量
|
||
|
||
```bash
|
||
cp .env.example .env
|
||
```
|
||
|
||
编辑 `.env` 文件:
|
||
|
||
```bash
|
||
ANTHROPIC_API_KEY=your_api_key_here
|
||
ANTHROPIC_BASE_URL=https://api.anthropic.com # 可选,用于代理
|
||
ANTHROPIC_MODEL=claude-sonnet-4-20250514 # 可选
|
||
API_TIMEOUT=60 # API 超时(秒)
|
||
API_MAX_RETRIES=3 # 最大重试次数
|
||
LOG_LEVEL=INFO # 日志级别
|
||
```
|
||
|
||
> ⚠️ **注意**:`BASE_URL` 不要包含 `/v1` 后缀,SDK 会自动添加。
|
||
|
||
### 3. 开始测试
|
||
|
||
#### 最简单的测试方式
|
||
|
||
```bash
|
||
# 测试任意网站
|
||
python tests/quick_test.py https://github.com
|
||
|
||
# 使用其他 AI 模型
|
||
python tests/quick_test.py https://github.com --model glm
|
||
|
||
# 无头模式(不显示浏览器)
|
||
python tests/quick_test.py https://github.com --headless
|
||
```
|
||
|
||
#### 使用配置文件测试
|
||
|
||
```bash
|
||
# 使用 JSON 配置
|
||
python tests/universal_tester.py --config tests/configs/github_example.json
|
||
|
||
# 使用 YAML 配置
|
||
python tests/universal_tester.py --config tests/configs/enterprise_system.yaml
|
||
```
|
||
|
||
#### 需要登录的测试
|
||
|
||
```bash
|
||
python tests/quick_test.py https://example.com --login --username user@example.com --password yourpassword
|
||
```
|
||
|
||
## 📖 使用方法
|
||
|
||
### 方式一:快速测试(推荐新手)
|
||
|
||
```bash
|
||
# 基础用法
|
||
python tests/quick_test.py <URL>
|
||
|
||
# 完整参数
|
||
python tests/quick_test.py <URL> --model claude --headless --max-clicks 50
|
||
```
|
||
|
||
### 方式二:配置文件测试(推荐复杂场景)
|
||
|
||
创建配置文件 `my_test.json`:
|
||
|
||
```json
|
||
{
|
||
"name": "我的测试",
|
||
"url": "https://example.com",
|
||
"mode": "explore",
|
||
"login": {
|
||
"username": "user@example.com",
|
||
"password": "password"
|
||
},
|
||
"explore_config": {
|
||
"max_depth": 10,
|
||
"max_clicks": 50,
|
||
"focus_patterns": ["管理", "设置"],
|
||
"dangerous_patterns": ["删除", "退出"]
|
||
}
|
||
}
|
||
```
|
||
|
||
运行测试:
|
||
|
||
```bash
|
||
python tests/universal_tester.py --config my_test.json
|
||
```
|
||
|
||
### 方式三:编程接口(推荐开发者)
|
||
|
||
```python
|
||
from src import WebTester
|
||
|
||
# 基础测试
|
||
with WebTester(model="claude") as tester:
|
||
tester.goto("https://example.com")
|
||
result = tester.test("点击 'More information' 链接")
|
||
print(f"完成: {result['steps']} 步骤")
|
||
|
||
# 断言验证
|
||
with WebTester() as tester:
|
||
tester.goto("https://example.com")
|
||
result = tester.verify("页面包含 'Example Domain' 文字")
|
||
print(f"验证: {'✅' if result['passed'] else '❌'} {result['reason']}")
|
||
|
||
# 智能探索
|
||
with WebTester() as tester:
|
||
tester.goto("https://example.com")
|
||
result = tester.explore({
|
||
"max_depth": 5,
|
||
"max_clicks": 30,
|
||
"focus_patterns": ["重要功能"]
|
||
})
|
||
```
|
||
|
||
## 🔧 高级功能
|
||
|
||
### 1. 表单智能填充
|
||
|
||
自动检测并填充表单:
|
||
|
||
```python
|
||
# AI 会自动识别表单字段并填充
|
||
tester.test("填写注册表单并提交")
|
||
```
|
||
|
||
### 2. 业务流程测试
|
||
|
||
配置多步骤流程:
|
||
|
||
```yaml
|
||
steps:
|
||
- action: goal
|
||
goal: "点击登录按钮"
|
||
- action: explore
|
||
config:
|
||
max_clicks: 20
|
||
- action: verify
|
||
target: "显示用户信息"
|
||
```
|
||
|
||
### 3. 视觉回归测试
|
||
|
||
```python
|
||
with WebTester() as tester:
|
||
tester.goto("https://example.com")
|
||
|
||
# 首次运行:保存基线
|
||
tester.save_baseline("homepage")
|
||
|
||
# 后续运行:对比基线
|
||
result = tester.compare_visual("homepage", threshold=0.01)
|
||
if result["match"]:
|
||
print("✅ 视觉匹配")
|
||
else:
|
||
print(f"❌ 差异: {result['diff_percent']*100:.1f}%")
|
||
```
|
||
|
||
### 4. 批量测试
|
||
|
||
```bash
|
||
# 运行所有测试用例
|
||
python tests/test_cases.py
|
||
|
||
# 并行执行
|
||
python tests/test_cases.py --parallel --workers 3
|
||
|
||
# 选择特定测试
|
||
python tests/test_cases.py --case "登录功能测试"
|
||
```
|
||
|
||
## 📋 配置详解
|
||
|
||
### 测试模式
|
||
|
||
| 模式 | 说明 | 适用场景 |
|
||
|------|------|----------|
|
||
| `explore` | AI 自主探索 | 了解新网站功能 |
|
||
| `goal` | 执行特定目标 | 单一任务测试 |
|
||
| `hybrid` | 混合模式 | 复杂业务流程 |
|
||
|
||
### 配置文件示例
|
||
|
||
#### JSON 格式
|
||
|
||
```json
|
||
{
|
||
"name": "测试名称",
|
||
"url": "https://example.com",
|
||
"mode": "explore",
|
||
"model": "claude",
|
||
"headless": true,
|
||
"login": {
|
||
"username": "user@example.com",
|
||
"password": "password",
|
||
"submit_button": "登录"
|
||
},
|
||
"explore_config": {
|
||
"max_depth": 20,
|
||
"max_clicks": 100,
|
||
"focus_patterns": ["管理", "设置"],
|
||
"dangerous_patterns": ["删除", "退出"]
|
||
},
|
||
"verifications": [
|
||
{"type": "url_contains", "value": "/dashboard"},
|
||
{"type": "element_exists", "value": ".user-profile"}
|
||
]
|
||
}
|
||
```
|
||
|
||
#### YAML 格式
|
||
|
||
```yaml
|
||
name: 企业系统测试
|
||
url: https://your-system.com
|
||
mode: hybrid
|
||
login:
|
||
username: test@company.com
|
||
password: password
|
||
|
||
steps:
|
||
- action: goal
|
||
goal: 点击登录按钮
|
||
- action: explore
|
||
config:
|
||
max_clicks: 20
|
||
|
||
verifications:
|
||
- type: url_contains
|
||
value: /dashboard
|
||
```
|
||
|
||
## 🔧 环境变量
|
||
|
||
| 环境变量 | 默认值 | 说明 |
|
||
|----------|--------|------|
|
||
| `ANTHROPIC_API_KEY` | - | Claude API 密钥(必填) |
|
||
| `ANTHROPIC_BASE_URL` | 官方地址 | API 代理地址 |
|
||
| `ANTHROPIC_MODEL` | `claude-sonnet-4-20250514` | 模型名称 |
|
||
| `API_TIMEOUT` | `60` | API 超时(秒) |
|
||
| `API_MAX_RETRIES` | `3` | 最大重试次数 |
|
||
| `LOG_LEVEL` | `INFO` | 日志级别 |
|
||
| `LOG_FILE` | - | 日志文件路径 |
|
||
|
||
## 📁 项目结构
|
||
|
||
```
|
||
ai-web-tester/
|
||
├── src/
|
||
│ ├── main.py # WebTester 主类
|
||
│ ├── vision/ # AI 视觉模型
|
||
│ ├── browser/ # Playwright 浏览器控制
|
||
│ ├── agent/ # 测试规划和执行
|
||
│ │ ├── executor.py # 语义化定位器
|
||
│ │ ├── explorer.py # 智能探索
|
||
│ │ └── planner.py # 测试规划
|
||
│ ├── reporter/ # HTML/JSON 报告生成
|
||
│ └── utils/ # 工具模块
|
||
├── tests/
|
||
│ ├── test_cases.py # 原始测试用例
|
||
│ ├── universal_tester.py # 通用测试框架
|
||
│ ├── quick_test.py # 快速测试工具
|
||
│ ├── configs/ # 配置文件示例
|
||
│ │ ├── github_example.json
|
||
│ │ └── enterprise_system.yaml
|
||
│ └── README.md # 测试框架使用说明
|
||
├── config/
|
||
│ └── test_strategies.yaml # 测试策略配置
|
||
├── docs/
|
||
│ └── strategies.py # 策略文档
|
||
├── .github/workflows/
|
||
│ └── test.yml # CI/CD 配置
|
||
├── baselines/ # 视觉基线截图
|
||
├── reports/ # 测试报告(HTML + JSON)
|
||
├── .env.example # 环境变量模板
|
||
└── requirements.txt
|
||
```
|
||
|
||
## 📊 测试报告
|
||
|
||
每次测试生成:
|
||
- **HTML 报告** - 包含步骤详情和嵌入截图
|
||
- **JSON 结果** - 结构化数据,便于分析
|
||
- **操作日志** - 详细的执行记录
|
||
|
||
## 🎯 最佳实践
|
||
|
||
### 1. 测试设计
|
||
|
||
- 使用清晰的自然语言描述测试目标
|
||
- 合理设置 `max_clicks` 和 `max_depth` 避免无限探索
|
||
- 利用 `focus_patterns` 引导 AI 关注重要功能
|
||
|
||
### 2. 元素定位
|
||
|
||
- 优先使用语义化描述(如"登录按钮"而非"蓝色按钮")
|
||
- 对于复杂页面,使用配置文件精确定位
|
||
- 利用 `dangerous_patterns` 避免危险操作
|
||
|
||
### 3. 错误处理
|
||
|
||
- 查看测试报告中的截图分析失败原因
|
||
- 调整 `API_TIMEOUT` 应对网络问题
|
||
- 使用 `LOG_LEVEL=DEBUG` 获取详细日志
|
||
|
||
## 🚀 CI/CD
|
||
|
||
项目包含 GitHub Actions 配置。设置以下 Secrets 后自动运行测试:
|
||
|
||
- `ANTHROPIC_API_KEY`
|
||
- `ANTHROPIC_BASE_URL`(可选)
|
||
|
||
示例工作流:
|
||
|
||
```yaml
|
||
name: AI Web Test
|
||
on: [push, pull_request]
|
||
jobs:
|
||
test:
|
||
runs-on: ubuntu-latest
|
||
steps:
|
||
- uses: actions/checkout@v2
|
||
- name: Setup Python
|
||
uses: actions/setup-python@v2
|
||
with:
|
||
python-version: '3.9'
|
||
- name: Install dependencies
|
||
run: |
|
||
pip install -r requirements.txt
|
||
playwright install chromium
|
||
- name: Run tests
|
||
run: python tests/universal_tester.py --config tests/configs/ci_test.json
|
||
env:
|
||
ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}
|
||
```
|
||
|
||
## 📄 License
|
||
|
||
MIT
|