Screenshots and Videos

TestCafe allows you to take screenshots of the tested webpage and record videos of test runs.

Screenshots

TestCafe allows you to take screenshots of the tested webpage at any moment during test run, or automatically whenever a test fails.

Screenshots are not supported when you run tests in remote browsers.

Prerequisites for Screenshots

Screenshots require .NET 4.0 or newer installed on Windows machines and an ICCCM/EWMH-compliant window manager on Linux.

Take Screenshots at Arbitrary Moments During Test Run

You can take screenshots at any moment during test run. Use the t.takeScreenshot action to take a screenshot of the entire page, or the t.takeElementScreenshot action to capture a particular element.

fixture `My fixture`
    .page `http://devexpress.github.io/testcafe/example/`;

test('Take a screenshot of a fieldset', async t => {
    await t
        .typeText('#developer-name', 'Peter Parker')
        .click('#tried-test-cafe')
        .typeText('#comments', 'I think TestCafe is awesome!')
        .takeElementScreenshot('#comments')
        .click('#submit-button')
        .takeScreenshot();
});

Take Screenshots When a Test Fails

You can configure TestCafe to automatically take a screenshot whenever a test fails. Use either of the following:

  • the takeOnFails parameter in the -s (--screenshots) command line flag,

    testcafe chrome tests/sample-fixture.js -s takeOnFails=true
    
  • the takeOnFails parameter of the runner.screenshots API method,

    runner.screenshots({
        takeOnFails: true
    });
    
  • the screenshots.takeOnfails configuration file property.

    {
        "screenshots": {
            "takeOnFails": true
        }
    }
    

Screenshot Options

TestCafe supports the following screenshot options:

Option Type Description Default Value
path String The base directory where screenshots are saved. ./screenshots
takeOnFails Boolean true to take a screenshot whenever a test fails. false
pathPattern String A pattern that defines how TestCafe composes the relative path to a screenshot file. See Screenshot and Video Directories. See Default Path Pattern.
fullPage String true to capture the full page, including content that is not visible due to overflow. false

You can specify screenshot options in either of the following ways:

  • the -s (--screenshots) command line flag,

    testcafe chrome test.js -s path=artifacts/screenshots,fullPage=true,pathPattern=${TEST_INDEX}/${USERAGENT}/${FILE_INDEX}.png
    

    Enclose parameter values in quotes if they contain spaces. In Windows cmd.exe shell, use double quotes.

  • the options parameter of the runner.screenshots API method,

    runner.screenshots({
        path: 'artifacts/screenshots',
        fullPage: true,
        pathPattern: '${TEST_INDEX}/${USERAGENT}/${FILE_INDEX}.png'
    });
    
  • the screenshots configuration file property.

    {
        "screenshots": {
            "path": "artifacts/screenshots",
            "fullPage": true,
            "pathPattern": "${TEST_INDEX}/${USERAGENT}/${FILE_INDEX}.png"
        }
    }
    

Disable Screenshots

You can prevent TestCafe from taking screenshots whenever a test fails or a screenshot action is executed. Use one of the following options:

  • the --disable-screenshots command line flag,

    testcafe chrome tests/sample-fixture.js --disable-screenshots
    
  • the disableScreenshots option of the runner.run API method,

    runner.run({
        disableScreenshots: true
    });
    
  • the disableScreenshots configuration file property.

    {
        "disableScreenshots": true
    }
    

Record Videos

TestCafe allows you to record videos of test runs.

Video recording is supported in Google Chrome, Mozilla Firefox, and Microsoft Edge (Chromium-based). TestCafe cannot record videos when you run tests in remote browsers.

Prerequisites for Video Recording

You should install the FFmpeg library to record videos.

Do one of the following if TestCafe cannot find the FFmpeg library:

  • Add the FFmpeg installation directory to the system's PATH environment variable;
  • Specify the path to the FFmpeg executable in the FFMPEG_PATH environment variable or the ffmpegPath parameter in video options;
  • Install the @ffmpeg-installer/ffmpeg package from npm.

Videos are saved in the .mp4 format.

Enable Video Recording

Use either of the following to enable video recording:

  • the --video command line flag,

    testcafe chrome test.js --video artifacts/videos
    
  • the runner.video API method,

    runner.video('artifacts/videos');
    
  • the videoPath configuration file property.

    {
        "videoPath": "artifacts/videos"
    }
    

You should provide the base path where TestCafe stores videos to this flag, method or property. See Screenshot and Video Directories for more information.

TestCafe records all the tests and saves the recording of each test in a separate file. To change this behavior, use the failedOnly and singleFile video options.

When you specify the :userProfile or --user-data-dir flag to override the user directory in Chrome and Chromium-based browsers, set the cdpPort property to 9222 to record videos:

testcafe "chrome:emulation:cdpPort=9222 --user-data-dir=/my/user/data" test.js --video artifacts/videos

Basic Video Options

TestCafe supports the following video options:

Option Type Description Default Value
failedOnly Boolean true to record only failed tests; false to record all tests. false
singleFile Boolean true to save the entire recording as a single file; false to create a separate file for each test. false
ffmpegPath String The path to the FFmpeg codec executable. Auto-detected
pathPattern String A pattern that defines how TestCafe composes the relative path to a video file. See Screenshot and Video Directories. See Default Path Pattern.

