UNPKG

@serenity-js/protractor

Version:

Adapter that integrates @serenity-js/web with Protractor, enabling Serenity/JS reporting and using the Screenplay Pattern to write end-to-end test scenarios

71 lines (59 loc) 2.49 kB
import type { Stage } from '@serenity-js/core'; import type { DomainEvent} from '@serenity-js/core/lib/events'; import { AsyncOperationAttempted, AsyncOperationCompleted, SceneStarts, SceneTagged } from '@serenity-js/core/lib/events'; import { BrowserTag, CorrelationId, Description, Name, PlatformTag } from '@serenity-js/core/lib/model'; import type { StageCrewMember } from '@serenity-js/core/lib/stage'; import type { StandardisedCapabilities } from './StandardisedCapabilities'; /** * @private * * @see https://github.com/serenity-js/serenity-js/issues/455 * @see https://github.com/serenity-bdd/serenity-core/pull/1860/files * @see https://github.com/serenity-js/serenity-js/issues/132 */ export class BrowserDetector implements StageCrewMember { static with(capabilities: StandardisedCapabilities): BrowserDetector { return new BrowserDetector(capabilities); } constructor( private readonly capabilities: StandardisedCapabilities, private stage?: Stage, ) { } assignedTo(stage: Stage): StageCrewMember { return new BrowserDetector(this.capabilities, stage); } notifyOf(event: DomainEvent): void { if (event instanceof SceneStarts) { const id = CorrelationId.create(); this.stage.announce(new AsyncOperationAttempted( new Name(this.constructor.name), new Description(`Detecting web browser details...`), id, this.stage.currentTime(), )); Promise.all([ this.capabilities.browserName(), this.capabilities.browserVersion(), this.capabilities.platformName(), this.capabilities.platformVersion(), ]). then(([browserName, browserVersion, platformName, platformVersion]) => { this.stage.announce(new SceneTagged( event.sceneId, new BrowserTag(browserName, browserVersion), this.stage.currentTime(), )); this.stage.announce(new SceneTagged( event.sceneId, new PlatformTag(platformName, platformVersion), this.stage.currentTime(), )); this.stage.announce(new AsyncOperationCompleted( id, this.stage.currentTime(), )); }); } } }