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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (169) hide show
  1. package/CHANGELOG.md +144 -2236
  2. package/README.md +39 -26
  3. package/lib/adapter/Config.d.ts +11 -9
  4. package/lib/adapter/Config.d.ts.map +1 -0
  5. package/lib/adapter/ProtractorFrameworkAdapter.d.ts +2 -3
  6. package/lib/adapter/ProtractorFrameworkAdapter.d.ts.map +1 -0
  7. package/lib/adapter/ProtractorFrameworkAdapter.js +11 -10
  8. package/lib/adapter/ProtractorFrameworkAdapter.js.map +1 -1
  9. package/lib/adapter/browser-detector/BrowserDetector.d.ts +1 -0
  10. package/lib/adapter/browser-detector/BrowserDetector.d.ts.map +1 -0
  11. package/lib/adapter/browser-detector/BrowserDetector.js +5 -5
  12. package/lib/adapter/browser-detector/BrowserDetector.js.map +1 -1
  13. package/lib/adapter/browser-detector/StandardisedCapabilities.d.ts +5 -4
  14. package/lib/adapter/browser-detector/StandardisedCapabilities.d.ts.map +1 -0
  15. package/lib/adapter/browser-detector/StandardisedCapabilities.js +17 -17
  16. package/lib/adapter/browser-detector/StandardisedCapabilities.js.map +1 -1
  17. package/lib/adapter/browser-detector/index.d.ts +1 -0
  18. package/lib/adapter/browser-detector/index.d.ts.map +1 -0
  19. package/lib/adapter/browser-detector/index.js +5 -1
  20. package/lib/adapter/browser-detector/index.js.map +1 -1
  21. package/lib/adapter/index.d.ts +2 -0
  22. package/lib/adapter/index.d.ts.map +1 -0
  23. package/lib/adapter/index.js +6 -1
  24. package/lib/adapter/index.js.map +1 -1
  25. package/lib/adapter/reporter/ProtractorReport.d.ts +5 -6
  26. package/lib/adapter/reporter/ProtractorReport.d.ts.map +1 -0
  27. package/lib/adapter/reporter/ProtractorReporter.d.ts +1 -0
  28. package/lib/adapter/reporter/ProtractorReporter.d.ts.map +1 -0
  29. package/lib/adapter/reporter/ProtractorReporter.js +10 -5
  30. package/lib/adapter/reporter/ProtractorReporter.js.map +1 -1
  31. package/lib/adapter/reporter/index.d.ts +1 -0
  32. package/lib/adapter/reporter/index.d.ts.map +1 -0
  33. package/lib/adapter/reporter/index.js +5 -1
  34. package/lib/adapter/reporter/index.js.map +1 -1
  35. package/lib/adapter/run.d.ts +7 -4
  36. package/lib/adapter/run.d.ts.map +1 -0
  37. package/lib/adapter/run.js +6 -4
  38. package/lib/adapter/run.js.map +1 -1
  39. package/lib/adapter/runner/CucumberAdapterConfig.d.ts +5 -10
  40. package/lib/adapter/runner/CucumberAdapterConfig.d.ts.map +1 -0
  41. package/lib/adapter/runner/TestRunnerDetector.d.ts +5 -12
  42. package/lib/adapter/runner/TestRunnerDetector.d.ts.map +1 -0
  43. package/lib/adapter/runner/TestRunnerDetector.js +7 -15
  44. package/lib/adapter/runner/TestRunnerDetector.js.map +1 -1
  45. package/lib/adapter/runner/TestRunnerLoader.d.ts +20 -17
  46. package/lib/adapter/runner/TestRunnerLoader.d.ts.map +1 -0
  47. package/lib/adapter/runner/TestRunnerLoader.js +18 -18
  48. package/lib/adapter/runner/TestRunnerLoader.js.map +1 -1
  49. package/lib/adapter/runner/index.d.ts +1 -0
  50. package/lib/adapter/runner/index.d.ts.map +1 -0
  51. package/lib/adapter/runner/index.js +5 -1
  52. package/lib/adapter/runner/index.js.map +1 -1
  53. package/lib/index.d.ts +1 -0
  54. package/lib/index.d.ts.map +1 -0
  55. package/lib/index.js +5 -1
  56. package/lib/index.js.map +1 -1
  57. package/lib/screenplay/abilities/BrowseTheWebWithProtractor.d.ts +62 -300
  58. package/lib/screenplay/abilities/BrowseTheWebWithProtractor.d.ts.map +1 -0
  59. package/lib/screenplay/abilities/BrowseTheWebWithProtractor.js +62 -422
  60. package/lib/screenplay/abilities/BrowseTheWebWithProtractor.js.map +1 -1
  61. package/lib/screenplay/abilities/index.d.ts +1 -0
  62. package/lib/screenplay/abilities/index.d.ts.map +1 -0
  63. package/lib/screenplay/abilities/index.js +5 -1
  64. package/lib/screenplay/abilities/index.js.map +1 -1
  65. package/lib/screenplay/index.d.ts +1 -0
  66. package/lib/screenplay/index.d.ts.map +1 -0
  67. package/lib/screenplay/index.js +5 -1
  68. package/lib/screenplay/index.js.map +1 -1
  69. package/lib/screenplay/interactions/UseAngular.d.ts +53 -48
  70. package/lib/screenplay/interactions/UseAngular.d.ts.map +1 -0
  71. package/lib/screenplay/interactions/UseAngular.js +52 -42
  72. package/lib/screenplay/interactions/UseAngular.js.map +1 -1
  73. package/lib/screenplay/interactions/index.d.ts +1 -0
  74. package/lib/screenplay/interactions/index.d.ts.map +1 -0
  75. package/lib/screenplay/interactions/index.js +5 -1
  76. package/lib/screenplay/interactions/index.js.map +1 -1
  77. package/lib/screenplay/models/ProtractorBrowsingSession.d.ts +22 -0
  78. package/lib/screenplay/models/ProtractorBrowsingSession.d.ts.map +1 -0
  79. package/lib/screenplay/models/ProtractorBrowsingSession.js +99 -0
  80. package/lib/screenplay/models/ProtractorBrowsingSession.js.map +1 -0
  81. package/lib/screenplay/models/ProtractorCookie.d.ts +6 -0
  82. package/lib/screenplay/models/ProtractorCookie.d.ts.map +1 -0
  83. package/lib/screenplay/models/ProtractorCookie.js +8 -3
  84. package/lib/screenplay/models/ProtractorCookie.js.map +1 -1
  85. package/lib/screenplay/models/ProtractorErrorHandler.d.ts +8 -0
  86. package/lib/screenplay/models/ProtractorErrorHandler.d.ts.map +1 -0
  87. package/lib/screenplay/models/ProtractorErrorHandler.js +23 -0
  88. package/lib/screenplay/models/ProtractorErrorHandler.js.map +1 -0
  89. package/lib/screenplay/models/ProtractorModalDialogHandler.d.ts +25 -0
  90. package/lib/screenplay/models/ProtractorModalDialogHandler.d.ts.map +1 -0
  91. package/lib/screenplay/models/ProtractorModalDialogHandler.js +74 -0
  92. package/lib/screenplay/models/ProtractorModalDialogHandler.js.map +1 -0
  93. package/lib/screenplay/models/ProtractorPage.d.ts +58 -6
  94. package/lib/screenplay/models/ProtractorPage.d.ts.map +1 -0
  95. package/lib/screenplay/models/ProtractorPage.js +221 -44
  96. package/lib/screenplay/models/ProtractorPage.js.map +1 -1
  97. package/lib/screenplay/models/ProtractorPageElement.d.ts +10 -1
  98. package/lib/screenplay/models/ProtractorPageElement.d.ts.map +1 -0
  99. package/lib/screenplay/models/ProtractorPageElement.js +141 -147
  100. package/lib/screenplay/models/ProtractorPageElement.js.map +1 -1
  101. package/lib/screenplay/models/index.d.ts +2 -1
  102. package/lib/screenplay/models/index.d.ts.map +1 -0
  103. package/lib/screenplay/models/index.js +6 -2
  104. package/lib/screenplay/models/index.js.map +1 -1
  105. package/lib/screenplay/models/locators/ProtractorLocator.d.ts +21 -8
  106. package/lib/screenplay/models/locators/ProtractorLocator.d.ts.map +1 -0
  107. package/lib/screenplay/models/locators/ProtractorLocator.js +107 -10
  108. package/lib/screenplay/models/locators/ProtractorLocator.js.map +1 -1
  109. package/lib/screenplay/models/locators/ProtractorRootLocator.d.ts +17 -0
  110. package/lib/screenplay/models/locators/ProtractorRootLocator.d.ts.map +1 -0
  111. package/lib/screenplay/models/locators/ProtractorRootLocator.js +38 -0
  112. package/lib/screenplay/models/locators/ProtractorRootLocator.js.map +1 -0
  113. package/lib/screenplay/models/locators/index.d.ts +2 -1
  114. package/lib/screenplay/models/locators/index.d.ts.map +1 -0
  115. package/lib/screenplay/models/locators/index.js +6 -2
  116. package/lib/screenplay/models/locators/index.js.map +1 -1
  117. package/lib/screenplay/promised.d.ts +3 -3
  118. package/lib/screenplay/promised.d.ts.map +1 -0
  119. package/lib/screenplay/promised.js +2 -3
  120. package/lib/screenplay/promised.js.map +1 -1
  121. package/lib/screenplay/questions/ProtractorParam.d.ts +64 -51
  122. package/lib/screenplay/questions/ProtractorParam.d.ts.map +1 -0
  123. package/lib/screenplay/questions/ProtractorParam.js +59 -47
  124. package/lib/screenplay/questions/ProtractorParam.js.map +1 -1
  125. package/lib/screenplay/questions/index.d.ts +1 -0
  126. package/lib/screenplay/questions/index.d.ts.map +1 -0
  127. package/lib/screenplay/questions/index.js +5 -1
  128. package/lib/screenplay/questions/index.js.map +1 -1
  129. package/lib/screenplay/unpromisedWebElement.d.ts +6 -4
  130. package/lib/screenplay/unpromisedWebElement.d.ts.map +1 -0
  131. package/lib/screenplay/unpromisedWebElement.js +5 -4
  132. package/lib/screenplay/unpromisedWebElement.js.map +1 -1
  133. package/package.json +36 -60
  134. package/src/adapter/Config.ts +10 -9
  135. package/src/adapter/ProtractorFrameworkAdapter.ts +16 -10
  136. package/src/adapter/browser-detector/BrowserDetector.ts +3 -3
  137. package/src/adapter/browser-detector/StandardisedCapabilities.ts +24 -24
  138. package/src/adapter/index.ts +1 -0
  139. package/src/adapter/reporter/ProtractorReport.ts +4 -6
  140. package/src/adapter/reporter/ProtractorReporter.ts +16 -16
  141. package/src/adapter/run.ts +6 -4
  142. package/src/adapter/runner/CucumberAdapterConfig.ts +5 -10
  143. package/src/adapter/runner/TestRunnerDetector.ts +5 -13
  144. package/src/adapter/runner/TestRunnerLoader.ts +21 -19
  145. package/src/screenplay/abilities/BrowseTheWebWithProtractor.ts +63 -480
  146. package/src/screenplay/interactions/UseAngular.ts +55 -44
  147. package/src/screenplay/models/ProtractorBrowsingSession.ts +133 -0
  148. package/src/screenplay/models/ProtractorCookie.ts +8 -3
  149. package/src/screenplay/models/ProtractorErrorHandler.ts +23 -0
  150. package/src/screenplay/models/ProtractorModalDialogHandler.ts +97 -0
  151. package/src/screenplay/models/ProtractorPage.ts +282 -54
  152. package/src/screenplay/models/ProtractorPageElement.ts +160 -165
  153. package/src/screenplay/models/index.ts +1 -1
  154. package/src/screenplay/models/locators/ProtractorLocator.ts +121 -31
  155. package/src/screenplay/models/locators/ProtractorRootLocator.ts +41 -0
  156. package/src/screenplay/models/locators/index.ts +1 -1
  157. package/src/screenplay/promised.ts +2 -3
  158. package/src/screenplay/questions/ProtractorParam.ts +62 -49
  159. package/src/screenplay/unpromisedWebElement.ts +5 -4
  160. package/tsconfig.build.json +14 -0
  161. package/lib/screenplay/models/ProtractorModalDialog.d.ts +0 -11
  162. package/lib/screenplay/models/ProtractorModalDialog.js +0 -43
  163. package/lib/screenplay/models/ProtractorModalDialog.js.map +0 -1
  164. package/lib/screenplay/models/locators/ProtractorNativeElementRoot.d.ts +0 -5
  165. package/lib/screenplay/models/locators/ProtractorNativeElementRoot.js +0 -3
  166. package/lib/screenplay/models/locators/ProtractorNativeElementRoot.js.map +0 -1
  167. package/src/screenplay/models/ProtractorModalDialog.ts +0 -49
  168. package/src/screenplay/models/locators/ProtractorNativeElementRoot.ts +0 -6
  169. package/tsconfig.eslint.json +0 -10
