@serenity-js/webdriverio 2.33.1 → 3.0.0-rc.11

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 (247) hide show
  1. package/CHANGELOG.md +455 -0
  2. package/lib/adapter/WebdriverIOFrameworkAdapter.js +1 -1
  3. package/lib/adapter/WebdriverIOFrameworkAdapter.js.map +1 -1
  4. package/lib/adapter/WebdriverIONotifier.d.ts +35 -1
  5. package/lib/adapter/WebdriverIONotifier.js +174 -13
  6. package/lib/adapter/WebdriverIONotifier.js.map +1 -1
  7. package/lib/index.d.ts +0 -3
  8. package/lib/index.js +0 -3
  9. package/lib/index.js.map +1 -1
  10. package/lib/screenplay/abilities/{BrowseTheWeb.d.ts → BrowseTheWebWithWebdriverIO.d.ts} +42 -27
  11. package/lib/screenplay/abilities/{BrowseTheWeb.js → BrowseTheWebWithWebdriverIO.js} +104 -32
  12. package/lib/screenplay/abilities/BrowseTheWebWithWebdriverIO.js.map +1 -0
  13. package/lib/screenplay/abilities/index.d.ts +1 -1
  14. package/lib/screenplay/abilities/index.js +1 -1
  15. package/lib/screenplay/abilities/index.js.map +1 -1
  16. package/lib/screenplay/index.d.ts +1 -2
  17. package/lib/screenplay/index.js +1 -2
  18. package/lib/screenplay/index.js.map +1 -1
  19. package/lib/screenplay/models/WebdriverIOCookie.d.ts +8 -0
  20. package/lib/screenplay/models/WebdriverIOCookie.js +39 -0
  21. package/lib/screenplay/models/WebdriverIOCookie.js.map +1 -0
  22. package/lib/screenplay/models/WebdriverIOFrame.d.ts +10 -0
  23. package/lib/screenplay/models/WebdriverIOFrame.js +34 -0
  24. package/lib/screenplay/models/WebdriverIOFrame.js.map +1 -0
  25. package/lib/screenplay/models/WebdriverIOModalDialog.d.ts +11 -0
  26. package/lib/screenplay/models/WebdriverIOModalDialog.js +40 -0
  27. package/lib/screenplay/models/WebdriverIOModalDialog.js.map +1 -0
  28. package/lib/screenplay/models/WebdriverIOPage.d.ts +26 -0
  29. package/lib/screenplay/models/WebdriverIOPage.js +104 -0
  30. package/lib/screenplay/models/WebdriverIOPage.js.map +1 -0
  31. package/lib/screenplay/models/WebdriverIOPageElement.d.ts +31 -0
  32. package/lib/screenplay/models/WebdriverIOPageElement.js +185 -0
  33. package/lib/screenplay/models/WebdriverIOPageElement.js.map +1 -0
  34. package/lib/screenplay/models/index.d.ts +5 -0
  35. package/lib/{stage/crew/photographer/strategies → screenplay/models}/index.js +5 -4
  36. package/lib/screenplay/models/index.js.map +1 -0
  37. package/lib/screenplay/models/locators/WebdriverIOLocator.d.ts +9 -0
  38. package/lib/screenplay/models/locators/WebdriverIOLocator.js +22 -0
  39. package/lib/screenplay/models/locators/WebdriverIOLocator.js.map +1 -0
  40. package/lib/screenplay/models/locators/WebdriverIONativeElementRoot.d.ts +2 -0
  41. package/lib/screenplay/{interactions/EnterBuilder.js → models/locators/WebdriverIONativeElementRoot.js} +1 -1
  42. package/lib/screenplay/models/locators/WebdriverIONativeElementRoot.js.map +1 -0
  43. package/lib/screenplay/models/locators/index.d.ts +2 -0
  44. package/lib/{stage/crew/photographer → screenplay/models/locators}/index.js +2 -2
  45. package/lib/screenplay/models/locators/index.js.map +1 -0
  46. package/package.json +14 -24
  47. package/src/adapter/WebdriverIOFrameworkAdapter.ts +2 -0
  48. package/src/adapter/WebdriverIONotifier.ts +225 -23
  49. package/src/index.ts +0 -3
  50. package/src/screenplay/abilities/{BrowseTheWeb.ts → BrowseTheWebWithWebdriverIO.ts} +125 -35
  51. package/src/screenplay/abilities/index.ts +1 -1
  52. package/src/screenplay/index.ts +1 -2
  53. package/src/screenplay/models/WebdriverIOCookie.ts +44 -0
  54. package/src/screenplay/models/WebdriverIOFrame.ts +38 -0
  55. package/src/screenplay/models/WebdriverIOModalDialog.ts +45 -0
  56. package/src/screenplay/models/WebdriverIOPage.ts +128 -0
  57. package/src/screenplay/models/WebdriverIOPageElement.ts +227 -0
  58. package/src/screenplay/models/index.ts +5 -0
  59. package/src/screenplay/models/locators/WebdriverIOLocator.ts +43 -0
  60. package/src/screenplay/models/locators/WebdriverIONativeElementRoot.ts +3 -0
  61. package/src/screenplay/models/locators/index.ts +2 -0
  62. package/lib/expectations/ElementExpectation.d.ts +0 -11
  63. package/lib/expectations/ElementExpectation.js +0 -27
  64. package/lib/expectations/ElementExpectation.js.map +0 -1
  65. package/lib/expectations/index.d.ts +0 -6
  66. package/lib/expectations/index.js +0 -19
  67. package/lib/expectations/index.js.map +0 -1
  68. package/lib/expectations/isActive.d.ts +0 -15
  69. package/lib/expectations/isActive.js +0 -21
  70. package/lib/expectations/isActive.js.map +0 -1
  71. package/lib/expectations/isClickable.d.ts +0 -20
  72. package/lib/expectations/isClickable.js +0 -26
  73. package/lib/expectations/isClickable.js.map +0 -1
  74. package/lib/expectations/isEnabled.d.ts +0 -14
  75. package/lib/expectations/isEnabled.js +0 -20
  76. package/lib/expectations/isEnabled.js.map +0 -1
  77. package/lib/expectations/isPresent.d.ts +0 -15
  78. package/lib/expectations/isPresent.js +0 -21
  79. package/lib/expectations/isPresent.js.map +0 -1
  80. package/lib/expectations/isSelected.d.ts +0 -14
  81. package/lib/expectations/isSelected.js +0 -20
  82. package/lib/expectations/isSelected.js.map +0 -1
  83. package/lib/expectations/isVisible.d.ts +0 -14
  84. package/lib/expectations/isVisible.js +0 -20
  85. package/lib/expectations/isVisible.js.map +0 -1
  86. package/lib/input/Key.d.ts +0 -73
  87. package/lib/input/Key.js +0 -84
  88. package/lib/input/Key.js.map +0 -1
  89. package/lib/input/index.d.ts +0 -1
  90. package/lib/input/index.js +0 -14
  91. package/lib/input/index.js.map +0 -1
  92. package/lib/screenplay/abilities/BrowseTheWeb.js.map +0 -1
  93. package/lib/screenplay/interactions/Clear.d.ts +0 -79
  94. package/lib/screenplay/interactions/Clear.js +0 -97
  95. package/lib/screenplay/interactions/Clear.js.map +0 -1
  96. package/lib/screenplay/interactions/Click.d.ts +0 -73
  97. package/lib/screenplay/interactions/Click.js +0 -84
  98. package/lib/screenplay/interactions/Click.js.map +0 -1
  99. package/lib/screenplay/interactions/DoubleClick.d.ts +0 -90
  100. package/lib/screenplay/interactions/DoubleClick.js +0 -101
  101. package/lib/screenplay/interactions/DoubleClick.js.map +0 -1
  102. package/lib/screenplay/interactions/Enter.d.ts +0 -73
  103. package/lib/screenplay/interactions/Enter.js +0 -87
  104. package/lib/screenplay/interactions/Enter.js.map +0 -1
  105. package/lib/screenplay/interactions/EnterBuilder.d.ts +0 -25
  106. package/lib/screenplay/interactions/EnterBuilder.js.map +0 -1
  107. package/lib/screenplay/interactions/ExecuteScript.d.ts +0 -206
  108. package/lib/screenplay/interactions/ExecuteScript.js +0 -311
  109. package/lib/screenplay/interactions/ExecuteScript.js.map +0 -1
  110. package/lib/screenplay/interactions/Hover.d.ts +0 -78
  111. package/lib/screenplay/interactions/Hover.js +0 -89
  112. package/lib/screenplay/interactions/Hover.js.map +0 -1
  113. package/lib/screenplay/interactions/Navigate.d.ts +0 -141
  114. package/lib/screenplay/interactions/Navigate.js +0 -197
  115. package/lib/screenplay/interactions/Navigate.js.map +0 -1
  116. package/lib/screenplay/interactions/Press.d.ts +0 -84
  117. package/lib/screenplay/interactions/Press.js +0 -152
  118. package/lib/screenplay/interactions/Press.js.map +0 -1
  119. package/lib/screenplay/interactions/PressBuilder.d.ts +0 -26
  120. package/lib/screenplay/interactions/PressBuilder.js +0 -3
  121. package/lib/screenplay/interactions/PressBuilder.js.map +0 -1
  122. package/lib/screenplay/interactions/RightClick.d.ts +0 -89
  123. package/lib/screenplay/interactions/RightClick.js +0 -100
  124. package/lib/screenplay/interactions/RightClick.js.map +0 -1
  125. package/lib/screenplay/interactions/Scroll.d.ts +0 -75
  126. package/lib/screenplay/interactions/Scroll.js +0 -86
  127. package/lib/screenplay/interactions/Scroll.js.map +0 -1
  128. package/lib/screenplay/interactions/Wait.d.ts +0 -143
  129. package/lib/screenplay/interactions/Wait.js +0 -247
  130. package/lib/screenplay/interactions/Wait.js.map +0 -1
  131. package/lib/screenplay/interactions/WaitBuilder.d.ts +0 -32
  132. package/lib/screenplay/interactions/WaitBuilder.js +0 -3
  133. package/lib/screenplay/interactions/WaitBuilder.js.map +0 -1
  134. package/lib/screenplay/interactions/WebElementInteraction.d.ts +0 -37
  135. package/lib/screenplay/interactions/WebElementInteraction.js +0 -52
  136. package/lib/screenplay/interactions/WebElementInteraction.js.map +0 -1
  137. package/lib/screenplay/interactions/index.d.ts +0 -13
  138. package/lib/screenplay/interactions/index.js +0 -26
  139. package/lib/screenplay/interactions/index.js.map +0 -1
  140. package/lib/screenplay/questions/Attribute.d.ts +0 -82
  141. package/lib/screenplay/questions/Attribute.js +0 -102
  142. package/lib/screenplay/questions/Attribute.js.map +0 -1
  143. package/lib/screenplay/questions/CSSClasses.d.ts +0 -92
  144. package/lib/screenplay/questions/CSSClasses.js +0 -112
  145. package/lib/screenplay/questions/CSSClasses.js.map +0 -1
  146. package/lib/screenplay/questions/LastScriptExecution.d.ts +0 -14
  147. package/lib/screenplay/questions/LastScriptExecution.js +0 -22
  148. package/lib/screenplay/questions/LastScriptExecution.js.map +0 -1
  149. package/lib/screenplay/questions/NestedTargetBuilder.d.ts +0 -27
  150. package/lib/screenplay/questions/NestedTargetBuilder.js +0 -3
  151. package/lib/screenplay/questions/NestedTargetBuilder.js.map +0 -1
  152. package/lib/screenplay/questions/TargetBuilder.d.ts +0 -25
  153. package/lib/screenplay/questions/TargetBuilder.js +0 -3
  154. package/lib/screenplay/questions/TargetBuilder.js.map +0 -1
  155. package/lib/screenplay/questions/Text.d.ts +0 -95
  156. package/lib/screenplay/questions/Text.js +0 -130
  157. package/lib/screenplay/questions/Text.js.map +0 -1
  158. package/lib/screenplay/questions/Value.d.ts +0 -63
  159. package/lib/screenplay/questions/Value.js +0 -78
  160. package/lib/screenplay/questions/Value.js.map +0 -1
  161. package/lib/screenplay/questions/Website.d.ts +0 -21
  162. package/lib/screenplay/questions/Website.js +0 -31
  163. package/lib/screenplay/questions/Website.js.map +0 -1
  164. package/lib/screenplay/questions/index.d.ts +0 -10
  165. package/lib/screenplay/questions/index.js +0 -23
  166. package/lib/screenplay/questions/index.js.map +0 -1
  167. package/lib/screenplay/questions/lists.d.ts +0 -86
  168. package/lib/screenplay/questions/lists.js +0 -137
  169. package/lib/screenplay/questions/lists.js.map +0 -1
  170. package/lib/screenplay/questions/locators.d.ts +0 -196
  171. package/lib/screenplay/questions/locators.js +0 -219
  172. package/lib/screenplay/questions/locators.js.map +0 -1
  173. package/lib/screenplay/questions/targets.d.ts +0 -254
  174. package/lib/screenplay/questions/targets.js +0 -334
  175. package/lib/screenplay/questions/targets.js.map +0 -1
  176. package/lib/stage/crew/index.d.ts +0 -1
  177. package/lib/stage/crew/index.js +0 -14
  178. package/lib/stage/crew/index.js.map +0 -1
  179. package/lib/stage/crew/photographer/Photographer.d.ts +0 -83
  180. package/lib/stage/crew/photographer/Photographer.js +0 -102
  181. package/lib/stage/crew/photographer/Photographer.js.map +0 -1
  182. package/lib/stage/crew/photographer/index.d.ts +0 -2
  183. package/lib/stage/crew/photographer/index.js.map +0 -1
  184. package/lib/stage/crew/photographer/strategies/PhotoTakingStrategy.d.ts +0 -28
  185. package/lib/stage/crew/photographer/strategies/PhotoTakingStrategy.js +0 -65
  186. package/lib/stage/crew/photographer/strategies/PhotoTakingStrategy.js.map +0 -1
  187. package/lib/stage/crew/photographer/strategies/TakePhotosBeforeAndAfterInteractions.d.ts +0 -18
  188. package/lib/stage/crew/photographer/strategies/TakePhotosBeforeAndAfterInteractions.js +0 -30
  189. package/lib/stage/crew/photographer/strategies/TakePhotosBeforeAndAfterInteractions.js.map +0 -1
  190. package/lib/stage/crew/photographer/strategies/TakePhotosOfFailures.d.ts +0 -17
  191. package/lib/stage/crew/photographer/strategies/TakePhotosOfFailures.js +0 -28
  192. package/lib/stage/crew/photographer/strategies/TakePhotosOfFailures.js.map +0 -1
  193. package/lib/stage/crew/photographer/strategies/TakePhotosOfInteractions.d.ts +0 -19
  194. package/lib/stage/crew/photographer/strategies/TakePhotosOfInteractions.js +0 -28
  195. package/lib/stage/crew/photographer/strategies/TakePhotosOfInteractions.js.map +0 -1
  196. package/lib/stage/crew/photographer/strategies/index.d.ts +0 -4
  197. package/lib/stage/crew/photographer/strategies/index.js.map +0 -1
  198. package/lib/stage/index.d.ts +0 -1
  199. package/lib/stage/index.js +0 -14
  200. package/lib/stage/index.js.map +0 -1
  201. package/src/expectations/ElementExpectation.ts +0 -31
  202. package/src/expectations/index.ts +0 -6
  203. package/src/expectations/isActive.ts +0 -21
  204. package/src/expectations/isClickable.ts +0 -26
  205. package/src/expectations/isEnabled.ts +0 -19
  206. package/src/expectations/isPresent.ts +0 -20
  207. package/src/expectations/isSelected.ts +0 -19
  208. package/src/expectations/isVisible.ts +0 -19
  209. package/src/input/Key.ts +0 -83
  210. package/src/input/index.ts +0 -1
  211. package/src/screenplay/interactions/Clear.ts +0 -102
  212. package/src/screenplay/interactions/Click.ts +0 -85
  213. package/src/screenplay/interactions/DoubleClick.ts +0 -102
  214. package/src/screenplay/interactions/Enter.ts +0 -93
  215. package/src/screenplay/interactions/EnterBuilder.ts +0 -27
  216. package/src/screenplay/interactions/ExecuteScript.ts +0 -344
  217. package/src/screenplay/interactions/Hover.ts +0 -90
  218. package/src/screenplay/interactions/Navigate.ts +0 -208
  219. package/src/screenplay/interactions/Press.ts +0 -172
  220. package/src/screenplay/interactions/PressBuilder.ts +0 -28
  221. package/src/screenplay/interactions/RightClick.ts +0 -100
  222. package/src/screenplay/interactions/Scroll.ts +0 -87
  223. package/src/screenplay/interactions/Wait.ts +0 -267
  224. package/src/screenplay/interactions/WaitBuilder.ts +0 -34
  225. package/src/screenplay/interactions/WebElementInteraction.ts +0 -56
  226. package/src/screenplay/interactions/index.ts +0 -13
  227. package/src/screenplay/questions/Attribute.ts +0 -112
  228. package/src/screenplay/questions/CSSClasses.ts +0 -116
  229. package/src/screenplay/questions/LastScriptExecution.ts +0 -21
  230. package/src/screenplay/questions/NestedTargetBuilder.ts +0 -30
  231. package/src/screenplay/questions/TargetBuilder.ts +0 -27
  232. package/src/screenplay/questions/Text.ts +0 -140
  233. package/src/screenplay/questions/Value.ts +0 -82
  234. package/src/screenplay/questions/Website.ts +0 -34
  235. package/src/screenplay/questions/index.ts +0 -10
  236. package/src/screenplay/questions/lists.ts +0 -161
  237. package/src/screenplay/questions/locators.ts +0 -254
  238. package/src/screenplay/questions/targets.ts +0 -401
  239. package/src/stage/crew/index.ts +0 -1
  240. package/src/stage/crew/photographer/Photographer.ts +0 -108
  241. package/src/stage/crew/photographer/index.ts +0 -2
  242. package/src/stage/crew/photographer/strategies/PhotoTakingStrategy.ts +0 -103
  243. package/src/stage/crew/photographer/strategies/TakePhotosBeforeAndAfterInteractions.ts +0 -28
  244. package/src/stage/crew/photographer/strategies/TakePhotosOfFailures.ts +0 -26
  245. package/src/stage/crew/photographer/strategies/TakePhotosOfInteractions.ts +0 -26
  246. package/src/stage/crew/photographer/strategies/index.ts +0 -4
  247. package/src/stage/index.ts +0 -1
