From a5a7d24d6d5ea7cf8ea57316d65c2e8a0a90419b Mon Sep 17 00:00:00 2001 From: Vladimir Sheremet Date: Tue, 21 Oct 2025 18:46:52 +0200 Subject: [PATCH 1/4] fix(browser): support sync not.toBeInTheDocument() --- .../browser/src/client/tester/expect/toBeInTheDocument.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/browser/src/client/tester/expect/toBeInTheDocument.ts b/packages/browser/src/client/tester/expect/toBeInTheDocument.ts index a913622e6bf4..4e607083b913 100644 --- a/packages/browser/src/client/tester/expect/toBeInTheDocument.ts +++ b/packages/browser/src/client/tester/expect/toBeInTheDocument.ts @@ -15,7 +15,7 @@ import type { ExpectationResult, MatcherState } from '@vitest/expect' import type { Locator } from '../locators' -import { getElementFromUserInput } from './utils' +import { queryElementFromUserInput } from './utils' export default function toBeInTheDocument( this: MatcherState, @@ -24,7 +24,7 @@ export default function toBeInTheDocument( let htmlElement: null | HTMLElement | SVGElement = null if (actual !== null || !this.isNot) { - htmlElement = getElementFromUserInput(actual, toBeInTheDocument, this) + htmlElement = queryElementFromUserInput(actual, toBeInTheDocument, this) } const pass From 7e290369eb0fe70573a6eed5eaca8163aa88ada6 Mon Sep 17 00:00:00 2001 From: Vladimir Sheremet Date: Tue, 21 Oct 2025 18:47:25 +0200 Subject: [PATCH 2/4] chore: utils --- .../browser/src/client/tester/expect/utils.ts | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/packages/browser/src/client/tester/expect/utils.ts b/packages/browser/src/client/tester/expect/utils.ts index 2eaa99e95d08..950c85cd0aa6 100644 --- a/packages/browser/src/client/tester/expect/utils.ts +++ b/packages/browser/src/client/tester/expect/utils.ts @@ -16,6 +16,23 @@ import type { MatcherState } from '@vitest/expect' import { Locator } from '../locators' +export function queryElementFromUserInput( + elementOrLocator: Element | Locator | null, + // TODO: minifier doesn't keep names, so we need to update this + matcherFn: (...args: any) => any, + context: MatcherState, +): HTMLElement | SVGElement | null { + if (elementOrLocator instanceof Locator) { + elementOrLocator = elementOrLocator.query() + } + + if (elementOrLocator == null) { + return null + } + + return getElementFromUserInput(elementOrLocator, matcherFn, context) +} + export function getElementFromUserInput( elementOrLocator: Element | Locator | null, // TODO: minifier doesn't keep names, so we need to update this From 8931bc2e4b6dbefd37f40929b87afffd6d33563b Mon Sep 17 00:00:00 2001 From: Vladimir Sheremet Date: Tue, 21 Oct 2025 18:48:05 +0200 Subject: [PATCH 3/4] test: add a test --- test/browser/fixtures/expect-dom/toBeInTheDocument.test.ts | 3 +++ 1 file changed, 3 insertions(+) diff --git a/test/browser/fixtures/expect-dom/toBeInTheDocument.test.ts b/test/browser/fixtures/expect-dom/toBeInTheDocument.test.ts index a8e58365948c..bbb9c442f94c 100644 --- a/test/browser/fixtures/expect-dom/toBeInTheDocument.test.ts +++ b/test/browser/fixtures/expect-dom/toBeInTheDocument.test.ts @@ -1,4 +1,5 @@ import { expect, test } from 'vitest' +import { page } from 'vitest/browser' test('.toBeInTheDocument', () => { const window = document.defaultView @@ -35,6 +36,8 @@ test('.toBeInTheDocument', () => { expect(detachedElement).not.toBeInTheDocument() expect(nullElement).not.toBeInTheDocument() + expect(page.getByTestId('non-existing')).not.toBeInTheDocument() + // negative test cases wrapped in throwError assertions for coverage. const expectToBe = /expect.*\.toBeInTheDocument/ const expectNotToBe = /expect.*not\.toBeInTheDocument/ From 60f0d08b0cfe453e4cc8b58e7a0a05bacfab46ac Mon Sep 17 00:00:00 2001 From: Vladimir Sheremet Date: Tue, 21 Oct 2025 19:05:27 +0200 Subject: [PATCH 4/4] test: ipdate toBeInTheDoc test --- .../fixtures/expect-dom/toBeInTheDocument.test.ts | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/test/browser/fixtures/expect-dom/toBeInTheDocument.test.ts b/test/browser/fixtures/expect-dom/toBeInTheDocument.test.ts index bbb9c442f94c..28bdc947785b 100644 --- a/test/browser/fixtures/expect-dom/toBeInTheDocument.test.ts +++ b/test/browser/fixtures/expect-dom/toBeInTheDocument.test.ts @@ -42,6 +42,7 @@ test('.toBeInTheDocument', () => { const expectToBe = /expect.*\.toBeInTheDocument/ const expectNotToBe = /expect.*not\.toBeInTheDocument/ const userInputNode = /an HTMLElement or an SVGElement/ + const notFound = /element could not be found in the document/ expect(() => expect(htmlElement).not.toBeInTheDocument()).toThrowError( expectNotToBe, ) @@ -55,12 +56,10 @@ test('.toBeInTheDocument', () => { userInputNode, ) expect(() => expect(nullElement).toBeInTheDocument()).toThrowError( - userInputNode, + notFound, ) expect(() => expect(undefinedElement).toBeInTheDocument()).toThrowError( - userInputNode, - ) - expect(() => expect(undefinedElement).not.toBeInTheDocument()).toThrowError( - userInputNode, + notFound, ) + expect(() => expect(undefinedElement).not.toBeInTheDocument()).not.toThrowError() }) \ No newline at end of file