@@ -2,18 +2,19 @@ import { SerenityConfig } from '@serenity-js/core';
2
2
  import { Config as ProtractorConfig } from 'protractor';
3
3
 
4
4
  /**
5
- * @desc
6
- * Protractor configuration object with an additional
7
- * section to configure the Serenity/JS framework.
5
+ * Protractor configuration object with an additional
6
+ * section to configure the Serenity/JS framework.
8
7
  *
9
- * @public
10
- * @interface
8
+ * ## Learn more
9
+ * - [Protractor config](https://github.com/angular/protractor/blob/master/lib/config.ts)
10
+ * - {@apilink SerenityConfig}
11
+ * - {@apilink configure}
11
12
  *
12
- * @see {@link @serenity-js/core~SerenityConfig}
13
- *
14
- * @see https://github.com/angular/protractor/blob/master/lib/config.ts
15
- * @see {@link @serenity-js/core~configure}
13
+ * @group Configuration
16
14
  */
17
15
  export interface Config extends ProtractorConfig {
16
+ /**
17
+ * See {@apilink SerenityConfig}
18
+ */
18
19
  serenity: SerenityConfig & { runner?: string };
19
20
  }
@@ -1,13 +1,17 @@
1
- import { ArtifactArchiver, Serenity } from '@serenity-js/core';
2
- import { isPlainObject } from 'is-plain-object'; // fails when using default import
1
+ import { AnsiDiffFormatter, ArtifactArchiver, Cast, Serenity } from '@serenity-js/core';
3
2
  import { protractor, Runner } from 'protractor';
