Skip to main content
Version: 1.x

SAP Control Cookbook

A practical reference for interacting with the most common SAP UI5 controls in Praman tests. Each control includes its fully qualified type, recommended selectors, interaction examples, and known pitfalls.

SmartField

sap.ui.comp.smartfield.SmartField

SmartField is a metadata-driven wrapper that renders different inner controls (Input, ComboBox, DatePicker, etc.) based on OData annotations. It appears throughout SAP Fiori Elements apps.

Selector

// By ID
const field = await ui5.control({
controlType: 'sap.ui.comp.smartfield.SmartField',
id: /CompanyCode/,
});

// By binding path (most reliable for SmartFields)
const field = await ui5.control({
controlType: 'sap.ui.comp.smartfield.SmartField',
bindingPath: { path: '/CompanyCode' },
});

Interaction

await ui5.fill({ controlType: 'sap.ui.comp.smartfield.SmartField', id: /CompanyCode/ }, '1000');

// Read current value
const value = await field.getProperty('value');

Pitfalls

  • getControlType() returns sap.ui.comp.smartfield.SmartField, not the inner control type (e.g., not sap.m.Input). Do not selector-match by the inner type.
  • SmartField in display mode renders as sap.m.Text — calling fill() will fail. Check the editable property first.
  • Value help dialogs opened by SmartField have a different control tree. Use searchOpenDialogs: true to find controls inside them.

SmartTable

sap.ui.comp.smarttable.SmartTable

Metadata-driven table that auto-generates columns from OData annotations. Used in most Fiori Elements List Report pages.

Selector

const table = await ui5.control({
controlType: 'sap.ui.comp.smarttable.SmartTable',
id: /LineItemsSmartTable/,
});

Interaction

// Get row count
const rowCount = await table.getProperty('count');

// Click a specific row (inner table is sap.ui.table.Table or sap.m.Table)
const rows = await ui5.controls({
controlType: 'sap.m.ColumnListItem',
ancestor: { controlType: 'sap.ui.comp.smarttable.SmartTable', id: /LineItemsSmartTable/ },
});
await rows[0].click();

// Trigger table personalization
await ui5.click({
controlType: 'sap.m.OverflowToolbarButton',
properties: { icon: 'sap-icon://action-settings' },
ancestor: { controlType: 'sap.ui.comp.smarttable.SmartTable', id: /LineItemsSmartTable/ },
});

Pitfalls

  • SmartTable wraps either sap.m.Table (responsive) or sap.ui.table.Table (grid). Row selectors differ by inner table type.
  • Row counts may reflect only loaded rows if server-side paging is active. Use growing property to check.
  • Column visibility depends on table personalization variant — test data may not be visible in default columns.

SmartFilterBar

sap.ui.comp.smartfilterbar.SmartFilterBar

Renders filter fields from OData annotations. The main filter bar in Fiori Elements List Reports.

Selector

const filterBar = await ui5.control({
controlType: 'sap.ui.comp.smartfilterbar.SmartFilterBar',
id: /listReportFilter/,
});

Interaction

// Set a filter value
await ui5.fill(
{
controlType: 'sap.ui.comp.smartfield.SmartField',
ancestor: { controlType: 'sap.ui.comp.smartfilterbar.SmartFilterBar' },
id: /CompanyCode/,
},
'1000',
);

// Click Go / Search
await ui5.click({
controlType: 'sap.m.Button',
properties: { text: 'Go' },
ancestor: { controlType: 'sap.ui.comp.smartfilterbar.SmartFilterBar' },
});

// Expand filters (Adapt Filters dialog)
await ui5.click({
controlType: 'sap.m.Button',
properties: { text: 'Adapt Filters' },
ancestor: { controlType: 'sap.ui.comp.smartfilterbar.SmartFilterBar' },
});

Pitfalls

  • Filter fields may not be visible by default. Use "Adapt Filters" to add fields before setting values.
  • SmartFilterBar auto-triggers search on initial load with default variant — your filter values may be overwritten.
  • Date range filters require sap.m.DateRangeSelection interaction, not simple fill().

OverflowToolbar

sap.m.OverflowToolbar

Toolbar that collapses items into an overflow popover when space is limited.

Selector

