@serenity-js/webdriverio 3.0.0-rc.8 → 3.0.0

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 (139) hide show
  1. package/CHANGELOG.md +245 -119
  2. package/README.md +66 -45
  3. package/lib/adapter/TestRunnerLoader.d.ts +3 -4
  4. package/lib/adapter/TestRunnerLoader.d.ts.map +1 -0
  5. package/lib/adapter/TestRunnerLoader.js +1 -4
  6. package/lib/adapter/TestRunnerLoader.js.map +1 -1
  7. package/lib/adapter/WebdriverIOConfig.d.ts +115 -109
  8. package/lib/adapter/WebdriverIOConfig.d.ts.map +1 -0
  9. package/lib/adapter/WebdriverIOFrameworkAdapter.d.ts +1 -3
  10. package/lib/adapter/WebdriverIOFrameworkAdapter.d.ts.map +1 -0
  11. package/lib/adapter/WebdriverIOFrameworkAdapter.js +14 -8
  12. package/lib/adapter/WebdriverIOFrameworkAdapter.js.map +1 -1
  13. package/lib/adapter/WebdriverIOFrameworkAdapterFactory.d.ts +2 -1
  14. package/lib/adapter/WebdriverIOFrameworkAdapterFactory.d.ts.map +1 -0
  15. package/lib/adapter/WebdriverIOFrameworkAdapterFactory.js +1 -1
  16. package/lib/adapter/WebdriverIONotifier.d.ts +1 -0
  17. package/lib/adapter/WebdriverIONotifier.d.ts.map +1 -0
  18. package/lib/adapter/WebdriverIONotifier.js +5 -5
  19. package/lib/adapter/WebdriverIONotifier.js.map +1 -1
  20. package/lib/adapter/index.d.ts +1 -1
  21. package/lib/adapter/index.d.ts.map +1 -0
  22. package/lib/adapter/index.js +5 -2
  23. package/lib/adapter/index.js.map +1 -1
  24. package/lib/adapter/reporter/BrowserCapabilitiesReporter.d.ts +1 -0
  25. package/lib/adapter/reporter/BrowserCapabilitiesReporter.d.ts.map +1 -0
  26. package/lib/adapter/reporter/BrowserCapabilitiesReporter.js +4 -1
  27. package/lib/adapter/reporter/BrowserCapabilitiesReporter.js.map +1 -1
  28. package/lib/adapter/reporter/InitialisesReporters.d.ts +1 -0
  29. package/lib/adapter/reporter/InitialisesReporters.d.ts.map +1 -0
  30. package/lib/adapter/reporter/OutputStreamBuffer.d.ts +2 -1
  31. package/lib/adapter/reporter/OutputStreamBuffer.d.ts.map +1 -0
  32. package/lib/adapter/reporter/OutputStreamBufferPrinter.d.ts +2 -1
  33. package/lib/adapter/reporter/OutputStreamBufferPrinter.d.ts.map +1 -0
  34. package/lib/adapter/reporter/OutputStreamBufferPrinter.js.map +1 -1
  35. package/lib/adapter/reporter/ProvidesWriteStream.d.ts +2 -1
  36. package/lib/adapter/reporter/ProvidesWriteStream.d.ts.map +1 -0
  37. package/lib/adapter/reporter/TagPrinter.d.ts +1 -0
  38. package/lib/adapter/reporter/TagPrinter.d.ts.map +1 -0
  39. package/lib/adapter/reporter/index.d.ts +1 -0
  40. package/lib/adapter/reporter/index.d.ts.map +1 -0
  41. package/lib/adapter/reporter/index.js +5 -1
  42. package/lib/adapter/reporter/index.js.map +1 -1
  43. package/lib/index.d.ts +1 -0
  44. package/lib/index.d.ts.map +1 -0
  45. package/lib/index.js +5 -1
  46. package/lib/index.js.map +1 -1
  47. package/lib/screenplay/abilities/BrowseTheWebWithWebdriverIO.d.ts +28 -197
  48. package/lib/screenplay/abilities/BrowseTheWebWithWebdriverIO.d.ts.map +1 -0
  49. package/lib/screenplay/abilities/BrowseTheWebWithWebdriverIO.js +29 -296
  50. package/lib/screenplay/abilities/BrowseTheWebWithWebdriverIO.js.map +1 -1
  51. package/lib/screenplay/abilities/index.d.ts +1 -0
  52. package/lib/screenplay/abilities/index.d.ts.map +1 -0
  53. package/lib/screenplay/abilities/index.js +5 -1
  54. package/lib/screenplay/abilities/index.js.map +1 -1
  55. package/lib/screenplay/index.d.ts +1 -0
  56. package/lib/screenplay/index.d.ts.map +1 -0
  57. package/lib/screenplay/index.js +5 -1
  58. package/lib/screenplay/index.js.map +1 -1
  59. package/lib/screenplay/models/WebdriverIOBrowsingSession.d.ts +24 -0
  60. package/lib/screenplay/models/WebdriverIOBrowsingSession.d.ts.map +1 -0
  61. package/lib/screenplay/models/WebdriverIOBrowsingSession.js +125 -0
  62. package/lib/screenplay/models/WebdriverIOBrowsingSession.js.map +1 -0
  63. package/lib/screenplay/models/WebdriverIOCookie.d.ts +6 -0
  64. package/lib/screenplay/models/WebdriverIOCookie.d.ts.map +1 -0
  65. package/lib/screenplay/models/WebdriverIOCookie.js +7 -2
  66. package/lib/screenplay/models/WebdriverIOCookie.js.map +1 -1
  67. package/lib/screenplay/models/WebdriverIOErrorHandler.d.ts +9 -0
  68. package/lib/screenplay/models/WebdriverIOErrorHandler.d.ts.map +1 -0
  69. package/lib/screenplay/models/WebdriverIOErrorHandler.js +23 -0
  70. package/lib/screenplay/models/WebdriverIOErrorHandler.js.map +1 -0
  71. package/lib/screenplay/models/WebdriverIOModalDialogHandler.d.ts +29 -0
  72. package/lib/screenplay/models/WebdriverIOModalDialogHandler.d.ts.map +1 -0
  73. package/lib/screenplay/models/WebdriverIOModalDialogHandler.js +77 -0
  74. package/lib/screenplay/models/WebdriverIOModalDialogHandler.js.map +1 -0
  75. package/lib/screenplay/models/WebdriverIOPage.d.ts +29 -5
  76. package/lib/screenplay/models/WebdriverIOPage.d.ts.map +1 -0
  77. package/lib/screenplay/models/WebdriverIOPage.js +166 -54
  78. package/lib/screenplay/models/WebdriverIOPage.js.map +1 -1
  79. package/lib/screenplay/models/WebdriverIOPageElement.d.ts +10 -10
  80. package/lib/screenplay/models/WebdriverIOPageElement.d.ts.map +1 -0
  81. package/lib/screenplay/models/WebdriverIOPageElement.js +164 -46
  82. package/lib/screenplay/models/WebdriverIOPageElement.js.map +1 -1
  83. package/lib/screenplay/models/WebdriverIOPuppeteerModalDialogHandler.d.ts +32 -0
  84. package/lib/screenplay/models/WebdriverIOPuppeteerModalDialogHandler.d.ts.map +1 -0
  85. package/lib/screenplay/models/WebdriverIOPuppeteerModalDialogHandler.js +82 -0
  86. package/lib/screenplay/models/WebdriverIOPuppeteerModalDialogHandler.js.map +1 -0
  87. package/lib/screenplay/models/WebdriverProtocolErrorCode.d.ts +39 -0
  88. package/lib/screenplay/models/WebdriverProtocolErrorCode.d.ts.map +1 -0
  89. package/lib/screenplay/models/WebdriverProtocolErrorCode.js +43 -0
  90. package/lib/screenplay/models/WebdriverProtocolErrorCode.js.map +1 -0
  91. package/lib/screenplay/models/index.d.ts +2 -1
  92. package/lib/screenplay/models/index.d.ts.map +1 -0
  93. package/lib/screenplay/models/index.js +6 -2
  94. package/lib/screenplay/models/index.js.map +1 -1
  95. package/lib/screenplay/models/locators/WebdriverIOLocator.d.ts +18 -5
  96. package/lib/screenplay/models/locators/WebdriverIOLocator.d.ts.map +1 -0
  97. package/lib/screenplay/models/locators/WebdriverIOLocator.js +84 -5
  98. package/lib/screenplay/models/locators/WebdriverIOLocator.js.map +1 -1
  99. package/lib/screenplay/models/locators/WebdriverIORootLocator.d.ts +17 -0
  100. package/lib/screenplay/models/locators/WebdriverIORootLocator.d.ts.map +1 -0
  101. package/lib/screenplay/models/locators/WebdriverIORootLocator.js +32 -0
  102. package/lib/screenplay/models/locators/WebdriverIORootLocator.js.map +1 -0
  103. package/lib/screenplay/models/locators/index.d.ts +2 -1
  104. package/lib/screenplay/models/locators/index.d.ts.map +1 -0
  105. package/lib/screenplay/models/locators/index.js +6 -2
  106. package/lib/screenplay/models/locators/index.js.map +1 -1
  107. package/package.json +31 -32
  108. package/src/adapter/TestRunnerLoader.ts +3 -5
  109. package/src/adapter/WebdriverIOConfig.ts +114 -109
  110. package/src/adapter/WebdriverIOFrameworkAdapter.ts +20 -12
  111. package/src/adapter/WebdriverIOFrameworkAdapterFactory.ts +1 -1
  112. package/src/adapter/WebdriverIONotifier.ts +8 -6
  113. package/src/adapter/index.ts +0 -1
  114. package/src/adapter/reporter/OutputStreamBuffer.ts +1 -1
  115. package/src/adapter/reporter/OutputStreamBufferPrinter.ts +1 -1
  116. package/src/adapter/reporter/ProvidesWriteStream.ts +1 -1
  117. package/src/screenplay/abilities/BrowseTheWebWithWebdriverIO.ts +29 -339
  118. package/src/screenplay/models/WebdriverIOBrowsingSession.ts +171 -0
  119. package/src/screenplay/models/WebdriverIOCookie.ts +7 -2
  120. package/src/screenplay/models/WebdriverIOErrorHandler.ts +25 -0
  121. package/src/screenplay/models/WebdriverIOModalDialogHandler.ts +100 -0
  122. package/src/screenplay/models/WebdriverIOPage.ts +222 -63
  123. package/src/screenplay/models/WebdriverIOPageElement.ts +181 -62
  124. package/src/screenplay/models/WebdriverIOPuppeteerModalDialogHandler.ts +97 -0
  125. package/src/screenplay/models/WebdriverProtocolErrorCode.ts +38 -0
  126. package/src/screenplay/models/index.ts +1 -1
  127. package/src/screenplay/models/locators/WebdriverIOLocator.ts +122 -24
  128. package/src/screenplay/models/locators/WebdriverIORootLocator.ts +33 -0
  129. package/src/screenplay/models/locators/index.ts +1 -1
  130. package/tsconfig.build.json +17 -0
  131. package/lib/screenplay/models/WebdriverIOModalDialog.d.ts +0 -11
  132. package/lib/screenplay/models/WebdriverIOModalDialog.js +0 -40
  133. package/lib/screenplay/models/WebdriverIOModalDialog.js.map +0 -1
  134. package/lib/screenplay/models/locators/WebdriverIONativeElementRoot.d.ts +0 -2
  135. package/lib/screenplay/models/locators/WebdriverIONativeElementRoot.js +0 -3
  136. package/lib/screenplay/models/locators/WebdriverIONativeElementRoot.js.map +0 -1
  137. package/src/screenplay/models/WebdriverIOModalDialog.ts +0 -45
  138. package/src/screenplay/models/locators/WebdriverIONativeElementRoot.ts +0 -3
  139. package/tsconfig.eslint.json +0 -10