4
- import deepmerge = require('deepmerge');
5
- const querySelectorShadowDomPlugin = require('query-selector-shadow-dom/plugins/protractor'); // eslint-disable-line @typescript-eslint/no-var-requires
3
+ import { isRecord } from 'tiny-types/lib/objects';
6
4
 
7
5
  import { BrowserDetector, StandardisedCapabilities } from './browser-detector';
8
6
  import { Config } from './Config';
9
7
  import { ProtractorReport, ProtractorReporter } from './reporter';
10
8
  import { TestRunnerDetector } from './runner';
9
+ import deepmerge = require('deepmerge');
10
+ import { TakeNotes } from '@serenity-js/core';
11
+
12
+ import { BrowseTheWebWithProtractor } from '../screenplay';
13
+
14
+ const querySelectorShadowDomPlugin = require('query-selector-shadow-dom/plugins/protractor'); // eslint-disable-line @typescript-eslint/no-var-requires
11
15
 
12
16
  /**
13
17
  * @private
@@ -21,10 +25,8 @@ export class ProtractorFrameworkAdapter {
21
25
  }
22
26
 
23
27
  /**
24
- * @param {string[]} specs
28
+ * @param specs
25
29
  * Paths to spec files
26
- *
27
- * @return {Promise<ProtractorReport>}
28
30
  */
