/** * BackstopJS onReady hook * Executes after page is ready but before screenshot is captured */ module.exports = async (page, scenario, vp) => { console.log('BackstopJS: onReady hook - ' + scenario.label); // Wait for the ready selector if specified if (scenario.readySelector) { try { await page.waitForSelector(scenario.readySelector, { timeout: 5000 }); console.log('Ready selector found: ' + scenario.readySelector); } catch (error) { console.warn('Ready selector not found: ' + scenario.readySelector); } } // Wait for any dynamic content to load await page.waitForTimeout(scenario.delay || 500); // Hide dynamic elements that might vary between Angular and React const hideSelectors = scenario.hideSelectors || []; for (const selector of hideSelectors) { try { await page.evaluate((sel) => { const elements = document.querySelectorAll(sel); elements.forEach(el => { el.style.visibility = 'hidden'; }); }, selector); } catch (error) { console.warn('Failed to hide selector: ' + selector); } } // Remove elements that shouldn't be captured const removeSelectors = scenario.removeSelectors || []; for (const selector of removeSelectors) { try { await page.evaluate((sel) => { const elements = document.querySelectorAll(sel); elements.forEach(el => { el.remove(); }); }, selector); } catch (error) { console.warn('Failed to remove selector: ' + selector); } } // Hover over element if specified if (scenario.hoverSelector) { try { await page.hover(scenario.hoverSelector); await page.waitForTimeout(200); } catch (error) { console.warn('Failed to hover on selector: ' + scenario.hoverSelector); } } // Click element if specified if (scenario.clickSelector) { try { await page.click(scenario.clickSelector); await page.waitForTimeout(scenario.postInteractionWait || 500); } catch (error) { console.warn('Failed to click selector: ' + scenario.clickSelector); } } };