1 |
|
2 |
|
3 |
|
4 |
|
5 |
|
6 |
|
7 |
|
8 |
|
9 |
|
10 | 'use strict';
|
11 |
|
12 |
|
13 | var webdriver = require('selenium-webdriver');
|
14 | var chrome = require('selenium-webdriver/chrome');
|
15 | var firefox = require('selenium-webdriver/firefox');
|
16 | var edge = require('selenium-webdriver/edge');
|
17 | var fs = require('fs');
|
18 |
|
19 | var sharedDriver = null;
|
20 |
|
21 | function getBrowserVersion() {
|
22 | var browser = process.env.BROWSER;
|
23 | var browserChannel = process.env.BVER;
|
24 |
|
25 |
|
26 | var chromeExp = /\/chrome\/(\d+)\./;
|
27 | var firefoxExp = /\/firefox\/(\d+)\./;
|
28 |
|
29 | var browserVersion = function(expr) {
|
30 | var symlink = './browsers/bin/' + browser + '-' + browserChannel;
|
31 | var pathToBrowser = fs.readlinkSync(symlink);
|
32 | var match = pathToBrowser.match(expr);
|
33 | return match && match.length >= 1 && parseInt(match[1], 10);
|
34 | };
|
35 |
|
36 | switch (browser) {
|
37 | case 'chrome':
|
38 | return browserVersion(chromeExp);
|
39 | case 'firefox':
|
40 | return browserVersion(firefoxExp);
|
41 | case 'safari':
|
42 | return browserChannel;
|
43 | default:
|
44 | return 'non supported browser.';
|
45 | }
|
46 | }
|
47 |
|
48 | function buildDriver() {
|
49 | if (sharedDriver) {
|
50 | return sharedDriver;
|
51 | }
|
52 |
|
53 |
|
54 | var logging = webdriver.logging;
|
55 | var prefs = new logging.Preferences();
|
56 | prefs.setLevel(logging.Type.BROWSER, logging.Level.ALL);
|
57 |
|
58 |
|
59 |
|
60 | var profile = new firefox.Profile();
|
61 | profile.setPreference('media.navigator.streams.fake', true);
|
62 |
|
63 | profile.setPreference('media.navigator.permission.disabled', true);
|
64 |
|
65 |
|
66 |
|
67 |
|
68 |
|
69 | profile.setPreference('xpinstall.signatures.required', false);
|
70 |
|
71 | var firefoxOptions = new firefox.Options()
|
72 | .setProfile(profile)
|
73 | .setBinary('node_modules/.bin/start-firefox');
|
74 |
|
75 |
|
76 |
|
77 | var chromeOptions = new chrome.Options()
|
78 | .setChromeBinaryPath('node_modules/.bin/start-chrome')
|
79 | .addArguments('allow-file-access-from-files')
|
80 | .addArguments('use-fake-device-for-media-stream')
|
81 | .addArguments('use-fake-ui-for-media-stream')
|
82 | .addArguments('disable-translate')
|
83 | .addArguments('no-process-singleton-dialog')
|
84 | .addArguments('mute-audio')
|
85 | .addArguments('no-sandbox')
|
86 | .setLoggingPrefs(prefs);
|
87 |
|
88 |
|
89 | if (process.env.BROWSER === 'chrome' && getBrowserVersion() >= 49) {
|
90 | chromeOptions.addArguments('--enable-experimental-web-platform-features');
|
91 | }
|
92 |
|
93 | var edgeOptions = new edge.Options();
|
94 |
|
95 | sharedDriver = new webdriver.Builder()
|
96 | .forBrowser(process.env.BROWSER)
|
97 | .setFirefoxOptions(firefoxOptions)
|
98 | .setChromeOptions(chromeOptions)
|
99 | .setEdgeOptions(edgeOptions);
|
100 |
|
101 | if (process.env.BROWSER === 'firefox' && getBrowserVersion() >= 47) {
|
102 | sharedDriver.getCapabilities().set('marionette', true);
|
103 | }
|
104 | sharedDriver = sharedDriver.build();
|
105 | return sharedDriver;
|
106 | }
|
107 |
|
108 |
|
109 |
|
110 |
|
111 | function overrideTrace(driver) {
|
112 | driver.executeScript('window.trace = function(arg) { console.log(arg); };');
|
113 | }
|
114 |
|
115 |
|
116 | function getStats(driver, peerConnection) {
|
117 |
|
118 | driver.manage().timeouts().setScriptTimeout(1000);
|
119 | return driver.executeAsyncScript(
|
120 | 'var callback = arguments[arguments.length - 1];' +
|
121 | peerConnection + '.getStats(null).then(function(report) {' +
|
122 | ' callback(report.entries ? [...report.entries()] : report);' +
|
123 | '});'
|
124 | ).then(function(entries) {
|
125 | if (Array.isArray(entries)) {
|
126 | return new Map(entries);
|
127 | }
|
128 | return entries;
|
129 | });
|
130 | }
|
131 |
|
132 |
|
133 |
|
134 |
|
135 |
|
136 | function getLogs(driver, type) {
|
137 |
|
138 | driver.manage().logs().get(type)
|
139 | .then(function(entries) {
|
140 | return entries;
|
141 | });
|
142 | }
|
143 |
|
144 |
|
145 |
|
146 |
|
147 |
|
148 | function printLogs(driver, type) {
|
149 |
|
150 | driver.manage().logs().get(type)
|
151 | .then(function(entries) {
|
152 | entries.forEach(function(entry) {
|
153 | console.log('[%s] %s', entry.level.name, entry.message);
|
154 | });
|
155 | });
|
156 | }
|
157 |
|
158 | module.exports = {
|
159 | buildDriver: buildDriver,
|
160 | getStats: getStats,
|
161 | getLogs: getLogs,
|
162 | overrideTrace: overrideTrace,
|
163 | printLogs: printLogs
|
164 | };
|