import { ELEMENT_KEY } from 'webdriver' import type { ElementReference } from '@wdio/protocols' import { getElementFromResponse } from '../../utils/index.js' /** * * Select option with a specific value. * * :example.html :selectByAttribute.js it('Should demonstrate the selectByAttribute command', async () => { const selectBox = await $('#selectbox'); const value = await selectBox.getValue(); console.log(value); // returns "someValue0" await selectBox.selectByAttribute('value', 'someValue3'); console.log(await selectBox.getValue()); // returns "someValue3" await selectBox.selectByAttribute('name', 'someName5'); console.log(await selectBox.getValue()); // returns "someValue5" }); * * * @alias element.selectByAttribute * @param {string} attribute attribute of option element to get selected * @param {String|Number} value value of option element to get selected * @uses protocol/findElementFromElement, protocol/elementClick * @type action * */ export async function selectByAttribute ( this: WebdriverIO.Element, attribute: string, value: string | number ) { /** * convert value into string */ value = typeof value === 'number' ? value.toString() : value /** * find option elememnt using xpath */ const normalized = `[normalize-space(@${attribute.trim()}) = "${value.trim()}"]` let optionElement: ElementReference | undefined await this.waitUntil(async () => { optionElement = await this.findElementFromElement( this.elementId, 'xpath', `./option${normalized}|./optgroup/option${normalized}` ) return ELEMENT_KEY in optionElement }, { timeoutMsg: `Option with attribute "${attribute}=${value}" not found.` }) /** * select option */ return this.elementClick(getElementFromResponse(optionElement) as string) }