You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 17:54:02