当我的测试用例失败时,尤其是在我们的构建服务器上,我想拍摄屏幕的图片/屏幕截图,以帮助我调试后来发生的事情。我知道如何截屏,但我希望在 JUnit 中有一种takeScreenshot()
方法可以在测试失败时在浏览器关闭之前调用我的方法。
不,我不想去编辑我们无数的测试来添加一个 try/catch。我想,我可能会,只是可能会被说成注释。我所有的测试都有一个共同的父类,但我想不出我能做些什么来解决这个问题。
想法?
当我的测试用例失败时,尤其是在我们的构建服务器上,我想拍摄屏幕的图片/屏幕截图,以帮助我调试后来发生的事情。我知道如何截屏,但我希望在 JUnit 中有一种takeScreenshot()
方法可以在测试失败时在浏览器关闭之前调用我的方法。
不,我不想去编辑我们无数的测试来添加一个 try/catch。我想,我可能会,只是可能会被说成注释。我所有的测试都有一个共同的父类,但我想不出我能做些什么来解决这个问题。
想法?
一些快速搜索让我明白了这一点:
http://blogs.steeplesoft.com/posts/2012/grabbing-screenshots-of-failed-selenium-tests.html
基本上,他建议创建一个 JUnit4 Rule
,将测试包装Statement
在他调用的 try/catch 块中:
imageFileOutputStream.write(
((TakesScreenshot) driver).getScreenshotAs(OutputType.BYTES));
这对你的问题有用吗?
如果您想将此行为快速添加到运行中的所有测试中,您可以使用该RunListener
接口来侦听测试失败。
public class ScreenshotListener extends RunListener {
private TakesScreenshot screenshotTaker;
@Override
public void testFailure(Failure failure) throws Exception {
File file = screenshotTaker.getScreenshotAs(OutputType.File);
// do something with your file
}
}
像这样将侦听器添加到您的测试运行器...
JUnitCore junit = new JUnitCore();
junit.addListener(new ScreenshotListener((TakesScreenShots) webDriver));
// then run your test...
Result result = junit.run(Request.classes(FullTestSuite.class));
如果要对测试失败进行截图,请添加此类
import java.io.File;
import java.io.IOException;
import java.util.UUID;
import org.apache.commons.io.FileUtils;
import org.junit.rules.MethodRule;
import org.junit.runners.model.FrameworkMethod;
import org.junit.runners.model.Statement;
import org.openqa.selenium.OutputType;
import org.openqa.selenium.TakesScreenshot;
import org.openqa.selenium.WebDriver;
public class ScreenShotOnFailure implements MethodRule {
private WebDriver driver;
public ScreenShotOnFailure(WebDriver driver){
this.driver = driver;
}
public Statement apply(final Statement statement, final FrameworkMethod frameworkMethod, final Object o) {
return new Statement() {
@Override
public void evaluate() throws Throwable {
try {
statement.evaluate();
} catch (Throwable t) {
captureScreenShot(frameworkMethod.getName());
throw t;
}
}
public void captureScreenShot(String fileName) throws IOException {
File scrFile = ((TakesScreenshot) driver).getScreenshotAs(OutputType.FILE);
fileName += UUID.randomUUID().toString();
File targetFile = new File("./Screenshots/" + fileName + ".png");
FileUtils.copyFile(scrFile, targetFile);
}
};
}
}
在所有测试之前,您应该使用此规则:
@Rule
public ScreenShotOnFailure failure = new ScreenShotOnFailure(driver));
@Before
public void before() {
...
}