Capability Registry
Machine-readable registry of every Praman capability. Each entry documents what the capability does, what it guarantees, which APIs it exposes, how it can fail, and an agent hint for AI-driven test generation.
This registry serves three audiences:
- SAP Test Engineers — find the right API for a task, understand guarantees and failure modes
- QA Leads & Evaluators — audit coverage, map capabilities to business processes
- AI Agents — use
agent_hintfields to select capabilities and avoid anti-patterns
Overview
| Metric | Count |
|---|---|
| Total Capabilities | 36 |
| Total Public APIs | 231 |
| Category Codes | 18 |
| Source of Truth | playwright-praman/src/**/*.ts (exports only) |
| Version | 1.0.1 |
Category Codes
| Code | Domain |
|---|---|
| LOC | Control Discovery & Locators |
| ACT | Interactions & Actions |
| WAIT | Waiting & Synchronization |
| ASRT | Assertions & Matchers |
| NAV | Navigation & Routing |
| AUTH | Authentication & Session Setup |
| DATA | Data & Model Inspection |
| TBL | Tables & Lists |
| DLG | Dialogs, Popovers & Overlays |
| DTP | Date & Time Controls |
| FE | Fiori Elements Helpers |
| FLP | FLP Platform Services |
| VOCAB | Business Vocabulary |
| INT | SAP Business Intents |
| FIX | Fixtures & Test Configuration |
| AI | AI Agent Operability |
| DX | Developer Experience & Tooling |
| MIG | Migration & Compatibility |
LOC: Control Discovery & Locators
UI5-LOC-001 — Locate controls by metadata
Find UI5 controls using type, properties, binding path, or ID without CSS selectors.
Guarantees:
- Stable across UI rerenders, theme changes, and view recreations
- No dependency on generated DOM IDs or CSS classes
- Falls back to Playwright locator for non-UI5 DOM elements automatically
- Cached per-selector within a test to avoid redundant browser roundtrips
APIs:
| API | Description |
|---|---|
ui5.control(selector) | Find single control by UI5Selector — sap.ui.test.RecordReplay |
ui5.controls(selector) | Find all matching controls — sap.ui.core.Element.registry |
ui5.waitFor(selector, opts) | Poll until control appears — custom polling loop |
ui5.inspect(selector) | Return full metadata without proxy — sap.ui.core.Element |
Failures:
- Control not rendered — throws
ControlErrorif called before UI5 bootstraps - Ambiguous match — returns first match; use
controlType+propertiesto narrow - Stale ID after navigation — cache is invalidated on frame navigation events
- Timeout waiting for control — throws
TimeoutErrorafter configurable deadline
Use when user needs to find, locate, or select a UI5 control on screen. Do not use for raw DOM queries, non-UI5 web elements, or CSS/XPath selectors.
UI5-LOC-002 — Custom selector engine (ui5=)
Use Playwright's native selector syntax with ui5= prefix for control queries.
Guarantees:
- Registered once per worker via Playwright
selectors.register() - Supports
controlTypeandIDviadata-sap-uiattributes - Compatible with all Playwright locator methods (
click,fill,waitFor)
APIs:
| API | Description |
|---|---|
page.locator('ui5=sap.m.Button#id') | Playwright selector with ui5 engine |
createUI5SelectorEngineScript() | Factory for engine registration |
Failures:
- Engine not registered — if worker fixture not loaded,
ui5=prefix throws - Attribute missing — pre-bootstrap elements lack
data-sap-uiattributes
Use when integrating UI5 control selection with Playwright's native locator API. Do not use when full UI5Selector object with properties/bindings is needed.
UI5-LOC-003 — Inspect control metadata
Read full control properties, bindings, aggregations, and type without interaction.
Guarantees:
- Returns
controlType, all properties with current values, aggregation names - Includes binding paths for data-bound properties
- Does not create interactive proxy — read-only introspection
APIs:
| API | Description |
|---|---|
ui5.inspect(selector) | Full metadata including properties, bindings, aggregations |
Failures:
- Control destroyed between discovery and inspection — throws
ControlError - Bridge not injected — auto-injects on first call
Use when user needs to debug, assert metadata, or analyze a control's state.
Do not use for clicking/filling — use control() for interactive proxies.
ACT: Interactions & Actions
UI5-ACT-001 — Control interactions
Click, fill, select, check, and clear UI5 controls via pluggable interaction strategies.
Guarantees:
- Waits for UI5 stability before every action
- Executes via configurable strategy (DOM-first, OPA5, or UI5-native)
- Each action appears as a named step in Playwright trace viewer
- Method blacklist prevents calling destructive SAP API methods
APIs:
| API | Description |
|---|---|
ui5.click(selector) | Click a button, link, or control — InteractionStrategy.press |
ui5.fill(selector, value) | Type text into input/textarea — InteractionStrategy.enterText |
ui5.press(selector) | Alias for click |
ui5.select(selector, key) | Pick option in dropdown/combo — InteractionStrategy.select |
ui5.check(selector) | Enable a checkbox — setSelected(true) |
ui5.uncheck(selector) | Disable a checkbox — setSelected(false) |
ui5.clear(selector) | Clear text from input — enterText('') |
Failures:
- Control not found — throws
ControlErrorwith selector details - Control not interactable — strategy-level error if control is disabled/invisible
- Input validation rejection —
fireChangemay trigger UI5 server-side validation
Use when user needs to click, type, select, check, or clear a UI5 control.
Do not use for reading values — use getText/getValue instead.
UI5-ACT-002 — Read control values
Read displayed text or current value from UI5 controls.
Guarantees:
- Waits for UI5 stability before reading
- Reads via
page.evaluate()bridge to SAP APIgetText()/getValue()
APIs:
| API | Description |
|---|---|
ui5.getText(selector) | Read text property — control.getText() |
ui5.getValue(selector) | Read value property — control.getValue() |
Failures:
- Control has no text/value method — returns undefined or throws
- Value is stale — read may return old value if called during async model update
Use when user needs to read or assert the text/value displayed in a UI5 control.
Do not use for metadata inspection — use inspect() instead.
UI5-ACT-003 — Footer bar actions
Click standard Fiori footer bar buttons (Save, Edit, Cancel, Delete, Create, Apply).
Guarantees:
- Targets buttons by visible text in the
.sapMBarChildfooter area - Each click appears as a named step in Playwright trace viewer
APIs:
| API | Description |
|---|---|
ui5Footer.clickSave() | Click Save button |
ui5Footer.clickEdit() | Click Edit button |
ui5Footer.clickCancel() | Click Cancel button |
ui5Footer.clickDelete() | Click Delete button |
ui5Footer.clickCreate() | Click Create button |
ui5Footer.clickApply() | Click Apply button |
Failures:
- Button not in footer — throws
ControlErrorif button text not found - Wrong view mode — Edit button only appears in display mode, Save in edit mode
Use when user needs to click Save, Edit, Cancel, or other standard footer buttons.
Do not use for custom buttons — use ui5.click() with a selector instead.
WAIT: Waiting & Synchronization
UI5-WAIT-001 — UI5 framework synchronization
Wait for the UI5 rendering pipeline to complete before acting on controls.
Guarantees:
- Checks
sap.ui.getCore().getUIDirty()for pending renders - Auto-wait runs before every module method call (table, dialog, date, odata)
- Configurable timeout with per-operation override
- Auto-stability fixture waits after every main frame navigation
APIs:
| API | Description |
|---|---|
ui5.waitForUI5(timeout) | Explicit wait for UI5 stability |
waitForUI5Stable(page, opts) | Standalone utility function |
waitForUI5Bootstrap(page, opts) | Wait for sap.ui.getCore() to exist |
Failures:
- UI5 not loaded — returns immediately if
sap.uiis undefined (non-UI5 page) - Infinite pending — times out if UI5 keeps scheduling micro-tasks
Use when user needs to wait for UI5 to finish rendering after navigation or data load.
Do not use for waiting for a specific control — use ui5.waitFor(selector) instead.
UI5-WAIT-002 — Request interception
Auto-block WalkMe, analytics, and tracking scripts during test execution.
Guarantees:
- Auto-enabled via stability fixture — no manual activation needed
- Blocks patterns from
DEFAULT_IGNORE_PATTERNSplus customignoreAutoWaitUrls - Routes are cleaned up in teardown to avoid handler leaks
APIs:
| API | Description |
|---|---|
requestInterceptor (auto fixture) | Blocks configured URL patterns via page.route() |
Failures:
- Pattern too broad — may accidentally block legitimate app requests
- WalkMe loaded before intercept — first-load scripts may already execute
Use when user reports WalkMe/analytics interference during test execution.
Do not use for custom request mocking — use Playwright's page.route() directly.
ASRT: Assertions & Matchers
UI5-ASRT-001 — UI5 control matchers
Assert UI5 control properties, visibility, enabled state, and value state with auto-retry.
Guarantees:
- All matchers auto-retry via polling until timeout (web-first assertion pattern)
- Registered automatically via worker fixture — no manual setup
- Descriptive failure messages include control ID, expected, and actual values
- Support both exact match and RegExp patterns for text assertions
APIs:
| API | Description |
|---|---|
expect(proxy).toHaveUI5Text(expected) | Assert text property |
expect(proxy).toBeUI5Visible() | Assert visible === true |
expect(proxy).toBeUI5Enabled() | Assert enabled === true |
expect(proxy).toHaveUI5Property(name, value) | Assert any property |
expect(proxy).toHaveUI5ValueState(state) | Assert valueState (None/Error/Warning/Success) |
expect(proxy).toHaveUI5Binding(prop, path?) | Assert data binding exists |
expect(proxy).toBeUI5ControlType(type) | Assert fully qualified control type |
Failures:
- Control destroyed mid-assertion — polling stops, last error surfaces
- Property does not exist — returns undefined, assertion fails with clear message
Use when user needs to assert properties, visibility, or state of a UI5 control.
Do not use for non-UI5 DOM elements — use Playwright's built-in expect instead.
UI5-ASRT-002 — UI5 table matchers
Assert table row count, cell text, and selected row count with auto-retry.
Guarantees:
- Navigates table structure via items/cells aggregations
- Supports string and RegExp matching for cell text
- Auto-retry via polling until timeout
APIs:
| API | Description |
|---|---|
expect(proxy).toHaveUI5RowCount(n) | Assert row count via items aggregation |
expect(proxy).toHaveUI5CellText(row, col, text) | Assert cell text at position |
expect(proxy).toHaveUI5SelectedRows(n) | Assert selected row count |
Failures:
- Row/column out of bounds — returns descriptive error with actual dimensions
- Table not loaded — empty items aggregation until OData load completes
Use when user needs to verify table row count, cell content, or selection state.
Do not use for table interactions (click row, sort) — use ui5.table methods instead.
NAV: Navigation & Routing
UI5-NAV-001 — FLP navigation
Navigate between SAP Fiori Launchpad apps by hash, tile, intent, or search.
Guarantees:
- Each navigation appears as a named step in Playwright trace viewer
- Bridge injection state auto-resets on frame navigation
- Supports semantic object intents with query parameters
- Configurable base URL injection from auth config
APIs:
| API | Description |
|---|---|
ui5Navigation.navigateToApp(appId) | Navigate by semantic hash |
ui5Navigation.navigateToTile(title) | Click FLP tile by title |
ui5Navigation.navigateToIntent(intent, params) | Semantic object + action |
ui5Navigation.navigateToHash(hash) | Direct hash navigation |
ui5Navigation.navigateToHome() | Return to FLP home |
ui5Navigation.navigateBack() | Browser history back |
ui5Navigation.navigateForward() | Browser history forward |
ui5Navigation.searchAndOpenApp(title) | Shell search bar + open |
ui5Navigation.getCurrentHash() | Read current URL hash |
Failures:
- App not found — tile or search may not find the target app
- Shell not loaded — navigation fails before FLP bootstrap completes
- Hash collision — multiple apps may respond to the same semantic object
Use when user needs to navigate to a Fiori app, tile, or FLP home page. Do not use for in-app routing (sections, tabs) — use objectPage helpers instead.
UI5-NAV-002 — Shell header operations
Interact with the Fiori Launchpad shell header (home, user menu, notifications).
Guarantees:
- Targets well-known FLP shell DOM IDs (
#shell-header,#meAreaHeaderButton) - Works across Fiori 2.0 and 3.0 shell layouts
APIs:
| API | Description |
|---|---|
ui5Shell.expectShellHeader() | Assert shell header is visible |
ui5Shell.clickHome() | Navigate to FLP home via logo |
ui5Shell.openUserMenu() | Open user avatar menu |
ui5Shell.openNotifications() | Open notifications panel |
Failures:
- Shell not rendered — throws
NavigationErrorif#shell-headeris missing - Custom shell — non-standard FLP shells may use different selectors
Use when user needs to interact with FLP shell header (home, user menu, notifications).
Do not use for in-app navigation — use ui5Navigation instead.
AUTH: Authentication & Session Setup
UI5-AUTH-001 — SAP authentication strategies
Authenticate to SAP systems using pluggable strategies (on-prem, Cloud SAML, O365, API, cert).
Guarantees:
- Strategy auto-detected from URL pattern or explicit config
- Custom strategies can be registered via
registerAuthStrategy() - Session tracked with
authenticatedAttimestamp - Auto-logout during fixture teardown if session is active
APIs:
| API | Description |
|---|---|
sapAuth.login(page, config) | Execute auth flow via strategy |
sapAuth.logout(page) | Server-side logout |
sapAuth.getSessionInfo() | Read session metadata |
createAuthStrategy(config) | Factory for built-in strategies |
registerAuthStrategy(name, factory) | Register custom strategy |
detectSystemType(config) | Auto-detect on-prem vs cloud |
Failures:
- Invalid credentials — strategy-specific error after login page interaction
- SAML redirect timeout — Cloud SAML IdP may be slow to respond
- Session expired — re-authentication needed mid-test
- Multi-tenant URL construction — incorrect subdomain causes 404
Use when user needs to log in/out of an SAP system or configure auth strategies. Do not use for non-SAP authentication — use Playwright's built-in auth instead.
UI5-AUTH-002 — Authentication state checks
Verify authentication state without performing login/logout.
Guarantees:
- Page-level checks via
page.evaluate()— no server roundtrip - Checks multiple indicators (UI5 loaded, shell visible, login page, user menu)
APIs:
| API | Description |
|---|---|
isAuthenticated(page) | Composite check for logged-in state |
isLoginPageVisible(page) | Detect login form on screen |
isShellVisible(page) | Detect FLP shell header |
isUI5Loaded(page) | Detect sap.ui.getCore() |
isUserMenuVisible(page) | Detect user avatar button |
Failures:
- Partial load — shell visible but UI5 not fully bootstrapped
- Custom login page — non-standard login forms may not be detected
Use when user needs to check if the current page is authenticated.
Do not use to perform login — use sapAuth.login() instead.
DATA: Data & Model Inspection
UI5-DATA-001 — OData model queries
Read OData model data, properties, and pending changes from the UI5 model layer.
Guarantees:
- Reads via
page.evaluate()from the UI5 OData model (not HTTP) - Supports custom model names for multi-model apps
- CSRF token fetched via HEAD request for write operations
APIs:
| API | Description |
|---|---|
ui5.odata.getModelData(path) | Read entity or collection — ODataModel.getData() |
ui5.odata.getModelProperty(path) | Read single property — ODataModel.getProperty() |
ui5.odata.waitForLoad(opts) | Wait for OData requests to complete |
ui5.odata.fetchCSRFToken(url) | Fetch token for write operations |
ui5.odata.getEntityCount(path) | Count entities at model path |
ui5.odata.hasPendingChanges() | Check for unsaved changes — ODataModel.hasPendingChanges() |
Failures:
- Model not found — default model may not be OData type
- Path not bound — model path has no data if view hasn't loaded it
- CSRF token expired — token has limited lifetime
Use when user needs to read OData model data or check for pending changes. Do not use for HTTP CRUD — use OData HTTP methods for direct service calls.
UI5-DATA-002 — OData HTTP operations
Execute CRUD operations and function imports against OData services via HTTP.
Guarantees:
- Uses Playwright's
page.requestAPI (not the UI5 model layer) - Supports OData V2 and V4 URL conventions
- CSRF token handled automatically for mutating operations
APIs:
| API | Description |
|---|---|
ui5.odata.createEntity(url, set, data) | POST new entity |
ui5.odata.updateEntity(url, set, key, data) | PUT/PATCH entity |
ui5.odata.deleteEntity(url, set, key) | DELETE entity |
ui5.odata.queryEntities(url, set, opts) | GET with $filter/$select/$expand |
ui5.odata.callFunctionImport(url, fn, params) | Invoke function import |
Failures:
- Service unavailable — 404 if OData service not activated in SAP
- Authorization error — 403 for missing SAP roles
- Entity not found — 404 on update/delete of non-existent key
Use when user needs to create, update, delete, or query OData entities via HTTP.
Do not use for reading model-layer data — use getModelData() instead.
TBL: Tables & Lists
UI5-TBL-001 — Table operations
Read, select, filter, sort, and export rows in sap.m.Table and sap.ui.table.Table.
Guarantees:
- Auto-detects table type (responsive vs grid vs analytical) via
detectTableType() - Pre-action UI5 stability wait on every method call
- Each operation wrapped in
test.step()for trace viewer - Supports Smart Table variants
APIs:
| API | Description |
|---|---|
ui5.table.getRows(id) | Get all row data |
ui5.table.getRowCount(id) | Count visible rows |
ui5.table.getCellValue(id, row, col) | Read cell text |
ui5.table.getData(id) | Get full table data as array |
ui5.table.selectRow(id, row) | Select a row by index |
ui5.table.selectAll(id) | Select all rows |
ui5.table.deselectAll(id) | Deselect all rows |
ui5.table.getSelectedRows(id) | Get selected row indices |
ui5.table.waitForData(id) | Wait for rows to load |
ui5.table.findRowByValues(id, criteria) | Find row by column values |
ui5.table.clickRow(id, row) | Click a row |
ui5.table.selectRowByValues(id, values) | Select by column match |
ui5.table.ensureRowVisible(id, row) | Scroll to row |
ui5.table.setTableCellValue(id, row, col, value) | Write cell value |
ui5.table.getColumnNames(id) | List column headers |
ui5.table.getCellByColumnName(id, row, col) | Read by column name |
ui5.table.filterByColumn(id, col, value) | Apply column filter |
ui5.table.sortByColumn(id, col) | Toggle column sort |
ui5.table.getSortOrder(id, col) | Read sort direction |
ui5.table.getFilterValue(id, col) | Read active filter value |
ui5.table.exportData(id) | Trigger table export |
ui5.table.clickSettings(id) | Open table settings dialog |
Failures:
- Table not found — throws if control ID doesn't match a table
- Row index out of bounds — error if
row >= table length - Data not loaded — empty rows before OData response arrives
Use when user needs to interact with a UI5 table (read, select, filter, sort rows).
Do not use for Fiori Elements table helpers — use fe.table instead.
DLG: Dialogs, Popovers & Overlays
UI5-DLG-001 — Dialog management
Wait for, confirm, dismiss, and inspect open UI5 dialogs and popovers.
Guarantees:
searchOpenDialogs: trueselector flag searches the UI5 static area- Pre-action UI5 stability wait on every method call
- Each operation wrapped in
test.step()for trace viewer
APIs:
| API | Description |
|---|---|
ui5.dialog.waitFor(opts) | Wait for any dialog to appear |
ui5.dialog.confirm(opts) | Click positive (OK/Confirm) button |
ui5.dialog.dismiss(opts) | Click negative (Cancel/Close) button |
ui5.dialog.isOpen(dialogId) | Check if specific dialog is open |
ui5.dialog.getOpen() | List all currently open dialogs |
ui5.dialog.getButtons(dialogId) | List available dialog buttons |
ui5.dialog.waitForClosed(dialogId) | Wait for dialog to close |
Failures:
- No dialog open —
waitFortimes out if no dialog appears - Button text mismatch —
confirm/dismissassumes standard button texts - Popover vs Dialog — some overlays use
Popover, notDialog
Use when user needs to interact with UI5 dialogs, message boxes, or popovers. Do not use for in-page sections or panels — use objectPage helpers.
DTP: Date & Time Controls
UI5-DTP-001 — Date and time picker controls
Set and read DatePicker, DateRangeSelection, and TimePicker control values.
Guarantees:
- Handles SAP date format conversion via
formatDateForUI5() - Supports
Dateobjects, ISO strings, and epoch numbers as input setAndValidatecombines set + read-back assertion
APIs:
| API | Description |
|---|---|
ui5.date.setDatePicker(id, date, opts) | Set date value |
ui5.date.getDatePicker(id) | Read current date value |
ui5.date.setDateRange(id, start, end) | Set date range selection |
ui5.date.getDateRange(id) | Read date range values |
ui5.date.setTimePicker(id, time) | Set time value |
ui5.date.getTimePicker(id) | Read current time value |
ui5.date.setAndValidate(id, date) | Set and verify roundtrip |
Failures:
- Invalid date format — format mismatch between input and UI5 locale
- Date picker closed — value may not persist if picker not properly focused
Use when user needs to set or read date/time picker controls in SAP UI5 forms.
Do not use for non-date inputs — use ui5.fill() for regular text fields.
FE: Fiori Elements Helpers
UI5-FE-001 — List Report operations
Filter, search, navigate, and manage variants in Fiori Elements List Report pages.
Guarantees:
- Works with standard FE-generated List Report templates
- Targets FE-specific DOM structure (FilterBar, SmartTable)
APIs:
| API | Description |
|---|---|
fe.listReport.getTable() | Get the main List Report table info |
fe.listReport.getFilterBar() | Get the FilterBar control info |
fe.listReport.setFilter(field, value) | Set a filter bar field value |
fe.listReport.search() | Execute the Go/Search button |
fe.listReport.clearFilters() | Reset all filter bar fields |
fe.listReport.navigateToItem(rowIndex) | Navigate to detail page |
fe.listReport.getVariants() | List available view variants |
fe.listReport.selectVariant(name) | Activate a variant |
fe.listReport.getFilterValue(field) | Read a filter field's value |
Failures:
- No FilterBar — page may not use standard FE FilterBar component
- Variant not found — variant name doesn't match available options
Use when user needs to operate on a Fiori Elements List Report page.
Do not use for custom-built list pages — use ui5.table and ui5.control instead.
UI5-FE-002 — Object Page operations
Edit, save, navigate sections, and inspect headers in Fiori Elements Object Pages.
Guarantees:
- Works with standard FE-generated Object Page templates
- Supports section navigation by title or ID
APIs:
| API | Description |
|---|---|
fe.objectPage.clickEdit() | Enter edit mode |
fe.objectPage.clickSave() | Save changes |
fe.objectPage.clickButton(name) | Click any Object Page button |
fe.objectPage.navigateToSection(title) | Scroll to section |
fe.objectPage.getSections() | List all sections |
fe.objectPage.getSectionData(title) | Read section content |
fe.objectPage.getHeaderTitle() | Read header title |
fe.objectPage.isInEditMode() | Check edit/display mode |
Failures:
- Section not found — title doesn't match any rendered section
- Not in edit mode — save fails if not switched to edit first
Use when user needs to operate on a Fiori Elements Object Page.
Do not use for custom detail pages — use ui5.control and ui5.click instead.
UI5-FE-003 — FE table and list helpers
Read rows, cells, and interact with Fiori Elements tables and lists.
Guarantees:
- FE-specific helpers that understand FE table/list DOM structure
- Separate from core table module — optimized for FE templates
APIs:
| API | Description |
|---|---|
fe.table.getRowCount(id) | Count FE table rows |
fe.table.getCellValue(id, row, col) | Read FE cell value by column name |
fe.table.findRow(id, values) | Find row matching column values |
fe.table.clickRow(id, row) | Click an FE table row |
fe.table.getColumnNames(id) | List FE table column names |
fe.list.getItemCount(id) | Count list items |
fe.list.getItemTitle(id, index) | Read list item title |
fe.list.findItemByTitle(id, title) | Find item by title text |
fe.list.clickItem(id, index) | Click a list item |
fe.list.selectItem(id, index, selected) | Toggle list item selection |
Failures:
- Not a FE table — helpers assume FE-generated table structure
- Column name mismatch — column names are case-sensitive
Use when user needs to read or interact with Fiori Elements tables or lists.
Do not use for core sap.m.Table — use ui5.table methods instead.
FIX: Fixtures & Test Configuration
UI5-FIX-001 — Merged test fixtures
Single import provides all Praman fixtures (ui5, navigation, auth, AI, FE, etc.).
Guarantees:
import { test, expect } from 'playwright-praman'gives everything- Fixtures composed via Playwright's
mergeTests()— no import conflicts - Worker fixtures (config, logger, tracer) created once per worker
- Test fixtures (ui5, sapAuth) created per test with proper teardown
APIs:
| API | Description |
|---|---|
test | Merged Playwright test with all fixtures |
expect | Playwright expect with UI5 matchers registered |
coreTest | Standalone core fixtures (config, logger, ui5) |
authTest | Standalone auth fixtures (sapAuth) |
navTest | Standalone navigation fixtures (ui5Navigation, btpWorkZone) |
stabilityTest | Standalone stability fixtures (auto-wait, interception) |
feTest | Standalone Fiori Elements fixtures (fe) |
aiTest | Standalone AI fixtures (pramanAI) |
intentTest | Standalone intent fixtures (intent) |
moduleTest | Core + table/dialog/date/odata sub-namespaces |
shellFooterTest | Shell + footer fixtures (ui5Shell, ui5Footer) |
flpLocksTest | FLP lock management fixtures (flpLocks) |
flpSettingsTest | FLP user settings fixtures (flpSettings) |
testDataTest | Test data generation fixtures (testData) |
Failures:
- Missing Playwright version — requires
>=1.57.0, asserted at worker init - Config file not found —
loadConfig()uses defaults with warning
Use when user needs to understand which fixtures are available or how to import. Do not use for specific fixture usage — refer to the relevant capability.
UI5-FIX-002 — Configuration management
Define and load validated, frozen Praman configuration with Zod schema.
Guarantees:
- Zod-validated with detailed error messages on invalid config
- Configuration is
Readonly<PramanConfig>— never mutated at runtime - Loaded once per worker via
loadConfig() - Supports
praman.config.tsfile discovery
APIs:
| API | Description |
|---|---|
defineConfig(input) | Create typed config with defaults applied |
loadConfig(opts?) | Load and validate config from file or env |
Failures:
- Invalid config — throws
ConfigErrorwith field-level validation details - File not found — falls back to defaults with structured warning
Use when user needs to configure Praman timeouts, strategies, or auth settings. Do not use for Playwright config — this is Praman-specific configuration.
AI: AI Agent Operability
UI5-AI-001 — Page discovery for AI agents
Discover all UI5 controls on a page and build structured context for LLM prompts.
Guarantees:
- Returns
AiResponseenvelope with status, data, and metadata - Discovers control types, IDs, properties, and aggregations
- Context includes UI5 version detection
APIs:
| API | Description |
|---|---|
pramanAI.discoverPage(opts?) | Find all controls on current page |
pramanAI.buildContext() | Enriched page context with UI5 version |
discoverPage(page, opts) | Standalone discovery function |
buildPageContext(page, config) | Standalone context builder |
Failures:
- Non-UI5 page — returns empty context with status indicating no UI5
- Too many controls — large pages may hit
evaluate()payload limits
Use when an AI agent needs to understand the current page structure.
Do not use for manual test authoring — use ui5.control/inspect instead.
UI5-AI-002 — Capability and recipe registries
Machine-readable registries mapping Praman capabilities and test recipes for AI agents.
Guarantees:
- Capabilities indexed by category code for agent tool selection
- Recipes provide step-by-step patterns for common SAP test scenarios
- Both registries loadable from generated YAML or programmatic API
APIs:
| API | Description |
|---|---|
CapabilityRegistry | Query capabilities by ID or category |
RecipeRegistry | Query recipes by name, domain, or pattern |
capabilities | Pre-loaded capability data |
recipes | Pre-loaded recipe data |
Failures:
- Registry empty — capabilities/recipes not generated yet
- Version mismatch — registry from different plugin version
Use when an AI agent needs to select which Praman methods to call for a task. Do not use for human test authoring — read the documentation instead.
UI5-AI-003 — LLM service and agentic handler
Connect to LLM providers and execute agentic test generation workflows.
Guarantees:
- Supports Anthropic and OpenAI via optional peer dependencies
- Dynamic import — AI deps only loaded when
pramanAIfixture is used - LLM connection cleaned up on fixture teardown
APIs:
| API | Description |
|---|---|
pramanAI.llm | Raw LLM service for direct prompting |
pramanAI.agentic | AgenticHandler for autonomous test generation |
createLlmService(config) | Factory for LLM provider connection |
AgenticHandler | Orchestrates discovery + prompting + generation |
Failures:
- No API key — throws
AIErrorif provider key not configured - Provider unreachable — network timeout on LLM call
- Token limit — large page context may exceed provider token window
Use when user needs AI-powered test generation or LLM integration. Do not use for manual test writing — use fixtures and intents instead.
VOCAB: Business Vocabulary
UI5-VOCAB-001 — SAP business vocabulary resolution
Resolve natural-language business terms to UI5 selectors across SAP domains.
Guarantees:
- Fuzzy matching with configurable threshold
- Synonym resolution across 6 SAP domains (procurement, sales, finance, manufacturing, warehouse, quality)
- Vocabulary loaded per-domain for token efficiency
APIs:
| API | Description |
|---|---|
pramanAI.vocabulary | VocabularyService instance |
createVocabularyService() | Factory for vocabulary service |
vocabulary.loadDomain(domain) | Load domain-specific terms |
vocabulary.search(term) | Fuzzy search across loaded domains |
Failures:
- Domain not loaded — search returns empty if domain not preloaded
- Term ambiguous — multiple matches across domains
- Vocabulary file missing — throws
VocabularyError
Use when user mentions SAP business terms (vendor, PO, material) and needs selector mapping.
Do not use for technical UI5 control names — use ui5.control with controlType.
INT: SAP Business Intents
UI5-INT-001 — SAP domain intent operations
Execute high-level SAP business operations across 5 modules via typed intent functions.
Guarantees:
- Vocabulary domains auto-preloaded before
use()— ready immediately - Typed input data for each operation (PO, SO, journal entry, etc.)
- Returns
IntentResultwith status, message, and operation details - All intent functions use
test.step()for Playwright trace integration
APIs:
| API | SAP Transaction |
|---|---|
intent.core.fillField(label, value) | Fill form field by business label |
intent.core.clickButton(text) | Click button by label |
intent.core.selectOption(label, option) | Select from dropdown by label |
intent.core.assertField(label, expected) | Assert field value |
intent.core.confirmAndWait() | Click Confirm and wait for close |
intent.core.waitForSave() | Wait for save completion |
intent.procurement.createPurchaseOrder(data) | ME21N |
intent.procurement.approvePurchaseOrder(data) | PO approval |
intent.procurement.searchPurchaseOrders(criteria) | PO search |
intent.procurement.createPurchaseRequisition(data) | ME51N |
intent.procurement.confirmGoodsReceipt(data) | MIGO |
intent.procurement.searchVendors() | Vendor master search |
intent.sales.createSalesOrder(data) | VA01 |
intent.sales.createQuotation(data) | VA21 |
intent.sales.approveQuotation(data) | Quotation approval |
intent.sales.searchSalesOrders(criteria) | SO search |
intent.sales.searchCustomers() | Customer master search |
intent.sales.checkDeliveryStatus(data) | Delivery status check |
intent.finance.createJournalEntry(data) | FB50 |
intent.finance.postVendorInvoice(data) | FB60 |
intent.finance.processPayment(data) | F-53 |
intent.manufacturing.createProductionOrder(data) | CO01 |
intent.manufacturing.confirmProductionOrder(data) | CO11N |
intent.masterData.createVendorMaster(data) | XK01/BP |
intent.masterData.createCustomerMaster(data) | XD01/BP |
intent.masterData.createMaterialMaster(data) | MM01 |
Failures:
- App not found — intent navigates to wrong app if hash mapping fails
- Field label not resolved — vocabulary miss for custom field labels
- Mandatory field missing — SAP validation rejects incomplete data
Use when user describes a SAP business operation (create PO, post invoice, etc.).
Do not use for low-level control interactions — use ui5.click/fill instead.
FLP: FLP Platform Services
UI5-FLP-001 — FLP lock management
Query, count, and delete SAP SM12 lock entries via OData for test isolation.
Guarantees:
- Auto-cleanup of tracked locks during fixture teardown
- CSRF token fetched automatically for delete operations
- Non-fatal cleanup — failures logged as warnings, not thrown
APIs:
| API | Description |
|---|---|
flpLocks.getLockEntries(username?) | Query SM12 lock entries |
flpLocks.getNumberOfLockEntries(username?) | Count lock entries |
flpLocks.deleteAllLockEntries(username?) | Delete all matching locks |
flpLocks.cleanup() | Auto-release tracked locks (teardown) |
Failures:
SM12_SRVnot activated — throwsFLPErrorwithERR_FLP_API_UNAVAILABLE- Permission denied — 403 if user lacks SM12 authorization
- Lock already released — delete returns 404 (handled gracefully)
Use when user needs to manage SAP lock entries during test setup/teardown. Do not use for application-level locking — this is system-level SM12 locks.
UI5-FLP-002 — FLP user settings
Read SAP Fiori Launchpad user settings (language, date/time format, timezone).
Guarantees:
- Reads from
sap.ushell.Container.getUser()— no HTTP roundtrip getAllSettings()returns all 5 settings in a single evaluate call
APIs:
| API | Description |
|---|---|
flpSettings.getLanguage() | User language code |
flpSettings.getDateFormat() | Date format identifier |
flpSettings.getTimeFormat() | Time format identifier |
flpSettings.getTimezone() | Timezone identifier |
flpSettings.getNumberFormat() | Number format identifier |
flpSettings.getAllSettings() | All settings in one call |
Failures:
- UShell not available — page is not an FLP application
- Container not loaded — called before FLP shell bootstrap
Use when user needs to read or verify FLP user locale settings. Do not use for changing settings — this is read-only.
DX: Developer Experience & Tooling
UI5-DX-001 — Test data generation
Generate test data from templates with UUID/timestamp placeholders and auto-cleanup.
Guarantees:
{{uuid}}generates unique value per occurrence{{timestamp}}generates ISO-8601 at generation time- Recursive template substitution for nested objects/arrays
- Auto-cleanup removes all persisted files on test teardown
APIs:
| API | Description |
|---|---|
testData.generate(template) | Substitute placeholders in template |
testData.save(filename, data) | Persist as JSON file |
testData.load(filename) | Load and parse JSON file |
testData.cleanup() | Remove all tracked files (auto on teardown) |
Failures:
- File write permission — test output directory may not be writable
- JSON parse error — corrupted file on load
Use when user needs to generate unique test data or persist data between test steps. Do not use for production data — this is ephemeral test data only.
UI5-DX-002 — CLI tooling
Scaffold projects, diagnose environments, and manage plugin installation.
Guarantees:
- No external CLI framework — minimal Node.js argv parsing
- Cross-platform compatible (Windows/macOS/Linux)
APIs:
| API | Description |
|---|---|
npx playwright-praman init | Scaffold new Praman project |
npx playwright-praman doctor | Run environment diagnostics |
npx playwright-praman uninstall | Remove scaffolded files |
npx playwright-praman --version | Print package version |
Failures:
- Wrong Node.js version — requires
>=20 - Missing Playwright — init fails without
@playwright/testpeer
Use when user needs to set up a new Praman project or diagnose environment issues.
Do not use for test execution — use npx playwright test instead.
UI5-DX-003 — Compliance and OData trace reporters
Generate structured compliance reports and OData trace logs from test runs.
Guarantees:
ComplianceReportertracks Praman step usage per testODataTraceReportercaptures all OData requests with entity stats- Both implement Playwright's
Reporterinterface for config integration
APIs:
| API | Description |
|---|---|
ComplianceReporter | Tracks isPramanStep() usage per test |
ODataTraceReporter | Captures OData HTTP requests and entity stats |
Failures:
- Reporter not configured — must be added to
playwright.config.ts - Output directory missing — reporter creates output dir if needed
Use when user needs compliance reports or OData request traces from test runs. Do not use for test assertions — these are post-run reporting tools.
UI5-DX-004 — Structured error hierarchy
Rich error classes with error codes, suggestions, and retry hints for debugging.
Guarantees:
- All errors extend
PramanErrorwithcode,attempted,retryable,suggestions[] - 14 error classes covering every failure domain (control, auth, nav, OData, etc.)
- Machine-readable
ErrorCodeenum for programmatic error handling
APIs:
| API | Description |
|---|---|
PramanError | Base class with structured fields |
ControlError | Control not found / interaction failed |
AuthError | Authentication flow failures |
NavigationError | FLP navigation failures |
BridgeError | Browser bridge injection/execution failures |
ConfigError | Configuration validation failures |
TimeoutError | Operation timeout with timeoutMs field |
ODataError | OData service/model errors |
FLPError | FLP platform service errors |
SelectorError | Invalid selector construction |
AIError | AI/LLM service errors |
IntentError | SAP business intent failures |
VocabularyError | Vocabulary resolution failures |
PluginError | Plugin lifecycle errors |
Failures:
- Untyped catch — always check
instanceoffor proper error handling
Use when handling or diagnosing errors from any Praman operation. Do not use to throw custom errors — use the appropriate error subclass.
MIG: Migration & Compatibility
UI5-MIG-001 — Branded types and type safety
Opaque branded types prevent mixing incompatible string identifiers.
Guarantees:
AppId,ControlId,ViewName,BindingPath,CSSSelectorare distinct types- Constructor functions validate and brand at creation time
- TypeScript compiler prevents passing
AppIdwhereControlIdis expected
APIs:
| API | Description |
|---|---|
appId(raw) | Brand a string as AppId |
controlId(raw) | Brand a string as ControlId |
viewName(raw) | Brand a string as ViewName |
bindingPath(raw) | Brand a string as BindingPath |
cssSelector(raw) | Brand a string as CSSSelector |
Failures:
- Raw string passed — TypeScript error at compile time (not runtime)
Use when constructing typed identifiers for Praman API calls. Do not use for runtime validation — branded types are compile-time only.
Roadmap (Not Yet Shipped)
These capabilities are on the roadmap and not yet available in the current release.
| ID | Name | Target |
|---|---|---|
| UI5-ROAD-001 | Web Components adapter — Shadow DOM traversal for SAP UI5 Web Components hybrid apps | v1.1.0 |
| UI5-ROAD-002 | Visual regression testing — Screenshot comparison with UI5-aware masking | v1.2.0 |
| UI5-ROAD-003 | Record and replay — Record user interactions and generate Praman test code | v1.2.0 |
Appendix A: API Cross-Reference
Alphabetical list of every public API mapped to its capability ID. AI agents use this to map a method name to its behavioral context.
Full API → Capability mapping (140+ entries)
| API | Capability |
|---|---|
AgenticHandler | UI5-AI-003 |
AIError | UI5-DX-004 |
APIAuthStrategy | UI5-AUTH-001 |
appId | UI5-MIG-001 |
assertField | UI5-INT-001 |
AuthError | UI5-DX-004 |
bindingPath | UI5-MIG-001 |
BridgeError | UI5-DX-004 |
buildPageContext | UI5-AI-001 |
callFunctionImport | UI5-DATA-002 |
capabilities | UI5-AI-002 |
CapabilityRegistry | UI5-AI-002 |
CertificateAuthStrategy | UI5-AUTH-001 |
checkDeliveryStatus | UI5-INT-001 |
clearCustomStrategies | UI5-AUTH-001 |
clearFilterBar | UI5-FE-001 |
clickButton | UI5-INT-001 |
clickRow | UI5-TBL-001 |
clickTableSettingsButton | UI5-TBL-001 |
CloudSAMLAuthStrategy | UI5-AUTH-001 |
ComplianceReporter | UI5-DX-003 |
ConfigError | UI5-DX-004 |
confirmAndWait | UI5-INT-001 |
confirmDialog | UI5-DLG-001 |
ControlError | UI5-DX-004 |
controlId | UI5-MIG-001 |
createAuthStrategy | UI5-AUTH-001 |
createEntity | UI5-DATA-002 |
createLlmService | UI5-AI-003 |
createVocabularyService | UI5-VOCAB-001 |
createWorkZoneManager | UI5-NAV-001 |
cssSelector | UI5-MIG-001 |
DATE_FORMATS | UI5-DTP-001 |
DEFAULT_TIMEOUTS | UI5-WAIT-001 |
defineConfig | UI5-FIX-002 |
deleteEntity | UI5-DATA-002 |
deselectAllTableRows | UI5-TBL-001 |
detectSystemType | UI5-AUTH-001 |
detectTableType | UI5-TBL-001 |
discoverPage | UI5-AI-001 |
dismissDialog | UI5-DLG-001 |
DomFirstStrategy | UI5-ACT-001 |
ensureRowVisible | UI5-TBL-001 |
ErrorCode | UI5-DX-004 |
executeSearch | UI5-FE-001 |
exportTableData | UI5-TBL-001 |
feClickListItem | UI5-FE-003 |
feClickRow | UI5-FE-003 |
feFindListItemByTitle | UI5-FE-003 |
feFindRowByValues | UI5-FE-003 |
feGetCellValue | UI5-FE-003 |
feGetColumnNames | UI5-FE-003 |
feGetListItemCount | UI5-FE-003 |
feGetListItemTitle | UI5-FE-003 |
feGetTableRowCount | UI5-FE-003 |
feSelectListItem | UI5-FE-003 |
FETestLibraryInstance | UI5-FE-001 |
fetchCSRFToken | UI5-DATA-001 |
fillField | UI5-INT-001 |
filterByColumn | UI5-TBL-001 |
findRowByValues | UI5-TBL-001 |
FLPError | UI5-DX-004 |
formatDateForUI5 | UI5-DTP-001 |
getAvailableVariants | UI5-FE-001 |
getCellByColumnName | UI5-TBL-001 |
getColumnNames | UI5-TBL-001 |
getCurrentHash | UI5-NAV-001 |
getDatePickerValue | UI5-DTP-001 |
getDateRangeSelection | UI5-DTP-001 |
getDialogButtons | UI5-DLG-001 |
getEntityCount | UI5-DATA-001 |
getFilterBar | UI5-FE-001 |
getFilterBarFieldValue | UI5-FE-001 |
getFilterValue | UI5-TBL-001 |
getHeaderTitle | UI5-FE-002 |
getListReportTable | UI5-FE-001 |
getModelData | UI5-DATA-001 |
getModelProperty | UI5-DATA-001 |
getObjectPageSections | UI5-FE-002 |
getOpenDialogs | UI5-DLG-001 |
getRowCount | UI5-TBL-001 |
getSectionData | UI5-FE-002 |
getSelectedRows | UI5-TBL-001 |
getSortOrder | UI5-TBL-001 |
getTableCellValue | UI5-TBL-001 |
getTableData | UI5-TBL-001 |
getTableRowCount | UI5-TBL-001 |
getTableRows | UI5-TBL-001 |
getTimePickerValue | UI5-DTP-001 |
hasPendingChanges | UI5-DATA-001 |
initializeFETestLibrary | UI5-FE-001 |
IntentError | UI5-DX-004 |
isAuthenticated | UI5-AUTH-002 |
isDialogOpen | UI5-DLG-001 |
isInEditMode | UI5-FE-002 |
isLoginPageVisible | UI5-AUTH-002 |
isShellVisible | UI5-AUTH-002 |
isUI5Loaded | UI5-AUTH-002 |
isUserMenuVisible | UI5-AUTH-002 |
loadConfig | UI5-FIX-002 |
MultiTenantAuthStrategy | UI5-AUTH-001 |
navigateBack | UI5-NAV-001 |
navigateForward | UI5-NAV-001 |
navigateToApp | UI5-NAV-001 |
navigateToHash | UI5-NAV-001 |
navigateToHome | UI5-NAV-001 |
navigateToIntent | UI5-NAV-001 |
navigateToItem | UI5-FE-001 |
navigateToSection | UI5-FE-002 |
navigateToTile | UI5-NAV-001 |
NavigationError | UI5-DX-004 |
ODataError | UI5-DX-004 |
ODataTraceReporter | UI5-DX-003 |
Office365AuthStrategy | UI5-AUTH-001 |
OnPremAuthStrategy | UI5-AUTH-001 |
Opa5Strategy | UI5-ACT-001 |
PACKAGE_NAME | UI5-FIX-001 |
PluginError | UI5-DX-004 |
PramanError | UI5-DX-004 |
queryEntities | UI5-DATA-002 |
RecipeRegistry | UI5-AI-002 |
recipes | UI5-AI-002 |
registerAuthStrategy | UI5-AUTH-001 |
retry | UI5-WAIT-001 |
SAPAuthHandler | UI5-AUTH-001 |
searchAndOpenApp | UI5-NAV-001 |
selectAllTableRows | UI5-TBL-001 |
selectOption | UI5-INT-001 |
selectRowByValues | UI5-TBL-001 |
selectTableRow | UI5-TBL-001 |
selectVariant | UI5-FE-001 |
SelectorError | UI5-DX-004 |
setAndValidateDate | UI5-DTP-001 |
setDatePickerValue | UI5-DTP-001 |
setDateRangeSelection | UI5-DTP-001 |
setFilterBarField | UI5-FE-001 |
setTableCellValue | UI5-TBL-001 |
setTimePickerValue | UI5-DTP-001 |
sortByColumn | UI5-TBL-001 |
TimeoutError | UI5-DX-004 |
UI5NativeStrategy | UI5-ACT-001 |
updateEntity | UI5-DATA-002 |
VERSION | UI5-FIX-001 |
viewName | UI5-MIG-001 |
VocabularyError | UI5-DX-004 |
waitForDialog | UI5-DLG-001 |
waitForDialogClosed | UI5-DLG-001 |
waitForODataLoad | UI5-DATA-001 |
waitForSave | UI5-INT-001 |
waitForTableData | UI5-TBL-001 |
waitForUI5Bootstrap | UI5-WAIT-001 |
waitForUI5Stable | UI5-WAIT-001 |
Appendix B: Capability → SKILL.md Mapping
Maps each capability to its corresponding SKILL.md section. AI agents use this for progressive disclosure — load only the skill section relevant to the current task.
Full Capability → SKILL.md mapping (36 entries)
| Capability | SKILL.md Section | When to Load |
|---|---|---|
| UI5-LOC-001 | ## Control Discovery | User mentions locating, finding, or selecting UI5 controls |
| UI5-LOC-002 | ## Selector Engine | User mentions ui5= selector prefix or Playwright locator integration |
| UI5-LOC-003 | ## Control Inspection | User mentions inspecting, debugging, or reading control metadata |
| UI5-ACT-001 | ## Interactions | User mentions clicking, typing, filling, selecting, or checking controls |
| UI5-ACT-002 | ## Reading Values | User mentions reading text or values from UI5 controls |
| UI5-ACT-003 | ## Footer Actions | User mentions Save, Edit, Cancel, Delete, or Apply buttons |
| UI5-WAIT-001 | ## Synchronization | User mentions waiting, stability, or async rendering issues |
| UI5-WAIT-002 | ## Request Interception | User mentions WalkMe, analytics interference, or request blocking |
| UI5-ASRT-001 | ## Assertions | User mentions asserting or verifying UI5 control properties |
| UI5-ASRT-002 | ## Table Assertions | User mentions asserting table row count, cell text, or selections |
| UI5-NAV-001 | ## Navigation | User mentions navigating to Fiori apps, tiles, or FLP home |
| UI5-NAV-002 | ## Shell Header | User mentions shell header, home button, user menu, or notifications |
| UI5-AUTH-001 | ## Authentication | User mentions login, logout, SAP auth, or session management |
| UI5-AUTH-002 | ## Auth State Checks | User mentions checking if page is authenticated or login page visible |
| UI5-DATA-001 | ## OData Model | User mentions reading OData model data, properties, or pending changes |
| UI5-DATA-002 | ## OData HTTP | User mentions creating, updating, deleting, or querying OData entities |
| UI5-TBL-001 | ## Table Operations | User mentions tables, rows, cells, filtering, sorting, or exporting |
| UI5-DLG-001 | ## Dialogs | User mentions dialogs, popovers, message boxes, or overlays |
| UI5-DTP-001 | ## Date Time | User mentions date pickers, time pickers, or date range selection |
| UI5-FE-001 | ## Fiori Elements List Report | User mentions List Report, filter bar, variants, or FE search |
| UI5-FE-002 | ## Fiori Elements Object Page | User mentions Object Page, sections, edit mode, or FE header |
| UI5-FE-003 | ## Fiori Elements Tables and Lists | User mentions FE-specific tables or lists |
| UI5-FIX-001 | ## Fixtures | User asks about importing or composing Praman fixtures |
| UI5-FIX-002 | ## Configuration | User asks about configuring Praman settings or timeouts |
| UI5-AI-001 | ## AI Discovery | User mentions AI page discovery or building page context for LLMs |
| UI5-AI-002 | ## AI Registries | User mentions capability registry, recipe registry, or AI tool selection |
| UI5-AI-003 | ## AI LLM Integration | User mentions LLM providers, agentic test generation, or AI workflows |
| UI5-VOCAB-001 | ## Vocabulary | User mentions business terms, synonym resolution, or vocabulary lookup |
| UI5-INT-001 | ## SAP Business Intents | User mentions purchase orders, sales orders, invoices, or SAP transactions |
| UI5-FLP-001 | ## FLP Locks | User mentions SM12 lock entries or test isolation locks |
| UI5-FLP-002 | ## FLP Settings | User mentions FLP user settings, language, timezone, or date format |
| UI5-DX-001 | ## Test Data | User mentions generating test data, UUID placeholders, or data persistence |
| UI5-DX-002 | ## CLI | User mentions project setup, init, doctor, or uninstall commands |
| UI5-DX-003 | ## Reporters | User mentions compliance reports, OData traces, or test run analytics |
| UI5-DX-004 | ## Error Handling | User encounters an error or asks about error codes and handling |
| UI5-MIG-001 | ## Type Safety | User asks about branded types, AppId, ControlId, or type-safe strings |
Appendix C: Failure → Resolution Quick Reference
For each common failure, the resolution and associated capability. AI agents use this for self-healing.
| Failure | Capability | Resolution |
|---|---|---|
| Control not rendered yet | UI5-LOC-001 | Add waitForUI5Bootstrap before control discovery, or increase timeout |
| Ambiguous selector matches multiple controls | UI5-LOC-001 | Add viewName, controlType, or ancestor constraint to narrow scope |
| Timeout waiting for control | UI5-LOC-001 | Increase timeout, verify navigation completed, check if control is in a dialog (add searchOpenDialogs: true) |
| Bridge not injected | UI5-WAIT-001 | Bridge auto-injects on first use; if page navigated, injection resets automatically |
| WalkMe interfering with tests | UI5-WAIT-002 | Verify stability fixture is active; add WalkMe URL pattern to ignoreAutoWaitUrls config |
| Dialog button not found | UI5-DLG-001 | Check button text matches exactly; use getButtons() to list available buttons first |
| Table has no rows | UI5-TBL-001 | Use waitForData() or waitForODataLoad() before reading table; verify filter criteria |
| OData model path has no data | UI5-DATA-001 | Verify the path matches bound entities; use waitForODataLoad() after navigation |
| CSRF token expired | UI5-DATA-002 | Fetch a new token via fetchCSRFToken() before the write operation |
| Authentication failed | UI5-AUTH-001 | Verify credentials; check if strategy matches system type (on-prem vs cloud) |
| SM12_SRV service unavailable | UI5-FLP-001 | Activate the SM12_SRV OData service in SAP (transaction /IWFND/MAINT_SERVICE) |
| UShell Container not available | UI5-FLP-002 | Ensure page is a Fiori Launchpad app and shell is fully loaded |
| Intent navigation wrong app | UI5-INT-001 | Verify semantic object hash mapping; check FLP catalog configuration |
| Vocabulary term not found | UI5-VOCAB-001 | Load the correct domain via loadDomain() before searching; check for typos |
| Date format mismatch | UI5-DTP-001 | Use formatDateForUI5() to convert dates; check FLP user date format settings |
| Footer button not found | UI5-ACT-003 | Verify the page is in the correct mode (edit vs display); check button text exactly |