多次运行Selenium UI自动化后Mac存储空间不足问题求助
问题根因
你遇到的存储空间占用后重启恢复的问题,本质是Chrome运行时生成的临时用户数据目录未被正常删除。Mac系统的临时文件默认存放在/private/var/folders/路径下,重启后系统会自动清理该目录下的过期文件,所以重启后存储会恢复。
现有代码的潜在问题:
cleanupDrivers仅在流程正常执行时触发,一旦出现用例崩溃、jest提前退出、进程被手动终止等异常场景,driver.quit()没有执行机会,Chrome进程被强制杀死,不会主动删除自身的临时数据目录- 即使加了
--incognito无痕参数,无头模式下Chrome每次启动仍会生成独立的临时用户目录,单次占用从数百MB到数GB不等,多次执行后累积占用可达数十GB - 你使用的
selenium-webdriver@4.0.0-beta.4是测试版本,存在已知的driver.quit()执行失效的bug
修复方案
- 强制兜底执行清理逻辑
在你的驱动工具文件中添加进程事件监听和jest全局钩子,无论执行是否正常都触发清理:
// jest全量用例执行结束后统一清理 afterAll(async () => { await cleanupDrivers(); driversToCleanUp.length = 0; }); // 监听进程退出信号,异常终止时也执行清理 process.on('SIGINT', async () => { await cleanupDrivers(); process.exit(0); }); process.on('SIGTERM', async () => { await cleanupDrivers(); process.exit(0); });
如果你的用例是每个测试用例独立创建driver,建议在afterEach钩子中清理当前用例的driver,不要等到所有用例跑完再统一清理。
- 优化Chrome启动参数,减少存储占用
在setChromeOptions方法中新增以下参数:
options.addArguments("--disk-cache-size=0"); // 禁用磁盘缓存 options.addArguments("--media-cache-size=0"); // 禁用媒体缓存 options.addArguments("--disable-dev-shm-usage"); // 减少共享内存占用
也可以手动指定临时目录,清理时主动删除目录更保险:
import * as fs from 'fs'; import * as os from 'os'; import * as path from 'path'; // 生成独立临时目录 const tempDir = fs.mkdtempSync(path.join(os.tmpdir(), 'chrome-test-')); options.addArguments(`--user-data-dir=${tempDir}`); // 清理阶段除了调用driver.quit(),再递归删除临时目录 const rmDirRecursive = (dir: string) => { if (fs.existsSync(dir)) { fs.readdirSync(dir).forEach(file => { const curPath = path.join(dir, file); if (fs.lstatSync(curPath).isDirectory()) rmDirRecursive(curPath); else fs.unlinkSync(curPath); }); fs.rmdirSync(dir); } };
- 升级依赖版本
将selenium-webdriver升级到4.x正式版本,同时保证chromedriver的大版本和你本地安装的Chrome浏览器大版本完全匹配,避免版本不兼容导致的清理命令失效问题。
内容的提问来源于stack exchange,提问作者Scott Brass
相关产品推荐
相关产品推荐

