browsertime 16.17.0 → 17.0.0-beta.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +44 -0
- package/bin/browsertime.js +43 -43
- package/bin/browsertimeWebPageReplay.js +10 -9
- package/browserscripts/pageinfo/generator.js +1 -1
- package/index.js +14 -13
- package/lib/android/gnirehtet.js +14 -15
- package/lib/android/index.js +92 -89
- package/lib/android/root.js +6 -9
- package/lib/chrome/chromeDevtoolsProtocol.js +46 -45
- package/lib/chrome/har.js +12 -13
- package/lib/chrome/longTaskMetrics.js +3 -5
- package/lib/chrome/parseCpuTrace.js +13 -10
- package/lib/chrome/settings/chromeAndroidOptions.js +1 -3
- package/lib/chrome/settings/chromeDesktopOptions.js +1 -3
- package/lib/chrome/settings/traceCategories.js +1 -3
- package/lib/chrome/traceCategoriesParser.js +35 -36
- package/lib/chrome/webdriver/builder.js +18 -26
- package/lib/chrome/webdriver/chromium.js +56 -46
- package/lib/chrome/webdriver/setupChromiumOptions.js +32 -27
- package/lib/connectivity/humble.js +13 -14
- package/lib/connectivity/index.js +74 -77
- package/lib/connectivity/trafficShapeParser.js +31 -35
- package/lib/core/engine/collector.js +22 -22
- package/lib/core/engine/command/addText.js +24 -27
- package/lib/core/engine/command/android.js +7 -11
- package/lib/core/engine/command/cache.js +3 -4
- package/lib/core/engine/command/chromeDevToolsProtocol.js +20 -20
- package/lib/core/engine/command/click.js +48 -49
- package/lib/core/engine/command/debug.js +3 -4
- package/lib/core/engine/command/javaScript.js +18 -19
- package/lib/core/engine/command/measure.js +31 -37
- package/lib/core/engine/command/meta.js +1 -4
- package/lib/core/engine/command/mouse/clickAndHold.js +36 -39
- package/lib/core/engine/command/mouse/contextClick.js +17 -18
- package/lib/core/engine/command/mouse/doubleClick.js +17 -19
- package/lib/core/engine/command/mouse/index.js +5 -9
- package/lib/core/engine/command/mouse/mouseMove.js +19 -23
- package/lib/core/engine/command/mouse/singleClick.js +15 -19
- package/lib/core/engine/command/navigation.js +12 -14
- package/lib/core/engine/command/screenshot.js +1 -4
- package/lib/core/engine/command/scroll.js +4 -7
- package/lib/core/engine/command/select.js +26 -26
- package/lib/core/engine/command/set.js +25 -23
- package/lib/core/engine/command/stopWatch.js +5 -8
- package/lib/core/engine/command/switch.js +18 -20
- package/lib/core/engine/command/util/lcpHighlightScript.js +1 -2
- package/lib/core/engine/command/util/lsHighlightScript.js +1 -2
- package/lib/core/engine/command/wait.js +18 -18
- package/lib/core/engine/index.js +81 -71
- package/lib/core/engine/iteration.js +83 -79
- package/lib/core/engine/run.js +5 -9
- package/lib/core/pageCompleteChecks/defaultPageCompleteCheck.js +1 -2
- package/lib/core/pageCompleteChecks/pageCompleteCheckByInactivity.js +1 -3
- package/lib/core/pageCompleteChecks/spaInactivity.js +1 -3
- package/lib/core/seleniumRunner.js +92 -100
- package/lib/core/webdriver/index.js +24 -21
- package/lib/edge/webdriver/builder.js +21 -26
- package/lib/extensionserver/httpServer.js +17 -21
- package/lib/extensionserver/index.js +8 -12
- package/lib/extensionserver/setup.js +12 -12
- package/lib/firefox/geckoProfiler.js +27 -21
- package/lib/firefox/getHAR.js +7 -8
- package/lib/firefox/memoryReport.js +9 -11
- package/lib/firefox/perfStats.js +5 -7
- package/lib/firefox/settings/disableSafeBrowsingPreferences.js +1 -3
- package/lib/firefox/settings/disableTrackingProtectionPreferences.js +1 -3
- package/lib/firefox/settings/firefoxPreferences.js +2 -4
- package/lib/firefox/settings/geckoProfilerDefaults.js +5 -9
- package/lib/firefox/webdriver/builder.js +66 -63
- package/lib/firefox/webdriver/firefox.js +43 -48
- package/lib/safari/webdriver/builder.js +4 -5
- package/lib/safari/webdriver/safari.js +4 -8
- package/lib/screenshot/defaults.js +1 -3
- package/lib/screenshot/index.js +24 -21
- package/lib/support/browserScript.js +65 -56
- package/lib/support/cli.js +120 -87
- package/lib/support/dns.js +6 -7
- package/lib/support/engineUtils.js +85 -38
- package/lib/support/errors.js +4 -13
- package/lib/support/fileUtil.js +81 -68
- package/lib/support/filters.js +15 -20
- package/lib/support/getViewPort.js +6 -7
- package/lib/support/har/index.js +208 -216
- package/lib/support/images/index.js +54 -26
- package/lib/support/logging.js +20 -17
- package/lib/support/pathToFolder.js +18 -23
- package/lib/support/preURL.js +5 -6
- package/lib/support/processes.js +4 -6
- package/lib/support/setResourceTimingBufferSize.js +2 -4
- package/lib/support/statistics.js +58 -56
- package/lib/support/stop.js +7 -8
- package/lib/support/storageManager.js +44 -44
- package/lib/support/tcpdump.js +22 -16
- package/lib/support/userTiming.js +7 -13
- package/lib/support/util.js +204 -224
- package/lib/support/xvfb.js +11 -13
- package/lib/video/defaults.js +6 -10
- package/lib/video/postprocessing/finetune/addTextToVideo.js +15 -15
- package/lib/video/postprocessing/finetune/convertFps.js +14 -8
- package/lib/video/postprocessing/finetune/getFont.js +7 -9
- package/lib/video/postprocessing/finetune/getTimingMetrics.js +19 -18
- package/lib/video/postprocessing/finetune/index.js +40 -36
- package/lib/video/postprocessing/finetune/removeOrange.js +10 -11
- package/lib/video/postprocessing/visualmetrics/extraMetrics.js +17 -13
- package/lib/video/postprocessing/visualmetrics/getVideoMetrics.js +12 -13
- package/lib/video/postprocessing/visualmetrics/visualMetrics.js +117 -128
- package/lib/video/screenRecording/android/recorder.js +12 -17
- package/lib/video/screenRecording/desktop/convert.js +13 -11
- package/lib/video/screenRecording/desktop/desktopRecorder.js +29 -24
- package/lib/video/screenRecording/desktop/ffmpegRecorder.js +60 -63
- package/lib/video/screenRecording/desktop/osx/getSPDisplaysDataType.js +4 -6
- package/lib/video/screenRecording/desktop/osx/getScreen.js +9 -10
- package/lib/video/screenRecording/firefox/firefoxWindowRecorder.js +54 -54
- package/lib/video/screenRecording/ios/convertToMp4.js +10 -11
- package/lib/video/screenRecording/ios/iosRecorder.js +23 -21
- package/lib/video/screenRecording/iosSimulator/convertToMp4.js +10 -11
- package/lib/video/screenRecording/iosSimulator/recorder.js +10 -9
- package/lib/video/screenRecording/recorder.js +8 -9
- package/lib/video/screenRecording/setOrangeBackground.js +5 -6
- package/lib/video/video.js +28 -34
- package/package.json +19 -17
|
@@ -1,9 +1,8 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
const
|
|
6
|
-
const log = require('intel').getLogger('browsertime.connectivity.humble');
|
|
1
|
+
import http from 'node:http';
|
|
2
|
+
import https from 'node:https';
|
|
3
|
+
import get from 'lodash.get';
|
|
4
|
+
import intel from 'intel';
|
|
5
|
+
const log = intel.getLogger('browsertime.connectivity.humble');
|
|
7
6
|
|
|
8
7
|
class Humble {
|
|
9
8
|
constructor(options) {
|
|
@@ -12,12 +11,12 @@ class Humble {
|
|
|
12
11
|
}
|
|
13
12
|
|
|
14
13
|
async start(profile) {
|
|
15
|
-
const
|
|
14
|
+
const library = this.url.startsWith('https') ? https : http;
|
|
16
15
|
const res = await new Promise(resolve => {
|
|
17
16
|
if (this.profile !== 'custom') {
|
|
18
|
-
|
|
17
|
+
library.get(`${this.url}/api/${this.profile}`, resolve);
|
|
19
18
|
} else {
|
|
20
|
-
|
|
19
|
+
library.get(
|
|
21
20
|
`${this.url}/api/custom?up=${profile.up}&down=${profile.down}&rtt=${profile.rtt}`,
|
|
22
21
|
resolve
|
|
23
22
|
);
|
|
@@ -27,7 +26,7 @@ class Humble {
|
|
|
27
26
|
let data = await new Promise((resolve, reject) => {
|
|
28
27
|
let data = '';
|
|
29
28
|
res.on('data', chunk => (data += chunk));
|
|
30
|
-
res.on('error',
|
|
29
|
+
res.on('error', error => reject(error));
|
|
31
30
|
res.on('end', () => resolve(data));
|
|
32
31
|
});
|
|
33
32
|
|
|
@@ -39,15 +38,15 @@ class Humble {
|
|
|
39
38
|
}
|
|
40
39
|
|
|
41
40
|
async stop() {
|
|
42
|
-
const
|
|
41
|
+
const library = this.url.startsWith('https') ? https : http;
|
|
43
42
|
const res = await new Promise(resolve => {
|
|
44
|
-
|
|
43
|
+
library.get(`${this.url}/api/stop`, resolve);
|
|
45
44
|
});
|
|
46
45
|
|
|
47
46
|
let data = await new Promise((resolve, reject) => {
|
|
48
47
|
let data = '';
|
|
49
48
|
res.on('data', chunk => (data += chunk));
|
|
50
|
-
res.on('error',
|
|
49
|
+
res.on('error', error => reject(error));
|
|
51
50
|
res.on('end', () => resolve(data));
|
|
52
51
|
});
|
|
53
52
|
|
|
@@ -59,4 +58,4 @@ class Humble {
|
|
|
59
58
|
}
|
|
60
59
|
}
|
|
61
60
|
|
|
62
|
-
|
|
61
|
+
export default Humble;
|
|
@@ -1,11 +1,14 @@
|
|
|
1
|
-
|
|
1
|
+
import get from 'lodash.get';
|
|
2
|
+
import intel from 'intel';
|
|
3
|
+
import {
|
|
4
|
+
start as throttleStart,
|
|
5
|
+
stop as throttleStop
|
|
6
|
+
} from '@sitespeed.io/throttle';
|
|
7
|
+
const log = intel.getLogger('browsertime.connectivity');
|
|
8
|
+
import Humble from './humble.js';
|
|
9
|
+
import { parseTrafficShapeConfig } from './trafficShapeParser.js';
|
|
2
10
|
|
|
3
|
-
|
|
4
|
-
const get = require('lodash.get');
|
|
5
|
-
const log = require('intel').getLogger('browsertime.connectivity');
|
|
6
|
-
const Humble = require('./humble');
|
|
7
|
-
|
|
8
|
-
let humble = null;
|
|
11
|
+
let humble;
|
|
9
12
|
|
|
10
13
|
// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/random
|
|
11
14
|
function getRandomIntInclusive(min, max) {
|
|
@@ -14,89 +17,83 @@ function getRandomIntInclusive(min, max) {
|
|
|
14
17
|
return Math.floor(Math.random() * (max - min + 1)) + min;
|
|
15
18
|
}
|
|
16
19
|
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
20
|
+
export async function addConnectivity(options) {
|
|
21
|
+
const profile = parseTrafficShapeConfig(options);
|
|
22
|
+
if (!profile) {
|
|
23
|
+
return;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
const connectivity = options.connectivity;
|
|
27
|
+
switch (connectivity.engine) {
|
|
28
|
+
case 'external': {
|
|
21
29
|
return;
|
|
22
30
|
}
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
}
|
|
29
|
-
case 'throttle': {
|
|
30
|
-
if (!options.docker) {
|
|
31
|
-
// The log message is confusing if you run in Docker since
|
|
32
|
-
// there's nothing you can do about it
|
|
33
|
-
if (options.connectivity && options.connectivity.profile) {
|
|
34
|
-
log.info(
|
|
35
|
-
'Changing network interfaces needs sudo rights. Setting connectivity profile %s',
|
|
36
|
-
options.connectivity.profile
|
|
37
|
-
);
|
|
38
|
-
} else {
|
|
39
|
-
log.info('Changing network interfaces needs sudo rights.');
|
|
40
|
-
}
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
const setOnLocalHost = get(connectivity, 'throttle.localhost', false);
|
|
44
|
-
const rtt = profile.variance
|
|
45
|
-
? getRandomIntInclusive(
|
|
46
|
-
profile.rtt,
|
|
47
|
-
Math.ceil(profile.rtt * (profile.variance / 100 + 1))
|
|
48
|
-
)
|
|
49
|
-
: profile.rtt;
|
|
50
|
-
if (profile.variance) {
|
|
31
|
+
case 'throttle': {
|
|
32
|
+
if (!options.docker) {
|
|
33
|
+
// The log message is confusing if you run in Docker since
|
|
34
|
+
// there's nothing you can do about it
|
|
35
|
+
if (options.connectivity && options.connectivity.profile) {
|
|
51
36
|
log.info(
|
|
52
|
-
'
|
|
53
|
-
profile
|
|
54
|
-
rtt,
|
|
55
|
-
profile.rtt
|
|
37
|
+
'Changing network interfaces needs sudo rights. Setting connectivity profile %s',
|
|
38
|
+
options.connectivity.profile
|
|
56
39
|
);
|
|
40
|
+
} else {
|
|
41
|
+
log.info('Changing network interfaces needs sudo rights.');
|
|
57
42
|
}
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
const setOnLocalHost = get(connectivity, 'throttle.localhost', false);
|
|
46
|
+
const rtt = profile.variance
|
|
47
|
+
? getRandomIntInclusive(
|
|
48
|
+
profile.rtt,
|
|
49
|
+
Math.ceil(profile.rtt * (profile.variance / 100 + 1))
|
|
50
|
+
)
|
|
51
|
+
: profile.rtt;
|
|
52
|
+
if (profile.variance) {
|
|
53
|
+
log.info(
|
|
54
|
+
'Using random variance %s% setting the latency to %s (configured %s)',
|
|
55
|
+
profile.variance,
|
|
56
|
+
rtt,
|
|
57
|
+
profile.rtt
|
|
58
|
+
);
|
|
59
|
+
}
|
|
60
|
+
return setOnLocalHost
|
|
61
|
+
? throttleStart({
|
|
61
62
|
localhost: true,
|
|
62
63
|
rtt
|
|
63
|
-
})
|
|
64
|
-
|
|
65
|
-
return throttle.start({
|
|
64
|
+
})
|
|
65
|
+
: throttleStart({
|
|
66
66
|
up: profile.up,
|
|
67
67
|
down: profile.down,
|
|
68
68
|
rtt
|
|
69
69
|
});
|
|
70
|
-
}
|
|
71
|
-
}
|
|
72
|
-
case 'humble': {
|
|
73
|
-
humble = new Humble(options);
|
|
74
|
-
return humble.start(profile);
|
|
75
|
-
}
|
|
76
70
|
}
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
},
|
|
81
|
-
async removeConnectivity(options) {
|
|
82
|
-
const profile = trafficShapeParser.parseTrafficShapeConfig(options);
|
|
83
|
-
if (!profile) {
|
|
84
|
-
return;
|
|
71
|
+
case 'humble': {
|
|
72
|
+
humble = new Humble(options);
|
|
73
|
+
return humble.start(profile);
|
|
85
74
|
}
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
export function getConnectivitySettings(options) {
|
|
78
|
+
return parseTrafficShapeConfig(options);
|
|
79
|
+
}
|
|
80
|
+
export async function removeConnectivity(options) {
|
|
81
|
+
const profile = parseTrafficShapeConfig(options);
|
|
82
|
+
if (!profile) {
|
|
83
|
+
return;
|
|
84
|
+
}
|
|
86
85
|
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
return humble.stop();
|
|
99
|
-
}
|
|
86
|
+
const connectivity = options.connectivity;
|
|
87
|
+
switch (connectivity.engine) {
|
|
88
|
+
case 'external': {
|
|
89
|
+
return;
|
|
90
|
+
}
|
|
91
|
+
case 'throttle': {
|
|
92
|
+
const setOnLocalHost = get(connectivity, 'throttle.localhost', false);
|
|
93
|
+
return throttleStop({ localhost: setOnLocalHost });
|
|
94
|
+
}
|
|
95
|
+
case 'humble': {
|
|
96
|
+
return humble.stop();
|
|
100
97
|
}
|
|
101
98
|
}
|
|
102
|
-
}
|
|
99
|
+
}
|
|
@@ -1,5 +1,3 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
1
|
/* Config from throttle following WebPageTest */
|
|
4
2
|
|
|
5
3
|
const newProfiles = {
|
|
@@ -44,8 +42,8 @@ const newProfiles = {
|
|
|
44
42
|
rtt: 85
|
|
45
43
|
},
|
|
46
44
|
lte: {
|
|
47
|
-
down:
|
|
48
|
-
up:
|
|
45
|
+
down: 12_000,
|
|
46
|
+
up: 12_000,
|
|
49
47
|
rtt: 35
|
|
50
48
|
},
|
|
51
49
|
edge: {
|
|
@@ -59,7 +57,7 @@ const newProfiles = {
|
|
|
59
57
|
rtt: 60
|
|
60
58
|
},
|
|
61
59
|
fois: {
|
|
62
|
-
down:
|
|
60
|
+
down: 20_000,
|
|
63
61
|
up: 5000,
|
|
64
62
|
rtt: 2
|
|
65
63
|
}
|
|
@@ -103,37 +101,35 @@ const legacyProfiles = {
|
|
|
103
101
|
}
|
|
104
102
|
};
|
|
105
103
|
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
}
|
|
104
|
+
export function parseTrafficShapeConfig(options) {
|
|
105
|
+
if (options.connectivity && options.connectivity.profile === 'custom') {
|
|
106
|
+
return {
|
|
107
|
+
down: options.connectivity.down,
|
|
108
|
+
up: options.connectivity.up,
|
|
109
|
+
rtt: options.connectivity.rtt,
|
|
110
|
+
variance: options.connectivity.variance
|
|
111
|
+
};
|
|
112
|
+
}
|
|
116
113
|
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
114
|
+
if (options.connectivity && options.connectivity.profile) {
|
|
115
|
+
if (options.connectivity.profile === 'native') {
|
|
116
|
+
return;
|
|
117
|
+
}
|
|
121
118
|
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
}
|
|
131
|
-
return profile;
|
|
132
|
-
} else {
|
|
133
|
-
return null;
|
|
119
|
+
const profile = options.legacyConnectivityProfiles
|
|
120
|
+
? legacyProfiles[options.connectivity.profile]
|
|
121
|
+
: newProfiles[options.connectivity.profile];
|
|
122
|
+
profile.variance = options.connectivity.variance;
|
|
123
|
+
if (!profile) {
|
|
124
|
+
throw new Error(
|
|
125
|
+
`Unknown connectivity profile ${options.connectivity.profile}`
|
|
126
|
+
);
|
|
134
127
|
}
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
return
|
|
128
|
+
return profile;
|
|
129
|
+
} else {
|
|
130
|
+
return;
|
|
138
131
|
}
|
|
139
|
-
}
|
|
132
|
+
}
|
|
133
|
+
export function getProfiles() {
|
|
134
|
+
return newProfiles;
|
|
135
|
+
}
|
|
@@ -1,13 +1,15 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
const
|
|
1
|
+
import { join } from 'node:path';
|
|
2
|
+
import { createRequire } from 'node:module';
|
|
3
|
+
import get from 'lodash.get';
|
|
4
|
+
import intel from 'intel';
|
|
5
|
+
import { timestamp as _timestamp } from '../../support/engineUtils.js';
|
|
6
|
+
import { Statistics } from '../../support/statistics.js';
|
|
7
|
+
import pathToFolder from '../../support/pathToFolder.js';
|
|
8
|
+
import { getConnectivitySettings } from '../../connectivity/index.js';
|
|
9
|
+
import { formatMetric } from '../../support/util.js';
|
|
10
|
+
const require = createRequire(import.meta.url);
|
|
11
|
+
const version = require('../../../package.json').version;
|
|
12
|
+
const log = intel.getLogger('browsertime');
|
|
11
13
|
|
|
12
14
|
function getNewResult(url, options) {
|
|
13
15
|
return {
|
|
@@ -16,11 +18,11 @@ function getNewResult(url, options) {
|
|
|
16
18
|
version
|
|
17
19
|
},
|
|
18
20
|
url,
|
|
19
|
-
timestamp:
|
|
21
|
+
timestamp: _timestamp(),
|
|
20
22
|
connectivity: {
|
|
21
23
|
engine: get(options, 'connectivity.engine'),
|
|
22
24
|
profile: get(options, 'connectivity.profile'),
|
|
23
|
-
settings:
|
|
25
|
+
settings: getConnectivitySettings(options) || undefined
|
|
24
26
|
},
|
|
25
27
|
extra: JSON.parse(get(options, 'info.extra', '{}')),
|
|
26
28
|
browser: { name: options.browser }
|
|
@@ -157,9 +159,7 @@ class Collector {
|
|
|
157
159
|
url = this.aliasAndUrl[alias];
|
|
158
160
|
}
|
|
159
161
|
|
|
160
|
-
const results = this.allResults[url]
|
|
161
|
-
? this.allResults[url]
|
|
162
|
-
: getNewResult(url, this.options);
|
|
162
|
+
const results = this.allResults[url] ?? getNewResult(url, this.options);
|
|
163
163
|
results.info.description = allData.description;
|
|
164
164
|
results.info.title = allData.title;
|
|
165
165
|
results.info.browser.userAgent = get(
|
|
@@ -172,9 +172,7 @@ class Collector {
|
|
|
172
172
|
results.files.screenshot.push(allData.screenshots);
|
|
173
173
|
}
|
|
174
174
|
|
|
175
|
-
const statistics = this.allStats[url]
|
|
176
|
-
? this.allStats[url]
|
|
177
|
-
: new Statistics();
|
|
175
|
+
const statistics = this.allStats[url] ?? new Statistics();
|
|
178
176
|
|
|
179
177
|
// The user can add extra data in a script or post script
|
|
180
178
|
if (data.extras) {
|
|
@@ -205,14 +203,16 @@ class Collector {
|
|
|
205
203
|
if (data.browserScripts) {
|
|
206
204
|
results.browserScripts.push(data.browserScripts);
|
|
207
205
|
// Add all browserscripts to the stats
|
|
206
|
+
const equals = (a1, a2) => JSON.stringify(a1) === JSON.stringify(a2);
|
|
208
207
|
statistics.addDeep(data.browserScripts, (keyPath, value) => {
|
|
209
|
-
const equals = (a1, a2) => JSON.stringify(a1) === JSON.stringify(a2);
|
|
210
208
|
if (equals(keyPath.slice(-2), ['userTimings', 'marks'])) {
|
|
209
|
+
// eslint-disable-next-line unicorn/no-array-reduce
|
|
211
210
|
return value.reduce((result, mark) => {
|
|
212
211
|
result[mark.name] = mark.startTime;
|
|
213
212
|
return result;
|
|
214
213
|
}, {});
|
|
215
214
|
} else if (equals(keyPath.slice(-2), ['userTimings', 'measures'])) {
|
|
215
|
+
// eslint-disable-next-line unicorn/no-array-reduce
|
|
216
216
|
return value.reduce((result, mark) => {
|
|
217
217
|
result[mark.name] = mark.duration;
|
|
218
218
|
return result;
|
|
@@ -343,7 +343,7 @@ class Collector {
|
|
|
343
343
|
}
|
|
344
344
|
for (let key of Object.keys(data.visualMetrics)) {
|
|
345
345
|
// Skip VisualProgress/ContentfulProgress etc
|
|
346
|
-
if (key.
|
|
346
|
+
if (!key.includes('Progress')) {
|
|
347
347
|
const d = { visualMetrics: {} };
|
|
348
348
|
d['visualMetrics'][key] = data.visualMetrics[key];
|
|
349
349
|
statistics.addDeep(d);
|
|
@@ -467,7 +467,7 @@ class Collector {
|
|
|
467
467
|
for (let filename of Object.keys(data.extraJson)) {
|
|
468
468
|
extraWork.push(
|
|
469
469
|
this.storageManager.writeJson(
|
|
470
|
-
|
|
470
|
+
join(pathToFolder(url, this.options), filename),
|
|
471
471
|
data.extraJson[filename],
|
|
472
472
|
true
|
|
473
473
|
)
|
|
@@ -521,4 +521,4 @@ class Collector {
|
|
|
521
521
|
}
|
|
522
522
|
}
|
|
523
523
|
|
|
524
|
-
|
|
524
|
+
export default Collector;
|
|
@@ -1,7 +1,6 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
const
|
|
4
|
-
const log = require('intel').getLogger('browsertime.command.addText');
|
|
1
|
+
import { By } from 'selenium-webdriver';
|
|
2
|
+
import intel from 'intel';
|
|
3
|
+
const log = intel.getLogger('browsertime.command.addText');
|
|
5
4
|
|
|
6
5
|
class AddText {
|
|
7
6
|
constructor(browser) {
|
|
@@ -19,14 +18,14 @@ class AddText {
|
|
|
19
18
|
async byId(text, id) {
|
|
20
19
|
const driver = this.browser.getDriver();
|
|
21
20
|
try {
|
|
22
|
-
const element = await driver.findElement(
|
|
21
|
+
const element = await driver.findElement(By.id(id));
|
|
23
22
|
// make sure we clear it
|
|
24
23
|
await element.clear();
|
|
25
24
|
return element.sendKeys(text);
|
|
26
|
-
} catch (
|
|
25
|
+
} catch (error) {
|
|
27
26
|
log.error('Could not add text %s to id %s', text, id);
|
|
28
|
-
log.verbose(
|
|
29
|
-
throw Error(`Could not add text ${text} to id ${id}`);
|
|
27
|
+
log.verbose(error);
|
|
28
|
+
throw new Error(`Could not add text ${text} to id ${id}`);
|
|
30
29
|
}
|
|
31
30
|
}
|
|
32
31
|
|
|
@@ -41,14 +40,14 @@ class AddText {
|
|
|
41
40
|
async byXpath(text, xpath) {
|
|
42
41
|
const driver = this.browser.getDriver();
|
|
43
42
|
try {
|
|
44
|
-
const element = await driver.findElement(
|
|
43
|
+
const element = await driver.findElement(By.xpath(xpath));
|
|
45
44
|
// make sure we clear it
|
|
46
45
|
await element.clear();
|
|
47
46
|
return element.sendKeys(text);
|
|
48
|
-
} catch (
|
|
47
|
+
} catch (error) {
|
|
49
48
|
log.error('Could not add text %s to xpath %s', text, xpath);
|
|
50
|
-
log.verbose(
|
|
51
|
-
throw Error(`Could not add text ${text} to xpath ${xpath}`);
|
|
49
|
+
log.verbose(error);
|
|
50
|
+
throw new Error(`Could not add text ${text} to xpath ${xpath}`);
|
|
52
51
|
}
|
|
53
52
|
}
|
|
54
53
|
|
|
@@ -63,14 +62,14 @@ class AddText {
|
|
|
63
62
|
async bySelector(text, selector) {
|
|
64
63
|
const driver = this.browser.getDriver();
|
|
65
64
|
try {
|
|
66
|
-
const element = await driver.findElement(
|
|
65
|
+
const element = await driver.findElement(By.css(selector));
|
|
67
66
|
// make sure we clear it
|
|
68
67
|
await element.clear();
|
|
69
68
|
return element.sendKeys(text);
|
|
70
|
-
} catch (
|
|
69
|
+
} catch (error) {
|
|
71
70
|
log.error('Could not add text %s to selector %s', text, selector);
|
|
72
|
-
log.verbose(
|
|
73
|
-
throw Error(`Could not add text ${text} to selector ${selector}`);
|
|
71
|
+
log.verbose(error);
|
|
72
|
+
throw new Error(`Could not add text ${text} to selector ${selector}`);
|
|
74
73
|
}
|
|
75
74
|
}
|
|
76
75
|
|
|
@@ -85,16 +84,14 @@ class AddText {
|
|
|
85
84
|
async byClassName(text, className) {
|
|
86
85
|
const driver = this.browser.getDriver();
|
|
87
86
|
try {
|
|
88
|
-
const element = await driver.findElement(
|
|
89
|
-
webdriver.By.className(className)
|
|
90
|
-
);
|
|
87
|
+
const element = await driver.findElement(By.className(className));
|
|
91
88
|
// make sure we clear it
|
|
92
89
|
await element.clear();
|
|
93
90
|
return element.sendKeys(text);
|
|
94
|
-
} catch (
|
|
91
|
+
} catch (error) {
|
|
95
92
|
log.error('Could not add text %s to class name %s', text, className);
|
|
96
|
-
log.verbose(
|
|
97
|
-
throw Error(`Could not add text ${text} to class name ${className}`);
|
|
93
|
+
log.verbose(error);
|
|
94
|
+
throw new Error(`Could not add text ${text} to class name ${className}`);
|
|
98
95
|
}
|
|
99
96
|
}
|
|
100
97
|
|
|
@@ -109,15 +106,15 @@ class AddText {
|
|
|
109
106
|
async byName(text, name) {
|
|
110
107
|
const driver = this.browser.getDriver();
|
|
111
108
|
try {
|
|
112
|
-
const element = await driver.findElement(
|
|
109
|
+
const element = await driver.findElement(By.name(name));
|
|
113
110
|
// make sure we clear it
|
|
114
111
|
await element.clear();
|
|
115
112
|
return element.sendKeys(text);
|
|
116
|
-
} catch (
|
|
113
|
+
} catch (error) {
|
|
117
114
|
log.error('Could not add text %s to name attribute %s', text, name);
|
|
118
|
-
log.verbose(
|
|
119
|
-
throw Error(`Could not add text ${text} to name attribute ${name}`);
|
|
115
|
+
log.verbose(error);
|
|
116
|
+
throw new Error(`Could not add text ${text} to name attribute ${name}`);
|
|
120
117
|
}
|
|
121
118
|
}
|
|
122
119
|
}
|
|
123
|
-
|
|
120
|
+
export default AddText;
|
|
@@ -1,9 +1,7 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
const log =
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
class AndroidCommand {
|
|
1
|
+
import intel from 'intel';
|
|
2
|
+
import { Android, isAndroidConfigured } from '../../../android/index.js';
|
|
3
|
+
const log = intel.getLogger('browsertime.command.android');
|
|
4
|
+
export default class AndroidCommand {
|
|
7
5
|
constructor(options) {
|
|
8
6
|
this.options = options;
|
|
9
7
|
}
|
|
@@ -20,12 +18,10 @@ class AndroidCommand {
|
|
|
20
18
|
try {
|
|
21
19
|
this.a = new Android(this.options);
|
|
22
20
|
return this.a._runCommandAndGet(command);
|
|
23
|
-
} catch (
|
|
24
|
-
log.error('Could not run shell command %s', command,
|
|
25
|
-
throw Error(`Could not run Android shell commmand ${command}`);
|
|
21
|
+
} catch (error) {
|
|
22
|
+
log.error('Could not run shell command %s', command, error);
|
|
23
|
+
throw new Error(`Could not run Android shell commmand ${command}`);
|
|
26
24
|
}
|
|
27
25
|
} else throw new Error('Android is not configured');
|
|
28
26
|
}
|
|
29
27
|
}
|
|
30
|
-
|
|
31
|
-
module.exports = AndroidCommand;
|
|
@@ -1,6 +1,5 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
const log = require('intel').getLogger('browsertime.command.cache');
|
|
1
|
+
import intel from 'intel';
|
|
2
|
+
const log = intel.getLogger('browsertime.command.cache');
|
|
4
3
|
class Cache {
|
|
5
4
|
constructor(browser, browserName, extensionServer, cdp) {
|
|
6
5
|
this.browser = browser;
|
|
@@ -46,4 +45,4 @@ class Cache {
|
|
|
46
45
|
}
|
|
47
46
|
}
|
|
48
47
|
}
|
|
49
|
-
|
|
48
|
+
export default Cache;
|