ipinternalpage
GuideUpdated

How to share a Playwright HTML report privately.

Playwright produces a browsable HTML report, but a CI artifact still makes every reviewer download and open a zip. Publish the report as a private, stable link your team can open after Google sign-in.

Generate Playwright's HTML report
Publish the report from local development or CI
Require Google sign-in for every view
Reuse one URL for recurring test runs

Generate the HTML report without opening it in CI

Playwright's HTML reporter writes a self-contained report folder, normally playwright-report. Set open to never in automated runs so the job generates the report without trying to launch a browser.

  • Keep Playwright's default playwright-report output folder or set outputFolder explicitly
  • Retain traces, screenshots, and attachments when reviewers need failure evidence
  • Make sure the report step runs even when tests fail
Generate the report
PLAYWRIGHT_HTML_OPEN=never npx playwright test --reporter=html

Check whether the report is truly single-file

Playwright describes its HTML output as a self-contained folder. The main report interface and data may be embedded in index.html, while screenshots, traces, and other attachments can remain as files under the report directory. internalpage currently publishes one source file, so verify that the index works without external attachments before using this path.

  • Open a copy of index.html outside the report folder to test its dependencies
  • Use a single-file summary when the full report depends on screenshots or traces
  • Use a static host behind an identity proxy when the complete report folder must be preserved
  • Check that embedded output does not contain secrets or customer data

A test report can expose URLs, request data, screenshots, and application state. Redact sensitive fixtures before publishing, even when the viewer is private.

Publish to a stable private page

When index.html is self-contained for the evidence you need, sign in to the internalpage CLI and publish it to a readable slug. Reusing the same slug on later runs updates the destination instead of creating a new link for every CI job.

Sign in once
npx @internalpage/cli login
Publish the report
npx @internalpage/cli publish ./playwright-report/index.html --slug qa/playwright-report

Choose the right test-report audience

Workspace access fits a general QA dashboard. Selected-email access is safer when the report includes a customer reproduction, pre-release feature, security finding, or data visible only to one incident team.

  • Workspace access for ordinary regression results
  • Selected emails for sensitive failures and incident evidence
  • Separate slugs when projects need different audiences

Add publishing to CI only after tests finish

Run the publish step after the report exists, including failed test runs when those are the reports reviewers need most. Store the internalpage token in your CI secret store and keep the command output machine-readable.

Publish non-interactively
IP_TOKEN="${INTERNALPAGE_TOKEN}" npx @internalpage/cli publish ./playwright-report/index.html --slug qa/playwright-report --json

Use an always-style CI condition for the report generation and publish steps when a failed test command would otherwise skip them.

Verify the report like a reviewer

Open the published URL from a signed-out browser, authenticate with an allowed account, and inspect at least one passing and one failing test. If attachments are important, confirm each one loads; a missing attachment means the report is not suitable for the current single-file path. Then verify that an unauthorized account cannot receive the report.

  • Filters and test detail navigation work
  • Screenshots, attachments, and traces load
  • The report identifies the run or commit it represents
  • Denied viewers do not receive report content
FAQ

Common questions

Why not use the GitHub Actions artifact link?

CI artifacts are useful for storage and debugging, but reviewers often need repository access and must download a file. A private viewer URL is easier to revisit and share while still requiring Google sign-in.

Can I keep one URL for every Playwright run?

Yes. Publish each new report to the same slug to update the page behind the existing URL. Use separate slugs if you need history or different access policies.

Should failed reports be published?

Usually yes, because failures contain the evidence reviewers need. Configure CI so report generation and publishing still run after a failed test command.

Will Playwright traces and screenshots work from one uploaded HTML file?

Not always. Playwright can store attachments under the report directory, while internalpage currently publishes one source file. Verify the copied index.html in isolation or use a full static host behind access control when attachments are required.

Does Google sign-in make screenshots safe?

No. It limits delivery to authorized viewers, but those viewers can inspect the report. Remove secrets and sensitive test data before publishing.