Global configuration options for controlling timeout, polling behavior, and other matcher settings across all expect-puppeteer operations.
Configures global default options that apply to all matchers unless overridden.
import type { FrameWaitForFunctionOptions } from "puppeteer";
/**
* Set global default options for all matchers
* @param options - Configuration options object
*/
function setDefaultOptions(options: Options): void;
interface Options extends FrameWaitForFunctionOptions {
/** Maximum time to wait in milliseconds (default: 500) */
timeout?: number;
/** Polling interval ("raf", "mutation", or milliseconds) */
polling?: string | number;
/** Whether to traverse shadow DOM roots (default: false) */
traverseShadowRoots?: boolean;
}Usage Examples:
import { setDefaultOptions } from "expect-puppeteer";
// Set longer timeout for slow applications
setDefaultOptions({ timeout: 2000 });
// Use faster polling for responsive applications
setDefaultOptions({
timeout: 1000,
polling: 100
});
// Enable shadow DOM traversal globally
setDefaultOptions({
timeout: 1000,
traverseShadowRoots: true
});Retrieves the current global default options, including any automatic adjustments.
/**
* Get current default options (includes slowMo calculation)
* @returns Current default options object
*/
function getDefaultOptions(): Options;Usage Examples:
import { getDefaultOptions } from "expect-puppeteer";
// Check current settings
const currentOptions = getDefaultOptions();
console.log(`Current timeout: ${currentOptions.timeout}ms`);
console.log(`Current polling: ${currentOptions.polling}`);
// Temporarily modify and restore
const originalOptions = getDefaultOptions();
setDefaultOptions({ timeout: 5000 });
// ... run tests requiring longer timeout ...
setDefaultOptions(originalOptions); // Restore original settingsControls how long matchers wait for conditions to be met.
interface TimeoutOptions {
/** Maximum time to wait in milliseconds (default: 500) */
timeout?: number;
}Default timeout: 500ms
Automatic adjustment: Timeout is automatically increased when slowMo is configured in Puppeteer settings
Usage Examples:
// Short timeout for fast operations
setDefaultOptions({ timeout: 200 });
// Longer timeout for slow operations
setDefaultOptions({ timeout: 5000 });
// Zero timeout (immediate check, no waiting)
setDefaultOptions({ timeout: 0 });Controls how frequently matchers check conditions while waiting.
interface PollingOptions {
/** Polling interval ("raf", "mutation", or milliseconds) */
polling?: string | number;
}Polling modes:
"raf" (default): Uses requestAnimationFrame - best for visual changes"mutation": Uses MutationObserver - best for DOM changesnumber: Polling interval in milliseconds - for custom timingUsage Examples:
// Use mutation observer for DOM changes
setDefaultOptions({ polling: "mutation" });
// Custom polling interval
setDefaultOptions({ polling: 250 }); // Check every 250ms
// Fast polling for responsive apps
setDefaultOptions({ polling: 50 });Controls whether matchers traverse shadow DOM boundaries when searching for elements or text.
interface ShadowDOMOptions {
/** Whether to traverse shadow DOM roots (default: false) */
traverseShadowRoots?: boolean;
}Usage Examples:
// Enable shadow DOM traversal globally
setDefaultOptions({ traverseShadowRoots: true });
// Per-matcher override (still uses global for other options)
await expect(page).toMatchElement("custom-element", {
traverseShadowRoots: false // Override global setting
});expect-puppeteer automatically integrates with Puppeteer's slowMo configuration:
// Puppeteer configuration with slowMo
const browser = await puppeteer.launch({
slowMo: 100 // 100ms delay between actions
});
// expect-puppeteer automatically adjusts timeout:
// finalTimeout = configuredTimeout + (slowMo * 10)Global configuration integration:
// In jest-puppeteer.config.js or similar
module.exports = {
launch: {
slowMo: 50 // expect-puppeteer will add 500ms to all timeouts
}
};Individual matchers can override global defaults:
// Global settings
setDefaultOptions({ timeout: 1000, polling: "raf" });
// Per-matcher overrides
await expect(page).toMatchElement("button", {
timeout: 5000, // Override global timeout
polling: "mutation" // Override global polling
});
await expect(page).toMatchTextContent("Loading...", {
timeout: 500 // Use shorter timeout for this check
});Configure different settings for different environments:
import { setDefaultOptions } from "expect-puppeteer";
// Configure based on environment
if (process.env.CI) {
// Longer timeouts in CI environment
setDefaultOptions({
timeout: 3000,
polling: 200
});
} else {
// Faster settings for local development
setDefaultOptions({
timeout: 1000,
polling: 100
});
}Configure expect-puppeteer in your Jest setup:
// In setupFilesAfterEnv file
import { setDefaultOptions } from "expect-puppeteer";
// Configure before tests run
setDefaultOptions({
timeout: 2000,
polling: "mutation",
traverseShadowRoots: false
});{
"jest": {
"setupFilesAfterEnv": [
"expect-puppeteer/setup"
]
}
}Or with custom configuration:
{
"jest": {
"setupFilesAfterEnv": [
"<rootDir>/jest.setup.js"
]
}
}// jest.setup.js
require("expect-puppeteer");
const { setDefaultOptions } = require("expect-puppeteer");
setDefaultOptions({ timeout: 1500 });// Base timeout for most operations
setDefaultOptions({ timeout: 1000 });
// Use longer timeouts for specific slow operations
await expect(page).toMatchElement(".slow-loading-chart", {
timeout: 10000
});
// Use shorter timeouts for quick checks
await expect(page).not.toMatchElement(".error", {
timeout: 100
});// Use "mutation" for DOM-heavy applications
setDefaultOptions({ polling: "mutation" });
// Use "raf" for animation-heavy applications
setDefaultOptions({ polling: "raf" });
// Use numeric polling for specific timing needs
setDefaultOptions({ polling: 200 });// Test configuration changes don't break existing tests
describe("Configuration", () => {
const originalOptions = getDefaultOptions();
afterEach(() => {
setDefaultOptions(originalOptions); // Restore after each test
});
it("works with longer timeout", () => {
setDefaultOptions({ timeout: 5000 });
// ... test with longer timeout
});
});Timeouts too short:
// Symptoms: Tests fail with "waiting for function failed: timeout"
// Solution: Increase timeout
setDefaultOptions({ timeout: 2000 });Polling too aggressive:
// Symptoms: High CPU usage, browser performance issues
// Solution: Use less aggressive polling
setDefaultOptions({ polling: 500 }); // Check every 500ms instead of every frameShadow DOM elements not found:
// Symptoms: Elements in shadow DOM not detected
// Solution: Enable shadow DOM traversal
setDefaultOptions({ traverseShadowRoots: true });