76 lines
2.0 KiB
JavaScript
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 };
|