当JUnit测试失败时,无法使用Java使用Selenium WebDriver截取屏幕截图

时间:2013-11-12 03:11:55

标签: java junit webdriver selenium-webdriver

我正在使用带有Webdriver的Java,而我在测试失败时遇到屏幕截图有问题。

我的jUnit测试:

....
public class TestGoogleHomePage extends Browser {

....
@Test
public void testLoadGoogle() {
//this test will fail
}
}

我的浏览器类:

public class Browser {
protected static WebDriver driver;

public Browser() {
    driver = new FirefoxDriver();
}

.....
@Rule
public TestWatcher watchman = new TestWatcher() {

    @Override
    protected void failed(Throwable e, Description description) {
        File scrFile = ((TakesScreenshot) driver)
                .getScreenshotAs(OutputType.FILE);
        try {
            FileUtils.copyFile(scrFile, new File(
                    "C:\\screenshot.png"));
        } catch (IOException e1) {
            System.out.println("Fail to take screen shot");
        }
        // this won't work
        // driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);

    }

    @Override
    protected void succeeded(Description description) {
     ....
    }
};

@After
public void closeBrowser() {
    driver.quit();
}

}

执行测试将导致以下错误消息(错误消息的一部分):

  

org.openqa.selenium.remote.SessionNotFoundException:调用quit()后无法使用FirefoxDriver。

看起来它抱怨我的@After方法。

我尝试将Browser类更改为:

public class Browser {
protected static WebDriver driver;

public Browser() {
    driver = new FirefoxDriver();
}

.....
@Rule
public TestWatcher watchman = new TestWatcher() {

    @Override
    protected void failed(Throwable e, Description description) {
        File scrFile = ((TakesScreenshot) driver)
                .getScreenshotAs(OutputType.FILE);
        try {
            FileUtils.copyFile(scrFile, new File(
                    "C:\\screenshot.png"));
        } catch (IOException e1) {
            System.out.println("Fail to take screen shot");
        }
        driver.quit();
    }

    @Override
    protected void succeeded(Description description) {
     ....
     driver.quit();
    }
};

}

以上代码工作正常。但我不想在那里退出驱动程序,因为在每次测试运行后我可能还有其他需要清理的东西,我想用@After方法关闭浏览器。

我有办法做到吗?

1 个答案:

答案 0 :(得分:3)

问题在于以下代码:

@After
public void closeBrowser() {
    driver.quit();
}

driver.quit()试图在每次测试后关闭浏览器;它会在您TestWatcher的回拨方法之前执行。这阻止了TestWatcher获取driver的句柄。尝试使用限制性更强的生命周期注释,例如@AfterClass@AfterSuite