package com.codeborne.selenide.junit; import com.codeborne.selenide.Configuration; import com.codeborne.selenide.Screenshots; import com.codeborne.selenide.ex.UIAssertionError; import org.junit.rules.TestWatcher; import org.junit.runner.Description; import java.util.logging.Logger; import static com.codeborne.selenide.ex.ErrorMessages.screenshot; /** * Usage: * <pre> {@literal @}Rule * public ScreenShooter makeScreenshotOnFailure = ScreenShooter.failedTests();</pre> * or * <pre> {@literal @}Rule * public ScreenShooter makeScreenshotOnEveryTest = ScreenShooter.failedTests().succeededTests();</pre> * or * <pre> {@literal @}Rule * public ScreenShooter makeScreenshotOnEveryTest = ScreenShooter.failedTests().to("test-results/img/");</pre> */ public class ScreenShooter extends TestWatcher { private final Logger log = Logger.getLogger(getClass().getName()); public boolean captureSuccessfulTests; private ScreenShooter() { } public static ScreenShooter failedTests() { return new ScreenShooter(); } public ScreenShooter succeededTests() { captureSuccessfulTests = true; return this; } @Override protected void starting(Description test) { Screenshots.startContext(test.getClassName(), test.getMethodName()); } @Override protected void succeeded(Description test) { if (captureSuccessfulTests) { log.info(screenshot()); } } @Override protected void failed(Throwable e, Description description) { if (!(e instanceof UIAssertionError)) { log.info(screenshot()); } } @Override protected void finished(Description description) { Screenshots.finishContext(); } /** * One-liner to configure Configuration.reportsFolder property * * @param folderWithScreenshots Folder to put screenshots to */ public ScreenShooter to(String folderWithScreenshots) { Configuration.reportsFolder = folderWithScreenshots; return this; } }