UNPKG

@serenity-js/core

Version:

The core Serenity/JS framework, providing the Screenplay Pattern interfaces, as well as the test reporting and integration infrastructure

91 lines 5.24 kB
import type { UsesAbilities } from './abilities'; import { Activity } from './Activity'; import type { Answerable } from './Answerable'; import type { CollectsArtifacts } from './artifacts'; import type { AnswersQuestions } from './questions'; /** * **Interactions** are low-level [activities](https://serenity-js.org/api/core/class/Activity/) that encapsulate * a handful of instructions for an [actor](https://serenity-js.org/api/core/class/Actor/) on how to use their [abilities](https://serenity-js.org/api/core/class/Ability/) * to perform an individual interaction with the given interface of the system under test. * * :::tip Tasks or interactions? * Because of their low-level nature, interactions are named using the vocabulary of the [solution domain](https://blog.mattwynne.net/2013/01/17/the-problem-with-solutions/), * and represent an individual interaction with the given interface, e.g. [`Click`](https://serenity-js.org/api/web/class/Click/), [`Enter`](https://serenity-js.org/api/web/class/Enter/), or [`Send`](https://serenity-js.org/api/rest/class/Send/). * * Interactions follow the [Single Responsibility Principle](https://en.wikipedia.org/wiki/Single_responsibility_principle) which means that they do _one thing and one thing only_. * If you're considering implementing an "interaction" that performs more than one logical activity, e.g. checks if the button is visible and then clicks on it if is, * consider using separate interactions for separate responsibilities and then composing them using a [task](https://serenity-js.org/api/core/class/Task/). * ::: * * Interactions are the core building block of the [Screenplay Pattern](https://serenity-js.org/handbook/design/screenplay-pattern), * along with [actors](https://serenity-js.org/api/core/class/Actor/), [abilities](https://serenity-js.org/api/core/class/Ability/), [questions](https://serenity-js.org/api/core/class/Question/), and [tasks](https://serenity-js.org/api/core/class/Task/). * * ![Screenplay Pattern](https://serenity-js.org/images/design/serenity-js-screenplay-pattern.png) * * Learn more about: * - [`Actor`](https://serenity-js.org/api/core/class/Actor/) * - [Abilities](https://serenity-js.org/api/core/class/Ability/) * - [Activities](https://serenity-js.org/api/core/class/Activity/) * * ## Writing a custom interaction * * [Serenity/JS modules](https://serenity-js.org/handbook/architecture/) ship with dozens of interactions to help you compose your test scenarios. * However, if you need to interact with a non-standard interface, or want to create a flavour of a given interaction that behaves slightly differently than the built-in version, * you can easily create your own implementations using the [`Interaction.where`](https://serenity-js.org/api/core/class/Interaction/#where) factory method. * * ```ts * import { Actor, Interaction, the } from '@serenity-js/core' * import { BrowseTheWeb, Page } from '@serenity-js/web' * * export const ClearLocalStorage = () => * Interaction.where(the`#actor clears local storage`, async (actor: Actor) => { * // Interaction to ClearLocalStorage directly uses Actor's ability to BrowseTheWeb * const page: Page = await BrowseTheWeb.as(actor).currentPage() * await page.executeScript(() => window.localStorage.clear()) * }) * ``` * * ## Using a custom interaction * * ```ts * import { actorCalled } from '@serenity-js/core'; * import { BrowseTheWebWithPlaywright } from '@serenity-js/playwright' * import { By, Navigate, PageElement } from '@serenity-js/web' * import { Ensure, equals } from '@serenity-js/assertions' * import { Browser, chromium } from 'playwright' * * const browser = await chromium.launch({ headless: true }) * * await actorCalled('Inês') * .whoCan(BrowseTheWebWithPlaywright.using(browser)) * .attemptsTo( * Navigate.to(`https://serenity-js.org`), * ClearLocalStorage(), // reported as "Inês clears local storage" * ) * ``` * * @group Screenplay Pattern */ export declare abstract class Interaction extends Activity { /** * @param description * Description to be used when reporting this interaction, for example `#actor clears local storage`. * Note that `#actor` will be replaced with the name of the actor performing this interaction. * * @param interaction */ static where(description: Answerable<string>, interaction: (actor: UsesAbilities & AnswersQuestions & CollectsArtifacts) => Promise<void> | void): Interaction; /** * Instructs the provided [`Actor`](https://serenity-js.org/api/core/class/Actor/) to perform this [`Interaction`](https://serenity-js.org/api/core/class/Interaction/). * * #### Learn more * - [`Actor`](https://serenity-js.org/api/core/class/Actor/) * - [`PerformsActivities`](https://serenity-js.org/api/core/interface/PerformsActivities/) * - [`UsesAbilities`](https://serenity-js.org/api/core/interface/UsesAbilities/) * - [`AnswersQuestions`](https://serenity-js.org/api/core/interface/AnswersQuestions/) * * @param actor */ abstract performAs(actor: UsesAbilities & AnswersQuestions): Promise<void>; } //# sourceMappingURL=Interaction.d.ts.map