2

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

WebDriver是在一个小组的第一次测试中创建的,该小组有 950 多个测试,分布在 100 多个班级。为了避免创建多个浏览器实例(因为大多数测试都很短,并且启动浏览器有时需要比测试本身更长的时间),我尝试在第一个级别上声明驱动程序实例@BeforeSuite(并在 a 上销毁对象)@AfterSuite之后测试并重用它。

NullPointerException然而,一旦它开始在不同的课程上,当它试图找到驱动程序时,我一直在碰到。

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

4

3 回答 3

3

可能这有点晚了,但是您的驱动程序对象没有被 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 只需要定义一次,它们可以放置在任何地方。只是在上面的示例中它们指的是私有变量,因此我必须将它们保留在那里..

于 2013-02-26T18:03:30.000 回答
1

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

driver变量在WebDriverInit类中定义。但是班级几乎无法到达FirstTest。可能您必须将其添加到SuperTest课程中:

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

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

private WebDriver driver;

而在之前

@BeforeSuite

public void setTestSuite() throws MalformedURLException {

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

}

我是真正的 Java 新手,所以我可能错了。但我认为这里的原因是你没有让司机参加第一次和第二次测试......

编辑 在 SecondTest 类中没有@BeforeSuite像在 FirstTest 类中那样。您不会在 SecondTest 类的任何地方启动 webdriver

于 2013-01-14T14:30:20.590 回答
0

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

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

将@BeforeSuite/@AfterSuite 添加到您的第二个测试中。

于 2013-02-22T16:33:46.193 回答