@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
109 lines • 3.73 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.BrowseTheWebWithProtractor = void 0;
const core_1 = require("@serenity-js/core");
const web_1 = require("@serenity-js/web");
const models_1 = require("../models");
/**
* This implementation of the [ability](https://serenity-js.org/api/core/class/Ability/) to [`BrowseTheWeb`](https://serenity-js.org/api/web/class/BrowseTheWeb/)
* enables the [`Actor`](https://serenity-js.org/api/core/class/Actor/) to interact with web front-ends using [Protractor](http://www.protractortest.org/#/).
*
* ## Using Protractor to `BrowseTheWeb`
*
* ```ts
* import { actorCalled } from '@serenity-js/core'
* import { BrowseTheWebWithProtractor } from '@serenity-js/protractor
* import { By, Navigate, PageElement, Text } from '@serenity-js/web'
* import { Ensure, equals } from '@serenity-js/assertions'
* import { protractor } from 'protractor'
*
* const HomePage = {
* title: () =>
* PageElement.located(By.css('h1')).describedAs('title')
* }
*
* await actorCalled('Wendy')
* .whoCan(BrowseTheWebWithProtractor.using(protractor.browser))
* .attemptsTo(
* Navigate.to(`https://serenity-js.org`),
* Ensure.that(Text.of(HomePage.title()), equals('Serenity/JS')),
* )
* ```
*
* ## Learn more
* - [Protractor website](https://www.protractortest.org/)
* - [`BrowseTheWeb`](https://serenity-js.org/api/web/class/BrowseTheWeb/)
* - [`Ability`](https://serenity-js.org/api/core/class/Ability/)
* - [`Actor`](https://serenity-js.org/api/core/class/Actor/)
*
* @group Abilities
*/
class BrowseTheWebWithProtractor extends web_1.BrowseTheWeb {
browser;
/**
* Ability to interact with web front-ends using
* provided protractor browser instance.
*
* @param {protractor~ProtractorBrowser} browser
*
* #### Learn more
* - [Protractor Browser API docs](http://www.protractortest.org/#/api?view=ProtractorBrowser)
*/
static using(browser) {
return new BrowseTheWebWithProtractor(browser);
}
/**
* @param browser
* An instance of a protractor browser
*/
constructor(browser) {
super(new models_1.ProtractorBrowsingSession(browser));
this.browser = browser;
}
/**
* Returns Protractor configuration parameter at `path`.
*
* #### Configuring a custom parameter
*
* ```js
* // protractor.conf.js
* exports.config = {
* params: {
* login: {
* username: 'jane@example.org'
* password: process.env.PASSWORD
* }
* }
* // ...
* }
* ```
*
* #### Retrieving config param by name
* ```js
* BrowseTheWebWithProtractor.as(actor).param('login')
* // returns object with username and password
* ```
*
* #### Retrieving config param by path
* ```js
* BrowseTheWeb.as(actor).param('login.username')
* // returns string 'jane@example.org'
*
* @param path
* Either a name or a dot-delimited path to the param.
*
* @throws [`ConfigurationError`](https://serenity-js.org/api/core/class/ConfigurationError/)
* Throws a `ConfigurationError` if the parameter is `undefined`
*/
param(path) {
return path.split('.')
.reduce((config, segment) => {
if (!(config && config[segment] !== undefined)) {
throw new core_1.ConfigurationError(`Protractor param '${path}' is undefined`);
}
return config[segment];
}, this.browser.params);
}
}
exports.BrowseTheWebWithProtractor = BrowseTheWebWithProtractor;
//# sourceMappingURL=BrowseTheWebWithProtractor.js.map