Skip to content
Allure report logoAllure Report
Main Navigation ModulesDocumentationStart

English

Español

English

Español

Appearance

Sidebar Navigation

Introduction

Install & Upgrade

Install for Windows

Install for macOS

Install for Linux

Install for Node.js

Upgrade Allure

Getting started

How to view a report

Improving readability of your test reports

Improving navigation in your test report

Features

Test steps

Attachments

Test statuses

Sorting and filtering

Defect categories

Visual analytics

Test stability analysis

History and retries

Timeline

Export to CSV

Export metrics

Guides

JUnit 5 parametrization

JUnit 5 & Selenide: screenshots and attachments

JUnit 5 & Selenium: screenshots and attachments

Setting up JUnit 5 with GitHub Actions

Pytest parameterization

Pytest & Selenium: screenshots and attachments

Pytest & Playwright: screenshots and attachments

Pytest & Playwright: videos

Playwright parameterization

How it works

Overview

Test result file

Container file

Categories file

Environment file

Executor file

History files

Integrations

Azure DevOps

Bamboo

GitHub Actions

Jenkins

JetBrains IDEs

TeamCity

Visual Studio Code

Frameworks

Behat

Getting started

Configuration

Reference

Behave

Getting started

Configuration

Reference

Codeception

Getting started

Configuration

Reference

CodeceptJS

Getting started

Configuration

Reference

Cucumber.js

Getting started

Configuration

Reference

Cucumber-JVM

Getting started

Configuration

Reference

Cucumber.rb

Getting started

Configuration

Reference

Cypress

Getting started

Configuration

Reference

Jasmine

Getting started

Configuration

Reference

JBehave

Getting started

Configuration

Reference

Jest

Getting started

Configuration

Reference

JUnit 4

Getting started

Configuration

Reference

JUnit 5

Getting started

Configuration

Reference

Mocha

Getting started

Configuration

Reference

Newman

Getting started

Configuration

Reference

NUnit

Getting started

Configuration

Reference

PHPUnit

Getting started

Configuration

Reference

Playwright

Getting started

Configuration

Reference

pytest

Getting started

Configuration

Reference

Pytest-BDD

Getting started

Configuration

Reference

Reqnroll

Getting started

Configuration

Reference

REST Assured

Getting started

Configuration

Robot Framework

Getting started

Configuration

Reference

RSpec

Getting started

Configuration

Reference

SpecFlow

Getting started

Configuration

Reference

Spock

Getting started

Configuration

Reference

TestNG

Getting started

Configuration

Reference

Vitest

Getting started

Configuration

Reference

WebdriverIO

Getting started

Configuration

Reference

xUnit.net

Getting started

Configuration

Reference

On this page

Integrating screenshots in Allure Report with Pytest and Playwright ​

Interpreting test results should be fast and straightforward, allowing the root cause of a failure to be immediately clear without requiring code inspection, debugging, or external assistance.

To achieve this, test reports must present detailed information in a concise and accessible format. Incorporating screenshots is an effective way to provide visual context for test failures. This guide explains how to capture screenshots in Pytest with Playwright and integrate them into Allure Report to enhance readability and analysis.

1. Preparation ​

Prerequisites ​

Make sure the following prerequisites are met:

  • Python installed
  • Allure Report installed

Dependency list ​

This guide uses the following packages:

  • Pytest 8.3.4
  • allure-pytest 2.13.5
  • Pytest-playwright 0.7.0

Code sample ​

The complete source code used in this guide is available at https://github.com/allure-examples/guide-pytest-playwright-screenshots.

Setup ​

To run the examples in this guide:

  1. Install Python
  2. Install Allure Report
  3. Download a fresh project with Pytest from Allure Start
  4. Add the Playwright Pytest plugin to your project. For example, if you use pip:
shell
pip install pytest-playwright

2. Screenshots with Playwright Pytest ​

To take a screenshot with Playwright Pytest at an arbitrary time, use the screenshot method provided by the Page object. To get the Page object, you can use the page fixture:

python
def test_example(page):
    page.goto("https://playwright.dev/")
    try:
        assert "Playwright" in page.title()
    except AssertionError:
        page.screenshot(path="path/to/screenshot.png")
        raise

To take a screenshot of a particular element, use the screenshot method of the Locator object, for example:

python
element = page.get_by_role("search") # or however you find the element
# take the screenshot
element.screenshot(path="path/to/screenshot.png")

3. Automatic screenshots on failure ​

To take screenshots automatically of every test failure, set the --screenshot option to only-on-failure in your project's Pytest configuration. For example, if you use pyproject.toml as a configuration file, add the following:

