ChromeE2EApi
createChromeE2EApi(options?) creates a device with Chrome-specific extras: network interception, cookies, performance metrics, and mobile emulation.
const device = createChromeE2EApi({
slowMo: 0, // per-keystroke typing delay (ms)
viewport: { width: 1280, height: 720 },
});
It has every base device method, plus the following.
Network
interceptNetwork(rules)
Blocks or mocks requests by URL pattern. Calling it again replaces the previous rules.
// Block requests (shorthand: array of patterns)
await device.interceptNetwork(['analytics.google.com', 'tracker.js']);
// Mock an API response
await device.interceptNetwork([
{
pattern: '/api/users',
action: 'mock',
response: {
status: 200,
contentType: 'application/json',
body: { users: [{ id: 1, name: 'Test User' }] },
},
},
{ pattern: 'ads.example.com', action: 'block' },
]);
Requests matching no rule continue normally.
waitForResponse(urlPattern, timeout?)
Waits for a network response whose URL contains urlPattern and returns it.
const response = await device.waitForResponse('/api/orders');
expect(response.status()).toBe(200);
waitForRequest(urlPattern, timeout?)
Same, for outgoing requests.
Cookies
await device.addCookie({ name: 'session', value: 'abc123', domain: 'your-app.com' });
const cookies = await device.getCookies();
await device.clearCookies();
Mobile
await device.setMobileViewport(); // 375×667, isMobile: true
await device.setMobileViewport(414, 896); // custom size
await device.simulateTouch(); // enable touch events via CDP
await device.tap('menu-button'); // touch tap
await device.emulateDevice(devices['iPhone 13']); // full Puppeteer device profile
Diagnostics
getPerformanceMetrics()
Returns Chrome metrics (JSHeapUsedSize, firstContentfulPaint, and the rest of page.metrics()).
const metrics = await device.getPerformanceMetrics();
expect(metrics.JSHeapUsedSize).toBeLessThan(50 * 1024 * 1024);
debug(message) / log(level, message)
Writes a message into the browser's console — useful for correlating test steps with app logs when debugging headed.
screenshot(options?)
Same as the base device, with safe defaults: PNG type, viewport-sized. Pass { type: 'jpeg', quality: 80 } for compressed captures or { fullPage: true } for the whole page.