Skip to main content
Version: 1.x

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.

Audiences

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_hint fields to select capabilities and avoid anti-patterns

Overview

MetricCount
Total Capabilities36
Total Public APIs231
Category Codes18
Source of Truthplaywright-praman/src/**/*.ts (exports only)
Version1.0.1

Category Codes

CodeDomain
LOCControl Discovery & Locators
ACTInteractions & Actions
WAITWaiting & Synchronization
ASRTAssertions & Matchers
NAVNavigation & Routing
AUTHAuthentication & Session Setup
DATAData & Model Inspection
TBLTables & Lists
DLGDialogs, Popovers & Overlays
DTPDate & Time Controls
FEFiori Elements Helpers
FLPFLP Platform Services
VOCABBusiness Vocabulary
INTSAP Business Intents
FIXFixtures & Test Configuration
AIAI Agent Operability
DXDeveloper Experience & Tooling
MIGMigration & 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:

APIDescription
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 ControlError if called before UI5 bootstraps
  • Ambiguous match — returns first match; use controlType + properties to narrow
  • Stale ID after navigation — cache is invalidated on frame navigation events
  • Timeout waiting for control — throws TimeoutError after configurable deadline
Agent Hint

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 controlType and ID via data-sap-ui attributes
  • Compatible with all Playwright locator methods (click, fill, waitFor)

APIs:

APIDescription
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-ui attributes
Agent Hint

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:

APIDescription
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
Agent Hint

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:

APIDescription
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 ControlError with selector details
  • Control not interactable — strategy-level error if control is disabled/invisible
  • Input validation rejection — fireChange may trigger UI5 server-side validation
Agent Hint

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 API getText()/getValue()

APIs:

APIDescription
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
Agent Hint

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.

Click standard Fiori footer bar buttons (Save, Edit, Cancel, Delete, Create, Apply).

Guarantees:

  • Targets buttons by visible text in the .sapMBarChild footer area
  • Each click appears as a named step in Playwright trace viewer

APIs:

APIDescription
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 ControlError if button text not found
  • Wrong view mode — Edit button only appears in display mode, Save in edit mode
Agent Hint

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:

APIDescription
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.ui is undefined (non-UI5 page)
  • Infinite pending — times out if UI5 keeps scheduling micro-tasks
Agent Hint

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_PATTERNS plus custom ignoreAutoWaitUrls
  • Routes are cleaned up in teardown to avoid handler leaks

APIs:

APIDescription
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
Agent Hint

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:

APIDescription
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
Agent Hint

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:

APIDescription
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
Agent Hint

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.


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:

APIDescription
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
Agent Hint

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:

APIDescription
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 NavigationError if #shell-header is missing
  • Custom shell — non-standard FLP shells may use different selectors
Agent Hint

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 authenticatedAt timestamp
  • Auto-logout during fixture teardown if session is active

APIs:

APIDescription
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
Agent Hint

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:

APIDescription
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
Agent Hint

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:

APIDescription
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
Agent Hint

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.request API (not the UI5 model layer)
  • Supports OData V2 and V4 URL conventions
  • CSRF token handled automatically for mutating operations

APIs:

APIDescription
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
Agent Hint

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:

APIDescription
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
Agent Hint

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: true selector 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:

APIDescription
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 — waitFor times out if no dialog appears
  • Button text mismatch — confirm/dismiss assumes standard button texts
  • Popover vs Dialog — some overlays use Popover, not Dialog
Agent Hint

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 Date objects, ISO strings, and epoch numbers as input
  • setAndValidate combines set + read-back assertion

APIs:

APIDescription
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
Agent Hint

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:

APIDescription
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
Agent Hint

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:

APIDescription
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
Agent Hint

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:

APIDescription
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
Agent Hint

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:

APIDescription
testMerged Playwright test with all fixtures
expectPlaywright expect with UI5 matchers registered
coreTestStandalone core fixtures (config, logger, ui5)
authTestStandalone auth fixtures (sapAuth)
navTestStandalone navigation fixtures (ui5Navigation, btpWorkZone)
stabilityTestStandalone stability fixtures (auto-wait, interception)
feTestStandalone Fiori Elements fixtures (fe)
aiTestStandalone AI fixtures (pramanAI)
intentTestStandalone intent fixtures (intent)
moduleTestCore + table/dialog/date/odata sub-namespaces
shellFooterTestShell + footer fixtures (ui5Shell, ui5Footer)
flpLocksTestFLP lock management fixtures (flpLocks)
flpSettingsTestFLP user settings fixtures (flpSettings)
testDataTestTest 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
Agent Hint

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.ts file discovery

APIs:

APIDescription
defineConfig(input)Create typed config with defaults applied
loadConfig(opts?)Load and validate config from file or env

Failures:

  • Invalid config — throws ConfigError with field-level validation details
  • File not found — falls back to defaults with structured warning
Agent Hint

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 AiResponse envelope with status, data, and metadata
  • Discovers control types, IDs, properties, and aggregations
  • Context includes UI5 version detection

APIs:

APIDescription
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
Agent Hint

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:

APIDescription
CapabilityRegistryQuery capabilities by ID or category
RecipeRegistryQuery recipes by name, domain, or pattern
capabilitiesPre-loaded capability data
recipesPre-loaded recipe data

Failures:

  • Registry empty — capabilities/recipes not generated yet
  • Version mismatch — registry from different plugin version
Agent Hint

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 pramanAI fixture is used
  • LLM connection cleaned up on fixture teardown

APIs:

APIDescription
pramanAI.llmRaw LLM service for direct prompting
pramanAI.agenticAgenticHandler for autonomous test generation
createLlmService(config)Factory for LLM provider connection
AgenticHandlerOrchestrates discovery + prompting + generation

Failures:

  • No API key — throws AIError if provider key not configured
  • Provider unreachable — network timeout on LLM call
  • Token limit — large page context may exceed provider token window
Agent Hint

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:

APIDescription
pramanAI.vocabularyVocabularyService 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
Agent Hint

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 IntentResult with status, message, and operation details
  • All intent functions use test.step() for Playwright trace integration

APIs:

APISAP 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
Agent Hint

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:

APIDescription
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_SRV not activated — throws FLPError with ERR_FLP_API_UNAVAILABLE
  • Permission denied — 403 if user lacks SM12 authorization
  • Lock already released — delete returns 404 (handled gracefully)
Agent Hint

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:

APIDescription
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
Agent Hint

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:

APIDescription
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
Agent Hint

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:

APIDescription
npx playwright-praman initScaffold new Praman project
npx playwright-praman doctorRun environment diagnostics
npx playwright-praman uninstallRemove scaffolded files
npx playwright-praman --versionPrint package version

Failures:

  • Wrong Node.js version — requires >=20
  • Missing Playwright — init fails without @playwright/test peer
Agent Hint

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:

  • ComplianceReporter tracks Praman step usage per test
  • ODataTraceReporter captures all OData requests with entity stats
  • Both implement Playwright's Reporter interface for config integration

APIs:

APIDescription
ComplianceReporterTracks isPramanStep() usage per test
ODataTraceReporterCaptures 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
Agent Hint

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 PramanError with code, attempted, retryable, suggestions[]
  • 14 error classes covering every failure domain (control, auth, nav, OData, etc.)
  • Machine-readable ErrorCode enum for programmatic error handling

APIs:

APIDescription
PramanErrorBase class with structured fields
ControlErrorControl not found / interaction failed
AuthErrorAuthentication flow failures
NavigationErrorFLP navigation failures
BridgeErrorBrowser bridge injection/execution failures
ConfigErrorConfiguration validation failures
TimeoutErrorOperation timeout with timeoutMs field
ODataErrorOData service/model errors
FLPErrorFLP platform service errors
SelectorErrorInvalid selector construction
AIErrorAI/LLM service errors
IntentErrorSAP business intent failures
VocabularyErrorVocabulary resolution failures
PluginErrorPlugin lifecycle errors

Failures:

  • Untyped catch — always check instanceof for proper error handling
Agent Hint

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, CSSSelector are distinct types
  • Constructor functions validate and brand at creation time
  • TypeScript compiler prevents passing AppId where ControlId is expected

APIs:

APIDescription
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)
Agent Hint

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)

