在@BeforeSuite级别创建的WebDriver实例会抛出NullPointerException

时间:2013-01-07 12:45:27

标签: java testng selenium-webdriver selenium-grid

我一直在使用TestNG来创建我的WebDriver测试,到目前为止,这个组合已经完美无缺。然而,到目前为止,我一直在遇到一个尚未找到解决方法的问题。

WebDriver是在群组的第一次测试中创建的,该群组通过100多个课程进行了超过950次测试。为了避免创建多个浏览器实例(因为大多数测试都非常短并且启动浏览器有时需要比测试本身更长)我尝试在@BeforeSuite上声明驱动程序实例(并且还要销毁对象)第一次测试时@AfterSuite)级别,然后再重复使用。

然而,一旦它开始在另一个班级,我在试图找到驱动程序时遇到了NullPointerException

代码发布在以下链接的gist上(https://gist.github.com/4530030)。控告NullPointerException的行是SecondTest.java:15

3 个答案:

答案 0 :(得分:2)

可能这有点晚了,但是你的驱动程序对象没有被firsttest和secondtest共享。他们每个人都有自己的副本。所以,无论什么初始化是一个人自己的副本。无论哪个类首先运行都会起作用,第二个类不会有它,因为它的副本没有初始化。你可以做的是让一个类在被要求时返回相同的驱动程序对象。

public class DriverInitializer {

private static WebDriver driver;

@BeforeSuite
public void setTestSuite() throws MalformedURLException {
    driver = new FirefoxDriver();
}

@AfterSuite
public void endTestSuite() {
    driver.quit();
}

public static WebDriver getDriver(){
    return driver;
}

}

然后让所有案例调用例如。 firstTest调用

DriverInitializer.getDriver().get("http://www.google.com");

第二次测试

DriverInitializer.getDriver().get("http://cnn.com");

所以无论谁调用相同的驱动程序实例都会被返回。

beforesuite和aftersuite只需要定义一次,它们可以放在任何地方。只是在上面的例子中它们指的是私有变量,因此我必须将它们保留在那里..

答案 1 :(得分:1)

好的,我确实看过你的代码。

driver变量在WebDriverInit类中定义。但是FirstTest类很难达到它。可能你必须将它添加到SuperTest类:

protected WebDriver getDriver(){
   return wdi.getDriver();
}

FirstTestSecondTest的开头,您必须为该类定义driver变量:

private WebDriver driver;

在之前

@BeforeSuite

public void setTestSuite() throws MalformedURLException {

startWebDriver();
driver = super.getDriver();

}

我是真正的Java新手,所以我错了。但我认为这里的原因是你没有向第一次和第二次测试发送驱动程序......

修改 在SecondTest类中,FirstTest类中没有@BeforeSuite。您不能在SecondTest类中的任何位置启动webdriver

答案 2 :(得分:0)

在第一个测试中,您已经定义了@BeforeSuite和@AfterSuite。这些会为第一次测试创建并销毁您的驱动程序对象。

你的第二个测试没有@BeforeSuite或@AfterSuite方法所以没有实例化驱动程序对象因此你得到一个NPE

将@ BeforeSuite / @ AfterSuite添加到第二次测试中。