/SKILL.md
Playwright plugin for SAP UI5 test automation. Provides fixtures for UI5 control discovery, SAP authentication (BTP SAML, Basic, Office365), FLP navigation, OData V2/V4 data access, Fiori Elements testing (ListReport, ObjectPage), AI-powered test generation, and business intent APIs (Procurement MM, Sales SD, FI, PP). Use when testing SAP Fiori applications, Fiori Elements apps, or any SAP UI5 application with Playwright. Import from 'playwright-praman'.
npx skillsauth add mrkanitkar/playwright-praman playwright-praman-sap-testingInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
This skill has been flagged as suspicious. Review the scan results before using.
2 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Praman is a Playwright plugin for SAP UI5 applications. It bridges Playwright's web-first approach with SAP's UI5 framework, providing stable selectors, SAP auth strategies, FLP navigation, and AI-driven test generation.
// playwright.config.ts
import { defineConfig } from '@playwright/test';
import { defineConfig as definePramanConfig } from 'playwright-praman';
export default defineConfig({
use: {
praman: definePramanConfig({
auth: { strategy: 'basic', baseUrl: 'https://your-sap-system.example.com' },
}),
},
});
// my.test.ts
import { test, expect } from 'playwright-praman';
test('create purchase order', async ({ ui5, ui5Navigation }) => {
await ui5Navigation.navigateToApp('PurchaseOrder-manage');
await ui5.fill({ id: 'vendorInput' }, 'SUP-001');
await ui5.click({ controlType: 'sap.m.Button', properties: { text: 'Save' } });
await expect(ui5.waitForUI5()).resolves.toBeUndefined();
});
| Element Type | Use | Example |
| --------------------------- | ------------------ | -------------------------------------------------------------------------------- |
| UI5 Button (sap.m.Button) | ui5.click() | await ui5.click({ controlType: 'sap.m.Button', properties: { text: 'Save' } }) |
| UI5 Input (sap.m.Input) | ui5.fill() | await ui5.fill({ id: 'vendorInput' }, 'SUP-001') |
| UI5 Select (sap.m.Select) | ui5.select() | await ui5.select({ id: 'companyCode' }, '1000') |
| UI5 Table (sap.m.Table) | ui5.table.* | await ui5.table.getRows('tableId') |
| UI5 Dialog | ui5.dialog.* | await ui5.dialog.confirm() |
| UI5 Date Picker | ui5.date.* | await ui5.date.setDate('datePickerId', '2024-01-15') |
| Plain HTML button | Playwright native | await page.locator('button#submit').click() |
| Non-UI5 elements | Playwright native | await page.locator('.custom-element').isVisible() |
| Browser navigation (URL) | Playwright native | await page.goto(url) |
| FLP app navigation | ui5Navigation.* | await ui5Navigation.navigateToApp('PurchaseOrder-manage') |
| Wait for UI5 rendering | ui5.waitForUI5() | await ui5.waitForUI5() |
| Wait for network | Playwright native | await page.waitForLoadState('networkidle') |
| OData model read | ui5.odata.* | await ui5.odata.readEntity('/Suppliers', 'SUP-001') |
| Fixture | Import via | Purpose |
| --------------- | -------------------------- | ----------------------------------------------- |
| ui5 | coreTest or moduleTest | UI5 control discovery + interaction |
| ui5Navigation | navTest | FLP / WorkZone navigation |
| ui5.table | moduleTest | Table operations (read, select rows) |
| ui5.dialog | moduleTest | Dialog confirm/dismiss |
| ui5.date | moduleTest | Date picker interactions |
| ui5.odata | moduleTest | OData model + HTTP operations |
| pramanAI | aiTest | AI-powered test generation (Phase 5) |
| intent | intentTest | Business intent APIs — MM, SD, FI, PP (Phase 5) |
import { coreTest as test } from 'playwright-praman'; // ui5 only
import { moduleTest as test } from 'playwright-praman'; // ui5 + table/dialog/date/odata
import { navTest as test } from 'playwright-praman'; // ui5 + navigation
sap.m.* — Mobile-first controls (Button, Input, Select, Table, List, Dialog)
sap.ui.table.* — Grid Table (classic desktop table — higher density)
sap.ui.comp.* — Smart controls (SmartField, SmartTable, SmartFilterBar)
sap.ui.core.* — Core framework (Icon, HTML, View)
sap.f.* — Fiori controls (DynamicPage, FlexibleColumnLayout, Card)
sap.tnt.* — Tools and Navigation Theme (NavigationList, SideNavigation)
sap.uxap.* — UX AP Patterns (ObjectPage, ObjectPageSection)
SmartField note: SmartField wraps an inner control. getControlType() returns
sap.ui.comp.smartfield.SmartField — NOT the inner sap.m.Input or sap.m.ComboBox.
Always use the outer SmartField type in selectors.
SAP System Type → Strategy
─────────────────────────────────────────────────────
OnPrem + LDAP/AD → 'basic' (username/password form)
OnPrem + SAML2 → 'btp-saml' (redirect flow)
BTP Cloud Foundry → 'btp-saml' (BTP IAS redirect)
Office 365 / Azure AD → 'office365' (Microsoft SSO)
API / Service Account → custom (APIAuthStrategy)
Multi-tenant → custom (MultiTenantAuthStrategy)
Certificate / mTLS → custom (CertificateAuthStrategy)
// playwright.config.ts — with auth storage
export default defineConfig({
projects: [
{
name: 'auth',
testMatch: '**/auth-setup.ts',
},
{
name: 'tests',
dependencies: ['auth'],
use: { storageState: '.auth/session.json' },
},
],
});
See authentication.md for all 6 strategies.
FLP navigation hashes follow the pattern: #SemanticObject-Action?param=value
// Navigate to standard apps
await ui5Navigation.navigateToApp('PurchaseOrder-manage'); // ME23N equivalent
await ui5Navigation.navigateToApp('SalesOrder-manage'); // VA03 equivalent
await ui5Navigation.navigateToApp('Material-display'); // MM60 equivalent
// Navigate by tile title (for WorkZone)
await ui5Navigation.navigateToTile('Manage Purchase Orders');
// Navigate with intent parameters
await ui5Navigation.navigateToIntent('PurchaseOrder', 'manage', {
PurchaseOrder: '4500001234',
});
// Navigate by raw hash
await ui5Navigation.navigateToHash("#PurchaseOrder-manage&/PurchaseOrder('4500001234')");
// By stable ID (fastest — use when you control the app)
await ui5.control({ id: 'submitButton' });
// By control type + text (stable across locales — preferred for buttons)
await ui5.control({ controlType: 'sap.m.Button', properties: { text: 'Save' } });
// By control type + binding path (stable across UI changes)
await ui5.control({ controlType: 'sap.m.Input', bindingPath: { path: '/Vendor' } });
// Scoped by ancestor (avoids false matches in complex layouts)
await ui5.control({
controlType: 'sap.m.Input',
ancestor: { id: 'vendorForm' },
});
// Multiple controls
const rows = await ui5.controls({ controlType: 'sap.m.ColumnListItem' });
| Domain | File | Contents | | ----------------- | ------------------------------------------------------------------------------------------- | -------------------------------------------------------- | | UI5 Controls | ui5-controls.md | Selector syntax, 199 control types, interaction patterns | | Authentication | authentication.md | 6 auth strategies, SAP deployment types | | Navigation | navigation.md | FLP hashes, 9 navigation functions, WorkZone | | Fiori Elements | fiori-elements.md | ListReport, ObjectPage, SmartTable, FilterBar | | Table/Dialog/Date | table-dialog-date.md | 6 table variants, dialog patterns, date formats | | OData | odata.md | OData V2/V4, model vs HTTP, batch requests | | AI Capabilities | ai-capabilities.md | AI test generation, intent APIs, vocabulary | | Capabilities | capabilities-reference.md | Auto-generated full capability manifest |
tools
# SAP UI5 Test Automation via Playwright CLI **Package**: `playwright-praman` v1.1.2 **CLI Requirement**: `@playwright/cli` v0.1.3+ and `playwright` v1.59+ **Purpose**: Discover SAP UI5 controls, debug Praman tests, and automate SAP Fiori workflows using the Playwright CLI. Agents use CLI commands for live discovery, then produce Praman fixture code as output. --- ## Setup: Create Config File Create `.playwright/praman-cli.config.json` in your project root: ```bash mkdir -p .playwright cat
tools
Use when work should span one or more detached tasks but still behave like one job with a single owner context. TaskFlow is the durable flow substrate under authoring layers like Lobster, ACPX, plugins, or plain code. Keep conditional logic in the caller; use TaskFlow for flow identity, child-task linkage, waiting state, revision-checked mutations, and user-facing emergence.
tools
# Lobster Lobster executes multi-step workflows with approval checkpoints. Use it when: - User wants a repeatable automation (triage, monitor, sync) - Actions need human approval before executing (send, post, delete) - Multiple tool calls should run as one deterministic operation ## When to use Lobster | User intent | Use Lobster? | | ------------------------------------------------------ | --------------------------
tools
# Lobster Lobster executes multi-step workflows with approval checkpoints. Use it when: - User wants a repeatable automation (triage, monitor, sync) - Actions need human approval before executing (send, post, delete) - Multiple tool calls should run as one deterministic operation ## When to use Lobster | User intent | Use Lobster? | | ------------------------------------------------------ | --------------------------