toml
[tool.pytest.ini_options]
...
addopts = [
    ...
    "--screenshot", "only-on-failure"
]

Now, when a test fails, a screenshot file will be saved automatically in the test results directory of your project. Playwright Pytest deletes and recreates the directory with each test run.

4. Integrating with Allure Report ​

While capturing screenshots is beneficial for diagnosing test failures, viewing them separately can be inefficient. When test data is dispersed across multiple locations, the process of identifying and resolving failures becomes more time-consuming.

To streamline this workflow, screenshots should be directly attached to Allure Reports, ensuring all relevant test information is consolidated in a single location for efficient analysis and troubleshooting.

Allure Report shows you screenshots inside the test in which they were taken. That is also where the error messages and other attachments are presented to you, so you have everything you need to analyze test results in one place:

Screenshot Attachment in Allure Report

To attach screenshots to Allure, use either the allure.attach() or the allure.attach.file() functions.

Use allure.attach.file() to attach an existing file:

python
import allure
from pathlib import Path

# Attach a screenshot of a page or an element
def attach_screenshot(pageOrElement, path):
    name = Path(path).name
    pageOrElement.screenshot(path=path)
    allure.attach.file(
        path,
        name=name,
        attachment_type=allure.attachment_type.PNG,
    )

Use allure.attach() if you don’t need to save the screenshot on disk:

python
import allure

# Attach a screenshot of a page or an element
def attach_screenshot(pageOrElement, name):
    allure.attach(
        pageOrElement.screenshot(),
        name=name,
        attachment_type=allure.attachment_type.PNG,
    )

TIP

When you need to attach a screenshot you just took, prefer using the allure.attach function if possible. The reason is that when you save a screenshot on disk, it may not always be immediately available for reading because of OS caching. If that happens, you may end up with an empty file attached to Allure.

If you also set the --screenshot configuration option as described in Automatic screenshots on failure section, Playwright Pytest will save screenshots locally.

To automatically attach screenshots to Allure on each test failure, you can add a hook in the conftest.py file in your project's test root directory. The hook may look up the screenshots Playwright Pytest saved after the failed tests and attach these screenshots to Allure Report. For example:

python
import re
import allure
import pytest

from pathlib import Path

# A regular expression to match the file names of the screenshots taken on test failures
SCREENSHOT_NAME_PATTERN = re.compile(r"^test-failed-\d+\.png$")

@pytest.hookimpl(hookwrapper=True)
def pytest_runtest_teardown(item, nextitem):
    yield

    try:
        artifacts_dir = item.funcargs.get("output_path")
        if artifacts_dir:
            artifacts_dir_path = Path(artifacts_dir)
            if artifacts_dir_path.is_dir():
                for file in artifacts_dir_path.iterdir():
                    if file.is_file() and SCREENSHOT_NAME_PATTERN.match(file.name):
                        allure.attach.file(
                            str(file),
                            name=file.name,
                            attachment_type=allure.attachment_type.PNG,
                        )
    except Exception as e:
        print(f"Error taking screenthot: {e}")

5. Other attachment types ​

Allure Report can also handle other types of attachments - text, tables, URI lists, or documents (XML, JSON, YAML). For example:

python
allure.attach(
    response_content,
    name="response content",
    attachment_type=allure.attachment_type.XML
)

Allure Pytest makes some attachments automatically:

  1. everything passed to sys.stdout - e.g. print(...)
  2. everything passed to sys.stderr - e.g. print(..., file=sys.stderr)
  3. logging, e.g. logging.warning(...)

These outputs are attached as pseudo-files to the report:

Automatic Attachments In Allure Report With Pytest

If you don’t want all of this to appear in the report, use the --allure-no-capture option.

Allure also allows you to attach videos. You can consult the official documentation for more on attachments with Pytest and attachment types.

6. Conclusion ​

With Pytest and Playwright, you can capture screenshots at any point during your tests or configure Playwright to take them automatically upon test failures. Allure Report combines these screenshots along with other attachments—such as text, documents, tables, and videos—into a single view, providing comprehensive data to help diagnose test failures efficiently.

Pager
Previous pagePytest & Selenium: screenshots and attachments
Next pagePytest & Playwright: videos
Powered by

Join our newsletter

Allure TestOps
  • Overview
  • Why choose us
  • Cloud
  • Self-hosted
  • Success Stories
Company
  • Documentation
  • Blog
  • About us
  • Contact
  • Events
© 2025 Qameta Software Inc. All rights reserved.