Documentation › The MaxTAF Recorder
The MaxTAF Recorder
The MaxTAF Recorder is a Chrome extension that watches what you do in a web application — primarily IBM Maximo — and turns it into a runnable MXML test case in MaxTAF Cloud. Record a workflow once, get a deterministic regression test out the other side.
Installing the extension
The recorder is distributed as an unpacked Chrome extension (Manifest V3). To load it:
- Obtain the recorder build from Code Development Ltd (a
maxtaf-recorder-v<version>.zip) and unzip it, or build it from source (npm installthennpm run build, which produces adist/extensionfolder). - Open
chrome://extensions/in Chrome and enable Developer mode (top-right). - Click Load unpacked and select the
dist/extensionfolder. - The MaxTAF Universal Recorder appears in your extensions. Pin it, then open it — it runs as a Chrome side panel.
The recorder injects into every frame of the page (all_frames) because Maximo renders inside nested iframes — capturing clicks and inputs there is essential. It requests storage, tabs, scripting and clipboard access to record, persist and export cases.
Connecting it to MaxTAF Cloud
To upload recorded cases straight into a project, open the recorder's Configuration (overflow ⋮ ▸ Configuration) and set:
| Setting | Value |
|---|---|
MaxTAF environment URL (BASE_URL) | e.g. https://mx1.maxtaf.com/ (or your on-prem URL). |
Project ID (PROJECT_NAME) | The target project's id in MaxTAF. |
API key (MAXTAF_API_KEY) | Your MaxTAF API key (Admin ▸ User Settings). Use the Validate button to check it. |
Maximo URL (MAXIMO_URL) | The Maximo instance you'll record against. |
If these are blank, the recorder still works but only saves the case as a local file (see SAVE_TO_FILE_ONLY below).
Recording and exporting a case
- Open the recorder side panel and click the record button (the red dot). If there are leftover lines, you'll be asked whether to clear them first.
- Use Maximo normally — log in, navigate to an application, create or edit a record. Each interaction appears as a line in the panel.
- Add checks where you need them by right-clicking an element and choosing an Assert / Store / Verify action (see below).
- Click record again to stop.
- Click Create MaxTAF Case, enter a case name (letters, numbers, spaces and underscores), choose Overwrite if replacing an existing case, and click Export Case.
- The case uploads to your configured project and opens in the MaxTAF Workspace as an MXML case, ready to run.
The overflow menu also offers Save/Open Recording (keep a recording as a file), Copy all as MXML (copy the generated MXML to your clipboard), Compile all lines, and the onboarding Guide.
What the recorder captures
These interactions are recorded automatically as you work:
| Interaction | Becomes (MXML) |
|---|---|
| Clicking an element | <ui:click> |
| Typing into a field | <ui:clear> + <ui:sendKeys> |
| Navigating to a URL | a native driver.get(...) step |
| Opening a Maximo application | an app-navigation step using the Maximo address parameter |
| Moving between frames | <ui:selectFrame> (recorded automatically) |
Frame switches are important for Maximo: the recorder tracks when your interaction crosses into or out of an iframe and inserts the frame-select step so replay lands in the right place.
Assertions and stored values
Right-click any element and open the MaxTAF Recorder context menu. Actions are grouped:
| Group | Actions |
|---|---|
| Assert (fails the test if untrue) | assertValue, assertText, assertTitle, assertElementPresent, assertElementRequired, assertElementReadonly, assertElementError |
| Store (saves to a variable) | storeValue, storeText, storeTitle |
| Verify (non-blocking check) | verifyValue, verifyText, verifyTitle, verifyElementPresent |
| Actions | waitForElementPresent, mouseOver, addReportLine, showClickTag, showSendKeysTag |
Store actions prompt for a variable name; the stored value can then be reused later in the case. Title actions ignore the element and use the page title. For the exact MXML each produces, see the MXML Reference.
Settings reference
Configuration lives in the recorder's settings (seeded from a preload-settings.json on install). The keys most users touch:
| Key | Meaning | Typical |
|---|---|---|
MAXTAF_VERSION | Target: MaxTAF Cloud or MaxTAF-as-a-Maximo-plugin. | cloud |
RECORDING_MODE | Recording engine: maximo (default) or utam. | maximo |
LANGUAGE | Output language. For Maximo recordings this is MXML (fixed). | maximo |
MAXIMO_URL | Maximo base URL for generated cases / optional auto-navigation. | your Maximo URL |
BASE_URL | MaxTAF environment URL for cloud upload. | https://mx1.maxtaf.com/ |
PROJECT_NAME | MaxTAF project id to upload into. | your project id |
MAXTAF_API_KEY | API key for upload auth. | mx-… |
SAVE_TO_FILE_ONLY | If true, export a local file instead of uploading. | false |
DISABLE_AUTO_NAV | If true, don't auto-navigate to MAXIMO_URL when recording starts. | true |
SELENIUM_SERVER / BROWSER / SLOW_DOWN_LEVEL | Execution settings baked into the generated case's parameters. | ${mx.system.common_pool} / chrome / 0 |
PACKAGE_NAME / CUSTOM_NAMESPACES | Generated source package and any custom namespaces. | com.maxtaf |
A recorded case is uploaded to MaxTAF only when PROJECT_NAME, BASE_URL and MAXTAF_API_KEY are all set and SAVE_TO_FILE_ONLY is false. Otherwise the case is prepared but not sent. The upload targets POST {BASE_URL}api/maxtaf/import/cases with your X-Project-Id and X-Maxtaf-Api-Key headers — see the REST API.
Headless / automation API
The recorder can be driven without its UI by posting window messages — this is how MaxTAF's AI test cases record a flow automatically. From the page's main frame:
// Start a fresh recording
window.postMessage({ type: 'MXTAF_RECORDER_CONTROL', command: 'startWithClear' }, '*');
// ... perform actions ...
// Record an assertion (searches all frames for the element id)
window.postMessage({ type: 'MXTAF_RECORDER_CONTROL', command: 'contextAction',
action: 'assertValue', elementId: 'ASSETNUM@483' }, '*');
// Stop and create the case in MaxTAF
window.postMessage({ type: 'MXTAF_RECORDER_CONTROL', command: 'stop' }, '*');
window.postMessage({ type: 'MXTAF_RECORDER_CONTROL', command: 'createCase',
name: 'MyCase_' + Date.now() }, '*');
| Command | Does |
|---|---|
start / startWithClear | Begin recording (keep / clear existing actions). |
stop | Stop recording (always before export/createCase). |
createCase (name) | Build the MXML case and upload it; replies with MXTAF_CASE_CREATED. |
contextAction | Record an assert/store/verify/action headlessly; replies MXTAF_CONTEXT_ACTION_DONE. |
getRecordedActions | Return the captured actions (MXTAF_RECORDED_ACTIONS). |
updateSettings | Inject settings (project id, API key) at runtime without hardcoding. |
ping | Liveness check (replies MXTAF_PONG). |
Send contextAction from the top window, not from inside a Maximo iframe — the extension searches every frame to find the element by its real DOM id.
How it works (briefly)
A content script injected into every frame captures your interactions; a background service worker stores them and, on export, compiles them to MXML and POSTs the case to the MaxTAF import API. Maximo recordings always compile to MXML because that language handles Maximo's quirks. If a direct upload can't reach MaxTAF (for example from inside a Kubernetes pod), the recorder falls back to a local proxy-upload path.