@serenity-js/webdriverio-8 3.31.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 (285) hide show
  1. package/CHANGELOG.md +1232 -0
  2. package/LICENSE.md +201 -0
  3. package/NOTICE.md +1 -0
  4. package/README.md +234 -0
  5. package/esm/adapter/TestRunnerLoader.d.ts +17 -0
  6. package/esm/adapter/TestRunnerLoader.d.ts.map +1 -0
  7. package/esm/adapter/TestRunnerLoader.js +63 -0
  8. package/esm/adapter/TestRunnerLoader.js.map +1 -0
  9. package/esm/adapter/WebdriverIOFrameworkAdapter.d.ts +25 -0
  10. package/esm/adapter/WebdriverIOFrameworkAdapter.d.ts.map +1 -0
  11. package/esm/adapter/WebdriverIOFrameworkAdapter.js +90 -0
  12. package/esm/adapter/WebdriverIOFrameworkAdapter.js.map +1 -0
  13. package/esm/adapter/WebdriverIOFrameworkAdapterFactory.d.ts +18 -0
  14. package/esm/adapter/WebdriverIOFrameworkAdapterFactory.d.ts.map +1 -0
  15. package/esm/adapter/WebdriverIOFrameworkAdapterFactory.js +18 -0
  16. package/esm/adapter/WebdriverIOFrameworkAdapterFactory.js.map +1 -0
  17. package/esm/adapter/WebdriverIONotifier.d.ts +71 -0
  18. package/esm/adapter/WebdriverIONotifier.d.ts.map +1 -0
  19. package/esm/adapter/WebdriverIONotifier.js +390 -0
  20. package/esm/adapter/WebdriverIONotifier.js.map +1 -0
  21. package/esm/adapter/index.d.ts +2 -0
  22. package/esm/adapter/index.d.ts.map +1 -0
  23. package/esm/adapter/index.js +2 -0
  24. package/esm/adapter/index.js.map +1 -0
  25. package/esm/adapter/reporter/BrowserCapabilitiesReporter.d.ts +18 -0
  26. package/esm/adapter/reporter/BrowserCapabilitiesReporter.d.ts.map +1 -0
  27. package/esm/adapter/reporter/BrowserCapabilitiesReporter.js +42 -0
  28. package/esm/adapter/reporter/BrowserCapabilitiesReporter.js.map +1 -0
  29. package/esm/adapter/reporter/InitialisesReporters.d.ts +8 -0
  30. package/esm/adapter/reporter/InitialisesReporters.d.ts.map +1 -0
  31. package/esm/adapter/reporter/InitialisesReporters.js +2 -0
  32. package/esm/adapter/reporter/InitialisesReporters.js.map +1 -0
  33. package/esm/adapter/reporter/OutputStreamBuffer.d.ts +13 -0
  34. package/esm/adapter/reporter/OutputStreamBuffer.d.ts.map +1 -0
  35. package/esm/adapter/reporter/OutputStreamBuffer.js +25 -0
  36. package/esm/adapter/reporter/OutputStreamBuffer.js.map +1 -0
  37. package/esm/adapter/reporter/OutputStreamBufferPrinter.d.ts +16 -0
  38. package/esm/adapter/reporter/OutputStreamBufferPrinter.d.ts.map +1 -0
  39. package/esm/adapter/reporter/OutputStreamBufferPrinter.js +24 -0
  40. package/esm/adapter/reporter/OutputStreamBufferPrinter.js.map +1 -0
  41. package/esm/adapter/reporter/ProvidesWriteStream.d.ts +8 -0
  42. package/esm/adapter/reporter/ProvidesWriteStream.d.ts.map +1 -0
  43. package/esm/adapter/reporter/ProvidesWriteStream.js +2 -0
  44. package/esm/adapter/reporter/ProvidesWriteStream.js.map +1 -0
  45. package/esm/adapter/reporter/TagPrinter.d.ts +17 -0
  46. package/esm/adapter/reporter/TagPrinter.d.ts.map +1 -0
  47. package/esm/adapter/reporter/TagPrinter.js +52 -0
  48. package/esm/adapter/reporter/TagPrinter.js.map +1 -0
  49. package/esm/adapter/reporter/index.d.ts +6 -0
  50. package/esm/adapter/reporter/index.d.ts.map +1 -0
  51. package/esm/adapter/reporter/index.js +6 -0
  52. package/esm/adapter/reporter/index.js.map +1 -0
  53. package/esm/api.d.ts +3 -0
  54. package/esm/api.d.ts.map +1 -0
  55. package/esm/api.js +2 -0
  56. package/esm/api.js.map +1 -0
  57. package/esm/config/WebdriverIOConfig.d.ts +95 -0
  58. package/esm/config/WebdriverIOConfig.d.ts.map +1 -0
  59. package/esm/config/WebdriverIOConfig.js +2 -0
  60. package/esm/config/WebdriverIOConfig.js.map +1 -0
  61. package/esm/config/index.d.ts +2 -0
  62. package/esm/config/index.d.ts.map +1 -0
  63. package/esm/config/index.js +2 -0
  64. package/esm/config/index.js.map +1 -0
  65. package/esm/index.d.ts +16 -0
  66. package/esm/index.d.ts.map +1 -0
  67. package/esm/index.js +14 -0
  68. package/esm/index.js.map +1 -0
  69. package/esm/screenplay/abilities/BrowseTheWebWithWebdriverIO.d.ts +40 -0
  70. package/esm/screenplay/abilities/BrowseTheWebWithWebdriverIO.d.ts.map +1 -0
  71. package/esm/screenplay/abilities/BrowseTheWebWithWebdriverIO.js +43 -0
  72. package/esm/screenplay/abilities/BrowseTheWebWithWebdriverIO.js.map +1 -0
  73. package/esm/screenplay/abilities/index.d.ts +2 -0
  74. package/esm/screenplay/abilities/index.d.ts.map +1 -0
  75. package/esm/screenplay/abilities/index.js +2 -0
  76. package/esm/screenplay/abilities/index.js.map +1 -0
  77. package/esm/screenplay/index.d.ts +3 -0
  78. package/esm/screenplay/index.d.ts.map +1 -0
  79. package/esm/screenplay/index.js +3 -0
  80. package/esm/screenplay/index.js.map +1 -0
  81. package/esm/screenplay/models/WebdriverIOBrowsingSession.d.ts +25 -0
  82. package/esm/screenplay/models/WebdriverIOBrowsingSession.d.ts.map +1 -0
  83. package/esm/screenplay/models/WebdriverIOBrowsingSession.js +125 -0
  84. package/esm/screenplay/models/WebdriverIOBrowsingSession.js.map +1 -0
  85. package/esm/screenplay/models/WebdriverIOCookie.d.ts +15 -0
  86. package/esm/screenplay/models/WebdriverIOCookie.d.ts.map +1 -0
  87. package/esm/screenplay/models/WebdriverIOCookie.js +42 -0
  88. package/esm/screenplay/models/WebdriverIOCookie.js.map +1 -0
  89. package/esm/screenplay/models/WebdriverIOErrorHandler.d.ts +9 -0
  90. package/esm/screenplay/models/WebdriverIOErrorHandler.d.ts.map +1 -0
  91. package/esm/screenplay/models/WebdriverIOErrorHandler.js +20 -0
  92. package/esm/screenplay/models/WebdriverIOErrorHandler.js.map +1 -0
  93. package/esm/screenplay/models/WebdriverIOModalDialogHandler.d.ts +27 -0
  94. package/esm/screenplay/models/WebdriverIOModalDialogHandler.d.ts.map +1 -0
  95. package/esm/screenplay/models/WebdriverIOModalDialogHandler.js +74 -0
  96. package/esm/screenplay/models/WebdriverIOModalDialogHandler.js.map +1 -0
  97. package/esm/screenplay/models/WebdriverIOPage.d.ts +50 -0
  98. package/esm/screenplay/models/WebdriverIOPage.d.ts.map +1 -0
  99. package/esm/screenplay/models/WebdriverIOPage.js +219 -0
  100. package/esm/screenplay/models/WebdriverIOPage.js.map +1 -0
  101. package/esm/screenplay/models/WebdriverIOPageElement.d.ts +34 -0
  102. package/esm/screenplay/models/WebdriverIOPageElement.d.ts.map +1 -0
  103. package/esm/screenplay/models/WebdriverIOPageElement.js +220 -0
  104. package/esm/screenplay/models/WebdriverIOPageElement.js.map +1 -0
  105. package/esm/screenplay/models/WebdriverIOPuppeteerModalDialogHandler.d.ts +30 -0
  106. package/esm/screenplay/models/WebdriverIOPuppeteerModalDialogHandler.d.ts.map +1 -0
  107. package/esm/screenplay/models/WebdriverIOPuppeteerModalDialogHandler.js +77 -0
  108. package/esm/screenplay/models/WebdriverIOPuppeteerModalDialogHandler.js.map +1 -0
  109. package/esm/screenplay/models/WebdriverProtocolErrorCode.d.ts +39 -0
  110. package/esm/screenplay/models/WebdriverProtocolErrorCode.d.ts.map +1 -0
  111. package/esm/screenplay/models/WebdriverProtocolErrorCode.js +40 -0
  112. package/esm/screenplay/models/WebdriverProtocolErrorCode.js.map +1 -0
  113. package/esm/screenplay/models/index.d.ts +5 -0
  114. package/esm/screenplay/models/index.d.ts.map +1 -0
  115. package/esm/screenplay/models/index.js +5 -0
  116. package/esm/screenplay/models/index.js.map +1 -0
  117. package/esm/screenplay/models/locators/WebdriverIOLocator.d.ts +33 -0
  118. package/esm/screenplay/models/locators/WebdriverIOLocator.d.ts.map +1 -0
  119. package/esm/screenplay/models/locators/WebdriverIOLocator.js +123 -0
  120. package/esm/screenplay/models/locators/WebdriverIOLocator.js.map +1 -0
  121. package/esm/screenplay/models/locators/WebdriverIORootLocator.d.ts +17 -0
  122. package/esm/screenplay/models/locators/WebdriverIORootLocator.d.ts.map +1 -0
  123. package/esm/screenplay/models/locators/WebdriverIORootLocator.js +30 -0
  124. package/esm/screenplay/models/locators/WebdriverIORootLocator.js.map +1 -0
  125. package/esm/screenplay/models/locators/index.d.ts +3 -0
  126. package/esm/screenplay/models/locators/index.d.ts.map +1 -0
  127. package/esm/screenplay/models/locators/index.js +3 -0
  128. package/esm/screenplay/models/locators/index.js.map +1 -0
  129. package/lib/adapter/TestRunnerLoader.d.ts +17 -0
  130. package/lib/adapter/TestRunnerLoader.d.ts.map +1 -0
  131. package/lib/adapter/TestRunnerLoader.js +67 -0
  132. package/lib/adapter/TestRunnerLoader.js.map +1 -0
  133. package/lib/adapter/WebdriverIOFrameworkAdapter.d.ts +25 -0
  134. package/lib/adapter/WebdriverIOFrameworkAdapter.d.ts.map +1 -0
  135. package/lib/adapter/WebdriverIOFrameworkAdapter.js +127 -0
  136. package/lib/adapter/WebdriverIOFrameworkAdapter.js.map +1 -0
  137. package/lib/adapter/WebdriverIOFrameworkAdapterFactory.d.ts +18 -0
  138. package/lib/adapter/WebdriverIOFrameworkAdapterFactory.d.ts.map +1 -0
  139. package/lib/adapter/WebdriverIOFrameworkAdapterFactory.js +22 -0
  140. package/lib/adapter/WebdriverIOFrameworkAdapterFactory.js.map +1 -0
  141. package/lib/adapter/WebdriverIONotifier.d.ts +71 -0
  142. package/lib/adapter/WebdriverIONotifier.d.ts.map +1 -0
  143. package/lib/adapter/WebdriverIONotifier.js +394 -0
  144. package/lib/adapter/WebdriverIONotifier.js.map +1 -0
  145. package/lib/adapter/index.d.ts +2 -0
  146. package/lib/adapter/index.d.ts.map +1 -0
  147. package/lib/adapter/index.js +18 -0
  148. package/lib/adapter/index.js.map +1 -0
  149. package/lib/adapter/reporter/BrowserCapabilitiesReporter.d.ts +18 -0
  150. package/lib/adapter/reporter/BrowserCapabilitiesReporter.d.ts.map +1 -0
  151. package/lib/adapter/reporter/BrowserCapabilitiesReporter.js +49 -0
  152. package/lib/adapter/reporter/BrowserCapabilitiesReporter.js.map +1 -0
  153. package/lib/adapter/reporter/InitialisesReporters.d.ts +8 -0
  154. package/lib/adapter/reporter/InitialisesReporters.d.ts.map +1 -0
  155. package/lib/adapter/reporter/InitialisesReporters.js +3 -0
  156. package/lib/adapter/reporter/InitialisesReporters.js.map +1 -0
  157. package/lib/adapter/reporter/OutputStreamBuffer.d.ts +13 -0
  158. package/lib/adapter/reporter/OutputStreamBuffer.d.ts.map +1 -0
  159. package/lib/adapter/reporter/OutputStreamBuffer.js +29 -0
  160. package/lib/adapter/reporter/OutputStreamBuffer.js.map +1 -0
  161. package/lib/adapter/reporter/OutputStreamBufferPrinter.d.ts +16 -0
  162. package/lib/adapter/reporter/OutputStreamBufferPrinter.d.ts.map +1 -0
  163. package/lib/adapter/reporter/OutputStreamBufferPrinter.js +28 -0
  164. package/lib/adapter/reporter/OutputStreamBufferPrinter.js.map +1 -0
  165. package/lib/adapter/reporter/ProvidesWriteStream.d.ts +8 -0
  166. package/lib/adapter/reporter/ProvidesWriteStream.d.ts.map +1 -0
  167. package/lib/adapter/reporter/ProvidesWriteStream.js +3 -0
  168. package/lib/adapter/reporter/ProvidesWriteStream.js.map +1 -0
  169. package/lib/adapter/reporter/TagPrinter.d.ts +17 -0
  170. package/lib/adapter/reporter/TagPrinter.d.ts.map +1 -0
  171. package/lib/adapter/reporter/TagPrinter.js +56 -0
  172. package/lib/adapter/reporter/TagPrinter.js.map +1 -0
  173. package/lib/adapter/reporter/index.d.ts +6 -0
  174. package/lib/adapter/reporter/index.d.ts.map +1 -0
  175. package/lib/adapter/reporter/index.js +22 -0
  176. package/lib/adapter/reporter/index.js.map +1 -0
  177. package/lib/api.d.ts +3 -0
  178. package/lib/api.d.ts.map +1 -0
  179. package/lib/api.js +18 -0
  180. package/lib/api.js.map +1 -0
  181. package/lib/config/WebdriverIOConfig.d.ts +95 -0
  182. package/lib/config/WebdriverIOConfig.d.ts.map +1 -0
  183. package/lib/config/WebdriverIOConfig.js +3 -0
  184. package/lib/config/WebdriverIOConfig.js.map +1 -0
  185. package/lib/config/index.d.ts +2 -0
  186. package/lib/config/index.d.ts.map +1 -0
  187. package/lib/config/index.js +18 -0
  188. package/lib/config/index.js.map +1 -0
  189. package/lib/index.d.ts +16 -0
  190. package/lib/index.d.ts.map +1 -0
  191. package/lib/index.js +52 -0
  192. package/lib/index.js.map +1 -0
  193. package/lib/package.json +1 -0
  194. package/lib/screenplay/abilities/BrowseTheWebWithWebdriverIO.d.ts +40 -0
  195. package/lib/screenplay/abilities/BrowseTheWebWithWebdriverIO.d.ts.map +1 -0
  196. package/lib/screenplay/abilities/BrowseTheWebWithWebdriverIO.js +47 -0
  197. package/lib/screenplay/abilities/BrowseTheWebWithWebdriverIO.js.map +1 -0
  198. package/lib/screenplay/abilities/index.d.ts +2 -0
  199. package/lib/screenplay/abilities/index.d.ts.map +1 -0
  200. package/lib/screenplay/abilities/index.js +18 -0
  201. package/lib/screenplay/abilities/index.js.map +1 -0
  202. package/lib/screenplay/index.d.ts +3 -0
  203. package/lib/screenplay/index.d.ts.map +1 -0
  204. package/lib/screenplay/index.js +19 -0
  205. package/lib/screenplay/index.js.map +1 -0
  206. package/lib/screenplay/models/WebdriverIOBrowsingSession.d.ts +25 -0
  207. package/lib/screenplay/models/WebdriverIOBrowsingSession.d.ts.map +1 -0
  208. package/lib/screenplay/models/WebdriverIOBrowsingSession.js +129 -0
  209. package/lib/screenplay/models/WebdriverIOBrowsingSession.js.map +1 -0
  210. package/lib/screenplay/models/WebdriverIOCookie.d.ts +15 -0
  211. package/lib/screenplay/models/WebdriverIOCookie.d.ts.map +1 -0
  212. package/lib/screenplay/models/WebdriverIOCookie.js +46 -0
  213. package/lib/screenplay/models/WebdriverIOCookie.js.map +1 -0
  214. package/lib/screenplay/models/WebdriverIOErrorHandler.d.ts +9 -0
  215. package/lib/screenplay/models/WebdriverIOErrorHandler.d.ts.map +1 -0
  216. package/lib/screenplay/models/WebdriverIOErrorHandler.js +24 -0
  217. package/lib/screenplay/models/WebdriverIOErrorHandler.js.map +1 -0
  218. package/lib/screenplay/models/WebdriverIOModalDialogHandler.d.ts +27 -0
  219. package/lib/screenplay/models/WebdriverIOModalDialogHandler.d.ts.map +1 -0
  220. package/lib/screenplay/models/WebdriverIOModalDialogHandler.js +78 -0
  221. package/lib/screenplay/models/WebdriverIOModalDialogHandler.js.map +1 -0
  222. package/lib/screenplay/models/WebdriverIOPage.d.ts +50 -0
  223. package/lib/screenplay/models/WebdriverIOPage.d.ts.map +1 -0
  224. package/lib/screenplay/models/WebdriverIOPage.js +256 -0
  225. package/lib/screenplay/models/WebdriverIOPage.js.map +1 -0
  226. package/lib/screenplay/models/WebdriverIOPageElement.d.ts +34 -0
  227. package/lib/screenplay/models/WebdriverIOPageElement.d.ts.map +1 -0
  228. package/lib/screenplay/models/WebdriverIOPageElement.js +257 -0
  229. package/lib/screenplay/models/WebdriverIOPageElement.js.map +1 -0
  230. package/lib/screenplay/models/WebdriverIOPuppeteerModalDialogHandler.d.ts +30 -0
  231. package/lib/screenplay/models/WebdriverIOPuppeteerModalDialogHandler.d.ts.map +1 -0
  232. package/lib/screenplay/models/WebdriverIOPuppeteerModalDialogHandler.js +81 -0
  233. package/lib/screenplay/models/WebdriverIOPuppeteerModalDialogHandler.js.map +1 -0
  234. package/lib/screenplay/models/WebdriverProtocolErrorCode.d.ts +39 -0
  235. package/lib/screenplay/models/WebdriverProtocolErrorCode.d.ts.map +1 -0
  236. package/lib/screenplay/models/WebdriverProtocolErrorCode.js +43 -0
  237. package/lib/screenplay/models/WebdriverProtocolErrorCode.js.map +1 -0
  238. package/lib/screenplay/models/index.d.ts +5 -0
  239. package/lib/screenplay/models/index.d.ts.map +1 -0
  240. package/lib/screenplay/models/index.js +21 -0
  241. package/lib/screenplay/models/index.js.map +1 -0
  242. package/lib/screenplay/models/locators/WebdriverIOLocator.d.ts +33 -0
  243. package/lib/screenplay/models/locators/WebdriverIOLocator.d.ts.map +1 -0
  244. package/lib/screenplay/models/locators/WebdriverIOLocator.js +128 -0
  245. package/lib/screenplay/models/locators/WebdriverIOLocator.js.map +1 -0
  246. package/lib/screenplay/models/locators/WebdriverIORootLocator.d.ts +17 -0
  247. package/lib/screenplay/models/locators/WebdriverIORootLocator.d.ts.map +1 -0
  248. package/lib/screenplay/models/locators/WebdriverIORootLocator.js +34 -0
  249. package/lib/screenplay/models/locators/WebdriverIORootLocator.js.map +1 -0
  250. package/lib/screenplay/models/locators/index.d.ts +3 -0
  251. package/lib/screenplay/models/locators/index.d.ts.map +1 -0
  252. package/lib/screenplay/models/locators/index.js +19 -0
  253. package/lib/screenplay/models/locators/index.js.map +1 -0
  254. package/package.json +122 -0
  255. package/src/adapter/TestRunnerLoader.ts +90 -0
  256. package/src/adapter/WebdriverIOFrameworkAdapter.ts +130 -0
  257. package/src/adapter/WebdriverIOFrameworkAdapterFactory.ts +39 -0
  258. package/src/adapter/WebdriverIONotifier.ts +480 -0
  259. package/src/adapter/index.ts +1 -0
  260. package/src/adapter/reporter/BrowserCapabilitiesReporter.ts +63 -0
  261. package/src/adapter/reporter/InitialisesReporters.ts +8 -0
  262. package/src/adapter/reporter/OutputStreamBuffer.ts +30 -0
  263. package/src/adapter/reporter/OutputStreamBufferPrinter.ts +30 -0
  264. package/src/adapter/reporter/ProvidesWriteStream.ts +8 -0
  265. package/src/adapter/reporter/TagPrinter.ts +69 -0
  266. package/src/adapter/reporter/index.ts +5 -0
  267. package/src/api.ts +2 -0
  268. package/src/config/WebdriverIOConfig.ts +94 -0
  269. package/src/config/index.ts +1 -0
  270. package/src/index.ts +32 -0
  271. package/src/screenplay/abilities/BrowseTheWebWithWebdriverIO.ts +46 -0
  272. package/src/screenplay/abilities/index.ts +1 -0
  273. package/src/screenplay/index.ts +2 -0
  274. package/src/screenplay/models/WebdriverIOBrowsingSession.ts +176 -0
  275. package/src/screenplay/models/WebdriverIOCookie.ts +51 -0
  276. package/src/screenplay/models/WebdriverIOErrorHandler.ts +25 -0
  277. package/src/screenplay/models/WebdriverIOModalDialogHandler.ts +99 -0
  278. package/src/screenplay/models/WebdriverIOPage.ts +311 -0
  279. package/src/screenplay/models/WebdriverIOPageElement.ts +280 -0
  280. package/src/screenplay/models/WebdriverIOPuppeteerModalDialogHandler.ts +100 -0
  281. package/src/screenplay/models/WebdriverProtocolErrorCode.ts +38 -0
  282. package/src/screenplay/models/index.ts +4 -0
  283. package/src/screenplay/models/locators/WebdriverIOLocator.ts +176 -0
  284. package/src/screenplay/models/locators/WebdriverIORootLocator.ts +34 -0
  285. package/src/screenplay/models/locators/index.ts +2 -0
