UNPKG

qape

Version:

Monkey testing library

139 lines (115 loc) 3.92 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; /** * Useful helpers that can be used by any action */ class ActionsHelper { /** * @param {Object} config */ constructor(config) { this._config = config; } /** * Resolves when page readyState equals to one of specified states. * If the states are not equal after specified timeout, error is thrown. * @param {puppeteer.Page} page * @param {Object} [options] * @param {number} [options.timeout=30000] * @param {string[]} [options.states=[interactive,complete]] document.readyState values * @param {number} [options.checkInterval=50] */ async waitForReadyState(page, options) { let start = Date.now(); let state; options = options || { timeout: 30000, states: ['interactive', 'complete'], checkInterval: 50 }; while (Date.now() - start <= options.timeout) { state = await page.evaluate(() => document.readyState); if (options.states.includes(state)) { return; } await page.waitForTimeout(options.checkInterval); } throw Error(`Expected ready state to be one of ${options.states.join(', ')}, but it was ${state}`); } /** * Searches for all visible elements in DOM * @param {puppeteer.Page} page * @returns {Promise<puppeteer.ElementHandle[]>} Array of elements */ async getAllVisiblePageElements(page) { let visibleElements = []; let allElements = await page.$x(this._config.elementSelector); await Promise.all(allElements.map(async element => { let executionContext = await element.executionContext(); let numberOfChildren = await executionContext.evaluate(element => { return element && element.childElementCount; }, element); if (numberOfChildren > 0 || !this.isElementVisible(element)) { return; } visibleElements.push(element); })); return visibleElements; } /** * Searches for an element based on action configuration * @param {puppeteer.Page} page * @param {Object} [actionConfig={}] * @returns {Promise<puppeteer.ElementHandle>} element */ async getElement(page, actionConfig = {}) { return page.waitForXPath(actionConfig.selector); } /** * Creates a selector for the element * @param {puppeteer.ElementHandle} element * @returns {Promise<string>} selector */ async getElementSelector(element) { let executionContext = await element.executionContext(); return executionContext.evaluate(this._config.getElementSelector, element); } /** * Highlights the element in the dom by adding some styles * @param {puppeteer.ElementHandle} element * @returns {Promise} Resolves when element highlight is started */ async highlightElement(element) { let executionContext = await element.executionContext(); await executionContext.evaluate((element, timeout) => { let originalColor = element.style['color']; let originalBorder = element.style['border']; element.style['color'] = 'red'; element.style['border'] = 'solid'; setTimeout(() => { element.style['color'] = originalColor; element.style['border'] = originalBorder; }, timeout); }, element, this._config.previewModePauseTime - 250); } /** * @param {puppeteer.ElementHandle} element * @returns {Promise<string>} element.outerHTML */ async getElementHTML(element) { let executionContext = await element.executionContext(); return executionContext.evaluate(element => element.outerHTML, element); } /** * Checks if an element is visible * @param {puppeteer.ElementHandle} element * @returns {Promise<boolean>} true if an element is visible */ async isElementVisible(element) { return !!(await element.boundingBox()); } } exports.default = ActionsHelper;