如何在webdriver.io中调整会话超时 解决长测试deleteSession报错
长测试用例末尾deleteSession报会话不存在的解决方案
你之前调整script超时的操作未生效,核心原因是该超时仅控制浏览器端同步脚本的最长执行时长,和WebDriver驱动、Selenium Grid的服务端会话空闲回收规则无关联,属于配置错位。
可落地的配置调整方案
- 本地直连浏览器驱动的场景
需在capabilities配置节点下通过timeouts字段覆盖驱动默认的会话过期阈值,不要在全局根级配置下零散设置。参考配置:capabilities: [{ maxInstances: 1, browserName: 'chrome', timeouts: { // 会话空闲超时:单位毫秒,需比单条最长测试用例的运行时长预留30%冗余,比如3小时用例可配置为14400000(即4小时) session: 14400000, script: 1000000, pageLoad: 300000, implicit: 5000 } }] - Selenium Grid分布式执行的场景
客户端的超时配置优先级低于Grid的全局硬规则,仅客户端配置无法生效。需要在Grid服务的启动参数中调整全局会话超时阈值,示例启动命令:
注意:如果Grid的会话超时阈值低于你客户端配置的时长,服务端仍会按自身规则回收会话。# 将Grid默认30分钟的空闲会话回收规则调整为4小时 java -jar selenium-server-4.x.x.jar standalone --session-timeout 4h - 同步调整Mocha框架的执行超时
在mochaOpts配置节点下将测试执行超时调整到和你长测运行时长匹配的范围,避免框架在测试执行中途主动断开连接:mochaOpts: { ui: 'bdd', // 单位毫秒,3小时的长测预留冗余可配置为12600000(即3.5小时) timeout: 12600000 }
兜底容错方案
即便配置了合理的超时规则,仍可能因网络波动、驱动异常导致会话提前被回收,可通过以下方式避免deleteSession失败直接中断流程:
- 在全局
after钩子里增加会话状态校验逻辑,调用deleteSession前先判断会话是否有效,如果会话已被服务端回收,直接跳过清理操作,不抛出异常中断流程。示例实现:after () { const isSessionValid = browser.sessionId && browser.isConnected if (!isSessionValid) { console.log('会话已提前被服务端回收,跳过deleteSession清理操作') return } browser.deleteSession() } - 给长测试用例增加定时心跳逻辑:在2-3小时的执行周期内,每隔10-15分钟发送一次轻量WebDriver请求(比如获取当前页面URL),维持会话活跃状态,避免触发服务端的空闲超时回收规则。
// 测试启动时初始化心跳定时器 const heartbeatTimer = setInterval(() => { try { browser.getUrl() } catch (e) { console.log('心跳请求异常,当前会话可能已失效') } }, 600000) // 每10分钟执行一次心跳请求 // 测试结束时清除定时器 after(() => { clearInterval(heartbeatTimer) })
内容的提问来源于stack exchange,提问作者Vasiliy
相关产品推荐
相关产品推荐

