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

