Selenium问题:Chrome、Firefox浏览器未按预期关闭
解决Cucumber+Selenium中Chrome/Firefox浏览器无法自动关闭的问题
问题代码
public class MS848Steps { WebDriver driver; @Given("Website is live and available") public void website_is_live_and_available() { System.out.println("Website is live and available!"); } @When("Website works on Firefox") public void website_works_on_firefox() { driver = new FirefoxDriver(); driver.get("https://demowebshop.tricentis.com/"); System.out.println("Website works on Firefox!"); } @And("Website works on Chrome") public void website_works_on_chrome() { ChromeOptions options = new ChromeOptions(); options.addArguments("--remote-allow-origins=*"); driver = new ChromeDriver(options); driver.get("https://demowebshop.tricentis.com/"); System.out.println("Website works on Chrome!"); } @And("Website works on Edge") public void website_works_on_edge() { driver = new EdgeDriver(); driver.get("https://demowebshop.tricentis.com/"); System.out.println("Website works on Edge!"); } @Then("Website works on every browser") public void website_works_on_every_browser() { System.out.println("Website works on every Browsers!"); } @After public void tearDown() { if (driver != null) { driver.quit(); } } }
问题描述
执行上述代码后,Chrome和Firefox浏览器始终无法自动关闭,手动在每个浏览器启动步骤中添加driver.close()或driver.quit()也无效果。
原因分析
核心问题是浏览器实例引用丢失:每次启动新浏览器时,driver变量会被重新赋值,覆盖掉之前的Firefox/Chrome实例引用。@After方法只会关闭最后赋值的Edge浏览器,之前的Chrome和Firefox实例因为没有被引用,无法被quit()调用,导致进程残留。
解决方案
方案1:保存所有浏览器实例,统一关闭
将单个driver变量改为集合,保存所有启动的浏览器实例,在@After中遍历逐个关闭:
public class MS848Steps { List<WebDriver> drivers = new ArrayList<>(); @Given("Website is live and available") public void website_is_live_and_available() { System.out.println("Website is live and available!"); } @When("Website works on Firefox") public void website_works_on_firefox() { WebDriver firefoxDriver = new FirefoxDriver(); firefoxDriver.get("https://demowebshop.tricentis.com/"); drivers.add(firefoxDriver); System.out.println("Website works on Firefox!"); } @And("Website works on Chrome") public void website_works_on_chrome() { ChromeOptions options = new ChromeOptions(); options.addArguments("--remote-allow-origins=*"); WebDriver chromeDriver = new ChromeDriver(options); chromeDriver.get("https://demowebshop.tricentis.com/"); drivers.add(chromeDriver); System.out.println("Website works on Chrome!"); } @And("Website works on Edge") public void website_works_on_edge() { WebDriver edgeDriver = new EdgeDriver(); edgeDriver.get("https://demowebshop.tricentis.com/"); drivers.add(edgeDriver); System.out.println("Website works on Edge!"); } @Then("Website works on every browser") public void website_works_on_every_browser() { System.out.println("Website works on every Browsers!"); } @After public void tearDown() { for (WebDriver driver : drivers) { if (driver != null) { try { driver.quit(); } catch (Exception e) { e.printStackTrace(); } } } drivers.clear(); } }
方案2:单个浏览器验证后立即关闭(适合无需多浏览器同时打开的场景)
在每个浏览器步骤中,用局部变量保存实例,通过try-finally确保无论步骤是否成功,都关闭当前浏览器:
@When("Website works on Firefox") public void website_works_on_firefox() { WebDriver driver = new FirefoxDriver(); try { driver.get("https://demowebshop.tricentis.com/"); System.out.println("Website works on Firefox!"); } finally { if (driver != null) { driver.quit(); } } } @And("Website works on Chrome") public void website_works_on_chrome() { ChromeOptions options = new ChromeOptions(); options.addArguments("--remote-allow-origins=*"); WebDriver driver = new ChromeDriver(options); try { driver.get("https://demowebshop.tricentis.com/"); System.out.println("Website works on Chrome!"); } finally { if (driver != null) { driver.quit(); } } } // Edge步骤同理修改
额外注意事项
- 确保Selenium版本与浏览器驱动(ChromeDriver/GeckoDriver/EdgeDriver)、浏览器版本完全匹配,版本不兼容也会导致
quit()无法正常终止进程。 - 若使用Cucumber并行执行,需保证线程安全,每个线程维护独立的浏览器实例集合。
内容的提问来源于stack exchange,提问作者Joel Hochbein
相关产品推荐
相关产品推荐

