QPR Task Recorder for Web Apps

From QPR ProcessAnalyzer Wiki
Revision as of 08:59, 8 May 2026 by Ollvihe (talk | contribs)
Jump to navigation Jump to search
  1. QPR TaskRecorder

QPR TaskRecorder is a Chrome/Edge browser extension for **task mining**. It records user interactions on web applications — clicks, form inputs, navigation, and more — and exports them as a CSV file compatible with **QPR ProcessAnalyzer**.

---

    1. Installation
      1. Developer Mode (Load Unpacked)
    • Chrome:**

1. Extract the `.zip` to a folder (e.g., `C:\Extensions\qpr-taskrecorder`) 2. Open `chrome://extensions/` 3. Enable **Developer mode** (toggle in the top-right corner) 4. Click **Load unpacked** and select the extracted folder 5. Click the **puzzle piece icon** (Extensions) in the toolbar, find QPR TaskRecorder, and click the **pin icon** to pin it to the toolbar

    • Edge:**

1. Extract the `.zip` to a folder 2. Open `edge://extensions/` 3. Enable **Developer mode** (toggle in the left sidebar) 4. Click **Load unpacked** and select the extracted folder 5. Click the **puzzle piece icon** (Extensions) in the toolbar, find QPR TaskRecorder, and click the **eye icon** to show it in the toolbar

      1. Enterprise Deployment

