selenium-webdriver 3.6.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 (97) hide show
  1. package/CHANGES.md +181 -0
  2. package/README.md +25 -27
  3. package/chrome.js +113 -127
  4. package/edge.js +42 -117
  5. package/example/chrome_android.js +8 -8
  6. package/example/chrome_mobile_emulation.js +8 -8
  7. package/example/firefox_channels.js +22 -18
  8. package/example/google_search_test.js +39 -26
  9. package/example/logging.js +39 -6
  10. package/firefox.js +769 -0
  11. package/http/index.js +41 -4
  12. package/http/util.js +11 -6
  13. package/ie.js +56 -97
  14. package/index.js +178 -114
  15. package/jasmine.json +11 -0
  16. package/lib/actions.js +68 -63
  17. package/lib/by.js +1 -1
  18. package/lib/capabilities.js +255 -192
  19. package/lib/command.js +26 -50
  20. package/lib/error.js +85 -44
  21. package/lib/http.js +133 -110
  22. package/lib/input.js +1044 -8
  23. package/lib/promise.js +222 -3323
  24. package/lib/proxy.js +134 -39
  25. package/lib/test/bootstrap_jasmine.js +28 -0
  26. package/lib/test/data/actions/click.html +24 -0
  27. package/lib/test/data/actions/drag.html +77 -0
  28. package/lib/test/data/actions/record_click.html +21 -0
  29. package/lib/test/data/chrome/download.html +2 -0
  30. package/lib/test/data/inputs.html +42 -0
  31. package/lib/test/data/selectPage.html +12 -0
  32. package/lib/test/data/simpleTest.html +5 -0
  33. package/lib/test/data/upload_invisible.html +45 -0
  34. package/lib/test/fileserver.js +23 -19
  35. package/lib/test/index.js +30 -212
  36. package/lib/test/resources.js +0 -1
  37. package/lib/webdriver.js +675 -936
  38. package/net/index.js +21 -25
  39. package/net/portprober.js +51 -68
  40. package/package.json +5 -3
  41. package/remote/index.js +5 -19
  42. package/safari.js +41 -128
  43. package/test/actions_test.js +173 -18
  44. package/test/{session_test.js → builder_test.js} +44 -37
  45. package/test/chrome/devtools_test.js +93 -0
  46. package/test/chrome/options_test.js +48 -154
  47. package/test/chrome/service_test.js +7 -7
  48. package/test/cookie_test.js +77 -63
  49. package/test/element_finding_test.js +206 -201
  50. package/test/execute_script_test.js +115 -114
  51. package/test/fingerprint_test.js +16 -15
  52. package/test/firefox_test.js +251 -0
  53. package/test/http/http_test.js +0 -1
  54. package/test/http/util_test.js +2 -2
  55. package/test/io/zip_test.js +6 -7
  56. package/test/lib/error_test.js +34 -7
  57. package/test/lib/http_test.js +8 -128
  58. package/test/lib/input_test.js +1379 -0
  59. package/test/lib/promise_test.js +473 -908
  60. package/test/lib/webdriver_test.js +296 -868
  61. package/test/logging_test.js +37 -43
  62. package/test/page_loading_test.js +71 -81
  63. package/test/proxy_test.js +64 -72
  64. package/test/rect_test.js +14 -25
  65. package/test/remote_test.js +10 -29
  66. package/test/safari_test.js +7 -71
  67. package/test/stale_element_test.js +20 -23
  68. package/test/tag_name_test.js +10 -9
  69. package/test/upload_test.js +27 -35
  70. package/test/window_test.js +72 -85
  71. package/testing/index.js +386 -314
  72. package/.npmignore +0 -2
  73. package/example/async_await_test.js +0 -69
  74. package/example/google_search_generator.js +0 -47
  75. package/example/parallel_flows.js +0 -51
  76. package/firefox/binary.js +0 -347
  77. package/firefox/extension.js +0 -224
  78. package/firefox/index.js +0 -576
  79. package/firefox/profile.js +0 -311
  80. package/lib/events.js +0 -210
  81. package/lib/test/data/firefox/jetpack-sample.xpi +0 -0
  82. package/lib/test/data/firefox/sample.xpi +0 -0
  83. package/lib/test/promise.js +0 -79
  84. package/opera.js +0 -405
  85. package/phantomjs.js +0 -282
  86. package/test/firefox/extension_test.js +0 -120
  87. package/test/firefox/firefox_test.js +0 -244
  88. package/test/firefox/profile_test.js +0 -140
  89. package/test/lib/events_test.js +0 -177
  90. package/test/lib/promise_aplus_test.js +0 -78
  91. package/test/lib/promise_error_test.js +0 -884
  92. package/test/lib/promise_flow_test.js +0 -2288
  93. package/test/lib/promise_generator_test.js +0 -310
  94. package/test/phantomjs/execute_phantomjs_test.js +0 -59
  95. package/test/testing/assert_test.js +0 -373
  96. package/test/testing/index_test.js +0 -224
  97. package/testing/assert.js +0 -378
