Playwright Primer for SAP Testers
A ground-up introduction to Playwright and Praman for testers coming from SAP testing backgrounds (ECATT, Tosca, QTP/UFT, Solution Manager, CBTA). No prior Playwright or programming experience is assumed.
What Is Playwright?​
Playwright is an open-source test automation framework from Microsoft. It drives real browsers (Chrome, Firefox, Safari) to simulate user interactions -- clicking buttons, filling forms, reading text -- and verifies that applications behave correctly.
Unlike SAP GUI-based tools, Playwright works with web applications in the browser. Since SAP Fiori, SAP UI5, and BTP apps all run in the browser, Playwright is a natural fit.
Why Not ECATT or Tosca?​
| Concern | ECATT / Tosca | Playwright + Praman |
|---|---|---|
| SAP GUI support | Native | Not applicable (browser only) |
| Fiori / UI5 web apps | Limited or plugin-required | Native + UI5-aware |
| Parallel execution | Difficult | Built-in |
| CI/CD integration | Complex setup | First-class (GitHub Actions, Azure DevOps, Jenkins) |
| Cost | Licensed | Open source |
| Version control | Limited | Git-native (tests are code files) |
| AI integration | None | Built-in LLM + agentic support |
If your tests target SAP GUI transactions (not Fiori web apps), tools like ECATT or Tosca remain the right choice. Playwright and Praman target browser-based SAP applications only.
Prerequisite Learning Path​
If you are starting from zero programming experience, follow this learning path before writing Praman tests. Each step builds on the previous one.
Step 1: Command Line Basics (1 hour)​
Learn to navigate directories, run commands, and use a terminal.
- Windows: Open PowerShell or Windows Terminal
- macOS/Linux: Open Terminal
Key commands to learn:
# Navigate to a folder
cd Documents/my-project
# List files
ls
# Run a Node.js script
node my-script.js
# Run tests
npx playwright test
Step 2: Node.js and npm (1 hour)​
Install Node.js (version 20 or later) from nodejs.org.
# Verify installation
node --version # Should print v20.x.x or later
npm --version # Should print 10.x.x or later
# Create a new project
mkdir my-sap-tests
cd my-sap-tests
npm init -y
# Install dependencies
npm install playwright-praman @playwright/test
npx playwright install chromium
Step 3: TypeScript Basics (2-3 hours)​
Tests are written in TypeScript, a typed version of JavaScript. You need to understand:
- Variables:
const name = 'John';(a value that does not change) - Strings:
'Hello'or"Hello"or`Hello ${name}` - Objects:
{ vendor: '100001', amount: 500 }(a group of named values) - Arrays:
['item1', 'item2', 'item3'](a list of values) - Functions:
function greet(name: string) { return 'Hello ' + name; } - Arrow functions:
const greet = (name: string) => 'Hello ' + name;
Free resource: TypeScript in 5 minutes
Step 4: async/await (30 minutes)​
Browser operations take time (loading pages, finding elements, clicking buttons). TypeScript
uses async/await to handle this waiting gracefully.
// BAD: This does NOT wait for the page to load
function badExample() {
page.goto('https://my-app.com'); // Returns immediately, page not loaded yet
}
// GOOD: This waits for the page to finish loading
async function goodExample() {
await page.goto('https://my-app.com'); // Pauses here until page loads
}
Rule of thumb: Every function that interacts with the browser needs async in its
declaration and await before each browser call.
Your First Playwright Test​
Create a file called tests/hello.test.ts:
import { test, expect } from 'playwright-praman';
test('my first test', async ({ page }) => {
// Go to a web page
await page.goto('https://example.com');
// Check the page title
await expect(page).toHaveTitle('Example Domain');
});
Run it:
npx playwright test tests/hello.test.ts
Anatomy of a Test​
import { test, expect } from 'playwright-praman';
// ^^^^ ^^^^^^
// | Tool for checking results ("assertions")
// Framework for defining tests
test('description of what this test verifies', async ({ page }) => {
// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^
// Human-readable test name "page" = a browser tab
await page.goto('https://my-app.com');
// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
// Navigate the browser to this URL
const heading = page.locator('h1');
// ^^^^^^^
// Find an element on the page
await expect(heading).toHaveText('Welcome');
// ^^^^^^ ^^^^^^^^^^
// Assert/verify Expected value
});
Fixtures: Automatic Setup​
In ECATT, you might use "variants" to inject test data. In Playwright, fixtures provide pre-configured objects to your tests automatically.
import { test, expect } from 'playwright-praman';
test('using fixtures', async ({ ui5, ui5Navigation, sapAuth }) => {
// ^^^ ^^^^^^^^^^^^^^ ^^^^^^^
// | | Authentication helper
// | Navigation helper (9 methods)
// UI5 control finder and interaction API
await ui5Navigation.navigateToApp('PurchaseOrder-manage');
const btn = await ui5.control({ controlType: 'sap.m.Button', properties: { text: 'Create' } });
await expect(btn).toBeUI5Enabled();
});
You request fixtures by name in the test function signature. Praman provides 12 fixture modules:
| Fixture | What It Does |
|---|---|
ui5 | Find and interact with UI5 controls |
ui5Navigation | Navigate FLP apps, tiles, intents |
sapAuth | Login/logout with 6 strategies |
fe | Fiori Elements List Report + Object Page helpers |
pramanAI | AI page discovery and test generation |
intent | Business domain intents (procurement, sales, finance) |
ui5Shell | FLP shell header (home, user menu) |
ui5Footer | Page footer bar (Save, Edit, Delete) |
flpLocks | SM12 lock management |
flpSettings | User settings reader |
testData | Test data generation with auto-cleanup |
test.step(): Structured Test Steps​
In ECATT, test scripts have numbered steps. In Playwright, use test.step() to create the
same structure.
import { test, expect } from 'playwright-praman';
test('create a purchase order', async ({ ui5, ui5Navigation, fe }) => {
await test.step('Step 1: Navigate to the PO app', async () => {
await ui5Navigation.navigateToApp('PurchaseOrder-manage');
});
await test.step('Step 2: Click Create', async () => {
await ui5.click({
controlType: 'sap.m.Button',
properties: { text: 'Create' },
});
});
await test.step('Step 3: Fill the vendor field', async () => {
await ui5.fill({ id: 'vendorInput' }, '100001');
});
await test.step('Step 4: Save', async () => {
await fe.objectPage.clickSave();
});
await test.step('Step 5: Verify success message', async () => {
const messageStrip = await ui5.control({
controlType: 'sap.m.MessageStrip',
properties: { type: 'Success' },
});
await expect(messageStrip).toBeUI5Visible();
});
});
Steps appear as collapsible sections in the Playwright HTML report.
Assertions: Checking Results​
Assertions verify that the application behaves correctly. If an assertion fails, the test fails.
Standard Playwright Assertions​
// Check page title
await expect(page).toHaveTitle('Purchase Orders');
// Check URL
await expect(page).toHaveURL(/PurchaseOrder/);
// Check text content
await expect(page.locator('#message')).toHaveText('Saved');
Praman UI5 Assertions​
const button = await ui5.control({ id: 'saveBtn' });
// Is the button enabled?
await expect(button).toBeUI5Enabled();
// Does it have the right text?
await expect(button).toHaveUI5Text('Save');
// Is it visible?
await expect(button).toBeUI5Visible();
// Check a specific property
await expect(button).toHaveUI5Property('type', 'Emphasized');
// Check value state (for inputs)
const input = await ui5.control({ id: 'amountInput' });
await expect(input).toHaveUI5ValueState('Error');
Running Tests​
Basic Commands​
# Run all tests
npx playwright test
# Run a specific test file
npx playwright test tests/purchase-order.test.ts
# Run tests matching a name pattern
npx playwright test --grep "purchase order"
# Run with visible browser (headed mode)
npx playwright test --headed
# Run in debug mode (step through interactively)
npx playwright test --debug
Viewing Reports​
# Open the HTML report after a test run
npx playwright show-report
The HTML report shows:
- Pass/fail status for each test
test.step()sections collapsed per step- Screenshots on failure (automatic)
- Traces on retry (automatic)
Project Structure​
A typical Praman test project looks like this:
my-sap-tests/
tests/
auth-setup.ts # Login once, save session
auth-teardown.ts # Logout
purchase-order.test.ts # Test file
vendor.test.ts # Another test file
.auth/
sap-session.json # Saved browser session (auto-generated, git-ignored)
.env # Environment variables (git-ignored)
praman.config.ts # Praman configuration
playwright.config.ts # Playwright configuration
package.json # Dependencies
tsconfig.json # TypeScript configuration
Common Patterns​
Finding a UI5 Control​
// By ID
const btn = await ui5.control({ id: 'saveBtn' });
// By type + property
const input = await ui5.control({
controlType: 'sap.m.Input',
properties: { placeholder: 'Enter vendor' },
});
// By binding path
const field = await ui5.control({
controlType: 'sap.m.Input',
bindingPath: { value: '/PurchaseOrder/Vendor' },
});
Interacting with Controls​
// Click
await ui5.click({ id: 'submitBtn' });
// Type text
await ui5.fill({ id: 'nameInput' }, 'John Doe');
// Select from dropdown
await ui5.select({ id: 'countrySelect' }, 'US');
// Toggle checkbox
await ui5.check({ id: 'agreeCheckbox' });
// Clear a field
await ui5.clear({ id: 'searchField' });
Navigating SAP Apps​
// Navigate to an app by semantic object and action
await ui5Navigation.navigateToApp('PurchaseOrder-manage');
// Navigate to a tile by title
await ui5Navigation.navigateToTile('Create Purchase Order');
// Navigate with parameters
await ui5Navigation.navigateToIntent('PurchaseOrder', 'create', { plant: '1000' });
// Go home
await ui5Navigation.navigateToHome();
Glossary for SAP Testers​
| SAP Term | Playwright/Praman Equivalent |
|---|---|
| Test script | Test file (.test.ts) |
| Test step / script line | test.step() |
| Variant / test data set | testData.generate() fixture |
| Check / verification | expect() assertion |
| Test configuration | playwright.config.ts + praman.config.ts |
| Transaction code | ui5Navigation.navigateToIntent() |
| Control ID | UI5Selector.id |
| Element repository | UI5 control registry (queried via ui5.control()) |
| Test run | npx playwright test |
| Test report | npx playwright show-report (HTML) |
| Reusable component / module | Playwright fixture |
| Test suite | describe() block or test file |