🎬 Screenplay Pattern - Part 2: Actions
In the Screenplay pattern, once you've defined your actor, the next question is:
What can this actor do?
That's where Actions come in.
🛠️ What are Actions?
Actions are the building blocks of your test.
They define how an actor interacts with the system — but in a reusable and readable way.
Instead of spreading low-level commands all over your tests, you create named tasks that express intention, like:
bankCustomer.makeAction('enterLoginCredentials', { email: validUser.email, password: validUser.password, });
It tells you exactly what’s happening — not how it’s implemented.
How the actions works:
- I use an class for each feature of our system:
export class LoginActions { enterLoginCredentials(input: { email?: string; password?: string }) { loginPage.waitForPageToLoad(); if (input.email) { cy.get(loginPage.getEmailInputSelector()) .filter(':visible') .should('be.enabled') .clear() .type(input.email, { delay: 50 }); } if (input.password) { cy.get(loginPage.getPasswordInputSelector()) .filter(':visible') .should('be.enabled') .clear() .type(input.password, { delay: 50 }); } } }
The UI selectors are stored in a separate file. By keeping selectors in their own file, they can be reused across different actions.
After this, the actors who can perform this actions, only need:
export default class BankCustomer extends BaseActor { constructor() { const loginActions = new LoginActions(); super(loginActions); } }
So when you read a test and see an action, it tells you what is being done — not how it's done. If you want to check the implementation, just search for the action name or look it up in the documentation. (Screenplay makes documenting tests easier — more on that later!)
âś… Why use Actions?
Readable: Your test reads like a user story.
Reusable: One action can be used across many scenarios.
Maintainable: If the UI changes, you update the action, not every test.
In short:
Actions help you write tests that describe behavior, not code.
They're a key piece in making automation feel like a conversation between the user and the system.
Next post: ❓Questions – how do we verify what happened?
Top comments (0)