我一直在使用TestNG
来创建我的WebDriver
测试,到目前为止,这个组合已经完美无缺。然而,到目前为止,我一直在遇到一个尚未找到解决方法的问题。
WebDriver
是在群组的第一次测试中创建的,该群组通过100多个课程进行了超过950次测试。为了避免创建多个浏览器实例(因为大多数测试都非常短并且启动浏览器有时需要比测试本身更长)我尝试在@BeforeSuite
上声明驱动程序实例(并且还要销毁对象)第一次测试时@AfterSuite
)级别,然后再重复使用。
然而,一旦它开始在另一个班级,我在试图找到驱动程序时遇到了NullPointerException
。
代码发布在以下链接的gist上(https://gist.github.com/4530030)。控告NullPointerException
的行是SecondTest.java:15
答案 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();
}
在FirstTest
和SecondTest
的开头,您必须为该类定义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添加到第二次测试中。