Playwright generates beautiful HTML test reports, but sharing them with your team is surprisingly difficult. The reports are local files, CI artifacts expire, and emailing zip files feels like 2005. Here’s how to share Playwright test reports properly.
The Playwright Report Sharing Problem
When you run Playwright tests, the HTML report is generated locally in playwright-report/. To view it, you run:
npx playwright show-reportThis opens a local server - great for you, useless for your team. How do you share the report when:
- QA needs to see what failed before approving a release
- A PM wants to check test coverage for a feature
- You’re debugging with a colleague and need to show them the exact failure
- You need to reference an old test run from weeks ago
Common (Bad) Solutions
1. Email the zip file
- Clunky, fills up inboxes, version confusion
- Recipient has to download, extract, open in browser
2. Upload to S3/GCS manually
- Works, but requires manual steps every time
- Who manages the bucket? What about access control?
3. Rely on CI artifacts
- GitHub Actions artifacts expire after 90 days (configurable)
- GitLab artifacts expire too
- Finding the right artifact in a sea of workflow runs is tedious
4. Share your screen
- Not async-friendly
- Can’t reference later
Better Solution: Hosted Playwright Reports
The real solution is to host your Playwright reports somewhere permanent and shareable. Every test run gets a unique URL that anyone on your team can access.
What Good Looks Like
- CI runs your Playwright tests
- Reports automatically upload to a hosting service
- You get a permanent URL like
https://app.gaffer.sh/reports/abc123 - Share the link in Slack, Jira, GitHub PR, wherever
- Anyone with access can view the full interactive report
No downloads. No expiring artifacts. No manual steps.
Setting Up Playwright Report Sharing with Gaffer
Gaffer hosts your Playwright reports with one addition to your CI pipeline.
Step 1: Generate Playwright HTML Reports
Make sure your playwright.config.ts generates HTML reports:
import { defineConfig } from '@playwright/test';
export default defineConfig({
reporter: [
['html', { open: 'never' }], // Generate HTML report
['list'], // Also show in console
],
});Step 2: Add Gaffer Upload to CI
GitHub Actions:
- name: Run Playwright tests
run: npx playwright test
- name: Upload report to Gaffer
if: always() # Upload even if tests fail
uses: gaffer-sh/gaffer-uploader@v2
with:
api-key: ${{ secrets.GAFFER_API_KEY }}
report-path: ./playwright-reportGitLab CI:
test:
script:
- npx playwright test
after_script:
- |
curl -X POST https://api.gaffer.sh/upload \
-H "X-API-Key: $GAFFER_API_KEY" \
-F "files=@playwright-report/index.html"Step 3: Share the Link
After upload, Gaffer returns a URL to the hosted report. Share it anywhere:
- Slack: “Tests failed on main, see report: [link]”
- GitHub PR comment: “E2E results: [link]”
- Jira ticket: Attach as evidence of testing
Bonus: Slack Notifications
Tired of checking CI manually? Gaffer can send Playwright test results directly to Slack:
- Pass/fail summary at a glance
- Direct link to the full report
- Filter by branch (only notify on
main, not every feature branch)
No more “did the tests pass?” messages in Slack.
Comparing Playwright Report Sharing Options
| Method | Permanent | Shareable Link | Automated | Team Access |
|---|---|---|---|---|
Local show-report | ❌ | ❌ | ❌ | ❌ |
| Email zip files | ❌ | ❌ | ❌ | ✅ |
| CI artifacts | ❌ (expires) | ✅ | ✅ | ✅ (if CI access) |
| S3 manual upload | ✅ | ✅ | ❌ | Depends |
| Gaffer | ✅ | ✅ | ✅ | ✅ |
Beyond Sharing: Playwright Analytics
Once you’re hosting reports, you unlock analytics:
- Pass rate trends - Is your test suite getting more stable or less?
- Flaky test detection - Which tests fail intermittently?
- Duration tracking - Are tests getting slower?
- Failure patterns - AI-powered insights into common failures
Get Started
Gaffer’s free tier includes 500 MB of storage with 7-day retention. Paid plans offer extended retention, with the option for unlimited retention.