Laravel Dusk 会话间残留登录信息 如何彻底清除所有会话数据
问题根源
你写在setUp里的清理逻辑永远不会生效:static::$browsers数组是调用browse方法创建浏览器实例后才会填充的,setUp阶段还没有初始化任何浏览器实例,自然是空数组。之前能正常生效只是巧合,大概率是旧版本Dusk默认启用了临时会话,重装后默认配置变更才暴露了逻辑问题。
解决方案(按推荐优先级排序)
1. 配置Chrome启动参数从根源杜绝会话残留(最稳定)
直接让Chrome每次启动都使用无痕模式或者临时用户目录,关闭后所有会话数据自动清空,不需要手动处理cookie。
修改DuskTestCase中的driver方法,新增启动参数:
protected function driver() { $options = (new ChromeOptions())->addArguments([ '--disable-gpu', '--headless', '--no-sandbox', // 新增以下任意一个参数即可 '--incognito', // 启用无痕模式,所有数据关闭即销毁 // 或者每次使用全新临时用户目录 '--user-data-dir=' . sys_get_temp_dir() . '/chrome-dusk-' . uniqid(), ]); return RemoteWebDriver::create( 'http://localhost:9515', DesiredCapabilities::chrome()->setCapability(ChromeOptions::CAPABILITY, $options) ); }
2. 重写newBrowser方法在实例创建后清理cookie
如果不想修改浏览器启动参数,可以在浏览器实例初始化完成的钩子中执行清理逻辑:
// 放在DuskTestCase类中 protected function newBrowser($driver) { $browser = parent::newBrowser($driver); $browser->driver->manage()->deleteAllCookies(); // 也可以直接用Dusk封装的方法:$browser->flushCookies(); return $browser; }
3. 单测试用例兜底清理
如果只有个别测试用例需要确保无登录状态,可以在测试用例最开头手动清理:
public function test_new_user_register() { $this->browse(function ($browser) { $browser->flushCookies() ->visit('/register') // 剩余测试逻辑 ; }); }
内容的提问来源于stack exchange,提问作者vue-coder
相关产品推荐
相关产品推荐

