【Hermes系列3】登录回归不用先搭平台:我用 Hermes 跑通拆解→脚本→报告(实战篇:提示词可复制)

0 阅读18分钟

登录回归不用先搭平台:我用 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

系统背景

我们要测试的是一个电商秒杀与财务一体化系统的后台管理模块。

系统功能包括:

  • 商品管理(添加、编辑、删除、上下架)
  • 订单管理
  • 财务管理
  • 用户管理

测试目标

本次实战聚焦登录功能的回归测试,包括:

测试项测试内容预期结果
正常登录正确用户名 + 密码登录成功,跳转到后台首页
密码错误正确用户名 + 错误密码提示"密码错误"
用户名不存在错误用户名 + 任意密码提示"用户不存在"
空用户名用户名为空 + 任意密码提示"请输入用户名"
空密码任意用户名 + 密码为空提示"请输入密码"

测试环境

项目配置
系统 URLhttp://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 与飞书摘要等,可与本篇对照阅读,这个会在后面几天发出。


资源备忘


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 脚本骨架 - 测试数据工厂(自动生成商品数据)

如果你已经跑通了登录回归,留言告诉我你卡过的报错关键词(比如 TimeoutErrorElement not found),我会在商品管理篇里把这些坑一起覆盖。

谢谢你看到这里。

如果你也在用 Hermes 做测试,留言区回我卡在哪一环(只看页面 / 任务拆解 / 脚本生成 / 报告),我按热度整理答疑。

你现在最想测哪个模块? 订单管理/财务管理/用户管理/秒杀活动——票数高的优先排期。


动手试试

读完这篇,你可以立刻做两件小事:

  • 只发登录页 URL + 账号给 Hermes,看它生成的第一版用例是否覆盖你的 P0。

  • 复制文末提示词模板,产出一张你自己的用例表,再在本地跑一轮 Playwright。


  • P.S. 大平台、大折腾未必错,但要问一句:团队今年能投入多少维护人力。若答案是「几乎为零」,轻量的 Agent 闭环往往更诚实。

    P.P.S. 我会继续把「页面 → 用例 → 脚本」这条路径写深;关注系列可以不迷路。

—— 完 ——

关注公众号「测试员周周,也可以搜索testzhouzhougz」,获取更多 AI+ 测试实战内容

如有任何问题,可添加本人微信号