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

JUnit4+Selenium中Driver.quit()无法关闭所有浏览器窗口求助

问题描述

我正在使用JUnit4运行Selenium自动化测试,测试过程中会打开多个浏览器窗口。测试结束后我希望调用driver.quit()关闭所有窗口,但该方法并未生效。我是Java、JUnit及Selenium新手,若问题解决方案较为浅显,还望谅解。

测试代码如下:

// 在测试外部初始化WebDriver
public WebDriver driver = TestContext.StartDriver(TestContext.getDashboardsUrlSaml());


// 测试会根据参数循环执行约7次(参数未在代码中展示)  
@Test 
public void login () throws InterruptedException, ParseException {
    String currentHandle= driver.getWindowHandle();
    Thread.sleep(2000);
    java.util.Date date = (java.util.Date) new SimpleDateFormat("MM/dd/yyyy HH:mm:ss").parse("01/01/2030 00:00:00");  
    // 设置Cookie过期时间
    Cookie cookie = new Cookie(cookieName,content,"rfqasv0003d.chicago.cme.com","/sso/accountstatus",date,true);
    driver.manage().addCookie(cookie);
    Thread.sleep(1000);
    System.out.println("已为角色 " + role + " 添加Cookie");

    driver.findElement(By.id("user")).sendKeys(username);
    driver.findElement(By.id("pwd")).sendKeys(password);
    driver.findElement(By.id("loginBtn")).click();
    
    System.out.println("角色 " + role + " 登录成功");
    Thread.sleep(1000);
    
    System.out.println("角色 " + role + " 需要的仪表盘:" + dashboards);
    Thread.sleep(1000);
   
    String[] reqDashboards = dashboards.split("\\|");     
    List<String> requiredDash = Arrays.asList(reqDashboards);       
    
    Thread.sleep(2000);
    Select select = new Select(driver.findElement(By.xpath("//div[@class='document-selector']/select")));
    List<WebElement> options = select.getOptions();
    
    ArrayList<String> displayedDash = new ArrayList<String>(); 
    
    for (WebElement visibleDash: options) {
        String visDash = visibleDash.getText();
        displayedDash.add(visDash);
    }   
         
    System.out.println("显示的仪表盘:" + displayedDash);
    System.out.println("可见仪表盘数量:" + displayedDash.size());
    
    assertEquals(requiredDash.size(), displayedDash.size());
    assertTrue(requiredDash.containsAll(displayedDash));
    assertTrue(displayedDash.containsAll(requiredDash));
        
    // 退出登录
    driver.findElement(By.className("user-name")).click();
    driver.findElement(By.id("ui-id-5")).click();
    
    driver.switchTo().window(currentHandle);
    
}   

// 尝试在这里关闭driver,但测试结束后浏览器仍未关闭
public void finish () {
    driver.quit();
}
    
}
解决方案

问题核心是**finish()方法没有被JUnit自动触发执行**。JUnit4需要通过特定注解标记测试生命周期方法,才能在对应阶段自动调用:

  1. 若希望每个测试方法执行完成后都关闭driver(适配你的参数化循环场景),给finish()方法添加@After注解:
import org.junit.After;

// ... 其他代码 ...

@After
public void finish () {
    driver.quit();
}
  1. 若希望所有测试执行完毕后仅关闭一次driver,则使用@AfterClass注解,同时方法和driver变量需要改为静态:
import org.junit.AfterClass;

// 将driver改为静态变量
public static WebDriver driver = TestContext.StartDriver(TestContext.getDashboardsUrlSaml());

// ... 其他代码 ...

@AfterClass
public static void finish () {
    driver.quit();
}

额外新手提示

  • 尽量避免使用Thread.sleep(),改用Selenium的WebDriverWait显式等待,能提升测试稳定性,避免因页面加载慢导致的异常。
  • 测试过程中不要重新给driver变量赋值,防止丢失驱动引用导致无法关闭浏览器。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 12:55:39