登录回归不用先搭平台:我用 Hermes 跑通拆解→脚本→报告(实战③·提示词可复制)
文 / 测试员周周
先给结论: 登录回归不必先搭测试平台,也不必先写一摞 Skills。把登录页 URL、账号、预期结果说清楚(甚至只丢一个页面),Hermes 能一条龙做完拆解 → 用例表 → Playwright → JSON → HTML → 复盘建议;下文提示词均可直接复制。**
**
复制下面整段,打开 Hermes 就能开聊(还没扒元素 ID 也行:能打开页面就让它先看再写;环境隔离就改成「根据截图推断」):
请打开 http://localhost:5000/login,结合页面结构推断用户名、密码、登录按钮的稳定定位方式(优先 id/name,其次 role/label)。
然后按我给的账号 admin/123456,列出登录回归的 P0/P1 用例草案,不要先写代码。
再回到后文「明细版」补全 ID,一般多一轮对话,比从头手抄定位器省心。
01
这是 Hermes 系列第 3 篇(实战篇)。上一篇我们跑通了 Hermes + 飞书。本篇只回答一件事:登录回归这种老任务,能不能交给 Agent,从拆解到报告一条龙做完?
如果你也遇到过这些场景,这篇就是给你写的:
- 每天重复执行相同的回归测试,枯燥又容易出错
- 想引入 AI 辅助测试,但不知道从哪一句提示词开始
- 测试报告要手动整理,费时费力
- 团队新人多,缺的不是模板,而是带上下文的、可执行步骤
我承诺与文首一致:不必先有 AI 方法论,说清楚链接、账号和预期(甚至只丢一个页面),Hermes 就能把你最耗时的「从 0 到 1」扛掉大半。
02
说句扎心的:这些年我们不是没想过自动化。
更早那一波是自建测试平台 / 测试管理系统:前后端、权限、报表、和流水线对齐——像个小产品。能管协作,但太重,很多团队最后卡在维护和运营,而不是卡在“没需求”。
近半年行业里又在聊 Skills、插件化编排——确实比大平台轻,但你仍然要写技能、改版本、对齐文档:多聪明的人,也会被“维护另一套制品库”拖住。
我现在更常用第三种:把页面交给 Hermes。URL、截图、甚至“这页大概长什么样”的一句话,配上账号与预期,它能在工具链里看清表单与跳转,再推导用例、补全定位器、生成可跑脚本和报告草稿。不是替你签发布上线,而是把写第一版用例和脚本的时间砍到接近零。
如果你已经配好了 Playwright / 浏览器 相关能力,这类路径往往连单独的 Skills 文件都不用先写——对话即工作流;需要固化时,再考虑抽成模板或脚本仓库。
边界也要讲清楚:纯内网、涉密、Hermes 无法直连你本机服务时,下面生成的脚本仍要你本地执行;合规审计要求下,P0 用例建议人工过一眼再跑批。
03
本篇交付:对电商后台登录做回归(UI + 与登录相关的结果断言),并产出结构化报告。你会带走:
- 可复制提示词:拆解 → 用例表 → Playwright → JSON → HTML → 复盘建议
- 一条完整闭环:说人话 → 出表格 → 出脚本 → 跑批 → 出可视化
- 知道哪一步适合全自动、哪一步必须人审
04
系统背景
我们要测试的是一个电商秒杀与财务一体化系统的后台管理模块。
系统功能包括:
- 商品管理(添加、编辑、删除、上下架)
- 订单管理
- 财务管理
- 用户管理
测试目标
本次实战聚焦登录功能的回归测试,包括:
| 测试项 | 测试内容 | 预期结果 |
|---|---|---|
| 正常登录 | 正确用户名 + 密码 | 登录成功,跳转到后台首页 |
| 密码错误 | 正确用户名 + 错误密码 | 提示"密码错误" |
| 用户名不存在 | 错误用户名 + 任意密码 | 提示"用户不存在" |
| 空用户名 | 用户名为空 + 任意密码 | 提示"请输入用户名" |
| 空密码 | 任意用户名 + 密码为空 | 提示"请输入密码" |
测试环境
| 项目 | 配置 |
|---|---|
| 系统 URL | http://localhost:5000 |
| 测试账号 | admin / 123456 |
| 浏览器 | Chrome / Firefox |
| 测试工具 | Hermes Agent + Playwright |
下表中的 URL 与账号仅为本地演示示例,实操时请替换为你自己的环境与凭据。
05
文首已给 30 秒起手式;下面从「明细版」走起,方便你和正文里的用例表、脚本字段一一对照(元素 ID、5 条用例与后文 Playwright 完全对齐)。
第一步:告诉 Hermes 要做什么
打开你与 Hermes 的对话(飞书机器人或 CLI),输入以下提示词:
我要对一个电商后台管理系统做登录页(UI)的回归测试。
系统信息:
登录页面:http://localhost:5000/login
测试账号:用户名 admin,密码 123456
用户名输入框 ID:username
密码输入框 ID:password
登录按钮 ID:login-btn
请帮我:
拆解测试任务为可执行的步骤
生成 5 个测试用例(正常登录、密码错误、用户名不存在、空用户名、空密码)
输出结构化的测试用例表格
Hermes 返回的任务拆解
Hermes 会返回类似下面的内容:
【任务理解】
你需要对电商后台管理系统的登录功能进行回归测试,包含 5 个测试场景。
【测试步骤拆解】
步骤 1:环境准备
打开浏览器
访问登录页面
清除缓存和 Cookie
步骤 2:执行测试用例
用例 1:正常登录(admin / 123456)
用例 2:密码错误(admin / wrong123)
用例 3:用户名不存在(testuser / 123456)
用例 4:空用户名(空 / 123456)
用例 5:空密码(admin / 空)
步骤 3:记录结果
每个用例的执行结果(通过/失败)
实际响应与预期对比
截图保存(失败用例)
步骤 4:生成报告
汇总测试结果
统计通过率
输出问题列表
第二步:让 Hermes 生成测试用例
继续输入:
请把上面的测试步骤转换成可执行的测试用例表格,包含以下列:
用例编号
用例名称
前置条件
测试步骤
测试数据
预期结果
优先级
Hermes 会返回:
【登录功能回归测试用例】
编号 名称 前置条件 测试步骤 测试数据 预期结果 优先级
TC001 正常登录 已注册账号 1.打开登录页 2.输入用户名 3.输入密码 4.点击登录 用户名:admin 密码:123456 登录成功,跳转到 /products 页面 P0
TC002 密码错误 已注册账号 1.打开登录页 2.输入用户名 3.输入错误密码 4.点击登录 用户名:admin 密码:wrong123 提示"密码错误",停留在登录页 P0
TC003 用户名不存在 无 1.打开登录页 2.输入不存在的用户名 3.输入任意密码 4.点击登录 用户名:testuser 密码:123456 提示"用户不存在" P1
TC004 空用户名 无 1.打开登录页 2.不输入用户名 3.输入密码 4.点击登录 用户名:(空) 密码:123456 提示"请输入用户名" P1
TC005 空密码 已注册账号 1.打开登录页 2.输入用户名 3.不输入密码 4.点击登录 用户名:admin 密码:(空) 提示"请输入密码" P1
06
第三步:生成 Playwright 自动化脚本
输入提示词:
请用 Python + Playwright 为上面的 5 个测试用例生成自动化测试脚本。
要求:
每个用例一个独立函数
包含断言检查
失败时自动截图
输出测试结果到 JSON 文件
添加详细注释,方便新人理解
Hermes 会生成类似下面的脚本:
#!/usr/bin/env python3
"""
电商后台登录功能回归测试脚本
使用 Playwright 进行浏览器自动化测试
生成:Hermes Agent
"""
from playwright.sync_api import sync_playwright
import json
from datetime import datetime
测试配置
BASE_URL = "http://localhost:5000"
LOGIN_URL = f"{BASE_URL}/login"
TEST_ACCOUNT = {"username": "admin", "password": "123456"}
def run_test(case_id, case_name, username, password, expected_success, expected_message):
"""
执行单个登录测试用例
参数:
case_id: 用例编号
case_name: 用例名称
username: 测试用户名
password: 测试密码
expected_success: 是否预期登录成功
expected_message: 预期的提示信息
返回:
dict: 测试结果(包含是否通过、实际消息、截图路径等)
"""
result = {
"case_id": case_id,
"case_name": case_name,
"status": "pending",
"actual_message": "",
"screenshot": None,
"error": None
}
with sync_playwright() as p:
# 启动浏览器
browser = p.chromium.launch(headless=False) # headless=False 可以看到操作过程
page = browser.new_page()
try:
# 步骤 1:打开登录页面
page.goto(LOGIN_URL, timeout=10000)
# 步骤 2:输入用户名
if username:
page.fill("#username", username)
# 步骤 3:输入密码
if password:
page.fill("#password", password)
# 步骤 4:点击登录按钮
page.click("#login-btn")
# 步骤 5:等待响应(等待 URL 变化或提示消息)
page.wait_for_timeout(2000)
# 步骤 6:检查结果
if expected_success:
# 预期成功:检查是否跳转到 products 页面
if "/products" in page.url:
result["status"] = "passed"
result["actual_message"] = "登录成功,页面跳转正确"
else:
result["status"] = "failed"
result["actual_message"] = f"登录失败,当前 URL: {page.url}"
result["screenshot"] = f"screenshots/{case_id}_failed.png"
page.screenshot(path=result["screenshot"])
else:
# 预期失败:检查是否有错误提示
error_message = page.text_content(".error-message") or page.text_content(".alert")
if error_message and expected_message in error_message:
result["status"] = "passed"
result["actual_message"] = f"正确显示错误提示:{error_message}"
else:
result["status"] = "failed"
result["actual_message"] = f"错误提示不匹配,实际:{error_message}"
result["screenshot"] = f"screenshots/{case_id}_failed.png"
page.screenshot(path=result["screenshot"])
except Exception as e:
result["status"] = "failed"
result["error"] = str(e)
result["screenshot"] = f"screenshots/{case_id}_error.png"
page.screenshot(path=result["screenshot"])
finally:
browser.close()
return result
def main():
"""主测试函数"""
print("=" * 60)
print("电商后台登录功能回归测试")
print("=" * 60)
# 定义 5 个测试用例
test_cases = [
{
"case_id": "TC001",
"case_name": "正常登录",
"username": "admin",
"password": "123456",
"expected_success": True,
"expected_message": "登录成功"
},
{
"case_id": "TC002",
"case_name": "密码错误",
"username": "admin",
"password": "wrong123",
"expected_success": False,
"expected_message": "密码错误"
},
{
"case_id": "TC003",
"case_name": "用户名不存在",
"username": "testuser",
"password": "123456",
"expected_success": False,
"expected_message": "用户不存在"
},
{
"case_id": "TC004",
"case_name": "空用户名",
"username": "",
"password": "123456",
"expected_success": False,
"expected_message": "请输入用户名"
},
{
"case_id": "TC005",
"case_name": "空密码",
"username": "admin",
"password": "",
"expected_success": False,
"expected_message": "请输入密码"
}
]
# 执行测试
results = []
for case in test_cases:
print(f"\n执行 {case['case_id']}: {case['case_name']}...")
result = run_test(**case)
results.append(result)
# 打印结果
status_icon = "✅" if result["status"] == "passed" else "❌"
print(f"{status_icon} {case['case_id']}: {result['status']}")
print(f" 结果:{result['actual_message']}")
# 生成测试报告
report = {
"test_time": datetime.now().isoformat(),
"total_cases": len(results),
"passed": sum(1 for r in results if r["status"] == "passed"),
"failed": sum(1 for r in results if r["status"] == "failed"),
"results": results
}
# 保存报告
with open("test_report.json", "w", encoding="utf-8") as f:
json.dump(report, f, ensure_ascii=False, indent=2)
# 打印汇总
print("\n" + "=" * 60)
print("测试汇总")
print("=" * 60)
print(f"总用例数:{report['total_cases']}")
print(f"通过:{report['passed']} ✅")
print(f"失败:{report['failed']} ❌")
print(f"通过率:{report['passed']/report['total_cases']*100:.1f}%")
print(f"\n详细报告已保存到:test_report.json")
if __name__ == "__main__":
main()
07
第四步:运行测试脚本
在终端执行以下命令:
1. 安装依赖(首次执行需要)
pip install playwright
2. 安装浏览器
playwright install chromium
3. 创建截图目录
mkdir -p screenshots
4. 运行测试
python login_test.py
执行过程
你会看到类似这样的输出:
============================================================
电商后台登录功能回归测试
============================================================
执行 TC001: 正常登录...
✅ TC001: passed
结果:登录成功,页面跳转正确
执行 TC002: 密码错误...
✅ TC002: passed
结果:正确显示错误提示:密码错误
执行 TC003: 用户名不存在...
✅ TC003: passed
结果:正确显示错误提示:用户不存在
执行 TC004: 空用户名...
✅ TC004: passed
结果:正确显示错误提示:请输入用户名
执行 TC005: 空密码...
✅ TC005: passed
结果:正确显示错误提示:请输入密码
============================================================
测试汇总
============================================================
总用例数:5
通过:5 ✅
失败:0 ❌
通过率:100.0%
详细报告已保存到:test_report.json
测试报告内容
打开 test_report.json,你会看到:
{
"test_time": "2026-04-08T18:30:00",
"total_cases": 5,
"passed": 5,
"failed": 0,
"results": [
{
"case_id": "TC001",
"case_name": "正常登录",
"status": "passed",
"actual_message": "登录成功,页面跳转正确",
"screenshot": null,
"error": null
},
{
"case_id": "TC002",
"case_name": "密码错误",
"status": "passed",
"actual_message": "正确显示错误提示:密码错误",
"screenshot": null,
"error": null
}
// ... 其他用例
]
}
08
第五步:生成 HTML 测试报告
输入提示词:
请把上面的 JSON 测试报告转换成 HTML 格式的可视化报告。
要求:
包含测试汇总(总用例数、通过率、执行时间)
用表格展示每个用例的详情
通过用例用绿色标记,失败用例用红色标记
失败用例附上截图
样式简洁专业,适合发给团队和领导
Hermes 会生成 HTML 报告模板,你可以用 Python 脚本自动填充数据:
生成 HTML 报告的辅助脚本
def generate_html_report(report_data, output_file="test_report.html"):
"""生成 HTML 测试报告"""
html_template = """
📊 登录功能回归测试报告
测试时间:{test_time}
总用例数
{total}
通过
{passed}
失败
{failed}
通过率
{pass_rate}%
测试用例详情
{test_rows}
用例编号 用例名称 状态 实际结果 截图
"""
# 生成测试用例行
test_rows = ""
for result in report_data["results"]:
status_class = "passed" if result["status"] == "passed" else "failed"
status_icon = "✅" if result["status"] == "passed" else "❌"
screenshot_html = f'' if result["screenshot"] else "-"
test_rows += f"""
{result["case_id"]}
{result["case_name"]}
{status_icon} {result["status"]}
{result["actual_message"]}
{screenshot_html}
"""
# 计算通过率
pass_rate = report_data["passed"] / report_data["total_cases"] * 100
# 填充模板
html_content = html_template.format(
test_time=report_data["test_time"],
total=report_data["total_cases"],
passed=report_data["passed"],
failed=report_data["failed"],
pass_rate=f"{pass_rate:.1f}",
test_rows=test_rows
)
# 保存文件
with open(output_file, "w", encoding="utf-8") as f:
f.write(html_content)
print(f"✅ HTML 报告已生成:{output_file}")
使用示例
import json
with open("test_report.json", "r", encoding="utf-8") as f:
report_data = json.load(f)
generate_html_report(report_data)
09
第六步:让 Hermes 给出改进建议
输入提示词:
这是今天的测试结果:
总用例数:5
通过:5
失败:0
通过率:100%
请帮我分析:
测试覆盖是否充分
还有哪些边界场景需要补充
给出一份测试改进建议
Hermes 会返回:
【测试结果分析】
✅ 当前测试覆盖情况:
正常场景:已覆盖(TC001)
异常场景:已覆盖密码错误、用户名不存在(TC002、TC003)
边界场景:已覆盖空输入(TC004、TC005)
📋 建议补充的测试场景:
安全性测试
- SQL 注入尝试(用户名输入:' OR '1'='1)
- XSS 攻击尝试(用户名输入:)
- 暴力破解防护(连续 10 次错误密码)
性能测试
- 登录接口响应时间(要求 < 500ms)
- 并发登录测试(10 用户同时登录)
兼容性测试
- 不同浏览器(Chrome、Firefox、Safari)
- 移动端适配(手机浏览器)
用户体验
- 密码显示/隐藏切换
- 记住登录状态
- 忘记密码功能
【优先级建议】
P0(立即补充):SQL 注入防护测试
P1(本周补充):XSS 防护测试、响应时间测试
P2(下次迭代):并发测试、兼容性测试
10
一次完整的 Hermes 辅助测试流程
┌─────────────────────────────────────────────────────┐
│ 1. 告诉 Hermes 测试目标 │
│ ↓ │
│ 2. Hermes 拆解任务为可执行步骤 │
│ ↓ │
│ 3. Hermes 生成测试用例表格 │
│ ↓ │
│ 4. Hermes 生成自动化测试脚本 │
│ ↓ │
│ 5. 执行测试脚本 │
│ ↓ │
│ 6. Hermes 生成可视化测试报告 │
│ ↓ │
│ 7. Hermes 分析结果并给出改进建议 │
└─────────────────────────────────────────────────────┘
关键提示词模板
你可以直接复制使用:
【任务拆解】
我要对 [系统名称] 的 [功能模块] 进行回归测试。
系统信息:[URL、账号、元素 ID 等]
请帮我拆解测试任务为可执行的步骤。
【测试用例生成】
请把上面的测试步骤转换成可执行的测试用例表格,
包含:用例编号、用例名称、前置条件、测试步骤、测试数据、预期结果、优先级。
【脚本生成】
请用 Python + Playwright 为上面的测试用例生成自动化测试脚本。
要求:每个用例独立函数、包含断言、失败截图、输出 JSON 报告、添加详细注释。
【报告生成】
请把 JSON 测试报告转换成 HTML 格式的可视化报告。
要求:包含汇总信息、表格展示详情、通过/失败颜色标记、附截图、样式专业。
【结果分析】
这是测试结果:[粘贴测试数据]
请分析测试覆盖是否充分,还有哪些边界场景需要补充,给出改进建议。
11
我建议你保留的「人」环节
- 用例表的第一版: Hermes 很快,但业务断言(例如精确文案、是否允许多端同时登录)仍建议负责人扫一眼 P0 行。
- 失败截图定位: 自动化的价值一半在可复现附件;发报告前确认截图路径在 JSON 里真的存在。
- 稳定性:
wait_for_timeout只适合 demo;上线前可以让 Hermes 把等待改成显式等待 URL / 文案 / 网络静默,减少间歇性爆红。
12
Q1:Hermes 生成的脚本运行报错怎么办?
A:把错误信息复制给 Hermes,让它帮你修复。例如:
运行脚本报错:
playwright._impl._api_types.TimeoutError: Timeout 10000ms exceeded.
请帮我分析原因并修复脚本。
Q2:元素 ID 找不到怎么办?
A:让 Hermes 帮你生成元素定位脚本:
请帮我生成一个 Python 脚本,用 Playwright 打开登录页面,
打印出所有输入框和按钮的 ID、name、class 等属性,
方便我找到正确的元素定位器。
Q3:测试环境不稳定,经常超时怎么办?
A:让 Hermes 添加重试机制:
请在脚本中添加重试逻辑:
每个用例最多重试 3 次
每次重试间隔 2 秒
记录重试次数到报告
13
同系列另有一篇 工程化加餐,涉及测试数据工厂、hermes cron 与飞书摘要等,可与本篇对照阅读,这个会在后面几天发出。
资源备忘
- Hermes GitHub:github.com/NousResearc…
14
我踩的坑(真实复盘)
坑 1:元素 ID 写错,脚本跑不通
- 现象:Hermes 生成的脚本运行时提示
Element not found - 原因:我手动写的 ID(
login-btn)和页面实际 ID(login-button)差一个字母 - 解决:让 Hermes 先打开页面自己识别元素,或者用浏览器的开发者工具复制 selector
坑 2:超时等待设置太短
- 现象:测试偶尔失败,提示超时
- 原因:本地环境慢的时候,5 秒超时不够
- 解决:把
timeout=5000改成timeout=15000,或者用wait_for_selector代替固定等待
坑 3:中文路径导致截图失败
- 现象:测试通过,但截图保存报错
- 原因:Windows 下中文路径编码问题
- 解决:截图路径用英文,或者在 Python 文件开头加
# -- coding: utf-8 --
坑 4:JSON 报告乱码
- 现象:生成的 JSON 文件打开是乱码
- 原因:文件编码不是 UTF-8
- 解决:用
json.dump(result, f, ensure_ascii=False, indent=2)保存
下篇预告(实战④)
下一篇我们做商品管理模块的测试实战:
-
场景:新增商品 + 查询商品(字段多、边界多、组合多)
-
挑战:
-
必填项 vs 选填项怎么测 - 价格/库存的边界值怎么设计 - 查询条件的组合爆炸怎么覆盖
-
交付:
-
11 条用例思路 - Page Object 脚本骨架 - 测试数据工厂(自动生成商品数据)
如果你已经跑通了登录回归,留言告诉我你卡过的报错关键词(比如 TimeoutError、Element not found),我会在商品管理篇里把这些坑一起覆盖。
谢谢你看到这里。
如果你也在用 Hermes 做测试,留言区回我卡在哪一环(只看页面 / 任务拆解 / 脚本生成 / 报告),我按热度整理答疑。
你现在最想测哪个模块? 订单管理/财务管理/用户管理/秒杀活动——票数高的优先排期。
动手试试
读完这篇,你可以立刻做两件小事:
-
只发登录页 URL + 账号给 Hermes,看它生成的第一版用例是否覆盖你的 P0。
-
复制文末提示词模板,产出一张你自己的用例表,再在本地跑一轮 Playwright。
-
P.S. 大平台、大折腾未必错,但要问一句:团队今年能投入多少维护人力。若答案是「几乎为零」,轻量的 Agent 闭环往往更诚实。
P.P.S. 我会继续把「页面 → 用例 → 脚本」这条路径写深;关注系列可以不迷路。
—— 完 ——
关注公众号「测试员周周,也可以搜索testzhouzhougz」,获取更多 AI+ 测试实战内容
如有任何问题,可添加本人微信号