Bird
Raised Fist0
Selenium Javatesting~5 mins

Screenshot attachment on failure in Selenium Java

Choose your learning style10 modes available
Introduction

Taking a screenshot when a test fails helps you see what went wrong. It shows the exact screen state at failure.

When a test case does not pass and you want to understand the problem visually.
When debugging UI issues that are hard to catch by just reading error messages.
When sharing test results with teammates or developers to show the failure context.
When running automated tests on remote machines or CI servers where you cannot watch the test run.
When you want to keep a record of failures for future reference.
Syntax
Selenium Java
try {
    // test steps
} catch (Exception e) {
    File screenshot = ((TakesScreenshot)driver).getScreenshotAs(OutputType.FILE);
    FileUtils.copyFile(screenshot, new File("path/to/save/screenshot.png"));
    throw e; // rethrow to mark test as failed
}

Use TakesScreenshot interface from Selenium to capture the screen.

Save the screenshot file to a known folder for easy access.

Examples
Capture and save a screenshot named failure.png in the screenshots folder.
Selenium Java
File screenshot = ((TakesScreenshot)driver).getScreenshotAs(OutputType.FILE);
FileUtils.copyFile(screenshot, new File("screenshots/failure.png"));
Save screenshots with a timestamp to avoid overwriting files.
Selenium Java
try {
    // some test code
} catch (Exception e) {
    File screenshot = ((TakesScreenshot)driver).getScreenshotAs(OutputType.FILE);
    FileUtils.copyFile(screenshot, new File("screenshots/error_" + System.currentTimeMillis() + ".png"));
    throw e;
}
Sample Program

This test opens a website, tries to find a missing element to cause failure, then takes a screenshot and saves it. It prints messages about the screenshot and failure.

Selenium Java
import org.openqa.selenium.*;
import org.openqa.selenium.chrome.ChromeDriver;
import org.apache.commons.io.FileUtils;
import java.io.File;

public class ScreenshotOnFailureTest {
    public static void main(String[] args) {
        System.setProperty("webdriver.chrome.driver", "path/to/chromedriver");
        WebDriver driver = new ChromeDriver();
        try {
            driver.get("https://example.com");
            // Intentionally fail: find element that does not exist
            driver.findElement(By.id("nonexistent-element"));
        } catch (Exception e) {
            try {
                File screenshot = ((TakesScreenshot)driver).getScreenshotAs(OutputType.FILE);
                FileUtils.copyFile(screenshot, new File("screenshots/failure.png"));
                System.out.println("Screenshot saved on failure.");
            } catch (Exception ioException) {
                System.out.println("Failed to save screenshot: " + ioException.getMessage());
            }
            System.out.println("Test failed: " + e.getMessage());
        } finally {
            driver.quit();
        }
    }
}
OutputSuccess
Important Notes

Make sure the screenshots folder exists or create it before saving files.

Use meaningful file names or timestamps to avoid overwriting screenshots.

Integrate screenshot capture in test frameworks like JUnit or TestNG listeners for automatic capture on failure.

Summary

Taking screenshots on failure helps you see what went wrong visually.

Use Selenium's TakesScreenshot interface to capture and save images.

Save screenshots with clear names and handle exceptions during saving.

Practice

(1/5)
1. What is the main purpose of taking a screenshot on test failure in Selenium Java?
easy
A. To automatically fix the test errors
B. To speed up the test execution
C. To visually capture the state of the application at failure
D. To reduce the size of the test report

Solution

  1. Step 1: Understand the role of screenshots in testing

    Screenshots help testers see what the application looked like when a test failed.
  2. Step 2: Identify the benefit of visual evidence

    This visual evidence helps diagnose issues faster and more clearly than logs alone.
  3. Final Answer:

    To visually capture the state of the application at failure -> Option C
  4. Quick Check:

    Screenshot = Visual failure evidence [OK]
Hint: Screenshots show what failed visually, not fix or speed tests [OK]
Common Mistakes:
  • Thinking screenshots fix errors automatically
  • Believing screenshots speed up tests
  • Assuming screenshots reduce report size
2. Which Selenium interface is used to capture screenshots in Java?
easy
A. WebDriver
B. JavascriptExecutor
C. Alert
D. TakesScreenshot

