@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.
- package/CHANGELOG.md +144 -2236
- package/README.md +39 -26
- package/lib/adapter/Config.d.ts +11 -9
- package/lib/adapter/Config.d.ts.map +1 -0
- package/lib/adapter/ProtractorFrameworkAdapter.d.ts +2 -3
- package/lib/adapter/ProtractorFrameworkAdapter.d.ts.map +1 -0
- package/lib/adapter/ProtractorFrameworkAdapter.js +11 -10
- package/lib/adapter/ProtractorFrameworkAdapter.js.map +1 -1
- package/lib/adapter/browser-detector/BrowserDetector.d.ts +1 -0
- package/lib/adapter/browser-detector/BrowserDetector.d.ts.map +1 -0
- package/lib/adapter/browser-detector/BrowserDetector.js +5 -5
- package/lib/adapter/browser-detector/BrowserDetector.js.map +1 -1
- package/lib/adapter/browser-detector/StandardisedCapabilities.d.ts +5 -4
- package/lib/adapter/browser-detector/StandardisedCapabilities.d.ts.map +1 -0
- package/lib/adapter/browser-detector/StandardisedCapabilities.js +17 -17
- package/lib/adapter/browser-detector/StandardisedCapabilities.js.map +1 -1
- package/lib/adapter/browser-detector/index.d.ts +1 -0
- package/lib/adapter/browser-detector/index.d.ts.map +1 -0
- package/lib/adapter/browser-detector/index.js +5 -1
- package/lib/adapter/browser-detector/index.js.map +1 -1
- package/lib/adapter/index.d.ts +2 -0
- package/lib/adapter/index.d.ts.map +1 -0
- package/lib/adapter/index.js +6 -1
- package/lib/adapter/index.js.map +1 -1
- package/lib/adapter/reporter/ProtractorReport.d.ts +5 -6
- package/lib/adapter/reporter/ProtractorReport.d.ts.map +1 -0
- package/lib/adapter/reporter/ProtractorReporter.d.ts +1 -0
- package/lib/adapter/reporter/ProtractorReporter.d.ts.map +1 -0
- package/lib/adapter/reporter/ProtractorReporter.js +10 -5
- package/lib/adapter/reporter/ProtractorReporter.js.map +1 -1
- package/lib/adapter/reporter/index.d.ts +1 -0
- package/lib/adapter/reporter/index.d.ts.map +1 -0
- package/lib/adapter/reporter/index.js +5 -1
- package/lib/adapter/reporter/index.js.map +1 -1
- package/lib/adapter/run.d.ts +7 -4
- package/lib/adapter/run.d.ts.map +1 -0
- package/lib/adapter/run.js +6 -4
- package/lib/adapter/run.js.map +1 -1
- package/lib/adapter/runner/CucumberAdapterConfig.d.ts +5 -10
- package/lib/adapter/runner/CucumberAdapterConfig.d.ts.map +1 -0
- package/lib/adapter/runner/TestRunnerDetector.d.ts +5 -12
- package/lib/adapter/runner/TestRunnerDetector.d.ts.map +1 -0
- package/lib/adapter/runner/TestRunnerDetector.js +7 -15
- package/lib/adapter/runner/TestRunnerDetector.js.map +1 -1
- package/lib/adapter/runner/TestRunnerLoader.d.ts +20 -17
- package/lib/adapter/runner/TestRunnerLoader.d.ts.map +1 -0
- package/lib/adapter/runner/TestRunnerLoader.js +18 -18
- package/lib/adapter/runner/TestRunnerLoader.js.map +1 -1
- package/lib/adapter/runner/index.d.ts +1 -0
- package/lib/adapter/runner/index.d.ts.map +1 -0
- package/lib/adapter/runner/index.js +5 -1
- package/lib/adapter/runner/index.js.map +1 -1
- package/lib/index.d.ts +1 -0
- package/lib/index.d.ts.map +1 -0
- package/lib/index.js +5 -1
- package/lib/index.js.map +1 -1
- package/lib/screenplay/abilities/BrowseTheWebWithProtractor.d.ts +62 -300
- package/lib/screenplay/abilities/BrowseTheWebWithProtractor.d.ts.map +1 -0
- package/lib/screenplay/abilities/BrowseTheWebWithProtractor.js +62 -422
- package/lib/screenplay/abilities/BrowseTheWebWithProtractor.js.map +1 -1
- package/lib/screenplay/abilities/index.d.ts +1 -0
- package/lib/screenplay/abilities/index.d.ts.map +1 -0
- package/lib/screenplay/abilities/index.js +5 -1
- package/lib/screenplay/abilities/index.js.map +1 -1
- package/lib/screenplay/index.d.ts +1 -0
- package/lib/screenplay/index.d.ts.map +1 -0
- package/lib/screenplay/index.js +5 -1
- package/lib/screenplay/index.js.map +1 -1
- package/lib/screenplay/interactions/UseAngular.d.ts +53 -48
- package/lib/screenplay/interactions/UseAngular.d.ts.map +1 -0
- package/lib/screenplay/interactions/UseAngular.js +52 -42
- package/lib/screenplay/interactions/UseAngular.js.map +1 -1
- package/lib/screenplay/interactions/index.d.ts +1 -0
- package/lib/screenplay/interactions/index.d.ts.map +1 -0
- package/lib/screenplay/interactions/index.js +5 -1
- package/lib/screenplay/interactions/index.js.map +1 -1
- package/lib/screenplay/models/ProtractorBrowsingSession.d.ts +22 -0
- package/lib/screenplay/models/ProtractorBrowsingSession.d.ts.map +1 -0
- package/lib/screenplay/models/ProtractorBrowsingSession.js +99 -0
- package/lib/screenplay/models/ProtractorBrowsingSession.js.map +1 -0
- package/lib/screenplay/models/ProtractorCookie.d.ts +6 -0
- package/lib/screenplay/models/ProtractorCookie.d.ts.map +1 -0
- package/lib/screenplay/models/ProtractorCookie.js +8 -3
- package/lib/screenplay/models/ProtractorCookie.js.map +1 -1
- package/lib/screenplay/models/ProtractorErrorHandler.d.ts +8 -0
- package/lib/screenplay/models/ProtractorErrorHandler.d.ts.map +1 -0
- package/lib/screenplay/models/ProtractorErrorHandler.js +23 -0
- package/lib/screenplay/models/ProtractorErrorHandler.js.map +1 -0
- package/lib/screenplay/models/ProtractorModalDialogHandler.d.ts +25 -0
- package/lib/screenplay/models/ProtractorModalDialogHandler.d.ts.map +1 -0
- package/lib/screenplay/models/ProtractorModalDialogHandler.js +74 -0
- package/lib/screenplay/models/ProtractorModalDialogHandler.js.map +1 -0
- package/lib/screenplay/models/ProtractorPage.d.ts +58 -6
- package/lib/screenplay/models/ProtractorPage.d.ts.map +1 -0
- package/lib/screenplay/models/ProtractorPage.js +221 -44
- package/lib/screenplay/models/ProtractorPage.js.map +1 -1
- package/lib/screenplay/models/ProtractorPageElement.d.ts +10 -1
- package/lib/screenplay/models/ProtractorPageElement.d.ts.map +1 -0
- package/lib/screenplay/models/ProtractorPageElement.js +141 -147
- package/lib/screenplay/models/ProtractorPageElement.js.map +1 -1
- package/lib/screenplay/models/index.d.ts +2 -1
- package/lib/screenplay/models/index.d.ts.map +1 -0
- package/lib/screenplay/models/index.js +6 -2
- package/lib/screenplay/models/index.js.map +1 -1
- package/lib/screenplay/models/locators/ProtractorLocator.d.ts +21 -8
- package/lib/screenplay/models/locators/ProtractorLocator.d.ts.map +1 -0
- package/lib/screenplay/models/locators/ProtractorLocator.js +107 -10
- package/lib/screenplay/models/locators/ProtractorLocator.js.map +1 -1
- package/lib/screenplay/models/locators/ProtractorRootLocator.d.ts +17 -0
- package/lib/screenplay/models/locators/ProtractorRootLocator.d.ts.map +1 -0
- package/lib/screenplay/models/locators/ProtractorRootLocator.js +38 -0
- package/lib/screenplay/models/locators/ProtractorRootLocator.js.map +1 -0
- package/lib/screenplay/models/locators/index.d.ts +2 -1
- package/lib/screenplay/models/locators/index.d.ts.map +1 -0
- package/lib/screenplay/models/locators/index.js +6 -2
- package/lib/screenplay/models/locators/index.js.map +1 -1
- package/lib/screenplay/promised.d.ts +3 -3
- package/lib/screenplay/promised.d.ts.map +1 -0
- package/lib/screenplay/promised.js +2 -3
- package/lib/screenplay/promised.js.map +1 -1
- package/lib/screenplay/questions/ProtractorParam.d.ts +64 -51
- package/lib/screenplay/questions/ProtractorParam.d.ts.map +1 -0
- package/lib/screenplay/questions/ProtractorParam.js +59 -47
- package/lib/screenplay/questions/ProtractorParam.js.map +1 -1
- package/lib/screenplay/questions/index.d.ts +1 -0
- package/lib/screenplay/questions/index.d.ts.map +1 -0
- package/lib/screenplay/questions/index.js +5 -1
- package/lib/screenplay/questions/index.js.map +1 -1
- package/lib/screenplay/unpromisedWebElement.d.ts +6 -4
- package/lib/screenplay/unpromisedWebElement.d.ts.map +1 -0
- package/lib/screenplay/unpromisedWebElement.js +5 -4
- package/lib/screenplay/unpromisedWebElement.js.map +1 -1
- package/package.json +36 -60
- package/src/adapter/Config.ts +10 -9
- package/src/adapter/ProtractorFrameworkAdapter.ts +16 -10
- package/src/adapter/browser-detector/BrowserDetector.ts +3 -3
- package/src/adapter/browser-detector/StandardisedCapabilities.ts +24 -24
- package/src/adapter/index.ts +1 -0
- package/src/adapter/reporter/ProtractorReport.ts +4 -6
- package/src/adapter/reporter/ProtractorReporter.ts +16 -16
- package/src/adapter/run.ts +6 -4
- package/src/adapter/runner/CucumberAdapterConfig.ts +5 -10
- package/src/adapter/runner/TestRunnerDetector.ts +5 -13
- package/src/adapter/runner/TestRunnerLoader.ts +21 -19
- package/src/screenplay/abilities/BrowseTheWebWithProtractor.ts +63 -480
- package/src/screenplay/interactions/UseAngular.ts +55 -44
- package/src/screenplay/models/ProtractorBrowsingSession.ts +133 -0
- package/src/screenplay/models/ProtractorCookie.ts +8 -3
- package/src/screenplay/models/ProtractorErrorHandler.ts +23 -0
- package/src/screenplay/models/ProtractorModalDialogHandler.ts +97 -0
- package/src/screenplay/models/ProtractorPage.ts +282 -54
- package/src/screenplay/models/ProtractorPageElement.ts +160 -165
- package/src/screenplay/models/index.ts +1 -1
- package/src/screenplay/models/locators/ProtractorLocator.ts +121 -31
- package/src/screenplay/models/locators/ProtractorRootLocator.ts +41 -0
- package/src/screenplay/models/locators/index.ts +1 -1
- package/src/screenplay/promised.ts +2 -3
- package/src/screenplay/questions/ProtractorParam.ts +62 -49
- package/src/screenplay/unpromisedWebElement.ts +5 -4
- package/tsconfig.build.json +14 -0
- package/lib/screenplay/models/ProtractorModalDialog.d.ts +0 -11
- package/lib/screenplay/models/ProtractorModalDialog.js +0 -43
- package/lib/screenplay/models/ProtractorModalDialog.js.map +0 -1
- package/lib/screenplay/models/locators/ProtractorNativeElementRoot.d.ts +0 -5
- package/lib/screenplay/models/locators/ProtractorNativeElementRoot.js +0 -3
- package/lib/screenplay/models/locators/ProtractorNativeElementRoot.js.map +0 -1
- package/src/screenplay/models/ProtractorModalDialog.ts +0 -49
- package/src/screenplay/models/locators/ProtractorNativeElementRoot.ts +0 -6
- package/tsconfig.eslint.json +0 -10
package/src/adapter/Config.ts
CHANGED
|
@@ -2,18 +2,19 @@ import { SerenityConfig } from '@serenity-js/core';
|
|
|
2
2
|
import { Config as ProtractorConfig } from 'protractor';
|
|
3
3
|
|
|
4
4
|
/**
|
|
5
|
-
*
|
|
6
|
-
*
|
|
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
|
-
*
|
|
10
|
-
*
|
|
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
|
-
* @
|
|
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
|
|
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
|
|
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:
|
|
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(() =>
|
|
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
|
|
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():
|
|
14
|
+
browserName(): Promise<string | undefined> {
|
|
15
15
|
return this.get(
|
|
16
16
|
caps => caps.get('browserName'),
|
|
17
17
|
);
|
|
18
18
|
}
|
|
19
19
|
|
|
20
|
-
browserVersion():
|
|
21
|
-
|
|
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():
|
|
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():
|
|
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>):
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
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
|
-
|
|
64
|
-
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
return undefined; // eslint-disable-line unicorn/no-useless-undefined
|
|
65
65
|
}
|
|
66
66
|
}
|
package/src/adapter/index.ts
CHANGED
|
@@ -1,13 +1,11 @@
|
|
|
1
1
|
import { SpecResult } from 'protractor/built/plugins';
|
|
2
2
|
|
|
3
3
|
/**
|
|
4
|
-
* @
|
|
5
|
-
*
|
|
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
|
-
*
|
|
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
|
|
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():
|
|
88
|
+
private async afterEach(): Promise<void> {
|
|
89
89
|
if (! this.runner.afterEach) {
|
|
90
|
-
return
|
|
90
|
+
return;
|
|
91
91
|
}
|
|
92
92
|
|
|
93
93
|
const id = CorrelationId.create();
|
|
94
94
|
|
|
95
95
|
this.stage.announce(new AsyncOperationAttempted(
|
|
96
|
-
new
|
|
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
|
-
|
|
102
|
-
.
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
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
|
}
|
package/src/adapter/run.ts
CHANGED
|
@@ -9,11 +9,13 @@ import { ProtractorReport } from './reporter';
|
|
|
9
9
|
import { TestRunnerDetector, TestRunnerLoader } from './runner';
|
|
10
10
|
|
|
11
11
|
/**
|
|
12
|
-
*
|
|
13
|
-
*
|
|
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
|
-
* @
|
|
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
|
-
* @
|
|
3
|
-
* @interface
|
|
2
|
+
* @group Integration
|
|
4
3
|
*/
|
|
5
4
|
export interface CucumberAdapterConfig {
|
|
5
|
+
|
|
6
6
|
/**
|
|
7
|
-
*
|
|
8
|
-
*
|
|
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
|
-
*
|
|
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/
|
|
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
|
-
* @
|
|
8
|
-
*
|
|
9
|
-
* based on Protractor configuration.
|
|
7
|
+
* Detects the {@apilink TestRunnerAdapter} to use,
|
|
8
|
+
* based on Protractor configuration.
|
|
10
9
|
*
|
|
11
|
-
* @
|
|
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 {
|
|
3
|
-
import {
|
|
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
|
-
* @
|
|
9
|
-
*
|
|
10
|
-
* the chosen test runner programmatically.
|
|
9
|
+
* Loads a {@apilink TestRunnerAdapter} needed to invoke
|
|
10
|
+
* the chosen test runner programmatically.
|
|
11
11
|
*
|
|
12
|
-
* @
|
|
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
|
|
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`](/
|
|
25
|
-
* [`@serenity-js/mocha`](/
|
|
26
|
-
* [`@serenity-js/jasmine`](/
|
|
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
|
|
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
|
-
*
|
|
40
|
-
*
|
|
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
|
-
*
|
|
49
|
-
*
|
|
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
|
|
59
|
-
* @param
|
|
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/
|
|
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 =>
|