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

执行XML中多测试类出现Session not created异常如何解决

问题根因

报错本质是TestNG注解作用域和WebDriver会话生命周期不匹配导致的:

  • TestNG 中@BeforeTest注解的作用域是对应测试XML中单个<test>标签的全范围,整个<test>下的所有测试类只会执行一次@BeforeTest的逻辑,也就是说你全程只有一个WebDriver实例
  • 你在@AfterClass中调用driver.close(),第一个测试类执行完成后就直接关闭了唯一的WebDriver会话,后续测试类调用已销毁的驱动实例时自然会抛出会话不存在的异常,直接被跳过。
解决方案

方案1:每个测试类使用独立的浏览器会话(推荐,类之间无耦合)

修改注解作用域,将驱动初始化逻辑从@BeforeTest改为@BeforeClass,保证每个类运行前都会创建新的驱动实例:

// 每个类执行前初始化新驱动
@BeforeClass
public void initDriver(){
    // 原有的Chrome驱动初始化逻辑
    driver = new ChromeDriver();
}

// 每个类执行完成后关闭当前类的驱动
@AfterClass
public void tearDown(){
    if(driver!=null){
        driver.quit();
    }
}

方案2:整个标签下所有类共用同一个浏览器会话

如果需要多类复用同一个驱动会话,就把驱动销毁逻辑从@AfterClass移到@AfterTest中,等所有测试类都执行完成后再关闭驱动:

// 保持原有的@BeforeTest初始化逻辑
@BeforeTest
public void initDriver(){
    driver = new ChromeDriver();
}

// 从@AfterClass中删除driver.close,改到@AfterTest中执行
@AfterTest
public void tearDown(){
    if(driver!=null){
        driver.quit();
    }
}
补充注意点
  • 尽量用driver.quit()代替driver.close(),前者会销毁整个驱动进程,后者只会关闭当前标签页,如果浏览器只有一个标签页时两者效果一致,但多标签场景下close()会残留驱动进程,容易引发后续端口占用问题
  • 如果需要并行执行测试类,建议优先选择方案1,避免多线程复用同一个驱动实例引发的线程安全问题

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.13 06:12:02