Answer
Writing Playwright Tests in JavaScript
Playwright supports both JavaScript and TypeScript. With JavaScript, you skip type annotations but use the same API.
Project Setup for JavaScript
Bash
# Create project with JavaScript
npm init playwright@latest
# Choose "JavaScript" when prompted
Or manually:
Bash
npm install --save-dev @playwright/test
npx playwright install
Create playwright.config.js:
JavaScript
// playwright.config.js
const { defineConfig, devices } = require('@playwright/test');
module.exports = defineConfig({
testDir: './tests',
use: {
baseURL: 'https://myapp.com',
headless: true,
screenshot: 'only-on-failure',
},
projects: [
{ name: 'chromium', use: { ...devices['Desktop Chrome'] } },
{ name: 'firefox', use: { ...devices['Desktop Firefox'] } },
],
});
Basic JavaScript Test
JavaScript
// tests/login.spec.js
const { test, expect } = require('@playwright/test');
test.describe('Login Flow', () => {
test.beforeEach(async ({ page }) => {
await page.goto('/login');
});
test('successful login with valid credentials', async ({ page }) => {
await page.getByLabel('Email').fill('user@test.com');
await page.getByLabel('Password').fill('password123');
await page.getByRole('button', { name: 'Sign in' }).click();
await expect(page).toHaveURL('/dashboard');
await expect(page.getByRole('heading')).toHaveText('Welcome');
});
test('shows error with invalid credentials', async ({ page }) => {
await page.getByLabel('Email').fill('wrong@test.com');
await page.getByLabel('Password').fill('wrongpass');
await page.getByRole('button', { name: 'Sign in' }).click();
await expect(page.locator('.error-message')).toBeVisible();
await expect(page.locator('.error-message')).toContainText('Invalid credentials');
});
});
Page Object in JavaScript
JavaScript
// pages/LoginPage.js
class LoginPage {
constructor(page) {
this.page = page;
this.emailInput = page.getByLabel('Email');
this.passwordInput = page.getByLabel('Password');
this.loginButton = page.getByRole('button', { name: 'Sign in' });
this.errorMessage = page.locator('.error-message');
}
async navigate() {
await this.page.goto('/login');
}
async login(email, password) {
await this.emailInput.fill(email);
await this.passwordInput.fill(password);
await this.loginButton.click();
}
}
module.exports = { LoginPage };
JavaScript
// tests/login.spec.js
const { test, expect } = require('@playwright/test');
const { LoginPage } = require('../pages/LoginPage');
test('login with POM', async ({ page }) => {
const loginPage = new LoginPage(page);
await loginPage.navigate();
await loginPage.login('user@test.com', 'password123');
await expect(page).toHaveURL('/dashboard');
});
Run JavaScript Tests
Bash
npx playwright test
npx playwright test --project=chromium
npx playwright test tests/login.spec.js
