@serenity-js/protractor 3.0.0-rc.2 → 3.0.0-rc.3
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.
- package/CHANGELOG.md +19 -0
- package/lib/screenplay/abilities/BrowseTheWebWithProtractor.d.ts +7 -13
- package/lib/screenplay/abilities/BrowseTheWebWithProtractor.js +8 -34
- package/lib/screenplay/abilities/BrowseTheWebWithProtractor.js.map +1 -1
- package/lib/screenplay/models/ProtractorNativeElementLocator.d.ts +9 -0
- package/lib/screenplay/models/ProtractorNativeElementLocator.js +42 -0
- package/lib/screenplay/models/ProtractorNativeElementLocator.js.map +1 -0
- package/lib/screenplay/models/ProtractorNativeElementRoot.d.ts +5 -2
- package/lib/screenplay/models/ProtractorPageElement.d.ts +3 -5
- package/lib/screenplay/models/ProtractorPageElement.js +29 -11
- package/lib/screenplay/models/ProtractorPageElement.js.map +1 -1
- package/lib/screenplay/models/index.d.ts +1 -1
- package/lib/screenplay/models/index.js +1 -1
- package/lib/screenplay/models/index.js.map +1 -1
- package/package.json +11 -11
- package/src/screenplay/abilities/BrowseTheWebWithProtractor.ts +25 -48
- package/src/screenplay/models/ProtractorNativeElementLocator.ts +65 -0
- package/src/screenplay/models/ProtractorNativeElementRoot.ts +5 -2
- package/src/screenplay/models/ProtractorPageElement.ts +38 -20
- package/src/screenplay/models/index.ts +1 -1
- package/lib/screenplay/models/ProtractorPageElements.d.ts +0 -16
- package/lib/screenplay/models/ProtractorPageElements.js +0 -62
- package/lib/screenplay/models/ProtractorPageElements.js.map +0 -1
- package/src/screenplay/models/ProtractorPageElements.ts +0 -86
package/CHANGELOG.md
CHANGED
|
@@ -3,6 +3,25 @@
|
|
|
3
3
|
All notable changes to this project will be documented in this file.
|
|
4
4
|
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
|
5
5
|
|
|
6
|
+
# [3.0.0-rc.3](https://github.com/serenity-js/serenity-js/compare/v3.0.0-rc.2...v3.0.0-rc.3) (2021-12-29)
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
### Bug Fixes
|
|
10
|
+
|
|
11
|
+
* **core:** refactored Mappable so that it's easier to implement filters ([176e0cd](https://github.com/serenity-js/serenity-js/commit/176e0cd0303d63271477b2b7a8e7b0572dda99a0)), closes [#1074](https://github.com/serenity-js/serenity-js/issues/1074)
|
|
12
|
+
* **deps:** updated tiny-types to 1.17.0 ([3187051](https://github.com/serenity-js/serenity-js/commit/3187051594158b4b450c82e851e417fd2ed21652))
|
|
13
|
+
* **web:** refactored Selector and NativeElementLocator classes to simplify the implementation ([f0c8f11](https://github.com/serenity-js/serenity-js/commit/f0c8f113433958877d36f13d0bc7f355ea68d280))
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
### Features
|
|
17
|
+
|
|
18
|
+
* **web:** isVisible checks if the element is in viewport and not hidden behind other elements ([429040f](https://github.com/serenity-js/serenity-js/commit/429040fb32b04cd4bc7524100635203fd8128eb6))
|
|
19
|
+
* **web:** re-introduced PageElements.where DSL and universal By selectors ([39fe0a1](https://github.com/serenity-js/serenity-js/commit/39fe0a10edf7f652e93911159e4a4689c36d6876)), closes [#1081](https://github.com/serenity-js/serenity-js/issues/1081)
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
|
|
6
25
|
# [3.0.0-rc.2](https://github.com/serenity-js/serenity-js/compare/v3.0.0-rc.1...v3.0.0-rc.2) (2021-12-09)
|
|
7
26
|
|
|
8
27
|
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import { Duration, UsesAbilities } from '@serenity-js/core';
|
|
2
|
-
import { BrowserCapabilities, BrowseTheWeb, Cookie, CookieData, Key, ModalDialog, Page, PageElement,
|
|
3
|
-
import { ProtractorBrowser } from 'protractor';
|
|
2
|
+
import { BrowserCapabilities, BrowseTheWeb, Cookie, CookieData, Key, ModalDialog, NativeElementLocator, Page, PageElement, Selector } from '@serenity-js/web';
|
|
3
|
+
import { ElementFinder, ProtractorBrowser } from 'protractor';
|
|
4
4
|
import { Capabilities } from 'selenium-webdriver';
|
|
5
|
+
import { ProtractorPageElement } from '../models';
|
|
5
6
|
/**
|
|
6
7
|
* @desc
|
|
7
8
|
* An {@link @serenity-js/core/lib/screenplay~Ability} that enables the {@link Actor} to interact with web front-ends using {@link protractor}.
|
|
@@ -31,7 +32,7 @@ import { Capabilities } from 'selenium-webdriver';
|
|
|
31
32
|
* @implements {@serenity-js/core/lib/screenplay~Ability}
|
|
32
33
|
* @see {@link @serenity-js/core/lib/screenplay/actor~Actor}
|
|
33
34
|
*/
|
|
34
|
-
export declare class BrowseTheWebWithProtractor extends BrowseTheWeb {
|
|
35
|
+
export declare class BrowseTheWebWithProtractor extends BrowseTheWeb<ElementFinder> {
|
|
35
36
|
protected browser: ProtractorBrowser;
|
|
36
37
|
/**
|
|
37
38
|
* @desc
|
|
@@ -63,16 +64,9 @@ export declare class BrowseTheWebWithProtractor extends BrowseTheWeb {
|
|
|
63
64
|
cookie(name: string): Promise<Cookie>;
|
|
64
65
|
setCookie(cookieData: CookieData): Promise<void>;
|
|
65
66
|
deleteAllCookies(): Promise<void>;
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
findByTagName(selector: string): PageElement<any, any>;
|
|
70
|
-
findByXPath(selector: string): PageElement<any, any>;
|
|
71
|
-
findAllByCss(selector: string): PageElements<any, any, any>;
|
|
72
|
-
findAllByTagName(selector: string): PageElements<any, any, any>;
|
|
73
|
-
findAllByXPath(selector: string): PageElements<any, any, any>;
|
|
74
|
-
private find;
|
|
75
|
-
private findAll;
|
|
67
|
+
locate<T>(selector: Selector<T>, locator?: NativeElementLocator<ElementFinder>): ProtractorPageElement;
|
|
68
|
+
locateAll<T>(selector: Selector<T>, locator?: NativeElementLocator<ElementFinder>): Promise<ProtractorPageElement[]>;
|
|
69
|
+
nativeElementLocator(): NativeElementLocator<ElementFinder>;
|
|
76
70
|
navigateTo(destination: string): Promise<void>;
|
|
77
71
|
navigateBack(): Promise<void>;
|
|
78
72
|
navigateForward(): Promise<void>;
|
|
@@ -3,7 +3,6 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.BrowseTheWebWithProtractor = void 0;
|
|
4
4
|
const core_1 = require("@serenity-js/core");
|
|
5
5
|
const web_1 = require("@serenity-js/web");
|
|
6
|
-
const protractor_1 = require("protractor");
|
|
7
6
|
const models_1 = require("../models");
|
|
8
7
|
const promised_1 = require("../promised");
|
|
9
8
|
/**
|
|
@@ -92,41 +91,16 @@ class BrowseTheWebWithProtractor extends web_1.BrowseTheWeb {
|
|
|
92
91
|
deleteAllCookies() {
|
|
93
92
|
return (0, promised_1.promised)(this.browser.manage().deleteAllCookies());
|
|
94
93
|
}
|
|
95
|
-
|
|
96
|
-
return
|
|
94
|
+
locate(selector, locator) {
|
|
95
|
+
return new models_1.ProtractorPageElement(selector, locator !== null && locator !== void 0 ? locator : this.nativeElementLocator());
|
|
97
96
|
}
|
|
98
|
-
|
|
99
|
-
|
|
97
|
+
async locateAll(selector, locator) {
|
|
98
|
+
const l = locator !== null && locator !== void 0 ? locator : this.nativeElementLocator();
|
|
99
|
+
const elements = await l.locateAll(selector);
|
|
100
|
+
return elements.map(element => new models_1.ProtractorPageElement(selector, new web_1.PassThroughNativeElementLocator(locator, element)));
|
|
100
101
|
}
|
|
101
|
-
|
|
102
|
-
return
|
|
103
|
-
}
|
|
104
|
-
findByTagName(selector) {
|
|
105
|
-
return this.find(root => root.element(protractor_1.by.tagName(selector)));
|
|
106
|
-
}
|
|
107
|
-
findByXPath(selector) {
|
|
108
|
-
return this.find(root => root.element(protractor_1.by.xpath(selector)));
|
|
109
|
-
}
|
|
110
|
-
findAllByCss(selector) {
|
|
111
|
-
return this.findAll(root => root.all(protractor_1.by.css(selector)));
|
|
112
|
-
}
|
|
113
|
-
findAllByTagName(selector) {
|
|
114
|
-
return this.findAll(root => root.all(protractor_1.by.tagName(selector)));
|
|
115
|
-
}
|
|
116
|
-
findAllByXPath(selector) {
|
|
117
|
-
return this.findAll(root => root.all(protractor_1.by.xpath(selector)));
|
|
118
|
-
}
|
|
119
|
-
find(locator) {
|
|
120
|
-
return new models_1.ProtractorPageElement(() => ({
|
|
121
|
-
element: this.browser.element.bind(this.browser),
|
|
122
|
-
all: this.browser.element.all.bind(this.browser),
|
|
123
|
-
}), locator);
|
|
124
|
-
}
|
|
125
|
-
findAll(locator) {
|
|
126
|
-
return new models_1.ProtractorPageElements(() => ({
|
|
127
|
-
element: this.browser.element.bind(this.browser),
|
|
128
|
-
all: this.browser.element.all.bind(this.browser),
|
|
129
|
-
}), locator);
|
|
102
|
+
nativeElementLocator() {
|
|
103
|
+
return new models_1.ProtractorNativeElementLocator(() => this.browser);
|
|
130
104
|
}
|
|
131
105
|
navigateTo(destination) {
|
|
132
106
|
return (0, promised_1.promised)(this.browser.get(destination));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BrowseTheWebWithProtractor.js","sourceRoot":"","sources":["../../../src/screenplay/abilities/BrowseTheWebWithProtractor.ts"],"names":[],"mappings":";;;AAAA,4CAA4F;AAC5F,
|
|
1
|
+
{"version":3,"file":"BrowseTheWebWithProtractor.js","sourceRoot":"","sources":["../../../src/screenplay/abilities/BrowseTheWebWithProtractor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { NativeElementLocator, Selector } from '@serenity-js/web';
|
|
2
|
+
import { ElementFinder } from 'protractor';
|
|
3
|
+
import { ProtractorNativeElementRoot } from './ProtractorNativeElementRoot';
|
|
4
|
+
export declare class ProtractorNativeElementLocator implements NativeElementLocator<ElementFinder> {
|
|
5
|
+
private readonly resolver;
|
|
6
|
+
constructor(resolver: () => Promise<ProtractorNativeElementRoot> | ProtractorNativeElementRoot);
|
|
7
|
+
locate<T>(selector: Selector<T>): Promise<ElementFinder>;
|
|
8
|
+
locateAll<T>(selector: Selector<T>): Promise<Array<ElementFinder>>;
|
|
9
|
+
}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ProtractorNativeElementLocator = void 0;
|
|
4
|
+
const core_1 = require("@serenity-js/core");
|
|
5
|
+
const web_1 = require("@serenity-js/web");
|
|
6
|
+
const protractor_1 = require("protractor");
|
|
7
|
+
const tiny_types_1 = require("tiny-types");
|
|
8
|
+
const promisedWebElement_1 = require("../promisedWebElement");
|
|
9
|
+
const f = (0, core_1.format)({ markQuestions: false });
|
|
10
|
+
class ProtractorNativeElementLocator {
|
|
11
|
+
constructor(resolver) {
|
|
12
|
+
this.resolver = resolver;
|
|
13
|
+
}
|
|
14
|
+
async locate(selector) {
|
|
15
|
+
const resolver = await this.resolver();
|
|
16
|
+
const byLocator = (0, tiny_types_1.match)(selector)
|
|
17
|
+
.when(web_1.ByCss, (s) => protractor_1.by.css(s.value))
|
|
18
|
+
.when(web_1.ByCssContainingText, (s) => protractor_1.by.cssContainingText(s.value, s.text))
|
|
19
|
+
.when(web_1.ById, (s) => protractor_1.by.id(s.value))
|
|
20
|
+
.when(web_1.ByTagName, (s) => protractor_1.by.tagName(s.value))
|
|
21
|
+
.when(web_1.ByXPath, (s) => protractor_1.by.xpath(s.value))
|
|
22
|
+
.else(() => {
|
|
23
|
+
throw new core_1.LogicError(f `Selector ${selector} not supported`);
|
|
24
|
+
});
|
|
25
|
+
return (0, promisedWebElement_1.promisedWebElement)(resolver.element(byLocator));
|
|
26
|
+
}
|
|
27
|
+
async locateAll(selector) {
|
|
28
|
+
const resolver = await this.resolver();
|
|
29
|
+
const all = resolver.element.all || resolver.all;
|
|
30
|
+
const byLocator = (0, tiny_types_1.match)(selector)
|
|
31
|
+
.when(web_1.ByCss, (s) => protractor_1.by.css(s.value))
|
|
32
|
+
.when(web_1.ByTagName, (s) => protractor_1.by.tagName(s.value))
|
|
33
|
+
.when(web_1.ByXPath, (s) => protractor_1.by.xpath(s.value))
|
|
34
|
+
.else(() => {
|
|
35
|
+
throw new core_1.LogicError(f `Selector ${selector} not supported`);
|
|
36
|
+
});
|
|
37
|
+
const eaf = await all(byLocator);
|
|
38
|
+
return Promise.all(eaf.map(element => (0, promisedWebElement_1.promisedWebElement)(element)));
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
exports.ProtractorNativeElementLocator = ProtractorNativeElementLocator;
|
|
42
|
+
//# sourceMappingURL=ProtractorNativeElementLocator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ProtractorNativeElementLocator.js","sourceRoot":"","sources":["../../../src/screenplay/models/ProtractorNativeElementLocator.ts"],"names":[],"mappings":";;;AAAA,4CAAuD;AACvD,0CAAwH;AACxH,2CAAwD;AACxD,2CAAmC;AAEnC,8DAA2D;AAG3D,MAAM,CAAC,GAAG,IAAA,aAAM,EAAC,EAAE,aAAa,EAAE,KAAK,EAAE,CAAC,CAAC;AAE3C,MAAa,8BAA8B;IACvC,YAA6B,QAAkF;QAAlF,aAAQ,GAAR,QAAQ,CAA0E;IAC/G,CAAC;IAED,KAAK,CAAC,MAAM,CAAI,QAAqB;QACjC,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,QAAQ,EAAE,CAAC;QAEvC,MAAM,SAAS,GAAG,IAAA,kBAAK,EAA6B,QAAQ,CAAC;aACxD,IAAI,CAAC,WAAK,EAAE,CAAC,CAAQ,EAAE,EAAE,CACtB,eAAE,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAClB;aACA,IAAI,CAAC,yBAAmB,EAAE,CAAC,CAAsB,EAAE,EAAE,CAClD,eAAE,CAAC,iBAAiB,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,IAAI,CAAC,CACxC;aACA,IAAI,CAAC,UAAI,EAAE,CAAC,CAAO,EAAE,EAAE,CACpB,eAAE,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CACjB;aACA,IAAI,CAAC,eAAS,EAAE,CAAC,CAAY,EAAE,EAAE,CAC9B,eAAE,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CACtB;aACA,IAAI,CAAC,aAAO,EAAE,CAAC,CAAU,EAAE,EAAE,CAC1B,eAAE,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CACpB;aACA,IAAI,CAAC,GAAG,EAAE;YACP,MAAM,IAAI,iBAAU,CAAC,CAAC,CAAC,YAAa,QAAS,gBAAgB,CAAC,CAAC;QACnE,CAAC,CAAC,CAAC;QAEP,OAAO,IAAA,uCAAkB,EAAC,QAAQ,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC;IAC3D,CAAC;IAED,KAAK,CAAC,SAAS,CAAI,QAAqB;QACpC,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,QAAQ,EAAE,CAAC;QACvC,MAAM,GAAG,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,IAAI,QAAQ,CAAC,GAAG,CAAC;QAEjD,MAAM,SAAS,GAAG,IAAA,kBAAK,EAA6B,QAAQ,CAAC;aACxD,IAAI,CAAC,WAAK,EAAE,CAAC,CAAQ,EAAE,EAAE,CACtB,eAAE,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAClB;aACA,IAAI,CAAC,eAAS,EAAE,CAAC,CAAY,EAAE,EAAE,CAC9B,eAAE,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CACtB;aACA,IAAI,CAAC,aAAO,EAAE,CAAC,CAAU,EAAE,EAAE,CAC1B,eAAE,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CACpB;aACA,IAAI,CAAC,GAAG,EAAE;YACP,MAAM,IAAI,iBAAU,CAAC,CAAC,CAAC,YAAa,QAAS,gBAAgB,CAAC,CAAC;QACnE,CAAC,CAAC,CAAC;QAEP,MAAM,GAAG,GAAoB,MAAM,GAAG,CAAC,SAAS,CAAC,CAAC;QAElD,OAAO,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CACjC,IAAA,uCAAkB,EAAC,OAAO,CAAC,CAC9B,CAAC,CAAC;IACP,CAAC;CACJ;AAtDD,wEAsDC"}
|
|
@@ -1,5 +1,8 @@
|
|
|
1
1
|
import { ElementArrayFinder, ElementFinder, Locator } from 'protractor';
|
|
2
2
|
export interface ProtractorNativeElementRoot {
|
|
3
|
-
element:
|
|
4
|
-
|
|
3
|
+
element: {
|
|
4
|
+
(selector: Locator): ElementFinder;
|
|
5
|
+
all?: (selector: Locator) => ElementArrayFinder;
|
|
6
|
+
};
|
|
7
|
+
all?: (selector: Locator) => ElementArrayFinder;
|
|
5
8
|
}
|
|
@@ -1,9 +1,7 @@
|
|
|
1
1
|
import { PageElement } from '@serenity-js/web';
|
|
2
2
|
import { ElementFinder } from 'protractor';
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
constructor(context: () => Promise<ProtractorNativeElementRoot> | ProtractorNativeElementRoot, locator: (root: ProtractorNativeElementRoot) => Promise<ElementFinder> | ElementFinder);
|
|
6
|
-
of(parent: ProtractorPageElement): PageElement<ProtractorNativeElementRoot, ElementFinder>;
|
|
3
|
+
export declare class ProtractorPageElement extends PageElement<ElementFinder> {
|
|
4
|
+
of(parent: ProtractorPageElement): PageElement<ElementFinder>;
|
|
7
5
|
clearValue(): Promise<void>;
|
|
8
6
|
click(): Promise<void>;
|
|
9
7
|
doubleClick(): Promise<void>;
|
|
@@ -16,8 +14,8 @@ export declare class ProtractorPageElement extends PageElement<ProtractorNativeE
|
|
|
16
14
|
value(): Promise<string>;
|
|
17
15
|
isActive(): Promise<boolean>;
|
|
18
16
|
isClickable(): Promise<boolean>;
|
|
19
|
-
isDisplayed(): Promise<boolean>;
|
|
20
17
|
isEnabled(): Promise<boolean>;
|
|
21
18
|
isPresent(): Promise<boolean>;
|
|
22
19
|
isSelected(): Promise<boolean>;
|
|
20
|
+
isVisible(): Promise<boolean>;
|
|
23
21
|
}
|
|
@@ -4,15 +4,10 @@ exports.ProtractorPageElement = void 0;
|
|
|
4
4
|
const web_1 = require("@serenity-js/web");
|
|
5
5
|
const protractor_1 = require("protractor");
|
|
6
6
|
const promised_1 = require("../promised");
|
|
7
|
-
const
|
|
7
|
+
const ProtractorNativeElementLocator_1 = require("./ProtractorNativeElementLocator");
|
|
8
8
|
class ProtractorPageElement extends web_1.PageElement {
|
|
9
|
-
constructor(context, locator) {
|
|
10
|
-
super(context, context => {
|
|
11
|
-
return (0, promisedWebElement_1.promisedWebElement)(locator(context));
|
|
12
|
-
});
|
|
13
|
-
}
|
|
14
9
|
of(parent) {
|
|
15
|
-
return new ProtractorPageElement(() => parent.nativeElement()
|
|
10
|
+
return new ProtractorPageElement(this.selector, new ProtractorNativeElementLocator_1.ProtractorNativeElementLocator(() => parent.nativeElement()));
|
|
16
11
|
}
|
|
17
12
|
async clearValue() {
|
|
18
13
|
function removeCharactersFrom(elf, numberOfCharacters) {
|
|
@@ -91,10 +86,6 @@ class ProtractorPageElement extends web_1.PageElement {
|
|
|
91
86
|
async isClickable() {
|
|
92
87
|
return this.isEnabled();
|
|
93
88
|
}
|
|
94
|
-
async isDisplayed() {
|
|
95
|
-
const element = await this.nativeElement();
|
|
96
|
-
return element.isDisplayed();
|
|
97
|
-
}
|
|
98
89
|
async isEnabled() {
|
|
99
90
|
const element = await this.nativeElement();
|
|
100
91
|
return element.isEnabled();
|
|
@@ -107,6 +98,33 @@ class ProtractorPageElement extends web_1.PageElement {
|
|
|
107
98
|
const element = await this.nativeElement();
|
|
108
99
|
return element.isSelected();
|
|
109
100
|
}
|
|
101
|
+
async isVisible() {
|
|
102
|
+
const element = await this.nativeElement();
|
|
103
|
+
if (!await element.isDisplayed()) {
|
|
104
|
+
return false;
|
|
105
|
+
}
|
|
106
|
+
const webElement = await element.getWebElement();
|
|
107
|
+
// get element at cx/cy and see if the element we found is our element, and therefore it's visible.
|
|
108
|
+
return (0, promised_1.promised)(webElement.getDriver().executeScript(`
|
|
109
|
+
var elem = arguments[0];
|
|
110
|
+
|
|
111
|
+
if (! elem.getBoundingClientRect) {
|
|
112
|
+
return false;
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
var
|
|
116
|
+
box = elem.getBoundingClientRect(),
|
|
117
|
+
cx = box.left + box.width / 2,
|
|
118
|
+
cy = box.top + box.height / 2,
|
|
119
|
+
e = document.elementFromPoint(cx, cy);
|
|
120
|
+
|
|
121
|
+
for (; e; e = e.parentElement) {
|
|
122
|
+
if (e === elem)
|
|
123
|
+
return true;
|
|
124
|
+
}
|
|
125
|
+
return false;
|
|
126
|
+
`, webElement));
|
|
127
|
+
}
|
|
110
128
|
}
|
|
111
129
|
exports.ProtractorPageElement = ProtractorPageElement;
|
|
112
130
|
//# sourceMappingURL=ProtractorPageElement.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ProtractorPageElement.js","sourceRoot":"","sources":["../../../src/screenplay/models/ProtractorPageElement.ts"],"names":[],"mappings":";;;AAAA,0CAA+C;AAC/C,2CAAuD;AAGvD,0CAAuC;AACvC,
|
|
1
|
+
{"version":3,"file":"ProtractorPageElement.js","sourceRoot":"","sources":["../../../src/screenplay/models/ProtractorPageElement.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
export * from './ProtractorCookie';
|
|
2
2
|
export * from './ProtractorModalDialog';
|
|
3
|
+
export * from './ProtractorNativeElementLocator';
|
|
3
4
|
export * from './ProtractorNativeElementRoot';
|
|
4
5
|
export * from './ProtractorPage';
|
|
5
6
|
export * from './ProtractorPageElement';
|
|
6
|
-
export * from './ProtractorPageElements';
|
|
@@ -12,8 +12,8 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
|
12
12
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
13
13
|
__exportStar(require("./ProtractorCookie"), exports);
|
|
14
14
|
__exportStar(require("./ProtractorModalDialog"), exports);
|
|
15
|
+
__exportStar(require("./ProtractorNativeElementLocator"), exports);
|
|
15
16
|
__exportStar(require("./ProtractorNativeElementRoot"), exports);
|
|
16
17
|
__exportStar(require("./ProtractorPage"), exports);
|
|
17
18
|
__exportStar(require("./ProtractorPageElement"), exports);
|
|
18
|
-
__exportStar(require("./ProtractorPageElements"), exports);
|
|
19
19
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/screenplay/models/index.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,qDAAmC;AACnC,0DAAwC;AACxC,gEAA8C;AAC9C,mDAAiC;AACjC,0DAAwC
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/screenplay/models/index.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,qDAAmC;AACnC,0DAAwC;AACxC,mEAAiD;AACjD,gEAA8C;AAC9C,mDAAiC;AACjC,0DAAwC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@serenity-js/protractor",
|
|
3
|
-
"version": "3.0.0-rc.
|
|
3
|
+
"version": "3.0.0-rc.3",
|
|
4
4
|
"description": "Test your web apps with Serenity/JS",
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "Jan Molak",
|
|
@@ -50,11 +50,11 @@
|
|
|
50
50
|
"npm": "^6 || ^7 || ^8"
|
|
51
51
|
},
|
|
52
52
|
"dependencies": {
|
|
53
|
-
"@serenity-js/assertions": "3.0.0-rc.
|
|
54
|
-
"@serenity-js/core": "3.0.0-rc.
|
|
53
|
+
"@serenity-js/assertions": "3.0.0-rc.3",
|
|
54
|
+
"@serenity-js/core": "3.0.0-rc.3",
|
|
55
55
|
"deepmerge": "^4.2.2",
|
|
56
56
|
"is-plain-object": "^5.0.0",
|
|
57
|
-
"tiny-types": "^1.
|
|
57
|
+
"tiny-types": "^1.17.0"
|
|
58
58
|
},
|
|
59
59
|
"peerDependencies": {
|
|
60
60
|
"@serenity-js/cucumber": "^3.0.0-rc",
|
|
@@ -77,12 +77,12 @@
|
|
|
77
77
|
"devDependencies": {
|
|
78
78
|
"@documentation/esdoc-template": "3.0.0",
|
|
79
79
|
"@integration/testing-tools": "3.0.0",
|
|
80
|
-
"@serenity-js/cucumber": "3.0.0-rc.
|
|
81
|
-
"@serenity-js/jasmine": "3.0.0-rc.
|
|
82
|
-
"@serenity-js/local-server": "3.0.0-rc.
|
|
83
|
-
"@serenity-js/mocha": "3.0.0-rc.
|
|
84
|
-
"@serenity-js/rest": "3.0.0-rc.
|
|
85
|
-
"@serenity-js/web": "3.0.0-rc.
|
|
80
|
+
"@serenity-js/cucumber": "3.0.0-rc.3",
|
|
81
|
+
"@serenity-js/jasmine": "3.0.0-rc.3",
|
|
82
|
+
"@serenity-js/local-server": "3.0.0-rc.3",
|
|
83
|
+
"@serenity-js/mocha": "3.0.0-rc.3",
|
|
84
|
+
"@serenity-js/rest": "3.0.0-rc.3",
|
|
85
|
+
"@serenity-js/web": "3.0.0-rc.3",
|
|
86
86
|
"@types/chai": "^4.3.0",
|
|
87
87
|
"@types/express": "^4.17.13",
|
|
88
88
|
"@types/html-minifier": "^4.0.1",
|
|
@@ -122,5 +122,5 @@
|
|
|
122
122
|
"cache": true,
|
|
123
123
|
"all": true
|
|
124
124
|
},
|
|
125
|
-
"gitHead": "
|
|
125
|
+
"gitHead": "69da7444e581c457e29e87edcd910ec06a069338"
|
|
126
126
|
}
|
|
@@ -1,9 +1,21 @@
|
|
|
1
1
|
import { ConfigurationError, Duration, LogicError, UsesAbilities } from '@serenity-js/core';
|
|
2
|
-
import {
|
|
3
|
-
|
|
2
|
+
import {
|
|
3
|
+
BrowserCapabilities,
|
|
4
|
+
BrowseTheWeb,
|
|
5
|
+
Cookie,
|
|
6
|
+
CookieData,
|
|
7
|
+
Key,
|
|
8
|
+
ModalDialog,
|
|
9
|
+
NativeElementLocator,
|
|
10
|
+
Page,
|
|
11
|
+
PageElement,
|
|
12
|
+
PassThroughNativeElementLocator,
|
|
13
|
+
Selector,
|
|
14
|
+
} from '@serenity-js/web';
|
|
15
|
+
import { ElementFinder, ProtractorBrowser, WebElementPromise } from 'protractor';
|
|
4
16
|
import { Capabilities } from 'selenium-webdriver';
|
|
5
17
|
|
|
6
|
-
import { ProtractorCookie, ProtractorModalDialog,
|
|
18
|
+
import { ProtractorCookie, ProtractorModalDialog, ProtractorNativeElementLocator, ProtractorPage, ProtractorPageElement } from '../models';
|
|
7
19
|
import { promised } from '../promised';
|
|
8
20
|
|
|
9
21
|
/**
|
|
@@ -35,7 +47,7 @@ import { promised } from '../promised';
|
|
|
35
47
|
* @implements {@serenity-js/core/lib/screenplay~Ability}
|
|
36
48
|
* @see {@link @serenity-js/core/lib/screenplay/actor~Actor}
|
|
37
49
|
*/
|
|
38
|
-
export class BrowseTheWebWithProtractor extends BrowseTheWeb {
|
|
50
|
+
export class BrowseTheWebWithProtractor extends BrowseTheWeb<ElementFinder> {
|
|
39
51
|
|
|
40
52
|
/**
|
|
41
53
|
* @desc
|
|
@@ -105,56 +117,21 @@ export class BrowseTheWebWithProtractor extends BrowseTheWeb {
|
|
|
105
117
|
return promised(this.browser.manage().deleteAllCookies());
|
|
106
118
|
}
|
|
107
119
|
|
|
108
|
-
|
|
109
|
-
return
|
|
120
|
+
locate<T>(selector: Selector<T>, locator?: NativeElementLocator<ElementFinder>): ProtractorPageElement {
|
|
121
|
+
return new ProtractorPageElement(selector, locator ?? this.nativeElementLocator());
|
|
110
122
|
}
|
|
111
123
|
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
findById(selector: string): PageElement<any, any> {
|
|
117
|
-
return this.find(root => root.element(by.id(selector)));
|
|
118
|
-
}
|
|
119
|
-
|
|
120
|
-
findByTagName(selector: string): PageElement<any, any> {
|
|
121
|
-
return this.find(root => root.element(by.tagName(selector)));
|
|
122
|
-
}
|
|
123
|
-
|
|
124
|
-
findByXPath(selector: string): PageElement<any, any> {
|
|
125
|
-
return this.find(root => root.element(by.xpath(selector)));
|
|
126
|
-
}
|
|
124
|
+
async locateAll<T>(selector: Selector<T>, locator?: NativeElementLocator<ElementFinder>): Promise<ProtractorPageElement[]> {
|
|
125
|
+
const l = locator ?? this.nativeElementLocator();
|
|
126
|
+
const elements = await l.locateAll(selector);
|
|
127
127
|
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
}
|
|
131
|
-
|
|
132
|
-
findAllByTagName(selector: string): PageElements<any, any, any> {
|
|
133
|
-
return this.findAll(root => root.all(by.tagName(selector)));
|
|
134
|
-
}
|
|
135
|
-
|
|
136
|
-
findAllByXPath(selector: string): PageElements<any, any, any> {
|
|
137
|
-
return this.findAll(root => root.all(by.xpath(selector)));
|
|
138
|
-
}
|
|
139
|
-
|
|
140
|
-
private find(locator: (root: ProtractorNativeElementRoot) => Promise<ElementFinder> | ElementFinder): ProtractorPageElement {
|
|
141
|
-
return new ProtractorPageElement(
|
|
142
|
-
() => ({
|
|
143
|
-
element: this.browser.element.bind(this.browser),
|
|
144
|
-
all: this.browser.element.all.bind(this.browser),
|
|
145
|
-
}),
|
|
146
|
-
locator,
|
|
128
|
+
return elements.map(element =>
|
|
129
|
+
new ProtractorPageElement(selector, new PassThroughNativeElementLocator<ElementFinder>(locator, element)),
|
|
147
130
|
);
|
|
148
131
|
}
|
|
149
132
|
|
|
150
|
-
|
|
151
|
-
return new
|
|
152
|
-
() => ({
|
|
153
|
-
element: this.browser.element.bind(this.browser),
|
|
154
|
-
all: this.browser.element.all.bind(this.browser),
|
|
155
|
-
}),
|
|
156
|
-
locator,
|
|
157
|
-
);
|
|
133
|
+
nativeElementLocator(): NativeElementLocator<ElementFinder> {
|
|
134
|
+
return new ProtractorNativeElementLocator(() => this.browser);
|
|
158
135
|
}
|
|
159
136
|
|
|
160
137
|
navigateTo(destination: string): Promise<void> {
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import { format, LogicError } from '@serenity-js/core';
|
|
2
|
+
import { ByCss, ByCssContainingText, ById, ByTagName, ByXPath, NativeElementLocator, Selector } from '@serenity-js/web';
|
|
3
|
+
import { by, ElementFinder, Locator } from 'protractor';
|
|
4
|
+
import { match } from 'tiny-types';
|
|
5
|
+
|
|
6
|
+
import { promisedWebElement } from '../promisedWebElement';
|
|
7
|
+
import { ProtractorNativeElementRoot } from './ProtractorNativeElementRoot';
|
|
8
|
+
|
|
9
|
+
const f = format({ markQuestions: false });
|
|
10
|
+
|
|
11
|
+
export class ProtractorNativeElementLocator implements NativeElementLocator<ElementFinder> {
|
|
12
|
+
constructor(private readonly resolver: () => Promise<ProtractorNativeElementRoot> | ProtractorNativeElementRoot) {
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
async locate<T>(selector: Selector<T>): Promise<ElementFinder> {
|
|
16
|
+
const resolver = await this.resolver();
|
|
17
|
+
|
|
18
|
+
const byLocator = match<Selector<unknown>, Locator>(selector)
|
|
19
|
+
.when(ByCss, (s: ByCss) =>
|
|
20
|
+
by.css(s.value)
|
|
21
|
+
)
|
|
22
|
+
.when(ByCssContainingText, (s: ByCssContainingText) =>
|
|
23
|
+
by.cssContainingText(s.value, s.text)
|
|
24
|
+
)
|
|
25
|
+
.when(ById, (s: ById) =>
|
|
26
|
+
by.id(s.value)
|
|
27
|
+
)
|
|
28
|
+
.when(ByTagName, (s: ByTagName) =>
|
|
29
|
+
by.tagName(s.value)
|
|
30
|
+
)
|
|
31
|
+
.when(ByXPath, (s: ByXPath) =>
|
|
32
|
+
by.xpath(s.value)
|
|
33
|
+
)
|
|
34
|
+
.else(() => {
|
|
35
|
+
throw new LogicError(f `Selector ${ selector } not supported`);
|
|
36
|
+
});
|
|
37
|
+
|
|
38
|
+
return promisedWebElement(resolver.element(byLocator));
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
async locateAll<T>(selector: Selector<T>): Promise<Array<ElementFinder>> {
|
|
42
|
+
const resolver = await this.resolver();
|
|
43
|
+
const all = resolver.element.all || resolver.all;
|
|
44
|
+
|
|
45
|
+
const byLocator = match<Selector<unknown>, Locator>(selector)
|
|
46
|
+
.when(ByCss, (s: ByCss) =>
|
|
47
|
+
by.css(s.value)
|
|
48
|
+
)
|
|
49
|
+
.when(ByTagName, (s: ByTagName) =>
|
|
50
|
+
by.tagName(s.value)
|
|
51
|
+
)
|
|
52
|
+
.when(ByXPath, (s: ByXPath) =>
|
|
53
|
+
by.xpath(s.value)
|
|
54
|
+
)
|
|
55
|
+
.else(() => {
|
|
56
|
+
throw new LogicError(f `Selector ${ selector } not supported`);
|
|
57
|
+
});
|
|
58
|
+
|
|
59
|
+
const eaf: ElementFinder[] = await all(byLocator);
|
|
60
|
+
|
|
61
|
+
return Promise.all(eaf.map(element =>
|
|
62
|
+
promisedWebElement(element)
|
|
63
|
+
));
|
|
64
|
+
}
|
|
65
|
+
}
|
|
@@ -1,6 +1,9 @@
|
|
|
1
1
|
import { ElementArrayFinder, ElementFinder, Locator } from 'protractor';
|
|
2
2
|
|
|
3
3
|
export interface ProtractorNativeElementRoot {
|
|
4
|
-
element:
|
|
5
|
-
|
|
4
|
+
element: {
|
|
5
|
+
(selector: Locator): ElementFinder;
|
|
6
|
+
all?: (selector: Locator) => ElementArrayFinder; // ProtractorBrowser implementation
|
|
7
|
+
}
|
|
8
|
+
all?: (selector: Locator) => ElementArrayFinder; // ElementFinder implementation
|
|
6
9
|
}
|
|
@@ -3,23 +3,13 @@ import { ElementFinder, protractor } from 'protractor';
|
|
|
3
3
|
import { WebElement } from 'selenium-webdriver';
|
|
4
4
|
|
|
5
5
|
import { promised } from '../promised';
|
|
6
|
-
import {
|
|
7
|
-
import { ProtractorNativeElementRoot } from './ProtractorNativeElementRoot';
|
|
6
|
+
import { ProtractorNativeElementLocator } from './ProtractorNativeElementLocator';
|
|
8
7
|
|
|
9
8
|
export class ProtractorPageElement
|
|
10
|
-
extends PageElement<
|
|
9
|
+
extends PageElement<ElementFinder>
|
|
11
10
|
{
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
locator: (root: ProtractorNativeElementRoot) => Promise<ElementFinder> | ElementFinder
|
|
15
|
-
) {
|
|
16
|
-
super(context, context => {
|
|
17
|
-
return promisedWebElement<ElementFinder>(locator(context));
|
|
18
|
-
});
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
of(parent: ProtractorPageElement): PageElement<ProtractorNativeElementRoot, ElementFinder> {
|
|
22
|
-
return new ProtractorPageElement(() => parent.nativeElement(), this.locator);
|
|
11
|
+
of(parent: ProtractorPageElement): PageElement<ElementFinder> {
|
|
12
|
+
return new ProtractorPageElement(this.selector, new ProtractorNativeElementLocator(() => parent.nativeElement()));
|
|
23
13
|
}
|
|
24
14
|
|
|
25
15
|
async clearValue(): Promise<void> {
|
|
@@ -141,12 +131,6 @@ export class ProtractorPageElement
|
|
|
141
131
|
return this.isEnabled();
|
|
142
132
|
}
|
|
143
133
|
|
|
144
|
-
async isDisplayed(): Promise<boolean> {
|
|
145
|
-
const element: ElementFinder = await this.nativeElement();
|
|
146
|
-
|
|
147
|
-
return element.isDisplayed();
|
|
148
|
-
}
|
|
149
|
-
|
|
150
134
|
async isEnabled(): Promise<boolean> {
|
|
151
135
|
const element: ElementFinder = await this.nativeElement();
|
|
152
136
|
|
|
@@ -164,4 +148,38 @@ export class ProtractorPageElement
|
|
|
164
148
|
|
|
165
149
|
return element.isSelected();
|
|
166
150
|
}
|
|
151
|
+
|
|
152
|
+
async isVisible(): Promise<boolean> {
|
|
153
|
+
const element: ElementFinder = await this.nativeElement();
|
|
154
|
+
|
|
155
|
+
if (! await element.isDisplayed()) {
|
|
156
|
+
return false;
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
const webElement: WebElement = await element.getWebElement();
|
|
160
|
+
|
|
161
|
+
// get element at cx/cy and see if the element we found is our element, and therefore it's visible.
|
|
162
|
+
return promised(webElement.getDriver().executeScript(
|
|
163
|
+
`
|
|
164
|
+
var elem = arguments[0];
|
|
165
|
+
|
|
166
|
+
if (! elem.getBoundingClientRect) {
|
|
167
|
+
return false;
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
var
|
|
171
|
+
box = elem.getBoundingClientRect(),
|
|
172
|
+
cx = box.left + box.width / 2,
|
|
173
|
+
cy = box.top + box.height / 2,
|
|
174
|
+
e = document.elementFromPoint(cx, cy);
|
|
175
|
+
|
|
176
|
+
for (; e; e = e.parentElement) {
|
|
177
|
+
if (e === elem)
|
|
178
|
+
return true;
|
|
179
|
+
}
|
|
180
|
+
return false;
|
|
181
|
+
`,
|
|
182
|
+
webElement,
|
|
183
|
+
));
|
|
184
|
+
}
|
|
167
185
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
export * from './ProtractorCookie';
|
|
2
2
|
export * from './ProtractorModalDialog';
|
|
3
|
+
export * from './ProtractorNativeElementLocator';
|
|
3
4
|
export * from './ProtractorNativeElementRoot';
|
|
4
5
|
export * from './ProtractorPage';
|
|
5
6
|
export * from './ProtractorPageElement';
|
|
6
|
-
export * from './ProtractorPageElements';
|
|
7
7
|
|
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
import { PageElement, PageElements } from '@serenity-js/web';
|
|
2
|
-
import { ElementArrayFinder, ElementFinder } from 'protractor';
|
|
3
|
-
import { ProtractorNativeElementRoot } from './ProtractorNativeElementRoot';
|
|
4
|
-
import { ProtractorPageElement } from './ProtractorPageElement';
|
|
5
|
-
export declare class ProtractorPageElements extends PageElements<ProtractorNativeElementRoot, ElementArrayFinder, ElementFinder> {
|
|
6
|
-
constructor(context: () => Promise<ProtractorNativeElementRoot> | ProtractorNativeElementRoot, locator: (root: ProtractorNativeElementRoot) => Promise<ElementArrayFinder> | ElementArrayFinder);
|
|
7
|
-
of(parent: PageElement<ProtractorNativeElementRoot, ElementFinder>): ProtractorPageElements;
|
|
8
|
-
count(): Promise<number>;
|
|
9
|
-
first(): Promise<ProtractorPageElement>;
|
|
10
|
-
last(): Promise<ProtractorPageElement>;
|
|
11
|
-
get(index: number): Promise<ProtractorPageElement>;
|
|
12
|
-
map<O>(fn: (element: PageElement, index?: number, elements?: PageElements) => Promise<O> | O): Promise<O[]>;
|
|
13
|
-
filter(fn: (element: PageElement, index?: number) => Promise<boolean> | boolean): PageElements;
|
|
14
|
-
forEach(fn: (element: PageElement, index?: number, elements?: PageElements) => Promise<void> | void): Promise<void>;
|
|
15
|
-
private asElement;
|
|
16
|
-
}
|
|
@@ -1,62 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.ProtractorPageElements = void 0;
|
|
4
|
-
const core_1 = require("@serenity-js/core");
|
|
5
|
-
const web_1 = require("@serenity-js/web");
|
|
6
|
-
const promisedWebElement_1 = require("../promisedWebElement");
|
|
7
|
-
const ProtractorPageElement_1 = require("./ProtractorPageElement");
|
|
8
|
-
class ProtractorPageElements extends web_1.PageElements {
|
|
9
|
-
constructor(context, locator) {
|
|
10
|
-
super(context, async (context) => {
|
|
11
|
-
return (0, promisedWebElement_1.promisedWebElement)(locator(context));
|
|
12
|
-
});
|
|
13
|
-
}
|
|
14
|
-
of(parent) {
|
|
15
|
-
return new ProtractorPageElements(() => parent.nativeElement(), this.locator);
|
|
16
|
-
}
|
|
17
|
-
async count() {
|
|
18
|
-
const elements = await this.nativeElementList();
|
|
19
|
-
return elements.count();
|
|
20
|
-
}
|
|
21
|
-
async first() {
|
|
22
|
-
const elements = await this.nativeElementList();
|
|
23
|
-
return this.asElement(elements.first());
|
|
24
|
-
}
|
|
25
|
-
async last() {
|
|
26
|
-
const elements = await this.nativeElementList();
|
|
27
|
-
return this.asElement(elements.last());
|
|
28
|
-
}
|
|
29
|
-
async get(index) {
|
|
30
|
-
const elements = await this.nativeElementList();
|
|
31
|
-
if (!elements.get(index)) {
|
|
32
|
-
throw new core_1.LogicError(`There's no item at index ${index}`);
|
|
33
|
-
}
|
|
34
|
-
return this.asElement(elements.get(index));
|
|
35
|
-
}
|
|
36
|
-
async map(fn) {
|
|
37
|
-
const elements = await this.nativeElementList();
|
|
38
|
-
return elements.map((element, i) => fn(new ProtractorPageElement_1.ProtractorPageElement(this.context, _context => element), i, this));
|
|
39
|
-
}
|
|
40
|
-
filter(fn) {
|
|
41
|
-
return new ProtractorPageElements(this.context, async (context) => {
|
|
42
|
-
const elements = await this.locator(context);
|
|
43
|
-
const result = elements.filter(async (nativeElement, index) => {
|
|
44
|
-
const element = new ProtractorPageElement_1.ProtractorPageElement(this.context, _context => nativeElement);
|
|
45
|
-
const result = await fn(element, index);
|
|
46
|
-
return result;
|
|
47
|
-
});
|
|
48
|
-
return (0, promisedWebElement_1.promisedWebElement)(result);
|
|
49
|
-
});
|
|
50
|
-
}
|
|
51
|
-
async forEach(fn) {
|
|
52
|
-
const elements = await this.nativeElementList();
|
|
53
|
-
return elements.each((element, index) => {
|
|
54
|
-
return fn(new ProtractorPageElement_1.ProtractorPageElement(this.context, _context => element), index, this);
|
|
55
|
-
});
|
|
56
|
-
}
|
|
57
|
-
asElement(elementFinder) {
|
|
58
|
-
return new ProtractorPageElement_1.ProtractorPageElement(this.context, _context => elementFinder);
|
|
59
|
-
}
|
|
60
|
-
}
|
|
61
|
-
exports.ProtractorPageElements = ProtractorPageElements;
|
|
62
|
-
//# sourceMappingURL=ProtractorPageElements.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ProtractorPageElements.js","sourceRoot":"","sources":["../../../src/screenplay/models/ProtractorPageElements.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,86 +0,0 @@
|
|
|
1
|
-
import { LogicError } from '@serenity-js/core';
|
|
2
|
-
import { PageElement, PageElements } from '@serenity-js/web';
|
|
3
|
-
import { ElementArrayFinder, ElementFinder } from 'protractor';
|
|
4
|
-
|
|
5
|
-
import { promisedWebElement } from '../promisedWebElement';
|
|
6
|
-
import { ProtractorNativeElementRoot } from './ProtractorNativeElementRoot';
|
|
7
|
-
import { ProtractorPageElement } from './ProtractorPageElement';
|
|
8
|
-
|
|
9
|
-
export class ProtractorPageElements
|
|
10
|
-
extends PageElements<ProtractorNativeElementRoot, ElementArrayFinder, ElementFinder>
|
|
11
|
-
{
|
|
12
|
-
constructor(
|
|
13
|
-
context: () => Promise<ProtractorNativeElementRoot> | ProtractorNativeElementRoot,
|
|
14
|
-
locator: (root: ProtractorNativeElementRoot) => Promise<ElementArrayFinder> | ElementArrayFinder
|
|
15
|
-
) {
|
|
16
|
-
super(context, async (context: ProtractorNativeElementRoot): Promise<ElementArrayFinder> => {
|
|
17
|
-
return promisedWebElement<ElementArrayFinder>(locator(context));
|
|
18
|
-
});
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
of(parent: PageElement<ProtractorNativeElementRoot, ElementFinder>): ProtractorPageElements {
|
|
22
|
-
return new ProtractorPageElements(() => parent.nativeElement(), this.locator);
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
async count(): Promise<number> {
|
|
26
|
-
const elements = await this.nativeElementList() as unknown as ElementArrayFinder;
|
|
27
|
-
return elements.count();
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
async first(): Promise<ProtractorPageElement> {
|
|
31
|
-
const elements = await this.nativeElementList() as unknown as ElementArrayFinder;
|
|
32
|
-
return this.asElement(elements.first());
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
async last(): Promise<ProtractorPageElement> {
|
|
36
|
-
const elements = await this.nativeElementList() as unknown as ElementArrayFinder;
|
|
37
|
-
return this.asElement(elements.last());
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
async get(index: number): Promise<ProtractorPageElement> {
|
|
41
|
-
const elements = await this.nativeElementList() as unknown as ElementArrayFinder;
|
|
42
|
-
|
|
43
|
-
if (! elements.get(index)) {
|
|
44
|
-
throw new LogicError(`There's no item at index ${ index }`);
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
return this.asElement(elements.get(index));
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
async map<O>(fn: (element: PageElement, index?: number, elements?: PageElements) => Promise<O> | O): Promise<O[]> {
|
|
51
|
-
const elements = await this.nativeElementList() as unknown as ElementArrayFinder;
|
|
52
|
-
|
|
53
|
-
return elements.map((element?: ElementFinder, i?: number) =>
|
|
54
|
-
fn(new ProtractorPageElement(this.context, _context => element), i, this)
|
|
55
|
-
);
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
filter(fn: (element: PageElement, index?: number) => Promise<boolean> | boolean): PageElements {
|
|
59
|
-
return new ProtractorPageElements(
|
|
60
|
-
this.context,
|
|
61
|
-
async (context: ProtractorNativeElementRoot): Promise<ElementArrayFinder> => {
|
|
62
|
-
const elements = await this.locator(context) as unknown as ElementArrayFinder;
|
|
63
|
-
|
|
64
|
-
const result = elements.filter(async (nativeElement: ElementFinder, index: number) => {
|
|
65
|
-
const element = new ProtractorPageElement(this.context, _context => nativeElement);
|
|
66
|
-
const result = await fn(element, index);
|
|
67
|
-
return result;
|
|
68
|
-
});
|
|
69
|
-
|
|
70
|
-
return promisedWebElement<ElementArrayFinder>(result);
|
|
71
|
-
}
|
|
72
|
-
);
|
|
73
|
-
}
|
|
74
|
-
|
|
75
|
-
async forEach(fn: (element: PageElement, index?: number, elements?: PageElements) => Promise<void> | void): Promise<void> {
|
|
76
|
-
const elements = await this.nativeElementList() as unknown as ElementArrayFinder
|
|
77
|
-
|
|
78
|
-
return elements.each((element: ElementFinder, index: number) => {
|
|
79
|
-
return fn(new ProtractorPageElement(this.context, _context => element), index, this);
|
|
80
|
-
});
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
private asElement(elementFinder: ElementFinder): PageElement {
|
|
84
|
-
return new ProtractorPageElement(this.context, _context => elementFinder);
|
|
85
|
-
}
|
|
86
|
-
}
|