UNPKG

@wdio/devtools-service

Version:

A WebdriverIO service that allows you to run Chrome DevTools commands in your tests

151 lines (150 loc) 6 kB
import InstallableManifest from 'lighthouse/lighthouse-core/audits/installable-manifest.js'; import ServiceWorker from 'lighthouse/lighthouse-core/audits/service-worker.js'; import SplashScreen from 'lighthouse/lighthouse-core/audits/splash-screen.js'; import ThemedOmnibox from 'lighthouse/lighthouse-core/audits/themed-omnibox.js'; import ContentWidth from 'lighthouse/lighthouse-core/audits/content-width.js'; import Viewport from 'lighthouse/lighthouse-core/audits/viewport.js'; import AppleTouchIcon from 'lighthouse/lighthouse-core/audits/apple-touch-icon.js'; import MaskableIcon from 'lighthouse/lighthouse-core/audits/maskable-icon.js'; import { throttling } from 'lighthouse/lighthouse-core/config/constants.js'; /** * performance tracing categories */ export const DEFAULT_TRACING_CATEGORIES = [ // Exclude default categories. We'll be selective to minimize trace size '-*', // Used instead of 'toplevel' in Chrome 71+ 'disabled-by-default-lighthouse', // Used for Cumulative Layout Shift metric 'loading', // All compile/execute events are captured by parent events in devtools.timeline.. // But the v8 category provides some nice context for only <0.5% of the trace size 'v8', // Same situation here. This category is there for RunMicrotasks only, but with other teams // accidentally excluding microtasks, we don't want to assume a parent event will always exist 'v8.execute', // For extracting UserTiming marks/measures 'blink.user_timing', // Not mandatory but not used much 'blink.console', // Most of the events we need are from these two categories 'devtools.timeline', 'disabled-by-default-devtools.timeline', // Up to 450 (https://goo.gl/rBfhn4) JPGs added to the trace 'disabled-by-default-devtools.screenshot', // This doesn't add its own events, but adds a `stackTrace` property to devtools.timeline events 'disabled-by-default-devtools.timeline.stack', // Additional categories used by devtools. Not used by Lighthouse, but included to facilitate // loading traces from Lighthouse into the Performance panel. 'disabled-by-default-devtools.timeline.frame', 'latencyInfo', // CPU sampling profiler data only enabled for debugging purposes // 'disabled-by-default-v8.cpu_profiler', // 'disabled-by-default-v8.cpu_profiler.hires', ]; /** * ignored urls in request logger */ export const IGNORED_URLS = [ 'data:,', // empty pages 'about:', // new tabs 'chrome-extension://' // all chrome extensions ]; export const FRAME_LOAD_START_TIMEOUT = 2000; export const TRACING_TIMEOUT = 15000; export const MAX_TRACE_WAIT_TIME = 45000; export const DEFAULT_NETWORK_THROTTLING_STATE = 'online'; export const DEFAULT_FORM_FACTOR = 'desktop'; export const UNSUPPORTED_ERROR_MESSAGE = ('Can\'t connect to Chrome DevTools! The @wdio/devtools-service currently only supports Chrome, Chromium and Firefox!\n\n' + 'Given that cloud vendors don\'t expose access to the Chrome DevTools Protocol this service also usually only works when ' + 'running tests locally or through a Selenium Grid (https://www.selenium.dev/documentation/grid/) v4 or higher.'); export const NETWORK_STATES = { offline: { offline: true, latency: 0, downloadThroughput: 0, uploadThroughput: 0 }, GPRS: { offline: false, downloadThroughput: 50 * 1024 / 8, uploadThroughput: 20 * 1024 / 8, latency: 500 }, 'Regular 2G': { offline: false, downloadThroughput: 250 * 1024 / 8, uploadThroughput: 50 * 1024 / 8, latency: 300 }, 'Good 2G': { offline: false, downloadThroughput: 450 * 1024 / 8, uploadThroughput: 150 * 1024 / 8, latency: 150 }, 'Regular 3G': { offline: false, latency: throttling.mobileRegular3G.requestLatencyMs, // DevTools expects throughput in bytes per second rather than kbps downloadThroughput: Math.floor(throttling.mobileRegular3G.downloadThroughputKbps * 1024 / 8), uploadThroughput: Math.floor(throttling.mobileRegular3G.uploadThroughputKbps * 1024 / 8) }, 'Good 3G': { offline: false, latency: throttling.mobileSlow4G.requestLatencyMs, // DevTools expects throughput in bytes per second rather than kbps downloadThroughput: Math.floor(throttling.mobileSlow4G.downloadThroughputKbps * 1024 / 8), uploadThroughput: Math.floor(throttling.mobileSlow4G.uploadThroughputKbps * 1024 / 8) }, 'Regular 4G': { 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 } }; export const CLICK_TRANSITION = 'click transition'; export const DEFAULT_THROTTLE_STATE = { networkThrottling: DEFAULT_NETWORK_THROTTLING_STATE, cpuThrottling: 0, cacheEnabled: false, formFactor: DEFAULT_FORM_FACTOR }; export const NETWORK_RECORDER_EVENTS = [ 'Network.requestWillBeSent', 'Network.requestServedFromCache', 'Network.responseReceived', 'Network.dataReceived', 'Network.loadingFinished', 'Network.loadingFailed', 'Network.resourceChangedPriority' ]; export const PWA_AUDITS = { isInstallable: InstallableManifest, serviceWorker: ServiceWorker, splashScreen: SplashScreen, themedOmnibox: ThemedOmnibox, contentWith: ContentWidth, viewport: Viewport, appleTouchIcon: AppleTouchIcon, maskableIcon: MaskableIcon };