Skip to content

Commit

Permalink
[JS] Fix: Do not allow Select class to select disabled options (#11029)
Browse files Browse the repository at this point in the history
[JS] Fix: Not selecting disabled option
  • Loading branch information
TamsilAmani committed Sep 18, 2022
1 parent 33106b6 commit e474201
Show file tree
Hide file tree
Showing 2 changed files with 161 additions and 64 deletions.
24 changes: 15 additions & 9 deletions javascript/node/selenium-webdriver/lib/select.js
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@
'use strict'

const { By, escapeCss } = require('./by')
const error = require('./error')

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

for (let option of options) {
if ((await option.getAttribute('index')) === index.toString()) {
if (!(await option.isSelected())) {
await option.click()
}
await this.setSelected(option)
}
}
}
Expand Down Expand Up @@ -224,9 +223,7 @@ class Select {
})

for (let option of options) {
if (!(await option.isSelected())) {
await option.click()
}
await this.setSelected(option)

if (!isMulti) {
return
Expand Down Expand Up @@ -282,9 +279,7 @@ class Select {
const optionElement = await this.element.findElement({
xpath: selections.join('|'),
})
if (!(await optionElement.isSelected())) {
await optionElement.click()
}
await this.setSelected(optionElement)
}

/**
Expand Down Expand Up @@ -455,6 +450,17 @@ class Select {
throw new Error(`Cannot locate option with value: ${value}`)
}
}

async setSelected(option) {
if (!(await option.isSelected())) {
if (!(await option.isEnabled())) {
throw new error.UnsupportedOperationError(
`You may not select a disabled option`
)
}
await option.click()
}
}
}

module.exports = { Select }
201 changes: 146 additions & 55 deletions javascript/node/selenium-webdriver/test/select_test.js
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,16 @@ let singleSelectValues1 = {
name: 'selectomatic',
values: ['One', 'Two', 'Four', 'Still learning how to count, apparently'],
}
let disabledSelect = { name: 'no-select', values: ['Foo'] }

let disabledSingleSelect = {
name: 'single_disabled',
values: ['Enabled', 'Disabled'],
}
let disabledMultiSelect = {
name: 'multi_disabled',
values: ['Enabled', 'Disabled'],
}

let multiSelectValues1 = {
name: 'multi',
values: ['Eggs', 'Ham', 'Sausages', 'Onion gravy'],
Expand Down Expand Up @@ -98,60 +107,6 @@ suite(
}
})

ignore(browsers(Browser.FIREFOX)).it(
'Should check selected option if select is disabled by index',
async function () {
await driver.get(Pages.formPage)

let selectorObject = new Select(
driver.findElement(By.name(disabledSelect['name']))
)
let firstSelected = await selectorObject.getFirstSelectedOption()
await selectorObject.selectByIndex(1)
let lastSelected = await selectorObject.getFirstSelectedOption()
assert.deepEqual(
await firstSelected.getAttribute('value'),
await lastSelected.getAttribute('value')
)
}
)

ignore(browsers(Browser.FIREFOX)).it(
'Should check selected option if select is disabled by value',
async function () {
await driver.get(Pages.formPage)

let selectorObject = new Select(
driver.findElement(By.name(disabledSelect['name']))
)
let firstSelected = await selectorObject.getFirstSelectedOption()
await selectorObject.selectByValue('bar')
let lastSelected = await selectorObject.getFirstSelectedOption()
assert.deepEqual(
await firstSelected.getAttribute('value'),
await lastSelected.getAttribute('value')
)
}
)

ignore(browsers(Browser.FIREFOX)).it(
'Should check selected option if select is disabled by visible text',
async function () {
await driver.get(Pages.formPage)

let selectorObject = new Select(
driver.findElement(By.name(disabledSelect['name']))
)
let firstSelected = await selectorObject.getFirstSelectedOption()
await selectorObject.selectByVisibleText('Bar')
let lastSelected = await selectorObject.getFirstSelectedOption()
assert.deepEqual(
await firstSelected.getAttribute('value'),
await lastSelected.getAttribute('value')
)
}
)

it('Should select by multiple index', async function () {
await driver.get(Pages.formPage)

Expand Down Expand Up @@ -217,6 +172,142 @@ suite(
)
}
})

it('Should raise exception select by value single disabled', async function () {
await driver.get(Pages.formPage)

let selector = new Select(
driver.findElement(By.name(disabledSingleSelect['name']))
)

await assert.rejects(
async () => {
await selector.selectByValue(
disabledSingleSelect.values[1].toLowerCase()
)
},
(err) => {
assert.strictEqual(err.name, 'UnsupportedOperationError')
assert.strictEqual(
err.message,
'You may not select a disabled option'
)
return true
}
)
})

it('Should raise exception select by index single disabled', async function () {
await driver.get(Pages.formPage)

let selector = new Select(
driver.findElement(By.name(disabledSingleSelect['name']))
)

await assert.rejects(
async () => {
await selector.selectByIndex(1)
},
(err) => {
assert.strictEqual(err.name, 'UnsupportedOperationError')
assert.strictEqual(
err.message,
'You may not select a disabled option'
)
return true
}
)
})

it('Should raise exception select by text single disabled', async function () {
await driver.get(Pages.formPage)

let selector = new Select(
driver.findElement(By.name(disabledSingleSelect['name']))
)

await assert.rejects(
async () => {
await selector.selectByVisibleText(disabledSingleSelect.values[1])
},
(err) => {
assert.strictEqual(err.name, 'UnsupportedOperationError')
assert.strictEqual(
err.message,
'You may not select a disabled option'
)
return true
}
)
})

it('Should raise exception select by index multiple disabled', async function () {
await driver.get(Pages.formPage)

let selector = new Select(
driver.findElement(By.name(disabledMultiSelect['name']))
)

await assert.rejects(
async () => {
await selector.selectByIndex(1)
},
(err) => {
assert.strictEqual(err.name, 'UnsupportedOperationError')
assert.strictEqual(
err.message,
'You may not select a disabled option'
)
return true
}
)
})

it('Should raise exception select by value multiple disabled', async function () {
await driver.get(Pages.formPage)

let selector = new Select(
driver.findElement(By.name(disabledMultiSelect['name']))
)

await assert.rejects(
async () => {
await selector.selectByValue(
disabledMultiSelect.values[1].toLowerCase()
)
},
(err) => {
assert.strictEqual(err.name, 'UnsupportedOperationError')
assert.strictEqual(
err.message,
'You may not select a disabled option'
)
return true
}
)
})

it('Should raise exception select by text multiple disabled', async function () {
await driver.get(Pages.formPage)

let selector = new Select(
driver.findElement(By.name(disabledMultiSelect['name']))
)

await assert.rejects(
async () => {
await selector.selectByVisibleText(disabledMultiSelect.values[1])
},
(err) => {
assert.strictEqual(err.name, 'UnsupportedOperationError')
assert.strictEqual(
err.message,
'You may not select a disabled option'
)
return true
}
)
})
})
},
{ browsers: ['firefox', 'chrome'] }
Expand Down

0 comments on commit e474201

Please sign in to comment.