@@ -1,8 +1,10 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.BrowseTheWeb = void 0;
3
+ exports.BrowseTheWebWithWebdriverIO = void 0;
4
4
  const core_1 = require("@serenity-js/core");
5
- const input_1 = require("../../input");
5
+ const web_1 = require("@serenity-js/web");
6
+ const models_1 = require("../models");
7
+ const locators_1 = require("../models/locators");
6
8
  /**
7
9
  * @desc
8
10
  * An {@link @serenity-js/core/lib/screenplay~Ability} that enables the {@link @serenity-js/core/lib/screenplay/actor~Actor}
@@ -12,8 +14,6 @@ const input_1 = require("../../input");
12
14
  * This means that its interface can change without affecting the major version of Serenity/JS itself.
13
15
  * In particular, please don't rely on the `browser` field to remain `public` in future releases.
14
16
  *
15
- * @experimental
16
- *
17
17
  * @example <caption>Using the WebdriverIO browser</caption>
18
18
  * import { Actor } from '@serenity-js/core';
19
19
  * import { BrowseTheWeb, by, Navigate, Target } from '@serenity-js/webdriverio'
@@ -38,31 +38,51 @@ const input_1 = require("../../input");
38
38
  * @implements {@serenity-js/core/lib/screenplay~Ability}
39
39
  * @see {@link @serenity-js/core/lib/screenplay/actor~Actor}
40
40
  */