For organization-wide deployment via Group Policy or Intune, use the `ExtensionInstallForcelist` policy to install from a `.crx` file hosted on an internal server. See the [Enterprise Policy](#enterprise-policy) section for configuring default settings via managed policy.

---

    1. Quick Start

1. Click the TaskRecorder icon in the toolbar and **enable** recording 2. Open **Settings** and add at least one **target URL pattern** (e.g., `*://app.example.com/*`) 3. Navigate to the target web application and interact normally 4. Click the TaskRecorder icon → **Preview Events** to verify recording 5. Click **Export CSV** to download the captured events

---

    1. Configuration

Open Settings via the toolbar icon → **Settings** button, or right-click the extension icon → **Options**.

      1. Target URL Patterns

Define which websites are monitored. One pattern per line. Use `*` as a wildcard.

| Pattern | Matches | |---------|---------| | `*://app.example.com/*` | Any page on app.example.com (HTTP and HTTPS) | | `https://portal.example.com/orders/*` | Only the /orders/ section over HTTPS | | `*://*.example.com/*` | All subdomains of example.com |

Only pages matching at least one pattern will be recorded. If no patterns are configured, nothing is recorded.

      1. Case ID Strategies

The Case ID groups related events into a single process instance. Choose the strategy that best fits your scenario:

| Strategy | When to Use | How It Works | |----------|-------------|--------------| | **Per tab** | General-purpose; each tab is one case | Each browser tab gets a unique Case ID. New tab = new case. | | **Page element** | The page displays a case identifier (e.g., order number) | Reads the Case ID from a DOM element matching CSS selectors you provide. Multiple selectors supported in priority order. | | **Time-based** | Users work on multiple cases in the same tab | A new Case ID is generated after an idle period (configurable, default 5 minutes). | | **Recording session** | You want explicit control over case boundaries | Click **Start Session** / **Stop Session** in the popup. Events are only captured during active sessions. |

> **Tip:** If none of these strategies perfectly match your data, you can remap Case IDs after import using QPR ProcessAnalyzer's ETL scripts or expressions.

      1. Finding a CSS Selector for Page Element Strategy

1. Right-click the ID value on the page → **Inspect** 2. In DevTools **Elements** tab, look at the highlighted element's attributes 3. Right-click the element → **Copy** → **Copy selector** (or build one manually) 4. Test in the **Console** tab: `document.querySelector('YOUR_SELECTOR').textContent` 5. Paste the working selector into the extension's CSS Selector field

    • Example selectors:**

| Page Element | CSS Selector | |---|---| | `` | `#order-number` | | `` inside `` | `.title-id .selectable` | | `<input name="caseId">` | `[name="caseId"]` |

| `

` | `[data-testid="ticket-id"]` |

Prefer `#id` selectors when available — they are short and stable. Avoid long auto-generated paths with `:nth-child()` as they break when the page layout changes.

      1. Multiple Selectors (Priority Order)

You can configure multiple CSS selectors for the page-element strategy, one per line. The extension tries each selector in order and uses the first one that returns a non-empty value. This is useful when:

- Different pages show the Case ID in different locations - You have a primary selector that works most of the time, with fallbacks for edge cases

Example configuration: ```

  1. order-number

.title-id .selectable [data-case-id] ```

      1. Case ID Autodetector

The Autodetector helps you find the correct CSS selector without using DevTools manually.

1. Open Settings → Case ID strategy → "Extract from page element" → click **Open Case ID Autodetector** 2. Enter one or more example Case IDs you know appear on your pages 3. Choose a detection mode:

  - **Point & Click** — Navigate to a page, then click the element containing the Case ID. The extension generates a selector from your click.
  - **Auto-Scan** — Browse your application normally. The extension scans every page for elements matching your examples and records selectors automatically.

4. Found selectors appear in real-time in the Autodetector panel 5. Click **Stop** when done 6. Select which selectors to add to your configuration, and which new URL patterns to add 7. Click **Apply Selected** — the configuration is updated automatically

      1. Case ID Gap Fill

When the page-element strategy cannot find the Case ID (e.g., during modal dialogs, loading screens, or SPA transitions), the event receives a `_noid-` prefixed fallback ID instead of being left empty. This ensures CSV imports always succeed.

The **Fill Case ID gaps on export** setting (enabled by default in Settings) automatically resolves these fallback IDs during CSV export:

- If an event has a `_noid-` fallback (or empty Case ID), and the nearest preceding and following events (within the same tab) share the same real Case ID, the event is assigned that Case ID. - This only fills "gaps" — it does not assign Case IDs to events at the start/end of a tab session, nor to events between different Case IDs. - Disable this setting if you prefer to handle `_noid-` events in your own ETL pipeline.

To preview gap-filled data before exporting: open the full-page Event Preview ("View All") and toggle **Fill Case ID gaps**. Filled rows are highlighted in yellow. The preview toggle is independent of the export setting.

      1. User ID

A random anonymous ID is auto-generated on first install. You can override it with a custom identifier (e.g., employee ID or username) in Settings. This value appears in the `UserId` column of the CSV.

      1. Field Value Exclusions

By default, values of form fields (text inputs, dropdowns, etc.) are captured. To protect sensitive data, configure exclusion rules:

    • Glob patterns** — match field identifiers (id, name, aria-label). One per line.

```

  • password*
  • ssn*
  • credit*card*
  • secret*

```

    • CSS selector exclusions** — match elements directly. One per line.

``` input[type=password] .sensitive-data [data-private] ```

Excluded fields still generate events (so you know the user interacted with them), but the value is omitted.

      1. Icon Flash

When enabled (default), the toolbar icon briefly flashes amber each time an event is captured, providing visual confirmation that recording is active. Disable this in Settings if you find it distracting.

      1. Configuration Import / Export

Settings can be saved to a JSON file and imported on other machines — useful for distributing a standard configuration to a team.

1. **Export**: Settings → **Export Config JSON** → saves a `.json` file 2. **Import**: Settings → **Import Config JSON** → select a previously exported `.json` file

---

    1. Enterprise Policy

Administrators can push default settings via Chrome/Edge managed storage policy. Policy values take priority over locally saved settings.

      1. Policy Properties

| Property | Type | Default | Description | |----------|------|---------|-------------| | `enabled` | boolean | `true` | Whether event recording is enabled | | `targetUrls` | string[] | `[]` | URL patterns to monitor | | `userId` | string | *(auto-generated)* | User identifier for CSV output | | `flashOnEvent` | boolean | `true` | Flash icon on event capture | | `fieldExclusions` | string[] | `[]` | Glob patterns for field value exclusion | | `fieldExclusionSelectors` | string[] | `[]` | CSS selectors for field value exclusion | | `caseId.strategy` | string | `"per-tab"` | One of: `per-tab`, `page-element`, `time-based`, `recording-session` | | `caseId.pageElementSelector` | string | `""` | CSS selector for page-element strategy | | `caseId.idleTimeoutMinutes` | integer | `5` | Idle timeout for time-based strategy (1–120) |

      1. Example: Windows Registry

For Chrome, create keys under: ``` HKLM\SOFTWARE\Policies\Google\Chrome\3rdparty\extensions\<extension-id>\policy ```

For Edge: ``` HKLM\SOFTWARE\Policies\Microsoft\Edge\3rdparty\extensions\<extension-id>\policy ```

      1. Example: JSON Policy File (Chrome)

```json {

 "enabled": true,
 "targetUrls": ["*://erp.company.com/*", "*://crm.company.com/*"],
 "userId": "${windows_username}",
 "caseId": {
   "strategy": "page-element",
   "pageElementSelector": "#case-number"
 },
 "fieldExclusions": ["*password*", "*ssn*"],
 "fieldExclusionSelectors": ["input[type=password]"]

} ```

---

    1. Using the Extension
      1. Toolbar Popup

Click the TaskRecorder icon to open the popup:

- **Enable/Disable toggle** — turns recording on or off globally - **Status** — shows whether recording is active, the event count, User ID, and Case ID strategy - **Start/Stop Session** — visible only when using the "Recording session" strategy - **Export CSV** — downloads all captured events as a CSV file (events are cleared after export) - **Preview Events** — shows the 50 most recent events in a table without exporting - **Settings** — opens the full settings page

      1. Icon Colors

| Color | Meaning | |-------|---------| | **Green** | Actively recording on this tab (target URL matches, extension enabled) | | **Grey** | Not recording (non-target URL, extension disabled, or session not active) | | **Amber flash** | An event was just captured (brief flash, ~200ms) |

      1. CSV Export

Clicking **Export CSV** triggers a file download (`qpr-taskrecorder-export.csv`). After a successful export, all stored events are cleared. The file is ready for import into QPR ProcessAnalyzer.

---

    1. CSV Output Format

The exported CSV uses: - **Encoding:** UTF-8 - **Separator:** comma (`,`) - **Text qualifier:** double quote (`"`) - **Line ending:** CRLF - **First row:** column headers

      1. Columns

| # | Column | Description | |---|--------|-------------| | 1 | `CaseId` | Process instance identifier | | 2 | `EventType` | Action type: `Click`, `TextInput`, `SelectChange`, `PageNavigation`, `FormSubmit`, `FileUpload`, `KeyboardShortcut` | | 3 | `Timestamp` | UTC with millisecond precision (`yyyy-MM-ddTHH:mm:ss.fffZ`) | | 4 | `PageUrl` | Full URL where the event occurred | | 5 | `PageTitle` | Page title (`<title>`) | | 6 | `ElementSelector` | CSS selector or identifier of the element | | 7 | `ElementLabel` | Visible text or label of the element | | 8 | `ElementType` | HTML tag and type (e.g., `BUTTON`, `INPUT[text]`, `SELECT`) | | 9 | `ElementValue` | Captured value (empty for excluded fields) | | 10 | `TabId` | Browser tab identifier | | 11 | `UserId` | User identifier |

      1. Example

```csv CaseId,EventType,Timestamp,PageUrl,PageTitle,ElementSelector,ElementLabel,ElementType,ElementValue,TabId,UserId case-abc123,PageNavigation,2026-04-23T09:01:12.000Z,https://app.example.com/orders/new,New Order,,,,,,agent01 case-abc123,Click,2026-04-23T09:01:15.234Z,https://app.example.com/orders/new,New Order,#product-dropdown,Product,SELECT,,tab-1,agent01 case-abc123,SelectChange,2026-04-23T09:01:18.567Z,https://app.example.com/orders/new,New Order,#product-dropdown,Product,SELECT,Premium Plan,tab-1,agent01 case-abc123,TextInput,2026-04-23T09:01:25.890Z,https://app.example.com/orders/new,New Order,#quantity-field,Quantity,INPUT[number],5,tab-1,agent01 ```

      1. Importing into QPR ProcessAnalyzer

1. In ProcessAnalyzer, create a new datatable or use an existing one 2. Import the CSV file — the auto-detection should pick up comma separator and UTF-8 encoding 3. Map the columns: `CaseId` → Case ID, `EventType` → Event Type, `Timestamp` → Timestamp 4. Additional columns are imported as event attributes for filtering and analysis

---

    1. Troubleshooting

| Problem | Cause | Solution | |---------|-------|----------| | Icon stays grey on target site | URL doesn't match any target pattern | Check Settings → Target URLs. Patterns must match the full URL. | | No events captured | Extension is disabled | Click the popup and toggle **Enable**. | | No events with recording-session strategy | No active session | Click **Start Session** in the popup before interacting. | | SPA navigation not detected | Rare edge case with custom routing | The extension monitors History API and DOM mutations. If a specific SPA framework bypasses both, navigation events may be missed. | | Events captured inside iframes | Expected behavior | The content script runs in all frames by default. Target URL patterns apply to the top-level page. | | Export produces empty file | No events stored | Interact with the target application first. Check the event count in the popup. | | Settings reset after update | Extension was reloaded in developer mode | Settings persist in `chrome.storage.local`. Reloading the extension preserves them. Reinstalling (remove + add) clears them. |

---

    1. Privacy

- All captured data is stored **locally** in the browser's IndexedDB. No data is sent to external servers. - Events are cleared after each CSV export. - Use **field exclusion rules** to prevent capture of sensitive values (passwords, personal identifiers, etc.). - The `UserId` is an anonymous auto-generated ID by default. It can be overridden in Settings. - The extension only captures interactions on pages matching configured **target URL patterns**.