Screenshot capture, organization, and comparison for QA testing. Use when taking screenshots during test execution to ensure proper naming, organization, and traceability back to test cases.
Standardize screenshot capture and organization during QA testing.
qa-tests/
āāā draft/ # QA test documents by status
āāā active/
āāā executed/
āāā archived/
āāā screenshots/
āāā {test-id}/ # e.g., QA-20250105-001
ā āāā 01-initial-state.png # Numbered sequence
ā āāā 02-form-filled.png
ā āāā 03-success-state.png
ā āāā elements/ # Extracted UI elements
ā āāā login-button.png
ā āāā email-field.png
ā āāā password-field.png
āāā baseline/ # Reference screenshots for comparison
ā āāā {feature}/
ā āāā {state}.png
āāā failures/ # Failed test evidence
āāā {date}/
āāā {test-id}-{timestamp}.png
Key: Screenshots are stored in qa-tests/screenshots/{test-id}/ where {test-id} matches the QA test document name (e.g., QA-20250105-001).
{sequence}-{state-description}.{png|jpeg}
01- through 99- for ordered stepsUse descriptive, kebab-case names:
| State | Example Filename |
|---|---|
| Initial page load | 01-initial-state.png |
| After form fill | 02-form-filled.png |
| Validation error | 03-validation-error.png |
| Success message | 04-success-message.png |
| Modal open | 05-modal-open.png |
| Dropdown expanded | 06-dropdown-expanded.png |
| Bad | Good |
|---|---|
screenshot1.png |
01-login-page-loaded.png |
test.png |
02-credentials-entered.png |
error.png |
03-invalid-password-error.png |
final.png |
04-dashboard-after-login.png |
Include metadata in test documentation:
### Screenshots
| # | Filename | Description | Step |
|---|----------|-------------|------|
| 1 | 01-initial-state.png | Login page before input | TC-001 Step 1 |
| 2 | 02-credentials-entered.png | Form with test credentials | TC-001 Step 2 |
| 3 | 03-dashboard-loaded.png | Dashboard after successful login | TC-001 Step 3 |
// Full viewport
await page.screenshot({ path: 'screenshots/01-initial-state.png' });
// Full page (scrollable)
await page.screenshot({
path: 'screenshots/02-full-page.png',
fullPage: true
});
// Specific element only
const element = page.locator('.error-message');
await element.screenshot({ path: 'screenshots/03-error-detail.png' });
const timestamp = new Date().toISOString().replace(/[:.]/g, '-');
await page.screenshot({
path: `screenshots/failure-${timestamp}.png`
});
Create Baseline
screenshots/baseline/{feature}/Compare During Testing
| Type | Action |
|---|---|
| Dynamic content (dates, times) | Mask or ignore region |
| User-specific data | Use consistent test data |
| Animations | Wait for stable state |
| Random elements (ads) | Exclude from comparison |
When a test fails, capture:
screenshots/failures/2025-01-05/
āāā QA-20250105-001-TC-002-1704456789.png # Actual state
āāā QA-20250105-001-TC-002-expected.png # Expected (if applicable)
āāā QA-20250105-001-TC-002-diff.png # Visual diff (if generated)
Organize by browser when testing multiple browsers:
screenshots/{test-id}/
āāā chrome/
ā āāā 01-initial-state.png
ā āāā 02-final-state.png
āāā firefox/
ā āāā ...
āāā safari/
āāā ...
Capture at standard breakpoints:
| Device | Width | Suffix |
|---|---|---|
| Mobile | 375px | -mobile |
| Tablet | 768px | -tablet |
| Desktop | 1280px | -desktop |
| Wide | 1920px | -wide |
Example:
01-homepage-mobile.png
01-homepage-tablet.png
01-homepage-desktop.png
| Category | Retention |
|---|---|
| Passing tests | Delete after test run |
| Failing tests | Keep until issue resolved |
| Baselines | Keep in version control |
| Regression evidence | Keep 30 days minimum |
# Remove screenshots older than 30 days from failures
find qa-tests/screenshots/failures -mtime +30 -delete
Reference screenshots in test execution logs:
## Test Execution Log
| Date | Tester | Result | Evidence |
|------|--------|--------|----------|
| 2025-01-05 | Jane | FAIL | [Screenshots](./screenshots/QA-20250105-001/) |
When documenting accessibility issues:
Highlight Problem Area
Include Context
Document Fix Verification