Skip to main content

Multi-actor scenarios

The Screenplay Pattern is particularly useful when modelling interactions between multiple actors, each with their own responsibilities, and playing their role in the workflow. Examples include a buyer and a seller in an e-commerce scenario, a customer and a support agent in a customer service scenario, or a doctor and a patient in a healthcare scenario.

Using multiple actors in a scenario

To inject multiple actors into your test scenario, use the actorCalled fixture:

./spec/todo_app.spec.ts
import { describe, it, beforeEach } from '@serenity-js/playwright-test'
import { Navigate } from '@serenity-js/web'
import { Ensure, equals } from '@serenity-js/assertions'

import { TodoApp } from './screenplay/TodoApp'

describe('Todo App', () => {

describe('Guest user', () => {

it('shares the list with other guests using the same browser', async ({ actorCalled }) => {

await actorCalled('Alice').attemptsTo(
Navigate.to('https://todo-app.serenity-js.org/#/'),
TodoApp.recordItem('Read a book'),
Ensure.that(TodoApp.recordedItems(), equals([
'Read a book'
])),
)

// By default, Alice and Bob use the same browser session
// so Bob sees the same list as Alice

await actorCalled('Bob').attemptsTo(
Ensure.that(TodoApp.recordedItems(), equals([
'Read a book'
])),
)
})
})
})
Multi-browser test scenarios

By default, all actors share the same browser session. To make them use independent browsers, see Using multiple browsers.

Changing the default actor name

By default, the single actor fixture is named "Actor". You can change this by setting the defaultActorName configuration option in your playwright.config.ts file:

playwright.config.ts
import { defineConfig, devices } from '@playwright/test'
import type { SerenityFixtures, SerenityWorkerFixtures } from '@serenity-js/playwright-test'

export default defineConfig<SerenityFixtures, SerenityWorkerFixtures>({
// Global configuration for all test scenarios
use: {
defaultActorName: 'Alice',
},

projects: [
// Per-project configuration, overrides the global defaults.
{
name: 'chromium',
use: {
...devices['Desktop Chrome'],
defaultActorName: 'Alice',
},
},
}
// ...
});

You can also set it directly in your test file via test.use:

./spec/todo_app.spec.ts
import { describe, it, beforeEach, test } from '@serenity-js/playwright-test'
import { Navigate } from '@serenity-js/web'
import { Ensure, equals } from '@serenity-js/assertions'

import { TodoApp } from './screenplay/TodoApp'

describe('Todo App', () => {

describe('Guest user', () => {

test.use({
defaultActorName: 'Guest',
});

beforeEach(async ({ actor }) => {
await actor.attemptsTo(
Navigate.to('https://todo-app.serenity-js.org/#/'),
)
})

it('should start with an empty todo list', async ({ actor }) => {

await actor.attemptsTo(
Ensure.that(TodoApp.recordedItems().count(), equals(0)),
)
})
})
})

What you learnt

  • Use the actorCalled fixture to introduce multiple named actors into a scenario.
  • By default, all actors share the same browser session (same page instance).
  • The defaultActorName option lets you give a meaningful name to the default actor fixture.

Next step

Learn how to customise actor abilities, including using multiple browsers and sharing notes between actors.