๐Ÿ”ง Building Playwright Framework Step By Step - Implementing POM as Fixture and Auth User Session

Ivan DavidovIvan Davidov
4 min read

๐ŸŽฏ Introduction

Fixtures in Playwright provide a powerful mechanism to set up the environment for your tests, manage resources, and share common objects or context across multiple tests! ๐Ÿš€ These reusable components allow you to define custom setup and teardown procedures that automate the preparation and cleanup processes, ensuring a consistent testing environment and optimizing your workflows.

๐Ÿ’ก What are Fixtures?: Think of fixtures as your testing toolkit - they provide the foundation and tools your tests need to run consistently and efficiently.

๐Ÿ› ๏ธ Implement POM (Page Object Model) as Fixture

๐Ÿ“ Create Fixtures Folder

Create fixtures/pom folders in the root directory of the project.

project-root/
โ”œโ”€โ”€ fixtures/
โ”‚   โ””โ”€โ”€ pom/
โ”‚       โ”œโ”€โ”€ page-object-fixture.ts
โ”‚       โ””โ”€โ”€ test-options.ts
โ”œโ”€โ”€ tests/
โ””โ”€โ”€ playwright.config.ts

๐ŸŽญ Create Fixtures Files

Create and implement fixtures for the client site for all pages of the application.

๐Ÿ”ง Page Object Fixture

  • page-object-fixture.ts: This file is used for extending the test fixture from @playwright/test
import { test as base } from '@playwright/test';
import { HomePage } from '../../pages/clientSite/homePage';
import { NavPage } from '../../pages/clientSite/navPage';
import { ArticlePage } from '../../pages/clientSite/articlePage';

export type FrameworkFixtures = {
    homePage: HomePage;

    navPage: NavPage;

    articlePage: ArticlePage;
};

export const test = base.extend<FrameworkFixtures>({
    homePage: async ({ page }, use) => {
        await use(new HomePage(page));
    },

    navPage: async ({ page }, use) => {
        await use(new NavPage(page));
    },

    articlePage: async ({ page }, use) => {
        await use(new ArticlePage(page));
    },
});

export { expect } from '@playwright/test';

โš™๏ธ Test Options Configuration

  • test-options.ts: This file is used for merging all extended test fixtures
import { test as base, mergeTests } from '@playwright/test';
import { test as pageObjectFixture } from './page-object-fixture';

const test = mergeTests(pageObjectFixture);

const expect = base.expect;
export { test, expect };

๐Ÿ” Implement Auth User Session

๐ŸŽฏ Strategic Advantage: Leveraging authenticated user sessions in Playwright is a strategic approach to streamline testing of password-protected applications!

This method involves pre-creating and reusing authentication tokens or session information, allowing automated tests to bypass the login UI. It significantly reduces the time and resources required for tests that need an authenticated user context, enhancing test efficiency and reliability.

๐ŸŒŸ Advantages of Using Authenticated User Sessions in Playwright:

  • โšก Speed: Directly using authenticated sessions eliminates the overhead of navigating through login screens for each test, accelerating the test execution process

  • ๐Ÿ›ก๏ธ Stability: Tests become less prone to failures related to UI changes in the authentication flow, increasing their reliability

  • ๐ŸŽฏ Focus: Allows tests to concentrate on the core functionalities that require authentication, rather than the login process itself, making them more targeted and concise

๐Ÿ“ Create Auth Script File

Create auth.setup.ts file in the test directory of the project.

import { test as setup } from '../fixtures/pom/test-options';

setup('auth user', async ({ homePage, navPage, page }) => {
    await setup.step('create logged in user session', async () => {
        await homePage.navigateToHomePageGuest();

        await navPage.logIn(process.env.EMAIL!, process.env.PASSWORD!);

        await page.context().storageState({ path: '.auth/userSession.json' });
    });
});

โš™๏ธ Update Configuration File

Add the following configuration to your playwright.config.ts:

projects: [
        {
            name: 'setup',
            use: {
                ...devices['Desktop Chrome'],
                viewport: { width: 1366, height: 768 },
            },
            testMatch: /.*\.setup\.ts/,
        },

        {
            name: 'chromium',
            use: {
                ...devices['Desktop Chrome'],
                storageState: '.auth/userSession.json',
                viewport: { width: 1366, height: 768 },
            },
            dependencies: ['setup'],
        },

        {
            name: 'firefox',
            use: { ...devices['Desktop Firefox'] },
        },

        {
            name: 'webkit',
            use: { ...devices['Desktop Safari'] },
        },
    ],

๐Ÿ”’ Add File to .gitignore

โš ๏ธ Security Best Practice: Add userSession.json file to .gitignore file in the root directory of the project.

# Authentication User file
userSession.json

๐Ÿƒโ€โ™‚๏ธ Create Auth User Session

Run the auth.setup.ts file to create auth user session:

npx playwright test auth.setup.ts

๐Ÿ‘ค Create Guest User Session

Create guestSession.json file in the .auth directory of the project and add {} to it.

๐Ÿ’ก Guest Sessions: Empty JSON object represents an unauthenticated state for tests that require guest access.

๐ŸŽฏ What's Next?

In the next article we will implement UI Tests - bringing your framework to life with comprehensive user interface testing!

๐Ÿ’ฌ Community: Please feel free to initiate discussions on this topic, as every contribution has the potential to drive further refinement.


โœจ Ready to enhance your testing capabilities? Let's continue building this robust framework together!

0
Subscribe to my newsletter

Read articles from Ivan Davidov directly inside your inbox. Subscribe to the newsletter, and don't miss out.

Written by

Ivan Davidov
Ivan Davidov

Automation QA Engineer, ISTQB CTFL, PSM I, helping teams improve the quality of the product they deliver to their customers. โ€ข Led the development of end-to-end (E2E) and API testing frameworks from scratch using Playwright and TypeScript, ensuring robust and scalable test automation solutions. โ€ข Integrated automated tests into CI/CD pipelines to enhance continuous integration and delivery. โ€ข Created comprehensive test strategies and plans to improve test coverage and effectiveness. โ€ข Designed performance testing frameworks using k6 to optimize system scalability and reliability. โ€ข Provided accurate project estimations for QA activities, aiding effective project planning. โ€ข Worked with development and product teams to align testing efforts with business and technical requirements. โ€ข Improved QA processes, tools, and methodologies for increased testing efficiency. โ€ข Domain experience: banking, pharmaceutical and civil engineering. Bringing over 3 year of experience in Software Engineering, 7 years of experience in Civil engineering project management, team leadership and project design, to the table, I champion a disciplined, results-driven approach, boasting a record of more than 35 successful projects.