29
31
  run(specs: string[]): Promise<ProtractorReport> {
30
32
 
@@ -36,12 +38,16 @@ export class ProtractorFrameworkAdapter {
36
38
  const reporter = new ProtractorReporter(this.protractorRunner, runner.successThreshold());
37
39
 
38
40
  const config = deepmerge<Config>(this.defaultConfig(), this.protractorRunner.getConfig(), {
39
- isMergeableObject: isPlainObject,
41
+ isMergeableObject: isRecord,
40
42
  });
41
43
 
42
44
  this.serenity.configure({
43
45
  cueTimeout: config.serenity.cueTimeout,
44
- actors: config.serenity.actors,
46
+ actors: config.serenity.actors || Cast.where(actor => actor.whoCan(
47
+ BrowseTheWebWithProtractor.using(protractor.browser),
48
+ TakeNotes.usingAnEmptyNotepad(),
49
+ )),
50
+ diffFormatter: config.serenity.diffFormatter ?? new AnsiDiffFormatter(),
45
51
  crew: [
46
52
  BrowserDetector.with(StandardisedCapabilities.of(() => protractor.browser)),
47
53
  ...config.serenity.crew,
@@ -53,7 +59,7 @@ export class ProtractorFrameworkAdapter {
53
59
  .then(() => this.protractorRunner.runTestPreparer(TestRunnerDetector.protractorCliOptions()))
54
60
  .then(() => runner.load(specs))
55
61
  .then(() => runner.run())
56
- .then(() => Promise.resolve((config.onComplete || noop)()))
62
+ .then(() => (config.onComplete || noop)())
57
63
  .then(() => reporter.report());
58
64
  }
59
65
 
@@ -1,6 +1,6 @@
1
1
  import { Stage } from '@serenity-js/core';
2
2
  import { AsyncOperationAttempted, AsyncOperationCompleted, DomainEvent, SceneStarts, SceneTagged } from '@serenity-js/core/lib/events';
3
- import { BrowserTag, CorrelationId, Description, PlatformTag } from '@serenity-js/core/lib/model';
3
+ import { BrowserTag, CorrelationId, Description, Name, PlatformTag } from '@serenity-js/core/lib/model';
4
4
  import { StageCrewMember } from '@serenity-js/core/lib/stage';
5
5
 
6
6
  import { StandardisedCapabilities } from './StandardisedCapabilities';
@@ -33,7 +33,8 @@ export class BrowserDetector implements StageCrewMember {
33
33
  const id = CorrelationId.create();
34
34
 
35
35
  this.stage.announce(new AsyncOperationAttempted(
36
- new Description(`[${ this.constructor.name }] Detecting web browser details...`),
36
+ new Name(this.constructor.name),
37
+ new Description(`Detecting web browser details...`),
37
38
  id,
38
39
  this.stage.currentTime(),
39
40
  ));
@@ -59,7 +60,6 @@ export class BrowserDetector implements StageCrewMember {
59
60
  ));
60
61
 
61
62
  this.stage.announce(new AsyncOperationCompleted(
62
- new Description(`[${ this.constructor.name }] Detected web browser details`),
63
63
  id,
64
64
  this.stage.currentTime(),
65
65
  ));
@@ -11,34 +11,33 @@ export class StandardisedCapabilities {
11
11
  constructor(private currentBrowser: () => ProtractorBrowser) {
12
12
  }
13
13
 
14
- browserName(): PromiseLike<string> {
14
+ browserName(): Promise<string | undefined> {
15
15
  return this.get(
16
16
  caps => caps.get('browserName'),
17
17
  );
18
18
  }
19
19
 
20
- browserVersion(): PromiseLike<string> {
21
- return this.get(
20
+ async browserVersion(): Promise<string | undefined> {
21
+ const version = await this.get(
22
22
  caps => caps.get('version'),
23
23
  caps => caps.get('browserVersion'),
24
24
  caps => caps.has('deviceManufacturer') && caps.has('deviceModel')
25
25
  ? `${ caps.get('deviceManufacturer') } ${ caps.get('deviceModel') }`
26
26
  : undefined,
27
27
  caps => caps.has('mobile') && caps.get('mobile').version,
28
- ).
29
- then(version =>
30
- this.get(
31
- caps => !! caps.get('mobileEmulationEnabled') && '(mobile emulation)',
32
- ).then(suffix =>
33
- [
34
- version,
35
- suffix,
36
- ].filter(_ => !!_).join(' '),
37
- ),
38
28
  );
29
+
30
+ const suffix = await this.get(
31
+ caps => !! caps.get('mobileEmulationEnabled') && '(mobile emulation)',
32
+ );
33
+
34
+ return [
35
+ version,
36
+ suffix,
37
+ ].filter(_ => !!_).join(' ');
39
38
  }
40
39
 
41
- platformName(): PromiseLike<string> {
40
+ platformName(): Promise<string | undefined> {
42
41
  return this.get(
43
42
  caps => (!! caps.get('platformName') && ! /any/i.test(caps.get('platformName')))
44
43
  ? caps.get('platformName')
@@ -46,21 +45,22 @@ export class StandardisedCapabilities {
46
45
  );
47
46
  }
48
47
 
49
- platformVersion(): PromiseLike<string> {
48
+ platformVersion(): Promise<string | undefined> {
50
49
  return this.get(
51
50
  caps => caps.get('platformVersion'),
52
51
  );
53
52
  }
54
53
 
55
- private get(...fetchers: Array<(capabilities: Capabilities) => string>): PromiseLike<string> {
56
- return this.currentBrowser().getCapabilities().then(caps => {
57
- for (const fetcher of fetchers) {
58
- const result = fetcher(caps);
59
- if (result) {
60
- return result;
61
- }
54
+ private async get(...fetchers: Array<(capabilities: Capabilities) => string>): Promise<string | undefined> {
55
+ const capabilities = await this.currentBrowser().getCapabilities();
56
+
57
+ for (const fetcher of fetchers) {
58
+ const result = fetcher(capabilities);
59
+ if (result) {
60
+ return result;
62
61
  }
63
- return undefined; // eslint-disable-line unicorn/no-useless-undefined
64
- });
62
+ }
63
+
64
+ return undefined; // eslint-disable-line unicorn/no-useless-undefined
65
65
  }
66
66
  }
@@ -1,3 +1,4 @@
1
+ export * from './Config';
1
2
  export * from './ProtractorFrameworkAdapter';
2
3
  export * from './run';
3
4
  export * from './runner';
@@ -1,13 +1,11 @@
1
1
  import { SpecResult } from 'protractor/built/plugins';
2
2
 
3
3
  /**
4
- * @desc
5
- * A JSON object which needs to be returned to Protractor when {@link ProtractorFrameworkAdapter}
6
- * is done with executing the test scenarios.
4
+ * A JSON object which needs to be returned to Protractor when {@apilink ProtractorFrameworkAdapter}
5
+ * is done with executing the test scenarios.
7
6
  *
8
- * @see https://github.com/angular/protractor/blob/master/lib/frameworks/README.md
9
- *
10
- * @private
7
+ * ## Learn more
8
+ * - [Protractor Custom Frameworks Readme](https://github.com/angular/protractor/blob/master/lib/frameworks/README.md)
11
9
  */
12
10
  export interface ProtractorReport {
13
11
  /**
@@ -1,6 +1,6 @@
1
- import { Stage } from '@serenity-js/core';
1
+ import { Stage, Timestamp } from '@serenity-js/core';
2
2
  import { AsyncOperationAttempted, AsyncOperationCompleted, AsyncOperationFailed, DomainEvent, SceneFinished, SceneFinishes, SceneStarts } from '@serenity-js/core/lib/events';
3
- import { CorrelationId, Description, ExecutionSkipped, Outcome, ProblemIndication, Timestamp } from '@serenity-js/core/lib/model';
3
+ import { CorrelationId, Description, ExecutionSkipped, Name, Outcome, ProblemIndication } from '@serenity-js/core/lib/model';
4
4
  import { StageCrewMember } from '@serenity-js/core/lib/stage';
5
5
  import { Runner } from 'protractor';
6
6
 
@@ -85,29 +85,29 @@ export class ProtractorReporter implements StageCrewMember {
85
85
  });
86
86
  }
87
87
 
88
- private afterEach(): PromiseLike<void> {
88
+ private async afterEach(): Promise<void> {
89
89
  if (! this.runner.afterEach) {
90
- return Promise.resolve();
90
+ return;
91
91
  }
92
92
 
93
93
  const id = CorrelationId.create();
94
94
 
95
95
  this.stage.announce(new AsyncOperationAttempted(
96
- new Description(`[${ this.constructor.name }] Invoking ProtractorRunner.afterEach...`),
96
+ new Name(this.constructor.name),
97
+ new Description(`Invoking ProtractorRunner.afterEach...`),
97
98
  id,
98
99
  this.stage.currentTime(),
99
100
  ));
100
101
 
101
- return Promise.resolve(this.runner.afterEach() as PromiseLike<void> | undefined)
102
- .then(
103
- () =>
104
- this.stage.announce(new AsyncOperationCompleted(
105
- new Description(`[${ this.constructor.name }] ProtractorRunner.afterEach succeeded`),
106
- id,
107
- this.stage.currentTime(),
108
- )),
109
- error =>
110
- this.stage.announce(new AsyncOperationFailed(error, id, this.stage.currentTime())),
111
- );
102
+ try {
103
+ await this.runner.afterEach();
104
+
105
+ this.stage.announce(new AsyncOperationCompleted(
106
+ id,
107
+ this.stage.currentTime(),
108
+ ));
109
+ } catch (error) {
110
+ this.stage.announce(new AsyncOperationFailed(error, id, this.stage.currentTime()));
111
+ }
112
112
  }
113
113
  }
@@ -9,11 +9,13 @@ import { ProtractorReport } from './reporter';
9
9
  import { TestRunnerDetector, TestRunnerLoader } from './runner';
10
10
 
11
11
  /**
12
- * @param {protractor~Runner} runner
13
- * @param {string[]} specs
14
- * @returns {Promise<ProtractorReport>}
12
+ * ## Learn more
13
+ * - [Protractor framework adapters](https://github.com/angular/protractor/blob/master/lib/frameworks/README.md#framework-adapters-for-protractor)
15
14
  *
16
- * @see https://github.com/angular/protractor/blob/master/lib/frameworks/README.md#framework-adapters-for-protractor
15
+ * @param runner
16
+ * @param specs
17
+ *
18
+ * @group Integration
17
19
  */
18
20
  export function run(runner: Runner, specs: string[]): Promise<ProtractorReport> {
19
21
  const cwd = Path.from(runner.getConfig().configDir);
@@ -1,21 +1,16 @@
1
1
  /**
2
- * @public
3
- * @interface
2
+ * @group Integration
4
3
  */
5
4
  export interface CucumberAdapterConfig {
5
+
6
6
  /**
7
- * @desc
8
- * Instruct Serenity/JS Cucumber Adapter to take over the stdout output of native Cucumber reporters to prevent them from clobbering the log
9
- *
10
- * @type {boolean}
7
+ * Instruct Serenity/JS Cucumber Adapter to take over the `stdout` output
8
+ * of native Cucumber reporters to prevent them from clobbering the log.
11
9
  */
12
10
  useStandardOutput: boolean;
13
11
 
14
12
  /**
15
- * @desc
16
- * Add `runnerId` to names of output files produced by native Cucumber.js formatters
17
- *
18
- * @type {boolean}
13
+ * Add `runnerId` to names of output files produced by native Cucumber.js formatters
19
14
  */
20
15
  uniqueFormatterOutputs: boolean;
21
16
  }
@@ -1,14 +1,13 @@
1
- import { TestRunnerAdapter } from '@serenity-js/core/lib/io';
1
+ import { TestRunnerAdapter } from '@serenity-js/core/lib/adapter';
2
2
  import { Config as ProtractorConfig } from 'protractor';
3
3
 
4
4
  import { TestRunnerLoader } from './TestRunnerLoader';
5
5
 
6
6
  /**
7
- * @desc
8
- * Detects the {@link @serenity-js/core/lib/io~TestRunnerAdapter} to use,
9
- * based on Protractor configuration.
7
+ * Detects the {@apilink TestRunnerAdapter} to use,
8
+ * based on Protractor configuration.
10
9
  *
11
- * @public
10
+ * @group Integration
12
11
  */
13
12
  export class TestRunnerDetector {
14
13
 
@@ -24,16 +23,9 @@ export class TestRunnerDetector {
24
23
  ];
25
24
  }
26
25
 
27
- /**
28
- * @param {TestRunnerLoader} testRunnerLoader
29
- */
30
26
  constructor(private readonly testRunnerLoader: TestRunnerLoader) {
31
27
  }
32
28
 
33
- /**
34
- * @param {protractor~ProtractorConfig} config
35
- * @returns {TestRunnerAdapter}
36
- */
37
29
  runnerFor(config: ProtractorConfig): TestRunnerAdapter {
38
30
 
39
31
  const
@@ -53,7 +45,7 @@ export class TestRunnerDetector {
53
45
  return this.useCucumber(config);
54
46
  case !! config.mochaOpts:
55
47
  return this.useMocha(config);
56
- case !! config.jasmineNodeOpts:
48
+ case !! config.jasmineNodeOpts: // eslint-disable-line unicorn/no-useless-switch-case
57
49
  default:
58
50
  return this.useJasmine(config);
59
51
  }
@@ -1,15 +1,15 @@
1
1
  /* eslint-disable unicorn/prevent-abbreviations,@typescript-eslint/ban-types */
2
- import { Config, FileFinder, FileSystem, ModuleLoader, Path, TestRunnerAdapter } from '@serenity-js/core/lib/io';
3
- import { CucumberConfig } from '@serenity-js/cucumber/lib/cli';
2
+ import { TestRunnerAdapter } from '@serenity-js/core/lib/adapter';
3
+ import { Config, FileFinder, FileSystem, ModuleLoader, Path } from '@serenity-js/core/lib/io';
4
+ import { CucumberConfig } from '@serenity-js/cucumber/lib/adapter';
4
5
 
5
6
  import { CucumberAdapterConfig } from './CucumberAdapterConfig';
6
7
 
7
8
  /**
8
- * @desc
9
- * Loads a {@link @serenity-js/core/lib/io~TestRunnerAdapter}, needed to invoke
10
- * the chosen test runner programmatically.
9
+ * Loads a {@apilink TestRunnerAdapter} needed to invoke
10
+ * the chosen test runner programmatically.
11
11
  *
12
- * @public
12
+ * @group Integration
13
13
  */
14
14
  export class TestRunnerLoader {
15
15
 
@@ -18,14 +18,14 @@ export class TestRunnerLoader {
18
18
  private readonly finder: FileFinder;
19
19
 
20
20
  /**
21
- * @param {@serenity-js/core/lib/io~Path} cwd
21
+ * @param cwd
22
22
  * Current working directory; used to resolve glob paths to files for Cucumber.js to `require`,
23
23
  * and instructing Serenity/JS where to look for this module's optional
24
- * dependencies, like [`@serenity-js/cucumber`](/modules/cucumber),
25
- * [`@serenity-js/mocha`](/modules/mocha),
26
- * [`@serenity-js/jasmine`](/modules/jasmine), etc.
24
+ * dependencies, like [`@serenity-js/cucumber`](/api/cucumber),
25
+ * [`@serenity-js/mocha`](/api/mocha),
26
+ * [`@serenity-js/jasmine`](/api/jasmine), etc.
27
27
  *
28
- * @param {number | string} runnerId
28
+ * @param runnerId
29
29
  * Unique identifier used to differentiate output files produced by native Cucumber.js formatters.
30
30
  * For example, `process.pid`
31
31
  */
@@ -36,8 +36,9 @@ export class TestRunnerLoader {
36
36
  }
37
37
 
38
38
  /**
39
- * @param {@serenity-js/jasmine/lib/adapter~JasmineConfig} jasmineNodeOpts
40
- * @returns {@serenity-js/core/lib/io~TestRunnerAdapter}
39
+ * See {@apilink JasmineConfig}
40
+ *
41
+ * @param jasmineNodeOpts
41
42
  */
42
43
  forJasmine(jasmineNodeOpts: object /* JasmineConfig */): TestRunnerAdapter {
43
44
  const { JasmineAdapter } = this.moduleLoader.require('@serenity-js/jasmine/lib/adapter')
@@ -45,8 +46,9 @@ export class TestRunnerLoader {
45
46
  }
46
47
 
47
48
  /**
48
- * @param {@serenity-js/mocha/lib/adapter~MochaConfig} mochaOpts
49
- * @returns {@serenity-js/core/lib/io~TestRunnerAdapter}
49
+ * See {@apilink MochaConfig}
50
+ *
51
+ * @param mochaOpts
50
52
  */
51
53
  forMocha(mochaOpts: object /* MochaConfig */): TestRunnerAdapter {
52
54
  const { MochaAdapter } = this.moduleLoader.require('@serenity-js/mocha/lib/adapter')
@@ -54,13 +56,13 @@ export class TestRunnerLoader {
54
56
  }
55
57
 
56
58
  /**
59
+ * See {@apilink CucumberConfig}
57
60
  *
58
- * @param {@serenity-js/cucumber/lib/cli~CucumberConfig} cucumberOpts
59
- * @param {CucumberAdapterConfig} adapterConfig
60
- * @returns {@serenity-js/core/lib/io~TestRunnerAdapter}
61
+ * @param cucumberOpts
62
+ * @param adapterConfig
61
63
  */
62
64
  forCucumber(cucumberOpts: object /* CucumberConfig */, adapterConfig: CucumberAdapterConfig): TestRunnerAdapter {
63
- const { CucumberCLIAdapter, CucumberFormat, StandardOutput, TempFileOutput } = this.moduleLoader.require('@serenity-js/cucumber/lib/cli');
65
+ const { CucumberCLIAdapter, CucumberFormat, StandardOutput, TempFileOutput } = this.moduleLoader.require('@serenity-js/cucumber/lib/adapter');
64
66
 
65
67
  const config = new Config<CucumberConfig>(cucumberOpts)
66
68
  .where('require', requires =>