From 1b208b4e69494b8da06428447a44359456f96ca6 Mon Sep 17 00:00:00 2001 From: Vladimir Sheremet Date: Tue, 24 Feb 2026 14:51:40 +0100 Subject: [PATCH 1/2] fix(browser): make sure userEvent actions support `ensureAwaited` --- packages/browser/src/client/tester/context.ts | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/packages/browser/src/client/tester/context.ts b/packages/browser/src/client/tester/context.ts index 17dfbe30ce50..b09742acdc49 100644 --- a/packages/browser/src/client/tester/context.ts +++ b/packages/browser/src/client/tester/context.ts @@ -51,10 +51,10 @@ export function createUserEvent(__tl_user_event_base__?: TestingLibraryUserEvent setup() { return createUserEvent() }, - async cleanup() { + cleanup() { // avoid cleanup rpc call if there is nothing to cleanup if (!keyboard.unreleased.length) { - return + return Promise.resolve() } return ensureAwaited(async (error) => { await triggerCommand('__vitest_cleanup', [keyboard], error) @@ -100,7 +100,7 @@ export function createUserEvent(__tl_user_event_base__?: TestingLibraryUserEvent }, // testing-library user-event - async type(element, text, options) { + type(element, text, options) { return ensureAwaited(async (error) => { const selector = await convertToSelector(element, options) const { unreleased } = await triggerCommand<{ unreleased: string[] }>( @@ -118,7 +118,7 @@ export function createUserEvent(__tl_user_event_base__?: TestingLibraryUserEvent tab(options = {}) { return ensureAwaited(error => triggerCommand('__vitest_tab', [options], error)) }, - async keyboard(text) { + keyboard(text) { return ensureAwaited(async (error) => { const { unreleased } = await triggerCommand<{ unreleased: string[] }>( '__vitest_keyboard', @@ -128,14 +128,14 @@ export function createUserEvent(__tl_user_event_base__?: TestingLibraryUserEvent keyboard.unreleased = unreleased }) }, - async copy() { - await userEvent.keyboard(`{${modifier}>}{c}{/${modifier}}`) + copy() { + return userEvent.keyboard(`{${modifier}>}{c}{/${modifier}}`) }, - async cut() { - await userEvent.keyboard(`{${modifier}>}{x}{/${modifier}}`) + cut() { + return userEvent.keyboard(`{${modifier}>}{x}{/${modifier}}`) }, - async paste() { - await userEvent.keyboard(`{${modifier}>}{v}{/${modifier}}`) + paste() { + return userEvent.keyboard(`{${modifier}>}{v}{/${modifier}}`) }, } return userEvent From 0c12dec77a4396e907152fb3c83d19f653a88555 Mon Sep 17 00:00:00 2001 From: Vladimir Sheremet Date: Tue, 24 Feb 2026 15:20:21 +0100 Subject: [PATCH 2/2] test: add more tests for different methods --- .../src/client/tester/locators/index.ts | 2 +- test/browser/fixtures/failing/failing.test.ts | 16 +++++++++++++++- test/browser/specs/runner.test.ts | 18 ++++++++++++++++-- 3 files changed, 32 insertions(+), 4 deletions(-) diff --git a/packages/browser/src/client/tester/locators/index.ts b/packages/browser/src/client/tester/locators/index.ts index 1fd0cd9ad732..a80428c18693 100644 --- a/packages/browser/src/client/tester/locators/index.ts +++ b/packages/browser/src/client/tester/locators/index.ts @@ -135,7 +135,7 @@ export abstract class Locator { return this.triggerCommand('__vitest_fill', this.selector, text, options) } - public async upload(files: string | string[] | File | File[], options?: UserEventUploadOptions): Promise { + public upload(files: string | string[] | File | File[], options?: UserEventUploadOptions): Promise { return ensureAwaited(async (error) => { const filesPromise = (Array.isArray(files) ? files : [files]).map(async (file) => { if (typeof file === 'string') { diff --git a/test/browser/fixtures/failing/failing.test.ts b/test/browser/fixtures/failing/failing.test.ts index 9f3e18d75455..8190c04d5146 100644 --- a/test/browser/fixtures/failing/failing.test.ts +++ b/test/browser/fixtures/failing/failing.test.ts @@ -1,4 +1,4 @@ -import { page } from 'vitest/browser' +import { page, userEvent } from 'vitest/browser' import { index } from '@vitest/bundled-lib' import { expect, it } from 'vitest' import { throwError } from './src/error' @@ -19,6 +19,20 @@ it('several locator methods are not awaited', () => { page.getByRole('button').dblClick() page.getByRole('button').click() page.getByRole('button').tripleClick() + userEvent.type(page.getByRole('textbox'), '123') + userEvent.keyboard('123') + userEvent.copy() + userEvent.cut() + userEvent.paste() + userEvent.tab() + userEvent.dragAndDrop(page.getByRole('button'), page.getByRole('button')) + userEvent.fill(page.getByRole('textbox'), '123') + userEvent.upload(page.getByRole('textbox'), './file.js') + userEvent.unhover(page.getByRole('button')) + userEvent.hover(page.getByRole('button')) + userEvent.clear(page.getByRole('button')) + userEvent.selectOptions(page.getByRole('button'), '123') + userEvent.wheel(page.getByRole('button'), { direction: 'down' }) }) it('correctly prints error from a bundled file', () => { diff --git a/test/browser/specs/runner.test.ts b/test/browser/specs/runner.test.ts index d34e90c551bf..b267b7b08a8b 100644 --- a/test/browser/specs/runner.test.ts +++ b/test/browser/specs/runner.test.ts @@ -208,7 +208,7 @@ error with a stack }) test(`stack trace points to correct file in every browser when failed`, async () => { - expect.assertions(15) + expect.assertions(29) const { stderr } = await runBrowserTests({ root: './fixtures/failing', reporters: [ @@ -252,12 +252,26 @@ test(`stack trace points to correct file in every browser when failed`, async () expect(stderr).toMatch(/failing.test.ts:19:(27|36)/) expect(stderr).toMatch(/failing.test.ts:20:(27|33)/) expect(stderr).toMatch(/failing.test.ts:21:(27|39)/) + expect(stderr).toMatch(/failing.test.ts:22:(12|17)/) + expect(stderr).toMatch(/failing.test.ts:23:(12|21)/) + expect(stderr).toMatch(/failing.test.ts:24:(12|17)/) + expect(stderr).toMatch(/failing.test.ts:25:(12|16)/) + expect(stderr).toMatch(/failing.test.ts:26:(12|18)/) + expect(stderr).toMatch(/failing.test.ts:27:(12|16)/) + expect(stderr).toMatch(/failing.test.ts:28:(12|24)/) + expect(stderr).toMatch(/failing.test.ts:29:(12|17)/) + expect(stderr).toMatch(/failing.test.ts:30:(12|19)/) + expect(stderr).toMatch(/failing.test.ts:31:(12|20)/) + expect(stderr).toMatch(/failing.test.ts:32:(12|18)/) + expect(stderr).toMatch(/failing.test.ts:33:(12|18)/) + expect(stderr).toMatch(/failing.test.ts:34:(12|26)/) + expect(stderr).toMatch(/failing.test.ts:35:(12|18)/) expect(stderr).toMatch(/bundled-lib\/src\/b.js:2:(9|19)/) expect(stderr).toMatch(/bundled-lib\/src\/index.js:5:(16|18)/) // index() is called from a bundled file - expect(stderr).toMatch(/failing.test.ts:25:(2|8)/) + expect(stderr).toMatch(/failing.test.ts:39:(2|8)/) }) test('user-event', async () => {