UNPKG

@luminati-io/webdriverio8

Version:

Next-gen browser and mobile automation test framework for Node.js

146 lines (145 loc) 8.8 kB
/** * Throttle the network capabilities of the browser. This can help to * emulate certain scenarios where a user loses their internet connection * and your app needs to address that. * * There are many presets available with default configurations for ease of use. * They are `offline`, `GPRS`, `Regular2G`, `Good2G`, `Regular3G`, `Good3G`, * `Regular4G`, `DSL`, `WiFi`, `online`. * * You can see the values for these presets [in the source code](https://github.com/webdriverio/webdriverio/blob/6824e4eb118a8d20685f12f4bc42f13fd56f8a25/packages/webdriverio/src/commands/browser/throttleNetwork.js#L29). * * :::info * * Note that using the `throttleNetwork` command requires support for Chrome DevTools protocol and e.g. * can not be used when running automated tests in the cloud. Find out more in the * [Automation Protocols](/docs/automationProtocols) section. * * ::: * * <example> :throttleNetwork.js it('should throttle the network', async () => { // via static string preset await browser.throttleNetwork('Regular3G') // via custom values await browser.throttleNetwork({ offline: false, downloadThroughput: 200 * 1024 / 8, uploadThroughput: 200 * 1024 / 8, latency: 20 }) }); * </example> * * @alias browser.throttleNetwork * @param {ThrottleOptions} params parameters for throttling * @param {boolean} params.offline True to emulate internet disconnection. * @param {number} params.latency Minimum latency from request sent to response headers received (ms). * @param {number} params.downloadThroughput Maximal aggregated download throughput (bytes/sec). -1 disables download throttling. * @param {number} params.uploadThroughput Maximal aggregated upload throughput (bytes/sec). -1 disables upload throttling. * @type utility * */ import { getBrowserObject } from '../../utils/index.js'; const NETWORK_PRESETS = { 'offline': { offline: true, downloadThroughput: 0, uploadThroughput: 0, latency: 1 }, 'GPRS': { offline: false, downloadThroughput: 50 * 1024 / 8, uploadThroughput: 20 * 1024 / 8, latency: 500 }, 'Regular2G': { offline: false, downloadThroughput: 250 * 1024 / 8, uploadThroughput: 50 * 1024 / 8, latency: 300 }, 'Good2G': { offline: false, downloadThroughput: 450 * 1024 / 8, uploadThroughput: 150 * 1024 / 8, latency: 150 }, 'Regular3G': { offline: false, downloadThroughput: 750 * 1024 / 8, uploadThroughput: 250 * 1024 / 8, latency: 100 }, 'Good3G': { offline: false, downloadThroughput: 1.5 * 1024 * 1024 / 8, uploadThroughput: 750 * 1024 / 8, latency: 40 }, 'Regular4G': { offline: false, downloadThroughput: 4 * 1024 * 1024 / 8, uploadThroughput: 3 * 1024 * 1024 / 8, latency: 20 }, 'DSL': { offline: false, downloadThroughput: 2 * 1024 * 1024 / 8, uploadThroughput: 1 * 1024 * 1024 / 8, latency: 5 }, 'WiFi': { offline: false, downloadThroughput: 30 * 1024 * 1024 / 8, uploadThroughput: 15 * 1024 * 1024 / 8, latency: 2 }, 'online': { offline: false, latency: 0, downloadThroughput: -1, uploadThroughput: -1 } }; const NETWORK_PRESET_TYPES = Object.keys(NETWORK_PRESETS); export async function throttleNetwork(params) { if ( /** * check string parameter */ (typeof params !== 'string' || !NETWORK_PRESET_TYPES.includes(params)) && /** * check object parameter */ (typeof params !== 'object')) { throw new Error(`Invalid parameter for "throttleNetwork". Expected it to be typeof object or one of the following values: ${NETWORK_PRESET_TYPES.join(', ')} but found "${params}"`); } /** * use WebDriver extension if connected with cloud service */ if (this.isSauce) { const browser = getBrowserObject(this); await browser.sauceThrottleNetwork(params); return null; } const failedConnectionMessage = 'No Puppeteer connection could be established which is required to use this command'; // Connect to Chrome DevTools await this.getPuppeteer(); if (!this.puppeteer) { throw new Error(failedConnectionMessage); } const pages = await this.puppeteer.pages(); if (!pages.length) { throw new Error(failedConnectionMessage); } const client = await pages[0].target().createCDPSession(); // Set throttling property await client.send('Network.emulateNetworkConditions', typeof params === 'string' ? NETWORK_PRESETS[params] : params); return null; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGhyb3R0bGVOZXR3b3JrLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2NvbW1hbmRzL2Jyb3dzZXIvdGhyb3R0bGVOZXR3b3JrLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBMkNHO0FBQ0gsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sc0JBQXNCLENBQUE7QUFHdkQsTUFBTSxlQUFlLEdBQUc7SUFDcEIsU0FBUyxFQUFFO1FBQ1AsT0FBTyxFQUFFLElBQUk7UUFDYixrQkFBa0IsRUFBRSxDQUFDO1FBQ3JCLGdCQUFnQixFQUFFLENBQUM7UUFDbkIsT0FBTyxFQUFFLENBQUM7S0FDYjtJQUNELE1BQU0sRUFBRTtRQUNKLE9BQU8sRUFBRSxLQUFLO1FBQ2Qsa0JBQWtCLEVBQUUsRUFBRSxHQUFHLElBQUksR0FBRyxDQUFDO1FBQ2pDLGdCQUFnQixFQUFFLEVBQUUsR0FBRyxJQUFJLEdBQUcsQ0FBQztRQUMvQixPQUFPLEVBQUUsR0FBRztLQUNmO0lBQ0QsV0FBVyxFQUFFO1FBQ1QsT0FBTyxFQUFFLEtBQUs7UUFDZCxrQkFBa0IsRUFBRSxHQUFHLEdBQUcsSUFBSSxHQUFHLENBQUM7UUFDbEMsZ0JBQWdCLEVBQUUsRUFBRSxHQUFHLElBQUksR0FBRyxDQUFDO1FBQy9CLE9BQU8sRUFBRSxHQUFHO0tBQ2Y7SUFDRCxRQUFRLEVBQUU7UUFDTixPQUFPLEVBQUUsS0FBSztRQUNkLGtCQUFrQixFQUFFLEdBQUcsR0FBRyxJQUFJLEdBQUcsQ0FBQztRQUNsQyxnQkFBZ0IsRUFBRSxHQUFHLEdBQUcsSUFBSSxHQUFHLENBQUM7UUFDaEMsT0FBTyxFQUFFLEdBQUc7S0FDZjtJQUNELFdBQVcsRUFBRTtRQUNULE9BQU8sRUFBRSxLQUFLO1FBQ2Qsa0JBQWtCLEVBQUUsR0FBRyxHQUFHLElBQUksR0FBRyxDQUFDO1FBQ2xDLGdCQUFnQixFQUFF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