Selenium可以在JUnit测试失败时截图吗?

r8uurelv  于 2023-10-20  发布在  其他
关注(0)|答案(3)|浏览(110)

当我的测试用例失败时,特别是在我们的构建服务器上,我想拍摄屏幕的照片/屏幕截图,以帮助我调试稍后发生的事情。我知道如何截图,但我希望在JUnit中有一种方法,如果测试失败,在浏览器关闭之前调用我的takeScreenshot()方法。
不,我不想去编辑我们的大量测试来添加try/catch。我想,我可能,只是可能被说服做一个注解。我所有的测试都有一个公共的父类,但是我想不出我可以做什么来解决这个问题。
有什么想法?

ryevplcw

ryevplcw1#

几个快速搜索使我找到了一篇相关的文章,“抓取失败的Selenium测试的屏幕截图”,作者是Jason Lee,日期是2012年1月24日。(已失效的原始blogs.steeplesoft.com网址:http://blogs.steeplesoft.com/posts/2012/grabbing-screenshots-of-failed-selenium-tests.html,现在可从an archive.org mirror dated 7 Mar 2017获得。
简而言之,他建议创建一个JUnit 4 Rule,将测试Statement Package 在try/catch块中,并在其中调用:

imageFileOutputStream.write(
    ((TakesScreenshot) driver).getScreenshotAs(OutputType.BYTES));

在评论中,Leukipp链接到托马斯桑德伯格(Thomas Sundberg)于2012年7月8日发表的一篇类似文章"Performing an action when a test fails",该文章提供了一个非常类似的@Rule,但使用了getScreenshotAs(OutputType.FILE),然后将其复制/移动到预期的目的地。

zphenhs4

zphenhs42#

如果你想在运行中快速将此行为添加到你的ALL测试中,你可以使用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));
czfnxgou

czfnxgou3#

如果您想在测试失败时进行截图,请添加此类

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() {
   ...
}

相关问题