Selenium webdriver Selenium未关闭浏览器,启动两次

Selenium webdriver Selenium未关闭浏览器,启动两次,selenium-webdriver,junit,cucumber,selenium-chromedriver,Selenium Webdriver,Junit,Cucumber,Selenium Chromedriver,我用这个钩子类来搭配硒和黄瓜。当我运行Feature2实例启动时(这是一个问题),实例也不会关闭。他们在逃避这个陷阱我做错了什么 public class WebDriverHooks { public static WebDriver driver; @Before /** * Delete all cookies at the start of each scenario to avoid * shared state between tests

我用这个钩子类来搭配硒和黄瓜。当我运行Feature2实例启动时(这是一个问题),实例也不会关闭。他们在逃避这个陷阱我做错了什么

public class WebDriverHooks {
    public static WebDriver driver;

    @Before
    /**
     * Delete all cookies at the start of each scenario to avoid
     * shared state between tests
     */
    public void openBrowser() throws MalformedURLException {
        System.out.println("Called openBrowser");
        System.setProperty("webdriver.chrome.driver", "//Applications//chrome//chromedriver");

        driver = new ChromeDriver();
        driver.manage().deleteAllCookies();
        driver.manage().window().maximize();
    }

    @After
    /**
     * Embed a screenshot in test report if test is marked as failed
     */
    public void embedScreenshot(Scenario scenario) {
        if (scenario.isFailed()) {
            try {
                scenario.write("Current Page URL is " + driver.getCurrentUrl());
                byte[] screenshot = getScreenshotAs(OutputType.BYTES);
                byte[] screenshot = ((TakesScreenshot) driver).getScreenshotAs(OutputType.BYTES);
                scenario.embed(screenshot, "image/png");
            } catch (WebDriverException somePlatformsDontSupportScreenshots) {
                System.err.println(somePlatformsDontSupportScreenshots.getMessage());
            }
            driver.quit();
        }
    }
}

基本上,您在管理
WebDriver
实例时没有采取足够的措施

您的
@After
处理程序仅在发生故障时调用
.quit()
,而您的
@Before
每次都会创建一个新的
ChromeDriver
。而且,由于您的钩子(以及两个处理程序方法)可能会被多次调用(Cucumber的特性),因此您可能会得到越来越多的驱动程序实例

你应该做的是:

  • 请确保每次调用
    .quit()
    之后的
    @都与之前的
    @相匹配
  • 或者,更有效地,将您的
    @更改为仅在需要时创建驱动程序:

    if (driver == null) {
        driver = new ChromeDriver();
    }
    

  • 。。。然后将
    .quit()
    @After
    中删除。将退出共享
    ChromeDriver
    实例的责任提升到一个级别,或者转移到您的测试运行程序(我们看不到),或者创建一个关机挂钩来完成。它需要在某个时候完成,否则浏览器进程将不会退出。

    基本上,您没有足够的精力来管理
    WebDriver
    实例

    您的
    @After
    处理程序仅在发生故障时调用
    .quit()
    ,而您的
    @Before
    每次都会创建一个新的
    ChromeDriver
    。而且,由于您的钩子(以及两个处理程序方法)可能会被多次调用(Cucumber的特性),因此您可能会得到越来越多的驱动程序实例

    你应该做的是:

  • 请确保每次调用
    .quit()
    之后的
    @都与之前的
    @相匹配
  • 或者,更有效地,将您的
    @更改为仅在需要时创建驱动程序:

    if (driver == null) {
        driver = new ChromeDriver();
    }
    

  • 。。。然后将
    .quit()
    @After
    中删除。将退出共享
    ChromeDriver
    实例的责任提升到一个级别,或者转移到您的测试运行程序(我们看不到),或者创建一个关机挂钩来完成。它需要在某个时刻完成,否则浏览器进程将不会退出。

    创建一个关闭挂钩。在退出时执行驱动程序.quit()end创建一个关机挂钩。在退出时执行驱动程序。退出()结束