const toolbar = await ui5.control({
controlType: 'sap.m.OverflowToolbar',
id: /headerToolbar/,
});

Interaction

// Click a visible toolbar button
await ui5.click({
controlType: 'sap.m.Button',
properties: { text: 'Edit' },
ancestor: { controlType: 'sap.m.OverflowToolbar', id: /headerToolbar/ },
});

// Click button that may be in overflow
await ui5.click({
controlType: 'sap.m.OverflowToolbarButton',
properties: { text: 'Delete' },
ancestor: { controlType: 'sap.m.OverflowToolbar', id: /headerToolbar/ },
});

Pitfalls

  • Overflowed buttons are in a separate popover — use searchOpenDialogs: true if the button is in the overflow area.
  • sap.m.OverflowToolbarButton vs sap.m.Button — buttons in overflow toolbars may use either type depending on configuration.

IconTabBar

sap.m.IconTabBar

Tab strip used for section navigation in Object Pages and detail views.

Selector

const tabBar = await ui5.control({
controlType: 'sap.m.IconTabBar',
id: /detailTabBar/,
});

Interaction

// Switch to a specific tab by key
await ui5.click({
controlType: 'sap.m.IconTabFilter',
properties: { key: 'items' },
ancestor: { controlType: 'sap.m.IconTabBar', id: /detailTabBar/ },
});

// Switch by text
await ui5.click({
controlType: 'sap.m.IconTabFilter',
properties: { text: 'Line Items' },
});

Pitfalls

  • Tab content is lazy-loaded by default. After switching tabs, wait for the content to render before interacting with controls inside it.
  • Icon-only tabs have no text property — use key or icon to select them.

ObjectPageLayout

sap.uxap.ObjectPageLayout

The layout container for Fiori Elements Object Pages. Contains header, sections, and subsections.

Selector

const objectPage = await ui5.control({
controlType: 'sap.uxap.ObjectPageLayout',
});

Interaction

// Scroll to a specific section
await ui5.click({
controlType: 'sap.m.Button',
properties: { text: 'General Information' },
ancestor: { controlType: 'sap.uxap.AnchorBar' },
});

// Toggle header (collapse/expand)
await ui5.click({
controlType: 'sap.m.Button',
id: /expandHeaderBtn/,
});

// Access a subsection
const section = await ui5.control({
controlType: 'sap.uxap.ObjectPageSection',
properties: { title: 'Pricing' },
});

Pitfalls

  • Sections use lazy loading — controls in non-visible sections may not exist in the control tree until scrolled to.
  • Header facets are in sap.uxap.ObjectPageHeaderContent, not in the main sections.
  • sap.uxap.AnchorBar is the internal navigation bar — section names there may differ from actual section titles.

ComboBox

sap.m.ComboBox

Single-selection dropdown with type-ahead filtering.

Selector

const combo = await ui5.control({
controlType: 'sap.m.ComboBox',
id: /countryCombo/,
});

Interaction

// Type and select
await ui5.fill({ controlType: 'sap.m.ComboBox', id: /countryCombo/ }, 'Germany');

// Open dropdown and select by item key
await ui5.click({ controlType: 'sap.m.ComboBox', id: /countryCombo/ });
await ui5.click({
controlType: 'sap.ui.core.ListItem',
properties: { key: 'DE' },
searchOpenDialogs: true,
});

Pitfalls

  • fill() triggers type-ahead but may not select the item. Verify with getProperty('selectedKey').
  • Dropdown items are rendered in a popup — use searchOpenDialogs: true to find them.

MultiComboBox

sap.m.MultiComboBox

Multi-selection dropdown with token display.

Selector

const multi = await ui5.control({
controlType: 'sap.m.MultiComboBox',
id: /plantsMultiCombo/,
});

Interaction

// Select multiple items
await ui5.click({ controlType: 'sap.m.MultiComboBox', id: /plantsMultiCombo/ });
await ui5.click({
controlType: 'sap.ui.core.ListItem',
properties: { text: 'Plant 1000' },
searchOpenDialogs: true,
});
await ui5.click({
controlType: 'sap.ui.core.ListItem',
properties: { text: 'Plant 2000' },
searchOpenDialogs: true,
});

