VS Code Playwright扩展与命令行执行测试的行为差异解析
我为测试创建了如下自定义fixture:
export const test = base.extend<TestOptions>({ customFixture: [async ({ page, request }, use, testInfo: TestInfo) => { if(testInfo.project.name === "Mailfence") { await Utils.deleteFolderContents('allure-results'); customPage = page; await page.goto("/"); await use(""); await page.close(); await Utils.deleteFolder('test-results'); } else if (testInfo.project.name === "API"){ customRequest = request; await use(""); } }, {auto: true}] });
使用VS Code的Playwright扩展运行测试时,可正常删除test-results文件夹;但执行命令npx playwright test --project=Mailfence --headed时,会出现EBUSY资源锁定错误:
Error: EBUSY: resource busy or locked, unlink 'C:\Users\Admin\Desktop\Assessment\test-results.playwright-artifacts-0\16efa7a90bcdf961d7ca20d712f3c1c2.webm'
at utils\utils.ts:40
static async deleteFolder(folderPath: string): Promise { if(fs.existsSync(folderPath)) { fs.rmSync((folderPath), { recursive: true, force: true }); ^ } }
若在await Utils.deleteFolder('test-results');前添加延迟代码await new Promise(resolve => setTimeout(resolve, 1000));,命令行执行即可正常运行。现咨询这两种测试执行方式的行为差异是什么?
资源释放时机不同
VS Code的Playwright扩展在测试结束后,内部会自动等待Playwright相关进程(比如视频录制、文件写入的句柄)完全释放,再执行fixture的后置清理操作;而命令行模式下,page.close()执行后,Playwright可能还在后台处理视频文件的收尾写入,此时文件句柄仍被占用,直接调用删除就会触发EBUSY错误。运行环境的调度逻辑差异
VS Code扩展依托编辑器进程调度测试,测试生命周期的管理会预留更多资源释放的缓冲时间;命令行模式是直接启动独立Node.js进程执行测试,执行流程更紧凑,后置清理操作会立刻触发,没有等待资源释放的额外逻辑。Headed模式的额外影响
命令行使用--headed参数时,浏览器窗口关闭的流程比无头模式(VS Code扩展默认可能采用无头或有不同的窗口关闭逻辑)更慢,视频录制的收尾操作也需要更多时间,进一步导致文件资源未及时释放。
内容的提问来源于stack exchange,提问作者Davit Ebralidze

