并行测试执行--Testng Listeners,Selenium Webdriver切换到Selenium Grid

时间:2015-01-13 09:28:41

标签: selenium-webdriver testng selenium-grid

我有具体情况。我有一个用java(selenium webdriver)编写的web应用程序测试,它们是用并行的testng组织和执行的。这个过程如下:

  • 每个testng测试(不是测试方法)并行运行。
  • 每个testng测试都包含一个类,并且该类有多个测试方法
  • 每个testng测试都有相同的侦听器(ItestListener),它启动webdriver,稍后在此特定测试中的所有测试方法之间共享。此侦听器还会在此测试结束时关闭webdriver。

我现在正在尝试在Selenium Grid上运行此套件。我面临的问题是,在完成测试之后,webdriver实例会在Selenium Grid中保持活动状态并阻止执行下一个测试,直到超时启动并终止测试。我猜测问题是通过测试监听器处理webdriver并在测试方法之间共享一个驱动程序。

我这样做只是因为我想在每个测试方法之前和之后节省一些时间来打开和关闭webdriver。

我的问题是:有没有人知道在使用Selenium Grid时是否可以采取这种行为,如果是的话,应该如何处理?那么有没有人有这种情况,他正在使用网格,他有测试方法共享webdriver,一切正常吗?如果是这样,我想听听你是如何实现它的。

提前感谢大家! 卢卡

编辑:TestListener代码

public class WebDriverTestListener extends TestListenerAdapter {

@Override
public void onStart(ITestContext testContext) {
    super.onStart(testContext);
    DesiredCapabilities capabilities = DesiredCapabilities.firefox();
    WebDriver driver = null;
    try {
        driver = new RemoteWebDriver(new URL("http://localhost:4444/wd/hub"), capabilities);
    } catch (MalformedURLException e) {
        e.printStackTrace();
    }
    testContext.setAttribute("webdriver", driver);      
}

@Override
public void onFinish(ITestContext testContext) {
    super.onFinish(testContext);
    WebDriver driver = (WebDriver) testContext.getAttribute("webdriver");
    driver.close();
}

}

1 个答案:

答案 0 :(得分:0)

问题在于onFinish方法。我使用了driver.close(),它不会杀死webdriver实例,只关闭当前活动的窗口。而不是driver.close(),应该使用driver.quit()。在此更改后,一切正常。