vitest-dev/vitest · error · Error
The "preview" provider doesn't support…
Error message
The "preview" provider doesn't support 'userEvent.dragAndDrop'
What it means
Vitest's built-in preview user-event provider (the default, lightweight DOM-event-based provider) deliberately omits dragAndDrop because true drag-and-drop requires richer input simulation than the preview provider offers. The dragAndDrop method is stubbed to throw immediately so users discover the limitation rather than get silent no-ops. To use dragAndDrop you must switch to the Playwright or WebDriverIO browser provider.
Solutions
- Set tester.provider to 'playwright' (or 'webdriverio') in vitest.config under test.browser, and install @vitest/browser-provider-playwright.
- Replace the dragAndDrop call with a manual sequence of pointer events via dispatchEvent on the preview provider, if you must stay on preview.
- Confirm the provider is actually applied by logging getBrowserState().provider in a test.
Example fix
// before (vitest.config.ts)
export default defineConfig({ test: { browser: { enabled: true, provider: 'preview' } } })
// after
export default defineConfig({ test: { browser: { enabled: true, provider: 'playwright' } } }) Defensive patterns
Strategy: validation
Validate before calling
const provider = getBrowserState().provider
if (provider === 'preview' && typeof page.userEvent.dragAndDrop === 'function') {
// will throw — pick a different approach
await dispatchDragSequence(source, target)
} else {
await page.userEvent.dragAndDrop(source, target)
} Type guard
function supportsDragAndDrop(): boolean {
return getBrowserState().provider !== 'preview'
} Prevention
- Pin test.browser.provider to 'playwright' or 'webdriverio' when tests rely on dragAndDrop.
- Document provider capabilities in the test README so contributors do not assume preview supports all actions.
- Run a smoke test that lists getBrowserState().provider in CI logs.
When it happens
Trigger: Calling await page.userEvent.dragAndDrop(source, target) (or expect.dragAndDrop) while browser.provider is 'preview' (the default). Running browser tests with @vitest/browser without configuring provider: 'playwright' or provider: 'webdriverio'.
Common situations: Default Vitest browser config that does not set a provider; copying example code from docs that assumes a full provider; CI where only the preview provider is installed; upgrading from a version where the call silently failed.
Related errors
- Method "elementLocator" is not supported by the
- Method "frameLocator" is not supported by the
- Method "getByAltText" is not supported by the
- Method "getByLabelText" is not supported by the
- Method "getByPlaceholder" is not supported by the
AI-assisted analysis of vitest-dev/vitest@1fa9837ec2 (2026-08-11).
Data as JSON: /api/errors/6c9a9d1f1f8b05a2.
Report an issue: GitHub.
Appendix: source
Thrown at packages/browser/src/client/tester/context.ts:225
basename: string
mime: string
}>('__vitest_fileInfo', [file, 'base64'])
const fileInstance = fetch(`data:${mime};base64,${base64}`)
.then(r => r.blob())
.then(blob => new File([blob], basename, { type: mime }))
return fileInstance
})
const uploadFiles = await Promise.all(uploadPromise)
return userEvent.upload(toElement(element) as HTMLElement, uploadFiles)
},
async fill(element, text) {
await userEvent.clear(toElement(element))
return userEvent.type(toElement(element), text)
},
async dragAndDrop() {
throw new Error(`The "preview" provider doesn't support 'userEvent.dragAndDrop'`)
},
async type(element, text, options) {
await userEvent.type(toElement(element), text, options)
},
async tab(options) {
await userEvent.tab(options)
},
async keyboard(text: string) {
await userEvent.keyboard(text)
},
async copy() {
clipboardData = await userEvent.copy()
},
async cut() {
clipboardData = await userEvent.cut()
},View on GitHub (pinned to 1fa9837ec2)