@serenity-js/protractor 3.0.0-rc.5 → 3.0.0-rc.9
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 +141 -0
- package/lib/adapter/ProtractorFrameworkAdapter.js +5 -0
- package/lib/adapter/ProtractorFrameworkAdapter.js.map +1 -1
- package/lib/screenplay/abilities/BrowseTheWebWithProtractor.js +5 -1
- package/lib/screenplay/abilities/BrowseTheWebWithProtractor.js.map +1 -1
- package/lib/screenplay/models/ProtractorPageElement.js +115 -14
- package/lib/screenplay/models/ProtractorPageElement.js.map +1 -1
- package/lib/screenplay/questions/ProtractorParam.d.ts +2 -2
- package/lib/screenplay/questions/ProtractorParam.js.map +1 -1
- package/package.json +14 -13
- package/src/adapter/ProtractorFrameworkAdapter.ts +5 -0
- package/src/screenplay/abilities/BrowseTheWebWithProtractor.ts +7 -1
- package/src/screenplay/models/ProtractorPageElement.ts +115 -14
- package/src/screenplay/questions/ProtractorParam.ts +3 -3
package/CHANGELOG.md
CHANGED
|
@@ -3,6 +3,131 @@
|
|
|
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.9](https://github.com/serenity-js/serenity-js/compare/v3.0.0-rc.8...v3.0.0-rc.9) (2022-02-01)
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
### Features
|
|
10
|
+
|
|
11
|
+
* **web:** isVisible() works with Web elements in Shadow DOM ([cf84fb0](https://github.com/serenity-js/serenity-js/commit/cf84fb072a6b813338b68bb1dec3932ea8709e3e)), closes [#1085](https://github.com/serenity-js/serenity-js/issues/1085)
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
# [3.0.0-rc.8](https://github.com/serenity-js/serenity-js/compare/v3.0.0-rc.7...v3.0.0-rc.8) (2022-01-28)
|
|
18
|
+
|
|
19
|
+
**Note:** Version bump only for package @serenity-js/protractor
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
# [3.0.0-rc.7](https://github.com/serenity-js/serenity-js/compare/v3.0.0-rc.6...v3.0.0-rc.7) (2022-01-28)
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
### Features
|
|
29
|
+
|
|
30
|
+
* **core:** replaced `Adapter` with `QuestionAdapter` and introduced `Optional` ([8d84ad3](https://github.com/serenity-js/serenity-js/commit/8d84ad3863e3c726533d0f21934fb1e2fa8b3022)), closes [#1103](https://github.com/serenity-js/serenity-js/issues/1103)
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
# [3.0.0-rc.6](https://github.com/serenity-js/serenity-js/compare/v2.32.7...v3.0.0-rc.6) (2022-01-10)
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
# [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)
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
### Features
|
|
44
|
+
|
|
45
|
+
* **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)
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
# [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)
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
# [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)
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
### Bug Fixes
|
|
57
|
+
|
|
58
|
+
* **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)
|
|
59
|
+
* **deps:** updated tiny-types to 1.17.0 ([3187051](https://github.com/serenity-js/serenity-js/commit/3187051594158b4b450c82e851e417fd2ed21652))
|
|
60
|
+
* **web:** refactored Selector and NativeElementLocator classes to simplify the implementation ([f0c8f11](https://github.com/serenity-js/serenity-js/commit/f0c8f113433958877d36f13d0bc7f355ea68d280))
|
|
61
|
+
|
|
62
|
+
|
|
63
|
+
### Features
|
|
64
|
+
|
|
65
|
+
* **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))
|
|
66
|
+
* **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)
|
|
67
|
+
|
|
68
|
+
|
|
69
|
+
|
|
70
|
+
# [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)
|
|
71
|
+
|
|
72
|
+
|
|
73
|
+
### Bug Fixes
|
|
74
|
+
|
|
75
|
+
* **lerna:** corrected versions of internal deps ([582b922](https://github.com/serenity-js/serenity-js/commit/582b922dbade08e970cb796f15aca909f606c079))
|
|
76
|
+
|
|
77
|
+
|
|
78
|
+
|
|
79
|
+
# [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)
|
|
80
|
+
|
|
81
|
+
|
|
82
|
+
|
|
83
|
+
# [3.0.0-rc.0](https://github.com/serenity-js/serenity-js/compare/v2.32.5...v3.0.0-rc.0) (2021-12-08)
|
|
84
|
+
|
|
85
|
+
|
|
86
|
+
### Bug Fixes
|
|
87
|
+
|
|
88
|
+
* **core:** 3.0 RC ([469d54e](https://github.com/serenity-js/serenity-js/commit/469d54e4f81ef430566b93852e3174826f8ef672)), closes [#805](https://github.com/serenity-js/serenity-js/issues/805)
|
|
89
|
+
* **core:** renamed "Model" type to "Adapter" to better reflect its purpose ([b4ea7a1](https://github.com/serenity-js/serenity-js/commit/b4ea7a100fac2c896990bf15cbc906de641196b8)), closes [#805](https://github.com/serenity-js/serenity-js/issues/805)
|
|
90
|
+
* **protractor:** fixed the interaction to Switch ([762ca84](https://github.com/serenity-js/serenity-js/commit/762ca8406389a720d2ac6b8ab49b2519fbecfc21))
|
|
91
|
+
* **protractor:** lastScriptExecution.result() returns undefined instead of null for void functions ([997d87a](https://github.com/serenity-js/serenity-js/commit/997d87af2d825bffd47c0a1b3dbeee8ce572e391))
|
|
92
|
+
* **protractor:** modernised ProtractorParam to return a Screenplay Model ([43c2032](https://github.com/serenity-js/serenity-js/commit/43c2032e73c5e1ad3392396dec6fff476283833d))
|
|
93
|
+
* **protractor:** removed interaction to ResizeBrowserWindow in favour of Page.setViewportSize() ([b8e471d](https://github.com/serenity-js/serenity-js/commit/b8e471dc92fe7d930895571ce0bcb99066eb2206))
|
|
94
|
+
* **protractor:** replaced obsolete "Window", replaced by "Page" in @serenity-js/web ([a3442c4](https://github.com/serenity-js/serenity-js/commit/a3442c432082327f9081c269c02141c73b2e4eb3))
|
|
95
|
+
* **web:** corrected timestamp rounding when retrieving the expiry date of a cookie ([d636965](https://github.com/serenity-js/serenity-js/commit/d63696586618cd701e703e33dd8b476efaac65b6))
|
|
96
|
+
* **webdriverio:** separated UIElement.hoverOver from UIElement.scrollIntoView ([cf4ca2c](https://github.com/serenity-js/serenity-js/commit/cf4ca2c531e0f90f9a27917e322359c13bfbc6e6))
|
|
97
|
+
* **web:** removed Cookie as it will be re-implemented ([cb3d081](https://github.com/serenity-js/serenity-js/commit/cb3d0813f9f0532bfe82be77fef0edec45e8ca3e))
|
|
98
|
+
* **web:** removed window-specific APIs from BrowseTheWeb that got replaced by Page ([918f447](https://github.com/serenity-js/serenity-js/commit/918f447c1d8f326fbf5730f1aa61108045556212)), closes [#805](https://github.com/serenity-js/serenity-js/issues/805)
|
|
99
|
+
* **web:** renamed Element and associated classes to PageElement to avoid name conflicts ([1e4204b](https://github.com/serenity-js/serenity-js/commit/1e4204b5507469e6574c87a6d84454e39e8a813e))
|
|
100
|
+
* **web:** renamed PageElementList to PageElements to improve readability ([a9903a7](https://github.com/serenity-js/serenity-js/commit/a9903a7389b00106ef94d2bdb9f86a7fd04be541)), closes [#805](https://github.com/serenity-js/serenity-js/issues/805)
|
|
101
|
+
* **web:** standardised getters across PageElement implementations ([336472b](https://github.com/serenity-js/serenity-js/commit/336472b1a6882412f6a88483e51266909a1d51d0))
|
|
102
|
+
|
|
103
|
+
|
|
104
|
+
### Features
|
|
105
|
+
|
|
106
|
+
* **core:** question.about produces "props" that proxy the methods of the underlying model ([f771872](https://github.com/serenity-js/serenity-js/commit/f771872c56b487e404002c3800fc8f3baaed804f))
|
|
107
|
+
* **protractor:** compatibility with @serenity-js/web ([9df4db2](https://github.com/serenity-js/serenity-js/commit/9df4db27a6e0ae62bf0d0e679a170d4865041043)), closes [#805](https://github.com/serenity-js/serenity-js/issues/805)
|
|
108
|
+
* **protractor:** removed Protractor-specific Target implementations in favour of @serenity-js/web ([5cfc7e5](https://github.com/serenity-js/serenity-js/commit/5cfc7e53c977ae919398d9102f43985f393992db))
|
|
109
|
+
* **web:** a common way to run the tests for all the web adapters ([c7e584a](https://github.com/serenity-js/serenity-js/commit/c7e584a9bf288ebc7781affdb720097527e8ed3a))
|
|
110
|
+
* **web:** added Page.viewportSize and Page.setViewportSize methods ([4cabbe2](https://github.com/serenity-js/serenity-js/commit/4cabbe21a7fbac3457c6a6ea3d4442a62c3f1f3c))
|
|
111
|
+
* **web:** interaction to set a Cookie ([c056439](https://github.com/serenity-js/serenity-js/commit/c056439746a8f57c3edd937b8862f2babb70e94e)), closes [#805](https://github.com/serenity-js/serenity-js/issues/805)
|
|
112
|
+
* **web:** interaction to setViewportSize of a Page ([dd7f180](https://github.com/serenity-js/serenity-js/commit/dd7f18057b857d2e69c19265888bfd5b15fda21b))
|
|
113
|
+
* **web:** migrated Photographer from @serenity-js/protractor to @serenity-js/web ([4506dac](https://github.com/serenity-js/serenity-js/commit/4506dacebdf955c32c4eff17bf9982c8e45e2925)), closes [#805](https://github.com/serenity-js/serenity-js/issues/805)
|
|
114
|
+
* **web:** ModalDialog available for both Protractor and WebdriverIO adapters ([ef3c566](https://github.com/serenity-js/serenity-js/commit/ef3c566aed12b52aa22c54058992d369172b8597)), closes [#805](https://github.com/serenity-js/serenity-js/issues/805)
|
|
115
|
+
* **web:** page provides an abstraction around browser window ([2e70a3b](https://github.com/serenity-js/serenity-js/commit/2e70a3b6af2e8cc49255820e8a1aaffcc71b76a8))
|
|
116
|
+
* **web:** Page.url() and Page.title() replace Website.url() and Website.title() ([49fe009](https://github.com/serenity-js/serenity-js/commit/49fe0094422ab53ec67d4ba303f80c33e382eebd)), closes [#805](https://github.com/serenity-js/serenity-js/issues/805)
|
|
117
|
+
* **web:** removed Target in favour of PageElement ([69496c4](https://github.com/serenity-js/serenity-js/commit/69496c47c4a1ec7b92e7ab6c83da1559e926f28e)), closes [#805](https://github.com/serenity-js/serenity-js/issues/805)
|
|
118
|
+
* **web:** support for switching browsing context ([a73a635](https://github.com/serenity-js/serenity-js/commit/a73a635f93183d67229acde78e74526564008869)), closes [#805](https://github.com/serenity-js/serenity-js/issues/805)
|
|
119
|
+
* **web:** support for working with cookies ([39cde6d](https://github.com/serenity-js/serenity-js/commit/39cde6de7a36d27a8b1c596493efbec94900af6b)), closes [#805](https://github.com/serenity-js/serenity-js/issues/805)
|
|
120
|
+
|
|
121
|
+
|
|
122
|
+
### BREAKING CHANGES
|
|
123
|
+
|
|
124
|
+
* **core:** Introduced @serenity-js/web - a shared library for Serenity/JS Web integration
|
|
125
|
+
modules such as @serenity-js/protractor and @serenity-js/webdriverio. Dropped support for Node 12.
|
|
126
|
+
|
|
127
|
+
|
|
128
|
+
|
|
129
|
+
|
|
130
|
+
|
|
6
131
|
# [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
132
|
|
|
8
133
|
|
|
@@ -108,6 +233,22 @@ modules such as @serenity-js/protractor and @serenity-js/webdriverio. Dropped su
|
|
|
108
233
|
|
|
109
234
|
|
|
110
235
|
|
|
236
|
+
## [2.32.7](https://github.com/serenity-js/serenity-js/compare/v2.32.6...v2.32.7) (2022-01-10)
|
|
237
|
+
|
|
238
|
+
**Note:** Version bump only for package @serenity-js/protractor
|
|
239
|
+
|
|
240
|
+
|
|
241
|
+
|
|
242
|
+
|
|
243
|
+
|
|
244
|
+
## [2.32.6](https://github.com/serenity-js/serenity-js/compare/v2.32.5...v2.32.6) (2022-01-10)
|
|
245
|
+
|
|
246
|
+
**Note:** Version bump only for package @serenity-js/protractor
|
|
247
|
+
|
|
248
|
+
|
|
249
|
+
|
|
250
|
+
|
|
251
|
+
|
|
111
252
|
## [2.32.5](https://github.com/serenity-js/serenity-js/compare/v2.32.4...v2.32.5) (2021-12-08)
|
|
112
253
|
|
|
113
254
|
**Note:** Version bump only for package @serenity-js/protractor
|
|
@@ -5,6 +5,7 @@ const core_1 = require("@serenity-js/core");
|
|
|
5
5
|
const is_plain_object_1 = require("is-plain-object"); // fails when using default import
|
|
6
6
|
const protractor_1 = require("protractor");
|
|
7
7
|
const deepmerge = require("deepmerge");
|
|
8
|
+
const querySelectorShadowDomPlugin = require('query-selector-shadow-dom/plugins/protractor'); // eslint-disable-line @typescript-eslint/no-var-requires
|
|
8
9
|
const browser_detector_1 = require("./browser-detector");
|
|
9
10
|
const reporter_1 = require("./reporter");
|
|
10
11
|
const runner_1 = require("./runner");
|
|
@@ -24,6 +25,10 @@ class ProtractorFrameworkAdapter {
|
|
|
24
25
|
* @return {Promise<ProtractorReport>}
|
|
25
26
|
*/
|
|
26
27
|
run(specs) {
|
|
28
|
+
var _a, _b, _c, _d;
|
|
29
|
+
if (!((_b = (_a = this.protractorRunner.plugins_) === null || _a === void 0 ? void 0 : _a.pluginObjs) === null || _b === void 0 ? void 0 : _b.some(plugin => plugin.name === querySelectorShadowDomPlugin.name))) {
|
|
30
|
+
(_d = (_c = this.protractorRunner.plugins_) === null || _c === void 0 ? void 0 : _c.pluginObjs) === null || _d === void 0 ? void 0 : _d.push(querySelectorShadowDomPlugin);
|
|
31
|
+
}
|
|
27
32
|
const runner = this.detector.runnerFor(this.protractorRunner.getConfig());
|
|
28
33
|
const reporter = new reporter_1.ProtractorReporter(this.protractorRunner, runner.successThreshold());
|
|
29
34
|
const config = deepmerge(this.defaultConfig(), this.protractorRunner.getConfig(), {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ProtractorFrameworkAdapter.js","sourceRoot":"","sources":["../../src/adapter/ProtractorFrameworkAdapter.ts"],"names":[],"mappings":";;;AAAA,4CAA+D;AAC/D,qDAAgD,CAAC,kCAAkC;AACnF,2CAAgD;AAChD,uCAAwC;
|
|
1
|
+
{"version":3,"file":"ProtractorFrameworkAdapter.js","sourceRoot":"","sources":["../../src/adapter/ProtractorFrameworkAdapter.ts"],"names":[],"mappings":";;;AAAA,4CAA+D;AAC/D,qDAAgD,CAAC,kCAAkC;AACnF,2CAAgD;AAChD,uCAAwC;AACxC,MAAM,4BAA4B,GAAG,OAAO,CAAC,8CAA8C,CAAC,CAAC,CAAG,yDAAyD;AAEzJ,yDAA+E;AAE/E,yCAAkE;AAClE,qCAA8C;AAE9C;;GAEG;AACH,MAAa,0BAA0B;IACnC,YACqB,QAAkB,EAClB,gBAAwB,EACxB,QAA4B;QAF5B,aAAQ,GAAR,QAAQ,CAAU;QAClB,qBAAgB,GAAhB,gBAAgB,CAAQ;QACxB,aAAQ,GAAR,QAAQ,CAAoB;IAEjD,CAAC;IAED;;;;;OAKG;IACH,GAAG,CAAC,KAAe;;QAEf,IAAI,CAAE,CAAA,MAAA,MAAA,IAAI,CAAC,gBAAgB,CAAC,QAAQ,0CAAE,UAAU,0CAAE,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,IAAI,KAAK,4BAA4B,CAAC,IAAI,CAAC,CAAA,EAAE;YACjH,MAAA,MAAA,IAAI,CAAC,gBAAgB,CAAC,QAAQ,0CAAE,UAAU,0CAAE,IAAI,CAAC,4BAA4B,CAAC,CAAC;SAClF;QAED,MAAM,MAAM,GAAM,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,CAAC,gBAAgB,CAAC,SAAS,EAAE,CAAC,CAAC;QAC7E,MAAM,QAAQ,GAAI,IAAI,6BAAkB,CAAC,IAAI,CAAC,gBAAgB,EAAE,MAAM,CAAC,gBAAgB,EAAE,CAAC,CAAC;QAE3F,MAAM,MAAM,GAAM,SAAS,CAAS,IAAI,CAAC,aAAa,EAAE,EAAE,IAAI,CAAC,gBAAgB,CAAC,SAAS,EAAE,EAAE;YACzF,iBAAiB,EAAE,+BAAa;SACnC,CAAC,CAAC;QAEH,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC;YACpB,UAAU,EAAM,MAAM,CAAC,QAAQ,CAAC,UAAU;YAC1C,MAAM,EAAU,MAAM,CAAC,QAAQ,CAAC,MAAM;YACtC,IAAI,EAAY;gBACZ,kCAAe,CAAC,IAAI,CAAC,2CAAwB,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,uBAAU,CAAC,OAAO,CAAC,CAAC;gBAC3E,GAAG,MAAM,CAAC,QAAQ,CAAC,IAAI;gBACvB,QAAQ;aACX;SACJ,CAAC,CAAC;QAEH,OAAO,OAAO,CAAC,OAAO,EAAE;aACnB,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,gBAAgB,CAAC,eAAe,CAAC,2BAAkB,CAAC,oBAAoB,EAAE,CAAC,CAAC;aAC5F,IAAI,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;aAC9B,IAAI,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC;aACxB,IAAI,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,UAAU,IAAI,IAAI,CAAC,EAAE,CAAC,CAAC;aAC1D,IAAI,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;IACvC,CAAC;IAEO,aAAa;QACjB,OAAO;YACH,QAAQ,EAAE;gBACN,IAAI,EAAE;oBACF,uBAAgB,CAAC,kBAAkB,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,sBAAsB,CAAC;iBAC7E;aACJ;SACJ,CAAC;IACN,CAAC;CACJ;AAtDD,gEAsDC;AAED,eAAe;AACf,SAAS,IAAI;IACT,QAAQ;AACZ,CAAC"}
|
|
@@ -43,7 +43,11 @@ class BrowseTheWebWithProtractor extends web_1.BrowseTheWeb {
|
|
|
43
43
|
*/
|
|
44
44
|
constructor(browser) {
|
|
45
45
|
super(new Map()
|
|
46
|
-
.set(web_1.ByCss, (selector) =>
|
|
46
|
+
.set(web_1.ByCss, (selector) =>
|
|
47
|
+
// todo: this is a temporary experiment; target state is for all CSS selectors to support Shadow DOM by default
|
|
48
|
+
locators_1.ProtractorLocator.createRootLocator(this.browser, selector, selector.value.startsWith('>>>') && !!protractor_1.by.shadowDomCss
|
|
49
|
+
? protractor_1.by.shadowDomCss(selector.value.replace('>>>', ''))
|
|
50
|
+
: protractor_1.by.css(selector.value)))
|
|
47
51
|
.set(web_1.ByCssContainingText, (selector) => locators_1.ProtractorLocator.createRootLocator(this.browser, selector, protractor_1.by.cssContainingText(selector.value, selector.text)))
|
|
48
52
|
.set(web_1.ById, (selector) => locators_1.ProtractorLocator.createRootLocator(this.browser, selector, protractor_1.by.id(selector.value)))
|
|
49
53
|
.set(web_1.ByTagName, (selector) => locators_1.ProtractorLocator.createRootLocator(this.browser, selector, protractor_1.by.tagName(selector.value)))
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BrowseTheWebWithProtractor.js","sourceRoot":"","sources":["../../../src/screenplay/abilities/BrowseTheWebWithProtractor.ts"],"names":[],"mappings":";;;AAAA,4CAA6E;AAC7E,0CAAoL;AACpL,2CAAqF;AAGrF,sCAA2G;AAC3G,iDAAoF;AACpF,0CAAuC;AAEvC;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,MAAa,0BAA2B,SAAQ,kBAAwD;IAkBpG;;;OAGG;IACH,YAAsB,OAA0B;QAC5C,KAAK,CAAC,IAAI,GAAG,EAAE;aACV,GAAG,CAAC,WAAK,EAAkB,CAAC,QAAe,EAAgB,EAAE,
|
|
1
|
+
{"version":3,"file":"BrowseTheWebWithProtractor.js","sourceRoot":"","sources":["../../../src/screenplay/abilities/BrowseTheWebWithProtractor.ts"],"names":[],"mappings":"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"}
|
|
@@ -105,23 +105,124 @@ class ProtractorPageElement extends web_1.PageElement {
|
|
|
105
105
|
const webElement = await element.getWebElement();
|
|
106
106
|
// get element at cx/cy and see if the element we found is our element, and therefore it's visible.
|
|
107
107
|
return (0, promised_1.promised)(webElement.getDriver().executeScript(`
|
|
108
|
-
var
|
|
108
|
+
var element = arguments[0];
|
|
109
109
|
|
|
110
|
-
if (!
|
|
111
|
-
return false
|
|
110
|
+
if (!element.getBoundingClientRect || !element.scrollIntoView || !element.contains || !element.getClientRects || !document.elementFromPoint) {
|
|
111
|
+
return false
|
|
112
112
|
}
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
113
|
+
|
|
114
|
+
// Edge before switching to Chromium
|
|
115
|
+
const isOldEdge = !!window['StyleMedia']
|
|
116
|
+
// returns true for Chrome and Firefox and false for Safari, Edge and IE
|
|
117
|
+
const scrollIntoViewFullSupport = !(window.safari || isOldEdge)
|
|
118
|
+
|
|
119
|
+
// get overlapping element
|
|
120
|
+
function getOverlappingElement (elem, context) {
|
|
121
|
+
context = context || document
|
|
122
|
+
const elemDimension = elem.getBoundingClientRect()
|
|
123
|
+
const x = elemDimension.left + (elem.clientWidth / 2)
|
|
124
|
+
const y = elemDimension.top + (elem.clientHeight / 2)
|
|
125
|
+
return context.elementFromPoint(x, y)
|
|
123
126
|
}
|
|
124
|
-
|
|
127
|
+
|
|
128
|
+
// get overlapping element rects (currently only the first)
|
|
129
|
+
// applicable if element's text is multiline.
|
|
130
|
+
function getOverlappingRects (elem, context) {
|
|
131
|
+
context = context || document
|
|
132
|
+
const elems = []
|
|
133
|
+
|
|
134
|
+
const rects = elem.getClientRects()
|
|
135
|
+
// webdriver clicks on center of the first element's rect (line of text), it might change in future
|
|
136
|
+
const rect = rects[0]
|
|
137
|
+
const x = rect.left + (rect.width / 2)
|
|
138
|
+
const y = rect.top + (rect.height / 2)
|
|
139
|
+
elems.push(context.elementFromPoint(x, y))
|
|
140
|
+
|
|
141
|
+
return elems
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
// get overlapping elements
|
|
145
|
+
function getOverlappingElements (elem, context) {
|
|
146
|
+
return [getOverlappingElement(elem, context)].concat(getOverlappingRects(elem, context))
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
// is a node a descendant of a given node
|
|
150
|
+
function nodeContains (elem, otherNode) {
|
|
151
|
+
// Edge doesn't support neither Shadow Dom nor contains if ShadowRoot polyfill is used
|
|
152
|
+
if (isOldEdge) {
|
|
153
|
+
let tmpElement = otherNode
|
|
154
|
+
while (tmpElement) {
|
|
155
|
+
if (tmpElement === elem) {
|
|
156
|
+
return true
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
tmpElement = tmpElement.parentNode
|
|
160
|
+
// DocumentFragment / ShadowRoot polyfill like ShadyRoot
|
|
161
|
+
if (tmpElement && tmpElement.nodeType === 11 && tmpElement.host) {
|
|
162
|
+
tmpElement = tmpElement.host
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
return false
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
return elem.contains(otherNode)
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
// is one of overlapping elements the \`elem\` or one of its child
|
|
172
|
+
function isOverlappingElementMatch (elementsFromPoint, elem) {
|
|
173
|
+
if (elementsFromPoint.some(function (elementFromPoint) {
|
|
174
|
+
return elementFromPoint === elem || nodeContains(elem, elementFromPoint)
|
|
175
|
+
})) {
|
|
176
|
+
return true
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
// shadow root
|
|
180
|
+
// filter unique elements with shadowRoot
|
|
181
|
+
// @ts-ignore
|
|
182
|
+
let elemsWithShadowRoot = [].concat(elementsFromPoint)
|
|
183
|
+
elemsWithShadowRoot = elemsWithShadowRoot.filter(function (x) {
|
|
184
|
+
return x && x.shadowRoot && x.shadowRoot.elementFromPoint
|
|
185
|
+
})
|
|
186
|
+
|
|
187
|
+
// getOverlappingElements of every element with shadowRoot
|
|
188
|
+
let shadowElementsFromPoint = []
|
|
189
|
+
for (let i = 0; i < elemsWithShadowRoot.length; ++i) {
|
|
190
|
+
let shadowElement = elemsWithShadowRoot[i]
|
|
191
|
+
shadowElementsFromPoint = shadowElementsFromPoint.concat(
|
|
192
|
+
getOverlappingElements(elem, shadowElement.shadowRoot)
|
|
193
|
+
)
|
|
194
|
+
}
|
|
195
|
+
// remove duplicates and parents
|
|
196
|
+
// @ts-ignore
|
|
197
|
+
shadowElementsFromPoint = [].concat(shadowElementsFromPoint)
|
|
198
|
+
shadowElementsFromPoint = shadowElementsFromPoint.filter(function (x) {
|
|
199
|
+
return !elementsFromPoint.includes(x)
|
|
200
|
+
})
|
|
201
|
+
|
|
202
|
+
if (shadowElementsFromPoint.length === 0) {
|
|
203
|
+
return false
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
return isOverlappingElementMatch(shadowElementsFromPoint, elem)
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
function isElementInViewport (elem) {
|
|
210
|
+
if (!elem.getBoundingClientRect) {
|
|
211
|
+
return false
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
const rect = elem.getBoundingClientRect()
|
|
215
|
+
|
|
216
|
+
const windowHeight = (window.innerHeight || document.documentElement.clientHeight)
|
|
217
|
+
const windowWidth = (window.innerWidth || document.documentElement.clientWidth)
|
|
218
|
+
|
|
219
|
+
const vertInView = (rect.top <= windowHeight) && ((rect.top + rect.height) > 0)
|
|
220
|
+
const horInView = (rect.left <= windowWidth) && ((rect.left + rect.width) > 0)
|
|
221
|
+
|
|
222
|
+
return (vertInView && horInView)
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
return isElementInViewport(element) && isOverlappingElementMatch(getOverlappingElements(element), element);
|
|
125
226
|
`, webElement));
|
|
126
227
|
}
|
|
127
228
|
}
|
|
@@ -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;AAEvC,MAAa,qBACT,SAAQ,iBAA0B;IAElC,EAAE,CAAC,MAA6B;QAC5B,OAAO,IAAI,qBAAqB,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC;IACtE,CAAC;IAED,KAAK,CAAC,UAAU;QACZ,SAAS,oBAAoB,CAAC,GAAkB,EAAE,kBAA0B;YACxE,OAAO,kBAAkB,KAAK,CAAC;gBAC3B,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;gBACzB,CAAC,CAAC,GAAG,CAAC,QAAQ,CACV,uBAAU,CAAC,GAAG,CAAC,GAAG,EAClB,GAAG,KAAK,CAAC,kBAAkB,EAAE,uBAAU,CAAC,GAAG,CAAC,UAAU,CAAC,CAC1D,CAAC;QACV,CAAC;QAED,+DAA+D;QAC/D,SAAS,KAAK,CAAC,MAAc,EAAE,GAAW;YACtC,OAAO,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC;QACjD,CAAC;QAED,MAAM,YAAY,GAAG,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC;QAExC,IAAI,YAAY,KAAK,IAAI,IAAI,YAAY,KAAK,SAAS,EAAE;YACrD,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,aAAa,EAAE,CAAC;YAC3C,OAAO,oBAAoB,CAAC,OAAO,EAAE,YAAY,CAAC,MAAM,CAAC,CAAC;SAC7D;IACL,CAAC;IAED,KAAK,CAAC,KAAK;QACP,MAAM,OAAO,GAAkB,MAAM,IAAI,CAAC,aAAa,EAAE,CAAC;QAE1D,OAAO,OAAO,CAAC,KAAK,EAAE,CAAC;IAC3B,CAAC;IAED,KAAK,CAAC,WAAW;QACb,MAAM,OAAO,GAAkB,MAAM,IAAI,CAAC,aAAa,EAAE,CAAC;QAC1D,MAAM,UAAU,GAAe,MAAM,OAAO,CAAC,aAAa,EAAE,CAAC;QAE7D,OAAO,IAAA,mBAAQ,EACX,UAAU,CAAC,SAAS,EAAE,CAAC,OAAO,EAAE;aAC3B,SAAS,CAAC,UAAU,CAAC;aACrB,WAAW,EAAE;aACb,OAAO,EAAE,CACjB,CAAC;IACN,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,KAA+C;QAC5D,MAAM,OAAO,GAAkB,MAAM,IAAI,CAAC,aAAa,EAAE,CAAC;QAE1D,OAAO,OAAO,CAAC,QAAQ,CACnB,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAC5B,CAAC;IACN,CAAC;IAED,KAAK,CAAC,cAAc;QAChB,MAAM,OAAO,GAAkB,MAAM,IAAI,CAAC,aAAa,EAAE,CAAC;QAC1D,MAAM,UAAU,GAAe,MAAM,OAAO,CAAC,aAAa,EAAE,CAAC;QAE7D,OAAO,IAAA,mBAAQ,EACX,UAAU,CAAC,SAAS,EAAE,CAAC,aAAa,CAAC,oCAAoC,EAAE,UAAU,CAAC,CACzF,CAAC;IACN,CAAC;IAED,KAAK,CAAC,SAAS;QACX,MAAM,OAAO,GAAkB,MAAM,IAAI,CAAC,aAAa,EAAE,CAAC;QAC1D,MAAM,UAAU,GAAe,MAAM,OAAO,CAAC,aAAa,EAAE,CAAC;QAE7D,OAAO,IAAA,mBAAQ,EACX,UAAU,CAAC,SAAS,EAAE,CAAC,OAAO,EAAE;aAC3B,SAAS,CAAC,UAAU,CAAC;aACrB,OAAO,EAAE,CACjB,CAAC;IACN,CAAC;IAED,KAAK,CAAC,UAAU;QACZ,MAAM,OAAO,GAAkB,MAAM,IAAI,CAAC,aAAa,EAAE,CAAC;QAC1D,MAAM,UAAU,GAAe,MAAM,OAAO,CAAC,aAAa,EAAE,CAAC;QAE7D,OAAO,IAAA,mBAAQ,EACX,UAAU,CAAC,SAAS,EAAE,CAAC,OAAO,EAAE;aAC3B,SAAS,CAAC,UAAU,CAAC;aACrB,KAAK,CAAC,uBAAU,CAAC,MAAM,CAAC,KAAK,CAAC;aAC9B,OAAO,EAAE,CACjB,CAAC;IACN,CAAC;IAED,KAAK,CAAC,SAAS,CAAC,IAAY;QACxB,MAAM,OAAO,GAAkB,MAAM,IAAI,CAAC,aAAa,EAAE,CAAC;QAE1D,OAAO,OAAO,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;IACtC,CAAC;IAED,KAAK,CAAC,IAAI;QACN,MAAM,OAAO,GAAkB,MAAM,IAAI,CAAC,aAAa,EAAE,CAAC;QAE1D,OAAO,OAAO,CAAC,OAAO,EAAE,CAAC;IAC7B,CAAC;IAED,KAAK,CAAC,KAAK;QACP,MAAM,OAAO,GAAkB,MAAM,IAAI,CAAC,aAAa,EAAE,CAAC;QAC1D,MAAM,UAAU,GAAe,MAAM,OAAO,CAAC,aAAa,EAAE,CAAC;QAE7D,OAAO,IAAA,mBAAQ,EAAC,UAAU,CAAC,SAAS,EAAE,CAAC,aAAa;QAChD,0BAA0B;QAC1B,SAAS,QAAQ,CAAC,UAAU;YACxB,OAAO,UAAU,CAAC,KAAK,CAAC;QAC5B,CAAC,EACD,UAAU,CACb,CAAC,CAAC;IACP,CAAC;IAED,KAAK,CAAC,QAAQ;QACV,MAAM,OAAO,GAAkB,MAAM,IAAI,CAAC,aAAa,EAAE,CAAC;QAC1D,MAAM,UAAU,GAAe,MAAM,OAAO,CAAC,aAAa,EAAE,CAAC;QAE7D,OAAO,UAAU,CAAC,SAAS,EAAE,CAAC,QAAQ,EAAE,CAAC,aAAa,EAAE,CAAC,IAAI,CAAC,CAAC,MAAkB,EAAE,EAAE,CACjF,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CACzB,CAAC;IACN,CAAC;IAED,KAAK,CAAC,WAAW;QACb,OAAO,IAAI,CAAC,SAAS,EAAE,CAAC;IAC5B,CAAC;IAED,KAAK,CAAC,SAAS;QACX,MAAM,OAAO,GAAkB,MAAM,IAAI,CAAC,aAAa,EAAE,CAAC;QAE1D,OAAO,OAAO,CAAC,SAAS,EAAE,CAAC;IAC/B,CAAC;IAED,KAAK,CAAC,SAAS;QACX,MAAM,OAAO,GAAkB,MAAM,IAAI,CAAC,aAAa,EAAE,CAAC;QAE1D,OAAO,OAAO,CAAC,SAAS,EAAE,CAAC;IAC/B,CAAC;IAED,KAAK,CAAC,UAAU;QACZ,MAAM,OAAO,GAAkB,MAAM,IAAI,CAAC,aAAa,EAAE,CAAC;QAE1D,OAAO,OAAO,CAAC,UAAU,EAAE,CAAC;IAChC,CAAC;IAED,KAAK,CAAC,SAAS;QACX,MAAM,OAAO,GAAkB,MAAM,IAAI,CAAC,aAAa,EAAE,CAAC;QAE1D,IAAI,CAAE,MAAM,OAAO,CAAC,WAAW,EAAE,EAAE;YAC/B,OAAO,KAAK,CAAC;SAChB;QAED,MAAM,UAAU,GAAe,MAAM,OAAO,CAAC,aAAa,EAAE,CAAC;QAE7D,mGAAmG;QACnG,OAAO,IAAA,mBAAQ,EAAC,UAAU,CAAC,SAAS,EAAE,CAAC,aAAa,CAChD
|
|
1
|
+
{"version":3,"file":"ProtractorPageElement.js","sourceRoot":"","sources":["../../../src/screenplay/models/ProtractorPageElement.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { Answerable, QuestionAdapter } from '@serenity-js/core';
|
|
2
2
|
/**
|
|
3
3
|
* @desc
|
|
4
4
|
* Returns a Protractor configuration parameter specified in `protractor.conf.js`.
|
|
@@ -55,5 +55,5 @@ export declare class ProtractorParam {
|
|
|
55
55
|
* @param {@serenity-js/core/lib/screenplay~Answerable<string>} name
|
|
56
56
|
* @returns {Question<Promise<R>> & Adapter<R>}
|
|
57
57
|
*/
|
|
58
|
-
static called<R>(name: Answerable<string>):
|
|
58
|
+
static called<R>(name: Answerable<string>): QuestionAdapter<R>;
|
|
59
59
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ProtractorParam.js","sourceRoot":"","sources":["../../../src/screenplay/questions/ProtractorParam.ts"],"names":[],"mappings":";;;AAAA,kDAAkD;AAClD,
|
|
1
|
+
{"version":3,"file":"ProtractorParam.js","sourceRoot":"","sources":["../../../src/screenplay/questions/ProtractorParam.ts"],"names":[],"mappings":";;;AAAA,kDAAkD;AAClD,4CAA0E;AAC1E,iDAAqD;AAErD,4CAA0D;AAE1D;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8CG;AACH,MAAa,eAAe;IAExB;;;;;;;OAOG;IACH,MAAM,CAAC,MAAM,CAAI,IAAwB;QACrC,OAAO,eAAQ,CAAC,KAAK,CAAI,IAAA,cAAS,EAAC,OAAQ,IAAK,uCAAuC,EAAE,KAAK,CAAC,EAAE;YAC7F,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"}
|
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.9",
|
|
4
4
|
"description": "Test your web apps with Serenity/JS",
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "Jan Molak",
|
|
@@ -50,10 +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.9",
|
|
54
|
+
"@serenity-js/core": "3.0.0-rc.9",
|
|
55
55
|
"deepmerge": "^4.2.2",
|
|
56
56
|
"is-plain-object": "^5.0.0",
|
|
57
|
+
"query-selector-shadow-dom": "^1.0.0",
|
|
57
58
|
"tiny-types": "^1.17.0"
|
|
58
59
|
},
|
|
59
60
|
"peerDependencies": {
|
|
@@ -77,28 +78,28 @@
|
|
|
77
78
|
"devDependencies": {
|
|
78
79
|
"@documentation/esdoc-template": "3.0.0",
|
|
79
80
|
"@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.
|
|
81
|
+
"@serenity-js/cucumber": "3.0.0-rc.9",
|
|
82
|
+
"@serenity-js/jasmine": "3.0.0-rc.9",
|
|
83
|
+
"@serenity-js/local-server": "3.0.0-rc.9",
|
|
84
|
+
"@serenity-js/mocha": "3.0.0-rc.9",
|
|
85
|
+
"@serenity-js/rest": "3.0.0-rc.9",
|
|
86
|
+
"@serenity-js/web": "3.0.0-rc.9",
|
|
86
87
|
"@types/chai": "^4.3.0",
|
|
87
88
|
"@types/express": "^4.17.13",
|
|
88
89
|
"@types/html-minifier": "^4.0.1",
|
|
89
90
|
"@types/mocha": "^9.0.0",
|
|
90
91
|
"@types/selenium-webdriver": "^3.0.19",
|
|
91
92
|
"axios": "^0.21.4",
|
|
92
|
-
"body-parser": "^1.19.
|
|
93
|
+
"body-parser": "^1.19.1",
|
|
93
94
|
"cross-env": "^7.0.3",
|
|
94
|
-
"express": "^4.17.
|
|
95
|
+
"express": "^4.17.2",
|
|
95
96
|
"html-minifier": "^4.0.0",
|
|
96
97
|
"mocha": "^9.1.3",
|
|
97
98
|
"protractor": "^7.0.0",
|
|
98
99
|
"selenium-webdriver": "^3.6.0",
|
|
99
100
|
"start-server-and-test": "^1.14.0",
|
|
100
101
|
"ts-node": "^10.4.0",
|
|
101
|
-
"typescript": "^4.5.
|
|
102
|
+
"typescript": "^4.5.4"
|
|
102
103
|
},
|
|
103
104
|
"nyc": {
|
|
104
105
|
"include": [
|
|
@@ -122,5 +123,5 @@
|
|
|
122
123
|
"cache": true,
|
|
123
124
|
"all": true
|
|
124
125
|
},
|
|
125
|
-
"gitHead": "
|
|
126
|
+
"gitHead": "bc72fce0831fe6c1e4e69d5ca307d7fb5f6d2f0d"
|
|
126
127
|
}
|
|
@@ -2,6 +2,7 @@ import { ArtifactArchiver, Serenity } from '@serenity-js/core';
|
|
|
2
2
|
import { isPlainObject } from 'is-plain-object'; // fails when using default import
|
|
3
3
|
import { protractor, Runner } from 'protractor';
|
|
4
4
|
import deepmerge = require('deepmerge');
|
|
5
|
+
const querySelectorShadowDomPlugin = require('query-selector-shadow-dom/plugins/protractor'); // eslint-disable-line @typescript-eslint/no-var-requires
|
|
5
6
|
|
|
6
7
|
import { BrowserDetector, StandardisedCapabilities } from './browser-detector';
|
|
7
8
|
import { Config } from './Config';
|
|
@@ -27,6 +28,10 @@ export class ProtractorFrameworkAdapter {
|
|
|
27
28
|
*/
|
|
28
29
|
run(specs: string[]): Promise<ProtractorReport> {
|
|
29
30
|
|
|
31
|
+
if (! this.protractorRunner.plugins_?.pluginObjs?.some(plugin => plugin.name === querySelectorShadowDomPlugin.name)) {
|
|
32
|
+
this.protractorRunner.plugins_?.pluginObjs?.push(querySelectorShadowDomPlugin);
|
|
33
|
+
}
|
|
34
|
+
|
|
30
35
|
const runner = this.detector.runnerFor(this.protractorRunner.getConfig());
|
|
31
36
|
const reporter = new ProtractorReporter(this.protractorRunner, runner.successThreshold());
|
|
32
37
|
|
|
@@ -60,7 +60,13 @@ export class BrowseTheWebWithProtractor extends BrowseTheWeb<ElementFinder, Prot
|
|
|
60
60
|
*/
|
|
61
61
|
constructor(protected browser: ProtractorBrowser) {
|
|
62
62
|
super(new Map()
|
|
63
|
-
.set(ByCss, (selector: ByCss) =>
|
|
63
|
+
.set(ByCss, (selector: ByCss) =>
|
|
64
|
+
// todo: this is a temporary experiment; target state is for all CSS selectors to support Shadow DOM by default
|
|
65
|
+
ProtractorLocator.createRootLocator(this.browser, selector,
|
|
66
|
+
selector.value.startsWith('>>>') && !! by.shadowDomCss
|
|
67
|
+
? by.shadowDomCss(selector.value.replace('>>>', ''))
|
|
68
|
+
: by.css(selector.value))
|
|
69
|
+
)
|
|
64
70
|
.set(ByCssContainingText, (selector: ByCssContainingText) => ProtractorLocator.createRootLocator(this.browser, selector, by.cssContainingText(selector.value, selector.text)))
|
|
65
71
|
.set(ById, (selector: ById) => ProtractorLocator.createRootLocator(this.browser, selector, by.id(selector.value)))
|
|
66
72
|
.set(ByTagName, (selector: ByTagName) => ProtractorLocator.createRootLocator(this.browser, selector, by.tagName(selector.value)))
|
|
@@ -160,23 +160,124 @@ export class ProtractorPageElement
|
|
|
160
160
|
// get element at cx/cy and see if the element we found is our element, and therefore it's visible.
|
|
161
161
|
return promised(webElement.getDriver().executeScript(
|
|
162
162
|
`
|
|
163
|
-
var
|
|
163
|
+
var element = arguments[0];
|
|
164
164
|
|
|
165
|
-
if (!
|
|
166
|
-
return false
|
|
165
|
+
if (!element.getBoundingClientRect || !element.scrollIntoView || !element.contains || !element.getClientRects || !document.elementFromPoint) {
|
|
166
|
+
return false
|
|
167
167
|
}
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
168
|
+
|
|
169
|
+
// Edge before switching to Chromium
|
|
170
|
+
const isOldEdge = !!window['StyleMedia']
|
|
171
|
+
// returns true for Chrome and Firefox and false for Safari, Edge and IE
|
|
172
|
+
const scrollIntoViewFullSupport = !(window.safari || isOldEdge)
|
|
173
|
+
|
|
174
|
+
// get overlapping element
|
|
175
|
+
function getOverlappingElement (elem, context) {
|
|
176
|
+
context = context || document
|
|
177
|
+
const elemDimension = elem.getBoundingClientRect()
|
|
178
|
+
const x = elemDimension.left + (elem.clientWidth / 2)
|
|
179
|
+
const y = elemDimension.top + (elem.clientHeight / 2)
|
|
180
|
+
return context.elementFromPoint(x, y)
|
|
178
181
|
}
|
|
179
|
-
|
|
182
|
+
|
|
183
|
+
// get overlapping element rects (currently only the first)
|
|
184
|
+
// applicable if element's text is multiline.
|
|
185
|
+
function getOverlappingRects (elem, context) {
|
|
186
|
+
context = context || document
|
|
187
|
+
const elems = []
|
|
188
|
+
|
|
189
|
+
const rects = elem.getClientRects()
|
|
190
|
+
// webdriver clicks on center of the first element's rect (line of text), it might change in future
|
|
191
|
+
const rect = rects[0]
|
|
192
|
+
const x = rect.left + (rect.width / 2)
|
|
193
|
+
const y = rect.top + (rect.height / 2)
|
|
194
|
+
elems.push(context.elementFromPoint(x, y))
|
|
195
|
+
|
|
196
|
+
return elems
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
// get overlapping elements
|
|
200
|
+
function getOverlappingElements (elem, context) {
|
|
201
|
+
return [getOverlappingElement(elem, context)].concat(getOverlappingRects(elem, context))
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
// is a node a descendant of a given node
|
|
205
|
+
function nodeContains (elem, otherNode) {
|
|
206
|
+
// Edge doesn't support neither Shadow Dom nor contains if ShadowRoot polyfill is used
|
|
207
|
+
if (isOldEdge) {
|
|
208
|
+
let tmpElement = otherNode
|
|
209
|
+
while (tmpElement) {
|
|
210
|
+
if (tmpElement === elem) {
|
|
211
|
+
return true
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
tmpElement = tmpElement.parentNode
|
|
215
|
+
// DocumentFragment / ShadowRoot polyfill like ShadyRoot
|
|
216
|
+
if (tmpElement && tmpElement.nodeType === 11 && tmpElement.host) {
|
|
217
|
+
tmpElement = tmpElement.host
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
return false
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
return elem.contains(otherNode)
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
// is one of overlapping elements the \`elem\` or one of its child
|
|
227
|
+
function isOverlappingElementMatch (elementsFromPoint, elem) {
|
|
228
|
+
if (elementsFromPoint.some(function (elementFromPoint) {
|
|
229
|
+
return elementFromPoint === elem || nodeContains(elem, elementFromPoint)
|
|
230
|
+
})) {
|
|
231
|
+
return true
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
// shadow root
|
|
235
|
+
// filter unique elements with shadowRoot
|
|
236
|
+
// @ts-ignore
|
|
237
|
+
let elemsWithShadowRoot = [].concat(elementsFromPoint)
|
|
238
|
+
elemsWithShadowRoot = elemsWithShadowRoot.filter(function (x) {
|
|
239
|
+
return x && x.shadowRoot && x.shadowRoot.elementFromPoint
|
|
240
|
+
})
|
|
241
|
+
|
|
242
|
+
// getOverlappingElements of every element with shadowRoot
|
|
243
|
+
let shadowElementsFromPoint = []
|
|
244
|
+
for (let i = 0; i < elemsWithShadowRoot.length; ++i) {
|
|
245
|
+
let shadowElement = elemsWithShadowRoot[i]
|
|
246
|
+
shadowElementsFromPoint = shadowElementsFromPoint.concat(
|
|
247
|
+
getOverlappingElements(elem, shadowElement.shadowRoot)
|
|
248
|
+
)
|
|
249
|
+
}
|
|
250
|
+
// remove duplicates and parents
|
|
251
|
+
// @ts-ignore
|
|
252
|
+
shadowElementsFromPoint = [].concat(shadowElementsFromPoint)
|
|
253
|
+
shadowElementsFromPoint = shadowElementsFromPoint.filter(function (x) {
|
|
254
|
+
return !elementsFromPoint.includes(x)
|
|
255
|
+
})
|
|
256
|
+
|
|
257
|
+
if (shadowElementsFromPoint.length === 0) {
|
|
258
|
+
return false
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
return isOverlappingElementMatch(shadowElementsFromPoint, elem)
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
function isElementInViewport (elem) {
|
|
265
|
+
if (!elem.getBoundingClientRect) {
|
|
266
|
+
return false
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
const rect = elem.getBoundingClientRect()
|
|
270
|
+
|
|
271
|
+
const windowHeight = (window.innerHeight || document.documentElement.clientHeight)
|
|
272
|
+
const windowWidth = (window.innerWidth || document.documentElement.clientWidth)
|
|
273
|
+
|
|
274
|
+
const vertInView = (rect.top <= windowHeight) && ((rect.top + rect.height) > 0)
|
|
275
|
+
const horInView = (rect.left <= windowWidth) && ((rect.left + rect.width) > 0)
|
|
276
|
+
|
|
277
|
+
return (vertInView && horInView)
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
return isElementInViewport(element) && isOverlappingElementMatch(getOverlappingElements(element), element);
|
|
180
281
|
`,
|
|
181
282
|
webElement,
|
|
182
283
|
));
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/* eslint-disable unicorn/prevent-abbreviations */
|
|
2
|
-
import {
|
|
2
|
+
import { Answerable, Question, QuestionAdapter } from '@serenity-js/core';
|
|
3
3
|
import { formatted } from '@serenity-js/core/lib/io';
|
|
4
4
|
|
|
5
5
|
import { BrowseTheWebWithProtractor } from '../abilities';
|
|
@@ -61,8 +61,8 @@ export class ProtractorParam
|
|
|
61
61
|
* @param {@serenity-js/core/lib/screenplay~Answerable<string>} name
|
|
62
62
|
* @returns {Question<Promise<R>> & Adapter<R>}
|
|
63
63
|
*/
|
|
64
|
-
static called<R>(name: Answerable<string>):
|
|
65
|
-
return Question.about<
|
|
64
|
+
static called<R>(name: Answerable<string>): QuestionAdapter<R> {
|
|
65
|
+
return Question.about<R>(formatted `the ${ name } param specified in Protractor config`, actor => {
|
|
66
66
|
return actor.answer(name)
|
|
67
67
|
.then(name => (actor.abilityTo(BrowseTheWebWithProtractor) as BrowseTheWebWithProtractor).param(name));
|
|
68
68
|
});
|