@@ -0,0 +1,90 @@
1
+ import { ConfigurationError } from '@serenity-js/core';
2
+ import type { TestRunnerAdapter } from '@serenity-js/core/lib/adapter/index.js';
3
+ import type { ModuleLoader} from '@serenity-js/core/lib/io/index.js';
4
+ import { Config, FileFinder, FileSystem, Path } from '@serenity-js/core/lib/io/index.js';
5
+
6
+ import type { WebdriverIOConfig } from '../config/index.js';
7
+
8
+ // We define TestRunnerOptions to avoid importing the global WebdriverIO namespace.
9
+ // WebdriverIO v8 doesn't offer any more precise type declarations anyway.
10
+ interface TestRunnerOptions {
11
+ [key: string]: any;
12
+ }
13
+
14
+ export class TestRunnerLoader {
15
+ private readonly fileSystem: FileSystem;
16
+ private readonly finder: FileFinder;
17
+
18
+ constructor(
19
+ private readonly loader: ModuleLoader,
20
+ private readonly cwd: Path,
21
+ private readonly cid: string,
22
+ ) {
23
+ this.fileSystem = new FileSystem(cwd);
24
+ this.finder = new FileFinder(cwd);
25
+ }
26
+
27
+ runnerAdapterFor(config: WebdriverIOConfig): TestRunnerAdapter {
28
+ switch (config?.serenity?.runner) {
29
+ case 'cucumber':
30
+ return this.cucumberAdapter(config?.cucumberOpts);
31
+
32
+ case 'jasmine':
33
+ return this.jasmineAdapter(config?.jasmineOpts);
34
+
35
+ case 'mocha':
36
+ case undefined:
37
+ return this.mochaAdapter(config?.mochaOpts);
38
+
39
+ default:
40
+ throw new ConfigurationError(`"${ config?.serenity?.runner }" is not a supported test runner. Please use "mocha", "jasmine", or "cucumber"`);
41
+ }
42
+ }
43
+
44
+ private cucumberAdapter(cucumberOptions?: TestRunnerOptions): TestRunnerAdapter {
45
+ const { CucumberCLIAdapter, CucumberFormat, StandardOutput, TempFileOutput } = this.loader.require('@serenity-js/cucumber/lib/adapter/index.js');
46
+
47
+ delete cucumberOptions?.timeout; // todo: support setting a timeout via config?
48
+ delete cucumberOptions?.parallel; // WebdriverIO handles that already
49
+
50
+ const cleanedCucumberOptions = new Config(cucumberOptions)
51
+ .where('format', values =>
52
+ [].concat(values).map(value => {
53
+ const format = new CucumberFormat(value);
54
+
55
+ if (format.output === '') {
56
+ return format.value;
57
+ }
58
+
59
+ const basename = Path.from(format.output).basename();
60
+ const filenameParts = basename.split('.');
61
+
62
+ if (filenameParts[0] === basename) {
63
+ return `${ format.formatter }:${ format.output }.${ this.cid }`;
64
+ }
65
+
66
+ filenameParts.splice(-1, 0, `${ this.cid }`);
67
+
68
+ return `${ format.formatter }:${ format.output.replace(basename, filenameParts.join('.')) }`;
69
+ })
70
+ ).object();
71
+
72
+ // check if we need to free up stdout for any native reporters
73
+ const output = cleanedCucumberOptions?.format?.some(format => new CucumberFormat(format).output === '')
74
+ ? new TempFileOutput(this.fileSystem)
75
+ : new StandardOutput();
76
+
77
+ return new CucumberCLIAdapter(cleanedCucumberOptions, this.loader, this.fileSystem, output);
78
+ }
79
+
80
+ private jasmineAdapter(jasmineOptions: TestRunnerOptions): TestRunnerAdapter {
81
+ const { JasmineAdapter } = this.loader.require('@serenity-js/jasmine/adapter')
82
+ return new JasmineAdapter(jasmineOptions, this.loader);
83
+ }
84
+
85
+ private mochaAdapter(mochaOptions: TestRunnerOptions): TestRunnerAdapter {
86
+ // todo: update path to mocha adapter too
87
+ const { MochaAdapter } = this.loader.require('@serenity-js/mocha/lib/adapter/index.js')
88
+ return new MochaAdapter(mochaOptions, this.loader);
89
+ }
90
+ }
@@ -0,0 +1,130 @@
1
+ import 'webdriverio';
2
+
3
+ import type { Serenity } from '@serenity-js/core';
4
+ import { AnsiDiffFormatter, ArtifactArchiver, Cast, TakeNotes } from '@serenity-js/core';
5
+ import type { TestRunnerAdapter } from '@serenity-js/core/lib/adapter/index.js';
6
+ import type { ModuleLoader } from '@serenity-js/core/lib/io/index.js';
7
+ import { Path } from '@serenity-js/core/lib/io/index.js';
8
+ import { CallAnApi } from '@serenity-js/rest';
9
+ import type { Capabilities } from '@wdio/types';
10
+ import * as deepmerge from 'deepmerge';
11
+ import type { EventEmitter } from 'events';
12
+ import { isRecord } from 'tiny-types/lib/objects/isRecord.js';
13
+
14
+ import type { WebdriverIOConfig } from '../config/index.js';
15
+ import { BrowseTheWebWithWebdriverIO } from '../screenplay/index.js';
16
+ import type { InitialisesReporters, ProvidesWriteStream } from './reporter/index.js';
17
+ import { BrowserCapabilitiesReporter, OutputStreamBuffer } from './reporter/index.js';
18
+ import { OutputStreamBufferPrinter } from './reporter/OutputStreamBufferPrinter.js';
19
+ import { TestRunnerLoader } from './TestRunnerLoader.js';
20
+ import { WebdriverIONotifier } from './WebdriverIONotifier.js';
21
+
22
+ export class WebdriverIOFrameworkAdapter {
23
+
24
+ private adapter: TestRunnerAdapter;
25
+ private notifier: WebdriverIONotifier;
26
+
27
+ constructor(
28
+ private readonly serenity: Serenity,
29
+ private readonly loader: ModuleLoader,
30
+ private readonly cwd: Path,
31
+ private readonly cid: string,
32
+ webdriverIOConfig: WebdriverIOConfig,
33
+ private readonly specs: string[],
34
+ private readonly capabilities: Capabilities.RemoteCapability,
35
+ private readonly reporter: EventEmitter & ProvidesWriteStream & InitialisesReporters
36
+ ) {
37
+ const config = deepmerge.default<WebdriverIOConfig>(this.defaultConfig(), webdriverIOConfig, {
38
+ isMergeableObject: isRecord,
39
+ });
40
+
41
+ // SauceLabs service serialises the config object for debugging.
42
+ // However, since Serenity/JS Stage is a pub/sub mechanism,
43
+ // it contains cyclic references which are not serialisable.
44
+ // We get rid of them from the config object to avoid confusing other services.
45
+ delete webdriverIOConfig.serenity;
46
+
47
+ this.adapter = new TestRunnerLoader(this.loader, this.cwd, this.cid)
48
+ .runnerAdapterFor(config);
49
+
50
+ this.notifier = new WebdriverIONotifier(
51
+ config,
52
+ capabilities,
53
+ reporter,
54
+ this.adapter.successThreshold(),
55
+ cid,
56
+ this.specs,
57
+ );
58
+
59
+ const outputStreamBuffer = new OutputStreamBuffer(
60
+ `[${ this.cid }]`,
61
+ );
62
+
63
+ const outputStreamBufferPrinter = new OutputStreamBufferPrinter(
64
+ outputStreamBuffer,
65
+ reporter.getWriteStreamObject('@serenity-js/webdriverio-8')
66
+ );
67
+
68
+ this.serenity.configure({
69
+ outputStream: outputStreamBuffer,
70
+ cueTimeout: config.serenity.cueTimeout,
71
+ interactionTimeout: config.serenity.interactionTimeout,
72
+
73
+ diffFormatter: config.serenity.diffFormatter ?? new AnsiDiffFormatter(),
74
+
75
+ actors: config.serenity.actors || Cast.where(actor => actor.whoCan(
76
+ BrowseTheWebWithWebdriverIO.using(global.browser as unknown as WebdriverIO.Browser),
77
+ TakeNotes.usingAnEmptyNotepad(),
78
+ CallAnApi.using({
79
+ baseURL: webdriverIOConfig.baseUrl,
80
+ }),
81
+ )),
82
+
83
+ crew: [
84
+ ...config.serenity.crew,
85
+ this.notifier,
86
+ outputStreamBufferPrinter,
87
+ ]
88
+ });
89
+ }
90
+
91
+ async init(): Promise<WebdriverIOFrameworkAdapter> {
92
+
93
+ // This is the only (hacky) way to register a fake reporter programmatically (as of @wdio/reporter 7.4.2)
94
+ // - https://github.com/webdriverio/webdriverio/blob/365fb0ad79fcf4471f21f23e18afa6818986dbdb/packages/wdio-runner/src/index.ts#L147-L181
95
+ // - https://github.com/webdriverio/webdriverio/blob/365fb0ad79fcf4471f21f23e18afa6818986dbdb/packages/wdio-runner/src/reporter.ts#L24
96
+ const browserCapabilitiesReporter = await (this.reporter._loadReporter([
97
+ BrowserCapabilitiesReporter, {
98
+ serenity: this.serenity
99
+ },
100
+ ]));
101
+
102
+ (this.reporter as any)._reporters.push(browserCapabilitiesReporter);
103
+
104
+ // WebdriverIO v8 represents paths to specs as file URIs, so they need to be converted to absolute paths to avoid confusing the test runners like Cucumber
105
+ const absolutePaths = this.specs.map(pathToSpec => Path.from(pathToSpec).value);
106
+
107
+ await this.adapter.load(absolutePaths);
108
+
109
+ return this;
110
+ }
111
+
112
+ hasTests(): boolean {
113
+ return this.adapter.scenarioCount() > 0;
114
+ }
115
+
116
+ async run(): Promise<number> {
117
+ await this.adapter.run();
118
+ return this.notifier.failureCount();
119
+ }
120
+
121
+ private defaultConfig(): Partial<WebdriverIOConfig> {
122
+ return {
123
+ serenity: {
124
+ crew: [
125
+ ArtifactArchiver.storingArtifactsAt(this.cwd.value, 'target/site/serenity'),
126
+ ]
127
+ }
128
+ }
129
+ }
130
+ }
@@ -0,0 +1,39 @@
1
+ import type { Serenity } from '@serenity-js/core';
2
+ import type { ModuleLoader, Path } from '@serenity-js/core/lib/io/index.js';
3
+ import type { Capabilities } from '@wdio/types';
4
+ import type { EventEmitter } from 'events';
5
+
6
+ import type { WebdriverIOConfig } from '../config/index.js';
7
+ import type { InitialisesReporters, ProvidesWriteStream } from './reporter/index.js';
8
+ import { WebdriverIOFrameworkAdapter } from './WebdriverIOFrameworkAdapter.js';
9
+
10
+ /**
11
+ * @group Test Runner Adapter
12
+ */
13
+ export class WebdriverIOFrameworkAdapterFactory {
14
+ constructor(
15
+ private readonly serenity: Serenity,
16
+ private readonly loader: ModuleLoader,
17
+ private readonly cwd: Path,
18
+ ) {
19
+ }
20
+
21
+ public init(
22
+ cid: string,
23
+ config: WebdriverIOConfig,
24
+ specs: string[],
25
+ capabilities: Capabilities.RemoteCapability,
26
+ reporter: EventEmitter & ProvidesWriteStream & InitialisesReporters
27
+ ): Promise<WebdriverIOFrameworkAdapter> {
28
+ return new WebdriverIOFrameworkAdapter(
29
+ this.serenity,
30
+ this.loader,
31
+ this.cwd,
32
+ cid,
33
+ config,
34
+ specs,
35
+ capabilities,
36
+ reporter,
37
+ ).init()
38
+ }
39
+ }