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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 02:27:48