UNPKG

49.1 kBJavaScriptView Raw
1(function (global, factory) {
2 typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('@angular/cdk/testing'), require('selenium-webdriver')) :
3 typeof define === 'function' && define.amd ? define('@angular/cdk/testing/selenium-webdriver', ['exports', '@angular/cdk/testing', 'selenium-webdriver'], factory) :
4 (global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory((global.ng = global.ng || {}, global.ng.cdk = global.ng.cdk || {}, global.ng.cdk.testing = global.ng.cdk.testing || {}, global.ng.cdk.testing.seleniumWebdriver = {}), global.ng.cdk.testing, global['selenium-webdriver']));
5}(this, (function (exports, testing, webdriver) { 'use strict';
6
7 function _interopNamespace(e) {
8 if (e && e.__esModule) return e;
9 var n = Object.create(null);
10 if (e) {
11 Object.keys(e).forEach(function (k) {
12 if (k !== 'default') {
13 var d = Object.getOwnPropertyDescriptor(e, k);
14 Object.defineProperty(n, k, d.get ? d : {
15 enumerable: true,
16 get: function () {
17 return e[k];
18 }
19 });
20 }
21 });
22 }
23 n['default'] = e;
24 return Object.freeze(n);
25 }
26
27 var webdriver__namespace = /*#__PURE__*/_interopNamespace(webdriver);
28
29 /*! *****************************************************************************
30 Copyright (c) Microsoft Corporation.
31
32 Permission to use, copy, modify, and/or distribute this software for any
33 purpose with or without fee is hereby granted.
34
35 THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
36 REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
37 AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
38 INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
39 LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
40 OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
41 PERFORMANCE OF THIS SOFTWARE.
42 ***************************************************************************** */
43 /* global Reflect, Promise */
44 var extendStatics = function (d, b) {
45 extendStatics = Object.setPrototypeOf ||
46 ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
47 function (d, b) { for (var p in b)
48 if (Object.prototype.hasOwnProperty.call(b, p))
49 d[p] = b[p]; };
50 return extendStatics(d, b);
51 };
52 function __extends(d, b) {
53 if (typeof b !== "function" && b !== null)
54 throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");
55 extendStatics(d, b);
56 function __() { this.constructor = d; }
57 d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
58 }
59 var __assign = function () {
60 __assign = Object.assign || function __assign(t) {
61 for (var s, i = 1, n = arguments.length; i < n; i++) {
62 s = arguments[i];
63 for (var p in s)
64 if (Object.prototype.hasOwnProperty.call(s, p))
65 t[p] = s[p];
66 }
67 return t;
68 };
69 return __assign.apply(this, arguments);
70 };
71 function __rest(s, e) {
72 var t = {};
73 for (var p in s)
74 if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
75 t[p] = s[p];
76 if (s != null && typeof Object.getOwnPropertySymbols === "function")
77 for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
78 if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
79 t[p[i]] = s[p[i]];
80 }
81 return t;
82 }
83 function __decorate(decorators, target, key, desc) {
84 var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
85 if (typeof Reflect === "object" && typeof Reflect.decorate === "function")
86 r = Reflect.decorate(decorators, target, key, desc);
87 else
88 for (var i = decorators.length - 1; i >= 0; i--)
89 if (d = decorators[i])
90 r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
91 return c > 3 && r && Object.defineProperty(target, key, r), r;
92 }
93 function __param(paramIndex, decorator) {
94 return function (target, key) { decorator(target, key, paramIndex); };
95 }
96 function __metadata(metadataKey, metadataValue) {
97 if (typeof Reflect === "object" && typeof Reflect.metadata === "function")
98 return Reflect.metadata(metadataKey, metadataValue);
99 }
100 function __awaiter(thisArg, _arguments, P, generator) {
101 function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
102 return new (P || (P = Promise))(function (resolve, reject) {
103 function fulfilled(value) { try {
104 step(generator.next(value));
105 }
106 catch (e) {
107 reject(e);
108 } }
109 function rejected(value) { try {
110 step(generator["throw"](value));
111 }
112 catch (e) {
113 reject(e);
114 } }
115 function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
116 step((generator = generator.apply(thisArg, _arguments || [])).next());
117 });
118 }
119 function __generator(thisArg, body) {
120 var _ = { label: 0, sent: function () { if (t[0] & 1)
121 throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
122 return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function () { return this; }), g;
123 function verb(n) { return function (v) { return step([n, v]); }; }
124 function step(op) {
125 if (f)
126 throw new TypeError("Generator is already executing.");
127 while (_)
128 try {
129 if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done)
130 return t;
131 if (y = 0, t)
132 op = [op[0] & 2, t.value];
133 switch (op[0]) {
134 case 0:
135 case 1:
136 t = op;
137 break;
138 case 4:
139 _.label++;
140 return { value: op[1], done: false };
141 case 5:
142 _.label++;
143 y = op[1];
144 op = [0];
145 continue;
146 case 7:
147 op = _.ops.pop();
148 _.trys.pop();
149 continue;
150 default:
151 if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) {
152 _ = 0;
153 continue;
154 }
155 if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) {
156 _.label = op[1];
157 break;
158 }
159 if (op[0] === 6 && _.label < t[1]) {
160 _.label = t[1];
161 t = op;
162 break;
163 }
164 if (t && _.label < t[2]) {
165 _.label = t[2];
166 _.ops.push(op);
167 break;
168 }
169 if (t[2])
170 _.ops.pop();
171 _.trys.pop();
172 continue;
173 }
174 op = body.call(thisArg, _);
175 }
176 catch (e) {
177 op = [6, e];
178 y = 0;
179 }
180 finally {
181 f = t = 0;
182 }
183 if (op[0] & 5)
184 throw op[1];
185 return { value: op[0] ? op[1] : void 0, done: true };
186 }
187 }
188 var __createBinding = Object.create ? (function (o, m, k, k2) {
189 if (k2 === undefined)
190 k2 = k;
191 Object.defineProperty(o, k2, { enumerable: true, get: function () { return m[k]; } });
192 }) : (function (o, m, k, k2) {
193 if (k2 === undefined)
194 k2 = k;
195 o[k2] = m[k];
196 });
197 function __exportStar(m, o) {
198 for (var p in m)
199 if (p !== "default" && !Object.prototype.hasOwnProperty.call(o, p))
200 __createBinding(o, m, p);
201 }
202 function __values(o) {
203 var s = typeof Symbol === "function" && Symbol.iterator, m = s && o[s], i = 0;
204 if (m)
205 return m.call(o);
206 if (o && typeof o.length === "number")
207 return {
208 next: function () {
209 if (o && i >= o.length)
210 o = void 0;
211 return { value: o && o[i++], done: !o };
212 }
213 };
214 throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined.");
215 }
216 function __read(o, n) {
217 var m = typeof Symbol === "function" && o[Symbol.iterator];
218 if (!m)
219 return o;
220 var i = m.call(o), r, ar = [], e;
221 try {
222 while ((n === void 0 || n-- > 0) && !(r = i.next()).done)
223 ar.push(r.value);
224 }
225 catch (error) {
226 e = { error: error };
227 }
228 finally {
229 try {
230 if (r && !r.done && (m = i["return"]))
231 m.call(i);
232 }
233 finally {
234 if (e)
235 throw e.error;
236 }
237 }
238 return ar;
239 }
240 /** @deprecated */
241 function __spread() {
242 for (var ar = [], i = 0; i < arguments.length; i++)
243 ar = ar.concat(__read(arguments[i]));
244 return ar;
245 }
246 /** @deprecated */
247 function __spreadArrays() {
248 for (var s = 0, i = 0, il = arguments.length; i < il; i++)
249 s += arguments[i].length;
250 for (var r = Array(s), k = 0, i = 0; i < il; i++)
251 for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)
252 r[k] = a[j];
253 return r;
254 }
255 function __spreadArray(to, from, pack) {
256 if (pack || arguments.length === 2)
257 for (var i = 0, l = from.length, ar; i < l; i++) {
258 if (ar || !(i in from)) {
259 if (!ar)
260 ar = Array.prototype.slice.call(from, 0, i);
261 ar[i] = from[i];
262 }
263 }
264 return to.concat(ar || from);
265 }
266 function __await(v) {
267 return this instanceof __await ? (this.v = v, this) : new __await(v);
268 }
269 function __asyncGenerator(thisArg, _arguments, generator) {
270 if (!Symbol.asyncIterator)
271 throw new TypeError("Symbol.asyncIterator is not defined.");
272 var g = generator.apply(thisArg, _arguments || []), i, q = [];
273 return i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function () { return this; }, i;
274 function verb(n) { if (g[n])
275 i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }
276 function resume(n, v) { try {
277 step(g[n](v));
278 }
279 catch (e) {
280 settle(q[0][3], e);
281 } }
282 function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }
283 function fulfill(value) { resume("next", value); }
284 function reject(value) { resume("throw", value); }
285 function settle(f, v) { if (f(v), q.shift(), q.length)
286 resume(q[0][0], q[0][1]); }
287 }
288 function __asyncDelegator(o) {
289 var i, p;
290 return i = {}, verb("next"), verb("throw", function (e) { throw e; }), verb("return"), i[Symbol.iterator] = function () { return this; }, i;
291 function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: n === "return" } : f ? f(v) : v; } : f; }
292 }
293 function __asyncValues(o) {
294 if (!Symbol.asyncIterator)
295 throw new TypeError("Symbol.asyncIterator is not defined.");
296 var m = o[Symbol.asyncIterator], i;
297 return m ? m.call(o) : (o = typeof __values === "function" ? __values(o) : o[Symbol.iterator](), i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function () { return this; }, i);
298 function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }
299 function settle(resolve, reject, d, v) { Promise.resolve(v).then(function (v) { resolve({ value: v, done: d }); }, reject); }
300 }
301 function __makeTemplateObject(cooked, raw) {
302 if (Object.defineProperty) {
303 Object.defineProperty(cooked, "raw", { value: raw });
304 }
305 else {
306 cooked.raw = raw;
307 }
308 return cooked;
309 }
310 ;
311 var __setModuleDefault = Object.create ? (function (o, v) {
312 Object.defineProperty(o, "default", { enumerable: true, value: v });
313 }) : function (o, v) {
314 o["default"] = v;
315 };
316 function __importStar(mod) {
317 if (mod && mod.__esModule)
318 return mod;
319 var result = {};
320 if (mod != null)
321 for (var k in mod)
322 if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k))
323 __createBinding(result, mod, k);
324 __setModuleDefault(result, mod);
325 return result;
326 }
327 function __importDefault(mod) {
328 return (mod && mod.__esModule) ? mod : { default: mod };
329 }
330 function __classPrivateFieldGet(receiver, state, kind, f) {
331 if (kind === "a" && !f)
332 throw new TypeError("Private accessor was defined without a getter");
333 if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver))
334 throw new TypeError("Cannot read private member from an object whose class did not declare it");
335 return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
336 }
337 function __classPrivateFieldSet(receiver, state, value, kind, f) {
338 if (kind === "m")
339 throw new TypeError("Private method is not writable");
340 if (kind === "a" && !f)
341 throw new TypeError("Private accessor was defined without a setter");
342 if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver))
343 throw new TypeError("Cannot write private member to an object whose class did not declare it");
344 return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
345 }
346
347 var _a;
348 /**
349 * Maps the `TestKey` constants to WebDriver's `webdriver.Key` constants.
350 * See https://github.com/SeleniumHQ/selenium/blob/trunk/javascript/webdriver/key.js#L29
351 */
352 var seleniumWebDriverKeyMap = (_a = {},
353 _a[testing.TestKey.BACKSPACE] = webdriver__namespace.Key.BACK_SPACE,
354 _a[testing.TestKey.TAB] = webdriver__namespace.Key.TAB,
355 _a[testing.TestKey.ENTER] = webdriver__namespace.Key.ENTER,
356 _a[testing.TestKey.SHIFT] = webdriver__namespace.Key.SHIFT,
357 _a[testing.TestKey.CONTROL] = webdriver__namespace.Key.CONTROL,
358 _a[testing.TestKey.ALT] = webdriver__namespace.Key.ALT,
359 _a[testing.TestKey.ESCAPE] = webdriver__namespace.Key.ESCAPE,
360 _a[testing.TestKey.PAGE_UP] = webdriver__namespace.Key.PAGE_UP,
361 _a[testing.TestKey.PAGE_DOWN] = webdriver__namespace.Key.PAGE_DOWN,
362 _a[testing.TestKey.END] = webdriver__namespace.Key.END,
363 _a[testing.TestKey.HOME] = webdriver__namespace.Key.HOME,
364 _a[testing.TestKey.LEFT_ARROW] = webdriver__namespace.Key.ARROW_LEFT,
365 _a[testing.TestKey.UP_ARROW] = webdriver__namespace.Key.ARROW_UP,
366 _a[testing.TestKey.RIGHT_ARROW] = webdriver__namespace.Key.ARROW_RIGHT,
367 _a[testing.TestKey.DOWN_ARROW] = webdriver__namespace.Key.ARROW_DOWN,
368 _a[testing.TestKey.INSERT] = webdriver__namespace.Key.INSERT,
369 _a[testing.TestKey.DELETE] = webdriver__namespace.Key.DELETE,
370 _a[testing.TestKey.F1] = webdriver__namespace.Key.F1,
371 _a[testing.TestKey.F2] = webdriver__namespace.Key.F2,
372 _a[testing.TestKey.F3] = webdriver__namespace.Key.F3,
373 _a[testing.TestKey.F4] = webdriver__namespace.Key.F4,
374 _a[testing.TestKey.F5] = webdriver__namespace.Key.F5,
375 _a[testing.TestKey.F6] = webdriver__namespace.Key.F6,
376 _a[testing.TestKey.F7] = webdriver__namespace.Key.F7,
377 _a[testing.TestKey.F8] = webdriver__namespace.Key.F8,
378 _a[testing.TestKey.F9] = webdriver__namespace.Key.F9,
379 _a[testing.TestKey.F10] = webdriver__namespace.Key.F10,
380 _a[testing.TestKey.F11] = webdriver__namespace.Key.F11,
381 _a[testing.TestKey.F12] = webdriver__namespace.Key.F12,
382 _a[testing.TestKey.META] = webdriver__namespace.Key.META,
383 _a);
384 /** Gets a list of WebDriver `Key`s for the given `ModifierKeys`. */
385 function getSeleniumWebDriverModifierKeys(modifiers) {
386 var result = [];
387 if (modifiers.control) {
388 result.push(webdriver__namespace.Key.CONTROL);
389 }
390 if (modifiers.alt) {
391 result.push(webdriver__namespace.Key.ALT);
392 }
393 if (modifiers.shift) {
394 result.push(webdriver__namespace.Key.SHIFT);
395 }
396 if (modifiers.meta) {
397 result.push(webdriver__namespace.Key.META);
398 }
399 return result;
400 }
401
402 /** A `TestElement` implementation for WebDriver. */
403 var SeleniumWebDriverElement = /** @class */ (function () {
404 function SeleniumWebDriverElement(element, _stabilize) {
405 this.element = element;
406 this._stabilize = _stabilize;
407 }
408 /** Blur the element. */
409 SeleniumWebDriverElement.prototype.blur = function () {
410 return __awaiter(this, void 0, void 0, function () {
411 return __generator(this, function (_a) {
412 switch (_a.label) {
413 case 0: return [4 /*yield*/, this._executeScript((function (element) { return element.blur(); }), this.element())];
414 case 1:
415 _a.sent();
416 return [4 /*yield*/, this._stabilize()];
417 case 2:
418 _a.sent();
419 return [2 /*return*/];
420 }
421 });
422 });
423 };
424 /** Clear the element's input (for input and textarea elements only). */
425 SeleniumWebDriverElement.prototype.clear = function () {
426 return __awaiter(this, void 0, void 0, function () {
427 return __generator(this, function (_a) {
428 switch (_a.label) {
429 case 0: return [4 /*yield*/, this.element().clear()];
430 case 1:
431 _a.sent();
432 return [4 /*yield*/, this._stabilize()];
433 case 2:
434 _a.sent();
435 return [2 /*return*/];
436 }
437 });
438 });
439 };
440 SeleniumWebDriverElement.prototype.click = function () {
441 var args = [];
442 for (var _i = 0; _i < arguments.length; _i++) {
443 args[_i] = arguments[_i];
444 }
445 return __awaiter(this, void 0, void 0, function () {
446 return __generator(this, function (_a) {
447 switch (_a.label) {
448 case 0: return [4 /*yield*/, this._dispatchClickEventSequence(args, webdriver__namespace.Button.LEFT)];
449 case 1:
450 _a.sent();
451 return [4 /*yield*/, this._stabilize()];
452 case 2:
453 _a.sent();
454 return [2 /*return*/];
455 }
456 });
457 });
458 };
459 SeleniumWebDriverElement.prototype.rightClick = function () {
460 var args = [];
461 for (var _i = 0; _i < arguments.length; _i++) {
462 args[_i] = arguments[_i];
463 }
464 return __awaiter(this, void 0, void 0, function () {
465 return __generator(this, function (_a) {
466 switch (_a.label) {
467 case 0: return [4 /*yield*/, this._dispatchClickEventSequence(args, webdriver__namespace.Button.RIGHT)];
468 case 1:
469 _a.sent();
470 return [4 /*yield*/, this._stabilize()];
471 case 2:
472 _a.sent();
473 return [2 /*return*/];
474 }
475 });
476 });
477 };
478 /** Focus the element. */
479 SeleniumWebDriverElement.prototype.focus = function () {
480 return __awaiter(this, void 0, void 0, function () {
481 return __generator(this, function (_a) {
482 switch (_a.label) {
483 case 0: return [4 /*yield*/, this._executeScript(function (element) { return element.focus(); }, this.element())];
484 case 1:
485 _a.sent();
486 return [4 /*yield*/, this._stabilize()];
487 case 2:
488 _a.sent();
489 return [2 /*return*/];
490 }
491 });
492 });
493 };
494 /** Get the computed value of the given CSS property for the element. */
495 SeleniumWebDriverElement.prototype.getCssValue = function (property) {
496 return __awaiter(this, void 0, void 0, function () {
497 return __generator(this, function (_a) {
498 switch (_a.label) {
499 case 0: return [4 /*yield*/, this._stabilize()];
500 case 1:
501 _a.sent();
502 return [2 /*return*/, this.element().getCssValue(property)];
503 }
504 });
505 });
506 };
507 /** Hovers the mouse over the element. */
508 SeleniumWebDriverElement.prototype.hover = function () {
509 return __awaiter(this, void 0, void 0, function () {
510 return __generator(this, function (_a) {
511 switch (_a.label) {
512 case 0: return [4 /*yield*/, this._actions().mouseMove(this.element()).perform()];
513 case 1:
514 _a.sent();
515 return [4 /*yield*/, this._stabilize()];
516 case 2:
517 _a.sent();
518 return [2 /*return*/];
519 }
520 });
521 });
522 };
523 /** Moves the mouse away from the element. */
524 SeleniumWebDriverElement.prototype.mouseAway = function () {
525 return __awaiter(this, void 0, void 0, function () {
526 return __generator(this, function (_a) {
527 switch (_a.label) {
528 case 0: return [4 /*yield*/, this._actions().mouseMove(this.element(), { x: -1, y: -1 }).perform()];
529 case 1:
530 _a.sent();
531 return [4 /*yield*/, this._stabilize()];
532 case 2:
533 _a.sent();
534 return [2 /*return*/];
535 }
536 });
537 });
538 };
539 SeleniumWebDriverElement.prototype.sendKeys = function () {
540 var modifiersAndKeys = [];
541 for (var _i = 0; _i < arguments.length; _i++) {
542 modifiersAndKeys[_i] = arguments[_i];
543 }
544 return __awaiter(this, void 0, void 0, function () {
545 var first, modifiers, rest, modifierKeys, keys;
546 var _a;
547 return __generator(this, function (_b) {
548 switch (_b.label) {
549 case 0:
550 first = modifiersAndKeys[0];
551 if (typeof first !== 'string' && typeof first !== 'number') {
552 modifiers = first;
553 rest = modifiersAndKeys.slice(1);
554 }
555 else {
556 modifiers = {};
557 rest = modifiersAndKeys;
558 }
559 modifierKeys = getSeleniumWebDriverModifierKeys(modifiers);
560 keys = rest.map(function (k) { return typeof k === 'string' ? k.split('') : [seleniumWebDriverKeyMap[k]]; })
561 .reduce(function (arr, k) { return arr.concat(k); }, [])
562 // webdriver.Key.chord doesn't work well with geckodriver (mozilla/geckodriver#1502),
563 // so avoid it if no modifier keys are required.
564 .map(function (k) {
565 var _a;
566 return modifierKeys.length > 0 ? (_a = webdriver__namespace.Key).chord.apply(_a, __spreadArray(__spreadArray([], __read(modifierKeys)), [k])) : k;
567 });
568 return [4 /*yield*/, (_a = this.element()).sendKeys.apply(_a, __spreadArray([], __read(keys)))];
569 case 1:
570 _b.sent();
571 return [4 /*yield*/, this._stabilize()];
572 case 2:
573 _b.sent();
574 return [2 /*return*/];
575 }
576 });
577 });
578 };
579 /**
580 * Gets the text from the element.
581 * @param options Options that affect what text is included.
582 */
583 SeleniumWebDriverElement.prototype.text = function (options) {
584 return __awaiter(this, void 0, void 0, function () {
585 return __generator(this, function (_a) {
586 switch (_a.label) {
587 case 0: return [4 /*yield*/, this._stabilize()];
588 case 1:
589 _a.sent();
590 if (options === null || options === void 0 ? void 0 : options.exclude) {
591 return [2 /*return*/, this._executeScript(testing._getTextWithExcludedElements, this.element(), options.exclude)];
592 }
593 // We don't go through the WebDriver `getText`, because it excludes text from hidden elements.
594 return [2 /*return*/, this._executeScript(function (element) { return (element.textContent || '').trim(); }, this.element())];
595 }
596 });
597 });
598 };
599 /** Gets the value for the given attribute from the element. */
600 SeleniumWebDriverElement.prototype.getAttribute = function (name) {
601 return __awaiter(this, void 0, void 0, function () {
602 return __generator(this, function (_a) {
603 switch (_a.label) {
604 case 0: return [4 /*yield*/, this._stabilize()];
605 case 1:
606 _a.sent();
607 return [2 /*return*/, this._executeScript(function (element, attribute) { return element.getAttribute(attribute); }, this.element(), name)];
608 }
609 });
610 });
611 };
612 /** Checks whether the element has the given class. */
613 SeleniumWebDriverElement.prototype.hasClass = function (name) {
614 return __awaiter(this, void 0, void 0, function () {
615 var classes;
616 return __generator(this, function (_a) {
617 switch (_a.label) {
618 case 0: return [4 /*yield*/, this._stabilize()];
619 case 1:
620 _a.sent();
621 return [4 /*yield*/, this.getAttribute('class')];
622 case 2:
623 classes = (_a.sent()) || '';
624 return [2 /*return*/, new Set(classes.split(/\s+/).filter(function (c) { return c; })).has(name)];
625 }
626 });
627 });
628 };
629 /** Gets the dimensions of the element. */
630 SeleniumWebDriverElement.prototype.getDimensions = function () {
631 return __awaiter(this, void 0, void 0, function () {
632 var _a, width, height, _b, left, top;
633 return __generator(this, function (_c) {
634 switch (_c.label) {
635 case 0: return [4 /*yield*/, this._stabilize()];
636 case 1:
637 _c.sent();
638 return [4 /*yield*/, this.element().getSize()];
639 case 2:
640 _a = _c.sent(), width = _a.width, height = _a.height;
641 return [4 /*yield*/, this.element().getLocation()];
642 case 3:
643 _b = _c.sent(), left = _b.x, top = _b.y;
644 return [2 /*return*/, { width: width, height: height, left: left, top: top }];
645 }
646 });
647 });
648 };
649 /** Gets the value of a property of an element. */
650 SeleniumWebDriverElement.prototype.getProperty = function (name) {
651 return __awaiter(this, void 0, void 0, function () {
652 return __generator(this, function (_a) {
653 switch (_a.label) {
654 case 0: return [4 /*yield*/, this._stabilize()];
655 case 1:
656 _a.sent();
657 return [2 /*return*/, this._executeScript(function (element, property) { return element[property]; }, this.element(), name)];
658 }
659 });
660 });
661 };
662 /** Sets the value of a property of an input. */
663 SeleniumWebDriverElement.prototype.setInputValue = function (newValue) {
664 return __awaiter(this, void 0, void 0, function () {
665 return __generator(this, function (_a) {
666 switch (_a.label) {
667 case 0: return [4 /*yield*/, this._executeScript(function (element, value) { return element.value = value; }, this.element(), newValue)];
668 case 1:
669 _a.sent();
670 return [4 /*yield*/, this._stabilize()];
671 case 2:
672 _a.sent();
673 return [2 /*return*/];
674 }
675 });
676 });
677 };
678 /** Selects the options at the specified indexes inside of a native `select` element. */
679 SeleniumWebDriverElement.prototype.selectOptions = function () {
680 var optionIndexes = [];
681 for (var _i = 0; _i < arguments.length; _i++) {
682 optionIndexes[_i] = arguments[_i];
683 }
684 return __awaiter(this, void 0, void 0, function () {
685 var options, indexes, i;
686 return __generator(this, function (_a) {
687 switch (_a.label) {
688 case 0: return [4 /*yield*/, this._stabilize()];
689 case 1:
690 _a.sent();
691 return [4 /*yield*/, this.element().findElements(webdriver__namespace.By.css('option'))];
692 case 2:
693 options = _a.sent();
694 indexes = new Set(optionIndexes);
695 if (!(options.length && indexes.size)) return [3 /*break*/, 11];
696 // Reset the value so all the selected states are cleared. We can
697 // reuse the input-specific method since the logic is the same.
698 return [4 /*yield*/, this.setInputValue('')];
699 case 3:
700 // Reset the value so all the selected states are cleared. We can
701 // reuse the input-specific method since the logic is the same.
702 _a.sent();
703 i = 0;
704 _a.label = 4;
705 case 4:
706 if (!(i < options.length)) return [3 /*break*/, 9];
707 if (!indexes.has(i)) return [3 /*break*/, 8];
708 // We have to hold the control key while clicking on options so that multiple can be
709 // selected in multi-selection mode. The key doesn't do anything for single selection.
710 return [4 /*yield*/, this._actions().keyDown(webdriver__namespace.Key.CONTROL).perform()];
711 case 5:
712 // We have to hold the control key while clicking on options so that multiple can be
713 // selected in multi-selection mode. The key doesn't do anything for single selection.
714 _a.sent();
715 return [4 /*yield*/, options[i].click()];
716 case 6:
717 _a.sent();
718 return [4 /*yield*/, this._actions().keyUp(webdriver__namespace.Key.CONTROL).perform()];
719 case 7:
720 _a.sent();
721 _a.label = 8;
722 case 8:
723 i++;
724 return [3 /*break*/, 4];
725 case 9: return [4 /*yield*/, this._stabilize()];
726 case 10:
727 _a.sent();
728 _a.label = 11;
729 case 11: return [2 /*return*/];
730 }
731 });
732 });
733 };
734 /** Checks whether this element matches the given selector. */
735 SeleniumWebDriverElement.prototype.matchesSelector = function (selector) {
736 return __awaiter(this, void 0, void 0, function () {
737 return __generator(this, function (_a) {
738 switch (_a.label) {
739 case 0: return [4 /*yield*/, this._stabilize()];
740 case 1:
741 _a.sent();
742 return [2 /*return*/, this._executeScript(function (element, s) { return (Element.prototype.matches || Element.prototype.msMatchesSelector)
743 .call(element, s); }, this.element(), selector)];
744 }
745 });
746 });
747 };
748 /** Checks whether the element is focused. */
749 SeleniumWebDriverElement.prototype.isFocused = function () {
750 return __awaiter(this, void 0, void 0, function () {
751 return __generator(this, function (_a) {
752 switch (_a.label) {
753 case 0: return [4 /*yield*/, this._stabilize()];
754 case 1:
755 _a.sent();
756 return [2 /*return*/, webdriver__namespace.WebElement.equals(this.element(), this.element().getDriver().switchTo().activeElement())];
757 }
758 });
759 });
760 };
761 /**
762 * Dispatches an event with a particular name.
763 * @param name Name of the event to be dispatched.
764 */
765 SeleniumWebDriverElement.prototype.dispatchEvent = function (name, data) {
766 return __awaiter(this, void 0, void 0, function () {
767 return __generator(this, function (_a) {
768 switch (_a.label) {
769 case 0: return [4 /*yield*/, this._executeScript(dispatchEvent, name, this.element(), data)];
770 case 1:
771 _a.sent();
772 return [4 /*yield*/, this._stabilize()];
773 case 2:
774 _a.sent();
775 return [2 /*return*/];
776 }
777 });
778 });
779 };
780 /** Gets the webdriver action sequence. */
781 SeleniumWebDriverElement.prototype._actions = function () {
782 return this.element().getDriver().actions();
783 };
784 /** Executes a function in the browser. */
785 SeleniumWebDriverElement.prototype._executeScript = function (script) {
786 var var_args = [];
787 for (var _i = 1; _i < arguments.length; _i++) {
788 var_args[_i - 1] = arguments[_i];
789 }
790 return __awaiter(this, void 0, void 0, function () {
791 var _a;
792 return __generator(this, function (_b) {
793 return [2 /*return*/, (_a = this.element().getDriver()).executeScript.apply(_a, __spreadArray([script], __read(var_args)))];
794 });
795 });
796 };
797 /** Dispatches all the events that are part of a click event sequence. */
798 SeleniumWebDriverElement.prototype._dispatchClickEventSequence = function (args, button) {
799 return __awaiter(this, void 0, void 0, function () {
800 var modifiers, modifierKeys, offsetArgs, actions, modifierKeys_1, modifierKeys_1_1, modifierKey, modifierKeys_2, modifierKeys_2_1, modifierKey;
801 var _a, e_1, _b, e_2, _c;
802 return __generator(this, function (_d) {
803 switch (_d.label) {
804 case 0:
805 modifiers = {};
806 if (args.length && typeof args[args.length - 1] === 'object') {
807 modifiers = args.pop();
808 }
809 modifierKeys = getSeleniumWebDriverModifierKeys(modifiers);
810 offsetArgs = (args.length === 2 ?
811 [{ x: args[0], y: args[1] }] : []);
812 actions = (_a = this._actions()).mouseMove.apply(_a, __spreadArray([this.element()], __read(offsetArgs)));
813 try {
814 for (modifierKeys_1 = __values(modifierKeys), modifierKeys_1_1 = modifierKeys_1.next(); !modifierKeys_1_1.done; modifierKeys_1_1 = modifierKeys_1.next()) {
815 modifierKey = modifierKeys_1_1.value;
816 actions = actions.keyDown(modifierKey);
817 }
818 }
819 catch (e_1_1) { e_1 = { error: e_1_1 }; }
820 finally {
821 try {
822 if (modifierKeys_1_1 && !modifierKeys_1_1.done && (_b = modifierKeys_1.return)) _b.call(modifierKeys_1);
823 }
824 finally { if (e_1) throw e_1.error; }
825 }
826 actions = actions.click(button);
827 try {
828 for (modifierKeys_2 = __values(modifierKeys), modifierKeys_2_1 = modifierKeys_2.next(); !modifierKeys_2_1.done; modifierKeys_2_1 = modifierKeys_2.next()) {
829 modifierKey = modifierKeys_2_1.value;
830 actions = actions.keyUp(modifierKey);
831 }
832 }
833 catch (e_2_1) { e_2 = { error: e_2_1 }; }
834 finally {
835 try {
836 if (modifierKeys_2_1 && !modifierKeys_2_1.done && (_c = modifierKeys_2.return)) _c.call(modifierKeys_2);
837 }
838 finally { if (e_2) throw e_2.error; }
839 }
840 return [4 /*yield*/, actions.perform()];
841 case 1:
842 _d.sent();
843 return [2 /*return*/];
844 }
845 });
846 });
847 };
848 return SeleniumWebDriverElement;
849 }());
850 /**
851 * Dispatches an event with a particular name and data to an element. Note that this needs to be a
852 * pure function, because it gets stringified by WebDriver and is executed inside the browser.
853 */
854 function dispatchEvent(name, element, data) {
855 var event = document.createEvent('Event');
856 event.initEvent(name);
857 // tslint:disable-next-line:ban Have to use `Object.assign` to preserve the original object.
858 Object.assign(event, data || {});
859 element.dispatchEvent(event);
860 }
861
862 /** The default environment options. */
863 var defaultEnvironmentOptions = {
864 queryFn: function (selector, root) { return __awaiter(void 0, void 0, void 0, function () { return __generator(this, function (_a) {
865 return [2 /*return*/, root().findElements(webdriver__namespace.By.css(selector))];
866 }); }); }
867 };
868 /**
869 * This function is meant to be executed in the browser. It taps into the hooks exposed by Angular
870 * and invokes the specified `callback` when the application is stable (no more pending tasks).
871 */
872 function whenStable(callback) {
873 Promise.all(window.frameworkStabilizers.map(function (stabilizer) { return new Promise(stabilizer); }))
874 .then(callback);
875 }
876 /**
877 * This function is meant to be executed in the browser. It checks whether the Angular framework has
878 * bootstrapped yet.
879 */
880 function isBootstrapped() {
881 return !!window.frameworkStabilizers;
882 }
883 /** Waits for angular to be ready after the page load. */
884 function waitForAngularReady(wd) {
885 return __awaiter(this, void 0, void 0, function () {
886 return __generator(this, function (_a) {
887 switch (_a.label) {
888 case 0: return [4 /*yield*/, wd.wait(function () { return wd.executeScript(isBootstrapped); })];
889 case 1:
890 _a.sent();
891 return [4 /*yield*/, wd.executeAsyncScript(whenStable)];
892 case 2:
893 _a.sent();
894 return [2 /*return*/];
895 }
896 });
897 });
898 }
899 /** A `HarnessEnvironment` implementation for WebDriver. */
900 var SeleniumWebDriverHarnessEnvironment = /** @class */ (function (_super) {
901 __extends(SeleniumWebDriverHarnessEnvironment, _super);
902 function SeleniumWebDriverHarnessEnvironment(rawRootElement, options) {
903 var _this = _super.call(this, rawRootElement) || this;
904 _this._options = Object.assign(Object.assign({}, defaultEnvironmentOptions), options);
905 return _this;
906 }
907 /** Gets the ElementFinder corresponding to the given TestElement. */
908 SeleniumWebDriverHarnessEnvironment.getNativeElement = function (el) {
909 if (el instanceof SeleniumWebDriverElement) {
910 return el.element();
911 }
912 throw Error('This TestElement was not created by the WebDriverHarnessEnvironment');
913 };
914 /** Creates a `HarnessLoader` rooted at the document root. */
915 SeleniumWebDriverHarnessEnvironment.loader = function (driver, options) {
916 return new SeleniumWebDriverHarnessEnvironment(function () { return driver.findElement(webdriver__namespace.By.css('body')); }, options);
917 };
918 /**
919 * Flushes change detection and async tasks captured in the Angular zone.
920 * In most cases it should not be necessary to call this manually. However, there may be some edge
921 * cases where it is needed to fully flush animation events.
922 */
923 SeleniumWebDriverHarnessEnvironment.prototype.forceStabilize = function () {
924 return __awaiter(this, void 0, void 0, function () {
925 return __generator(this, function (_a) {
926 switch (_a.label) {
927 case 0: return [4 /*yield*/, this.rawRootElement().getDriver().executeAsyncScript(whenStable)];
928 case 1:
929 _a.sent();
930 return [2 /*return*/];
931 }
932 });
933 });
934 };
935 /** @docs-private */
936 SeleniumWebDriverHarnessEnvironment.prototype.waitForTasksOutsideAngular = function () {
937 return __awaiter(this, void 0, void 0, function () {
938 return __generator(this, function (_a) {
939 return [2 /*return*/];
940 });
941 });
942 };
943 /** Gets the root element for the document. */
944 SeleniumWebDriverHarnessEnvironment.prototype.getDocumentRoot = function () {
945 var _this = this;
946 return function () { return _this.rawRootElement().getDriver().findElement(webdriver__namespace.By.css('body')); };
947 };
948 /** Creates a `TestElement` from a raw element. */
949 SeleniumWebDriverHarnessEnvironment.prototype.createTestElement = function (element) {
950 var _this = this;
951 return new SeleniumWebDriverElement(element, function () { return _this.forceStabilize(); });
952 };
953 /** Creates a `HarnessLoader` rooted at the given raw element. */
954 SeleniumWebDriverHarnessEnvironment.prototype.createEnvironment = function (element) {
955 return new SeleniumWebDriverHarnessEnvironment(element, this._options);
956 };
957 // Note: This seems to be working, though we may need to re-evaluate if we encounter issues with
958 // stale element references. `() => Promise<webdriver.WebElement[]>` seems like a more correct
959 // return type, though supporting it would require changes to the public harness API.
960 /**
961 * Gets a list of all elements matching the given selector under this environment's root element.
962 */
963 SeleniumWebDriverHarnessEnvironment.prototype.getAllRawElements = function (selector) {
964 return __awaiter(this, void 0, void 0, function () {
965 var els;
966 return __generator(this, function (_a) {
967 switch (_a.label) {
968 case 0: return [4 /*yield*/, this._options.queryFn(selector, this.rawRootElement)];
969 case 1:
970 els = _a.sent();
971 return [2 /*return*/, els.map(function (x) { return function () { return x; }; })];
972 }
973 });
974 });
975 };
976 return SeleniumWebDriverHarnessEnvironment;
977 }(testing.HarnessEnvironment));
978
979 /**
980 * @license
981 * Copyright Google LLC All Rights Reserved.
982 *
983 * Use of this source code is governed by an MIT-style license that can be
984 * found in the LICENSE file at https://angular.io/license
985 */
986
987 /**
988 * @license
989 * Copyright Google LLC All Rights Reserved.
990 *
991 * Use of this source code is governed by an MIT-style license that can be
992 * found in the LICENSE file at https://angular.io/license
993 */
994
995 exports.SeleniumWebDriverElement = SeleniumWebDriverElement;
996 exports.SeleniumWebDriverHarnessEnvironment = SeleniumWebDriverHarnessEnvironment;
997 exports.waitForAngularReady = waitForAngularReady;
998
999 Object.defineProperty(exports, '__esModule', { value: true });
1000
1001})));
1002//# sourceMappingURL=cdk-testing-selenium-webdriver.umd.js.map