Selenium没有关闭浏览器,启动两次

时间:2016-03-10 21:04:54

标签: selenium-webdriver junit cucumber selenium-chromedriver

我使用这个钩子类与硒和黄瓜。当我运行一个功能2实例启动时,这是一个问题,实例也不会关闭。他们正在从这个钩子里跑出来......我做错了什么?

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();
        }
    }
}

1 个答案:

答案 0 :(得分:0)

基本上,您没有采取足够的措施来管理WebDriver个实例。

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

你应该做的是:

  1. 每次确保@After次来电.quit(),以匹配您的@Before
  2. 或者,更有效率,将@Before更改为仅在需要时创建驱动程序:

    if (driver == null) {
        driver = new ChromeDriver();
    }
    
  3. ...并从.quit()完全删除@After。将共享ChromeDriver实例退出某个级别的责任转移到您的测试运行器(我们看不到)或者可能创建一个关闭钩子来执行此操作。它需要在某个时刻完成,否则浏览器进程将不会退出。