selenium-webdriver 3.3.0 → 4.0.0-alpha.1

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.
Files changed (117) hide show
  1. package/CHANGES.md +273 -0
  2. package/NOTICE +1 -1
  3. package/README.md +28 -36
  4. package/chrome.js +221 -146
  5. package/edge.js +43 -118
  6. package/example/chrome_android.js +8 -9
  7. package/example/chrome_mobile_emulation.js +9 -10
  8. package/example/firefox_channels.js +23 -19
  9. package/example/google_search.js +3 -3
  10. package/example/google_search_test.js +39 -27
  11. package/example/headless.js +55 -0
  12. package/example/logging.js +40 -7
  13. package/firefox.js +769 -0
  14. package/http/index.js +41 -4
  15. package/http/util.js +11 -6
  16. package/ie.js +57 -98
  17. package/index.js +182 -115
  18. package/io/index.js +59 -0
  19. package/io/zip.js +214 -0
  20. package/jasmine.json +11 -0
  21. package/lib/actions.js +68 -63
  22. package/lib/atoms/get-attribute.js +9 -0
  23. package/lib/atoms/is-displayed.js +73 -78
  24. package/lib/by.js +9 -1
  25. package/lib/capabilities.js +303 -201
  26. package/lib/command.js +28 -50
  27. package/lib/error.js +113 -42
  28. package/lib/http.js +167 -135
  29. package/lib/input.js +1044 -8
  30. package/lib/promise.js +222 -3331
  31. package/lib/proxy.js +134 -39
  32. package/lib/test/bootstrap_jasmine.js +28 -0
  33. package/lib/test/data/actions/click.html +24 -0
  34. package/lib/test/data/actions/drag.html +77 -0
  35. package/lib/test/data/actions/record_click.html +21 -0
  36. package/lib/test/data/chrome/download.html +2 -0
  37. package/lib/test/data/click_tests/disabled_element.html +12 -0
  38. package/lib/test/data/content-editable.html +10 -0
  39. package/lib/test/data/firefox/webextension.xpi +0 -0
  40. package/lib/test/data/inputs.html +42 -0
  41. package/lib/test/data/key_logger.html +34 -0
  42. package/lib/test/data/nestedElements.html +10 -1
  43. package/lib/test/data/scrolling_tests/page_with_partially_hidden_element.html +14 -0
  44. package/lib/test/data/selectPage.html +12 -0
  45. package/lib/test/data/simpleTest.html +5 -0
  46. package/lib/test/data/single_text_input.html +12 -0
  47. package/lib/test/data/upload_invisible.html +45 -0
  48. package/lib/test/fileserver.js +23 -19
  49. package/lib/test/index.js +30 -244
  50. package/lib/test/resources.js +0 -1
  51. package/lib/webdriver.js +770 -939
  52. package/net/index.js +21 -25
  53. package/net/portprober.js +51 -68
  54. package/package.json +6 -4
  55. package/remote/index.js +18 -30
  56. package/safari.js +42 -129
  57. package/test/actions_test.js +173 -18
  58. package/test/builder_test.js +106 -0
  59. package/test/chrome/devtools_test.js +93 -0
  60. package/test/chrome/options_test.js +48 -154
  61. package/test/chrome/service_test.js +7 -7
  62. package/test/cookie_test.js +77 -63
  63. package/test/element_finding_test.js +206 -201
  64. package/test/execute_script_test.js +115 -114
  65. package/test/fingerprint_test.js +16 -15
  66. package/test/firefox_test.js +251 -0
  67. package/test/http/http_test.js +18 -1
  68. package/test/http/util_test.js +2 -2
  69. package/test/{io_test.js → io/io_test.js} +40 -1
  70. package/test/io/zip_test.js +127 -0
  71. package/test/lib/by_test.js +21 -0
  72. package/test/lib/error_test.js +55 -8
  73. package/test/lib/http_test.js +18 -130
  74. package/test/lib/input_test.js +1379 -0
  75. package/test/lib/promise_test.js +473 -908
  76. package/test/lib/webdriver_test.js +357 -825
  77. package/test/logging_test.js +37 -43
  78. package/test/page_loading_test.js +70 -86
  79. package/test/proxy_test.js +64 -72
  80. package/test/rect_test.js +14 -25
  81. package/test/remote_test.js +13 -32
  82. package/test/safari_test.js +7 -71
  83. package/test/stale_element_test.js +20 -23
  84. package/test/tag_name_test.js +10 -9
  85. package/test/upload_test.js +27 -35
  86. package/test/window_test.js +72 -85
  87. package/testing/index.js +386 -315
  88. package/.npmignore +0 -2
  89. package/example/async_await_test.js +0 -68
  90. package/example/google_search_generator.js +0 -50
  91. package/example/parallel_flows.js +0 -54
  92. package/firefox/binary.js +0 -344
  93. package/firefox/extension.js +0 -187
  94. package/firefox/index.js +0 -722
  95. package/firefox/profile.js +0 -430
  96. package/lib/atoms/getAttribute.js +0 -12
  97. package/lib/events.js +0 -210
  98. package/lib/firefox/webdriver.json +0 -70
  99. package/lib/firefox/webdriver.xpi +0 -0
  100. package/lib/test/data/firefox/jetpack-sample.xpi +0 -0
  101. package/lib/test/data/firefox/sample.xpi +0 -0
  102. package/lib/test/promise.js +0 -79
  103. package/opera.js +0 -405
  104. package/phantomjs.js +0 -282
  105. package/test/firefox/extension_test.js +0 -96
  106. package/test/firefox/firefox_test.js +0 -226
  107. package/test/firefox/profile_test.js +0 -185
  108. package/test/lib/events_test.js +0 -177
  109. package/test/lib/promise_aplus_test.js +0 -78
  110. package/test/lib/promise_error_test.js +0 -884
  111. package/test/lib/promise_flow_test.js +0 -2288
  112. package/test/lib/promise_generator_test.js +0 -310
  113. package/test/phantomjs/execute_phantomjs_test.js +0 -59
  114. package/test/session_test.js +0 -54
  115. package/test/testing/assert_test.js +0 -373
  116. package/test/testing/index_test.js +0 -224
  117. package/testing/assert.js +0 -378
