如何修改Laravel Dusk/Selenium中ChromeDriver临时文件存储位置及清理配置
问题原因
你配置--user-data-dir不生效,是因为/tmp/.com.google.Chrome.*格式的目录是Chrome/ChromeDriver运行时自动生成的临时副本,用来存运行时缓存、LocalStorage、进程锁文件,不受--user-data-dir参数控制,默认读取系统TMPDIR环境变量指定的路径生成。测试进程异常退出、Chrome未正常触发清理钩子时,这些目录就会残留堆积占满磁盘。
另外你贴的代码里--user-data-dir参数值多套了一层转义双引号,会导致Chrome参数解析失败,这也是之前配置不生效的原因之一。
方案1:自定义临时文件存储位置
Chrome生成这类临时目录时优先读取当前进程的TMPDIR环境变量,不需要额外加Chrome启动参数,只要在启动Dusk前指定环境变量即可:
- 提前创建自定义临时目录并配置权限:
mkdir -p /your/laravel/path/storage/tmp/chrome-runtime chmod 755 /your/laravel/path/storage/tmp/chrome-runtime
- 修改Dusk初始化代码,在创建Chrome实例前设置环境变量,同时修正
--user-data-dir的参数写法:
// 指定Chrome临时文件生成路径 putenv('TMPDIR=' . storage_path('tmp/chrome-runtime')); $options = (new ChromeOptions())->addArguments([ '--disable-gpu', '--headless', '--window-size=1920,1080', '--ignore-certificate-errors', '--whitelisted-ips=', // 去掉多余的引号,避免参数解析失败 '--user-data-dir=' . storage_path('tmp/chrome-user-data') ]); $browser = DesiredCapabilities::chrome(); $browser->setCapability(ChromeOptions::CAPABILITY, $options);
配置后所有.com.google.Chrome.*临时目录都会生成到你指定的storage/tmp/chrome-runtime路径下,不会再写到系统默认/tmp目录。
方案2:配置自动清理规则
可以根据自己的使用场景选对应的清理方式,避免临时文件堆积:
- 测试钩子清理:在Dusk测试基类的
tearDown()方法里加清理逻辑,测试跑完自动删除本次运行生成的临时文件:
protected function tearDown(): void { parent::tearDown(); $tmpBase = getenv('TMPDIR') ?: sys_get_temp_dir(); // 匹配所有Chrome生成的临时目录 foreach (glob($tmpBase . '/.com.google.Chrome.*') as $tmpDir) { if (!is_dir($tmpDir)) continue; // 递归删除目录内文件 array_map( fn($item) => is_dir($item) ? rmdir($item) : unlink($item), glob($tmpDir . '/*') ); rmdir($tmpDir); } }
- 系统定时任务清理:如果不想修改测试代码,可以在Ubuntu上配置crontab定时任务,定期清理过期的Chrome临时文件。执行
crontab -e加入以下规则,每小时清理一次超过1小时未修改的残留文件:
0 * * * * find /tmp -name ".com.google.Chrome.*" -type d -mmin +60 -exec rm -rf {} \;
如果用了自定义临时目录,把命令里的/tmp替换成你自己配置的临时目录路径即可。
补充:Chrome 115+版本可以额外添加启动参数
--disable-features=MediaRouter,TranslateUI,关闭不必要的内置功能,减少运行时生成的临时缓存体积。
内容的提问来源于stack exchange,提问作者furukama
相关产品推荐
相关产品推荐

