Selenium/Fitnesse通过TFS运行测试时会话丢失报错如何解决
问题描述
- 基于Fitnesse框架编写的Selenium自动化测试用例,通过Fitnesse自带Web端直接运行时,所有用例均可正常执行通过
- 切换为Microsoft Visual Studio Team Foundation Server(TFS)调度执行时,稳定抛出WebDriver会话不存在异常,仅偶现同一执行节点下不同测试用例运行到相同步骤时可正常执行的情况
- 已尝试操作:更新匹配EdgeDriver版本、延长Selenium Grid的
session-timeout配置时长,问题未解决
对应报错信息如下:
org.openqa.selenium.WebDriverException: Unable to execute request for an existing session: Unable to find session with ID: <session-id> Build info: version: '4.1.3', revision: '7b1ebf28ef' System info: host: 'G-WPTAPP-01', ip: '<ip>', os.name: 'Windows Server 2016', os.arch: 'amd64', os.version: '10.0', java.version: '12.0.1' Driver info: driver.version: unknown Build info: version: '4.1.2', revision: '9a5a329c5a' System info: host: 'G-WPTAPP-01', ip: '<ip>', os.name: 'Windows Server 2016', os.arch: 'amd64', os.version: '10.0', java.version: '12.0.1' Driver info: org.openqa.selenium.remote.RemoteWebDriver Command: [<session-id>, findElements {using=css selector, value=#mask}] Capabilities {acceptInsecureCerts: false, browserName: msedge, browserVersion: 102.0.1245.44, javascriptEnabled: true, ms:edgeOptions: {debuggerAddress: localhost:64446}, msedge: {msedgedriverVersion: 102.0.1245.44 (72efbf98e0b4..., userDataDir: D:\Users\svc_g-wptapp-01\Ap...}, networkConnectionEnabled: false, pageLoadStrategy: normal, platform: WINDOWS, platformName: WINDOWS, proxy: Proxy(), se:cdp: ws://<ip>:4444/sessi..., se:cdpVersion: 102.0.1245.44, setWindowRect: true, strictFileInteractability: false, timeouts: {implicit: 0, pageLoad: 300000, script: 30000}, unhandledPromptBehavior: ignore, webauthn:extension:credBlob: true, webauthn:extension:largeBlob: true, webauthn:virtualAuthenticators: true} Session ID: <session-id>
排查方向
按优先级从高到低排查:
- 检查TFS执行代理的运行模式:Fitnesse Web端运行用例时,使用的是当前登录系统的交互用户会话上下文;TFS代理默认以系统服务形式运行在Session 0隔离层,Edge、Chrome等Chromium内核浏览器在Session 0环境下存在进程随机崩溃、会话异常销毁的已知问题,这也是偶现同节点同步骤执行成功的核心原因——仅当调度到配置为交互模式运行的代理实例时才能正常跑通。
- 检查TFS的子进程回收逻辑:TFS代理默认会在单个测试步骤/单个测试用例执行完成后,主动清理该步骤启动的所有子进程。如果WebDriver实例是跨步骤、跨用例复用的,会出现Driver进程被TFS强制杀掉,但Selenium Grid侧还留存会话记录的情况,后续请求发送到Grid时就会返回找不到对应Session ID的错误。
- 检查全链路Selenium版本一致性:从报错日志可以看到同时存在Selenium 4.1.3、4.1.2两个版本的构建信息,说明Selenium Grid的Hub节点、Node节点,或者测试项目本身引用的Selenium依赖版本不统一,版本差异会导致会话心跳校验逻辑异常,会话会被Hub判定为失效主动清理。
- 检查Edge临时目录权限与冲突:日志中Edge的用户数据目录默认创建在
D:\Users\svc_g-wptapp-01\AppData\路径下,如果TFS运行账户对该目录没有完整读写权限,或者并行执行的多个测试会话复用了同一个用户数据目录,会导致Edge进程启动后秒退,Grid侧会话直接销毁。
解决方案
对应排查点逐一落地即可:
- 将执行测试任务的TFS代理从系统服务模式改为交互模式运行,使用和手动执行Fitnesse用例一致的用户账户登录系统后启动代理,配置代理随用户登录自动启动,避开Session 0隔离对浏览器进程的影响。
- 关闭TFS代理的子进程自动回收逻辑:在对应TFS构建/发布流水线的变量配置里添加
SYSTEM_DEBUG=False,同时在测试执行任务的高级配置中取消勾选「任务结束后终止子进程」选项;不要跨任务、跨步骤复用WebDriver实例,每个测试用例独立创建和销毁Driver会话,生命周期和用例执行进程绑定。 - 统一全链路依赖版本:将Selenium Grid Hub、Node节点,以及测试项目中引用的Selenium依赖全部升级到同一稳定版本,同时保证Edge浏览器和EdgeDriver的大版本完全匹配;每次测试执行前,先在Grid节点上执行命令清理残留的
msedgedriver.exe、msedge.exe进程,避免残留进程占用端口或临时目录。 - 启动EdgeDriver时显式配置独立的用户数据目录,给每个测试会话分配唯一的临时目录路径,不要使用系统默认的临时目录,同时给TFS运行账户授予该临时目录的完全控制权限,避免多会话目录冲突。
- 对于执行耗时较长的用例,在步骤间隙添加轻量会话保活逻辑,每30秒向当前会话发送一次空操作(比如获取当前页面标题),避免会话因为长时间无操作被Grid判定为空闲回收,注意保活逻辑不要插入到正常元素操作流程中。
内容的提问来源于stack exchange,提问作者W.H.J. de Jong
相关产品推荐
相关产品推荐