@@ -17,26 +17,28 @@
17
17
 
18
18
  'use strict';
19
19
 
20
- var fs = require('fs'),
21
- http = require('http'),
22
- path = require('path'),
23
- url = require('url');
20
+ const fs = require('fs');
21
+ const http = require('http');
22
+ const path = require('path');
23
+ const url = require('url');
24
24
 
25
- var express = require('express');
26
- var multer = require('multer');
27
- var serveIndex = require('serve-index');
25
+ const express = require('express');
26
+ const multer = require('multer');
27
+ const serveIndex = require('serve-index');
28
28
 
29
- var Server = require('./httpserver').Server,
30
- resources = require('./resources'),
31
- isDevMode = require('../devmode');
29
+ const isDevMode = require('../devmode');
30
+ const resources = require('./resources');
31
+ const {Server} = require('./httpserver');
32
32
 
33
- var WEB_ROOT = '/common';
34
- var JS_ROOT = '/javascript';
33
+ const WEB_ROOT = '/common';
34
+ const DATA_ROOT = '/data';
35
+ const JS_ROOT = '/javascript';
35
36
 
36
- var baseDirectory = resources.locate(isDevMode ? 'common/src/web' : '.');
37
- var jsDirectory = resources.locate(isDevMode ? 'javascript' : '..');
37
+ const baseDirectory = resources.locate(isDevMode ? 'common/src/web' : '.');
38
+ const dataDirectory = path.join(__dirname, 'data');
39
+ const jsDirectory = resources.locate(isDevMode ? 'javascript' : '..');
38
40
 
