@luminati-io/webdriverio8
Version:
Next-gen browser and mobile automation test framework for Node.js
146 lines (145 loc) • 8.8 kB
JavaScript
/**
* 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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