UNPKG

browsertime

Version:

Get performance metrics from your web page using Browsertime.

175 lines (165 loc) 6.57 kB
import intel from 'intel'; const log = intel.getLogger('browsertime.command.select'); /** * Provides functionality to interact with `<select>` elements on a web page. * * @class * @hideconstructor */ export class Select { constructor(browser) { /** * @private */ this.browser = browser; } /** * Selects an option in a `<select>` element by its ID and the value of the option. * * @async * @param {string} selectId - The ID of the `<select>` element. * @param {string} value - The value of the option to select. * @returns {Promise<void>} A promise that resolves when the option is selected. * @throws {Error} Throws an error if the `<select>` element is not found. */ async selectByIdAndValue(selectId, value) { try { const script = `const select = document.getElementById('${selectId}'); select.value = '${value}'; select.dispatchEvent(new Event('change'));`; await this.browser.runScript(script, 'CUSTOM'); } catch (error) { log.error('Could not select value for select with id %s', selectId); log.verbose(error); throw new Error(`Could not select value for select with id ${selectId}`); } } /** * Selects an option in a `<select>` element by its name and the value of the option. * * @async * @param {string} selectName - The name of the `<select>` element. * @param {string} value - The value of the option to select. * @returns {Promise<void>} A promise that resolves when the option is selected. * @throws {Error} Throws an error if the `<select>` element is not found. */ async selectByNameAndValue(selectName, value) { try { const script = `const select = document.querySelector("select[name='${selectName}']"); select.value = '${value}'; select.dispatchEvent(new Event('change'));`; await this.browser.runScript(script, 'CUSTOM'); } catch (error) { log.error('Could not select value for select with name %s', selectName); log.verbose(error); throw new Error( `Could not select value for select with name ${selectName}` ); } } /** * Selects an option in a `<select>` element by its ID and the index of the option. * * @async * @param {string} selectId - The ID of the `<select>` element. * @param {number} index - The index of the option to select. * @returns {Promise<void>} A promise that resolves when the option is selected. * @throws {Error} Throws an error if the `<select>` element is not found. */ async selectByIdAndIndex(selectId, index) { try { const script = `const select = document.getElementById('${selectId}'); select.selectedIndex = ${index};select.dispatchEvent(new Event('change'));`; const value = await this.browser.runScript(script, 'CUSTOM'); return value; } catch (error) { log.error( 'Could not select value for select with id %s by index', selectId ); log.verbose(error); throw new Error(`Could not select value for select with id ${selectId}`); } } /** * Selects an option in a `<select>` element by its name and the index of the option. * * @async * @param {string} selectName - The name of the `<select>` element. * @param {number} index - The index of the option to select. * @returns {Promise<void>} A promise that resolves when the option is selected. * @throws {Error} Throws an error if the `<select>` element is not found. */ async selectByNameAndIndex(selectName, index) { try { const script = `const select = document.querySelector("select[name='${selectName}']"); select.selectedIndex = ${index};select.dispatchEvent(new Event('change'));`; const value = await this.browser.runScript(script, 'CUSTOM'); return value; } catch (error) { log.error( 'Could not select value for select with name %s by index', selectName ); log.verbose(error); throw new Error(`Could not select value for select name ${selectName}`); } } /** * Deselects all options in a `<select>` element by its ID. * * @async * @param {string} selectId - The ID of the `<select>` element. * @returns {Promise<void>} A promise that resolves when all options are deselected. * @throws {Error} Throws an error if the `<select>` element is not found. */ async deselectById(selectId) { try { const script = `const select = document.getElementById('${selectId}'); select.selectedIndex = -1;select.dispatchEvent(new Event('change'));`; const value = await this.browser.runScript(script, 'CUSTOM'); return value; } catch (error) { log.error('Could not deleselect by select id %s', selectId); log.verbose(error); throw new Error(`Could not deleselect by select id ${selectId}`); } } /** * Retrieves all option values in a `<select>` element by its ID. * * @async * @param {string} selectId - The ID of the `<select>` element. * @returns {Promise<string[]>} A promise that resolves with an array of the values of the options. * @throws {Error} Throws an error if the `<select>` element is not found. */ async getValuesById(selectId) { const script = `const select = document.getElementById('${selectId}'); const values = []; for (let option of select.options) { values.push(option.value); } return values; `; try { const value = await this.browser.runScript(script, 'CUSTOM'); return value; } catch (error) { log.error('Could not get select options for id %s', selectId); log.verbose(error); throw new Error(`Could not get select options for id ${selectId}`); } } /** * Retrieves the value of the selected option in a `<select>` element by its ID. * * @async * @param {string} selectId - The ID of the `<select>` element. * @returns {Promise<string>} A promise that resolves with the value of the selected option. * @throws {Error} Throws an error if the `<select>` element is not found. */ async getSelectedValueById(selectId) { try { const script = `const select = document.getElementById('${selectId}'); return select.options[select.selectedIndex].value;`; const value = await this.browser.runScript(script, 'CUSTOM'); return value; } catch (error) { log.error('Could not select value for select with id %s', selectId); log.verbose(error); throw new Error(`Could not select value for select with id ${selectId}`); } } }