@serenity-js/protractor 3.0.0-rc.9 → 3.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (169) hide show
  1. package/CHANGELOG.md +144 -2236
  2. package/README.md +39 -26
  3. package/lib/adapter/Config.d.ts +11 -9
  4. package/lib/adapter/Config.d.ts.map +1 -0
  5. package/lib/adapter/ProtractorFrameworkAdapter.d.ts +2 -3
  6. package/lib/adapter/ProtractorFrameworkAdapter.d.ts.map +1 -0
  7. package/lib/adapter/ProtractorFrameworkAdapter.js +11 -10
  8. package/lib/adapter/ProtractorFrameworkAdapter.js.map +1 -1
  9. package/lib/adapter/browser-detector/BrowserDetector.d.ts +1 -0
  10. package/lib/adapter/browser-detector/BrowserDetector.d.ts.map +1 -0
  11. package/lib/adapter/browser-detector/BrowserDetector.js +5 -5
  12. package/lib/adapter/browser-detector/BrowserDetector.js.map +1 -1
  13. package/lib/adapter/browser-detector/StandardisedCapabilities.d.ts +5 -4
  14. package/lib/adapter/browser-detector/StandardisedCapabilities.d.ts.map +1 -0
  15. package/lib/adapter/browser-detector/StandardisedCapabilities.js +17 -17
  16. package/lib/adapter/browser-detector/StandardisedCapabilities.js.map +1 -1
  17. package/lib/adapter/browser-detector/index.d.ts +1 -0
  18. package/lib/adapter/browser-detector/index.d.ts.map +1 -0
  19. package/lib/adapter/browser-detector/index.js +5 -1
  20. package/lib/adapter/browser-detector/index.js.map +1 -1
  21. package/lib/adapter/index.d.ts +2 -0
  22. package/lib/adapter/index.d.ts.map +1 -0
  23. package/lib/adapter/index.js +6 -1
  24. package/lib/adapter/index.js.map +1 -1
  25. package/lib/adapter/reporter/ProtractorReport.d.ts +5 -6
  26. package/lib/adapter/reporter/ProtractorReport.d.ts.map +1 -0
  27. package/lib/adapter/reporter/ProtractorReporter.d.ts +1 -0
  28. package/lib/adapter/reporter/ProtractorReporter.d.ts.map +1 -0
  29. package/lib/adapter/reporter/ProtractorReporter.js +10 -5
  30. package/lib/adapter/reporter/ProtractorReporter.js.map +1 -1
  31. package/lib/adapter/reporter/index.d.ts +1 -0
  32. package/lib/adapter/reporter/index.d.ts.map +1 -0
  33. package/lib/adapter/reporter/index.js +5 -1
  34. package/lib/adapter/reporter/index.js.map +1 -1
  35. package/lib/adapter/run.d.ts +7 -4
  36. package/lib/adapter/run.d.ts.map +1 -0
  37. package/lib/adapter/run.js +6 -4
  38. package/lib/adapter/run.js.map +1 -1
  39. package/lib/adapter/runner/CucumberAdapterConfig.d.ts +5 -10
  40. package/lib/adapter/runner/CucumberAdapterConfig.d.ts.map +1 -0
  41. package/lib/adapter/runner/TestRunnerDetector.d.ts +5 -12
  42. package/lib/adapter/runner/TestRunnerDetector.d.ts.map +1 -0
  43. package/lib/adapter/runner/TestRunnerDetector.js +7 -15
  44. package/lib/adapter/runner/TestRunnerDetector.js.map +1 -1
  45. package/lib/adapter/runner/TestRunnerLoader.d.ts +20 -17
  46. package/lib/adapter/runner/TestRunnerLoader.d.ts.map +1 -0
  47. package/lib/adapter/runner/TestRunnerLoader.js +18 -18
  48. package/lib/adapter/runner/TestRunnerLoader.js.map +1 -1
  49. package/lib/adapter/runner/index.d.ts +1 -0
  50. package/lib/adapter/runner/index.d.ts.map +1 -0
  51. package/lib/adapter/runner/index.js +5 -1
  52. package/lib/adapter/runner/index.js.map +1 -1
  53. package/lib/index.d.ts +1 -0
  54. package/lib/index.d.ts.map +1 -0
  55. package/lib/index.js +5 -1
  56. package/lib/index.js.map +1 -1
  57. package/lib/screenplay/abilities/BrowseTheWebWithProtractor.d.ts +62 -300
  58. package/lib/screenplay/abilities/BrowseTheWebWithProtractor.d.ts.map +1 -0
  59. package/lib/screenplay/abilities/BrowseTheWebWithProtractor.js +62 -422
  60. package/lib/screenplay/abilities/BrowseTheWebWithProtractor.js.map +1 -1
  61. package/lib/screenplay/abilities/index.d.ts +1 -0
  62. package/lib/screenplay/abilities/index.d.ts.map +1 -0
  63. package/lib/screenplay/abilities/index.js +5 -1
  64. package/lib/screenplay/abilities/index.js.map +1 -1
  65. package/lib/screenplay/index.d.ts +1 -0
  66. package/lib/screenplay/index.d.ts.map +1 -0
  67. package/lib/screenplay/index.js +5 -1
  68. package/lib/screenplay/index.js.map +1 -1
  69. package/lib/screenplay/interactions/UseAngular.d.ts +53 -48
  70. package/lib/screenplay/interactions/UseAngular.d.ts.map +1 -0
  71. package/lib/screenplay/interactions/UseAngular.js +52 -42
  72. package/lib/screenplay/interactions/UseAngular.js.map +1 -1
  73. package/lib/screenplay/interactions/index.d.ts +1 -0
  74. package/lib/screenplay/interactions/index.d.ts.map +1 -0
  75. package/lib/screenplay/interactions/index.js +5 -1
  76. package/lib/screenplay/interactions/index.js.map +1 -1
  77. package/lib/screenplay/models/ProtractorBrowsingSession.d.ts +22 -0
  78. package/lib/screenplay/models/ProtractorBrowsingSession.d.ts.map +1 -0
  79. package/lib/screenplay/models/ProtractorBrowsingSession.js +99 -0
  80. package/lib/screenplay/models/ProtractorBrowsingSession.js.map +1 -0
  81. package/lib/screenplay/models/ProtractorCookie.d.ts +6 -0
  82. package/lib/screenplay/models/ProtractorCookie.d.ts.map +1 -0
  83. package/lib/screenplay/models/ProtractorCookie.js +8 -3
  84. package/lib/screenplay/models/ProtractorCookie.js.map +1 -1
  85. package/lib/screenplay/models/ProtractorErrorHandler.d.ts +8 -0
  86. package/lib/screenplay/models/ProtractorErrorHandler.d.ts.map +1 -0
  87. package/lib/screenplay/models/ProtractorErrorHandler.js +23 -0
  88. package/lib/screenplay/models/ProtractorErrorHandler.js.map +1 -0
  89. package/lib/screenplay/models/ProtractorModalDialogHandler.d.ts +25 -0
  90. package/lib/screenplay/models/ProtractorModalDialogHandler.d.ts.map +1 -0
  91. package/lib/screenplay/models/ProtractorModalDialogHandler.js +74 -0
  92. package/lib/screenplay/models/ProtractorModalDialogHandler.js.map +1 -0
  93. package/lib/screenplay/models/ProtractorPage.d.ts +58 -6
  94. package/lib/screenplay/models/ProtractorPage.d.ts.map +1 -0
  95. package/lib/screenplay/models/ProtractorPage.js +221 -44
  96. package/lib/screenplay/models/ProtractorPage.js.map +1 -1
  97. package/lib/screenplay/models/ProtractorPageElement.d.ts +10 -1
  98. package/lib/screenplay/models/ProtractorPageElement.d.ts.map +1 -0
  99. package/lib/screenplay/models/ProtractorPageElement.js +141 -147
  100. package/lib/screenplay/models/ProtractorPageElement.js.map +1 -1
  101. package/lib/screenplay/models/index.d.ts +2 -1
  102. package/lib/screenplay/models/index.d.ts.map +1 -0
  103. package/lib/screenplay/models/index.js +6 -2
  104. package/lib/screenplay/models/index.js.map +1 -1
  105. package/lib/screenplay/models/locators/ProtractorLocator.d.ts +21 -8
  106. package/lib/screenplay/models/locators/ProtractorLocator.d.ts.map +1 -0
  107. package/lib/screenplay/models/locators/ProtractorLocator.js +107 -10
  108. package/lib/screenplay/models/locators/ProtractorLocator.js.map +1 -1
  109. package/lib/screenplay/models/locators/ProtractorRootLocator.d.ts +17 -0
  110. package/lib/screenplay/models/locators/ProtractorRootLocator.d.ts.map +1 -0
  111. package/lib/screenplay/models/locators/ProtractorRootLocator.js +38 -0
  112. package/lib/screenplay/models/locators/ProtractorRootLocator.js.map +1 -0
  113. package/lib/screenplay/models/locators/index.d.ts +2 -1
  114. package/lib/screenplay/models/locators/index.d.ts.map +1 -0
  115. package/lib/screenplay/models/locators/index.js +6 -2
  116. package/lib/screenplay/models/locators/index.js.map +1 -1
  117. package/lib/screenplay/promised.d.ts +3 -3
  118. package/lib/screenplay/promised.d.ts.map +1 -0
  119. package/lib/screenplay/promised.js +2 -3
  120. package/lib/screenplay/promised.js.map +1 -1
  121. package/lib/screenplay/questions/ProtractorParam.d.ts +64 -51
  122. package/lib/screenplay/questions/ProtractorParam.d.ts.map +1 -0
  123. package/lib/screenplay/questions/ProtractorParam.js +59 -47
  124. package/lib/screenplay/questions/ProtractorParam.js.map +1 -1
  125. package/lib/screenplay/questions/index.d.ts +1 -0
  126. package/lib/screenplay/questions/index.d.ts.map +1 -0
  127. package/lib/screenplay/questions/index.js +5 -1
  128. package/lib/screenplay/questions/index.js.map +1 -1
  129. package/lib/screenplay/unpromisedWebElement.d.ts +6 -4
  130. package/lib/screenplay/unpromisedWebElement.d.ts.map +1 -0
  131. package/lib/screenplay/unpromisedWebElement.js +5 -4
  132. package/lib/screenplay/unpromisedWebElement.js.map +1 -1
  133. package/package.json +36 -60
  134. package/src/adapter/Config.ts +10 -9
  135. package/src/adapter/ProtractorFrameworkAdapter.ts +16 -10
  136. package/src/adapter/browser-detector/BrowserDetector.ts +3 -3
  137. package/src/adapter/browser-detector/StandardisedCapabilities.ts +24 -24
  138. package/src/adapter/index.ts +1 -0
  139. package/src/adapter/reporter/ProtractorReport.ts +4 -6
  140. package/src/adapter/reporter/ProtractorReporter.ts +16 -16
  141. package/src/adapter/run.ts +6 -4
  142. package/src/adapter/runner/CucumberAdapterConfig.ts +5 -10
  143. package/src/adapter/runner/TestRunnerDetector.ts +5 -13
  144. package/src/adapter/runner/TestRunnerLoader.ts +21 -19
  145. package/src/screenplay/abilities/BrowseTheWebWithProtractor.ts +63 -480
  146. package/src/screenplay/interactions/UseAngular.ts +55 -44
  147. package/src/screenplay/models/ProtractorBrowsingSession.ts +133 -0
  148. package/src/screenplay/models/ProtractorCookie.ts +8 -3
  149. package/src/screenplay/models/ProtractorErrorHandler.ts +23 -0
  150. package/src/screenplay/models/ProtractorModalDialogHandler.ts +97 -0
  151. package/src/screenplay/models/ProtractorPage.ts +282 -54
  152. package/src/screenplay/models/ProtractorPageElement.ts +160 -165
  153. package/src/screenplay/models/index.ts +1 -1
  154. package/src/screenplay/models/locators/ProtractorLocator.ts +121 -31
  155. package/src/screenplay/models/locators/ProtractorRootLocator.ts +41 -0
  156. package/src/screenplay/models/locators/index.ts +1 -1
  157. package/src/screenplay/promised.ts +2 -3
  158. package/src/screenplay/questions/ProtractorParam.ts +62 -49
  159. package/src/screenplay/unpromisedWebElement.ts +5 -4
  160. package/tsconfig.build.json +14 -0
  161. package/lib/screenplay/models/ProtractorModalDialog.d.ts +0 -11
  162. package/lib/screenplay/models/ProtractorModalDialog.js +0 -43
  163. package/lib/screenplay/models/ProtractorModalDialog.js.map +0 -1
  164. package/lib/screenplay/models/locators/ProtractorNativeElementRoot.d.ts +0 -5
  165. package/lib/screenplay/models/locators/ProtractorNativeElementRoot.js +0 -3
  166. package/lib/screenplay/models/locators/ProtractorNativeElementRoot.js.map +0 -1
  167. package/src/screenplay/models/ProtractorModalDialog.ts +0 -49
  168. package/src/screenplay/models/locators/ProtractorNativeElementRoot.ts +0 -6
  169. package/tsconfig.eslint.json +0 -10