package/lib/test/index.js CHANGED
@@ -17,192 +17,29 @@
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
- /**
35
- * Browsers with native support.
36
- * @type {!Array.<webdriver.Browser>}
37
- */
38
- var NATIVE_BROWSERS = [
39
- webdriver.Browser.CHROME,
40
- webdriver.Browser.EDGE,
41
- webdriver.Browser.FIREFOX,
42
- webdriver.Browser.IE,
43
- webdriver.Browser.OPERA,
44
- webdriver.Browser.PHANTOM_JS,
45
- webdriver.Browser.SAFARI
46
- ];
47
-
48
-
49
- var noBuild = /^1|true$/i.test(process.env['SELENIUM_NO_BUILD']);
50
- var serverJar = process.env['SELENIUM_SERVER_JAR'];
51
- var remoteUrl = process.env['SELENIUM_REMOTE_URL'];
52
- var useLoopback = process.env['SELENIUM_USE_LOOP_BACK'] == '1';
53
- var startServer = !!serverJar && !remoteUrl;
54
- var nativeRun = !serverJar && !remoteUrl;
55
-
56
- if (/^1|true$/i.test(process.env['SELENIUM_VERBOSE'])) {
57
- logging.installConsoleHandler();
58
- logging.getLogger('webdriver.http').setLevel(logging.Level.ALL);
59
- }
60
-
61
- var browsersToTest = (function() {
62
- var permitRemoteBrowsers = !!remoteUrl || !!serverJar;
63
- var permitUnknownBrowsers = !nativeRun;
64
- var browsers = process.env['SELENIUM_BROWSER'] || webdriver.Browser.FIREFOX;
65
-
66
- browsers = browsers.split(',').map(function(browser) {
67
- var parts = browser.split(/:/);
68
- if (parts[0] === 'ie') {
69
- parts[0] = webdriver.Browser.IE;
70
- }
71
- if (parts[0] === 'edge') {
72
- parts[0] = webdriver.Browser.EDGE;
73
- }
74
- return parts.join(':');
75
- });
76
-
77
- browsers.forEach(function(browser) {
78
- var parts = browser.split(/:/, 3);
79
- if (parts[0] === 'ie') {
80
- parts[0] = webdriver.Browser.IE;
81
- }
82
-
83
- if (NATIVE_BROWSERS.indexOf(parts[0]) == -1 && !permitRemoteBrowsers) {
84
- throw Error('Browser ' + parts[0] + ' requires a WebDriver server and ' +
85
- 'neither the SELENIUM_REMOTE_URL nor the SELENIUM_SERVER_JAR ' +
86
- 'environment variables have been set.');
87
- }
88
-
89
- var recognized = false;
90
- for (var prop in webdriver.Browser) {
91
- if (webdriver.Browser.hasOwnProperty(prop) &&
92
- webdriver.Browser[prop] === parts[0]) {
93
- recognized = true;
94
- break;
95
- }
96
- }
97
-
98
- if (!recognized && !permitUnknownBrowsers) {
99
- throw Error('Unrecognized browser: ' + browser);
100
- }
101
- });
102
-
103
- console.log('Running tests against [' + browsers.join(',') + ']');
104
- if (remoteUrl) {
105
- console.log('Using remote server ' + remoteUrl);
106
- } else if (serverJar) {
107
- console.log('Using standalone Selenium server ' + serverJar);
108
- if (useLoopback) {
109
- console.log('Running tests using loopback address')
110
- }
111
- }
112
- console.log(
113
- 'Promise manager is enabled? ' + webdriver.promise.USE_PROMISE_MANAGER);
114
-
115
- return browsers;
116
- })();
32
+ const NO_BUILD = /^1|true$/i.test(process.env['SELENIUM_NO_BUILD']);
117
33
 
118
34
 
119
35
  /**
120
- * Creates a predicate function that ignores tests for specific browsers.
121
- * @param {string} currentBrowser The name of the current browser.
122
- * @param {!Array.<!Browser>} browsersToIgnore The browsers to ignore.
123
- * @return {function(): boolean} The predicate function.
36
+ * @param {function(!testing.Environment)} fn The top level suite function.
37
+ * @param {testing.SuiteOptions=} options Suite specific options.
124
38
  */
