Skip to content

Commit d698d21

Browse files
committed
chore: use ivya instead of playwright locators directly
1 parent 0883b29 commit d698d21

23 files changed

+389
-6428
lines changed

packages/browser/package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,7 @@
9797
"@wdio/protocols": "^8.38.0",
9898
"birpc": "0.2.17",
9999
"flatted": "^3.3.1",
100+
"ivya": "^1.1.0",
100101
"pathe": "^1.1.2",
101102
"periscopic": "^4.0.2",
102103
"playwright": "^1.45.3",

packages/browser/src/client/tester/context.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import type { Task } from 'vitest'
1+
import type { RunnerTask } from 'vitest'
22
import type { BrowserRPC } from '@vitest/browser/client'
33
import type {
44
BrowserPage,
@@ -46,10 +46,10 @@ function createUserEvent(): UserEvent {
4646
return convertToLocator(element).selectOptions(value)
4747
},
4848
async type(element: Element | Locator, text: string, options: UserEventTypeOptions = {}) {
49-
const css = convertToLocator(element).selector
49+
const selector = convertToSelector(element)
5050
const { unreleased } = await triggerCommand<{ unreleased: string[] }>(
5151
'__vitest_type',
52-
css,
52+
selector,
5353
text,
5454
{ ...options, unreleased: keyboard.unreleased },
5555
)
@@ -195,6 +195,6 @@ function convertToSelector(elementOrLocator: Element | Locator): string {
195195
throw new Error('Expected element or locator to be an instance of Element or Locator.')
196196
}
197197

198-
function getTaskFullName(task: Task): string {
198+
function getTaskFullName(task: RunnerTask): string {
199199
return task.suite ? `${getTaskFullName(task.suite)} ${task.name}` : task.name
200200
}

packages/browser/src/client/tester/locators/index.ts

Lines changed: 31 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -6,19 +6,39 @@ import type {
66
UserEventDragAndDropOptions,
77
UserEventFillOptions,
88
} from '@vitest/browser/context'
9-
import { page } from '@vitest/browser/context'
9+
import { page, server } from '@vitest/browser/context'
1010
import type { BrowserRPC } from '@vitest/browser/client'
11+
import {
12+
Ivya,
13+
type ParsedSelector,
14+
asLocator,
15+
getByAltTextSelector,
16+
getByLabelSelector,
17+
getByPlaceholderSelector,
18+
getByRoleSelector,
19+
getByTestIdSelector,
20+
getByTextSelector,
21+
getByTitleSelector,
22+
} from 'ivya'
1123
import type { WorkerGlobalState } from 'vitest'
1224
import type { BrowserRunnerState } from '../../utils'
1325
import { getBrowserState, getWorkerState } from '../../utils'
14-
import { getByAltTextSelector, getByLabelSelector, getByPlaceholderSelector, getByRoleSelector, getByTestIdSelector, getByTextSelector, getByTitleSelector } from './playwright-selector/locatorUtils'
15-
import type { ParsedSelector } from './playwright-selector/selectorParser'
16-
import { parseSelector } from './playwright-selector/selectorParser'
17-
import { PlaywrightSelector } from './playwright-selector/selector'
18-
import { asLocator } from './playwright-selector/locatorGenerators'
1926

20-
// we prefer using playwright locators because they are more powerful and support Shdow DOM
21-
export const selectorEngine = new PlaywrightSelector()
27+
// we prefer using playwright locators because they are more powerful and support Shadow DOM
28+
export const selectorEngine = Ivya.create({
29+
browser: ((name: string) => {
30+
switch (name) {
31+
case 'edge':
32+
case 'chrome':
33+
return 'chromium'
34+
case 'safari':
35+
return 'webkit'
36+
default:
37+
return name as 'webkit' | 'firefox' | 'chromium'
38+
}
39+
})(server.config.browser.name),
40+
testIdAttribute: server.config.browser.locators.testIdAttribute,
41+
})
2242

2343
export abstract class Locator {
2444
public abstract selector: string
@@ -110,7 +130,7 @@ export abstract class Locator {
110130
}
111131

112132
public getByTestId(testId: string | RegExp): Locator {
113-
return this.locator(getByTestIdSelector(page.config.browser.locators.testIdAttribute, testId))
133+
return this.locator(getByTestIdSelector(server.config.browser.locators.testIdAttribute, testId))
114134
}
115135

116136
public getByText(text: string | RegExp, options?: LocatorOptions): Locator {
@@ -125,7 +145,7 @@ export abstract class Locator {
125145
if (this._forceElement) {
126146
return this._forceElement
127147
}
128-
const parsedSelector = this._parsedSelector || (this._parsedSelector = parseSelector(this._pwSelector || this.selector))
148+
const parsedSelector = this._parsedSelector || (this._parsedSelector = selectorEngine.parseSelector(this._pwSelector || this.selector))
129149
return selectorEngine.querySelector(parsedSelector, document.body, true)
130150
}
131151

@@ -141,7 +161,7 @@ export abstract class Locator {
141161
if (this._forceElement) {
142162
return [this._forceElement]
143163
}
144-
const parsedSelector = this._parsedSelector || (this._parsedSelector = parseSelector(this._pwSelector || this.selector))
164+
const parsedSelector = this._parsedSelector || (this._parsedSelector = selectorEngine.parseSelector(this._pwSelector || this.selector))
145165
return selectorEngine.querySelectorAll(parsedSelector, document.body)
146166
}
147167

packages/browser/src/client/tester/locators/playwright-selector/cssParser.ts

Lines changed: 0 additions & 281 deletions
This file was deleted.

0 commit comments

Comments
 (0)