๐จ Building Playwright Framework Step By Step - Create User Snippets


๐ฏ Introduction
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.
๐ ๏ธ How to Create User Snippets
Step 1: Access Snippets Configuration
๐ Note: Instructions work for both VS Code and Windsurf
Open Command Palette:
Ctrl+Shift+P
(Windows/Linux) orCmd+Shift+P
(Mac)Search for:
Preferences: Configure User Snippets
Select:
New Global Snippets file...
Name your file:
playwright-snippets.json
Step 2: Understanding Snippet Structure
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
๐ฏ Essential Playwright Snippets
{
"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"
}
}
๐ก Pro Tips for Effective Snippets
โก Productivity Boosters:
๐ฏ Use Descriptive Prefixes - Find these, which work best for you
pwt
for Playwright testsreq
for API requestexv
Assertion to be visible
๐ Strategic Cursor Placement
Use ${1}
, ${2}
, ${3}
etc. to define tab stops where you'll input specific values:
"body": [
"test('${1}',{tag:'@${2}'}, async ({ ${3} }) => {${4}});"
"});"
]
๐ Include Common Patterns
Create snippets for:
๐ญ Boilerplate code (describe, test and test step blocks)
โ Assertions (
expect
)๐ API Request/Intercept
๐ฏ What's Next?
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!
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.