39
- var Pages = (function() {
41
+ const Pages = (function() {
40
42
  var pages = {};
41
43
  function addPage(page, path) {
42
44
  pages.__defineGetter__(page, function() {
@@ -105,7 +107,7 @@ var Pages = (function() {
105
107
  })();
106
108
 
107
109
 
108
- var Path = {
110
+ const Path = {
109
111
  BASIC_AUTH: WEB_ROOT + '/basicAuth',
110
112
  ECHO: WEB_ROOT + '/echo',
111
113
  GENERATED: WEB_ROOT + '/generated',
@@ -126,6 +128,7 @@ app.get('/', sendIndex)
126
128
  .use(JS_ROOT, serveIndex(jsDirectory), express.static(jsDirectory))
127
129
  .post(Path.UPLOAD, handleUpload)
128
130
  .use(WEB_ROOT, serveIndex(baseDirectory), express.static(baseDirectory))
131
+ .use(DATA_ROOT, serveIndex(dataDirectory), express.static(dataDirectory))
129
132
  .get(Path.ECHO, sendEcho)
130
133
  .get(Path.PAGE, sendInifinitePage)
131
134
  .get(Path.PAGE + '/*', sendInifinitePage)
@@ -250,7 +253,8 @@ function sendIndex(request, response) {
250
253
  }
251
254
 
252
255
  var data = ['<!DOCTYPE html><h1>/</h1><hr/><ul>',
253
- createListEntry('common')];
256
+ createListEntry('common'),
257
+ createListEntry('data')];
254
258
  if (isDevMode) {
255
259
  data.push(createListEntry('javascript'));
256
260
  }
@@ -305,9 +309,9 @@ exports.url = server.url.bind(server);
305
309
  exports.whereIs = function(filePath) {
306
310
  filePath = filePath.replace(/\\/g, '/');
307
311
  if (!filePath.startsWith('/')) {
308
- filePath = '/' + filePath;
312
+ filePath = `${WEB_ROOT}/${filePath}`;
309
313
  }
310
- return server.url(WEB_ROOT + filePath);
314
+ return server.url(filePath);
311
315
  };
312
316
 
313
317
 
package/lib/test/index.js CHANGED
@@ -17,264 +17,55 @@
17
17
 
18
18
  'use strict';
19
19
 
20
- var assert = require('assert');
20
+ const assert = require('assert');
21
21
 
22
- var build = require('./build'),
23
- isDevMode = require('../devmode'),
24
- webdriver = require('../../'),
25
- flow = webdriver.promise.controlFlow(),
26
- firefox = require('../../firefox'),
27
- logging = require('../../lib/logging'),
28
- safari = require('../../safari'),
29
- remote = require('../../remote'),
30
- testing = require('../../testing'),
31
- fileserver = require('./fileserver');
22
+ const build = require('./build');
23
+ const fileserver = require('./fileserver');
24
+ const firefox = require('../../firefox');
25
+ const isDevMode = require('../devmode');
26
+ const logging = require('../../lib/logging');
27
+ const remote = require('../../remote');
28
+ const safari = require('../../safari');
29
+ const testing = require('../../testing');
30
+ const webdriver = require('../../');
32
31
 
33
-
34
- const LEGACY_FIREFOX = 'legacy-' + webdriver.Browser.FIREFOX;
32
+ const NO_BUILD = /^1|true$/i.test(process.env['SELENIUM_NO_BUILD']);
35
33
 
36
34
 
37
35
  /**
38
- * Browsers with native support.
39
- * @type {!Array.<webdriver.Browser>}
36
+ * @param {function(!testing.Environment)} fn The top level suite function.
37
+ * @param {testing.SuiteOptions=} options Suite specific options.
40
38
  */
41
- var NATIVE_BROWSERS = [
42
- webdriver.Browser.CHROME,
43
- webdriver.Browser.EDGE,
44
- webdriver.Browser.FIREFOX,
45
- LEGACY_FIREFOX,
46
- webdriver.Browser.IE,
47
- webdriver.Browser.OPERA,
48
- webdriver.Browser.PHANTOM_JS,
49
- webdriver.Browser.SAFARI
50
- ];
51
-
52
-
53
- var serverJar = process.env['SELENIUM_SERVER_JAR'];
54
- var remoteUrl = process.env['SELENIUM_REMOTE_URL'];
55
- var useLoopback = process.env['SELENIUM_USE_LOOP_BACK'] == '1';
56
- var noMarionette = /^0|false$/i.test(process.env['SELENIUM_GECKODRIVER']);
57
- var startServer = !!serverJar && !remoteUrl;
58
- var nativeRun = !serverJar && !remoteUrl;
59
-
60
- if (/^1|true$/i.test(process.env['SELENIUM_VERBOSE'])) {
61
- logging.installConsoleHandler();
62
- logging.getLogger('webdriver.http').setLevel(logging.Level.ALL);
63
- }
64
-
65
- var browsersToTest = (function() {
66
- var permitRemoteBrowsers = !!remoteUrl || !!serverJar;
67
- var permitUnknownBrowsers = !nativeRun;
68
- var browsers = process.env['SELENIUM_BROWSER'] || webdriver.Browser.FIREFOX;
69
-
70
- browsers = browsers.split(',').map(function(browser) {
71
- var parts = browser.split(/:/);
72
- if (parts[0] === 'ie') {
73
- parts[0] = webdriver.Browser.IE;
74
- }
75
- if (parts[0] === 'edge') {
76
- parts[0] = webdriver.Browser.EDGE;
77
- }
78
- if (noMarionette && parts[0] === webdriver.Browser.FIREFOX) {
79
- parts[0] = LEGACY_FIREFOX;
80
- }
81
- return parts.join(':');
82
- });
83
-
84
- browsers.forEach(function(browser) {
85
- var parts = browser.split(/:/, 3);
86
- if (parts[0] === 'ie') {
87
- parts[0] = webdriver.Browser.IE;
88
- }
89
-
90
- if (parts[0] === LEGACY_FIREFOX) {
91
- return;
92
- }
93
-
94
- if (NATIVE_BROWSERS.indexOf(parts[0]) == -1 && !permitRemoteBrowsers) {
95
- throw Error('Browser ' + parts[0] + ' requires a WebDriver server and ' +
96
- 'neither the SELENIUM_REMOTE_URL nor the SELENIUM_SERVER_JAR ' +
97
- 'environment variables have been set.');
98
- }
99
-
100
- var recognized = false;
101
- for (var prop in webdriver.Browser) {
102
- if (webdriver.Browser.hasOwnProperty(prop) &&
103
- webdriver.Browser[prop] === parts[0]) {
104
- recognized = true;
105
- break;
106
- }
107
- }
108
-
109
- if (!recognized && !permitUnknownBrowsers) {
110
- throw Error('Unrecognized browser: ' + browser);
111
- }
112
- });
113
-
114
- console.log('Running tests against [' + browsers.join(',') + ']');
115
- if (remoteUrl) {
116
- console.log('Using remote server ' + remoteUrl);
117
- } else if (serverJar) {
118
- console.log('Using standalone Selenium server ' + serverJar);
119
- if (useLoopback) {
120
- console.log('Running tests using loopback address')
121
- }
122
- }
123
- console.log(
124
- 'Promise manager is enabled? ' + webdriver.promise.USE_PROMISE_MANAGER);
125
-
126
- return browsers;
127
- })();
128
-
129
-
130
- /**
131
- * Creates a predicate function that ignores tests for specific browsers.
132
- * @param {string} currentBrowser The name of the current browser.
133
- * @param {!Array.<!Browser>} browsersToIgnore The browsers to ignore.
134
- * @return {function(): boolean} The predicate function.
135
- */
136
- function browsers(currentBrowser, browsersToIgnore) {
137
- return function() {
138
- return browsersToIgnore.indexOf(currentBrowser) != -1;
139
- };
140
- }
141
-
142
-
143
- /**
144
- * @param {string} browserName The name to use.
145
- * @param {remote.DriverService} server The server to use, if any.
146
- * @constructor
147
- */
148
- function TestEnvironment(browserName, server) {
149
- var name = browserName;
150
-
151
- this.currentBrowser = function() {
152
- return browserName;
153
- };
154
-
155
- this.isRemote = function() {
156
- return server || remoteUrl;
157
- };
158
-
159
- this.isMarionette = function() {
160
- return !noMarionette;
161
- };
162
-
163
- this.browsers = function(var_args) {
164
- var browsersToIgnore = Array.prototype.slice.apply(arguments, [0]);
165
- return browsers(browserName, browsersToIgnore);
166
- };
167
-
168
- this.builder = function() {
169
- var builder = new webdriver.Builder();
170
- var realBuild = builder.build;
171
-
172
- builder.build = function() {
173
- var parts = browserName.split(/:/, 3);
174
-
175
- if (parts[0] === LEGACY_FIREFOX) {
176
- var options = builder.getFirefoxOptions() || new firefox.Options();
177
- options.useGeckoDriver(false);
178
- builder.setFirefoxOptions(options);
179
-
180
- parts[0] = webdriver.Browser.FIREFOX;
181
- }
182
-
183
- builder.forBrowser(parts[0], parts[1], parts[2]);
184
- if (server) {
185
- builder.usingServer(server.address());
186
- } else if (remoteUrl) {
187
- builder.usingServer(remoteUrl);
188
- }
189
-
190
- builder.disableEnvironmentOverrides();
191
- return realBuild.call(builder);
192
- };
193
-
194
- return builder;
195
- };
196
- }
197
-
198
-
199
- var seleniumServer;
200
- var inSuite = false;
201
-
202
-
203
- /**
204
- * Expands a function to cover each of the target browsers.
205
- * @param {function(!TestEnvironment)} fn The top level suite
206
- * function.
207
- * @param {{browsers: !Array.<string>}=} opt_options Suite specific options.
208
- */
209
- function suite(fn, opt_options) {
210
- assert.ok(!inSuite, 'You may not nest suite calls');
211
- inSuite = true;
212
-
213
- var suiteOptions = opt_options || {};
214
- var browsers = suiteOptions.browsers;
215
- if (browsers) {
216
- // Filter out browser specific tests when that browser is not currently
217
- // selected for testing.
218
- browsers = browsers.filter(function(browser) {
219
- return browsersToTest.indexOf(browser) != -1;
220
- });
221
- } else {
222
- browsers = browsersToTest;
223
- }
224
-
225
- try {
226
-
39
+ function suite(fn, options = undefined) {
40
+ testing.suite(function(env) {
227
41
  before(function() {
228
- if (isDevMode) {
42
+ if (isDevMode && !NO_BUILD) {
229
43
  return build.of(
230
44
  '//javascript/atoms/fragments:is-displayed',
231
- '//javascript/webdriver/atoms:getAttribute')
45
+ '//javascript/webdriver/atoms:get-attribute')
232
46
  .onlyOnce().go();
233
47
  }
234
48
  });
235
49
 
236
- // Server is only started if required for a specific config.
237
- after(function() {
238
- if (seleniumServer) {
239
- return seleniumServer.stop();
240
- }
241
- });
50
+ fn(env);
51
+ }, options);
52
+ }
242
53
 
243
- browsers.forEach(function(browser) {
244
- describe('[' + browser + ']', function() {
245
54
 
246
- if (isDevMode && nativeRun) {
247
- if (browser === LEGACY_FIREFOX) {
248
- before(function() {
249
- return build.of('//javascript/firefox-driver:webdriver')
250
- .onlyOnce().go();
251
- });
252
- }
253
- }
55
+ // GLOBAL TEST SETUP
254
56
 
255
- var serverToUse = null;
256
57
 
257
- if (!!serverJar && !remoteUrl) {
258
- if (!(serverToUse = seleniumServer)) {
259
- serverToUse = seleniumServer = new remote.SeleniumServer(
260
- serverJar, {loopback: useLoopback});
261
- }
58
+ process.on('unhandledRejection', (reason) => {
59
+ console.error('Unhandled promise rejection:', reason);
60
+ });
262
61
 
263
- before(function() {
264
- this.timeout(0);
265
- return seleniumServer.start(60 * 1000);
266
- });
267
- }
268
- fn(new TestEnvironment(browser, serverToUse));
269
- });
270
- });
271
- } finally {
272
- inSuite = false;
273
- }
274
- }
275
62
 
63
+ if (/^1|true$/i.test(process.env['SELENIUM_VERBOSE'])) {
64
+ logging.installConsoleHandler();
65
+ logging.getLogger('webdriver.http').setLevel(logging.Level.ALL);
66
+ }
276
67
 
277
- // GLOBAL TEST SETUP
68
+ testing.init();
278
69
 
279
70
  before(function() {
280
71
  // Do not pass register fileserver.start directly with testing.before,
@@ -287,16 +78,11 @@ after(function() {
287
78
  return fileserver.stop();
288
79
  });
289
80
 
81
+
290
82
  // PUBLIC API
291
83
 
292
84
 
293
85
  exports.suite = suite;
294
- exports.after = testing.after;
295
- exports.afterEach = testing.afterEach;
296
- exports.before = testing.before;
297
- exports.beforeEach = testing.beforeEach;
298
- exports.it = testing.it;
299
86
  exports.ignore = testing.ignore;
300
-
301
87
  exports.Pages = fileserver.Pages;
302
88
  exports.whereIs = fileserver.whereIs;
@@ -30,7 +30,6 @@ var resourceRoot = require('../devmode') ?
30
30
 
31
31
  /**
32
32
  * Locates a test resource.
33
- * @param {string} resourcePath Path of the resource to locate.
34
33
  * @param {string} filePath The file to locate from the root of the project.
35
34
  * @return {string} The full path for the file, if it exists.
36
35
  * @throws {Error} If the file does not exist.