Skip to main content

Variables & templates

Capture a value & reuse it

Some flows need a value the app generates at runtime — an application ID shown on one page, a confirmation number, a token — fed into a later step (a search box, a URL, an assertion). A Capture step reads a value off the page during replay and stores it in a run-scoped variable you reference later as {{var.NAME}}.

Author a capture

While recording, click Capture in the toolbar (next to Assert) — it turns blue — then click the element holding the value.

Capture mode active — click the Capture button, then click the value on the page

A small menu lets you choose:

  • Variable — the name you'll reference later, e.g. applicationId (auto-suggested from the element).
  • What to grab — the three extraction kinds:
    • Text — the element's visible/accessible text. For labels, spans, headings, table cells.
    • Input value — an <input> / <textarea> / <select> .value (or a checkbox/radio's checked state).
    • Attribute — a named attribute such as href, data-id, or value. For values that live in markup, not visible text.
  • Extract (regex)optional. Pull just the part you want out of noisy text. If the pattern has a capture group, group 1 is used; otherwise the whole match. e.g. APP-\d+ turns Application ID: APP-7741 into APP-7741.

Click Capture, and a capture step is recorded — shown in the Events list as capture applicationId ← text .app-id (teal badge).

The capture menu — name a variable, choose what to grab, optionally extract with a regex, then Capture

Reuse the captured value

In any later input value, navigate URL, or assertion text, reference it as {{var.NAME}}. Open the + Template menu (or type {{) — captured variables appear under a Captured category, so you click to insert; no need to type the var. prefix. The Edit drawer shows the last run's resolved value beneath the field.

The + Template menu in the Edit drawer — captured variables and reusable tokens insert as templates

The value is read fresh on every run — only the instruction (selector + variable + kind) is saved in the .trq, never the value — so it always reflects the current run's data. (The capture step must run before the step that uses it.)

Example

1. navigate https://app.example.com/journey/123
2. capture applicationId ← text .app-id (regex: APP-\d+)
3. navigate https://backoffice.example.com/search
4. input #search = {{var.applicationId}}
5. click .search-btn
6. assert text-equals {{var.applicationId}} on .result-id

On each run Trq reads the live id (e.g. APP-7742), types it into the back-office search, and asserts the result. Capture works across tabs and cross-origin iframes, and in Play, Resume, and Debug. If a value loads slowly, capture polls until it appears.

Value templates

Any URL, input value, or assertion text accepts {{…}} templates, resolved fresh each run. Type {{ for inline autocomplete, or use the + Template menu:

  • reusable{{uuid}}, {{randomNumber}}, {{randomString}}, {{timestamp}} — generated once per run and reused everywhere the same token appears (see below).
  • faker{{faker.email}}, {{faker.firstName}}, {{faker.phone}}, {{faker.uuid}}, …
  • random{{random.string(8)}}, {{random.int(1,99)}}, {{random.alpha(6)}}
  • date{{date.iso}}, {{date.now}}, {{date.future(7)}}
  • env{{env.MY_VAR}} (reads the environment at run time)
  • var{{var.NAME}} — a value grabbed earlier by a Capture step or an API request's Extract; appears under the Captured menu category.
  • calc{{calc(var.x + var.y, 2)}} — arithmetic on captured values, computed fresh each run (see below).

The Edit drawer shows the last run's resolved value beneath each templated field.

Arithmetic on captured values — calc()

Some assertions are about a derived number: a total that should equal fee + tax, an amount converted at a live rate, a count after adding one. Hard-coding the expected number breaks the moment the inputs change — so compute it instead. {{calc(…)}} evaluates an arithmetic expression over your captured variables at replay time, and works in any templated field (assertion text, input values, URLs, API request bodies).

Inside calc(…), reference variables barevar.fee, not {{var.fee}} — and combine them with + - * / % and parentheses. An optional trailing integer sets the number of decimal places, so the result string-matches how the page renders it:

Authoring a calc() expression in the Edit drawer — the Math category in the + Template menu inserts a calc skeleton

On each run, the capture steps read the live numbers, and the assertion's expected value is computed from them before comparing against the page:

After Play — capture rows show the numbers they read, and the assert row shows the calc expression resolved to the computed total

1. navigate https://app.example.com/journey/123
2. capture fee ← text .fee-amount
3. capture tax ← text .tax-amount
4. assert text-equals {{calc(var.fee + var.tax, 2)}} on .total

Details worth knowing:

  • Captured strings are normalized before parsing — currency symbols (₹ $ € £ ¥), thousands separators, and spaces are stripped, and a trailing unit is tolerated, so ₹ 1,30,110.00 INR parses as 130110.
  • Formatting{{calc(expr, 2)}} renders with exactly 2 decimals (1416.00); without the places argument, float noise is rounded away (0.1 + 0.20.3).
  • Failures stay visible — an unknown variable, a non-numeric value, or a division by zero resolves to the literal {{calc(…)}} text, so the assert fails showing exactly which expression didn't compute, instead of silently comparing an empty string.
  • The capture steps must run before the step that uses the expression — same rule as any {{var.NAME}}.

Reusable values — generate once, reuse across steps

The faker / random / date tokens regenerate on every step, so you can't create something on one page and find it on another. The reusable tokens fix that: they generate a value once per run and return that same value wherever the identical token appears — so you can name an entity in one step and search for it in a later step. A new value is generated on each Play/Resume (so reruns don't collide), stable within that run.

TokenValue
{{uuid}}a v4 uuid
{{uuid(8)}}first 8 hex chars (dashes stripped) — a short id; {{uuid(2,6)}} takes a substring
{{randomNumber}} / {{randomNumber(1000,9999)}}a random integer (default 6 digits)
{{randomString}} / {{randomString(12)}}random alphanumeric (default length 8)
{{timestamp}}run-start epoch milliseconds

Add a :label for a second, distinct value: {{uuid:orderId}} and {{uuid:invoiceId}} generate two different uuids, each reused under its own name.

3. input #name = page-{{uuid(8)}} → page-f03a19e0
4. click #create

9. input #search = {{uuid(8)}} → f03a19e0 (same value, same run)

{{uuid(8)}} is its own short id — not the first 8 chars of {{uuid}}. For a stable handle reused in several places, use a named token consistently (e.g. always {{uuid:orderId}}).