@@ -5,10 +5,10 @@ test("test", async ({ page }) => {
55 timeout : 20 * 60 * 1000 ,
66 } ) ; // Increase timeout to 20 minutes
77 // Find Select a fruit...
8- let selectTrigger = page . locator ( ".select-trigger" ) ;
8+ let selectTrigger = page . locator ( "#select-main .select-trigger" ) ;
99 await selectTrigger . click ( ) ;
1010 // Assert the select menu is open
11- const selectMenu = page . locator ( ".select-list" ) ;
11+ const selectMenu = page . locator ( "#select-main .select-list" ) ;
1212 await expect ( selectMenu ) . toHaveAttribute ( "data-state" , "open" ) ;
1313
1414 // Assert the menu is focused
@@ -64,10 +64,10 @@ test("test", async ({ page }) => {
6464test ( "tabbing out of menu closes the select menu" , async ( { page } ) => {
6565 await page . goto ( "http://127.0.0.1:8080/component/?name=select&" ) ;
6666 // Find Select a fruit...
67- let selectTrigger = page . locator ( ".select-trigger" ) ;
67+ let selectTrigger = page . locator ( "#select-main .select-trigger" ) ;
6868 await selectTrigger . click ( ) ;
6969 // Assert the select menu is open
70- const selectMenu = page . locator ( ".select-list" ) ;
70+ const selectMenu = page . locator ( "#select-main .select-list" ) ;
7171 await expect ( selectMenu ) . toHaveAttribute ( "data-state" , "open" ) ;
7272
7373 // Assert the menu is focused
@@ -80,10 +80,10 @@ test("tabbing out of menu closes the select menu", async ({ page }) => {
8080test ( "tabbing out of item closes the select menu" , async ( { page } ) => {
8181 await page . goto ( "http://127.0.0.1:8080/component/?name=select&" ) ;
8282 // Find Select a fruit...
83- let selectTrigger = page . locator ( ".select-trigger" ) ;
83+ let selectTrigger = page . locator ( "#select-main .select-trigger" ) ;
8484 await selectTrigger . click ( ) ;
8585 // Assert the select menu is open
86- const selectMenu = page . locator ( ".select-list" ) ;
86+ const selectMenu = page . locator ( "#select-main .select-list" ) ;
8787 await expect ( selectMenu ) . toHaveAttribute ( "data-state" , "open" ) ;
8888
8989 // Assert the menu is focused
@@ -101,10 +101,10 @@ test("tabbing out of item closes the select menu", async ({ page }) => {
101101test ( "options selected" , async ( { page } ) => {
102102 await page . goto ( "http://127.0.0.1:8080/component/?name=select&" ) ;
103103 // Find Select a fruit...
104- let selectTrigger = page . locator ( ".select-trigger" ) ;
104+ let selectTrigger = page . locator ( "#select-main .select-trigger" ) ;
105105 await selectTrigger . click ( ) ;
106106 // Assert the select menu is open
107- const selectMenu = page . locator ( ".select-list" ) ;
107+ const selectMenu = page . locator ( "#select-main .select-list" ) ;
108108 await expect ( selectMenu ) . toHaveAttribute ( "data-state" , "open" ) ;
109109
110110 // Assert no items have aria-selected
@@ -130,25 +130,126 @@ test("options selected", async ({ page }) => {
130130test ( "down arrow selects first element" , async ( { page } ) => {
131131 await page . goto ( "http://127.0.0.1:8080/component/?name=select&" ) ;
132132 // Find Select a fruit...
133- let selectTrigger = page . locator ( ".select-trigger" ) ;
134- const selectMenu = page . locator ( ".select-list" ) ;
133+ let selectTrigger = page . locator ( "#select-main .select-trigger" ) ;
134+ const selectMenu = page . locator ( "#select-main .select-list" ) ;
135135 await selectTrigger . focus ( ) ;
136136
137137 // Select the first option
138138 await page . keyboard . press ( "ArrowDown" ) ;
139139 const firstOption = selectMenu . getByRole ( "option" , { name : "apple" } ) ;
140140 await expect ( firstOption ) . toBeFocused ( ) ;
141+
142+ // Same thing but with the first option disabled
143+ let disabledSelectTrigger = page . locator ( "#select-disabled .select-trigger" ) ;
144+ const disabledSelectMenu = page . locator ( "#select-disabled .select-list" ) ;
145+ await disabledSelectTrigger . focus ( ) ;
146+ await page . keyboard . press ( "ArrowDown" ) ;
147+ const disabledFirstOption = disabledSelectMenu . getByRole ( "option" , { name : "banana" } ) ;
148+ await expect ( disabledFirstOption ) . toBeFocused ( ) ;
141149} ) ;
142150
143151test ( "up arrow selects last element" , async ( { page } ) => {
144152 await page . goto ( "http://127.0.0.1:8080/component/?name=select&" ) ;
145153 // Find Select a fruit...
146- let selectTrigger = page . locator ( ".select-trigger" ) ;
147- const selectMenu = page . locator ( ".select-list" ) ;
154+ let selectTrigger = page . locator ( "#select-main .select-trigger" ) ;
155+ const selectMenu = page . locator ( "#select-main .select-list" ) ;
148156 await selectTrigger . focus ( ) ;
149157
150158 // Select the first option
151159 await page . keyboard . press ( "ArrowUp" ) ;
152- const firstOption = selectMenu . getByRole ( "option" , { name : "other" } ) ;
160+ const lastOption = selectMenu . getByRole ( "option" , { name : "other" } ) ;
161+ await expect ( lastOption ) . toBeFocused ( ) ;
162+
163+ // Same thing but with the last option disabled
164+ let disabledSelectTrigger = page . locator ( "#select-disabled .select-trigger" ) ;
165+ const disabledSelectMenu = page . locator ( "#select-disabled .select-list" ) ;
166+ await disabledSelectTrigger . focus ( ) ;
167+
168+ await page . keyboard . press ( "ArrowUp" ) ;
169+ const disabledLastOption = disabledSelectMenu . getByRole ( "option" , { name : "watermelon" } ) ;
170+ await expect ( disabledLastOption ) . toBeFocused ( ) ;
171+ } ) ;
172+
173+ test ( "rollover on top and bottom" , async ( { page } ) => {
174+ await page . goto ( "http://127.0.0.1:8080/component/?name=select&" ) ;
175+
176+ // Find Select a fruit...
177+ let selectTrigger = page . locator ( "#select-main .select-trigger" ) ;
178+ const selectMenu = page . locator ( "#select-main .select-list" ) ;
179+ await selectTrigger . focus ( ) ;
180+
181+ // open the list and select first option
182+ await page . keyboard . press ( "ArrowDown" ) ;
183+ const firstOption = selectMenu . getByRole ( "option" , { name : "apple" } ) ;
153184 await expect ( firstOption ) . toBeFocused ( ) ;
185+
186+ // up arrow to select last option (rollover)
187+ await page . keyboard . press ( "ArrowUp" ) ;
188+ const lastOption = selectMenu . getByRole ( "option" , { name : "other" } ) ;
189+ await expect ( lastOption ) . toBeFocused ( ) ;
190+
191+ // down arrow to select first option (rollover)
192+ await page . keyboard . press ( "ArrowDown" ) ;
193+ await expect ( firstOption ) . toBeFocused ( ) ;
194+
195+ // Same thing but with first and last options disabled
196+ let disabledSelectTrigger = page . locator ( "#select-disabled .select-trigger" ) ;
197+ const disabledSelectMenu = page . locator ( "#select-disabled .select-list" ) ;
198+ await disabledSelectTrigger . focus ( ) ;
199+
200+ // open the list and select first option
201+ await page . keyboard . press ( "ArrowDown" ) ;
202+ const disabledFirstOption = disabledSelectMenu . getByRole ( "option" , { name : "banana" } ) ;
203+ await expect ( disabledFirstOption ) . toBeFocused ( ) ;
204+
205+ // up arrow to select last option (rollover)
206+ await page . keyboard . press ( "ArrowUp" ) ;
207+ const disabledLastOption = disabledSelectMenu . getByRole ( "option" , { name : "watermelon" } ) ;
208+ await expect ( disabledLastOption ) . toBeFocused ( ) ;
209+
210+ // down arrow to select first option (rollover)
211+ await page . keyboard . press ( "ArrowDown" ) ;
212+ await expect ( disabledFirstOption ) . toBeFocused ( ) ;
213+ } ) ;
214+
215+ test ( "disabled elements are skipped" , async ( { page } ) => {
216+ await page . goto ( "http://127.0.0.1:8080/component/?name=select&" ) ;
217+
218+ // Find Select a fruit...
219+ let selectTrigger = page . locator ( "#select-disabled .select-trigger" ) ;
220+ const selectMenu = page . locator ( "#select-disabled .select-list" ) ;
221+ await selectTrigger . focus ( ) ;
222+
223+ // open the list and select first enabled option
224+ await page . keyboard . press ( "ArrowDown" ) ;
225+ const firstOption = selectMenu . getByRole ( "option" , { name : "banana" } ) ;
226+ await expect ( firstOption ) . toBeFocused ( ) ;
227+
228+ // down arrow to select second enabled option
229+ await page . keyboard . press ( "ArrowDown" ) ;
230+ const secondOption = selectMenu . getByRole ( "option" , { name : "strawberry" } ) ;
231+ await expect ( secondOption ) . toBeFocused ( ) ;
232+
233+ // up arrow to select first enabled option
234+ await page . keyboard . press ( "ArrowUp" ) ;
235+ await expect ( firstOption ) . toBeFocused ( ) ;
236+ } ) ;
237+
238+ test ( "aria active descendant" , async ( { page } ) => {
239+ await page . goto ( "http://127.0.0.1:8080/component/?name=select&" ) ;
240+
241+ // Find Select a fruit...
242+ let selectTrigger = page . locator ( "#select-main .select-trigger" ) ;
243+ const selectMenu = page . locator ( "#select-main .select-list" ) ;
244+ await selectTrigger . focus ( ) ;
245+
246+ // select first option
247+ await page . keyboard . press ( "ArrowDown" ) ;
248+ const firstOption = selectMenu . getByRole ( "option" , { name : "apple" } ) ;
249+ await expect ( selectTrigger ) . toHaveAttribute ( "aria-activedescendant" , await firstOption . getAttribute ( "id" ) ) ;
250+
251+ // select second option
252+ await page . keyboard . press ( "ArrowDown" ) ;
253+ const secondOption = selectMenu . getByRole ( "option" , { name : "banana" } ) ;
254+ await expect ( selectTrigger ) . toHaveAttribute ( "aria-activedescendant" , await secondOption . getAttribute ( "id" ) ) ;
154255} ) ;
0 commit comments