k6 Browser Test Context Error Fix
In this tutorial, you'll learn about k6 browser test context error fix. We cover key concepts, practical examples, and best practices.
Your k6 browser test throws Cannot read property 'goto' of undefined — the page variable is not initialized, the browser module is not imported correctly, or the test runs in an environment where the browser module is unavailable.
The Problem
import { browser } from 'k6/experimental/browser';
export default function () {
// WRONG: page is not initialized
page.goto('https://example.com');
page.screenshot({ path: 'screenshot.png' });
}
ERRO[0000] ReferenceError: page is not defined
The page object must be created from the browser context before use.
Step-by-Step Fix
1. Initialize page from browser
import { browser } from 'k6/experimental/browser';
export const options = {
scenarios: {
browser_test: {
executor: 'constant-vus',
vus: 1,
duration: '10s',
options: {
browser: {
type: 'chromium',
},
},
},
},
};
export default function () {
const context = browser.newContext();
const page = context.newPage();
page.goto('https://example.com');
page.screenshot({ path: `screenshot-${__VU}.png` });
page.close();
context.close();
}
2. Use page objects directly
import { browser } from 'k6/experimental/browser';
export default function () {
const page = browser.newPage();
page.goto('https://example.com', { waitUntil: 'networkidle' });
const title = page.title();
console.log(`Page title: ${title}`);
page.close();
}
3. Interact with page elements
import { browser } from 'k6/experimental/browser';
import { check } from 'k6';
export default function () {
const page = browser.newPage();
page.goto('https://example.com/login');
page.locator('#username').type('testuser');
page.locator('#password').type('password123');
page.locator('button[type="submit"]').click();
page.waitForNavigation();
check(page, {
'logged in': (p) => p.locator('.welcome').textContent().includes('Welcome'),
});
page.close();
}
4. Set viewport and headers
import { browser } from 'k6/experimental/browser';
export default function () {
const context = browser.newContext({
viewport: { width: 1920, height: 1080 },
userAgent: 'k6-browser-test/1.0',
locale: 'en-US',
});
const page = context.newPage();
page.goto('https://example.com');
const dimensions = page.evaluate(() => ({
width: window.innerWidth,
height: window.innerHeight,
}));
console.log(`Viewport: ${dimensions.width}x${dimensions.height}`);
page.close();
context.close();
}
5. Measure browser performance metrics
import { browser } from 'k6/experimental/browser';
export default function () {
const page = browser.newPage();
page.goto('https://example.com', { waitUntil: 'load' });
const metrics = page.metrics();
console.log(`First paint: ${metrics.firstPaint}ms`);
console.log(`DOM content loaded: ${metrics.domContentLoaded}ms`);
page.close();
}
Expected output:
✓ logged in
browser_http_req_duration...: avg=345ms p(95)=890ms
browser_first_paint.........: avg=210ms p(95)=450ms
Prevention Tips
- Always create
pagewithbrowser.newPage()orcontext.newPage() - Close pages and contexts after use to free resources
- Use
waitUntil: 'networkidle'for SPAs that load dynamically - Keep VU count low (1-5) for browser tests — each VU opens a browser instance
- Use
browser.newContext()for isolated sessions with custom settings
Common Mistakes with browser test
- Using
returnto exit a function early instead of wrapping a pure value in the monad - Mixing let bindings with <- bindings in do notation, producing type errors
- Overlapping type class instances that cause GHC to reject the program with ambiguous dispatch errors
These mistakes appear frequently in real-world K6 code. DodaTech's contributors have identified these patterns through analysis of open-source projects and production systems.
Practice Exercise
Write a pure function that safely divides two integers using Maybe, then test it with edge cases like division by zero and negative numbers.
This exercise reinforces the concepts covered in this guide. Try implementing it before checking online solutions.
FAQ
Built by the developers of DodaTech
Doda Browser, DodaZIP & Durga Antivirus Pro