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

Laravel Dusk出现InvalidSessionIdException问题求助

Laravel Dusk 随机崩溃及后续测试失败解决方案

1. 强制测试间的会话完全隔离

测试崩溃后后续无法登录,核心原因大概率是上一个测试的会话、Cookie或本地存储未彻底清除,导致环境污染。在测试类的setUp和tearDown钩子中添加强制清理逻辑:

protected function setUp(): void
{
    parent::setUp();

    $this->browse(function (Browser $browser) {
        // 清除所有Cookie
        $browser->driver->manage()->deleteAllCookies();
        // 清空本地存储和会话存储
        $browser->script('window.localStorage.clear();');
        $browser->script('window.sessionStorage.clear();');
        // 关闭所有多余标签页,只保留当前页
        foreach ($browser->driver->getWindowHandles() as $handle) {
            if ($handle !== $browser->driver->getWindowHandle()) {
                $browser->driver->switchTo()->window($handle);
                $browser->driver->close();
            }
        }
        $browser->driver->switchTo()->window($browser->driver->getWindowHandles()[0]);
    });
}

protected function tearDown(): void
{
    // 测试结束后强制退出浏览器
    $this->browse(function (Browser $browser) {
        $browser->quit();
    });

    parent::tearDown();
}

2. 优化登录函数的稳定性

你的登录函数没有等待登录操作完全完成就返回,可能导致后续测试在页面未跳转时执行,引发状态异常。修改登录函数,添加跳转等待和登录验证:

public function login(Browser $browser, string $role = 'klant_beheerder'): Browser
{
    // 先主动登出,确保初始状态干净
    try {
        $browser->visit($this->url . '/logout');
    } catch (\Exception $e) {
        // 未登录时登出可能报错,忽略即可
    }

    $browser->visit($this->url . '/')
        ->assertSee('Inloggen')
        ->type('#email', config('dusk.' . $role . '.login'))
        ->type('#password', config('dusk.' . $role . '.password'))
        ->press('.thm-tran-bg')
        // 等待跳转到登录后的首页,超时时间设为10秒
        ->waitForLocation($this->url . '/home', 10)
        // 验证登录成功的标识,确保状态正确
        ->assertSee('e2ebeheerder');

    return $browser;
}

3. 调整ChromeDriver启动参数

Chrome默认的启动参数可能导致内存占用过高或稳定性问题,在DuskTestCase的driver方法中添加优化参数:

protected function driver()
{
    $options = (new ChromeOptions)->addArguments([
        '--disable-gpu',
        '--headless=new', // 新版无头模式,性能和稳定性更优
        '--no-sandbox',
        '--disable-dev-shm-usage', // 解决Linux环境下/dev/shm内存不足的问题
        '--window-size=1920,1080', // 固定窗口大小,避免元素定位异常
        '--disable-extensions', // 禁用扩展,减少干扰
        '--disable-popup-blocking',
    ]);

    return RemoteWebDriver::create(
        'http://localhost:9515',
        DesiredCapabilities::chrome()->setCapability(
            ChromeOptions::CAPABILITY,
            $options
        )
    );
}

4. 排查测试执行顺序与并行问题

  • 关闭测试并行执行:在phpunit.xml中确保parallelize="false",并行测试容易引发环境冲突。
  • 固定测试执行顺序:如果随机执行导致某几个测试污染环境,可在测试类顶部添加@depends或在phpunit.xml中设置executionOrder="defects",优先执行容易失败的测试。

5. 捕获页面JS错误

测试崩溃可能是页面存在未处理的JS错误,在测试中添加日志捕获:

// 在测试关键步骤后添加
$logs = $browser->driver->manage()->getLog('browser');
if (!empty($logs)) {
    foreach ($logs as $log) {
        if ($log['level'] === 'SEVERE') {
            dump('JS错误:', $log['message']);
        }
    }
}

内容的提问来源于stack exchange,提问作者oelimoe

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 16:05:45