Skip to content

Commit e474201

Browse files
authored
[JS] Fix: Do not allow Select class to select disabled options (#11029)
[JS] Fix: Not selecting disabled option
1 parent 33106b6 commit e474201

File tree

2 files changed

+161
-64
lines changed

2 files changed

+161
-64
lines changed

javascript/node/selenium-webdriver/lib/select.js

Lines changed: 15 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@
3737
'use strict'
3838

3939
const { By, escapeCss } = require('./by')
40+
const error = require('./error')
4041

4142
/**
4243
* ISelect interface makes a protocol for all kind of select elements (standard html and custom
@@ -191,9 +192,7 @@ class Select {
191192

192193
for (let option of options) {
193194
if ((await option.getAttribute('index')) === index.toString()) {
194-
if (!(await option.isSelected())) {
195-
await option.click()
196-
}
195+
await this.setSelected(option)
197196
}
198197
}
199198
}
@@ -224,9 +223,7 @@ class Select {
224223
})
225224

226225
for (let option of options) {
227-
if (!(await option.isSelected())) {
228-
await option.click()
229-
}
226+
await this.setSelected(option)
230227

231228
if (!isMulti) {
232229
return
@@ -282,9 +279,7 @@ class Select {
282279
const optionElement = await this.element.findElement({
283280
xpath: selections.join('|'),
284281
})
285-
if (!(await optionElement.isSelected())) {
286-
await optionElement.click()
287-
}
282+
await this.setSelected(optionElement)
288283
}
289284

290285
/**
@@ -455,6 +450,17 @@ class Select {
455450
throw new Error(`Cannot locate option with value: ${value}`)
456451
}
457452
}
453+
454+
async setSelected(option) {
455+
if (!(await option.isSelected())) {
456+
if (!(await option.isEnabled())) {
457+
throw new error.UnsupportedOperationError(
458+
`You may not select a disabled option`
459+
)
460+
}
461+
await option.click()
462+
}
463+
}
458464
}
459465

460466
module.exports = { Select }

javascript/node/selenium-webdriver/test/select_test.js

Lines changed: 146 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,16 @@ let singleSelectValues1 = {
2626
name: 'selectomatic',
2727
values: ['One', 'Two', 'Four', 'Still learning how to count, apparently'],
2828
}
29-
let disabledSelect = { name: 'no-select', values: ['Foo'] }
29+
30+
let disabledSingleSelect = {
31+
name: 'single_disabled',
32+
values: ['Enabled', 'Disabled'],
33+
}
34+
let disabledMultiSelect = {
35+
name: 'multi_disabled',
36+
values: ['Enabled', 'Disabled'],
37+
}
38+
3039
let multiSelectValues1 = {
3140
name: 'multi',
3241
values: ['Eggs', 'Ham', 'Sausages', 'Onion gravy'],
@@ -98,60 +107,6 @@ suite(
98107
}
99108
})
100109

101-
ignore(browsers(Browser.FIREFOX)).it(
102-
'Should check selected option if select is disabled by index',
103-
async function () {
104-
await driver.get(Pages.formPage)
105-
106-
let selectorObject = new Select(
107-
driver.findElement(By.name(disabledSelect['name']))
108-
)
109-
let firstSelected = await selectorObject.getFirstSelectedOption()
110-
await selectorObject.selectByIndex(1)
111-
let lastSelected = await selectorObject.getFirstSelectedOption()
112-
assert.deepEqual(
113-
await firstSelected.getAttribute('value'),
114-
await lastSelected.getAttribute('value')
115-
)
116-
}
117-
)
118-
119-
ignore(browsers(Browser.FIREFOX)).it(
120-
'Should check selected option if select is disabled by value',
121-
async function () {
122-
await driver.get(Pages.formPage)
123-
124-
let selectorObject = new Select(
125-
driver.findElement(By.name(disabledSelect['name']))
126-
)
127-
let firstSelected = await selectorObject.getFirstSelectedOption()
128-
await selectorObject.selectByValue('bar')
129-
let lastSelected = await selectorObject.getFirstSelectedOption()
130-
assert.deepEqual(
131-
await firstSelected.getAttribute('value'),
132-
await lastSelected.getAttribute('value')
133-
)
134-
}
135-
)
136-
137-
ignore(browsers(Browser.FIREFOX)).it(
138-
'Should check selected option if select is disabled by visible text',
139-
async function () {
140-
await driver.get(Pages.formPage)
141-
142-
let selectorObject = new Select(
143-
driver.findElement(By.name(disabledSelect['name']))
144-
)
145-
let firstSelected = await selectorObject.getFirstSelectedOption()
146-
await selectorObject.selectByVisibleText('Bar')
147-
let lastSelected = await selectorObject.getFirstSelectedOption()
148-
assert.deepEqual(
149-
await firstSelected.getAttribute('value'),
150-
await lastSelected.getAttribute('value')
151-
)
152-
}
153-
)
154-
155110
it('Should select by multiple index', async function () {
156111
await driver.get(Pages.formPage)
157112

@@ -217,6 +172,142 @@ suite(
217172
)
218173
}
219174
})
175+
176+
it('Should raise exception select by value single disabled', async function () {
177+
await driver.get(Pages.formPage)
178+
179+
let selector = new Select(
180+
driver.findElement(By.name(disabledSingleSelect['name']))
181+
)
182+
183+
await assert.rejects(
184+
async () => {
185+
await selector.selectByValue(
186+
disabledSingleSelect.values[1].toLowerCase()
187+
)
188+
},
189+
(err) => {
190+
assert.strictEqual(err.name, 'UnsupportedOperationError')
191+
assert.strictEqual(
192+
err.message,
193+
'You may not select a disabled option'
194+
)
195+
return true
196+
}
197+
)
198+
})
199+
200+
it('Should raise exception select by index single disabled', async function () {
201+
await driver.get(Pages.formPage)
202+
203+
let selector = new Select(
204+
driver.findElement(By.name(disabledSingleSelect['name']))
205+
)
206+
207+
await assert.rejects(
208+
async () => {
209+
await selector.selectByIndex(1)
210+
},
211+
(err) => {
212+
assert.strictEqual(err.name, 'UnsupportedOperationError')
213+
assert.strictEqual(
214+
err.message,
215+
'You may not select a disabled option'
216+
)
217+
return true
218+
}
219+
)
220+
})
221+
222+
it('Should raise exception select by text single disabled', async function () {
223+
await driver.get(Pages.formPage)
224+
225+
let selector = new Select(
226+
driver.findElement(By.name(disabledSingleSelect['name']))
227+
)
228+
229+
await assert.rejects(
230+
async () => {
231+
await selector.selectByVisibleText(disabledSingleSelect.values[1])
232+
},
233+
(err) => {
234+
assert.strictEqual(err.name, 'UnsupportedOperationError')
235+
assert.strictEqual(
236+
err.message,
237+
'You may not select a disabled option'
238+
)
239+
return true
240+
}
241+
)
242+
})
243+
244+
it('Should raise exception select by index multiple disabled', async function () {
245+
await driver.get(Pages.formPage)
246+
247+
let selector = new Select(
248+
driver.findElement(By.name(disabledMultiSelect['name']))
249+
)
250+
251+
await assert.rejects(
252+
async () => {
253+
await selector.selectByIndex(1)
254+
},
255+
(err) => {
256+
assert.strictEqual(err.name, 'UnsupportedOperationError')
257+
assert.strictEqual(
258+
err.message,
259+
'You may not select a disabled option'
260+
)
261+
return true
262+
}
263+
)
264+
})
265+
266+
it('Should raise exception select by value multiple disabled', async function () {
267+
await driver.get(Pages.formPage)
268+
269+
let selector = new Select(
270+
driver.findElement(By.name(disabledMultiSelect['name']))
271+
)
272+
273+
await assert.rejects(
274+
async () => {
275+
await selector.selectByValue(
276+
disabledMultiSelect.values[1].toLowerCase()
277+
)
278+
},
279+
(err) => {
280+
assert.strictEqual(err.name, 'UnsupportedOperationError')
281+
assert.strictEqual(
282+
err.message,
283+
'You may not select a disabled option'
284+
)
285+
return true
286+
}
287+
)
288+
})
289+
290+
it('Should raise exception select by text multiple disabled', async function () {
291+
await driver.get(Pages.formPage)
292+
293+
let selector = new Select(
294+
driver.findElement(By.name(disabledMultiSelect['name']))
295+
)
296+
297+
await assert.rejects(
298+
async () => {
299+
await selector.selectByVisibleText(disabledMultiSelect.values[1])
300+
},
301+
(err) => {
302+
assert.strictEqual(err.name, 'UnsupportedOperationError')
303+
assert.strictEqual(
304+
err.message,
305+
'You may not select a disabled option'
306+
)
307+
return true
308+
}
309+
)
310+
})
220311
})
221312
},
222313
{ browsers: ['firefox', 'chrome'] }

0 commit comments

Comments
 (0)