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需要通过特定注解标记测试生命周期方法,才能在对应阶段自动调用:
- 若希望每个测试方法执行完成后都关闭driver(适配你的参数化循环场景),给
finish()方法添加@After注解:
import org.junit.After; // ... 其他代码 ... @After public void finish () { driver.quit(); }
- 若希望所有测试执行完毕后仅关闭一次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
相关产品推荐
相关产品推荐

