Codex v2.9.0+可基于自然语言描述自动生成含结构化断言的Playwright端到端测试脚本:需启用e2e-generator插件、关闭沙盒模式、规范输入路径与业务描述,生成后手动补全localStorage断言,并按需调整超时等待。
☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 多模态理解力帮你轻松跨越从0到1的创作门槛☜☜☜

你需要把产品核心业务流程(比如用户注册→登录→下单→支付)直接转成可执行、带断言验证的端到端自动化测试脚本,而不是手动写Playwright代码、逐行填选择器、硬编码预期值——Win11本地运行的Codex就能基于自然语言描述,自动生成含结构化断言的完整E2E测试文件。
确认Codex环境支持E2E测试生成
打开PowerShell,执行codex --version,确保返回版本号≥v2.9.0。低于此版本缺少e2e-gen子命令,后续所有生成操作将报错“command not found”且无任何提示。
检查插件状态:codex plugins list | findstr e2e,必须看到e2e-generator v1.2且状态为enabled。若未启用,运行codex plugins enable e2e-generator后关闭并重启PowerShell终端——不重启会导致插件加载失败但无报错。
【必须关闭沙盒模式才能读取本地项目路径】:编辑%USERPROFILE%\.codex\config.toml,将sandbox = true改为false,保存后重启Codex服务。沙盒开启时,Codex无法访问C:\my-project\这类用户目录下的源码文件,断言生成会卡在“scanning project structure”阶段超时退出。
准备业务路径描述与上下文约束
新建纯文本文件business-path.txt,用自然语言写清三件事:①起始页面URL(如https://localhost:3000/register);②用户动作链(如“输入邮箱→点击下一步→输入密码→勾选协议→点击注册按钮”);③关键验证点(如“跳转至/login页”“页面显示‘欢迎回来’文字”“localStorage中存在token字段”)。
不要写技术细节。错误示范:“调用page.locator('#email').fill('test@x.com')”。正确写法:“用户在注册页输入有效邮箱地址,然后点击‘下一步’按钮”。Codex会自动匹配最佳定位策略,人工写选择器反而干扰生成质量。
把business-path.txt和你的前端项目根目录(含package.json)一起放在C:\codex-e2e-inputs\下。路径中不能含中文、空格或括号,否则Codex解析时会把路径截断导致找不到playwright.config.ts配置文件。
执行E2E测试生成并注入断言逻辑
在PowerShell中执行命令:codex e2e-gen --input "C:\codex-e2e-inputs\business-path.txt" --project "C:\codex-e2e-inputs\my-web-app" --output "C:\codex-e2e-inputs\tests\reg-flow.spec.ts"。
这一步触发四阶段处理:路径语义解析→DOM结构推演→Playwright API自动选型→断言模板注入。若项目使用React,Codex会优先用getByRole;若为Vue+Pinia,则自动注入expect(store.state.user).toBeDefined()类断言。
生成完成后,立即打开reg-flow.spec.ts,检查第7行起的await expect(...)块。Codex默认只对导航跳转和可见文本做断言,【localStorage/token校验必须手动补全】:在// ✅ 验证登录态已建立注释下方插入await expect(page).toHaveLocalStorage(/token/);,否则该断言不会被生成。
运行测试并修复断言失败
进入项目根目录:cd C:\codex-e2e-inputs\my-web-app → 执行npx playwright test tests\reg-flow.spec.ts。
若报错locator resolved to 0 elements,说明页面实际渲染延迟超过默认timeout。不要修改选择器,直接在对应await page.getByRole(...).click()行上方加一行await page.waitForTimeout(800);——这是最快速的修复方式,比重写定位逻辑节省90%时间。
若断言toHaveText('欢迎回来')失败但页面确实显示该文字,大概率是React hydration未完成。把断言改成await expect(page.getByText('欢迎回来')).toBeVisible({ timeout: 10000 });,显式延长等待上限。


















