forked from googlearchive/big-rig
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathdriver.js
116 lines (96 loc) · 3 KB
/
driver.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
/**
* @license
* Copyright 2015 Google Inc. All Rights Reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/*
* This approach is very much based on Sam Saccone's excellent memory leak
* detector: Drool.
* @see https://github.com/samccone/drool
*/
var webdriver = require('selenium-webdriver');
var chrome = require('selenium-webdriver/chrome');
var controlFlow = webdriver.promise.controlFlow();
function start (opts) {
opts = opts || {};
var options = new chrome.Options();
var traceCategories = [
'blink.console',
'devtools.timeline',
'toplevel',
'disabled-by-default-devtools.timeline',
'disabled-by-default-devtools.timeline.frame'
];
if (opts.android)
options = options.androidChrome();
// Add on GPU benchmarking.
options.addArguments('enable-gpu-benchmarking');
// Run without a sandbox.
options.addArguments('no-sandbox');
// Add any test-specific categories, and flags.
if (typeof opts.test !== 'undefined') {
if (typeof opts.test.categories !== 'undefined') {
opts.test.categories.forEach(function(category) {
// Bail if we've already seen this category.
if (traceCategories.indexOf(category) >= 0)
return;
traceCategories.push(category);
});
}
if (typeof opts.test.flags !== 'undefined') {
opts.test.flags.forEach(function(flag) {
options.addArguments(flag);
});
}
}
// Set up that we want to get trace data.
options.setLoggingPrefs({ performance: 'ALL' });
options.setPerfLoggingPrefs({
'traceCategories': traceCategories.join(',')
})
return new webdriver.Builder()
.forBrowser('chrome')
.setChromeOptions(options)
.build();
}
function flow (steps) {
steps.forEach(function(step) {
controlFlow.execute(step);
});
}
function getTrace(browser) {
return (new webdriver.WebDriver.Logs(browser))
.get('performance')
.then(function(logs) {
var trace = '';
var processedLog;
logs.forEach(function(log, index, arr) {
// Parse the message.
processedLog = JSON.parse(log.message);
// Skip any records that aren't categorized.
if (!processedLog.message.params.cat)
return;
// Now append it for the trace file.
trace += JSON.stringify(processedLog.message.params) +
((index < arr.length - 1) ? ',' : '') + '\n';
});
return '[' + trace + ']';
})
}
module.exports = {
start: start,
flow: flow,
webdriver: webdriver,
getTrace: getTrace
};