driver.close()应在哪里声明?测试结束后如何自动关闭浏览器?
测试后自动关闭浏览器的最优实现方案
核心实现逻辑:必须把资源释放逻辑放在无论测试结果如何都会执行的代码块/钩子函数中,不能直接写在测试用例末尾,否则用例执行报错时就会跳过关闭逻辑,导致浏览器残留。
方案1:使用测试框架的后置注解(最推荐)
Java生态常用的JUnit、TestNG单元测试框架都提供了专属后置执行注解,被注解的方法会在每一条@Test用例执行完后无条件运行,不受用例成功、失败、抛异常的影响。
适配你现有业务代码的示例如下:
import org.junit.After; import org.junit.Before; import org.junit.Test; import org.openqa.selenium.WebDriver; import org.openqa.selenium.chrome.ChromeDriver; // 如果使用TestNG框架,对应注解替换为: // import org.testng.annotations.AfterMethod; // import org.testng.annotations.BeforeMethod; // import org.testng.annotations.Test; public class OrganizationTest { private WebDriver driver; // driver初始化统一放在前置注解中,全局复用同一个实例 @Before // TestNG对应@BeforeMethod public void initDriver() { driver = new ChromeDriver(); // 所有Page类新增带WebDriver参数的构造方法,统一传入全局driver实例 } @Test public void createOrganization() throws InterruptedException { new loginPage(driver) .loginToSystemAsVPTSpecialist(); new createOrganization(driver) .clickButtonCreateJA() .selectMembership() .clickButtonFillUserData(); } @After // TestNG对应@AfterMethod public void teardown() { if (driver != null) { // 优先用quit()而非close():close()仅关闭当前标签页,driver后台进程仍残留;quit()会关闭所有窗口并彻底销毁driver进程 driver.quit(); } } }
注意:不要在各个Page类内部单独初始化driver,必须统一复用前置方法中生成的driver实例,否则teardown中关闭的driver和实际执行业务的driver不是同一个,还是会出现浏览器关不掉的问题。
方案2:try-finally代码块包裹逻辑(无测试框架时用)
如果没有使用单元测试框架,直接执行测试方法,可以把业务逻辑放在try块中,关闭逻辑放在finally块中,finally块的代码无论try块是否报错都会执行:
public void createOrganization() throws InterruptedException { WebDriver driver = new ChromeDriver(); try { new loginPage(driver) .loginToSystemAsVPTSpecialist(); new createOrganization(driver) .clickButtonCreateJA() .selectMembership() .clickButtonFillUserData(); } finally { if (driver != null) { driver.quit(); } } }
补充注意事项
- 关闭driver前必须加非空判断,避免driver初始化失败时调用quit()抛出空指针异常
- 多线程跑测试用例时,需要保证每个线程的driver实例独立,避免多线程共用同一个driver导致关闭逻辑混乱
内容的提问来源于stack exchange,提问作者Jetz
相关产品推荐
相关产品推荐

