@serenity-js/protractor 3.0.0-rc.1 → 3.0.0-rc.5
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 +49 -0
- package/lib/screenplay/abilities/BrowseTheWebWithProtractor.d.ts +5 -23
- package/lib/screenplay/abilities/BrowseTheWebWithProtractor.js +7 -48
- package/lib/screenplay/abilities/BrowseTheWebWithProtractor.js.map +1 -1
- package/lib/screenplay/interactions/UseAngular.js +2 -2
- package/lib/screenplay/interactions/UseAngular.js.map +1 -1
- package/lib/screenplay/models/ProtractorPageElement.d.ts +3 -5
- package/lib/screenplay/models/ProtractorPageElement.js +28 -11
- package/lib/screenplay/models/ProtractorPageElement.js.map +1 -1
- package/lib/screenplay/models/index.d.ts +0 -2
- package/lib/screenplay/models/index.js +0 -2
- package/lib/screenplay/models/index.js.map +1 -1
- package/lib/screenplay/models/locators/ProtractorLocator.d.ts +9 -0
- package/lib/screenplay/models/locators/ProtractorLocator.js +28 -0
- package/lib/screenplay/models/locators/ProtractorLocator.js.map +1 -0
- package/lib/screenplay/models/{ProtractorNativeElementRoot.d.ts → locators/ProtractorNativeElementRoot.d.ts} +2 -2
- package/lib/screenplay/models/{ProtractorNativeElementRoot.js → locators/ProtractorNativeElementRoot.js} +0 -0
- package/lib/screenplay/models/locators/ProtractorNativeElementRoot.js.map +1 -0
- package/lib/screenplay/models/locators/index.d.ts +2 -0
- package/lib/screenplay/models/locators/index.js +15 -0
- package/lib/screenplay/models/locators/index.js.map +1 -0
- package/lib/screenplay/questions/ProtractorParam.js +1 -1
- package/lib/screenplay/questions/ProtractorParam.js.map +1 -1
- package/lib/screenplay/{promisedWebElement.d.ts → unpromisedWebElement.d.ts} +1 -1
- package/lib/screenplay/{promisedWebElement.js → unpromisedWebElement.js} +6 -9
- package/lib/screenplay/unpromisedWebElement.js.map +1 -0
- package/package.json +14 -14
- package/src/screenplay/abilities/BrowseTheWebWithProtractor.ts +13 -70
- package/src/screenplay/interactions/UseAngular.ts +2 -2
- package/src/screenplay/models/ProtractorPageElement.ts +37 -20
- package/src/screenplay/models/index.ts +0 -2
- package/src/screenplay/models/locators/ProtractorLocator.ts +50 -0
- package/src/screenplay/models/{ProtractorNativeElementRoot.ts → locators/ProtractorNativeElementRoot.ts} +2 -2
- package/src/screenplay/models/locators/index.ts +2 -0
- package/src/screenplay/questions/ProtractorParam.ts +1 -1
- package/src/screenplay/{promisedWebElement.ts → unpromisedWebElement.ts} +3 -6
- package/lib/screenplay/models/ProtractorNativeElementRoot.js.map +0 -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/lib/screenplay/promisedWebElement.js.map +0 -1
- package/src/screenplay/models/ProtractorPageElements.ts +0 -86
package/CHANGELOG.md
CHANGED
|
@@ -3,6 +3,55 @@
|
|
|
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.5](https://github.com/serenity-js/serenity-js/compare/v3.0.0-rc.4...v3.0.0-rc.5) (2022-01-07)
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
### Features
|
|
10
|
+
|
|
11
|
+
* **web:** support for advanced PageElement locator patterns ([c1ff8b7](https://github.com/serenity-js/serenity-js/commit/c1ff8b7539ebc1da8f79ea2b6d17bb01c42f443d)), closes [#1084](https://github.com/serenity-js/serenity-js/issues/1084)
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
# [3.0.0-rc.4](https://github.com/serenity-js/serenity-js/compare/v3.0.0-rc.3...v3.0.0-rc.4) (2021-12-30)
|
|
18
|
+
|
|
19
|
+
**Note:** Version bump only for package @serenity-js/protractor
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
# [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)
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
### Bug Fixes
|
|
29
|
+
|
|
30
|
+
* **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)
|
|
31
|
+
* **deps:** updated tiny-types to 1.17.0 ([3187051](https://github.com/serenity-js/serenity-js/commit/3187051594158b4b450c82e851e417fd2ed21652))
|
|
32
|
+
* **web:** refactored Selector and NativeElementLocator classes to simplify the implementation ([f0c8f11](https://github.com/serenity-js/serenity-js/commit/f0c8f113433958877d36f13d0bc7f355ea68d280))
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
### Features
|
|
36
|
+
|
|
37
|
+
* **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))
|
|
38
|
+
* **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)
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
# [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)
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
### Bug Fixes
|
|
48
|
+
|
|
49
|
+
* **lerna:** corrected versions of internal deps ([582b922](https://github.com/serenity-js/serenity-js/commit/582b922dbade08e970cb796f15aca909f606c079))
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
|
|
6
55
|
# [3.0.0-rc.1](https://github.com/serenity-js/serenity-js/compare/v3.0.0-rc.0...v3.0.0-rc.1) (2021-12-09)
|
|
7
56
|
|
|
8
57
|
**Note:** Version bump only for package @serenity-js/protractor
|
|
@@ -1,7 +1,8 @@
|
|
|
1
|
-
import { Duration
|
|
2
|
-
import { BrowserCapabilities, BrowseTheWeb, Cookie, CookieData, Key, ModalDialog, Page, PageElement
|
|
3
|
-
import { ProtractorBrowser } from 'protractor';
|
|
1
|
+
import { Duration } from '@serenity-js/core';
|
|
2
|
+
import { BrowserCapabilities, BrowseTheWeb, Cookie, CookieData, Key, ModalDialog, Page, PageElement } from '@serenity-js/web';
|
|
3
|
+
import { ElementFinder, ProtractorBrowser } from 'protractor';
|
|
4
4
|
import { Capabilities } from 'selenium-webdriver';
|
|
5
|
+
import { ProtractorNativeElementRoot } from '../models/locators';
|
|
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, ProtractorNativeElementRoot> {
|
|
35
36
|
protected browser: ProtractorBrowser;
|
|
36
37
|
/**
|
|
37
38
|
* @desc
|
|
@@ -41,15 +42,6 @@ export declare class BrowseTheWebWithProtractor extends BrowseTheWeb {
|
|
|
41
42
|
* @returns {BrowseTheWebWithProtractor}
|
|
42
43
|
*/
|
|
43
44
|
static using(browser: ProtractorBrowser): BrowseTheWebWithProtractor;
|
|
44
|
-
/**
|
|
45
|
-
* @desc
|
|
46
|
-
* Used to access the Actor's ability to {@link BrowseTheWebWithProtractor} from within the {@link Interaction} classes,
|
|
47
|
-
* such as {@link Navigate}.
|
|
48
|
-
*
|
|
49
|
-
* @param {UsesAbilities} actor
|
|
50
|
-
* @return {BrowseTheWebWithProtractor}
|
|
51
|
-
*/
|
|
52
|
-
static as(actor: UsesAbilities): BrowseTheWebWithProtractor;
|
|
53
45
|
/**
|
|
54
46
|
* @private
|
|
55
47
|
*/
|
|
@@ -63,16 +55,6 @@ export declare class BrowseTheWebWithProtractor extends BrowseTheWeb {
|
|
|
63
55
|
cookie(name: string): Promise<Cookie>;
|
|
64
56
|
setCookie(cookieData: CookieData): Promise<void>;
|
|
65
57
|
deleteAllCookies(): Promise<void>;
|
|
66
|
-
findByCss(selector: string): PageElement<any, any>;
|
|
67
|
-
findByCssContainingText(selector: string, text: string): PageElement<any, any>;
|
|
68
|
-
findById(selector: string): PageElement<any, any>;
|
|
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;
|
|
76
58
|
navigateTo(destination: string): Promise<void>;
|
|
77
59
|
navigateBack(): Promise<void>;
|
|
78
60
|
navigateForward(): Promise<void>;
|
|
@@ -5,6 +5,7 @@ const core_1 = require("@serenity-js/core");
|
|
|
5
5
|
const web_1 = require("@serenity-js/web");
|
|
6
6
|
const protractor_1 = require("protractor");
|
|
7
7
|
const models_1 = require("../models");
|
|
8
|
+
const locators_1 = require("../models/locators");
|
|
8
9
|
const promised_1 = require("../promised");
|
|
9
10
|
/**
|
|
10
11
|
* @desc
|
|
@@ -41,7 +42,12 @@ class BrowseTheWebWithProtractor extends web_1.BrowseTheWeb {
|
|
|
41
42
|
* An instance of a protractor browser
|
|
42
43
|
*/
|
|
43
44
|
constructor(browser) {
|
|
44
|
-
super()
|
|
45
|
+
super(new Map()
|
|
46
|
+
.set(web_1.ByCss, (selector) => locators_1.ProtractorLocator.createRootLocator(this.browser, selector, protractor_1.by.css(selector.value)))
|
|
47
|
+
.set(web_1.ByCssContainingText, (selector) => locators_1.ProtractorLocator.createRootLocator(this.browser, selector, protractor_1.by.cssContainingText(selector.value, selector.text)))
|
|
48
|
+
.set(web_1.ById, (selector) => locators_1.ProtractorLocator.createRootLocator(this.browser, selector, protractor_1.by.id(selector.value)))
|
|
49
|
+
.set(web_1.ByTagName, (selector) => locators_1.ProtractorLocator.createRootLocator(this.browser, selector, protractor_1.by.tagName(selector.value)))
|
|
50
|
+
.set(web_1.ByXPath, (selector) => locators_1.ProtractorLocator.createRootLocator(this.browser, selector, protractor_1.by.xpath(selector.value))));
|
|
45
51
|
this.browser = browser;
|
|
46
52
|
}
|
|
47
53
|
/**
|
|
@@ -54,17 +60,6 @@ class BrowseTheWebWithProtractor extends web_1.BrowseTheWeb {
|
|
|
54
60
|
static using(browser) {
|
|
55
61
|
return new BrowseTheWebWithProtractor(browser);
|
|
56
62
|
}
|
|
57
|
-
/**
|
|
58
|
-
* @desc
|
|
59
|
-
* Used to access the Actor's ability to {@link BrowseTheWebWithProtractor} from within the {@link Interaction} classes,
|
|
60
|
-
* such as {@link Navigate}.
|
|
61
|
-
*
|
|
62
|
-
* @param {UsesAbilities} actor
|
|
63
|
-
* @return {BrowseTheWebWithProtractor}
|
|
64
|
-
*/
|
|
65
|
-
static as(actor) {
|
|
66
|
-
return actor.abilityTo(BrowseTheWebWithProtractor);
|
|
67
|
-
}
|
|
68
63
|
async browserCapabilities() {
|
|
69
64
|
const capabilities = await (0, promised_1.promised)(this.browser.getCapabilities());
|
|
70
65
|
return {
|
|
@@ -92,42 +87,6 @@ class BrowseTheWebWithProtractor extends web_1.BrowseTheWeb {
|
|
|
92
87
|
deleteAllCookies() {
|
|
93
88
|
return (0, promised_1.promised)(this.browser.manage().deleteAllCookies());
|
|
94
89
|
}
|
|
95
|
-
findByCss(selector) {
|
|
96
|
-
return this.find(root => root.element(protractor_1.by.css(selector)));
|
|
97
|
-
}
|
|
98
|
-
findByCssContainingText(selector, text) {
|
|
99
|
-
return this.find(root => root.element(protractor_1.by.cssContainingText(selector, text)));
|
|
100
|
-
}
|
|
101
|
-
findById(selector) {
|
|
102
|
-
return this.find(root => root.element(protractor_1.by.id(selector)));
|
|
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);
|
|
130
|
-
}
|
|
131
90
|
navigateTo(destination) {
|
|
132
91
|
return (0, promised_1.promised)(this.browser.get(destination));
|
|
133
92
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BrowseTheWebWithProtractor.js","sourceRoot":"","sources":["../../../src/screenplay/abilities/BrowseTheWebWithProtractor.ts"],"names":[],"mappings":";;;AAAA,
|
|
1
|
+
{"version":3,"file":"BrowseTheWebWithProtractor.js","sourceRoot":"","sources":["../../../src/screenplay/abilities/BrowseTheWebWithProtractor.ts"],"names":[],"mappings":"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"}
|
|
@@ -52,7 +52,7 @@ class UseAngular {
|
|
|
52
52
|
* @returns {@serenity-js/core/lib/screenplay~Interaction}
|
|
53
53
|
*/
|
|
54
54
|
static disableSynchronisation() {
|
|
55
|
-
return core_1.Interaction.where(`#actor disables synchronisation with Angular`, actor => abilities_1.BrowseTheWebWithProtractor
|
|
55
|
+
return core_1.Interaction.where(`#actor disables synchronisation with Angular`, actor => actor.abilityTo(abilities_1.BrowseTheWebWithProtractor).enableAngularSynchronisation(false).then(() => void 0));
|
|
56
56
|
}
|
|
57
57
|
/**
|
|
58
58
|
* @desc
|
|
@@ -62,7 +62,7 @@ class UseAngular {
|
|
|
62
62
|
* @returns {@serenity-js/core/lib/screenplay~Interaction}
|
|
63
63
|
*/
|
|
64
64
|
static enableSynchronisation() {
|
|
65
|
-
return core_1.Interaction.where(`#actor enables synchronisation with Angular`, actor => abilities_1.BrowseTheWebWithProtractor
|
|
65
|
+
return core_1.Interaction.where(`#actor enables synchronisation with Angular`, actor => actor.abilityTo(abilities_1.BrowseTheWebWithProtractor).enableAngularSynchronisation(true).then(() => void 0));
|
|
66
66
|
}
|
|
67
67
|
}
|
|
68
68
|
exports.UseAngular = UseAngular;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"UseAngular.js","sourceRoot":"","sources":["../../../src/screenplay/interactions/UseAngular.ts"],"names":[],"mappings":";;;AAAA,4CAAgD;AAEhD,4CAA0D;AAE1D;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuCG;AACH,MAAa,UAAU;IAEnB;;;;;;OAMG;IACH,MAAM,CAAC,sBAAsB;QACzB,OAAO,kBAAW,CAAC,KAAK,CAAC,8CAA8C,EAAE,KAAK,CAAC,EAAE,
|
|
1
|
+
{"version":3,"file":"UseAngular.js","sourceRoot":"","sources":["../../../src/screenplay/interactions/UseAngular.ts"],"names":[],"mappings":";;;AAAA,4CAAgD;AAEhD,4CAA0D;AAE1D;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuCG;AACH,MAAa,UAAU;IAEnB;;;;;;OAMG;IACH,MAAM,CAAC,sBAAsB;QACzB,OAAO,kBAAW,CAAC,KAAK,CAAC,8CAA8C,EAAE,KAAK,CAAC,EAAE,CAC5E,KAAK,CAAC,SAAS,CAAC,sCAA0B,CAAgC,CAAC,4BAA4B,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAC5I,CAAC;IAED;;;;;;OAMG;IACH,MAAM,CAAC,qBAAqB;QACxB,OAAO,kBAAW,CAAC,KAAK,CAAC,6CAA6C,EAAE,KAAK,CAAC,EAAE,CAC3E,KAAK,CAAC,SAAS,CAAC,sCAA0B,CAAgC,CAAC,4BAA4B,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAC3I,CAAC;CACJ;AAzBD,gCAyBC"}
|
|
@@ -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,9 @@ 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 promisedWebElement_1 = require("../promisedWebElement");
|
|
8
7
|
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
8
|
of(parent) {
|
|
15
|
-
return new ProtractorPageElement((
|
|
9
|
+
return new ProtractorPageElement(this.locator.of(parent.locator));
|
|
16
10
|
}
|
|
17
11
|
async clearValue() {
|
|
18
12
|
function removeCharactersFrom(elf, numberOfCharacters) {
|
|
@@ -91,10 +85,6 @@ class ProtractorPageElement extends web_1.PageElement {
|
|
|
91
85
|
async isClickable() {
|
|
92
86
|
return this.isEnabled();
|
|
93
87
|
}
|
|
94
|
-
async isDisplayed() {
|
|
95
|
-
const element = await this.nativeElement();
|
|
96
|
-
return element.isDisplayed();
|
|
97
|
-
}
|
|
98
88
|
async isEnabled() {
|
|
99
89
|
const element = await this.nativeElement();
|
|
100
90
|
return element.isEnabled();
|
|
@@ -107,6 +97,33 @@ class ProtractorPageElement extends web_1.PageElement {
|
|
|
107
97
|
const element = await this.nativeElement();
|
|
108
98
|
return element.isSelected();
|
|
109
99
|
}
|
|
100
|
+
async isVisible() {
|
|
101
|
+
const element = await this.nativeElement();
|
|
102
|
+
if (!await element.isDisplayed()) {
|
|
103
|
+
return false;
|
|
104
|
+
}
|
|
105
|
+
const webElement = await element.getWebElement();
|
|
106
|
+
// get element at cx/cy and see if the element we found is our element, and therefore it's visible.
|
|
107
|
+
return (0, promised_1.promised)(webElement.getDriver().executeScript(`
|
|
108
|
+
var elem = arguments[0];
|
|
109
|
+
|
|
110
|
+
if (! elem.getBoundingClientRect) {
|
|
111
|
+
return false;
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
var
|
|
115
|
+
box = elem.getBoundingClientRect(),
|
|
116
|
+
cx = box.left + box.width / 2,
|
|
117
|
+
cy = box.top + box.height / 2,
|
|
118
|
+
e = document.elementFromPoint(cx, cy);
|
|
119
|
+
|
|
120
|
+
for (; e; e = e.parentElement) {
|
|
121
|
+
if (e === elem)
|
|
122
|
+
return true;
|
|
123
|
+
}
|
|
124
|
+
return false;
|
|
125
|
+
`, webElement));
|
|
126
|
+
}
|
|
110
127
|
}
|
|
111
128
|
exports.ProtractorPageElement = ProtractorPageElement;
|
|
112
129
|
//# 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;
|
|
1
|
+
{"version":3,"file":"ProtractorPageElement.js","sourceRoot":"","sources":["../../../src/screenplay/models/ProtractorPageElement.ts"],"names":[],"mappings":"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"}
|
|
@@ -12,8 +12,6 @@ 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("./ProtractorNativeElementRoot"), exports);
|
|
16
15
|
__exportStar(require("./ProtractorPage"), exports);
|
|
17
16
|
__exportStar(require("./ProtractorPageElement"), exports);
|
|
18
|
-
__exportStar(require("./ProtractorPageElements"), exports);
|
|
19
17
|
//# 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,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/screenplay/models/index.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,qDAAmC;AACnC,0DAAwC;AACxC,mDAAiC;AACjC,0DAAwC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { Locator, PageElement, Selector } from '@serenity-js/web';
|
|
2
|
+
import { ElementFinder, Locator as ProtractorNativeLocator, ProtractorBrowser } from 'protractor';
|
|
3
|
+
import { ProtractorNativeElementRoot } from './ProtractorNativeElementRoot';
|
|
4
|
+
export declare class ProtractorLocator<Selector_Type extends Selector> extends Locator<ElementFinder, ProtractorNativeElementRoot, Selector_Type> {
|
|
5
|
+
static createRootLocator<ST extends Selector>(browser: ProtractorBrowser, selector: ST, protractorBy: ProtractorNativeLocator): ProtractorLocator<ST>;
|
|
6
|
+
of(parent: ProtractorLocator<unknown>): Locator<ElementFinder, ProtractorNativeElementRoot, Selector_Type>;
|
|
7
|
+
element(): PageElement<ElementFinder>;
|
|
8
|
+
allElements(): Promise<Array<PageElement<ElementFinder>>>;
|
|
9
|
+
}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ProtractorLocator = void 0;
|
|
4
|
+
const web_1 = require("@serenity-js/web");
|
|
5
|
+
const unpromisedWebElement_1 = require("../../unpromisedWebElement");
|
|
6
|
+
const ProtractorPageElement_1 = require("../ProtractorPageElement");
|
|
7
|
+
class ProtractorLocator extends web_1.Locator {
|
|
8
|
+
static createRootLocator(browser, selector, protractorBy) {
|
|
9
|
+
const parentRoot = {
|
|
10
|
+
element: browser.element.bind(browser),
|
|
11
|
+
all: browser.element.all.bind(browser),
|
|
12
|
+
};
|
|
13
|
+
return new ProtractorLocator(() => parentRoot, selector, (root) => (0, unpromisedWebElement_1.unpromisedWebElement)(root.element(protractorBy)), async (root) => root.all(protractorBy));
|
|
14
|
+
}
|
|
15
|
+
of(parent) {
|
|
16
|
+
return new ProtractorLocator(() => parent.nativeElement(), this.selector, (parentRoot) => this.locateElement(parentRoot), (parentRoot) => this.locateAllElements(parentRoot));
|
|
17
|
+
}
|
|
18
|
+
element() {
|
|
19
|
+
return new ProtractorPageElement_1.ProtractorPageElement(this);
|
|
20
|
+
}
|
|
21
|
+
async allElements() {
|
|
22
|
+
const parentRoot = await this.parentRoot();
|
|
23
|
+
const elements = await this.locateAllElements(parentRoot);
|
|
24
|
+
return Promise.all(elements.map(childElement => new ProtractorPageElement_1.ProtractorPageElement(new ProtractorLocator(this.parentRoot, this.selector, () => (0, unpromisedWebElement_1.unpromisedWebElement)(childElement), () => [(0, unpromisedWebElement_1.unpromisedWebElement)(childElement)]))));
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
exports.ProtractorLocator = ProtractorLocator;
|
|
28
|
+
//# sourceMappingURL=ProtractorLocator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ProtractorLocator.js","sourceRoot":"","sources":["../../../../src/screenplay/models/locators/ProtractorLocator.ts"],"names":[],"mappings":";;;AAAA,0CAAkE;AAGlE,qEAAkE;AAClE,oEAAiE;AAGjE,MAAa,iBAAkD,SAAQ,aAAkE;IAErI,MAAM,CAAC,iBAAiB,CAAsB,OAA0B,EAAE,QAAY,EAAE,YAAqC;QACzH,MAAM,UAAU,GAAgC;YAC5C,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC;YACtC,GAAG,EAAE,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC;SACzC,CAAA;QAED,OAAO,IAAI,iBAAiB,CACxB,GAAG,EAAE,CAAC,UAAU,EAChB,QAAQ,EACR,CAAC,IAAiC,EAAE,EAAE,CAAC,IAAA,2CAAoB,EAAC,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,EACvF,KAAK,EAAE,IAAiC,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,YAAY,CAAC,CACtE,CAAC;IACN,CAAC;IAED,EAAE,CAAC,MAAkC;QACjC,OAAO,IAAI,iBAAiB,CACxB,GAAG,EAAE,CAAC,MAAM,CAAC,aAAa,EAAE,EAC5B,IAAI,CAAC,QAAQ,EACb,CAAC,UAAuC,EAAE,EAAE,CAAC,IAAI,CAAC,aAAa,CAAC,UAAU,CAAC,EAC3E,CAAC,UAAuC,EAAE,EAAE,CAAC,IAAI,CAAC,iBAAiB,CAAC,UAAU,CAAC,CAClF,CAAC;IACN,CAAC;IAED,OAAO;QACH,OAAO,IAAI,6CAAqB,CAAC,IAAI,CAAC,CAAC;IAC3C,CAAC;IAED,KAAK,CAAC,WAAW;QACb,MAAM,UAAU,GAAM,MAAM,IAAI,CAAC,UAAU,EAAE,CAAA;QAC7C,MAAM,QAAQ,GAAQ,MAAM,IAAI,CAAC,iBAAiB,CAAC,UAAU,CAAC,CAAC;QAE/D,OAAO,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,YAAY,CAAC,EAAE,CAC3C,IAAI,6CAAqB,CAAC,IAAI,iBAAiB,CAC3C,IAAI,CAAC,UAAU,EACf,IAAI,CAAC,QAAQ,EACb,GAAG,EAAE,CAAC,IAAA,2CAAoB,EAAC,YAAY,CAAC,EACxC,GAAG,EAAE,CAAC,CAAE,IAAA,2CAAoB,EAAC,YAAY,CAAC,CAAE,CAC/C,CAAC,CACL,CAAC,CAAC;IACP,CAAC;CACJ;AA1CD,8CA0CC"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { ElementArrayFinder, ElementFinder, Locator } from 'protractor';
|
|
2
2
|
export interface ProtractorNativeElementRoot {
|
|
3
|
-
element
|
|
4
|
-
all
|
|
3
|
+
element(selector: Locator): ElementFinder;
|
|
4
|
+
all(selector: Locator): ElementArrayFinder;
|
|
5
5
|
}
|
|
File without changes
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ProtractorNativeElementRoot.js","sourceRoot":"","sources":["../../../../src/screenplay/models/locators/ProtractorNativeElementRoot.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
|
|
5
|
+
}) : (function(o, m, k, k2) {
|
|
6
|
+
if (k2 === undefined) k2 = k;
|
|
7
|
+
o[k2] = m[k];
|
|
8
|
+
}));
|
|
9
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
10
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
11
|
+
};
|
|
12
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
13
|
+
__exportStar(require("./ProtractorLocator"), exports);
|
|
14
|
+
__exportStar(require("./ProtractorNativeElementRoot"), exports);
|
|
15
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/screenplay/models/locators/index.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,sDAAoC;AACpC,gEAA8C"}
|
|
@@ -64,7 +64,7 @@ class ProtractorParam {
|
|
|
64
64
|
static called(name) {
|
|
65
65
|
return core_1.Question.about((0, io_1.formatted) `the ${name} param specified in Protractor config`, actor => {
|
|
66
66
|
return actor.answer(name)
|
|
67
|
-
.then(name => abilities_1.BrowseTheWebWithProtractor
|
|
67
|
+
.then(name => actor.abilityTo(abilities_1.BrowseTheWebWithProtractor).param(name));
|
|
68
68
|
});
|
|
69
69
|
}
|
|
70
70
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ProtractorParam.js","sourceRoot":"","sources":["../../../src/screenplay/questions/ProtractorParam.ts"],"names":[],"mappings":";;;AAAA,kDAAkD;AAClD,4CAAkE;AAClE,iDAAqD;AAErD,4CAA0D;AAE1D;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8CG;AACH,MAAa,eAAe;IAExB;;;;;;;OAOG;IACH,MAAM,CAAC,MAAM,CAAI,IAAwB;QACrC,OAAO,eAAQ,CAAC,KAAK,CAAa,IAAA,cAAS,EAAC,OAAQ,IAAK,uCAAuC,EAAE,KAAK,CAAC,EAAE;YACtG,OAAO,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC;iBACpB,IAAI,CAAC,IAAI,CAAC,EAAE,
|
|
1
|
+
{"version":3,"file":"ProtractorParam.js","sourceRoot":"","sources":["../../../src/screenplay/questions/ProtractorParam.ts"],"names":[],"mappings":";;;AAAA,kDAAkD;AAClD,4CAAkE;AAClE,iDAAqD;AAErD,4CAA0D;AAE1D;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8CG;AACH,MAAa,eAAe;IAExB;;;;;;;OAOG;IACH,MAAM,CAAC,MAAM,CAAI,IAAwB;QACrC,OAAO,eAAQ,CAAC,KAAK,CAAa,IAAA,cAAS,EAAC,OAAQ,IAAK,uCAAuC,EAAE,KAAK,CAAC,EAAE;YACtG,OAAO,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC;iBACpB,IAAI,CAAC,IAAI,CAAC,EAAE,CAAE,KAAK,CAAC,SAAS,CAAC,sCAA0B,CAAgC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;QAC/G,CAAC,CAAC,CAAC;IACP,CAAC;CACJ;AAhBD,0CAgBC"}
|
|
@@ -8,4 +8,4 @@ import { WebElement } from 'protractor';
|
|
|
8
8
|
* @param promiseLike
|
|
9
9
|
* @returns {Promise<T>}
|
|
10
10
|
*/
|
|
11
|
-
export declare function
|
|
11
|
+
export declare function unpromisedWebElement<T extends WebElement>(promiseLike: T): T;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.
|
|
3
|
+
exports.unpromisedWebElement = void 0;
|
|
4
4
|
/**
|
|
5
5
|
* @desc
|
|
6
6
|
* Wraps Webdriver then-ables into a Node-native promise to allow for correct promise chaining.
|
|
@@ -10,18 +10,15 @@ exports.promisedWebElement = void 0;
|
|
|
10
10
|
* @param promiseLike
|
|
11
11
|
* @returns {Promise<T>}
|
|
12
12
|
*/
|
|
13
|
-
function
|
|
14
|
-
|
|
15
|
-
return promiseLike;
|
|
16
|
-
}
|
|
17
|
-
return Promise.resolve(new Proxy(promiseLike, {
|
|
13
|
+
function unpromisedWebElement(promiseLike) {
|
|
14
|
+
return new Proxy(promiseLike, {
|
|
18
15
|
has: (target, property) => property !== 'then',
|
|
19
16
|
ownKeys: (target) => Reflect.ownKeys(target)
|
|
20
17
|
.filter(property => property !== 'then'),
|
|
21
18
|
get: (target, property, receiver) => (property in receiver)
|
|
22
19
|
? target[property]
|
|
23
20
|
: undefined,
|
|
24
|
-
})
|
|
21
|
+
});
|
|
25
22
|
}
|
|
26
|
-
exports.
|
|
27
|
-
//# sourceMappingURL=
|
|
23
|
+
exports.unpromisedWebElement = unpromisedWebElement;
|
|
24
|
+
//# sourceMappingURL=unpromisedWebElement.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"unpromisedWebElement.js","sourceRoot":"","sources":["../../src/screenplay/unpromisedWebElement.ts"],"names":[],"mappings":";;;AAEA;;;;;;;;GAQG;AACH,SAAgB,oBAAoB,CAAuB,WAAc;IAErE,OAAO,IAAI,KAAK,CAAC,WAAW,EAAE;QAC1B,GAAG,EAAE,CAAC,MAAM,EAAE,QAAQ,EAAE,EAAE,CACtB,QAAQ,KAAK,MAAM;QACvB,OAAO,EAAE,CAAC,MAAM,EAAE,EAAE,CAChB,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC;aAClB,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,QAAQ,KAAK,MAAM,CAAC;QAChD,GAAG,EAAE,CAAC,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,EAAE,CAChC,CAAC,QAAQ,IAAI,QAAQ,CAAC;YAClB,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC;YAClB,CAAC,CAAC,SAAS;KACtB,CAAC,CAAC;AACP,CAAC;AAbD,oDAaC"}
|
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.5",
|
|
4
4
|
"description": "Test your web apps with Serenity/JS",
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "Jan Molak",
|
|
@@ -50,16 +50,16 @@
|
|
|
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.5",
|
|
54
|
+
"@serenity-js/core": "3.0.0-rc.5",
|
|
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
|
-
"@serenity-js/cucumber": "^3.0.0-rc
|
|
61
|
-
"@serenity-js/jasmine": "^3.0.0-rc
|
|
62
|
-
"@serenity-js/mocha": "^3.0.0-rc
|
|
60
|
+
"@serenity-js/cucumber": "^3.0.0-rc",
|
|
61
|
+
"@serenity-js/jasmine": "^3.0.0-rc",
|
|
62
|
+
"@serenity-js/mocha": "^3.0.0-rc",
|
|
63
63
|
"protractor": "^5.0.0 || ^7.0.0",
|
|
64
64
|
"selenium-webdriver": "^3.6.0"
|
|
65
65
|
},
|
|
@@ -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.5",
|
|
81
|
+
"@serenity-js/jasmine": "3.0.0-rc.5",
|
|
82
|
+
"@serenity-js/local-server": "3.0.0-rc.5",
|
|
83
|
+
"@serenity-js/mocha": "3.0.0-rc.5",
|
|
84
|
+
"@serenity-js/rest": "3.0.0-rc.5",
|
|
85
|
+
"@serenity-js/web": "3.0.0-rc.5",
|
|
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": "b63bb1465731d922fde0ade3b77ddebb96dbf990"
|
|
126
126
|
}
|
|
@@ -1,9 +1,10 @@
|
|
|
1
|
-
import { ConfigurationError, Duration, LogicError
|
|
2
|
-
import { BrowserCapabilities, BrowseTheWeb, Cookie, CookieData, Key, ModalDialog, Page, PageElement
|
|
3
|
-
import { by,
|
|
1
|
+
import { ConfigurationError, Duration, LogicError } from '@serenity-js/core';
|
|
2
|
+
import { BrowserCapabilities, BrowseTheWeb, ByCss, ByCssContainingText, ById, ByTagName, ByXPath, Cookie, CookieData, Key, ModalDialog, Page, PageElement } from '@serenity-js/web';
|
|
3
|
+
import { by, ElementFinder, ProtractorBrowser, WebElementPromise } from 'protractor';
|
|
4
4
|
import { Capabilities } from 'selenium-webdriver';
|
|
5
5
|
|
|
6
|
-
import { ProtractorCookie, ProtractorModalDialog,
|
|
6
|
+
import { ProtractorCookie, ProtractorModalDialog, ProtractorPage, ProtractorPageElement } from '../models';
|
|
7
|
+
import { ProtractorLocator, ProtractorNativeElementRoot } from '../models/locators';
|
|
7
8
|
import { promised } from '../promised';
|
|
8
9
|
|
|
9
10
|
/**
|
|
@@ -35,7 +36,7 @@ import { promised } from '../promised';
|
|
|
35
36
|
* @implements {@serenity-js/core/lib/screenplay~Ability}
|
|
36
37
|
* @see {@link @serenity-js/core/lib/screenplay/actor~Actor}
|
|
37
38
|
*/
|
|
38
|
-
export class BrowseTheWebWithProtractor extends BrowseTheWeb {
|
|
39
|
+
export class BrowseTheWebWithProtractor extends BrowseTheWeb<ElementFinder, ProtractorNativeElementRoot> {
|
|
39
40
|
|
|
40
41
|
/**
|
|
41
42
|
* @desc
|
|
@@ -48,18 +49,6 @@ export class BrowseTheWebWithProtractor extends BrowseTheWeb {
|
|
|
48
49
|
return new BrowseTheWebWithProtractor(browser);
|
|
49
50
|
}
|
|
50
51
|
|
|
51
|
-
/**
|
|
52
|
-
* @desc
|
|
53
|
-
* Used to access the Actor's ability to {@link BrowseTheWebWithProtractor} from within the {@link Interaction} classes,
|
|
54
|
-
* such as {@link Navigate}.
|
|
55
|
-
*
|
|
56
|
-
* @param {UsesAbilities} actor
|
|
57
|
-
* @return {BrowseTheWebWithProtractor}
|
|
58
|
-
*/
|
|
59
|
-
static as(actor: UsesAbilities): BrowseTheWebWithProtractor {
|
|
60
|
-
return actor.abilityTo(BrowseTheWebWithProtractor);
|
|
61
|
-
}
|
|
62
|
-
|
|
63
52
|
/**
|
|
64
53
|
* @private
|
|
65
54
|
*/
|
|
@@ -70,7 +59,13 @@ export class BrowseTheWebWithProtractor extends BrowseTheWeb {
|
|
|
70
59
|
* An instance of a protractor browser
|
|
71
60
|
*/
|
|
72
61
|
constructor(protected browser: ProtractorBrowser) {
|
|
73
|
-
super()
|
|
62
|
+
super(new Map()
|
|
63
|
+
.set(ByCss, (selector: ByCss) => ProtractorLocator.createRootLocator(this.browser, selector, by.css(selector.value)))
|
|
64
|
+
.set(ByCssContainingText, (selector: ByCssContainingText) => ProtractorLocator.createRootLocator(this.browser, selector, by.cssContainingText(selector.value, selector.text)))
|
|
65
|
+
.set(ById, (selector: ById) => ProtractorLocator.createRootLocator(this.browser, selector, by.id(selector.value)))
|
|
66
|
+
.set(ByTagName, (selector: ByTagName) => ProtractorLocator.createRootLocator(this.browser, selector, by.tagName(selector.value)))
|
|
67
|
+
.set(ByXPath, (selector: ByXPath) => ProtractorLocator.createRootLocator(this.browser, selector, by.xpath(selector.value)))
|
|
68
|
+
);
|
|
74
69
|
}
|
|
75
70
|
|
|
76
71
|
async browserCapabilities(): Promise<BrowserCapabilities> {
|
|
@@ -105,58 +100,6 @@ export class BrowseTheWebWithProtractor extends BrowseTheWeb {
|
|
|
105
100
|
return promised(this.browser.manage().deleteAllCookies());
|
|
106
101
|
}
|
|
107
102
|
|
|
108
|
-
findByCss(selector: string): PageElement<any, any> {
|
|
109
|
-
return this.find(root => root.element(by.css(selector)));
|
|
110
|
-
}
|
|
111
|
-
|
|
112
|
-
findByCssContainingText(selector: string, text: string): PageElement<any, any> {
|
|
113
|
-
return this.find(root => root.element(by.cssContainingText(selector, text)));
|
|
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
|
-
}
|
|
127
|
-
|
|
128
|
-
findAllByCss(selector: string): PageElements<any, any, any> {
|
|
129
|
-
return this.findAll(root => root.all(by.css(selector)));
|
|
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,
|
|
147
|
-
);
|
|
148
|
-
}
|
|
149
|
-
|
|
150
|
-
private findAll(locator: (root: ProtractorNativeElementRoot) => Promise<ElementArrayFinder> | ElementArrayFinder): ProtractorPageElements {
|
|
151
|
-
return new ProtractorPageElements(
|
|
152
|
-
() => ({
|
|
153
|
-
element: this.browser.element.bind(this.browser),
|
|
154
|
-
all: this.browser.element.all.bind(this.browser),
|
|
155
|
-
}),
|
|
156
|
-
locator,
|
|
157
|
-
);
|
|
158
|
-
}
|
|
159
|
-
|
|
160
103
|
navigateTo(destination: string): Promise<void> {
|
|
161
104
|
return promised(this.browser.get(destination));
|
|
162
105
|
}
|
|
@@ -53,7 +53,7 @@ export class UseAngular {
|
|
|
53
53
|
*/
|
|
54
54
|
static disableSynchronisation(): Interaction {
|
|
55
55
|
return Interaction.where(`#actor disables synchronisation with Angular`, actor =>
|
|
56
|
-
|
|
56
|
+
(actor.abilityTo(BrowseTheWebWithProtractor) as BrowseTheWebWithProtractor).enableAngularSynchronisation(false).then(() => void 0));
|
|
57
57
|
}
|
|
58
58
|
|
|
59
59
|
/**
|
|
@@ -65,6 +65,6 @@ export class UseAngular {
|
|
|
65
65
|
*/
|
|
66
66
|
static enableSynchronisation(): Interaction {
|
|
67
67
|
return Interaction.where(`#actor enables synchronisation with Angular`, actor =>
|
|
68
|
-
|
|
68
|
+
(actor.abilityTo(BrowseTheWebWithProtractor) as BrowseTheWebWithProtractor).enableAngularSynchronisation(true).then(() => void 0));
|
|
69
69
|
}
|
|
70
70
|
}
|
|
@@ -3,23 +3,12 @@ import { ElementFinder, protractor } from 'protractor';
|
|
|
3
3
|
import { WebElement } from 'selenium-webdriver';
|
|
4
4
|
|
|
5
5
|
import { promised } from '../promised';
|
|
6
|
-
import { promisedWebElement } from '../promisedWebElement';
|
|
7
|
-
import { ProtractorNativeElementRoot } from './ProtractorNativeElementRoot';
|
|
8
6
|
|
|
9
7
|
export class ProtractorPageElement
|
|
10
|
-
extends PageElement<
|
|
8
|
+
extends PageElement<ElementFinder>
|
|
11
9
|
{
|
|
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);
|
|
10
|
+
of(parent: ProtractorPageElement): PageElement<ElementFinder> {
|
|
11
|
+
return new ProtractorPageElement(this.locator.of(parent.locator));
|
|
23
12
|
}
|
|
24
13
|
|
|
25
14
|
async clearValue(): Promise<void> {
|
|
@@ -141,12 +130,6 @@ export class ProtractorPageElement
|
|
|
141
130
|
return this.isEnabled();
|
|
142
131
|
}
|
|
143
132
|
|
|
144
|
-
async isDisplayed(): Promise<boolean> {
|
|
145
|
-
const element: ElementFinder = await this.nativeElement();
|
|
146
|
-
|
|
147
|
-
return element.isDisplayed();
|
|
148
|
-
}
|
|
149
|
-
|
|
150
133
|
async isEnabled(): Promise<boolean> {
|
|
151
134
|
const element: ElementFinder = await this.nativeElement();
|
|
152
135
|
|
|
@@ -164,4 +147,38 @@ export class ProtractorPageElement
|
|
|
164
147
|
|
|
165
148
|
return element.isSelected();
|
|
166
149
|
}
|
|
150
|
+
|
|
151
|
+
async isVisible(): Promise<boolean> {
|
|
152
|
+
const element: ElementFinder = await this.nativeElement();
|
|
153
|
+
|
|
154
|
+
if (! await element.isDisplayed()) {
|
|
155
|
+
return false;
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
const webElement: WebElement = await element.getWebElement();
|
|
159
|
+
|
|
160
|
+
// get element at cx/cy and see if the element we found is our element, and therefore it's visible.
|
|
161
|
+
return promised(webElement.getDriver().executeScript(
|
|
162
|
+
`
|
|
163
|
+
var elem = arguments[0];
|
|
164
|
+
|
|
165
|
+
if (! elem.getBoundingClientRect) {
|
|
166
|
+
return false;
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
var
|
|
170
|
+
box = elem.getBoundingClientRect(),
|
|
171
|
+
cx = box.left + box.width / 2,
|
|
172
|
+
cy = box.top + box.height / 2,
|
|
173
|
+
e = document.elementFromPoint(cx, cy);
|
|
174
|
+
|
|
175
|
+
for (; e; e = e.parentElement) {
|
|
176
|
+
if (e === elem)
|
|
177
|
+
return true;
|
|
178
|
+
}
|
|
179
|
+
return false;
|
|
180
|
+
`,
|
|
181
|
+
webElement,
|
|
182
|
+
));
|
|
183
|
+
}
|
|
167
184
|
}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { Locator, PageElement, Selector } from '@serenity-js/web';
|
|
2
|
+
import { ElementFinder, Locator as ProtractorNativeLocator, ProtractorBrowser } from 'protractor';
|
|
3
|
+
|
|
4
|
+
import { unpromisedWebElement } from '../../unpromisedWebElement';
|
|
5
|
+
import { ProtractorPageElement } from '../ProtractorPageElement';
|
|
6
|
+
import { ProtractorNativeElementRoot } from './ProtractorNativeElementRoot';
|
|
7
|
+
|
|
8
|
+
export class ProtractorLocator<Selector_Type extends Selector> extends Locator<ElementFinder, ProtractorNativeElementRoot, Selector_Type> {
|
|
9
|
+
|
|
10
|
+
static createRootLocator<ST extends Selector>(browser: ProtractorBrowser, selector: ST, protractorBy: ProtractorNativeLocator): ProtractorLocator<ST> {
|
|
11
|
+
const parentRoot: ProtractorNativeElementRoot = {
|
|
12
|
+
element: browser.element.bind(browser),
|
|
13
|
+
all: browser.element.all.bind(browser),
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
return new ProtractorLocator(
|
|
17
|
+
() => parentRoot,
|
|
18
|
+
selector,
|
|
19
|
+
(root: ProtractorNativeElementRoot) => unpromisedWebElement(root.element(protractorBy)),
|
|
20
|
+
async (root: ProtractorNativeElementRoot) => root.all(protractorBy)
|
|
21
|
+
);
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
of(parent: ProtractorLocator<unknown>): Locator<ElementFinder, ProtractorNativeElementRoot, Selector_Type> {
|
|
25
|
+
return new ProtractorLocator(
|
|
26
|
+
() => parent.nativeElement(),
|
|
27
|
+
this.selector,
|
|
28
|
+
(parentRoot: ProtractorNativeElementRoot) => this.locateElement(parentRoot),
|
|
29
|
+
(parentRoot: ProtractorNativeElementRoot) => this.locateAllElements(parentRoot),
|
|
30
|
+
);
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
element(): PageElement<ElementFinder> {
|
|
34
|
+
return new ProtractorPageElement(this);
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
async allElements(): Promise<Array<PageElement<ElementFinder>>> {
|
|
38
|
+
const parentRoot = await this.parentRoot()
|
|
39
|
+
const elements = await this.locateAllElements(parentRoot);
|
|
40
|
+
|
|
41
|
+
return Promise.all(elements.map(childElement =>
|
|
42
|
+
new ProtractorPageElement(new ProtractorLocator(
|
|
43
|
+
this.parentRoot,
|
|
44
|
+
this.selector,
|
|
45
|
+
() => unpromisedWebElement(childElement),
|
|
46
|
+
() => [ unpromisedWebElement(childElement) ],
|
|
47
|
+
))
|
|
48
|
+
));
|
|
49
|
+
}
|
|
50
|
+
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { ElementArrayFinder, ElementFinder, Locator } from 'protractor';
|
|
2
2
|
|
|
3
3
|
export interface ProtractorNativeElementRoot {
|
|
4
|
-
element
|
|
5
|
-
all
|
|
4
|
+
element(selector: Locator): ElementFinder;
|
|
5
|
+
all(selector: Locator): ElementArrayFinder;
|
|
6
6
|
}
|
|
@@ -64,7 +64,7 @@ export class ProtractorParam
|
|
|
64
64
|
static called<R>(name: Answerable<string>): Question<Promise<R>> & Adapter<R> {
|
|
65
65
|
return Question.about<Promise<R>>(formatted `the ${ name } param specified in Protractor config`, actor => {
|
|
66
66
|
return actor.answer(name)
|
|
67
|
-
.then(name =>
|
|
67
|
+
.then(name => (actor.abilityTo(BrowseTheWebWithProtractor) as BrowseTheWebWithProtractor).param(name));
|
|
68
68
|
});
|
|
69
69
|
}
|
|
70
70
|
}
|
|
@@ -9,12 +9,9 @@ import { WebElement } from 'protractor';
|
|
|
9
9
|
* @param promiseLike
|
|
10
10
|
* @returns {Promise<T>}
|
|
11
11
|
*/
|
|
12
|
-
export function
|
|
13
|
-
if (promiseLike instanceof Promise) {
|
|
14
|
-
return promiseLike;
|
|
15
|
-
}
|
|
12
|
+
export function unpromisedWebElement<T extends WebElement>(promiseLike: T): T {
|
|
16
13
|
|
|
17
|
-
return
|
|
14
|
+
return new Proxy(promiseLike, {
|
|
18
15
|
has: (target, property) =>
|
|
19
16
|
property !== 'then',
|
|
20
17
|
ownKeys: (target) =>
|
|
@@ -24,5 +21,5 @@ export function promisedWebElement<T extends WebElement>(promiseLike: PromiseLik
|
|
|
24
21
|
(property in receiver)
|
|
25
22
|
? target[property]
|
|
26
23
|
: undefined,
|
|
27
|
-
})
|
|
24
|
+
});
|
|
28
25
|
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ProtractorNativeElementRoot.js","sourceRoot":"","sources":["../../../src/screenplay/models/ProtractorNativeElementRoot.ts"],"names":[],"mappings":""}
|
|
@@ -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 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"promisedWebElement.js","sourceRoot":"","sources":["../../src/screenplay/promisedWebElement.ts"],"names":[],"mappings":";;;AAEA;;;;;;;;GAQG;AACH,SAAgB,kBAAkB,CAAuB,WAA+B;IACpF,IAAI,WAAW,YAAY,OAAO,EAAE;QAChC,OAAO,WAAW,CAAC;KACtB;IAED,OAAO,OAAO,CAAC,OAAO,CAAC,IAAI,KAAK,CAAC,WAAW,EAAE;QAC1C,GAAG,EAAE,CAAC,MAAM,EAAE,QAAQ,EAAE,EAAE,CACtB,QAAQ,KAAK,MAAM;QACvB,OAAO,EAAE,CAAC,MAAM,EAAE,EAAE,CAChB,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC;aAClB,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,QAAQ,KAAK,MAAM,CAAC;QAChD,GAAG,EAAE,CAAC,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,EAAE,CAChC,CAAC,QAAQ,IAAI,QAAQ,CAAC;YAClB,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC;YAClB,CAAC,CAAC,SAAS;KACtB,CAAC,CAAC,CAAC;AACR,CAAC;AAhBD,gDAgBC"}
|
|
@@ -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
|
-
}
|