Skip to content

Commit 28765b4

Browse files
authored
fix(wdio): properly construct the shadow root selector if there are multiple elements (#8354)
1 parent 1a81c21 commit 28765b4

File tree

2 files changed

+29
-2
lines changed

2 files changed

+29
-2
lines changed

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

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,15 @@ class WebdriverIOLocator extends Locator {
6060
if (!selectors.length) {
6161
throw getElementError(this._pwSelector, this._container || document.body)
6262
}
63-
return selectors.join(', ')
63+
let hasShadowRoot = false
64+
const newSelectors = selectors.map((selector) => {
65+
if (selector.startsWith('>>>')) {
66+
hasShadowRoot = true
67+
return selector.slice(3)
68+
}
69+
return selector
70+
})
71+
return (hasShadowRoot ? '>>>' : '') + newSelectors.join(', ')
6472
}
6573

6674
public override click(options?: UserEventClickOptions): Promise<void> {

test/browser/test/dom.test.ts

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { createNode } from '#src/createNode'
2-
import { page } from '@vitest/browser/context'
2+
import { page, server } from '@vitest/browser/context'
33
import { afterAll, beforeEach, describe, expect, test } from 'vitest'
44
import '../src/button.css'
55

@@ -115,6 +115,25 @@ describe('dom related activity', () => {
115115
/__screenshots__\/dom.test.ts\/dom-related-activity-svg-screenshot-1.png/,
116116
)
117117
})
118+
119+
test.runIf(server.provider === 'webdriverio')('shadow dom works with multiple elements', async () => {
120+
const wrapper = createWrapper()
121+
const div = createNode()
122+
wrapper.appendChild(div)
123+
124+
const shadow = div.attachShadow({ mode: 'open' })
125+
const shadowDiv1 = createNode()
126+
shadowDiv1.role = 'tab'
127+
const shadowDiv2 = createNode()
128+
shadowDiv2.role = 'tab'
129+
shadow.appendChild(shadowDiv1)
130+
shadow.appendChild(shadowDiv2)
131+
132+
expect(
133+
page.getByRole('tab').selector,
134+
'there is only a single >>> in the selector',
135+
).toBe('>>>html > body > div > div > div, html > body > div > div > div')
136+
})
118137
})
119138

120139
function createWrapper() {

0 commit comments

Comments
 (0)