2026-02-17 23:03:48 -05:00

76 lines
2.0 KiB
JavaScript

const { chromium } = require('playwright');
const path = require('path');
const fs = require('fs');
const BASE_URL = `http://localhost:${process.env.PORT || 8899}`;
// Screenshots always hit localhost, even when site is publicly accessible via subdomain
async function takeScreenshots(clientId, clientDir) {
const screenshotsDir = path.join(clientDir, 'screenshots');
fs.mkdirSync(screenshotsDir, { recursive: true });
let browser;
try {
browser = await chromium.launch({
headless: true,
args: ['--no-sandbox', '--disable-setuid-sandbox']
});
const context = await browser.newContext({
viewport: { width: 1440, height: 900 },
deviceScaleFactor: 2,
});
const pages = [
{
url: `${BASE_URL}/sites/${clientId}/`,
filename: 'homepage.png',
fullPage: true,
},
{
url: `${BASE_URL}/sites/${clientId}/contact`,
filename: 'contact-optin.png',
fullPage: true,
},
{
url: `${BASE_URL}/sites/${clientId}/privacy-policy`,
filename: 'privacy-policy.png',
fullPage: true,
},
{
url: `${BASE_URL}/sites/${clientId}/terms`,
filename: 'terms-of-service.png',
fullPage: true,
},
];
for (const pageConfig of pages) {
try {
const page = await context.newPage();
await page.goto(pageConfig.url, {
waitUntil: 'networkidle',
timeout: 15000
});
// Small delay for any CSS animations to settle
await page.waitForTimeout(500);
await page.screenshot({
path: path.join(screenshotsDir, pageConfig.filename),
fullPage: pageConfig.fullPage,
});
await page.close();
console.log(` → Screenshot: ${pageConfig.filename}`);
} catch (err) {
console.error(` ⚠ Failed screenshot ${pageConfig.filename}:`, err.message);
}
}
await context.close();
} finally {
if (browser) await browser.close();
}
}
module.exports = { takeScreenshots };