在使用Cucumber完成所有UI测试后如何正确退出WebDriver

时间:2014-02-26 07:35:42

标签: groovy selenium-webdriver gradle cucumber

我们正在使用Selenium WebDriver和Cucumber一起进行UI测试。语言是Groovy,构建工具是Gradle。因为创建WebDriver实例的代价很高,所以我们只想实例化一个WebDriver实例并在所有测试中使用它。但是,在完成所有测试后,我们无法正确退出驱动程序。也就是说,在测试期间生成的浏览器进程在运行所有测试后仍然存在。

代码目前的结构如下所示。

// Test base class
class UITestBase {
    WebDriver driver

    static {
        init()
    }

    static void init() {
        // instantiate a webdriver
    }
}

// Entry class of cucumber run
RunWith( Cucumber )
Cucumber.Options(...)
class CukeRunEntry {}

// Cucumber step class
class WhenSteps extends UITestBase {
    @When(/^something happens$/)
    void something_happens() {
        // step implmentation
    }
}

那么,如何在所有测试完成之后但在gradle完成测试任务之前调用driver.quit()(我们从命令行使用./gradlew test运行测试)?我尝试重写finalize()方法,但这没有帮助。

非常感谢。

1 个答案:

答案 0 :(得分:3)

如果我是你,我更愿意使用SharedDriver,你可以在这里找到=> https://github.com/cucumber/cucumber-jvm/blob/master/examples/java-webbit-websockets-selenium/src/test/java/cucumber/examples/java/websockets/SharedDriver.java

让生活更轻松。

修改
如果您不想使用SharedDriver,可以在UITestBase类中添加如下所示的块,如问题所示:

private static final Thread CLOSE_THREAD = new Thread() {
    @Override
    public void run() {
        try {
            driver.quit()
        } catch ( Exception e ) {
        }
    }
}

static {
    init()
    Runtime.getRuntime().addShutdownHook(CLOSE_THREAD)
} 

以上代码基本上是SharedDriver中用于确保安全关闭WebDriver实例的代码。