41
- class BrowseTheWeb {
41
+ class BrowseTheWebWithWebdriverIO extends web_1.BrowseTheWeb {
42
42
  /**
43
43
  * @param {@wdio/types~Browser} browser
44
44
  */
45
45
  constructor(browser) {
46
+ super(new Map()
47
+ .set(web_1.ByCss, (selector) => locators_1.WebdriverIOLocator.createRootLocator(this.browser, selector, selector.value))
48
+ .set(web_1.ByCssContainingText, (selector) => locators_1.WebdriverIOLocator.createRootLocator(this.browser, selector, `${selector.value}*=${selector.text}`))
49
+ .set(web_1.ById, (selector) => locators_1.WebdriverIOLocator.createRootLocator(this.browser, selector, `#${selector.value}`))
50
+ .set(web_1.ByTagName, (selector) => locators_1.WebdriverIOLocator.createRootLocator(this.browser, selector, `<${selector.value} />`))
51
+ .set(web_1.ByXPath, (selector) => locators_1.WebdriverIOLocator.createRootLocator(this.browser, selector, selector.value)));
46
52
  this.browser = browser;
53
+ if (!this.browser.$ || !this.browser.$$) {
54
+ throw new core_1.LogicError(`WebdriverIO browser object is not initialised yet, so can't be assigned to an actor. Are you trying to instantiate an actor outside of a test or a test hook?`);
55
+ }
47
56
  }
48
57
  /**
49
58
  * @param {@wdio/types~Browser} browserInstance
50
- * @returns {BrowseTheWeb}
59
+ * @returns {BrowseTheWebWithWebdriverIO}
51
60
  */
52
61
  static using(browserInstance) {
53
- return new BrowseTheWeb(browserInstance);
62
+ return new BrowseTheWebWithWebdriverIO(browserInstance);
54
63
  }
55
- /**
56
- * @desc
57
- * Used to access the Actor's ability to {@link BrowseTheWeb}
58
- * from within the {@link @serenity-js/core/lib/screenplay~Interaction} classes,
59
- * such as {@link Navigate}.
60
- *
61
- * @param {@serenity-js/core/lib/screenplay/actor~UsesAbilities} actor
62
- * @return {BrowseTheWeb}
63
- */
64
- static as(actor) {
65
- return actor.abilityTo(BrowseTheWeb);
64
+ browserCapabilities() {
65
+ return Promise.resolve(this.browser.capabilities);
66
+ }
67
+ async cookie(name) {
68
+ return new models_1.WebdriverIOCookie(this.browser, name);
69
+ }
70
+ async setCookie(cookieData) {
71
+ return this.browser.setCookies({
72
+ name: cookieData.name,
73
+ value: cookieData.value,
74
+ path: cookieData.path,
75
+ domain: cookieData.domain,
76
+ secure: cookieData.secure,
77
+ httpOnly: cookieData.httpOnly,
78
+ expiry: cookieData.expiry
79
+ ? cookieData.expiry.toSeconds()
80
+ : undefined,
81
+ sameSite: cookieData.sameSite,
82
+ });
83
+ }
84
+ deleteAllCookies() {
85
+ return this.browser.deleteCookies();
66
86
  }
67
87
  /**
68
88
  * @desc
@@ -72,9 +92,46 @@ class BrowseTheWeb {
72
92
  * @param {string} destination
73
93
  * @returns {Promise<void>}
74
94
  */
75
- get(destination) {
95
+ navigateTo(destination) {
76
96
  return this.browser.url(destination); // todo: check if this returns a string or is mistyped
77
97
  }
98
+ navigateBack() {
99
+ return this.browser.back();
100
+ }
101
+ navigateForward() {
102
+ return this.browser.forward();
103
+ }
104
+ reloadPage() {
105
+ return this.browser.refresh();
106
+ }
107
+ /**
108
+ * @desc
109
+ * Returns a {@link Page} representing the currently active top-level browsing context.
110
+ *
111
+ * @returns {Promise<Page>}
112
+ */
113
+ async currentPage() {
114
+ const windowHandle = await this.browser.getWindowHandle();
115
+ return new models_1.WebdriverIOPage(this.browser, windowHandle);
116
+ }
117
+ /**
118
+ * @desc
119
+ * Returns an array of {@link Page} objects representing all the available
120
+ * top-level browsing context, e.g. all the open browser tabs.
121
+ *
122
+ * @returns {Promise<Array<Page>>}
123
+ */
124
+ async allPages() {
125
+ const windowHandles = await this.browser.getWindowHandles();
126
+ return windowHandles.map(windowHandle => new models_1.WebdriverIOPage(this.browser, windowHandle));
127
+ }
128
+ async frame(bySelector) {
129
+ const locator = this.locate(bySelector);
130
+ return new models_1.WebdriverIOFrame(this.browser, locator);
131
+ }
132
+ async modalDialog() {
133
+ return new models_1.WebdriverIOModalDialog(this.browser);
134
+ }
78
135
  /**
79
136
  * @desc
80
137
  * Send a sequence of {@link Key} strokes to the active element.
@@ -88,10 +145,10 @@ class BrowseTheWeb {
88
145
  */
89
146
  sendKeys(keys) {
90
147
  const keySequence = keys.map(key => {
91
- if (!input_1.Key.isKey(key)) {
148
+ if (!web_1.Key.isKey(key)) {
92
149
  return key;
93
150
  }
94
- if (browser.isDevTools) {
151
+ if (this.browser.isDevTools) {
95
152
  return key.devtoolsName;
96
153
  }
97
154
  return key.utf16codePoint;
@@ -148,8 +205,9 @@ class BrowseTheWeb {
148
205
  *
149
206
  * @see {@link BrowseTheWeb#getLastScriptExecutionResult}
150
207
  */
151
- executeScript(script, ...args) {
152
- return this.browser.execute(script, ...args)
208
+ async executeScript(script, ...args) {
209
+ const nativeArguments = await Promise.all(args.map(arg => arg instanceof models_1.WebdriverIOPageElement ? arg.nativeElement() : arg));
210
+ return this.browser.execute(script, ...nativeArguments)
153
211
  .then(result => {
154
212
  this.lastScriptExecutionSummary = new LastScriptExecutionSummary(result);
155
213
  return result;
@@ -167,7 +225,7 @@ class BrowseTheWeb {
167
225
  * Arrays and objects may also be used as script arguments as long as each item adheres
168
226
  * to the types previously mentioned.
169
227
  *
170
- * Unlike executing synchronous JavaScript with {@link BrowseTheWeb#executeScript},
228
+ * Unlike executing synchronous JavaScript with {@link BrowseTheWebWithWebdriverIO#executeScript},
171
229
  * scripts executed with this function must explicitly signal they are finished by invoking the provided callback.
172
230
  *
173
231
  * This callback will always be injected into the executed function as the last argument,
@@ -206,8 +264,9 @@ class BrowseTheWeb {
206
264
  *
207
265
  * @see {@link BrowseTheWeb#getLastScriptExecutionResult}
208
266
  */
209
- executeAsyncScript(script, ...args) {
210
- return this.browser.executeAsync(script, ...args)
267
+ async executeAsyncScript(script, ...args) {
268
+ const nativeArguments = await Promise.all(args.map(arg => arg instanceof models_1.WebdriverIOPageElement ? arg.nativeElement() : arg));
269
+ return this.browser.executeAsync(script, ...nativeArguments)
211
270
  .then(result => {
212
271
  this.lastScriptExecutionSummary = new LastScriptExecutionSummary(result);
213
272
  return result;
@@ -215,19 +274,32 @@ class BrowseTheWeb {
215
274
  }
216
275
  /**
217
276
  * @desc
218
- * Returns the last result of calling {@link BrowseTheWeb#executeAsyncScript}
219
- * or {@link BrowseTheWeb#executeScript}
277
+ * Returns the last result of calling {@link BrowseTheWebWithWebdriverIO#executeAsyncScript}
278
+ * or {@link BrowseTheWebWithWebdriverIO#executeScript}
220
279
  *
221
280
  * @returns {any}
222
281
  */
223
- getLastScriptExecutionResult() {
282
+ lastScriptExecutionResult() {
224
283
  if (!this.lastScriptExecutionSummary) {
225
284
  throw new core_1.LogicError(`Make sure to execute a script before checking on the result`);
226
285
  }
227
- return this.lastScriptExecutionSummary.result;
286
+ // Selenium returns `null` when the script it executed returns `undefined`
287
+ // so we're mapping the result back.
288
+ return this.lastScriptExecutionSummary.result !== null
289
+ ? this.lastScriptExecutionSummary.result
290
+ : undefined;
291
+ }
292
+ waitFor(duration) {
293
+ return this.browser.pause(duration.inMilliseconds());
294
+ }
295
+ waitUntil(condition, timeout) {
296
+ return this.browser.waitUntil(condition, {
297
+ timeout: timeout.inMilliseconds(),
298
+ timeoutMsg: `Wait timed out after ${timeout}`,
299
+ });
228
300
  }
229
301
  }
230
- exports.BrowseTheWeb = BrowseTheWeb;
302
+ exports.BrowseTheWebWithWebdriverIO = BrowseTheWebWithWebdriverIO;
231
303
  /**
232
304
  * @package
233
305
  */
@@ -236,4 +308,4 @@ class LastScriptExecutionSummary {
236
308
  this.result = result;
237
309
  }
238
310
  }
239
- //# sourceMappingURL=BrowseTheWeb.js.map
311
+ //# sourceMappingURL=BrowseTheWebWithWebdriverIO.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BrowseTheWebWithWebdriverIO.js","sourceRoot":"","sources":["../../../src/screenplay/abilities/BrowseTheWebWithWebdriverIO.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- export * from './BrowseTheWeb';
1
+ export * from './BrowseTheWebWithWebdriverIO';
@@ -10,5 +10,5 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
10
10
  for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
11
11
  };
12
12
  Object.defineProperty(exports, "__esModule", { value: true });
13
- __exportStar(require("./BrowseTheWeb"), exports);
13
+ __exportStar(require("./BrowseTheWebWithWebdriverIO"), exports);
14
14
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/screenplay/abilities/index.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,iDAA+B"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/screenplay/abilities/index.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,gEAA8C"}
@@ -1,3 +1,2 @@
1
1
  export * from './abilities';
2
- export * from './interactions';
3
- export * from './questions';
2
+ export * from './models';
@@ -11,6 +11,5 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
11
11
  };
12
12
  Object.defineProperty(exports, "__esModule", { value: true });
13
13
  __exportStar(require("./abilities"), exports);
14
- __exportStar(require("./interactions"), exports);
15
- __exportStar(require("./questions"), exports);
14
+ __exportStar(require("./models"), exports);
16
15
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/screenplay/index.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,8CAA4B;AAC5B,iDAA+B;AAC/B,8CAA4B"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/screenplay/index.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,8CAA4B;AAC5B,2CAAyB"}
@@ -0,0 +1,8 @@
1
+ import { Cookie, CookieData } from '@serenity-js/web';
2
+ import * as wdio from 'webdriverio';
3
+ export declare class WebdriverIOCookie extends Cookie {
4
+ private readonly browser;
5
+ constructor(browser: wdio.Browser<'async'>, cookieName: string);
6
+ delete(): Promise<void>;
7
+ protected read(): Promise<CookieData>;
8
+ }
@@ -0,0 +1,39 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.WebdriverIOCookie = void 0;
4
+ const core_1 = require("@serenity-js/core");
5
+ const web_1 = require("@serenity-js/web");
6
+ const tiny_types_1 = require("tiny-types");
7
+ class WebdriverIOCookie extends web_1.Cookie {
8
+ constructor(browser, cookieName) {
9
+ super(cookieName);
10
+ this.browser = browser;
11
+ (0, tiny_types_1.ensure)('browser', browser, (0, tiny_types_1.isDefined)());
12
+ }
13
+ async delete() {
14
+ return this.browser.deleteCookies(this.cookieName);
15
+ }
16
+ async read() {
17
+ const [cookie] = await this.browser.getCookies(this.cookieName);
18
+ if (!cookie) {
19
+ throw new web_1.CookieMissingError(`Cookie '${this.cookieName}' not set`);
20
+ }
21
+ // There _might_ be a bug in WDIO where the expiry date is set on "expires" rather than the "expiry" key
22
+ // and possibly another one around deserialising the timestamp, since WDIO seems to add several hundred milliseconds
23
+ // to the original expiry date
24
+ const expiry = cookie.expiry || cookie.expires;
25
+ return {
26
+ name: cookie.name,
27
+ value: cookie.value,
28
+ domain: cookie.domain,
29
+ path: cookie.path,
30
+ expiry: expiry !== undefined
31
+ ? core_1.Timestamp.fromTimestampInSeconds(Math.round(expiry))
32
+ : undefined,
33
+ httpOnly: cookie.httpOnly,
34
+ secure: cookie.secure,
35
+ };
36
+ }
37
+ }
38
+ exports.WebdriverIOCookie = WebdriverIOCookie;
39
+ //# sourceMappingURL=WebdriverIOCookie.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WebdriverIOCookie.js","sourceRoot":"","sources":["../../../src/screenplay/models/WebdriverIOCookie.ts"],"names":[],"mappings":";;;AAAA,4CAA8C;AAC9C,0CAA0E;AAC1E,2CAA+C;AAG/C,MAAa,iBAAkB,SAAQ,YAAM;IAEzC,YACqB,OAA8B,EAC/C,UAAkB;QAElB,KAAK,CAAC,UAAU,CAAC,CAAC;QAHD,YAAO,GAAP,OAAO,CAAuB;QAI/C,IAAA,mBAAM,EAAC,SAAS,EAAE,OAAO,EAAE,IAAA,sBAAS,GAAE,CAAC,CAAC;IAC5C,CAAC;IAED,KAAK,CAAC,MAAM;QACR,OAAO,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,IAAI,CAAC,UAAU,CAAkB,CAAC;IACxE,CAAC;IAES,KAAK,CAAC,IAAI;QAChB,MAAM,CAAE,MAAM,CAAE,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAElE,IAAI,CAAE,MAAM,EAAE;YACV,MAAM,IAAI,wBAAkB,CAAC,WAAY,IAAI,CAAC,UAAW,WAAW,CAAC,CAAC;SACzE;QAED,wGAAwG;QACxG,oHAAoH;QACpH,8BAA8B;QAC9B,MAAM,MAAM,GAAuB,MAAM,CAAC,MAAM,IAAK,MAAc,CAAC,OAAO,CAAC;QAE5E,OAAO;YACH,IAAI,EAAQ,MAAM,CAAC,IAAI;YACvB,KAAK,EAAO,MAAM,CAAC,KAAK;YACxB,MAAM,EAAM,MAAM,CAAC,MAAM;YACzB,IAAI,EAAQ,MAAM,CAAC,IAAI;YACvB,MAAM,EAAM,MAAM,KAAK,SAAS;gBAC5B,CAAC,CAAC,gBAAS,CAAC,sBAAsB,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;gBACtD,CAAC,CAAC,SAAS;YACf,QAAQ,EAAI,MAAM,CAAC,QAAQ;YAC3B,MAAM,EAAM,MAAM,CAAC,MAAM;SAC5B,CAAA;IACL,CAAC;CACJ;AAtCD,8CAsCC"}
@@ -0,0 +1,10 @@
1
+ import { Frame, Locator } from '@serenity-js/web';
2
+ import * as wdio from 'webdriverio';
3
+ export declare class WebdriverIOFrame extends Frame<wdio.Element<'async'>> {
4
+ private readonly browser;
5
+ constructor(browser: wdio.Browser<'async'>, locator: Locator<wdio.Element<'async'>>);
6
+ isPresent(): Promise<boolean>;
7
+ switchTo(): Promise<{
8
+ switchBack(): Promise<void>;
9
+ }>;
10
+ }
@@ -0,0 +1,34 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.WebdriverIOFrame = void 0;
4
+ const core_1 = require("@serenity-js/core");
5
+ const web_1 = require("@serenity-js/web");
6
+ class WebdriverIOFrame extends web_1.Frame {
7
+ constructor(browser, locator) {
8
+ super(locator);
9
+ this.browser = browser;
10
+ }
11
+ async isPresent() {
12
+ const element = await this.locator.nativeElement();
13
+ return element.isExisting();
14
+ }
15
+ async switchTo() {
16
+ const element = await this.locator.nativeElement();
17
+ if (element.error) {
18
+ throw new core_1.LogicError(`Couldn't locate frame ${this.locator}`, element.error);
19
+ }
20
+ try {
21
+ await this.browser.switchToFrame(element);
22
+ return {
23
+ switchBack: async () => {
24
+ await this.browser.switchToParentFrame();
25
+ }
26
+ };
27
+ }
28
+ catch (error) {
29
+ throw new core_1.LogicError(`Couldn't switch to a frame located ${this.locator}`, error);
30
+ }
31
+ }
32
+ }
33
+ exports.WebdriverIOFrame = WebdriverIOFrame;
34
+ //# sourceMappingURL=WebdriverIOFrame.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WebdriverIOFrame.js","sourceRoot":"","sources":["../../../src/screenplay/models/WebdriverIOFrame.ts"],"names":[],"mappings":";;;AAAA,4CAA+C;AAC/C,0CAAkD;AAGlD,MAAa,gBAAiB,SAAQ,WAA4B;IAC9D,YACqB,OAA8B,EAC/C,OAAuC;QAEvC,KAAK,CAAC,OAAO,CAAC,CAAC;QAHE,YAAO,GAAP,OAAO,CAAuB;IAInD,CAAC;IAED,KAAK,CAAC,SAAS;QACX,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,aAAa,EAAE,CAAC;QACnD,OAAO,OAAO,CAAC,UAAU,EAAE,CAAC;IAChC,CAAC;IAED,KAAK,CAAC,QAAQ;QACV,MAAM,OAAO,GAA0B,MAAM,IAAI,CAAC,OAAO,CAAC,aAAa,EAAE,CAAA;QAEzE,IAAI,OAAO,CAAC,KAAK,EAAE;YACf,MAAM,IAAI,iBAAU,CAAC,yBAA0B,IAAI,CAAC,OAAQ,EAAE,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC;SAClF;QAED,IAAI;YACA,MAAM,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;YAE1C,OAAO;gBACH,UAAU,EAAE,KAAK,IAAmB,EAAE;oBAClC,MAAM,IAAI,CAAC,OAAO,CAAC,mBAAmB,EAAE,CAAC;gBAC7C,CAAC;aACJ,CAAA;SACJ;QACD,OAAO,KAAK,EAAE;YACV,MAAM,IAAI,iBAAU,CAAC,sCAAuC,IAAI,CAAC,OAAQ,EAAE,EAAE,KAAK,CAAC,CAAC;SACvF;IACL,CAAC;CACJ;AAjCD,4CAiCC"}
@@ -0,0 +1,11 @@
1
+ import { ModalDialog } from '@serenity-js/web';
2
+ import { Browser } from 'webdriverio';
3
+ export declare class WebdriverIOModalDialog extends ModalDialog {
4
+ private readonly browser;
5
+ constructor(browser: Browser<'async'>);
6
+ accept(): Promise<void>;
7
+ dismiss(): Promise<void>;
8
+ text(): Promise<string>;
9
+ enterValue(value: string | number | (string | number)[]): Promise<void>;
10
+ isPresent(): Promise<boolean>;
11
+ }
@@ -0,0 +1,40 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.WebdriverIOModalDialog = void 0;
4
+ const web_1 = require("@serenity-js/web");
5
+ class WebdriverIOModalDialog extends web_1.ModalDialog {
6
+ constructor(browser) {
7
+ super();
8
+ this.browser = browser;
9
+ }
10
+ accept() {
11
+ return this.browser.acceptAlert();
12
+ }
13
+ dismiss() {
14
+ return this.browser.dismissAlert();
15
+ }
16
+ text() {
17
+ return this.browser.getAlertText();
18
+ }
19
+ async enterValue(value) {
20
+ const text = [].concat(value).join('');
21
+ await this.browser.sendAlertText(text);
22
+ // Puppeteer auto-accepts the dialog upon sendAlertText
23
+ // other implementations require the dialog to be closed
24
+ if (!this.browser.isDevTools) {
25
+ await this.browser.acceptAlert();
26
+ }
27
+ }
28
+ isPresent() {
29
+ return this.browser.getAlertText()
30
+ .then(() => true, error => {
31
+ if (error && (error.name === 'no such alert'
32
+ || error.message.startsWith('no such alert'))) {
33
+ return false;
34
+ }
35
+ throw error;
36
+ });
37
+ }
38
+ }
39
+ exports.WebdriverIOModalDialog = WebdriverIOModalDialog;
40
+ //# sourceMappingURL=WebdriverIOModalDialog.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WebdriverIOModalDialog.js","sourceRoot":"","sources":["../../../src/screenplay/models/WebdriverIOModalDialog.ts"],"names":[],"mappings":";;;AAAA,0CAA+C;AAG/C,MAAa,sBAAuB,SAAQ,iBAAW;IACnD,YAA6B,OAAyB;QAClD,KAAK,EAAE,CAAC;QADiB,YAAO,GAAP,OAAO,CAAkB;IAEtD,CAAC;IAED,MAAM;QACF,OAAO,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC;IACtC,CAAC;IAED,OAAO;QACH,OAAO,IAAI,CAAC,OAAO,CAAC,YAAY,EAAE,CAAC;IACvC,CAAC;IACD,IAAI;QACA,OAAO,IAAI,CAAC,OAAO,CAAC,YAAY,EAAE,CAAC;IACvC,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,KAA4C;QACzD,MAAM,IAAI,GAAG,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAEvC,MAAM,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;QAEvC,uDAAuD;QACvD,wDAAwD;QACxD,IAAI,CAAE,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE;YAC3B,MAAM,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC;SACpC;IACL,CAAC;IAED,SAAS;QACL,OAAO,IAAI,CAAC,OAAO,CAAC,YAAY,EAAE;aAC7B,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE;YACtB,IAAI,KAAK,IAAI,CACT,KAAK,CAAC,IAAI,KAAK,eAAe;mBAC3B,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,eAAe,CAAC,CAC/C,EAAE;gBACC,OAAO,KAAK,CAAC;aAChB;YAED,MAAM,KAAK,CAAC;QAChB,CAAC,CAAC,CAAC;IACX,CAAC;CACJ;AAzCD,wDAyCC"}
@@ -0,0 +1,26 @@
1
+ /// <reference types="node" />
2
+ import { Page } from '@serenity-js/web';
3
+ import { URL } from 'url';
4
+ import * as wdio from 'webdriverio';
5
+ export declare class WebdriverIOPage extends Page {
6
+ private readonly browser;
7
+ constructor(browser: wdio.Browser<'async'>, handle: string);
8
+ title(): Promise<string>;
9
+ name(): Promise<string>;
10
+ url(): Promise<URL>;
11
+ viewportSize(): Promise<{
12
+ width: number;
13
+ height: number;
14
+ }>;
15
+ setViewportSize(size: {
16
+ width: number;
17
+ height: number;
18
+ }): Promise<void>;
19
+ close(): Promise<void>;
20
+ closeOthers(): Promise<void>;
21
+ isPresent(): Promise<boolean>;
22
+ switchTo(): Promise<{
23
+ switchBack(): Promise<void>;
24
+ }>;
25
+ private switchToAndPerform;
26
+ }
@@ -0,0 +1,104 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.WebdriverIOPage = void 0;
4
+ const web_1 = require("@serenity-js/web");
5
+ const url_1 = require("url");
6
+ class WebdriverIOPage extends web_1.Page {
7
+ constructor(browser, handle) {
8
+ super(handle);
9
+ this.browser = browser;
10
+ }
11
+ title() {
12
+ return this.switchToAndPerform(async (browser) => {
13
+ return browser.getTitle();
14
+ });
15
+ }
16
+ name() {
17
+ return this.switchToAndPerform(async (browser) => {
18
+ return browser.execute(`return window.name`);
19
+ });
20
+ }
21
+ async url() {
22
+ return this.switchToAndPerform(async (browser) => {
23
+ return new url_1.URL(await browser.getUrl());
24
+ });
25
+ }
26
+ async viewportSize() {
27
+ return this.switchToAndPerform(async (browser) => {
28
+ if (!browser.isDevTools) {
29
+ const calculatedViewportSize = await browser.execute(`
30
+ return {
31
+ width: Math.max(document.documentElement.clientWidth, window.innerWidth || 0),
32
+ height: Math.max(document.documentElement.clientHeight, window.innerHeight || 0),
33
+ }
34
+ `);
35
+ // Chrome headless hard-codes window.innerWidth and window.innerHeight to 0
36
+ if (calculatedViewportSize.width > 0 && calculatedViewportSize.height > 0) {
37
+ return calculatedViewportSize;
38
+ }
39
+ }
40
+ return browser.getWindowSize();
41
+ });
42
+ }
43
+ setViewportSize(size) {
44
+ return this.switchToAndPerform(async (browser) => {
45
+ let desiredWindowSize = size;
46
+ if (!browser.isDevTools) {
47
+ desiredWindowSize = await browser.execute(`
48
+ var currentViewportWidth = Math.max(document.documentElement.clientWidth, window.innerWidth || 0)
49
+ var currentViewportHeight = Math.max(document.documentElement.clientHeight, window.innerHeight || 0)
50
+
51
+ return {
52
+ width: Math.max(window.outerWidth - currentViewportWidth + ${size.width}, ${size.width}),
53
+ height: Math.max(window.outerHeight - currentViewportHeight + ${size.height}, ${size.height}),
54
+ };
55
+ `);
56
+ }
57
+ return browser.setWindowSize(desiredWindowSize.width, desiredWindowSize.height);
58
+ });
59
+ }
60
+ async close() {
61
+ return this.switchToAndPerform(browser => browser.closeWindow());
62
+ }
63
+ async closeOthers() {
64
+ const windowHandles = await this.browser.getWindowHandles();
65
+ for (const handle of windowHandles) {
66
+ if (handle !== this.handle) {
67
+ await this.browser.switchToWindow(handle);
68
+ await this.browser.closeWindow();
69
+ }
70
+ }
71
+ await this.browser.switchToWindow(this.handle);
72
+ }
73
+ async isPresent() {
74
+ const currentPageHandle = await this.browser.getWindowHandle();
75
+ const desiredPageHandle = this.handle;
76
+ const isOpen = await this.browser.switchToWindow(desiredPageHandle).then(() => true, _error => false);
77
+ await this.browser.switchToWindow(currentPageHandle);
78
+ return isOpen;
79
+ }
80
+ async switchTo() {
81
+ const originalWindowHandle = await this.browser.getWindowHandle();
82
+ await this.browser.switchToWindow(this.handle);
83
+ return {
84
+ switchBack: async () => {
85
+ await this.browser.switchToWindow(originalWindowHandle);
86
+ }
87
+ };
88
+ }
89
+ async switchToAndPerform(action) {
90
+ const currentPageHandle = await this.browser.getWindowHandle();
91
+ const desiredPageHandle = this.handle;
92
+ const shouldSwitch = currentPageHandle !== desiredPageHandle;
93
+ if (shouldSwitch) {
94
+ await this.browser.switchToWindow(desiredPageHandle);
95
+ }
96
+ const result = await action(this.browser);
97
+ if (shouldSwitch) {
98
+ await this.browser.switchToWindow(currentPageHandle);
99
+ }
100
+ return result;
101
+ }
102
+ }
103
+ exports.WebdriverIOPage = WebdriverIOPage;
104
+ //# sourceMappingURL=WebdriverIOPage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WebdriverIOPage.js","sourceRoot":"","sources":["../../../src/screenplay/models/WebdriverIOPage.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,31 @@
1
+ import { PageElement } from '@serenity-js/web';
2
+ import * as wdio from 'webdriverio';
3
+ export declare class WebdriverIOPageElement extends PageElement<wdio.Element<'async'>> {
4
+ of(parent: WebdriverIOPageElement): WebdriverIOPageElement;
5
+ clearValue(): Promise<void>;
6
+ click(): Promise<void>;
7
+ doubleClick(): Promise<void>;
8
+ enterValue(value: string | number | Array<string | number>): Promise<void>;
9
+ scrollIntoView(): Promise<void>;
10
+ hoverOver(): Promise<void>;
11
+ rightClick(): Promise<void>;
12
+ attribute(name: string): Promise<string>;
13
+ text(): Promise<string>;
14
+ value(): Promise<string>;
15
+ isActive(): Promise<boolean>;
16
+ isClickable(): Promise<boolean>;
17
+ isEnabled(): Promise<boolean>;
18
+ isPresent(): Promise<boolean>;
19
+ isSelected(): Promise<boolean>;
20
+ /**
21
+ * @desc
22
+ * Checks if the PageElement:
23
+ * - is displayed,
24
+ * - is visible within the browser viewport,
25
+ * - has not its center covered by other elements
26
+ *
27
+ * @see https://webdriver.io/docs/api/element/isDisplayedInViewport/
28
+ */
29
+ isVisible(): Promise<boolean>;
30
+ private browserFor;
31
+ }