Skip to main content

Capture screenshots, HTML, and console logs on Playwright test failures

Project description

Capture debugging artifacts on Playwright test failures

Release Notes Downloads GitHub CI Status License: MIT

When your Playwright tests fail, you need to see what went wrong. This pytest plugin does a couple things to make it easier for you (and LLMs!) to debug and build Playwright tests:

  1. Automatically captures HTML, screenshots, console logs, and failure summaries the moment a test fails and dumps them into a per-test folder for easy debugging.
  2. Allows you to assert that no console errors were logged during a test.
  3. Automatically retry tests that fail due to Playwright flakiness

No more guessing what the page looked like, what JavaScript errors occurred, or what the actual DOM content was.

Installation

uv add --dev pytest-playwright-artifacts

The plugin activates automatically once installed. No configuration needed.

Usage

Artifacts on failure

def test_my_page(page):
    page.goto("https://example.com")
    assert page.title() == "Example"

When this test fails, you'll find artifacts in test-results/<test-name>/:

  • failure.html - Rendered DOM content at the moment of failure
  • screenshot.png - Full-page screenshot
  • failure.txt - Failure summary with traceback
  • console_logs.log - All captured console messages

Console messages are captured for every test but are only written to console_logs.log on failure. During a passing test they are emitted at DEBUG log level via structlog and are not visible in normal pytest output.

Fail tests on console errors

from pytest_playwright_artifacts import assert_no_console_errors

def test_no_console_errors(page, request):
    page.goto("https://example.com")
    assert_no_console_errors(request)

This fails the test if any console.error() messages were logged during the test.

Retry on Playwright timeouts

Playwright tests can flake due to network latency or slow animations. The plugin can retry a test automatically when it fails with a TimeoutError. Only playwright._impl._errors.TimeoutError triggers a retry — assertion failures and other errors fail immediately. Retried attempts show as R / RERUN in pytest output.

Per-test

@pytest.mark.playwright_timeout_retries(2)
def test_checkout(page):
    page.goto("https://example.com/checkout")
    page.click("#pay-button")
    expect(page.locator(".success")).to_be_visible()

Per-folder

Add a pytestmark to conftest.py in the folder you want to cover:

# tests/e2e/conftest.py
import pytest

pytestmark = [pytest.mark.playwright_timeout_retries(2)]

Global default

Set a default for the entire suite in pyproject.toml. A marker on an individual test or folder always takes precedence.

[tool.pytest.ini_options]
playwright_timeout_retries = 2

Configuration

Filter noisy console messages

Use regex patterns to ignore known noisy messages:

pyproject.toml:

[tool.pytest.ini_options]
playwright_console_ignore = [
  "Invalid Sentry Dsn:.*",
  "Radar SDK: initialized.*",
  # Ignore all messages from a specific file/URL
  { file = "third-party-tracker\\.js" },
  # Ignore only specific messages from a file
  { file = "analytics\\.js", message = "deprecated.*" },
]

pytest.ini (plain strings only — TOML inline tables are not supported):

[pytest]
playwright_console_ignore =
  Invalid Sentry Dsn:.*
  Radar SDK: initialized.*

Plain string patterns

Plain string entries match against both the raw console text and the fully formatted log entry (which includes the type, text, arguments, and source location/URL). This allows you to filter by content OR origin.

For example, a console log like console.log("User:", {id: 1, name: "Alice"}) will be formatted as a JSON string:

{"type": "log", "text": "User: JSHandle@object", "args": ["User:", {"id": 1, "name": "Alice"}], "location": {"url": "...", "lineNumber": 1, "columnNumber": 0}}

You can match against any part of this JSON string, including expanded object arguments.

Structured dict patterns (pyproject.toml only)

Dict entries let you scope ignore rules precisely by URL and/or message.

Finding the source URL: the easiest way is to look at console_logs.log in a failed test's artifact directory. Each line includes the full location, e.g.:

{"type": "error", "text": "deprecated API", "args": [], "location": {"url": "https://cdn.example.com/analytics.js?v=2", "lineNumber": 1, "columnNumber": 0}}

Copy the relevant part of the URL and use it as the file regex (remember to escape . as \\.).

  • file — required; regex matched against the console message's source URL
  • message — optional; regex matched against the raw console text

If only file is given, all messages from matching URLs are ignored. If both file and message are given, both must match (AND logic).

playwright_console_ignore = [
  # Ignore everything from a third-party bundle
  { file = "vendor/sentry\\.js" },
  # Ignore only deprecation warnings from analytics
  { file = "analytics\\.js", message = "deprecated.*" },
]

You can also pass dict patterns directly to assert_no_console_errors:

assert_no_console_errors(
    request,
    ignore=[
        {"file": r"third-party\.js"},
        {"file": r"analytics\.js", "message": r"deprecated.*"},
    ],
)

Change artifact output directory

By default, artifacts are saved to test-results/. You can customize this:

Command line:

pytest --playwright-artifacts-output=my-artifacts

pyproject.toml:

[tool.pytest.ini_options]
playwright_artifacts_output = "my-artifacts"

Related Projects

  • pytest-playwright-visual-snapshot: Adds visual regression testing capabilities to your Playwright and pytest suite.
  • playwright-trace-analyzer: Provides a CLI for inspecting Playwright trace files without needing the full browser viewer.
  • pytest-plugin-utils: Offers reusable logic for managing artifacts and configurations when building other pytest plugins.
  • gh-clean-artifacts: Helps manage storage costs by pruning old or large GitHub Actions artifacts.
  • pytest-line-runner: Simplifies test execution by allowing you to run pytest tests using file line numbers.
  • pytest-celery-utils: Enables inspection of Celery task queues in Redis directly from your pytest environment.
  • python-package-prompts: Contains LLM instructions for maintaining Python standards across projects using pytest and other libraries.

MIT License


This project was created from iloveitaly/python-package-template

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

pytest_playwright_artifacts-0.3.1.tar.gz (9.3 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

pytest_playwright_artifacts-0.3.1-py3-none-any.whl (11.1 kB view details)

Uploaded Python 3

File details

Details for the file pytest_playwright_artifacts-0.3.1.tar.gz.

File metadata

  • Download URL: pytest_playwright_artifacts-0.3.1.tar.gz
  • Upload date:
  • Size: 9.3 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: uv/0.10.12 {"installer":{"name":"uv","version":"0.10.12","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

File hashes

Hashes for pytest_playwright_artifacts-0.3.1.tar.gz
Algorithm Hash digest
SHA256 3c53559118dae6e50e0f44a088c2ae31057ca546a3473b8abbe0b831a19a81b1
MD5 a073dab8a8525a5be2153de800518204
BLAKE2b-256 46d24b971b288febdd89b07f09bdfd809c5760dd8d180abe1ed70673d1526c32

See more details on using hashes here.

File details

Details for the file pytest_playwright_artifacts-0.3.1-py3-none-any.whl.

File metadata

  • Download URL: pytest_playwright_artifacts-0.3.1-py3-none-any.whl
  • Upload date:
  • Size: 11.1 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: uv/0.10.12 {"installer":{"name":"uv","version":"0.10.12","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

File hashes

Hashes for pytest_playwright_artifacts-0.3.1-py3-none-any.whl
Algorithm Hash digest
SHA256 575609b644dd4d81aa04507195711b5d6452efdc234595469efc09a0c8bd1544
MD5 ad941ab1f68156257cb70b900bb39393
BLAKE2b-256 fea5f0744ec5fc0cf5a5c2650a004d5812bb787cfbea59a2faa23c8cb9b1c699

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page