Planned — Not Available Yet

These capabilities are on the roadmap and not yet available in the current release.

IDNameTarget
UI5-ROAD-001Web Components adapter — Shadow DOM traversal for SAP UI5 Web Components hybrid appsv1.1.0
UI5-ROAD-002Visual regression testing — Screenshot comparison with UI5-aware maskingv1.2.0
UI5-ROAD-003Record and replay — Record user interactions and generate Praman test codev1.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)
APICapability
AgenticHandlerUI5-AI-003
AIErrorUI5-DX-004
APIAuthStrategyUI5-AUTH-001
appIdUI5-MIG-001
assertFieldUI5-INT-001
AuthErrorUI5-DX-004
bindingPathUI5-MIG-001
BridgeErrorUI5-DX-004
buildPageContextUI5-AI-001
callFunctionImportUI5-DATA-002
capabilitiesUI5-AI-002
CapabilityRegistryUI5-AI-002
CertificateAuthStrategyUI5-AUTH-001
checkDeliveryStatusUI5-INT-001
clearCustomStrategiesUI5-AUTH-001
clearFilterBarUI5-FE-001
clickButtonUI5-INT-001
clickRowUI5-TBL-001
clickTableSettingsButtonUI5-TBL-001
CloudSAMLAuthStrategyUI5-AUTH-001
ComplianceReporterUI5-DX-003
ConfigErrorUI5-DX-004
confirmAndWaitUI5-INT-001
confirmDialogUI5-DLG-001
ControlErrorUI5-DX-004
controlIdUI5-MIG-001
createAuthStrategyUI5-AUTH-001
createEntityUI5-DATA-002
createLlmServiceUI5-AI-003
createVocabularyServiceUI5-VOCAB-001
createWorkZoneManagerUI5-NAV-001
cssSelectorUI5-MIG-001
DATE_FORMATSUI5-DTP-001
DEFAULT_TIMEOUTSUI5-WAIT-001
defineConfigUI5-FIX-002
deleteEntityUI5-DATA-002
deselectAllTableRowsUI5-TBL-001
detectSystemTypeUI5-AUTH-001
detectTableTypeUI5-TBL-001
discoverPageUI5-AI-001
dismissDialogUI5-DLG-001
DomFirstStrategyUI5-ACT-001
ensureRowVisibleUI5-TBL-001
ErrorCodeUI5-DX-004
executeSearchUI5-FE-001
exportTableDataUI5-TBL-001
feClickListItemUI5-FE-003
feClickRowUI5-FE-003
feFindListItemByTitleUI5-FE-003
feFindRowByValuesUI5-FE-003
feGetCellValueUI5-FE-003
feGetColumnNamesUI5-FE-003
feGetListItemCountUI5-FE-003
feGetListItemTitleUI5-FE-003
feGetTableRowCountUI5-FE-003
feSelectListItemUI5-FE-003
FETestLibraryInstanceUI5-FE-001
fetchCSRFTokenUI5-DATA-001
fillFieldUI5-INT-001
filterByColumnUI5-TBL-001
findRowByValuesUI5-TBL-001
FLPErrorUI5-DX-004
formatDateForUI5UI5-DTP-001
getAvailableVariantsUI5-FE-001
getCellByColumnNameUI5-TBL-001
getColumnNamesUI5-TBL-001
getCurrentHashUI5-NAV-001
getDatePickerValueUI5-DTP-001
getDateRangeSelectionUI5-DTP-001
getDialogButtonsUI5-DLG-001
getEntityCountUI5-DATA-001
getFilterBarUI5-FE-001
getFilterBarFieldValueUI5-FE-001
getFilterValueUI5-TBL-001
getHeaderTitleUI5-FE-002
getListReportTableUI5-FE-001
getModelDataUI5-DATA-001
getModelPropertyUI5-DATA-001
getObjectPageSectionsUI5-FE-002
getOpenDialogsUI5-DLG-001
getRowCountUI5-TBL-001
getSectionDataUI5-FE-002
getSelectedRowsUI5-TBL-001
getSortOrderUI5-TBL-001
getTableCellValueUI5-TBL-001
getTableDataUI5-TBL-001
getTableRowCountUI5-TBL-001
getTableRowsUI5-TBL-001
getTimePickerValueUI5-DTP-001
hasPendingChangesUI5-DATA-001
initializeFETestLibraryUI5-FE-001
IntentErrorUI5-DX-004
isAuthenticatedUI5-AUTH-002
isDialogOpenUI5-DLG-001
isInEditModeUI5-FE-002
isLoginPageVisibleUI5-AUTH-002
isShellVisibleUI5-AUTH-002
isUI5LoadedUI5-AUTH-002
isUserMenuVisibleUI5-AUTH-002
loadConfigUI5-FIX-002
MultiTenantAuthStrategyUI5-AUTH-001
navigateBackUI5-NAV-001
navigateForwardUI5-NAV-001
navigateToAppUI5-NAV-001
navigateToHashUI5-NAV-001
navigateToHomeUI5-NAV-001
navigateToIntentUI5-NAV-001
navigateToItemUI5-FE-001
navigateToSectionUI5-FE-002
navigateToTileUI5-NAV-001
NavigationErrorUI5-DX-004
ODataErrorUI5-DX-004
ODataTraceReporterUI5-DX-003
Office365AuthStrategyUI5-AUTH-001
OnPremAuthStrategyUI5-AUTH-001
Opa5StrategyUI5-ACT-001
PACKAGE_NAMEUI5-FIX-001
PluginErrorUI5-DX-004
PramanErrorUI5-DX-004
queryEntitiesUI5-DATA-002
RecipeRegistryUI5-AI-002
recipesUI5-AI-002
registerAuthStrategyUI5-AUTH-001
retryUI5-WAIT-001
SAPAuthHandlerUI5-AUTH-001
searchAndOpenAppUI5-NAV-001
selectAllTableRowsUI5-TBL-001
selectOptionUI5-INT-001
selectRowByValuesUI5-TBL-001
selectTableRowUI5-TBL-001
selectVariantUI5-FE-001
SelectorErrorUI5-DX-004
setAndValidateDateUI5-DTP-001
setDatePickerValueUI5-DTP-001
setDateRangeSelectionUI5-DTP-001
setFilterBarFieldUI5-FE-001
setTableCellValueUI5-TBL-001
setTimePickerValueUI5-DTP-001
sortByColumnUI5-TBL-001
TimeoutErrorUI5-DX-004
UI5NativeStrategyUI5-ACT-001
updateEntityUI5-DATA-002
VERSIONUI5-FIX-001
viewNameUI5-MIG-001
VocabularyErrorUI5-DX-004
waitForDialogUI5-DLG-001
waitForDialogClosedUI5-DLG-001
waitForODataLoadUI5-DATA-001
waitForSaveUI5-INT-001
waitForTableDataUI5-TBL-001
waitForUI5BootstrapUI5-WAIT-001
waitForUI5StableUI5-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)
CapabilitySKILL.md SectionWhen to Load
UI5-LOC-001## Control DiscoveryUser mentions locating, finding, or selecting UI5 controls
UI5-LOC-002## Selector EngineUser mentions ui5= selector prefix or Playwright locator integration
UI5-LOC-003## Control InspectionUser mentions inspecting, debugging, or reading control metadata
UI5-ACT-001## InteractionsUser mentions clicking, typing, filling, selecting, or checking controls
UI5-ACT-002## Reading ValuesUser mentions reading text or values from UI5 controls
UI5-ACT-003## Footer ActionsUser mentions Save, Edit, Cancel, Delete, or Apply buttons
UI5-WAIT-001## SynchronizationUser mentions waiting, stability, or async rendering issues
UI5-WAIT-002## Request InterceptionUser mentions WalkMe, analytics interference, or request blocking
UI5-ASRT-001## AssertionsUser mentions asserting or verifying UI5 control properties
UI5-ASRT-002## Table AssertionsUser mentions asserting table row count, cell text, or selections
UI5-NAV-001## NavigationUser mentions navigating to Fiori apps, tiles, or FLP home
UI5-NAV-002## Shell HeaderUser mentions shell header, home button, user menu, or notifications
UI5-AUTH-001## AuthenticationUser mentions login, logout, SAP auth, or session management
UI5-AUTH-002## Auth State ChecksUser mentions checking if page is authenticated or login page visible
UI5-DATA-001## OData ModelUser mentions reading OData model data, properties, or pending changes
UI5-DATA-002## OData HTTPUser mentions creating, updating, deleting, or querying OData entities
UI5-TBL-001## Table OperationsUser mentions tables, rows, cells, filtering, sorting, or exporting
UI5-DLG-001## DialogsUser mentions dialogs, popovers, message boxes, or overlays
UI5-DTP-001## Date TimeUser mentions date pickers, time pickers, or date range selection
UI5-FE-001## Fiori Elements List ReportUser mentions List Report, filter bar, variants, or FE search
UI5-FE-002## Fiori Elements Object PageUser mentions Object Page, sections, edit mode, or FE header
UI5-FE-003## Fiori Elements Tables and ListsUser mentions FE-specific tables or lists
UI5-FIX-001## FixturesUser asks about importing or composing Praman fixtures
UI5-FIX-002## ConfigurationUser asks about configuring Praman settings or timeouts
UI5-AI-001## AI DiscoveryUser mentions AI page discovery or building page context for LLMs
UI5-AI-002## AI RegistriesUser mentions capability registry, recipe registry, or AI tool selection
UI5-AI-003## AI LLM IntegrationUser mentions LLM providers, agentic test generation, or AI workflows
UI5-VOCAB-001## VocabularyUser mentions business terms, synonym resolution, or vocabulary lookup
UI5-INT-001## SAP Business IntentsUser mentions purchase orders, sales orders, invoices, or SAP transactions
UI5-FLP-001## FLP LocksUser mentions SM12 lock entries or test isolation locks
UI5-FLP-002## FLP SettingsUser mentions FLP user settings, language, timezone, or date format
UI5-DX-001## Test DataUser mentions generating test data, UUID placeholders, or data persistence
UI5-DX-002## CLIUser mentions project setup, init, doctor, or uninstall commands
UI5-DX-003## ReportersUser mentions compliance reports, OData traces, or test run analytics
UI5-DX-004## Error HandlingUser encounters an error or asks about error codes and handling
UI5-MIG-001## Type SafetyUser 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.

