mirror of
https://github.com/rcourtman/Pulse.git
synced 2026-05-09 02:44:24 +00:00
- Created comprehensive screenshot tool using Playwright - Generated all 8 screenshots referenced in documentation: - Dashboard, Storage, Backups, Alerts views - Alert History, Settings, Dark Mode examples - Mobile responsive view - Added three screenshot scripts: - take-screenshots.js: Full-featured with browser chrome - take-screenshots-simple.js: Basic screenshot capture - take-all-screenshots.js: Comprehensive capture for all docs - Fixes broken screenshot links in README and SCREENSHOTS.md
185 lines
No EOL
4.9 KiB
JavaScript
185 lines
No EOL
4.9 KiB
JavaScript
const { chromium } = require('@playwright/test');
|
|
const fs = require('fs').promises;
|
|
const path = require('path');
|
|
|
|
const PULSE_URL = process.env.PULSE_URL || 'http://localhost:7655';
|
|
const OUTPUT_DIR = path.join(__dirname, '..', 'docs', 'images');
|
|
|
|
async function ensureOutputDir() {
|
|
try {
|
|
await fs.mkdir(OUTPUT_DIR, { recursive: true });
|
|
} catch (error) {
|
|
console.error('Error creating output directory:', error);
|
|
}
|
|
}
|
|
|
|
async function wait(ms) {
|
|
return new Promise(resolve => setTimeout(resolve, ms));
|
|
}
|
|
|
|
async function takeScreenshot(page, name, options = {}) {
|
|
const { selector = null, fullPage = false } = options;
|
|
|
|
await wait(1500); // Wait for animations
|
|
|
|
let screenshotOptions = {
|
|
type: 'png',
|
|
path: path.join(OUTPUT_DIR, `${name}.png`)
|
|
};
|
|
|
|
if (selector) {
|
|
const element = await page.locator(selector).first();
|
|
await element.waitFor({ state: 'visible', timeout: 10000 });
|
|
screenshotOptions = {
|
|
...screenshotOptions,
|
|
clip: await element.boundingBox()
|
|
};
|
|
} else if (fullPage) {
|
|
screenshotOptions.fullPage = true;
|
|
}
|
|
|
|
await page.screenshot(screenshotOptions);
|
|
console.log(`✅ Saved ${name}.png`);
|
|
}
|
|
|
|
async function clickAndWait(page, selector, waitTime = 1000) {
|
|
try {
|
|
await page.click(selector);
|
|
await wait(waitTime);
|
|
} catch (e) {
|
|
console.log(`Could not click ${selector}: ${e.message}`);
|
|
}
|
|
}
|
|
|
|
async function ensureDarkTheme(page) {
|
|
try {
|
|
// Check if theme toggle exists
|
|
const themeToggle = page.locator('[aria-label="Toggle theme"], button:has-text("Theme")').first();
|
|
if (await themeToggle.count() > 0) {
|
|
// Check if we're in light mode
|
|
const isLightMode = await page.evaluate(() => {
|
|
return document.documentElement.classList.contains('light') ||
|
|
!document.documentElement.classList.contains('dark');
|
|
});
|
|
|
|
if (isLightMode) {
|
|
await themeToggle.click();
|
|
await wait(500);
|
|
}
|
|
}
|
|
} catch (e) {
|
|
console.log('Could not set dark theme:', e.message);
|
|
}
|
|
}
|
|
|
|
async function main() {
|
|
await ensureOutputDir();
|
|
|
|
const browser = await chromium.launch({
|
|
headless: true
|
|
});
|
|
|
|
const context = await browser.newContext({
|
|
viewport: { width: 1440, height: 900 }
|
|
});
|
|
|
|
const page = await context.newPage();
|
|
|
|
try {
|
|
console.log(`📸 Starting screenshot capture for ${PULSE_URL}`);
|
|
|
|
// Navigate to Pulse
|
|
await page.goto(PULSE_URL, { waitUntil: 'networkidle' });
|
|
await wait(3000);
|
|
|
|
// Ensure dark theme
|
|
await ensureDarkTheme(page);
|
|
|
|
// 1. Dashboard Screenshot
|
|
console.log('📸 Capturing dashboard...');
|
|
await takeScreenshot(page, '01-dashboard');
|
|
|
|
// 2. Try to navigate to different views
|
|
// Look for navigation tabs or buttons
|
|
const navSelectors = [
|
|
'button:has-text("Storage")',
|
|
'a:has-text("Storage")',
|
|
'[role="tab"]:has-text("Storage")',
|
|
'.nav-link:has-text("Storage")'
|
|
];
|
|
|
|
for (const selector of navSelectors) {
|
|
if (await page.locator(selector).count() > 0) {
|
|
console.log('📸 Capturing storage view...');
|
|
await clickAndWait(page, selector, 2000);
|
|
await takeScreenshot(page, '02-storage');
|
|
break;
|
|
}
|
|
}
|
|
|
|
// 3. Try Backups
|
|
const backupSelectors = [
|
|
'button:has-text("Backups")',
|
|
'a:has-text("Backups")',
|
|
'[role="tab"]:has-text("Backups")',
|
|
'.nav-link:has-text("Backups")'
|
|
];
|
|
|
|
for (const selector of backupSelectors) {
|
|
if (await page.locator(selector).count() > 0) {
|
|
console.log('📸 Capturing backups view...');
|
|
await clickAndWait(page, selector, 2000);
|
|
await takeScreenshot(page, '03-backups');
|
|
break;
|
|
}
|
|
}
|
|
|
|
// 4. Try Alerts
|
|
const alertSelectors = [
|
|
'button:has-text("Alerts")',
|
|
'a:has-text("Alerts")',
|
|
'[role="tab"]:has-text("Alerts")',
|
|
'.nav-link:has-text("Alerts")'
|
|
];
|
|
|
|
for (const selector of alertSelectors) {
|
|
if (await page.locator(selector).count() > 0) {
|
|
console.log('📸 Capturing alerts view...');
|
|
await clickAndWait(page, selector, 2000);
|
|
await takeScreenshot(page, '04-alerts');
|
|
break;
|
|
}
|
|
}
|
|
|
|
// 5. Try Settings
|
|
const settingsSelectors = [
|
|
'button:has-text("Settings")',
|
|
'a:has-text("Settings")',
|
|
'[aria-label="Settings"]',
|
|
'.settings-icon'
|
|
];
|
|
|
|
for (const selector of settingsSelectors) {
|
|
if (await page.locator(selector).count() > 0) {
|
|
console.log('📸 Capturing settings view...');
|
|
await clickAndWait(page, selector, 2000);
|
|
await takeScreenshot(page, '05-settings');
|
|
break;
|
|
}
|
|
}
|
|
|
|
console.log('✨ Screenshot capture complete!');
|
|
console.log(`📁 Screenshots saved to: ${OUTPUT_DIR}`);
|
|
|
|
} catch (error) {
|
|
console.error('❌ Error during screenshot capture:', error);
|
|
|
|
// Take error screenshot
|
|
await takeScreenshot(page, 'error-state');
|
|
} finally {
|
|
await browser.close();
|
|
}
|
|
}
|
|
|
|
// Run the script
|
|
main().catch(console.error); |