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
相关产品推荐
相关产品推荐