@@ -1,105 +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.WebdriverIOPageElement = 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"));
30
+ const WebdriverProtocolErrorCode_1 = require("./WebdriverProtocolErrorCode");
31
+ /**
32
+ * WebdriverIO-specific implementation of {@apilink PageElement}.
33
+ *
34
+ * @group Models
35
+ */
5
36
  class WebdriverIOPageElement extends web_1.PageElement {
6
37
  of(parent) {
7
38
  return new WebdriverIOPageElement(this.locator.of(parent.locator));
8
39
  }
9
40
  async clearValue() {
41
+ // eslint-disable-next-line unicorn/consistent-function-scoping
42
+ function times(length, key) {
43
+ return Array.from({ length }).map(() => key);
44
+ }
45
+ // eslint-disable-next-line unicorn/consistent-function-scoping
46
+ async function removeCharactersFrom(browser, inputElement, numberOfCharacters) {
47
+ const homeKey = browser.isDevTools ? web_1.Key.Home.devtoolsName : web_1.Key.Home.utf16codePoint;
48
+ const deleteKey = browser.isDevTools ? web_1.Key.Delete.devtoolsName : web_1.Key.Delete.utf16codePoint;
49
+ await browser.execute(
50
+ /* istanbul ignore next */
51
+ function focusOn(element) {
52
+ element.focus();
53
+ }, element);
54
+ await inputElement.keys([
55
+ homeKey,
56
+ ...times(numberOfCharacters, deleteKey),
57
+ ]);
58
+ }
10
59
  const element = await this.nativeElement();
11
- return element.clearValue();
60
+ const value = await this.value();
61
+ const hasValue = value !== null && value !== undefined && value.length > 0;
62
+ const browser = await this.browserFor(element);
63
+ if (hasValue) {
64
+ return await removeCharactersFrom(browser, element, value.length);
65
+ }
66
+ const contentEditable = await element.getAttribute('contenteditable');
67
+ const hasContentEditable = contentEditable !== null && contentEditable !== undefined && contentEditable !== 'false';
68
+ if (hasContentEditable) {
69
+ const text = await element.getText();
70
+ return await removeCharactersFrom(browser, element, text.length);
71
+ }
12
72
  }
13
73
  async click() {
14
74
  const element = await this.nativeElement();
15
- return element.click();
75
+ await element.click();
16
76
  }
17
77
  async doubleClick() {
18
78
  const element = await this.nativeElement();
19
- return element.doubleClick();
79
+ await element.doubleClick();
20
80
  }
21
81
  async enterValue(value) {
22
82
  const element = await this.nativeElement();
23
- return element.addValue(value);
83
+ await element.addValue(value);
24
84
  }
25
85
  async scrollIntoView() {
26
86
  const element = await this.nativeElement();
27
- return element.scrollIntoView();
87
+ await element.scrollIntoView();
28
88
  }
29
89
  async hoverOver() {
30
90
  const element = await this.nativeElement();
31
- return element.moveTo();
91
+ await element.moveTo();
32
92
  }
33
93
  async rightClick() {
34
94
  const element = await this.nativeElement();
35
- return element.click({ button: 'right' });
95
+ await element.click({ button: 'right' });
96
+ }
97
+ async selectOptions(...options) {
98
+ const element = await this.nativeElement();
99
+ for (const option of options) {
100
+ if (option.value) {
101
+ await element.selectByAttribute('value', option.value);
102
+ }
103
+ else if (option.label) {
104
+ await element.selectByVisibleText(option.label);
105
+ }
106
+ }
107
+ }
108
+ async selectedOptions() {
109
+ const element = await this.nativeElement();
110
+ const browser = await this.browserFor(element);
111
+ const options = await browser.execute(
112
+ /* istanbul ignore next */
113
+ (select) => {
114
+ const options = [];
115
+ select.querySelectorAll('option').forEach((option) => {
116
+ options.push({
117
+ selected: option.selected,
118
+ disabled: option.disabled,
119
+ label: option.label,
120
+ value: option.value,
121
+ });
122
+ });
123
+ return options;
124
+ }, element);
125
+ return options.map(option => new web_1.SelectOption(option.label, option.value, option.selected, option.disabled));
36
126
  }
37
127
  async attribute(name) {
38
128
  const element = await this.nativeElement();
39
- return element.getAttribute(name);
129
+ return await element.getAttribute(name);
40
130
  }
41
131
  async text() {
42
132
  const element = await this.nativeElement();
43
- return element.getText();
133
+ return await element.getText();
44
134
  }
45
135
  async value() {
46
136
  const element = await this.nativeElement();
47
- return element.getValue();
137
+ return await element.getValue();
138
+ }
139
+ async switchTo() {
140
+ try {
141
+ const element = await this.locator.nativeElement();
142
+ if (element.error) {
143
+ throw element.error;
144
+ }
145
+ const tagName = await element.getTagName();
146
+ const browser = await this.browserFor(element);
147
+ if (['iframe', 'frame'].includes(tagName)) {
148
+ const locator = this.locator;
149
+ await locator.switchToFrame(element);
150
+ return {
151
+ switchBack: async () => {
152
+ await locator.switchToParentFrame();
153
+ }
154
+ };
155
+ }
156
+ else {
157
+ // focus on element
158
+ const previouslyFocusedElement = await browser.execute(
159
+ /* istanbul ignore next */
160
+ function focusOn(element) {
161
+ const currentlyFocusedElement = document.activeElement;
162
+ element.focus();
163
+ return currentlyFocusedElement;
164
+ }, element);
165
+ return {
166
+ switchBack: async () => {
167
+ await browser.execute(
168
+ /* istanbul ignore next */
169
+ function focusOn(element) {
170
+ element.focus();
171
+ }, previouslyFocusedElement);
172
+ }
173
+ };
174
+ }
175
+ }
176
+ catch (error) {
177
+ throw new core_1.LogicError(`Couldn't switch to page element located ${this.locator}`, error);
178
+ }
48
179
  }
49
180
  async isActive() {
50
181
  const element = await this.nativeElement();
51
- return element.isFocused();
182
+ return await element.isFocused();
52
183
  }
53
184
  async isClickable() {
54
185
  const element = await this.nativeElement();
55
- return element.isClickable();
186
+ return await element.isClickable();
56
187
  }
57
188
  async isEnabled() {
58
189
  const element = await this.nativeElement();
59
- return element.isEnabled();
190
+ return await element.isEnabled();
60
191
  }
61
192
  async isPresent() {
62
193
  const element = await this.nativeElement();
63
- return element.isExisting();
194
+ return await element.isExisting();
64
195
  }
65
196
  async isSelected() {
66
197
  const element = await this.nativeElement();
67
- return element.isSelected();
68
- }
69
- /**
70
- * @desc
71
- * Checks if the PageElement:
72
- * - is displayed,
73
- * - is visible within the browser viewport,
74
- * - has not its center covered by other elements
75
- *
76
- * @see https://webdriver.io/docs/api/element/isDisplayedInViewport/
77
- */
198
+ return await element.isSelected();
199
+ }
78
200
  async isVisible() {
79
- const element = await this.nativeElement();
80
- if (!await element.isDisplayed()) {
81
- return false;
82
- }
83
- if (!await element.isDisplayedInViewport()) {
84
- return false;
85
- }
86
- const browser = await this.browserFor(element);
87
- /* eslint-disable no-var */
88
- // get element at cx/cy and see if the element we found is our element, and therefore it's visible.
89
- return browser.execute(
90
- /* istanbul ignore next */
91
- function isVisible(element) {
92
- if (!element.getBoundingClientRect) {
201
+ try {
202
+ const element = await this.nativeElement();
203
+ if (!await element.isDisplayed()) {
93
204
  return false;
94
205
  }
95
- var box = element.getBoundingClientRect(), cx = box.left + box.width / 2, cy = box.top + box.height / 2, e = document.elementFromPoint(cx, cy);
96
- for (; e; e = e.parentElement) {
97
- if (e === element)
98
- return true;
206
+ if (!await element.isDisplayedInViewport()) {
207
+ return false;
99
208
  }
100
- return false;
101
- }, element);
102
- /* eslint-enable no-var */
209
+ const browser = await this.browserFor(element);
210
+ return await browser.execute(scripts.isVisible, element);
211
+ }
212
+ catch (error) {
213
+ // an element that doesn't exist is treated as not visible
214
+ if (error.name === WebdriverProtocolErrorCode_1.WebdriverProtocolErrorCode.NoSuchElementError ||
215
+ error.error === WebdriverProtocolErrorCode_1.WebdriverProtocolErrorCode.NoSuchElementError ||
216
+ /element.*not found/i.test(error.message)) {
217
+ return false;
218
+ }
219
+ throw error;
220
+ }
103
221
  }
104
222
  // based on https://github.com/webdriverio/webdriverio/blob/dec6da76b0e218af935dbf39735ae3491d5edd8c/packages/webdriverio/src/utils/index.ts#L98
105
223
  async browserFor(nativeElement) {
@@ -1 +1 @@
1
- {"version":3,"file":"WebdriverIOPageElement.js","sourceRoot":"","sources":["../../../src/screenplay/models/WebdriverIOPageElement.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"WebdriverIOPageElement.js","sourceRoot":"","sources":["../../../src/screenplay/models/WebdriverIOPageElement.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ import { ModalDialog, ModalDialogHandler } from '@serenity-js/web';
2
+ import type { Page } from 'puppeteer-core/lib/cjs/puppeteer/api/Page';
3
+ /**
4
+ * WebdriverIO-specific implementation of {@apilink {ModalDialogHandler}, applicable when WebdriverIO
5
+ * uses [Puppeteer](https://developer.chrome.com/docs/puppeteer/).
6
+ *
7
+ * Automatically handles any simple JavaScript modal dialog windows, such as
8
+ * those opened by [`window.alert()`](https://developer.mozilla.org/en-US/docs/Web/API/Window/alert),
9
+ * [`window.confirm()`](https://developer.mozilla.org/en-US/docs/Web/API/Window/confirm),
10
+ * or [`window.prompt()`](https://developer.mozilla.org/en-US/docs/Web/API/Window/prompt).
11
+ *
12
+ * This helps to avoid Puppeteer hanging when there's an interaction pending
13
+ * and a dialog is already open, see https://github.com/puppeteer/puppeteer/issues/2481
14
+ *
15
+ * ## Learn more
16
+ * - {@apilink WebdriverIOModalDialogHandler}
17
+ */
18
+ export declare class WebdriverIOPuppeteerModalDialogHandler extends ModalDialogHandler {
19
+ private readonly page;
20
+ private dialogHandlingInProgress;
21
+ private readonly defaultHandler;
22
+ private currentHandler;
23
+ constructor(page: Page);
24
+ acceptNext(): Promise<void>;
25
+ acceptNextWithValue(text: string | number): Promise<void>;
26
+ dismissNext(): Promise<void>;
27
+ reset(): Promise<void>;
28
+ discard(): Promise<void>;
29
+ last(): Promise<ModalDialog>;
30
+ private handleModalDialog;
31
+ }
32
+ //# sourceMappingURL=WebdriverIOPuppeteerModalDialogHandler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WebdriverIOPuppeteerModalDialogHandler.d.ts","sourceRoot":"","sources":["../../../src/screenplay/models/WebdriverIOPuppeteerModalDialogHandler.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgE,WAAW,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AACjI,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,2CAA2C,CAAC;AAGtE;;;;;;;;;;;;;;GAcG;AACH,qBAAa,sCAAuC,SAAQ,kBAAkB;IAY9D,OAAO,CAAC,QAAQ,CAAC,IAAI;IAVjC,OAAO,CAAC,wBAAwB,CAAS;IAEzC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAI1B;IAEL,OAAO,CAAC,cAAc,CAA2C;gBAEpC,IAAI,EAAE,IAAI;IAiBjC,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAO3B,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAOzD,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC;IAO5B,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAKtB,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAIxB,IAAI,IAAI,OAAO,CAAC,WAAW,CAAC;YAWpB,iBAAiB;CAOlC"}
@@ -0,0 +1,82 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.WebdriverIOPuppeteerModalDialogHandler = void 0;
4
+ const web_1 = require("@serenity-js/web");
5
+ /**
6
+ * WebdriverIO-specific implementation of {@apilink {ModalDialogHandler}, applicable when WebdriverIO
7
+ * uses [Puppeteer](https://developer.chrome.com/docs/puppeteer/).
8
+ *
9
+ * Automatically handles any simple JavaScript modal dialog windows, such as
10
+ * those opened by [`window.alert()`](https://developer.mozilla.org/en-US/docs/Web/API/Window/alert),
11
+ * [`window.confirm()`](https://developer.mozilla.org/en-US/docs/Web/API/Window/confirm),
12
+ * or [`window.prompt()`](https://developer.mozilla.org/en-US/docs/Web/API/Window/prompt).
13
+ *
14
+ * This helps to avoid Puppeteer hanging when there's an interaction pending
15
+ * and a dialog is already open, see https://github.com/puppeteer/puppeteer/issues/2481
16
+ *
17
+ * ## Learn more
18
+ * - {@apilink WebdriverIOModalDialogHandler}
19
+ */
20
+ class WebdriverIOPuppeteerModalDialogHandler extends web_1.ModalDialogHandler {
21
+ constructor(page) {
22
+ super();
23
+ this.page = page;
24
+ this.dialogHandlingInProgress = false;
25
+ this.defaultHandler = async (dialog) => {
26
+ await dialog.dismiss();
27
+ return new web_1.DismissedModalDialog(dialog.message());
28
+ };
29
+ this.currentHandler = this.defaultHandler;
30
+ // remove the default WebdriverIO handler because it makes any other listeners hang
31
+ // https://github.com/webdriverio/webdriverio/blob/518c56a61353b2f65436b83c618117021da7e622/packages/devtools/src/devtoolsdriver.ts#L69
32
+ this.page.removeAllListeners('dialog');
33
+ // register Serenity/JS handler instead
34
+ this.page.on('dialog', async (dialog) => {
35
+ // Puppeteer doesn't seem to synchronise async handlers correctly,
36
+ // hence the handleModalDialog wrapper and the `dialogHandlingInProgress` lock.
37
+ await this.handleModalDialog(() => this.currentHandler(dialog));
38
+ });
39
+ }
40
+ async acceptNext() {
41
+ this.currentHandler = async (dialog) => {
42
+ await dialog.accept(dialog.defaultValue());
43
+ return new web_1.AcceptedModalDialog(dialog.message());
44
+ };
45
+ }
46
+ async acceptNextWithValue(text) {
47
+ this.currentHandler = async (dialog) => {
48
+ await dialog.accept(String(text));
49
+ return new web_1.AcceptedModalDialog(dialog.message());
50
+ };
51
+ }
52
+ async dismissNext() {
53
+ this.currentHandler = async (dialog) => {
54
+ await dialog.dismiss();
55
+ return new web_1.DismissedModalDialog(dialog.message());
56
+ };
57
+ }
58
+ async reset() {
59
+ this.modalDialog = new web_1.AbsentModalDialog();
60
+ this.currentHandler = this.defaultHandler;
61
+ }
62
+ async discard() {
63
+ this.page.off('dialog', this.currentHandler);
64
+ }
65
+ async last() {
66
+ return new Promise((resolve, reject) => {
67
+ const interval = setInterval(() => {
68
+ if (!this.dialogHandlingInProgress) {
69
+ clearInterval(interval);
70
+ resolve(this.modalDialog);
71
+ }
72
+ }, 25);
73
+ });
74
+ }
75
+ async handleModalDialog(handler) {
76
+ this.dialogHandlingInProgress = true;
77
+ this.modalDialog = await handler();
78
+ this.dialogHandlingInProgress = false;
79
+ }
80
+ }
81
+ exports.WebdriverIOPuppeteerModalDialogHandler = WebdriverIOPuppeteerModalDialogHandler;
82
+ //# sourceMappingURL=WebdriverIOPuppeteerModalDialogHandler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WebdriverIOPuppeteerModalDialogHandler.js","sourceRoot":"","sources":["../../../src/screenplay/models/WebdriverIOPuppeteerModalDialogHandler.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,39 @@
1
+ /**
2
+ * https://developer.mozilla.org/en-US/docs/Web/WebDriver/Errors#table_of_errors
3
+ * https://github.com/SeleniumHQ/selenium/blob/e70e22390000a65a6b706fbb33bbff8913555670/javascript/node/selenium-webdriver/lib/error.js#L441
4
+ *
5
+ * @package
6
+ */
7
+ export declare enum WebdriverProtocolErrorCode {
8
+ WebDriverError = "unknown error",
9
+ DetachedShadowRootError = "detached shadow root",
10
+ ElementClickInterceptedError = "element click intercepted",
11
+ ElementNotInteractableError = "element not interactable",
12
+ ElementNotSelectableError = "element not selectable",
13
+ InsecureCertificateError = "insecure certificate",
14
+ InvalidArgumentError = "invalid argument",
15
+ InvalidCookieDomainError = "invalid cookie domain",
16
+ InvalidCoordinatesError = "invalid coordinates",
17
+ InvalidElementStateError = "invalid element state",
18
+ InvalidSelectorError = "invalid selector",
19
+ NoSuchSessionError = "invalid session id",
20
+ JavascriptError = "javascript error",
21
+ MoveTargetOutOfBoundsError = "move target out of bounds",
22
+ NoSuchAlertError = "no such alert",
23
+ NoSuchCookieError = "no such cookie",
24
+ NoSuchElementError = "no such element",
25
+ NoSuchFrameError = "no such frame",
26
+ NoSuchShadowRootError = "no such shadow root",
27
+ NoSuchWindowError = "no such window",
28
+ ScriptTimeoutError = "script timeout",
29
+ SessionNotCreatedError = "session not created",
30
+ StaleElementReferenceError = "stale element reference",
31
+ TimeoutError = "timeout",
32
+ UnableToSetCookieError = "unable to set cookie",
33
+ UnableToCaptureScreenError = "unable to capture screen",
34
+ UnexpectedAlertOpenError = "unexpected alert open",
35
+ UnknownCommandError = "unknown command",
36
+ UnknownMethodError = "unknown method",
37
+ UnsupportedOperationError = "unsupported operation"
38
+ }
39
+ //# sourceMappingURL=WebdriverProtocolErrorCode.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WebdriverProtocolErrorCode.d.ts","sourceRoot":"","sources":["../../../src/screenplay/models/WebdriverProtocolErrorCode.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,oBAAY,0BAA0B;IAClC,cAAc,kBAAkB;IAChC,uBAAuB,yBAAyB;IAChD,4BAA4B,8BAA8B;IAC1D,2BAA2B,6BAA6B;IACxD,yBAAyB,2BAA2B;IACpD,wBAAwB,yBAAyB;IACjD,oBAAoB,qBAAqB;IACzC,wBAAwB,0BAA0B;IAClD,uBAAuB,wBAAwB;IAC/C,wBAAwB,0BAA0B;IAClD,oBAAoB,qBAAqB;IACzC,kBAAkB,uBAAuB;IACzC,eAAe,qBAAqB;IACpC,0BAA0B,8BAA8B;IACxD,gBAAgB,kBAAkB;IAClC,iBAAiB,mBAAmB;IACpC,kBAAkB,oBAAoB;IACtC,gBAAgB,kBAAkB;IAClC,qBAAqB,wBAAwB;IAC7C,iBAAiB,mBAAmB;IACpC,kBAAkB,mBAAmB;IACrC,sBAAsB,wBAAwB;IAC9C,0BAA0B,4BAA4B;IACtD,YAAY,YAAY;IACxB,sBAAsB,yBAAyB;IAC/C,0BAA0B,6BAA6B;IACvD,wBAAwB,0BAA0B;IAClD,mBAAmB,oBAAoB;IACvC,kBAAkB,mBAAmB;IACrC,yBAAyB,0BAA0B;CACtD"}
@@ -0,0 +1,43 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.WebdriverProtocolErrorCode = void 0;
4
+ /**
5
+ * https://developer.mozilla.org/en-US/docs/Web/WebDriver/Errors#table_of_errors
6
+ * https://github.com/SeleniumHQ/selenium/blob/e70e22390000a65a6b706fbb33bbff8913555670/javascript/node/selenium-webdriver/lib/error.js#L441
7
+ *
8
+ * @package
9
+ */
10
+ var WebdriverProtocolErrorCode;
11
+ (function (WebdriverProtocolErrorCode) {
12
+ WebdriverProtocolErrorCode["WebDriverError"] = "unknown error";
13
+ WebdriverProtocolErrorCode["DetachedShadowRootError"] = "detached shadow root";
14
+ WebdriverProtocolErrorCode["ElementClickInterceptedError"] = "element click intercepted";
15
+ WebdriverProtocolErrorCode["ElementNotInteractableError"] = "element not interactable";
16
+ WebdriverProtocolErrorCode["ElementNotSelectableError"] = "element not selectable";
17
+ WebdriverProtocolErrorCode["InsecureCertificateError"] = "insecure certificate";
18
+ WebdriverProtocolErrorCode["InvalidArgumentError"] = "invalid argument";
19
+ WebdriverProtocolErrorCode["InvalidCookieDomainError"] = "invalid cookie domain";
20
+ WebdriverProtocolErrorCode["InvalidCoordinatesError"] = "invalid coordinates";
21
+ WebdriverProtocolErrorCode["InvalidElementStateError"] = "invalid element state";
22
+ WebdriverProtocolErrorCode["InvalidSelectorError"] = "invalid selector";
23
+ WebdriverProtocolErrorCode["NoSuchSessionError"] = "invalid session id";
24
+ WebdriverProtocolErrorCode["JavascriptError"] = "javascript error";
25
+ WebdriverProtocolErrorCode["MoveTargetOutOfBoundsError"] = "move target out of bounds";
26
+ WebdriverProtocolErrorCode["NoSuchAlertError"] = "no such alert";
27
+ WebdriverProtocolErrorCode["NoSuchCookieError"] = "no such cookie";
28
+ WebdriverProtocolErrorCode["NoSuchElementError"] = "no such element";
29
+ WebdriverProtocolErrorCode["NoSuchFrameError"] = "no such frame";
30
+ WebdriverProtocolErrorCode["NoSuchShadowRootError"] = "no such shadow root";
31
+ WebdriverProtocolErrorCode["NoSuchWindowError"] = "no such window";
32
+ WebdriverProtocolErrorCode["ScriptTimeoutError"] = "script timeout";
33
+ WebdriverProtocolErrorCode["SessionNotCreatedError"] = "session not created";
34
+ WebdriverProtocolErrorCode["StaleElementReferenceError"] = "stale element reference";
35
+ WebdriverProtocolErrorCode["TimeoutError"] = "timeout";
36
+ WebdriverProtocolErrorCode["UnableToSetCookieError"] = "unable to set cookie";
37
+ WebdriverProtocolErrorCode["UnableToCaptureScreenError"] = "unable to capture screen";
38
+ WebdriverProtocolErrorCode["UnexpectedAlertOpenError"] = "unexpected alert open";
39
+ WebdriverProtocolErrorCode["UnknownCommandError"] = "unknown command";
40
+ WebdriverProtocolErrorCode["UnknownMethodError"] = "unknown method";
41
+ WebdriverProtocolErrorCode["UnsupportedOperationError"] = "unsupported operation";
42
+ })(WebdriverProtocolErrorCode = exports.WebdriverProtocolErrorCode || (exports.WebdriverProtocolErrorCode = {}));
43
+ //# sourceMappingURL=WebdriverProtocolErrorCode.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WebdriverProtocolErrorCode.js","sourceRoot":"","sources":["../../../src/screenplay/models/WebdriverProtocolErrorCode.ts"],"names":[],"mappings":";;;AAAA;;;;;GAKG;AACH,IAAY,0BA+BX;AA/BD,WAAY,0BAA0B;IAClC,8DAAgC,CAAA;IAChC,8EAAgD,CAAA;IAChD,wFAA0D,CAAA;IAC1D,sFAAwD,CAAA;IACxD,kFAAoD,CAAA;IACpD,+EAAiD,CAAA;IACjD,uEAAyC,CAAA;IACzC,gFAAkD,CAAA;IAClD,6EAA+C,CAAA;IAC/C,gFAAkD,CAAA;IAClD,uEAAyC,CAAA;IACzC,uEAAyC,CAAA;IACzC,kEAAoC,CAAA;IACpC,sFAAwD,CAAA;IACxD,gEAAkC,CAAA;IAClC,kEAAoC,CAAA;IACpC,oEAAsC,CAAA;IACtC,gEAAkC,CAAA;IAClC,2EAA6C,CAAA;IAC7C,kEAAoC,CAAA;IACpC,mEAAqC,CAAA;IACrC,4EAA8C,CAAA;IAC9C,oFAAsD,CAAA;IACtD,sDAAwB,CAAA;IACxB,6EAA+C,CAAA;IAC/C,qFAAuD,CAAA;IACvD,gFAAkD,CAAA;IAClD,qEAAuC,CAAA;IACvC,mEAAqC,CAAA;IACrC,iFAAmD,CAAA;AACvD,CAAC,EA/BW,0BAA0B,GAA1B,kCAA0B,KAA1B,kCAA0B,QA+BrC"}
@@ -1,4 +1,5 @@
1
+ export * from './WebdriverIOBrowsingSession';
1
2
  export * from './WebdriverIOCookie';
2
- export * from './WebdriverIOModalDialog';
3
3
  export * from './WebdriverIOPage';
4
4
  export * from './WebdriverIOPageElement';
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,8BAA8B,CAAC;AAC7C,cAAc,qBAAqB,CAAC;AACpC,cAAc,mBAAmB,CAAC;AAClC,cAAc,0BAA0B,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("./WebdriverIOBrowsingSession"), exports);
13
18
  __exportStar(require("./WebdriverIOCookie"), exports);
14
- __exportStar(require("./WebdriverIOModalDialog"), exports);
15
19
  __exportStar(require("./WebdriverIOPage"), exports);
16
20
  __exportStar(require("./WebdriverIOPageElement"), 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,sDAAoC;AACpC,2DAAyC;AACzC,oDAAkC;AAClC,2DAAyC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/screenplay/models/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,+DAA6C;AAC7C,sDAAoC;AACpC,oDAAkC;AAClC,2DAAyC"}
@@ -1,9 +1,22 @@
1
- import { Locator, PageElement, Selector } from '@serenity-js/web';
1
+ import { Locator, PageElement, RootLocator, Selector } from '@serenity-js/web';
2
2
  import * as wdio from 'webdriverio';
3
- import { WebdriverIONativeElementRoot } from './WebdriverIONativeElementRoot';
4
- export declare class WebdriverIOLocator<Selector_Type extends Selector> extends Locator<wdio.Element<'async'>, WebdriverIONativeElementRoot, Selector_Type> {
5
- static createRootLocator<ST extends Selector>(browser: WebdriverIONativeElementRoot, selector: ST, webdriverioSelector: string): WebdriverIOLocator<ST>;
6
- of(parent: WebdriverIOLocator<unknown>): Locator<wdio.Element<'async'>, WebdriverIONativeElementRoot, Selector_Type>;
3
+ import { WebdriverIOErrorHandler } from '../WebdriverIOErrorHandler';
4
+ /**
5
+ * WebdriverIO-specific implementation of {@apilink Locator}.
6
+ *
7
+ * @group Models
8
+ */
9
+ export declare class WebdriverIOLocator extends Locator<wdio.Element<'async'>, string> {
10
+ private readonly errorHandler;
11
+ constructor(parent: RootLocator<wdio.Element<'async'>>, selector: Selector, errorHandler: WebdriverIOErrorHandler);
12
+ protected nativeSelector(): string;
13
+ isPresent(): Promise<boolean>;
14
+ nativeElement(): Promise<wdio.Element<'async'>>;
15
+ private resolveNativeElement;
16
+ allNativeElements(): Promise<Array<wdio.Element<'async'>>>;
17
+ of(parent: WebdriverIOLocator): Locator<wdio.Element<'async'>, string>;
18
+ locate(child: WebdriverIOLocator): Locator<wdio.Element<'async'>, string>;
7
19
  element(): PageElement<wdio.Element<'async'>>;
8
20
  allElements(): Promise<Array<PageElement<wdio.Element<'async'>>>>;
9
21
  }
22
+ //# sourceMappingURL=WebdriverIOLocator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WebdriverIOLocator.d.ts","sourceRoot":"","sources":["../../../../src/screenplay/models/locators/WebdriverIOLocator.ts"],"names":[],"mappings":"AACA,OAAO,EAAmE,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAChJ,OAAO,KAAK,IAAI,MAAM,aAAa,CAAC;AAEpC,OAAO,EAAE,uBAAuB,EAAE,MAAM,4BAA4B,CAAC;AAIrE;;;;GAIG;AACH,qBAAa,kBAAmB,SAAQ,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAKtE,OAAO,CAAC,QAAQ,CAAC,YAAY;gBAF7B,MAAM,EAAE,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,EAC1C,QAAQ,EAAE,QAAQ,EACD,YAAY,EAAE,uBAAuB;IAM1D,SAAS,CAAC,cAAc,IAAI,MAAM;IA4B5B,SAAS,IAAI,OAAO,CAAC,OAAO,CAAC;IAU7B,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;YASvC,oBAAoB;IAgB5B,iBAAiB,IAAI,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC;IAKhE,EAAE,CAAC,MAAM,EAAE,kBAAkB,GAAG,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAItE,MAAM,CAAC,KAAK,EAAE,kBAAkB,GAAG,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAIzE,OAAO,IAAI,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IAIvC,WAAW,IAAI,OAAO,CAAC,KAAK,CAAC,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;CAc1E"}