Set up Vitest browser mode with Playwright or WebDriverIO providers, use page and userEvent APIs, test components. Use when testing browser-specific code or UI components.
Sets up Vitest browser mode with Playwright or WebDriverIO providers for testing browser-specific code and UI components. Use when you need to test components with real browser APIs, user interactions, or visual regressions.
/plugin marketplace add djankies/claude-configs/plugin install vitest-4@claude-configsThis skill is limited to using the following tools:
references/browser-apis.mdreferences/provider-setup.mdreferences/testing-patterns.mdThis skill teaches Vitest browser mode setup, configuration, and testing patterns.
Browser mode runs tests in actual browsers instead of Node.js environments, enabling:
Vitest 4.x requires separate provider packages:
npm install -D vitest @vitest/browser-playwright
Use when: Need Chromium, Firefox, and WebKit support with modern APIs
npm install -D vitest @vitest/browser-webdriverio
Use when: Need broader browser compatibility or existing WebDriverIO infrastructure
npm install -D vitest @vitest/browser-preview
Use when: Local development preview (not recommended for CI)
For detailed provider setup with all options, see references/provider-setup.md
import { defineConfig } from 'vitest/config';
import { playwright } from '@vitest/browser-playwright';
export default defineConfig({
test: {
browser: {
enabled: true,
provider: playwright(),
instances: [{ browser: 'chromium' }],
headless: true,
},
},
});
instances: [
{ browser: 'chromium' },
{ browser: 'firefox' },
{ browser: 'webkit' },
]
Correct (Vitest 4.x):
import { page, userEvent } from 'vitest/browser';
Incorrect (Vitest 3.x):
import { page, userEvent } from '@vitest/browser/context';
import { page } from 'vitest/browser';
const button = page.getByRole('button', { name: /submit/i });
const input = page.getByLabelText(/username/i);
const heading = page.getByRole('heading');
const text = page.getByText('Welcome');
import { userEvent } from 'vitest/browser';
await userEvent.fill(input, 'Bob');
await userEvent.click(checkbox);
await userEvent.selectOptions(select, 'value');
await userEvent.hover(element);
import { expect } from 'vitest';
await expect.element(element).toBeInTheDocument();
await expect.element(element).toBeVisible();
await expect.element(element).toBeEnabled();
await expect.element(element).toHaveTextContent('text');
For complete browser API reference, see references/browser-apis.md
import { render } from 'vitest-browser-react';
test('submits form', async () => {
const screen = render(<LoginForm />);
await screen.getByLabelText(/email/i).fill('user@example.com');
await screen.getByRole('button').click();
});
For testing React components in browser mode with Vitest, use the testing-components skill for patterns integrating with @testing-library/react and React 19 APIs.
import { render } from 'vitest-browser-vue';
test('component renders', async () => {
const screen = render(Component, { props: { name: 'Alice' } });
await expect.element(screen.getByText('Hi, my name is Alice')).toBeInTheDocument();
});
test('form submission', async () => {
await userEvent.fill(page.getByLabelText(/email/i), 'user@example.com');
await userEvent.fill(page.getByLabelText(/password/i), 'password123');
await userEvent.click(page.getByRole('button', { name: /submit/i }));
await expect.element(page.getByText('Success')).toBeInTheDocument();
});
For browser-mode testing of Server Action forms, use the securing-server-actions skill for patterns on validation, authentication, and error handling in server actions.
test('navigation', async () => {
await userEvent.click(page.getByRole('link', { name: /about/i }));
await expect.element(page.getByRole('heading', { name: /about us/i })).toBeInTheDocument();
});
test('modal dialog', async () => {
await userEvent.click(page.getByRole('button', { name: /open/i }));
const dialog = page.getByRole('dialog');
await expect.element(dialog).toBeVisible();
});
For complete testing patterns including forms, navigation, modals, and more, see references/testing-patterns.md
test('visual regression', async () => {
await page.goto('http://localhost:3000');
const main = page.getByRole('main');
await expect(main).toMatchScreenshot();
});
vitest --browser.enabled
vitest --browser.name chromium
vitest --browser.headless=false
vitest --project browser
vitest --browser.headless=false
vitest --browser.trace on
View traces in Playwright Trace Viewer.
browser: {
headless: process.env.CI ? true : false,
}
browser: {
trace: 'retain-on-failure',
}
instances: [
{
browser: 'chromium',
context: {
viewport: { width: 1280, height: 720 },
},
},
]
vitest/browser, not @vitest/browser/context@vitest/browser-playwright or @vitest/browser-webdriverioinstances: [{ browser: 'chromium' }], not name: 'chromium'await user eventsexpect.element() for element assertionsOld config:
browser: {
enabled: true,
name: 'chromium',
provider: 'playwright',
}
New config:
import { playwright } from '@vitest/browser-playwright';
browser: {
enabled: true,
provider: playwright(),
instances: [{ browser: 'chromium' }],
}
Old imports:
import { page } from '@vitest/browser/context';
New imports:
import { page } from 'vitest/browser';
For detailed browser mode documentation:
For configuration patterns, see @vitest-4/skills/configuring-vitest-4
For migration guide, see @vitest-4/skills/migrating-to-vitest-4
For complete API reference, see @vitest-4/knowledge/vitest-4-comprehensive.md
Master authentication and authorization patterns including JWT, OAuth2, session management, and RBAC to build secure, scalable access control systems. Use when implementing auth systems, securing APIs, or debugging security issues.