Solution

  1. Step 1: Recall Selenium interfaces for screenshots

    The TakesScreenshot interface provides the method to capture screenshots.
  2. Step 2: Differentiate from other interfaces

    Other interfaces like WebDriver control browser, Alert handles popups, and JavascriptExecutor runs JS scripts.
  3. Final Answer:

    TakesScreenshot -> Option D
  4. Quick Check:

    TakesScreenshot = Capture screenshots [OK]
Hint: Use TakesScreenshot interface to capture images [OK]
Common Mistakes:
  • Using WebDriver directly for screenshots
  • Confusing Alert or JavascriptExecutor with screenshot capture
  • Not casting driver to TakesScreenshot
3. What will happen if you run this code snippet after a test failure?
File srcFile = ((TakesScreenshot)driver).getScreenshotAs(OutputType.FILE);
FileUtils.copyFile(srcFile, new File("screenshots/fail.png"));
medium
A. Compilation error due to missing cast
B. Screenshot saved as fail.png in screenshots folder
C. Runtime error because FileUtils is undefined
D. Screenshot saved but file name is random

Solution

  1. Step 1: Analyze the screenshot capture code

    The driver is cast to TakesScreenshot and screenshot saved as a file named "fail.png" in the "screenshots" folder.
  2. Step 2: Check for errors or randomness

    FileUtils.copyFile copies the screenshot correctly; file name is fixed as "fail.png" so no randomness.
  3. Final Answer:

    Screenshot saved as fail.png in screenshots folder -> Option B
  4. Quick Check:

    Code saves fixed-name screenshot file [OK]
Hint: Casting driver and copyFile saves fixed screenshot file [OK]
Common Mistakes:
  • Forgetting to cast driver to TakesScreenshot
  • Not importing or defining FileUtils
  • Expecting random file names without code for it
4. Identify the error in this code snippet for saving a screenshot on failure:
File srcFile = driver.getScreenshotAs(OutputType.FILE);
FileUtils.copyFile(srcFile, new File("screenshots/error.png"));
medium
A. driver must be cast to TakesScreenshot before calling getScreenshotAs
B. FileUtils.copyFile method does not exist
C. OutputType.FILE is invalid for screenshots
D. File path must be absolute, not relative

Solution

  1. Step 1: Check method call on driver

    The getScreenshotAs method belongs to TakesScreenshot, so driver must be cast before calling it.
  2. Step 2: Verify other parts

    FileUtils.copyFile exists and OutputType.FILE is correct. Relative paths are allowed if folder exists.
  3. Final Answer:

    driver must be cast to TakesScreenshot before calling getScreenshotAs -> Option A
  4. Quick Check:

    Cast driver to TakesScreenshot before screenshot [OK]
Hint: Always cast driver to TakesScreenshot before getScreenshotAs [OK]
Common Mistakes:
  • Calling getScreenshotAs directly on WebDriver
  • Assuming OutputType.FILE is wrong
  • Thinking relative paths cause errors
5. You want to attach a screenshot to your test report only when a test fails. Which approach correctly implements this in Selenium Java with TestNG?
@AfterMethod
public void tearDown(ITestResult result) {
  if (result.getStatus() == ITestResult.FAILURE) {
    File src = ((TakesScreenshot)driver).getScreenshotAs(OutputType.FILE);
    File dest = new File("screenshots/" + result.getName() + ".png");
    FileUtils.copyFile(src, dest);
    // Attach dest to report here
  }
  driver.quit();
}
hard
A. This code saves screenshot only on failure and attaches it correctly
B. Screenshot is saved on every test, not just failures
C. FileUtils.copyFile will throw error without try-catch
D. result.getName() returns null, so file name is invalid

Solution

  1. Step 1: Check condition for failure

    The code checks if test status is FAILURE before taking screenshot, so it runs only on failures.
  2. Step 2: Verify screenshot saving and naming

    Screenshot saved with test method name, which is valid. Attaching to report is indicated as a comment.
  3. Step 3: Confirm no errors in logic

    FileUtils.copyFile may throw IOException but typically handled or declared; this snippet focuses on logic correctness.
  4. Final Answer:

    This code saves screenshot only on failure and attaches it correctly -> Option A
  5. Quick Check:

    Screenshot on failure only with correct naming [OK]
Hint: Use ITestResult.FAILURE check to save screenshots only on failure [OK]
Common Mistakes:
  • Taking screenshots regardless of test result
  • Not handling exceptions from file operations
  • Assuming getName() returns null
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard