Geb结合Selenoid:为类/规范中每个测试创建新会话
解决Geb + Selenoid每个测试生成独立视频的问题
要实现每个测试方法对应独立的Selenoid视频,核心是让每个测试方法启动全新的WebDriver会话,同时避免"Session ID is null"的错误。以下是可行的配置和代码调整方案:
1. 正确配置Geb的Driver缓存
在GebConfig.groovy中设置:
cacheDriver = false quitDriverOnBrowserReset = true
cacheDriver = false:禁止Geb复用Driver实例,确保每次请求Driver时创建新会话quitDriverOnBrowserReset = true:重置浏览器时自动退出当前Driver,释放Selenoid会话
2. 利用测试框架钩子(以Spock为例)
在测试规范类中,通过setup()和cleanup()方法手动管理Driver生命周期:
class YourTestSpec extends GebSpec { def setup() { // 强制创建新Driver会话(覆盖默认缓存逻辑) browser.driver = CachingDriverFactory.getDriver() } def cleanup() { // 退出当前Driver并清理缓存,确保下一个测试启动新会话 CachingDriverFactory.clearCacheAndQuitDriver() browser.clearCookies() } // 测试方法示例 def "测试方法1"() { when: go "https://example.com" then: title == "Example Domain" } def "测试方法2"() { when: go "https://google.com" then: title.contains("Google") } }
setup():在每个测试前主动获取新Driver,确保会话独立cleanup():测试结束后立即退出Driver并清理缓存,避免残留会话导致的错误
3. 配置Selenoid动态视频命名
在GebConfig.groovy的Capabilities中设置动态视频文件名,方便区分每个测试:
capabilities = { browserName = "chrome" "selenoid:options" = [ enableVNC: true, enableVideo: true, videoName: { "${specName}_${testName}.mp4" } // 用测试类名+方法名命名视频 ] }
常见问题排查
- 若仍出现"Session ID is null":检查是否存在全局共享的Driver实例,或测试中是否有未正确清理的Driver引用
- 若视频仍合并为一个:确认
cacheDriver = false配置是否生效,以及每个测试后是否确实调用了clearCacheAndQuitDriver()
内容的提问来源于stack exchange,提问作者Константин Тонков
相关产品推荐
相关产品推荐

