π¨ Building Playwright Framework Step By Step - Create User Snippets

Search for a command to run...

No comments yet. Be the first to comment.
Master Playwright automation! This step-by-step series explains 'how' & 'why' to build robust, scalable test frameworks. A practical, educational articles providing a solid foundation for all skill levels.
π― Introduction Environment variables are the backbone of professional test automation - they're your secret weapon for creating flexible, secure, and maintainable test frameworks! π π‘ What are Environment Variables?: Configuration values stored o...
Structure your CLAUDE.md and skill files like a technical book, and your AI agent will read them like one.

Meet the meta skill that ties every other skill together and tells you how to actually drive the scaffold

A practical guide to HTTP methods, status codes, payload testing, and schema validation for API testers

After 30+ articles, the missing piece was always the deeper explanation. Now it's on video.

Watch an AI agent go from a single prompt to page objects, factories, and passing Playwright tests

User snippets frequently go unnoticed in conversations about Automation Testing, yet I believe they represent a secret weapon in an automation tester's arsenal! π₯
π‘ What are User Snippets?: Custom code templates in VS Code or Windsurf that boost productivity and maintain consistency across your codebase
User snippets are a powerful tool for developers aiming to:
β‘ Boost productivity - Reduce repetitive typing
π― Maintain consistency - Ensure alignment with coding standards
π Enhance code quality - Follow best practices automatically
π Save time - Insert complex code templates instantly
By defining your own snippets, you can ensure they align with your project's or team's coding standards and best practices, thus enhancing code quality and readability.
This article builds directly on the concepts from our first one. To get the most out of it, you should have:
π Note: Instructions work for both VS Code and Windsurf
Open Command Palette: Ctrl+Shift+P (Windows/Linux) or Cmd+Shift+P (Mac)
Search for: Preferences: Configure User Snippets
Select: New Global Snippets file...
Name your file: playwright-snippets.json
Every snippet follows this JSON structure:
{
"Snippet Name": {
"scope": "typescript",
"prefix": "trigger-word",
"body": [
"line 1 of code",
"line 2 of code",
"$1 // cursor position"
],
"description": "What this snippet does"
}
}
π Key Components:
scope: Language where snippet works (typescript, javascript, etc.)
prefix: What you type to trigger the snippet
body: The actual code template (array of strings)
description: Helpful description for the snippet
{
"Print to Console": {
"scope": "javascript,typescript",
"prefix": "cl",
"body": [
"console.log(${1});",
],
"description": "Log output to the console"
},
"Playwright Describe": {
"scope": "javascript,typescript",
"prefix": "pwd",
"body": [
"test.describe('${1}', () => {${2}});",
],
"description": "Generate a Playwright describe function"
},
"Playwright Test": {
"scope": "javascript,typescript",
"prefix": "pwt",
"body": [
"test('${1}',{tag:'@${2}'}, async ({ ${3} }) => {${4}});",
],
"description": "Generate a Playwright test function"
},
"Playwright Test Step": {
"scope": "javascript,typescript",
"prefix": "pwts",
"body": [
"await test.step('${1}', async () => {${2}});",
],
"description": "Generate a Playwright test step function"
},
"Expect toBeVisible": {
"scope": "javascript,typescript",
"prefix": "exv",
"body": [
"await expect(${1}).toBeVisible();",
],
"description": "Generate expect locator to be visible code"
},
"Expect toEqual": {
"scope": "javascript,typescript",
"prefix": "exe",
"body": [
"await expect(${1}).toEqual(${2});",
],
"description": "Generate expect recieved value to be equal to predefined value"
},
"Expect toHaveText": {
"scope": "javascript,typescript",
"prefix": "ext",
"body": [
"await expect(${1}).toHaveText(${2});",
],
"description": "Generate expect locator to have predefined text"
},
"API Request": {
"scope": "javascript,typescript",
"prefix": "req",
"body": [
"const { status, body } = await apiRequest<${1}>({method:'${2}',url: '${3}', baseUrl: ${4}, body: ${5}, headers: ${6}}); expect(status).toBe(${7});",
],
"description": "Generate API request"
},
"API Route": {
"scope": "javascript,typescript",
"prefix": "rou",
"body": [
"await page.route(`${1}`, async (route) => {await route.fulfill({status: 200, contentType: 'application/json',body: JSON.stringify(${2})});});"],
"description": "Generate API route"
},
"Environment Variable": {
"scope": "javascript,typescript",
"prefix": "pr",
"body": [
"process.env.${1}",
],
"description": "Generate environment variable"
},
"Intercept API Response":{
"scope": "javascript,typescript",
"prefix": "int",
"body": [
"const interceptedResponse = await page.waitForResponse(`${${1}}${2}`); const interceptedResponseBody = await interceptedResponse.json(); const ${3} = interceptedResponseBody.${4};",
],
"description": "Intercept API response"
},
"Class for Page Object Model":{
"scope": "javascript,typescript",
"prefix": "pom",
"body": [
"import { Page, Locator, expect } from '@playwright/test';",
"/**",
" * This is the page object for the Home Page.",
" * @export",
" * @class ${1}",
" * @typedef {${1}}",
" */",
"export class ${1}{",
" constructor(private page: Page) {}",
"",
" get ${2} (): Locator {return ${3}};",
"}",
],
"description": "Class for Page Object Model"
},
"Getter for Class": {
"scope": "javascript,typescript",
"prefix": "ge",
"body": [
"get ${1}(): Locator {return this.page.${2};}",
],
"description": "get locator"
}
}
β‘ Productivity Boosters:
pwt for Playwright tests
req for API request
exv Assertion to be visible
Use ${1}, ${2}, ${3} etc. to define tab stops where you'll input specific values:
"body": [
"test('${1}',{tag:'@${2}'}, async ({ ${3} }) => {${4}});"
"});"
]
Create snippets for:
π Boilerplate code (describe, test and test step blocks)
β
Assertions (expect)
π API Request/Intercept
In the next article we will dive into Environment Variables - managing configuration like a pro!
π¬ Community: Please feel free to initiate discussions on this topic, as every contribution has the potential to drive further refinement.
β¨ Ready to supercharge your testing skills? Let's continue this journey together!
ππ» Thank you for reading! Building robust, scalable automation frameworks is a journey best taken together. If you found this article helpful, consider joining a growing community of QA professionals π who are passionate about mastering modern testing.
Join the community and get the latest articles and tips by signing up for the newsletter.