browsertime 16.16.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 +52 -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 +25 -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 +93 -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 +123 -85
- 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,8 +1,8 @@
|
|
|
1
|
-
|
|
2
|
-
const log =
|
|
1
|
+
import intel from 'intel';
|
|
2
|
+
const log = intel.getLogger('browsertime.command.devtoolsprotocol');
|
|
3
3
|
|
|
4
4
|
// https://chromedevtools.github.io/devtools-protocol/
|
|
5
|
-
class
|
|
5
|
+
class DevelopmentToolsProtocol {
|
|
6
6
|
constructor(engineDelegate, browserName) {
|
|
7
7
|
this.engineDelegate = engineDelegate;
|
|
8
8
|
this.browserName = browserName;
|
|
@@ -13,14 +13,14 @@ class DevToolsProtocol {
|
|
|
13
13
|
try {
|
|
14
14
|
const client = this.engineDelegate.getCDPClient();
|
|
15
15
|
await client.on(event, f);
|
|
16
|
-
} catch (
|
|
16
|
+
} catch (error) {
|
|
17
17
|
log.error(
|
|
18
18
|
'Could not listen to DevToolsProtocol event %s with args %j',
|
|
19
19
|
event,
|
|
20
20
|
f
|
|
21
21
|
);
|
|
22
|
-
log.verbose(
|
|
23
|
-
throw Error(
|
|
22
|
+
log.verbose(error);
|
|
23
|
+
throw new Error(
|
|
24
24
|
`Could not listen to DevToolsProtocol event ${event} with args ${f}`
|
|
25
25
|
);
|
|
26
26
|
}
|
|
@@ -29,21 +29,21 @@ class DevToolsProtocol {
|
|
|
29
29
|
}
|
|
30
30
|
}
|
|
31
31
|
|
|
32
|
-
async sendAndGet(command,
|
|
32
|
+
async sendAndGet(command, arguments_) {
|
|
33
33
|
if (this.browserName === 'chrome' || this.browserName === 'edge') {
|
|
34
34
|
try {
|
|
35
35
|
const client = this.engineDelegate.getCDPClient();
|
|
36
|
-
const result = await client.send(command,
|
|
36
|
+
const result = await client.send(command, arguments_);
|
|
37
37
|
return result;
|
|
38
|
-
} catch (
|
|
38
|
+
} catch (error) {
|
|
39
39
|
log.error(
|
|
40
40
|
'Could not sendAndGet to DevToolsProtocol command %s with args %j',
|
|
41
41
|
command,
|
|
42
|
-
|
|
42
|
+
arguments_
|
|
43
43
|
);
|
|
44
|
-
log.verbose(
|
|
45
|
-
throw Error(
|
|
46
|
-
`Could not sendAndGet to DevToolsProtocol command ${command} with args ${
|
|
44
|
+
log.verbose(error);
|
|
45
|
+
throw new Error(
|
|
46
|
+
`Could not sendAndGet to DevToolsProtocol command ${command} with args ${arguments_}`
|
|
47
47
|
);
|
|
48
48
|
}
|
|
49
49
|
} else {
|
|
@@ -51,23 +51,23 @@ class DevToolsProtocol {
|
|
|
51
51
|
}
|
|
52
52
|
}
|
|
53
53
|
|
|
54
|
-
async send(command,
|
|
54
|
+
async send(command, arguments_) {
|
|
55
55
|
if (this.browserName === 'chrome' || this.browserName === 'edge') {
|
|
56
56
|
try {
|
|
57
57
|
const client = this.engineDelegate.getCDPClient();
|
|
58
|
-
return client.send(command,
|
|
59
|
-
} catch (
|
|
58
|
+
return client.send(command, arguments_);
|
|
59
|
+
} catch (error) {
|
|
60
60
|
log.error(
|
|
61
61
|
'Could not send to DevToolsProtocol command %s with args %j',
|
|
62
62
|
command,
|
|
63
|
-
|
|
63
|
+
arguments_
|
|
64
64
|
);
|
|
65
|
-
log.verbose(
|
|
66
|
-
`Could not send to DevToolsProtocol command ${command} with args ${
|
|
65
|
+
log.verbose(error);
|
|
66
|
+
`Could not send to DevToolsProtocol command ${command} with args ${arguments_}`;
|
|
67
67
|
}
|
|
68
68
|
} else {
|
|
69
69
|
throw new Error('DevToolsProtocol only supported in Chrome and Edge');
|
|
70
70
|
}
|
|
71
71
|
}
|
|
72
72
|
}
|
|
73
|
-
|
|
73
|
+
export default DevelopmentToolsProtocol;
|
|
@@ -1,6 +1,5 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
const log = require('intel').getLogger('browsertime.command.click');
|
|
1
|
+
import intel from 'intel';
|
|
2
|
+
const log = intel.getLogger('browsertime.command.click');
|
|
4
3
|
|
|
5
4
|
function addClick(js) {
|
|
6
5
|
const trimmed = js.trim();
|
|
@@ -29,10 +28,10 @@ class Click {
|
|
|
29
28
|
try {
|
|
30
29
|
const script = `document.getElementsByClassName('${className}')[0].click();`;
|
|
31
30
|
await this.browser.runScript(script, 'CUSTOM');
|
|
32
|
-
} catch (
|
|
31
|
+
} catch (error) {
|
|
33
32
|
log.error('Could not find element by class name %s', className);
|
|
34
|
-
log.verbose(
|
|
35
|
-
throw Error('Could not find element by class name ' + className);
|
|
33
|
+
log.verbose(error);
|
|
34
|
+
throw new Error('Could not find element by class name ' + className);
|
|
36
35
|
}
|
|
37
36
|
}
|
|
38
37
|
|
|
@@ -47,10 +46,10 @@ class Click {
|
|
|
47
46
|
const script = `document.getElementsByClassName('${className}')[0].click();`;
|
|
48
47
|
await this.browser.runScript(script, 'CUSTOM');
|
|
49
48
|
return this.browser.extraWait(this.pageCompleteCheck);
|
|
50
|
-
} catch (
|
|
49
|
+
} catch (error) {
|
|
51
50
|
log.error('Could not find element by class name %s', className);
|
|
52
|
-
log.verbose(
|
|
53
|
-
throw Error('Could not find element by class name ' + className);
|
|
51
|
+
log.verbose(error);
|
|
52
|
+
throw new Error('Could not find element by class name ' + className);
|
|
54
53
|
}
|
|
55
54
|
}
|
|
56
55
|
|
|
@@ -64,10 +63,10 @@ class Click {
|
|
|
64
63
|
try {
|
|
65
64
|
const xpath = `//a[text()='${text}']`;
|
|
66
65
|
return this.byXpath(xpath);
|
|
67
|
-
} catch (
|
|
66
|
+
} catch (error) {
|
|
68
67
|
log.error('Could not find link by text %s', text);
|
|
69
|
-
log.verbose(
|
|
70
|
-
throw Error('Could not find link by text ' + text);
|
|
68
|
+
log.verbose(error);
|
|
69
|
+
throw new Error('Could not find link by text ' + text);
|
|
71
70
|
}
|
|
72
71
|
}
|
|
73
72
|
|
|
@@ -81,10 +80,10 @@ class Click {
|
|
|
81
80
|
try {
|
|
82
81
|
const xpath = `//a[text()='${text}']`;
|
|
83
82
|
return this.byXpathAndWait(xpath);
|
|
84
|
-
} catch (
|
|
83
|
+
} catch (error) {
|
|
85
84
|
log.error('Could not find link with text %s', text);
|
|
86
|
-
log.verbose(
|
|
87
|
-
throw Error('Could not find link by text ' + text);
|
|
85
|
+
log.verbose(error);
|
|
86
|
+
throw new Error('Could not find link by text ' + text);
|
|
88
87
|
}
|
|
89
88
|
}
|
|
90
89
|
|
|
@@ -98,10 +97,10 @@ class Click {
|
|
|
98
97
|
try {
|
|
99
98
|
const xpath = `//a[contains(text(),'${text}')]`;
|
|
100
99
|
return this.byXpath(xpath);
|
|
101
|
-
} catch (
|
|
100
|
+
} catch (error) {
|
|
102
101
|
log.error('Could not find link by partial text %s', text);
|
|
103
|
-
log.verbose(
|
|
104
|
-
throw Error('Could not find link by partial text ' + text);
|
|
102
|
+
log.verbose(error);
|
|
103
|
+
throw new Error('Could not find link by partial text ' + text);
|
|
105
104
|
}
|
|
106
105
|
}
|
|
107
106
|
|
|
@@ -115,10 +114,10 @@ class Click {
|
|
|
115
114
|
try {
|
|
116
115
|
const xpath = `//a[contains(text(),'${text}')]`;
|
|
117
116
|
return this.byXpathAndWait(xpath);
|
|
118
|
-
} catch (
|
|
117
|
+
} catch (error) {
|
|
119
118
|
log.error('Could not find link by partial text %s', text);
|
|
120
|
-
log.verbose(
|
|
121
|
-
throw Error('Could not find link by partial text ' + text);
|
|
119
|
+
log.verbose(error);
|
|
120
|
+
throw new Error('Could not find link by partial text ' + text);
|
|
122
121
|
}
|
|
123
122
|
}
|
|
124
123
|
/**
|
|
@@ -133,10 +132,10 @@ class Click {
|
|
|
133
132
|
const replaced = xpath.replace(/"/g, "'");
|
|
134
133
|
const script = `document.evaluate("${replaced}", document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue.click();`;
|
|
135
134
|
return this.browser.runScript(script, 'CUSTOM');
|
|
136
|
-
} catch (
|
|
135
|
+
} catch (error) {
|
|
137
136
|
log.error('Could not find element by xpath %s', xpath);
|
|
138
|
-
log.verbose(
|
|
139
|
-
throw Error('Could not find element by xpath ' + xpath);
|
|
137
|
+
log.verbose(error);
|
|
138
|
+
throw new Error('Could not find element by xpath ' + xpath);
|
|
140
139
|
}
|
|
141
140
|
}
|
|
142
141
|
/**.
|
|
@@ -153,10 +152,10 @@ class Click {
|
|
|
153
152
|
const script = `document.evaluate("${replaced}", document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue.click();`;
|
|
154
153
|
await this.browser.runScript(script, 'CUSTOM');
|
|
155
154
|
return this.browser.extraWait(this.pageCompleteCheck);
|
|
156
|
-
} catch (
|
|
155
|
+
} catch (error) {
|
|
157
156
|
log.error('Could not find element by xpath %s', xpath);
|
|
158
|
-
log.verbose(
|
|
159
|
-
throw Error('Could not find element by xpath ' + xpath);
|
|
157
|
+
log.verbose(error);
|
|
158
|
+
throw new Error('Could not find element by xpath ' + xpath);
|
|
160
159
|
}
|
|
161
160
|
}
|
|
162
161
|
|
|
@@ -170,10 +169,10 @@ class Click {
|
|
|
170
169
|
try {
|
|
171
170
|
const script = addClick(js);
|
|
172
171
|
await this.browser.runScript(script, 'CUSTOM');
|
|
173
|
-
} catch (
|
|
172
|
+
} catch (error) {
|
|
174
173
|
log.error('Could not find element by JavaScript %s', js);
|
|
175
|
-
log.verbose(
|
|
176
|
-
throw Error('Could not find element by JavaScript ' + js);
|
|
174
|
+
log.verbose(error);
|
|
175
|
+
throw new Error('Could not find element by JavaScript ' + js);
|
|
177
176
|
}
|
|
178
177
|
}
|
|
179
178
|
|
|
@@ -188,10 +187,10 @@ class Click {
|
|
|
188
187
|
const script = addClick(js);
|
|
189
188
|
await this.browser.runScript(script, 'CUSTOM');
|
|
190
189
|
return this.browser.extraWait(this.pageCompleteCheck);
|
|
191
|
-
} catch (
|
|
190
|
+
} catch (error) {
|
|
192
191
|
log.error('Could not find element by JavaScript %s', js);
|
|
193
|
-
log.verbose(
|
|
194
|
-
throw Error('Could not find element by JavaScript ' + js);
|
|
192
|
+
log.verbose(error);
|
|
193
|
+
throw new Error('Could not find element by JavaScript ' + js);
|
|
195
194
|
}
|
|
196
195
|
}
|
|
197
196
|
|
|
@@ -205,10 +204,10 @@ class Click {
|
|
|
205
204
|
try {
|
|
206
205
|
const script = `document.getElementById('${id}').click();`;
|
|
207
206
|
await this.browser.runScript(script, 'CUSTOM');
|
|
208
|
-
} catch (
|
|
207
|
+
} catch (error) {
|
|
209
208
|
log.error('Could not find element by id %s', id);
|
|
210
|
-
log.verbose(
|
|
211
|
-
throw Error('Could not find element by id ' + id);
|
|
209
|
+
log.verbose(error);
|
|
210
|
+
throw new Error('Could not find element by id ' + id);
|
|
212
211
|
}
|
|
213
212
|
}
|
|
214
213
|
|
|
@@ -222,10 +221,10 @@ class Click {
|
|
|
222
221
|
try {
|
|
223
222
|
const script = `document.querySelector("[name='${name}']").click()`;
|
|
224
223
|
await this.browser.runScript(script, 'CUSTOM');
|
|
225
|
-
} catch (
|
|
224
|
+
} catch (error) {
|
|
226
225
|
log.error('Could not find element by name %s', name);
|
|
227
|
-
log.verbose(
|
|
228
|
-
throw Error('Could not find element by name ' + name);
|
|
226
|
+
log.verbose(error);
|
|
227
|
+
throw new Error('Could not find element by name ' + name);
|
|
229
228
|
}
|
|
230
229
|
}
|
|
231
230
|
|
|
@@ -240,10 +239,10 @@ class Click {
|
|
|
240
239
|
const script = `document.getElementById('${id}').click();`;
|
|
241
240
|
await this.browser.runScript(script, 'CUSTOM');
|
|
242
241
|
return this.browser.extraWait(this.pageCompleteCheck);
|
|
243
|
-
} catch (
|
|
242
|
+
} catch (error) {
|
|
244
243
|
log.error('Could not find element by id %s', id);
|
|
245
|
-
log.verbose(
|
|
246
|
-
throw Error('Could not find element by id ' + id);
|
|
244
|
+
log.verbose(error);
|
|
245
|
+
throw new Error('Could not find element by id ' + id);
|
|
247
246
|
}
|
|
248
247
|
}
|
|
249
248
|
|
|
@@ -251,10 +250,10 @@ class Click {
|
|
|
251
250
|
try {
|
|
252
251
|
const script = `document.querySelector('${selector}').click();`;
|
|
253
252
|
await this.browser.runScript(script, 'CUSTOM');
|
|
254
|
-
} catch (
|
|
253
|
+
} catch (error) {
|
|
255
254
|
log.error('Could not click using selector %s', selector);
|
|
256
|
-
log.verbose(
|
|
257
|
-
throw Error('Could not click using selector ' + selector);
|
|
255
|
+
log.verbose(error);
|
|
256
|
+
throw new Error('Could not click using selector ' + selector);
|
|
258
257
|
}
|
|
259
258
|
}
|
|
260
259
|
|
|
@@ -263,11 +262,11 @@ class Click {
|
|
|
263
262
|
const script = `document.querySelector('${selector}').click();`;
|
|
264
263
|
await this.browser.runScript(script, 'CUSTOM');
|
|
265
264
|
return this.browser.extraWait(this.pageCompleteCheck);
|
|
266
|
-
} catch (
|
|
265
|
+
} catch (error) {
|
|
267
266
|
log.error('Could not click using selector %s', selector);
|
|
268
|
-
log.verbose(
|
|
269
|
-
throw Error('Could not click using selector ' + selector);
|
|
267
|
+
log.verbose(error);
|
|
268
|
+
throw new Error('Could not click using selector ' + selector);
|
|
270
269
|
}
|
|
271
270
|
}
|
|
272
271
|
}
|
|
273
|
-
|
|
272
|
+
export default Click;
|
|
@@ -1,6 +1,5 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
const log = require('intel').getLogger('browsertime.command.debug');
|
|
1
|
+
import intel from 'intel';
|
|
2
|
+
const log = intel.getLogger('browsertime.command.debug');
|
|
4
3
|
const delay = ms => new Promise(res => setTimeout(res, ms));
|
|
5
4
|
|
|
6
5
|
class Debug {
|
|
@@ -45,4 +44,4 @@ class Debug {
|
|
|
45
44
|
}
|
|
46
45
|
}
|
|
47
46
|
|
|
48
|
-
|
|
47
|
+
export default Debug;
|
|
@@ -1,6 +1,5 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
const log = require('intel').getLogger('browsertime.command.javascript');
|
|
1
|
+
import intel from 'intel';
|
|
2
|
+
const log = intel.getLogger('browsertime.command.javascript');
|
|
4
3
|
class JavaScript {
|
|
5
4
|
constructor(browser, pageCompleteCheck) {
|
|
6
5
|
this.browser = browser;
|
|
@@ -17,10 +16,10 @@ class JavaScript {
|
|
|
17
16
|
try {
|
|
18
17
|
const value = await this.browser.runScript(js, 'CUSTOM');
|
|
19
18
|
return value;
|
|
20
|
-
} catch (
|
|
19
|
+
} catch (error) {
|
|
21
20
|
log.error('Could not run JavaScript %s ', js);
|
|
22
|
-
log.verbose(
|
|
23
|
-
throw Error(`Could not run JavaScript ${js}`);
|
|
21
|
+
log.verbose(error);
|
|
22
|
+
throw new Error(`Could not run JavaScript ${js}`);
|
|
24
23
|
}
|
|
25
24
|
}
|
|
26
25
|
|
|
@@ -34,10 +33,10 @@ class JavaScript {
|
|
|
34
33
|
try {
|
|
35
34
|
await this.browser.runScript(js, 'CUSTOM');
|
|
36
35
|
return this.browser.extraWait(this.pageCompleteCheck);
|
|
37
|
-
} catch (
|
|
36
|
+
} catch (error) {
|
|
38
37
|
log.error('Could not run JavaScript %s ', js);
|
|
39
|
-
log.verbose(
|
|
40
|
-
throw Error(`Could not run JavaScript ${js}`);
|
|
38
|
+
log.verbose(error);
|
|
39
|
+
throw new Error(`Could not run JavaScript ${js}`);
|
|
41
40
|
}
|
|
42
41
|
}
|
|
43
42
|
|
|
@@ -54,10 +53,10 @@ class JavaScript {
|
|
|
54
53
|
'CUSTOM PRIVILEGED'
|
|
55
54
|
);
|
|
56
55
|
return value;
|
|
57
|
-
} catch (
|
|
56
|
+
} catch (error) {
|
|
58
57
|
log.error('Could not run privileged JavaScript %s ', js);
|
|
59
|
-
log.verbose(
|
|
60
|
-
throw
|
|
58
|
+
log.verbose(error);
|
|
59
|
+
throw error;
|
|
61
60
|
}
|
|
62
61
|
}
|
|
63
62
|
|
|
@@ -71,10 +70,10 @@ class JavaScript {
|
|
|
71
70
|
try {
|
|
72
71
|
await this.browser.runPrivilegedScript(js, 'CUSTOM PRIVILEGED');
|
|
73
72
|
return this.browser.extraWait(this.pageCompleteCheck);
|
|
74
|
-
} catch (
|
|
73
|
+
} catch (error) {
|
|
75
74
|
log.error('Could not run privileged JavaScript %s ', js);
|
|
76
|
-
log.verbose(
|
|
77
|
-
throw
|
|
75
|
+
log.verbose(error);
|
|
76
|
+
throw error;
|
|
78
77
|
}
|
|
79
78
|
}
|
|
80
79
|
|
|
@@ -91,11 +90,11 @@ class JavaScript {
|
|
|
91
90
|
'CUSTOM ASYNC PRIVILEGED'
|
|
92
91
|
);
|
|
93
92
|
return value;
|
|
94
|
-
} catch (
|
|
93
|
+
} catch (error) {
|
|
95
94
|
log.error('Could not run async privileged JavaScript %s ', js);
|
|
96
|
-
log.verbose(
|
|
97
|
-
throw
|
|
95
|
+
log.verbose(error);
|
|
96
|
+
throw error;
|
|
98
97
|
}
|
|
99
98
|
}
|
|
100
99
|
}
|
|
101
|
-
|
|
100
|
+
export default JavaScript;
|
|
@@ -1,19 +1,18 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
1
|
+
import { join } from 'node:path';
|
|
2
|
+
import intel from 'intel';
|
|
3
|
+
import get from 'lodash.get';
|
|
4
|
+
import merge from 'lodash.merge';
|
|
5
|
+
import { timestamp as _timestamp } from '../../../support/engineUtils.js';
|
|
6
|
+
import Video from '../../../video/video.js';
|
|
7
|
+
import pathToFolder from '../../../support/pathToFolder.js';
|
|
8
|
+
import setOrangeBackground from '../../../video/screenRecording/setOrangeBackground.js';
|
|
9
|
+
import { filterWhitelisted } from '../../../support/userTiming.js';
|
|
10
|
+
import { isAndroidConfigured, Android } from '../../../android/index.js';
|
|
11
|
+
import TCPDump from '../../../support/tcpdump.js';
|
|
12
|
+
import highlightLargestContentfulPaint from './util/lcpHighlightScript.js';
|
|
13
|
+
import highlightLS from './util/lsHighlightScript.js';
|
|
14
14
|
const delay = ms => new Promise(res => setTimeout(res, ms));
|
|
15
|
-
const
|
|
16
|
-
const highlightLS = require('./util/lsHighlightScript.js');
|
|
15
|
+
const log = intel.getLogger('browsertime.command.measure');
|
|
17
16
|
|
|
18
17
|
// In some cases we could have one alias mapped to multiple URLs
|
|
19
18
|
// we've seen it for login etc where the user get different query parameter
|
|
@@ -23,7 +22,7 @@ const aliasAndUrl = {};
|
|
|
23
22
|
function getNewResult() {
|
|
24
23
|
return {
|
|
25
24
|
extraJson: {},
|
|
26
|
-
timestamp:
|
|
25
|
+
timestamp: _timestamp(),
|
|
27
26
|
extras: {}
|
|
28
27
|
};
|
|
29
28
|
}
|
|
@@ -191,7 +190,7 @@ class Measure {
|
|
|
191
190
|
}
|
|
192
191
|
|
|
193
192
|
this.result.push(getNewResult());
|
|
194
|
-
this.result[this.numberOfMeasuredPages].timestamp =
|
|
193
|
+
this.result[this.numberOfMeasuredPages].timestamp = _timestamp();
|
|
195
194
|
|
|
196
195
|
if (alias || optionalAlias) {
|
|
197
196
|
this.result[this.numberOfMeasuredPages].alias = alias || optionalAlias;
|
|
@@ -232,8 +231,8 @@ class Measure {
|
|
|
232
231
|
await this.engineDelegate.beforeEachURL(this.browser, url);
|
|
233
232
|
await this.browser.loadAndWait(url, this.pageCompleteCheck);
|
|
234
233
|
return this.stop(url);
|
|
235
|
-
} catch (
|
|
236
|
-
this.result[this.numberOfMeasuredPages].error = [
|
|
234
|
+
} catch (error) {
|
|
235
|
+
this.result[this.numberOfMeasuredPages].error = [error.name];
|
|
237
236
|
// The page failed loading but make sure we keep track of
|
|
238
237
|
// how many pages we tried to measure
|
|
239
238
|
this.numberOfMeasuredPages++;
|
|
@@ -242,7 +241,7 @@ class Measure {
|
|
|
242
241
|
// If we got an error we still should stop the video to make sure we can use it to
|
|
243
242
|
// try to understand what went wrong
|
|
244
243
|
await this._stopVideo(url);
|
|
245
|
-
throw
|
|
244
|
+
throw error;
|
|
246
245
|
}
|
|
247
246
|
} else {
|
|
248
247
|
this.areWeMeasuring = true;
|
|
@@ -267,11 +266,9 @@ class Measure {
|
|
|
267
266
|
url
|
|
268
267
|
);
|
|
269
268
|
this.testedURLs[url] = this.testedURLs[url] + 1;
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
url = url + '?browsertime_run=' + this.testedURLs[url];
|
|
274
|
-
}
|
|
269
|
+
url = url.includes('?')
|
|
270
|
+
? url + '&browsertime_run=' + this.testedURLs[url]
|
|
271
|
+
: url + '?browsertime_run=' + this.testedURLs[url];
|
|
275
272
|
} else {
|
|
276
273
|
this.testedURLs[url] = 1;
|
|
277
274
|
}
|
|
@@ -291,7 +288,7 @@ class Measure {
|
|
|
291
288
|
|
|
292
289
|
// We have the URL, create the data dir
|
|
293
290
|
await this.storageManager.createSubDataDir(
|
|
294
|
-
|
|
291
|
+
join(pathToFolder(url, this.options))
|
|
295
292
|
);
|
|
296
293
|
await this._stopVideo(url);
|
|
297
294
|
|
|
@@ -378,13 +375,10 @@ class Measure {
|
|
|
378
375
|
!this.options.videoParams.debug &&
|
|
379
376
|
this.video.getRecordingStartTime()
|
|
380
377
|
) {
|
|
381
|
-
this.result[this.numberOfMeasuredPages].recordingStartTime =
|
|
382
|
-
this.video.getRecordingStartTime()
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
this.video.getTimeToFirstFrame(),
|
|
386
|
-
10
|
|
387
|
-
);
|
|
378
|
+
this.result[this.numberOfMeasuredPages].recordingStartTime =
|
|
379
|
+
Number.parseFloat(this.video.getRecordingStartTime());
|
|
380
|
+
this.result[this.numberOfMeasuredPages].timeToFirstFrame =
|
|
381
|
+
Number.parseInt(this.video.getTimeToFirstFrame(), 10);
|
|
388
382
|
}
|
|
389
383
|
|
|
390
384
|
if (this.options.screenshot) {
|
|
@@ -397,7 +391,7 @@ class Measure {
|
|
|
397
391
|
url,
|
|
398
392
|
this.index
|
|
399
393
|
);
|
|
400
|
-
} catch
|
|
394
|
+
} catch {
|
|
401
395
|
// not getting screenshots shouldn't result in a failed test.
|
|
402
396
|
}
|
|
403
397
|
}
|
|
@@ -465,8 +459,8 @@ class Measure {
|
|
|
465
459
|
this.index
|
|
466
460
|
);
|
|
467
461
|
await this.browser.runScript(lcpScriptClean, 'CLEAN_LCP');
|
|
468
|
-
} catch (
|
|
469
|
-
log.error('Could not get LCP screenshot',
|
|
462
|
+
} catch (error) {
|
|
463
|
+
log.error('Could not get LCP screenshot', error);
|
|
470
464
|
}
|
|
471
465
|
}
|
|
472
466
|
|
|
@@ -529,4 +523,4 @@ class Measure {
|
|
|
529
523
|
}
|
|
530
524
|
}
|
|
531
525
|
|
|
532
|
-
|
|
526
|
+
export default Measure;
|