// Close dropdown
await ui5.click({ controlType: 'sap.m.MultiComboBox', id: /plantsMultiCombo/ });

// Read selected keys
const selectedKeys = await multi.getProperty('selectedKeys');

Pitfalls

  • Each click toggles an item. Clicking an already-selected item deselects it.
  • Tokens may overflow and show "N More" — use getProperty('selectedKeys') to verify selections instead of counting visible tokens.

MultiInput

sap.m.MultiInput

Text input with tokenizer for multiple values and optional value help.

Selector

const multiInput = await ui5.control({
controlType: 'sap.m.MultiInput',
id: /materialMultiInput/,
});

Interaction

// Add tokens by typing
await ui5.fill({ controlType: 'sap.m.MultiInput', id: /materialMultiInput/ }, 'MAT-001');
// Press Enter to confirm token (use keyboard interaction)
await multiInput.pressKey('Enter');

// Open value help dialog
await ui5.click({
controlType: 'sap.ui.core.Icon',
properties: { src: 'sap-icon://value-help' },
ancestor: { controlType: 'sap.m.MultiInput', id: /materialMultiInput/ },
});

Pitfalls

  • Tokens require Enter key press to be committed — fill() alone is not sufficient.
  • Value help button is a separate sap.ui.core.Icon control, not part of the MultiInput control.
  • Removing tokens requires clicking the token's delete icon, not clearing the input.

Select

sap.m.Select

Simple dropdown with no type-ahead (unlike ComboBox).

Selector

const select = await ui5.control({
controlType: 'sap.m.Select',
id: /currencySelect/,
});

Interaction

// Open and select an item
await ui5.click({ controlType: 'sap.m.Select', id: /currencySelect/ });
await ui5.click({
controlType: 'sap.ui.core.ListItem',
properties: { key: 'USD' },
searchOpenDialogs: true,
});

// Direct selection via key (no UI interaction)
const currentKey = await select.getProperty('selectedKey');

Pitfalls

  • sap.m.Select does not support type-ahead. Use click() to open, then click the item.
  • List items in the dropdown popup are sap.ui.core.ListItem, not sap.m.StandardListItem.

DatePicker

sap.m.DatePicker

Date input with calendar popup.

Selector

const datePicker = await ui5.control({
controlType: 'sap.m.DatePicker',
id: /deliveryDatePicker/,
});

Interaction

// Fill directly with a date string (preferred approach)
await ui5.fill({ controlType: 'sap.m.DatePicker', id: /deliveryDatePicker/ }, '2025-03-15');

// Open calendar and select a date
await ui5.click({
controlType: 'sap.ui.core.Icon',
properties: { src: 'sap-icon://appointment-2' },
ancestor: { controlType: 'sap.m.DatePicker', id: /deliveryDatePicker/ },
});
// Select day from calendar popup
await ui5.click({
controlType: 'sap.ui.unified.calendar.DatesRow',
searchOpenDialogs: true,
});

Pitfalls

  • Date format depends on user locale settings. Always use ISO format (YYYY-MM-DD) with fill() — Praman normalizes it to the configured locale.
  • sap.m.DateRangeSelection is a separate control type for date ranges. Do not confuse it with sap.m.DatePicker.
  • Calendar popup controls are in sap.ui.unified.calendar namespace — different from sap.m.

Quick Reference Table

ControlTypePrimary Selector StrategyKey Method
SmartFieldsap.ui.comp.smartfield.SmartFieldbindingPathfill()
SmartTablesap.ui.comp.smarttable.SmartTableidgetProperty('count')
SmartFilterBarsap.ui.comp.smartfilterbar.SmartFilterBaridfill() on child fields
OverflowToolbarsap.m.OverflowToolbaridclick() on child buttons
IconTabBarsap.m.IconTabBaridclick() on IconTabFilter
ObjectPageLayoutsap.uxap.ObjectPageLayoutsingleton (one per page)scroll to section
ComboBoxsap.m.ComboBoxidfill() or click + select
MultiComboBoxsap.m.MultiComboBoxidclick to toggle items
MultiInputsap.m.MultiInputidfill() + Enter key
Selectsap.m.Selectidclick + select item
DatePickersap.m.DatePickeridfill() with ISO date