125
- function browsers(currentBrowser, browsersToIgnore) {
126
- return function() {
127
- return browsersToIgnore.indexOf(currentBrowser) != -1;
128
- };
129
- }
130
-
131
-
132
- /**
133
- * @param {string} browserName The name to use.
134
- * @param {remote.DriverService} server The server to use, if any.
135
- * @constructor
136
- */
137
- function TestEnvironment(browserName, server) {
138
- var name = browserName;
139
-
140
- this.currentBrowser = function() {
141
- return browserName;
142
- };
143
-
144
- this.isRemote = function() {
145
- return server || remoteUrl;
146
- };
147
-
148
- this.browsers = function(var_args) {
149
- var browsersToIgnore = Array.prototype.slice.apply(arguments, [0]);
150
- return browsers(browserName, browsersToIgnore);
151
- };
152
-
153
- this.builder = function() {
154
- var builder = new webdriver.Builder();
155
- var realBuild = builder.build;
156
-
157
- builder.build = function() {
158
- let parts = browserName.split(/:/, 3);
159
-
160
- builder.forBrowser(parts[0], parts[1], parts[2]);
161
- if (server) {
162
- builder.usingServer(server.address());
163
- } else if (remoteUrl) {
164
- builder.usingServer(remoteUrl);
165
- }
166
-
167
- builder.disableEnvironmentOverrides();
168
- return realBuild.call(builder);
169
- };
170
-
171
- return builder;
172
- };
173
- }
174
-
175
-
176
- var seleniumServer;
177
- var inSuite = false;
178
-
179
-
180
- /**
181
- * Expands a function to cover each of the target browsers.
182
- * @param {function(!TestEnvironment)} fn The top level suite
183
- * function.
184
- * @param {{browsers: !Array.<string>}=} opt_options Suite specific options.
185
- */
186
- function suite(fn, opt_options) {
187
- assert.ok(!inSuite, 'You may not nest suite calls');
188
- inSuite = true;
189
-
190
- var suiteOptions = opt_options || {};
191
- var browsers = suiteOptions.browsers;
192
- if (browsers) {
193
- // Filter out browser specific tests when that browser is not currently
194
- // selected for testing.
195
- browsers = browsers.filter(function(browser) {
196
- return browsersToTest.indexOf(browser) != -1;
197
- });
198
- } else {
199
- browsers = browsersToTest;
200
- }
201
-
202
- try {
203
-
39
+ function suite(fn, options = undefined) {
40
+ testing.suite(function(env) {
204
41
  before(function() {
205
- if (isDevMode && !noBuild) {
42
+ if (isDevMode && !NO_BUILD) {
206
43
  return build.of(
207
44
  '//javascript/atoms/fragments:is-displayed',
208
45
  '//javascript/webdriver/atoms:get-attribute')
@@ -210,39 +47,25 @@ function suite(fn, opt_options) {
210
47
  }
211
48
  });
212
49
 
213
- // Server is only started if required for a specific config.
214
- after(function() {
215
- if (seleniumServer) {
216
- return seleniumServer.stop();
217
- }
218
- });
50
+ fn(env);
51
+ }, options);
52
+ }
219
53
 
220
- browsers.forEach(function(browser) {
221
- describe('[' + browser + ']', function() {
222
54
 
223
- var serverToUse = null;
55
+ // GLOBAL TEST SETUP
224
56
 
225
- if (!!serverJar && !remoteUrl) {
226
- if (!(serverToUse = seleniumServer)) {
227
- serverToUse = seleniumServer = new remote.SeleniumServer(
228
- serverJar, {loopback: useLoopback});
229
- }
230
57
 
231
- before(function() {
232
- this.timeout(0);
233
- return seleniumServer.start(60 * 1000);
234
- });
235
- }
236
- fn(new TestEnvironment(browser, serverToUse));
237
- });
238
- });
239
- } finally {
240
- inSuite = false;
241
- }
242
- }
58
+ process.on('unhandledRejection', (reason) => {
59
+ console.error('Unhandled promise rejection:', reason);
60
+ });
243
61
 
244
62
 
245
- // GLOBAL TEST SETUP
63
+ if (/^1|true$/i.test(process.env['SELENIUM_VERBOSE'])) {
64
+ logging.installConsoleHandler();
65
+ logging.getLogger('webdriver.http').setLevel(logging.Level.ALL);
66
+ }
67
+
68
+ testing.init();
246
69
 
247
70
  before(function() {
248
71
  // Do not pass register fileserver.start directly with testing.before,
@@ -255,16 +78,11 @@ after(function() {
255
78
  return fileserver.stop();
256
79
  });
257
80
 
81
+
258
82
  // PUBLIC API
259
83
 
260
84
 
261
85
  exports.suite = suite;
262
- exports.after = testing.after;
263
- exports.afterEach = testing.afterEach;
264
- exports.before = testing.before;
265
- exports.beforeEach = testing.beforeEach;
266
- exports.it = testing.it;
267
86
  exports.ignore = testing.ignore;
268
-
269
87
  exports.Pages = fileserver.Pages;
270
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.