π― 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"
},
"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"
}
}
π‘ Pro Tips for Effective Snippets
β‘ Productivity Boosters:
π― Use Descriptive Prefixes - Find these, which work best for you
-
pwt
for Playwright tests -
req
for API request -
exv
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!
ππ» 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.
Top comments (2)
Hi @idavidov13
Once created, where to place file "playwright-snippets.json" ?
Thank You
Hi, @shailendrakumaromkar π
You donβt need to create the file in the repository. Follow the steps after you open your IDE:
Ctrl+Shift+P
(Windows/Linux) orCmd+Shift+P
(Mac)Preferences: Configure User Snippets
New Global Snippets file...
nameTheFile
and hit enter. After that, a blank file is openednameTheFile.json
. Paste the provided snippets and save it. Now you can safely close the file and create/open any file with .js or .ts extension. Enjoy snippets by typing the prefix. Depends of IDE, after you typed the prefix, you shoud hit enter or tab. If you have any issues, please let me know π