import type { ElementReference } from '@wdio/protocols' import { getElementFromResponse } from '../../utils/index.js' /** * * Select option with a specific index. * * :example.html :selectByIndex.js it('Should demonstrate the selectByIndex command', async () => { const selectBox = await $('#selectbox'); console.log(await selectBox.getValue()); // returns "someValue0" await selectBox.selectByIndex(4); console.log(await selectBox.getValue()); // returns "someValue4" }); * * * @alias element.selectByIndexs * @param {number} index option index * @uses protocol/findElementsFromElement, protocol/elementClick * @type action * */ export async function selectByIndex ( this: WebdriverIO.Element, index: number ) { /** * negative index check */ if (index < 0) { throw new Error('Index needs to be 0 or any other positive number') } const fetchOptionElements = async () => { return this.findElementsFromElement(this.elementId, 'css selector', 'option') } /** * get option elememnts using css */ let optionElements: ElementReference[] = [] await this.waitUntil(async () => { optionElements = await fetchOptionElements() return optionElements.length > 0 }, { timeoutMsg: 'Select element doesn\'t contain any option element' }) await this.waitUntil(async () => { optionElements = await fetchOptionElements() return typeof optionElements[index] !== 'undefined' }, { timeoutMsg: `Option with index "${index}" not found. Select element only contains ${optionElements.length} option elements` }) /** * select option */ return this.elementClick(getElementFromResponse(optionElements[index]) as string) }