You can specify video options in either of the following ways:

  • the --video-options command line flag,

    testcafe chrome test.js --video artifacts/videos --video-options singleFile=true,failedOnly=true,pathPattern=${TEST_INDEX}/${USERAGENT}/${FILE_INDEX}.mp4
    

    Enclose parameter values in quotes if they contain spaces. In Windows cmd.exe shell, use double quotes.

  • the options parameter of the runner.video API method,

    runner.video('artifacts/videos', {
        singleFile: true,
        failedOnly: true,
        pathPattern: '${TEST_INDEX}/${USERAGENT}/${FILE_INDEX}.mp4'
    });
    
  • the videoOptions configuration file property.

    {
        "videoOptions": {
            "singleFile": true,
            "failedOnly": true,
            "pathPattern": "${TEST_INDEX}/${USERAGENT}/${FILE_INDEX}.mp4"
        }
    }
    

Video Encoding Options

These encoding options are passed to FFmpeg. Refer to the FFmpeg documentation for information about all the available options.

To provide video encoding options, use either of the following options:

  • the --video-encoding-options command line flag,

    testcafe chrome test.js --video artifacts/videos --video-encoding-options r=20,aspect=4:3
    
  • the encodingOptions parameter of the runner.video API method,

    runner.video('artifacts/videos', { }, {
        r: 20,
        aspect: '4:3'
    });
    
  • the videoEncodingOptions configuration file property.

    {
        "videoEncodingOptions": {
            "r": 20,
            "aspect": "4:3"
        }
    }
    

Screenshot and Video Directories

Base Directory

Screenshots

The default base directory for screenshots is <project>/screenshots.

You can use the path option to specify a different base directory:

CLI

testcafe chrome test.js -s path=artifacts/screenshots

API

runner.screenshots({
    path: 'artifacts/screenshots'
});

Configuration file

{
    "screenshots": {
        "path": "artifacts/screenshots"
    }
}

Videos

The base directory for video files must be specified in order to enable video recording:

CLI

testcafe chrome test.js --video artifacts/videos

API

runner.video('artifacts/videos');

Configuration file

{
    "videoPath": "artifacts/videos"
}

Subdirectories and File Names

Inside the base directory, screenshots and videos are organized into subdirectories and named according to the path patterns.

Path Patterns

A path pattern is a template for relative paths to individual screenshot or video files. The pattern uses placeholders to define positions where TestCafe should insert values like date, time or browser name.

The following example shows a path pattern for screenshot files:

${DATE}_${TIME}/${BROWSER}/screenshot-${FILE_INDEX}.png

When TestCafe saves a screenshot or video file, it substitutes each placeholder with an actual value. For instance, the pattern shown above forms the following paths:

2019-10-02_11-35-40/Chrome/screenshot-1.png
2019-10-02_11-35-40/Chrome/screenshot-2.png
2019-10-02_11-35-40/Firefox/screenshot-1.png
2019-10-02_11-35-40/Firefox/screenshot-2.png

You can use the default or custom path pattern.

When you take a screenshot with the t.takeScreenshot or t.takeElementScreenshot action, you can specify the exact file path. In this instance, TestCafe saves this screenshot to the specified location and does not use patterns.

Default Path Pattern

TestCafe composes paths to screenshots and videos according to the following pattern:

${DATE}_${TIME}/${TEST_ID}/${RUN_ID}/${USERAGENT}/${FILE_INDEX}.<ext>

where <ext> is .png for screenshots and .mp4 for videos.

When TestCafe takes a screenshot because a test fails, it adds the errors subfolder to the pattern.

${DATE}_${TIME}/${TEST_ID}/${RUN_ID}/${USERAGENT}/errors/${FILE_INDEX}.png

Custom Path Patterns

You can create a custom path pattern for screenshots and videos. Use placeholders to define which values should be used in relative paths.

To specify a custom pattern, use the pathPattern parameter in screenshot or video options.

testcafe chrome test.js -s pathPattern=${DATE}_${TIME}/test-${TEST_INDEX}/${USERAGENT}/${FILE_INDEX}.png
runner.video('artifacts/videos', {
    pathPattern: '${DATE}_${TIME}/test-${TEST_INDEX}/${USERAGENT}/${FILE_INDEX}.mp4'
});

Path Pattern Placeholders

You can use the following placeholders in screenshot and video path patterns:

Placeholder Description
${DATE} The test run's start date (YYYY-MM-DD).
${TIME} The test run's start time (HH-mm-ss).
${TEST_INDEX} The test's index.
${FILE_INDEX} The screenshot file's index.
${QUARANTINE_ATTEMPT} The quarantine attempt's number. If the quarantine mode is disabled, the ${QUARANTINE_ATTEMPT} placeholder's value is 1.
${FIXTURE} The fixture's name.
${TEST} The test's name.
${USERAGENT} The combination of ${BROWSER}, ${BROWSER_VERSION}, ${OS}, and ${OS_VERSION} (separated by underscores).
${BROWSER} The browser's name.
${BROWSER_VERSION} The browser's version.
${OS} The operation system's name.
${OS_VERSION} The operation system's version.
${TEST_ID} Resolves to test-${TEST_INDEX} if TestCafe can associate this screenshot or video with a specific test; resolves to an empty string otherwise (for instance, when a single video is recorded for the entire test run).
${RUN_ID} Resolves to run-${QUARANTINE_ATTEMPT} for screenshots taken when quarantine mode is enabled; resolves to an empty string for videos and for screenshots taken when quarantine mode is disabled.