UNPKG

@vizzly-testing/static-site

Version:

Static site generator plugin for Vizzly - seamlessly integrate static sites (Gatsby, Astro, Jekyll, Next.js) into your visual development workflow

110 lines (100 loc) 2.93 kB
/** * Browser management with Puppeteer * Functions for launching, managing, and closing browsers */ import puppeteer from 'puppeteer'; import { setViewport } from './utils/viewport.js'; /** * Launch a Puppeteer browser instance * @param {Object} options - Browser launch options * @param {boolean} [options.headless=true] - Run in headless mode * @param {Array<string>} [options.args=[]] - Additional browser arguments * @returns {Promise<Object>} Browser instance */ export async function launchBrowser(options = {}) { let { headless = true, args = [] } = options; let browser = await puppeteer.launch({ headless, args: ['--no-sandbox', '--disable-setuid-sandbox', ...args] }); return browser; } /** * Close a browser instance * @param {Object} browser - Browser instance to close * @returns {Promise<void>} */ export async function closeBrowser(browser) { if (browser) { await browser.close(); } } /** * Create a new page in the browser * @param {Object} browser - Browser instance * @returns {Promise<Object>} Page instance */ export async function createPage(browser) { return await browser.newPage(); } /** * Navigate to a URL and wait for the page to load * @param {Object} page - Puppeteer page instance * @param {string} url - URL to navigate to * @param {Object} [options] - Navigation options * @returns {Promise<void>} */ export async function navigateToUrl(page, url, options = {}) { try { await page.goto(url, { waitUntil: 'networkidle2', timeout: 30000, // 30 second timeout ...options }); } catch (error) { // Fallback to domcontentloaded if networkidle2 times out if (error.message.includes('timeout') || error.message.includes('Navigation timeout')) { await page.goto(url, { waitUntil: 'domcontentloaded', timeout: 30000, ...options }); } else { throw error; } } } /** * Process a single page - navigate, wait, and prepare for screenshot * @param {Object} browser - Browser instance * @param {string} url - Page URL * @param {Object} viewport - Viewport configuration * @param {Function|null} beforeScreenshot - Optional hook to run before screenshot * @returns {Promise<Object>} Page instance ready for screenshot */ export async function preparePageForScreenshot(browser, url, viewport, beforeScreenshot = null) { let page = await createPage(browser); // Set viewport await setViewport(page, viewport); // Navigate to page (waits for networkidle2) await navigateToUrl(page, url); // Run custom interaction hook if provided if (beforeScreenshot && typeof beforeScreenshot === 'function') { await beforeScreenshot(page); } return page; } /** * Close a page * @param {Object} page - Page instance to close * @returns {Promise<void>} */ export async function closePage(page) { if (page) { await page.close(); } }