FailureCapabilityResolution
Control not rendered yetUI5-LOC-001Add waitForUI5Bootstrap before control discovery, or increase timeout
Ambiguous selector matches multiple controlsUI5-LOC-001Add viewName, controlType, or ancestor constraint to narrow scope
Timeout waiting for controlUI5-LOC-001Increase timeout, verify navigation completed, check if control is in a dialog (add searchOpenDialogs: true)
Bridge not injectedUI5-WAIT-001Bridge auto-injects on first use; if page navigated, injection resets automatically
WalkMe interfering with testsUI5-WAIT-002Verify stability fixture is active; add WalkMe URL pattern to ignoreAutoWaitUrls config
Dialog button not foundUI5-DLG-001Check button text matches exactly; use getButtons() to list available buttons first
Table has no rowsUI5-TBL-001Use waitForData() or waitForODataLoad() before reading table; verify filter criteria
OData model path has no dataUI5-DATA-001Verify the path matches bound entities; use waitForODataLoad() after navigation
CSRF token expiredUI5-DATA-002Fetch a new token via fetchCSRFToken() before the write operation
Authentication failedUI5-AUTH-001Verify credentials; check if strategy matches system type (on-prem vs cloud)
SM12_SRV service unavailableUI5-FLP-001Activate the SM12_SRV OData service in SAP (transaction /IWFND/MAINT_SERVICE)
UShell Container not availableUI5-FLP-002Ensure page is a Fiori Launchpad app and shell is fully loaded
Intent navigation wrong appUI5-INT-001Verify semantic object hash mapping; check FLP catalog configuration
Vocabulary term not foundUI5-VOCAB-001Load the correct domain via loadDomain() before searching; check for typos
Date format mismatchUI5-DTP-001Use formatDateForUI5() to convert dates; check FLP user date format settings
Footer button not foundUI5-ACT-003Verify the page is in the correct mode (edit vs display); check button text exactly