@@ -1,229 +1,223 @@
1
1
  "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || function (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
+ __setModuleDefault(result, mod);
23
+ return result;
24
+ };
2
25
  Object.defineProperty(exports, "__esModule", { value: true });
3
26
  exports.ProtractorPageElement = void 0;
27
+ const core_1 = require("@serenity-js/core");
4
28
  const web_1 = require("@serenity-js/web");
29
+ const scripts = __importStar(require("@serenity-js/web/lib/scripts"));
5
30
  const protractor_1 = require("protractor");
6
31
  const promised_1 = require("../promised");
32
+ /**
33
+ * Protractor-specific implementation of {@apilink PageElement}.
34
+ *
35
+ * @group Models
36
+ */
7
37
  class ProtractorPageElement extends web_1.PageElement {
8
38
  of(parent) {
9
39
  return new ProtractorPageElement(this.locator.of(parent.locator));
10
40
  }
11
41
  async clearValue() {
12
- function removeCharactersFrom(elf, numberOfCharacters) {
13
- return numberOfCharacters === 0
14
- ? Promise.resolve(void 0)
15
- : elf.sendKeys(protractor_1.protractor.Key.END, ...times(numberOfCharacters, protractor_1.protractor.Key.BACK_SPACE));
16
- }
17
42
  // eslint-disable-next-line unicorn/consistent-function-scoping
18
43
  function times(length, key) {
19
44
  return Array.from({ length }).map(() => key);
20
45
  }
21
- const currentValue = await this.value();
22
- if (currentValue !== null && currentValue !== undefined) {
23
- const element = await this.nativeElement();
24
- return removeCharactersFrom(element, currentValue.length);
46
+ // eslint-disable-next-line unicorn/consistent-function-scoping
47
+ async function focusOn(element) {
48
+ const webElement = await element.getWebElement();
49
+ await (0, promised_1.promised)(webElement.getDriver().executeScript(`arguments[0].focus()`, webElement));
50
+ }
51
+ // eslint-disable-next-line unicorn/consistent-function-scoping
52
+ async function removeCharactersFrom(elf, numberOfCharacters) {
53
+ if (numberOfCharacters > 0) {
54
+ await focusOn(elf);
55
+ await elf.sendKeys(protractor_1.protractor.Key.HOME, ...times(numberOfCharacters, protractor_1.protractor.Key.DELETE));
56
+ }
57
+ }
58
+ const value = await this.value();
59
+ const hasValue = value !== null && value !== undefined;
60
+ const element = await this.nativeElement();
61
+ if (hasValue) {
62
+ return removeCharactersFrom(element, value.length);
63
+ }
64
+ const contentEditable = await (0, promised_1.promised)(element.getAttribute('contenteditable'));
65
+ const hasContentEditable = contentEditable !== null && contentEditable !== undefined && contentEditable !== 'false';
66
+ if (hasContentEditable) {
67
+ const text = await this.text();
68
+ return removeCharactersFrom(element, text.length);
25
69
  }
26
70
  }
27
71
  async click() {
28
72
  const element = await this.nativeElement();
29
- return element.click();
73
+ await (0, promised_1.promised)(element.click());
30
74
  }
31
75
  async doubleClick() {
32
76
  const element = await this.nativeElement();
33
77
  const webElement = await element.getWebElement();
34
- return (0, promised_1.promised)(webElement.getDriver().actions()
78
+ await (0, promised_1.promised)(webElement.getDriver().actions()
35
79
  .mouseMove(webElement)
36
80
  .doubleClick()
37
81
  .perform());
38
82
  }
39
83
  async enterValue(value) {
40
84
  const element = await this.nativeElement();
41
- return element.sendKeys([].concat(value).join(''));
85
+ await (0, promised_1.promised)(element.sendKeys([].concat(value).join('')));
42
86
  }
43
87
  async scrollIntoView() {
44
88
  const element = await this.nativeElement();
45
89
  const webElement = await element.getWebElement();
46
- return (0, promised_1.promised)(webElement.getDriver().executeScript('arguments[0].scrollIntoView(true);', webElement));
90
+ await (0, promised_1.promised)(webElement.getDriver().executeScript('arguments[0].scrollIntoView(true);', webElement));
47
91
  }
48
92
  async hoverOver() {
49
93
  const element = await this.nativeElement();
50
94
  const webElement = await element.getWebElement();
51
- return (0, promised_1.promised)(webElement.getDriver().actions()
95
+ await (0, promised_1.promised)(webElement.getDriver().actions()
52
96
  .mouseMove(webElement)
53
97
  .perform());
54
98
  }
55
99
  async rightClick() {
56
100
  const element = await this.nativeElement();
57
101
  const webElement = await element.getWebElement();
58
- return (0, promised_1.promised)(webElement.getDriver().actions()
102
+ await (0, promised_1.promised)(webElement.getDriver().actions()
59
103
  .mouseMove(webElement)
60
104
  .click(protractor_1.protractor.Button.RIGHT)
61
105
  .perform());
62
106
  }
107
+ async selectOptions(...options) {
108
+ const element = await this.nativeElement();
109
+ for (const option of options) {
110
+ if (option.value) {
111
+ await (0, promised_1.promised)(element.element(protractor_1.by.xpath(`//option[@value='${option.value}']`)).click());
112
+ }
113
+ else if (option.label) {
114
+ await (0, promised_1.promised)(element.element(protractor_1.by.cssContainingText('option', option.label)).click());
115
+ }
116
+ }
117
+ }
118
+ async selectedOptions() {
119
+ const element = await this.locator.nativeElement();
120
+ const webElement = await element.getWebElement();
121
+ const browser = element.browser_;
122
+ const options = await browser.executeScript(
123
+ /* istanbul ignore next */
124
+ (select) => {
125
+ const options = [];
126
+ select.querySelectorAll('option').forEach((option) => {
127
+ options.push({
128
+ selected: option.selected,
129
+ disabled: option.disabled,
130
+ label: option.label,
131
+ value: option.value,
132
+ });
133
+ });
134
+ return options;
135
+ }, webElement);
136
+ return options.map(option => new web_1.SelectOption(option.label, option.value, option.selected, option.disabled));
137
+ }
63
138
  async attribute(name) {
64
139
  const element = await this.nativeElement();
65
- return element.getAttribute(name);
140
+ return await (0, promised_1.promised)(element.getAttribute(name));
66
141
  }
67
142
  async text() {
68
143
  const element = await this.nativeElement();
69
- return element.getText();
144
+ return await (0, promised_1.promised)(element.getText());
70
145
  }
71
146
  async value() {
72
147
  const element = await this.nativeElement();
73
148
  const webElement = await element.getWebElement();
74
- return (0, promised_1.promised)(webElement.getDriver().executeScript(
149
+ return await (0, promised_1.promised)(webElement.getDriver().executeScript(
75
150
  /* istanbul ignore next */
76
151
  function getValue(webElement) {
77
152
  return webElement.value;
78
153
  }, webElement));
79
154
  }
155
+ async switchTo() {
156
+ const element = await this.locator.nativeElement();
157
+ try {
158
+ const tagName = await element.getTagName();
159
+ if (['iframe', 'frame'].includes(tagName)) {
160
+ const locator = this.locator;
161
+ await locator.switchToFrame(element);
162
+ return {
163
+ switchBack: async () => {
164
+ await locator.switchToParentFrame();
165
+ },
166
+ };
167
+ }
168
+ else {
169
+ // https://github.com/angular/protractor/issues/1846#issuecomment-82634739;
170
+ const webElement = await element.getWebElement();
171
+ // focus on element
172
+ const previouslyFocusedElement = await (0, promised_1.promised)(webElement.getDriver().switchTo().activeElement());
173
+ await (0, promised_1.promised)(webElement.getDriver().executeScript(`arguments[0].focus()`, webElement));
174
+ return {
175
+ switchBack: async () => {
176
+ await (0, promised_1.promised)(webElement.getDriver().executeScript(`arguments[0].focus()`, previouslyFocusedElement));
177
+ },
178
+ };
179
+ }
180
+ }
181
+ catch (error) {
182
+ throw new core_1.LogicError(`Couldn't switch to page element located ${this.locator}`, error);
183
+ }
184
+ }
80
185
  async isActive() {
81
186
  const element = await this.nativeElement();
82
187
  const webElement = await element.getWebElement();
83
- return webElement.getDriver().switchTo().activeElement().then((active) => element.equals(active));
188
+ return await (0, promised_1.promised)(webElement.getDriver().switchTo().activeElement().then((active) => element.equals(active)));
84
189
  }
85
190
  async isClickable() {
86
- return this.isEnabled();
191
+ return await this.isEnabled();
87
192
  }
88
193
  async isEnabled() {
89
194
  const element = await this.nativeElement();
90
- return element.isEnabled();
195
+ return await (0, promised_1.promised)(element.isEnabled());
91
196
  }
92
197
  async isPresent() {
93
198
  const element = await this.nativeElement();
94
- return element.isPresent();
199
+ return await (0, promised_1.promised)(element.isPresent());
95
200
  }
96
201
  async isSelected() {
97
202
  const element = await this.nativeElement();
98
- return element.isSelected();
203
+ return await (0, promised_1.promised)(element.isSelected());
99
204
  }
100
205
  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 element = arguments[0];
109
-
110
- if (!element.getBoundingClientRect || !element.scrollIntoView || !element.contains || !element.getClientRects || !document.elementFromPoint) {
111
- return false
112
- }
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)
126
- }
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)
206
+ try {
207
+ const element = await this.nativeElement();
208
+ if (!await element.isDisplayed()) {
209
+ return false;
207
210
  }
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)
211
+ const webElement = await element.getWebElement();
212
+ // get element at cx/cy and see if the element we found is our element, and therefore it's visible.
213
+ return await (0, promised_1.promised)(webElement.getDriver().executeScript(scripts.isVisible, webElement));
214
+ }
215
+ catch (error) {
216
+ if (error.name === 'NoSuchElementError') {
217
+ return false;
223
218
  }
224
-
225
- return isElementInViewport(element) && isOverlappingElementMatch(getOverlappingElements(element), element);
226
- `, webElement));
219
+ throw error;
220
+ }
227
221
  }
228
222
  }
229
223
  exports.ProtractorPageElement = ProtractorPageElement;
@@ -1 +1 @@
1
- {"version":3,"file":"ProtractorPageElement.js","sourceRoot":"","sources":["../../../src/screenplay/models/ProtractorPageElement.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ProtractorPageElement.js","sourceRoot":"","sources":["../../../src/screenplay/models/ProtractorPageElement.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,5 @@
1
+ export * from './ProtractorBrowsingSession';
1
2
  export * from './ProtractorCookie';
2
- export * from './ProtractorModalDialog';
3
3
  export * from './ProtractorPage';
4
4
  export * from './ProtractorPageElement';
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/screenplay/models/index.ts"],"names":[],"mappings":"AAAA,cAAc,6BAA6B,CAAC;AAC5C,cAAc,oBAAoB,CAAC;AACnC,cAAc,kBAAkB,CAAC;AACjC,cAAc,yBAAyB,CAAC"}
@@ -1,7 +1,11 @@
1
1
  "use strict";
2
2
  var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
3
  if (k2 === undefined) k2 = k;
4
- Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
5
9
  }) : (function(o, m, k, k2) {
6
10
  if (k2 === undefined) k2 = k;
7
11
  o[k2] = m[k];
@@ -10,8 +14,8 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
10
14
  for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
11
15
  };
12
16
  Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./ProtractorBrowsingSession"), exports);
13
18
  __exportStar(require("./ProtractorCookie"), exports);
14
- __exportStar(require("./ProtractorModalDialog"), exports);
15
19
  __exportStar(require("./ProtractorPage"), exports);
16
20
  __exportStar(require("./ProtractorPageElement"), exports);
17
21
  //# 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,mDAAiC;AACjC,0DAAwC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/screenplay/models/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,8DAA4C;AAC5C,qDAAmC;AACnC,mDAAiC;AACjC,0DAAwC"}
@@ -1,9 +1,22 @@
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>>>;
1
+ import { Locator, PageElement, RootLocator, Selector } from '@serenity-js/web';
2
+ import * as protractor from 'protractor';
3
+ import { ProtractorErrorHandler } from '../ProtractorErrorHandler';
4
+ /**
5
+ * Protractor-specific implementation of {@apilink Locator}.
6
+ *
7
+ * @group Models
8
+ */
9
+ export declare class ProtractorLocator extends Locator<protractor.ElementFinder, protractor.Locator> {
10
+ private readonly errorHandler;
11
+ constructor(parent: RootLocator<protractor.ElementFinder>, selector: Selector, errorHandler: ProtractorErrorHandler);
12
+ protected nativeSelector(): protractor.Locator;
13
+ isPresent(): Promise<boolean>;
14
+ nativeElement(): Promise<protractor.ElementFinder>;
15
+ private resolveNativeElement;
16
+ allNativeElements(): Promise<Array<protractor.ElementFinder>>;
17
+ of(parent: ProtractorLocator): Locator<protractor.ElementFinder, protractor.Locator>;
18
+ locate(child: ProtractorLocator): Locator<protractor.ElementFinder, any>;
19
+ element(): PageElement<protractor.ElementFinder>;
20
+ allElements(): Promise<Array<PageElement<protractor.ElementFinder>>>;
9
21
  }
22
+ //# sourceMappingURL=ProtractorLocator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ProtractorLocator.d.ts","sourceRoot":"","sources":["../../../../src/screenplay/models/locators/ProtractorLocator.ts"],"names":[],"mappings":"AACA,OAAO,EAAmE,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAChJ,OAAO,KAAK,UAAU,MAAM,YAAY,CAAC;AAGzC,OAAO,EAAE,sBAAsB,EAAE,MAAM,2BAA2B,CAAC;AAInE;;;;GAIG;AACH,qBAAa,iBAAkB,SAAQ,OAAO,CAAC,UAAU,CAAC,aAAa,EAAE,UAAU,CAAC,OAAO,CAAC;IAKpF,OAAO,CAAC,QAAQ,CAAC,YAAY;gBAF7B,MAAM,EAAE,WAAW,CAAC,UAAU,CAAC,aAAa,CAAC,EAC7C,QAAQ,EAAE,QAAQ,EACD,YAAY,EAAE,sBAAsB;IAMzD,SAAS,CAAC,cAAc,IAAI,UAAU,CAAC,OAAO;IAgCxC,SAAS,IAAI,OAAO,CAAC,OAAO,CAAC;IAU7B,aAAa,IAAI,OAAO,CAAC,UAAU,CAAC,aAAa,CAAC;YAS1C,oBAAoB;IAU5B,iBAAiB,IAAI,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC;IAKnE,EAAE,CAAC,MAAM,EAAE,iBAAiB,GAAG,OAAO,CAAC,UAAU,CAAC,aAAa,EAAE,UAAU,CAAC,OAAO,CAAC;IAIpF,MAAM,CAAC,KAAK,EAAE,iBAAiB,GAAG,OAAO,CAAC,UAAU,CAAC,aAAa,EAAE,GAAG,CAAC;IAIxE,OAAO,IAAI,WAAW,CAAC,UAAU,CAAC,aAAa,CAAC;IAI1C,WAAW,IAAI,OAAO,CAAC,KAAK,CAAC,WAAW,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC,CAAC;CAc7E"}
@@ -1,28 +1,125 @@
1
1
  "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || function (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
+ __setModuleDefault(result, mod);
23
+ return result;
24
+ };
2
25
  Object.defineProperty(exports, "__esModule", { value: true });
3
26
  exports.ProtractorLocator = void 0;
27
+ const core_1 = require("@serenity-js/core");
4
28
  const web_1 = require("@serenity-js/web");
29
+ const protractor = __importStar(require("protractor"));
5
30
  const unpromisedWebElement_1 = require("../../unpromisedWebElement");
6
31
  const ProtractorPageElement_1 = require("../ProtractorPageElement");
32
+ /**
33
+ * Protractor-specific implementation of {@apilink Locator}.
34
+ *
35
+ * @group Models
36
+ */
7
37
  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));
38
+ constructor(parent, selector, errorHandler) {
39
+ super(parent, selector);
40
+ this.errorHandler = errorHandler;
41
+ }
42
+ // todo: refactor; replace with a map and some more generic lookup mechanism
43
+ nativeSelector() {
44
+ if (this.selector instanceof web_1.ByCss) {
45
+ return protractor.by.css(this.selector.value);
46
+ }
47
+ if (this.selector instanceof web_1.ByDeepCss) {
48
+ if (!protractor.by.shadowDomCss) {
49
+ throw new core_1.LogicError(`By.deepCss() requires query-selector-shadow-dom plugin, which Serenity/JS ProtractorFrameworkAdapter registers by default. If you're using Serenity/JS without ProtractorFrameworkAdapter, please register the plugin yourself.`);
50
+ }
51
+ return protractor.by.shadowDomCss(this.selector.value.replace('>>>', '').trim());
52
+ }
53
+ if (this.selector instanceof web_1.ByCssContainingText) {
54
+ return protractor.by.cssContainingText(this.selector.value, this.selector.text);
55
+ }
56
+ if (this.selector instanceof web_1.ById) {
57
+ return protractor.by.id(this.selector.value);
58
+ }
59
+ if (this.selector instanceof web_1.ByTagName) {
60
+ return protractor.by.tagName(this.selector.value);
61
+ }
62
+ if (this.selector instanceof web_1.ByXPath) {
63
+ return protractor.by.xpath(this.selector.value);
64
+ }
65
+ throw new core_1.LogicError((0, core_1.f) `${this.selector} is not supported by ${this.constructor.name}`);
66
+ }
67
+ async isPresent() {
68
+ try {
69
+ const element = await this.resolveNativeElement();
70
+ return Boolean(element);
71
+ }
72
+ catch {
73
+ return false;
74
+ }
75
+ }
76
+ async nativeElement() {
77
+ try {
78
+ return await this.resolveNativeElement();
79
+ }
80
+ catch (error) {
81
+ return await this.errorHandler.executeIfHandled(error, () => this.resolveNativeElement());
82
+ }
83
+ }
84
+ async resolveNativeElement() {
85
+ const parent = await this.parent.nativeElement();
86
+ const result = await (0, unpromisedWebElement_1.unpromisedWebElement)(parent.element(this.nativeSelector()));
87
+ // checks if the element can be interacted with; in particular, throws unexpected alert present if there is one
88
+ await result.isPresent();
89
+ return result;
90
+ }
91
+ async allNativeElements() {
92
+ const parent = await this.parent.nativeElement();
93
+ return parent.all(this.nativeSelector());
14
94
  }
15
95
  of(parent) {
16
- return new ProtractorLocator(() => parent.nativeElement(), this.selector, (parentRoot) => this.locateElement(parentRoot), (parentRoot) => this.locateAllElements(parentRoot));
96
+ return new ProtractorLocator(parent, this.selector, this.errorHandler);
97
+ }
98
+ locate(child) {
99
+ return new ProtractorLocator(this, child.selector, this.errorHandler);
17
100
  }
18
101
  element() {
19
102
  return new ProtractorPageElement_1.ProtractorPageElement(this);
20
103
  }
21
104
  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)]))));
105
+ const elements = await this.allNativeElements();
106
+ return Promise.all(elements.map(childElement => new ProtractorPageElement_1.ProtractorPageElement(new ExistingElementLocator(this.parent, this.selector, this.errorHandler, (0, unpromisedWebElement_1.unpromisedWebElement)(childElement)))));
25
107
  }
26
108
  }
27
109
  exports.ProtractorLocator = ProtractorLocator;
110
+ /**
111
+ * @private
112
+ */
113
+ class ExistingElementLocator extends ProtractorLocator {
114
+ constructor(parent, selector, errorHandler, existingNativeElement) {
115
+ super(parent, selector, errorHandler);
116
+ this.existingNativeElement = existingNativeElement;
117
+ }
118
+ async nativeElement() {
119
+ return this.existingNativeElement;
120
+ }
121
+ async allNativeElements() {
122
+ return [this.existingNativeElement];
123
+ }
124
+ }
28
125
  //# sourceMappingURL=ProtractorLocator.js.map
@@ -1 +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
+ {"version":3,"file":"ProtractorLocator.js","sourceRoot":"","sources":["../../../../src/screenplay/models/locators/ProtractorLocator.ts"],"names":[],"mappings":"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"}