browser (experimental)
type BrowserModeConfig = {
enabled?: boolean;
provider: 'playwright';
browser?: 'chromium' | 'firefox' | 'webkit';
headless?: boolean;
port?: number;
strictPort?: boolean;
};
const defaultBrowser = {
enabled: false,
provider: 'playwright',
browser: 'chromium',
headless: true, // CI environment; false for local development
port: undefined, // Random available port
strictPort: false,
};
Browser Mode configuration. When enabled, tests run in a real browser instead of the Node.js environment.
Options
enabled
- Type:
boolean
- Default:
false
Enable Browser Mode.
rstest.config.ts
import { defineConfig } from '@rstest/core';
export default defineConfig({
browser: {
enabled: true,
provider: 'playwright',
},
});
Tip
Enabling Browser Mode requires installing the @rstest/browser package and Playwright browsers.
npm add @rstest/browser -D
npx playwright install chromium
provider
- Type:
'playwright'
- Default:
'playwright'
Browser driver provider. Currently only Playwright is supported.
rstest.config.ts
import { defineConfig } from '@rstest/core';
export default defineConfig({
browser: {
enabled: true,
provider: 'playwright',
},
});
browser
- Type:
'chromium' | 'firefox' | 'webkit'
- Default:
'chromium'
The browser type to use for testing.
chromium - Google Chrome, Microsoft Edge
firefox - Mozilla Firefox
webkit - Safari
rstest.config.ts
import { defineConfig } from '@rstest/core';
export default defineConfig({
browser: {
enabled: true,
provider: 'playwright',
browser: 'firefox',
},
});
You need to install the corresponding browser before use:
# Install chromium
npx playwright install chromium
# Install Firefox
npx playwright install firefox
# Install WebKit
npx playwright install webkit
# Install all browsers
npx playwright install
headless
- Type:
boolean
- Default:
true in CI environments, false for local development
Whether to run the browser in headless mode (without UI).
import { defineConfig } from '@rstest/core';
export default defineConfig({
browser: {
enabled: true,
provider: 'playwright',
headless: true,
},
});
# .github/workflows/test.yml
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- run: npm install
- run: npx playwright install chromium
- run: npm test
During local development, setting headless: false shows the browser window for easier debugging.
Dynamic Configuration Based on Environment
If you want headed mode for local debugging and headless in CI, control it with environment variables:
rstest.config.ts
import { defineConfig } from '@rstest/core';
export default defineConfig({
browser: {
enabled: true,
provider: 'playwright',
headless: process.env.CI === 'true',
},
});
port
- Type:
number
- Default:
undefined (automatically selects an available port)
The port number for the Browser Mode Dev Server.
rstest.config.ts
import { defineConfig } from '@rstest/core';
export default defineConfig({
browser: {
enabled: true,
provider: 'playwright',
port: 5173,
},
});
If you set port and the port is already in use, the behavior is controlled by strictPort: when strictPort: true, Rstest throws an error and exits; when strictPort: false, it falls back to another available port. If port is not specified, an available port is always selected automatically.
strictPort
- Type:
boolean
- Default:
false
When port is specified, whether the port must be available:
true: throw an error and exit if the port is in use
false: fall back to another available port if the port is in use
rstest.config.ts
import { defineConfig } from '@rstest/core';
export default defineConfig({
browser: {
enabled: true,
provider: 'playwright',
port: 5173,
strictPort: true,
},
});
Multi-Browser Testing
Use projects configuration to run tests in multiple browsers simultaneously:
rstest.config.ts
import { defineConfig } from '@rstest/core';
export default defineConfig({
projects: [
{
name: 'chromium',
browser: {
enabled: true,
provider: 'playwright',
browser: 'chromium',
},
},
{
name: 'firefox',
browser: {
enabled: true,
provider: 'playwright',
browser: 'firefox',
},
},
{
name: 'webkit',
browser: {
enabled: true,
provider: 'playwright',
browser: 'webkit',
},
},
],
});
Mixing with node tests
You can configure both browser tests and Node.js tests together:
rstest.config.ts
import { defineConfig } from '@rstest/core';
export default defineConfig({
projects: [
{
name: 'browser',
include: ['src/**/*.browser.test.ts'],
browser: {
enabled: true,
provider: 'playwright',
},
},
{
name: 'node',
include: ['src/**/*.node.test.ts'],
testEnvironment: 'node',
},
{
name: 'jsdom',
include: ['src/**/*.test.ts'],
exclude: ['src/**/*.browser.test.ts', 'src/**/*.node.test.ts'],
testEnvironment: 'jsdom',
},
],
});