Skip to main content

Playwright/pytest test analytics reporter — navigation timeline, API call capture, network stats, failure diagnostics, and interactive HTML reports.

Project description

testrelic-playwright

A pytest + Playwright analytics reporter that generates structured JSON and HTML reports from your Playwright test runs — capturing navigation timelines, API call tracking, network statistics, failure diagnostics, and CI metadata. The Python port of @testrelic/playwright-analytics.

What it does

When you run your tests with the TestRelic pytest plugin you get a JSON + HTML report that captures:

  • Navigation timeline — every URL visited during each test in chronological order, with navigation type detection (goto, link click, back/forward, SPA route changes, hash changes).
  • API call tracking — HTTP method, URL, status code, request/response headers and bodies, response times, and assertions for every API call.
  • Network statistics — total requests, failed requests, bytes transferred, and resource-type breakdowns (scripts, images, stylesheets, fonts, XHR).
  • Test results — pass/fail/flaky status, duration, retry count, and tags.
  • Failure diagnostics — error messages, source-code snippets pointing to the exact failure line, and optional stack traces.
  • CI metadata — auto-detection of GitHub Actions, GitLab CI, Jenkins, and CircleCI with build id, commit sha, and branch.
  • Sensitive-data redaction — AWS keys, Bearer tokens, private keys, credential URLs, and sensitive API headers / body fields.
  • HTML report — self-contained interactive HTML alongside the JSON.

Quick start

1. Install

pip install pytest-playwright testrelic-playwright
playwright install

The reporter activates automatically because testrelic-playwright registers a pytest11 entry point. No conftest.py plumbing required.

2. Write a test

Use the standard page and context fixtures from pytest-playwright. The TestRelic plugin auto-attaches listeners and records navigation / API calls.

# tests/test_homepage.py
from playwright.sync_api import Page, expect


def test_homepage_loads(page: Page) -> None:
    page.goto("https://example.com")
    expect(page.locator("h1")).to_be_visible()

API tests work the same way using pytest-playwright's built-in APIRequestContext fixture:

from playwright.sync_api import APIRequestContext


def test_fetch_posts(playwright) -> None:
    request = playwright.request.new_context()
    response = request.get("https://api.example.com/posts")
    assert response.status == 200

3. Run

pytest

Outputs land in:

test-results/
├── analytics-timeline.json
└── analytics-timeline.html

Configuration

Reporter options can be supplied three ways (highest priority first):

  1. Environment variables (TESTRELIC_API_KEY, TESTRELIC_CLOUD_ENDPOINT, TESTRELIC_UPLOAD_STRATEGY, TESTRELIC_CLOUD_TIMEOUT).
  2. pytest.ini / pyproject.toml testrelic_options ini block.
  3. .testrelic/testrelic-config.json in the project root.

pytest.ini

[pytest]
testrelic_options =
    outputPath=./reports/run.json
    includeStackTrace=true
    captureRequestBody=true
    captureResponseBody=true

pyproject.toml

[tool.pytest.ini_options]
testrelic_options = [
  "outputPath=./reports/run.json",
  "includeStackTrace=true",
]

CLI flags

pytest --testrelic-output ./reports/custom.json
pytest --testrelic-disable    # turn the reporter off for this run
pytest --testrelic-quiet      # suppress banner output

Full option list

Option Type Default Description
outputPath str ./test-results/analytics-timeline.json JSON report path
htmlReportPath str derived from outputPath HTML report path
includeStackTrace bool false Include full stack traces in failures
includeCodeSnippets bool true Include source code around the failure line
codeContextLines int 3 Lines of context above / below the failure line
includeNetworkStats bool true Track network requests and bytes per navigation
includeArtifacts bool true Include screenshots and videos
includeActionSteps bool true Capture pytest test steps
captureConsoleLogs bool true Capture browser console messages
trackApiCalls bool true Enable / disable API call tracking
captureRequestHeaders bool true Capture request headers
captureResponseHeaders bool true Capture response headers
captureRequestBody bool true Capture request bodies
captureResponseBody bool true Capture response bodies
redactHeaders list[str] [authorization, cookie, set-cookie, x-api-key] Header names to redact
redactBodyFields list[str] [password, secret, token, apiKey, api_key] JSON body field names to scrub
apiIncludeUrls list[str] [] Only track API calls matching these patterns
apiExcludeUrls list[str] [] Exclude API calls matching these patterns
quiet bool false Suppress banner output

Cloud integration

Set TESTRELIC_API_KEY and the reporter uploads the batch payload to https://platform.testrelic.ai/api/v1/test-runs at session end.

export TESTRELIC_API_KEY=tk_live_...
export TESTRELIC_UPLOAD_STRATEGY=both   # realtime | batch | both

Or use a project file:

// .testrelic/testrelic-config.json
{
  "cloud": {
    "apiKey": "$TESTRELIC_API_KEY",
    "endpoint": "https://platform.testrelic.ai/api/v1",
    "upload": "both"
  },
  "testrelic-repo": {
    "name": "my-project"
  }
}

Network failures are queued to .testrelic/queue/ and can be retried with:

testrelic-playwright drain

CLI

testrelic-playwright merge shard-1.json shard-2.json -o merged.json
testrelic-playwright serve ./test-results --port 9323
testrelic-playwright drain
testrelic-playwright version

Manual navigation hook

For navigation the auto-tracker can't see (custom routing, iframes), use record_navigation:

from testrelic_playwright import record_navigation


def test_with_manual_nav(page, testrelic_state) -> None:
    page.goto("https://example.com")
    record_navigation(testrelic_state, "https://example.com/spa/profile", "spa_route")

Compatibility

  • Python 3.9 – 3.12
  • pytest 7.0+
  • pytest-playwright 0.5+
  • Playwright 1.35+

License

MIT

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

testrelic_playwright-0.2.0.tar.gz (34.7 kB view details)

Uploaded Source

Built Distribution

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

testrelic_playwright-0.2.0-py3-none-any.whl (44.7 kB view details)

Uploaded Python 3

File details

Details for the file testrelic_playwright-0.2.0.tar.gz.

File metadata

  • Download URL: testrelic_playwright-0.2.0.tar.gz
  • Upload date:
  • Size: 34.7 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for testrelic_playwright-0.2.0.tar.gz
Algorithm Hash digest
SHA256 9431d3fe8ab6544cb97bed14b84128d2bffaa9514a6ad80518bca26ffa75402e
MD5 627cb4f1fe71d4b79b830b72449f5e77
BLAKE2b-256 00a3427f0f10c1bfa6ee78ff18734b1db55777b7be4477ec68e40f98a9725348

See more details on using hashes here.

Provenance

The following attestation bundles were made for testrelic_playwright-0.2.0.tar.gz:

Publisher: publish-playwright-prod.yml on testrelic-ai/testrelic-python-sdk

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file testrelic_playwright-0.2.0-py3-none-any.whl.

File metadata

File hashes

Hashes for testrelic_playwright-0.2.0-py3-none-any.whl
Algorithm Hash digest
SHA256 1aebc1337d6d0850ecd7853055c3a629627aff81e76236e2f702b31d75a7bb41
MD5 89abd7441a43d90e7be4ec73b858e6dd
BLAKE2b-256 8edfb4669663e5cc551c85474c0bfb5849991bd734c4113015a596f5de38ac93

See more details on using hashes here.

Provenance

The following attestation bundles were made for testrelic_playwright-0.2.0-py3-none-any.whl:

Publisher: publish-playwright-prod.yml on testrelic-ai/testrelic-python-sdk

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

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