Everything you need to know about creating, running, and monitoring your QA flows.
A flow is a sequence of steps that represent a user journey (e.g. login, checkout, signup). There are three ways to create flows:
Chrome Extension
Record your actions in the browser and save them as a flow automatically.
Import from File
Upload a CSV (with full selectors) or a Gherkin-style text file.
Manual Creation
Add steps one by one using the inline editor on the flow page.
Install the HorusQA Chrome Extension
The extension records your browser interactions and sends them to HorusQA as replayable test steps.
Download from Chrome Web StoreWhile recording, right-click any element to open the assertion menu. You can assert that text is visible, an element exists, a field has a specific value, or the URL/title matches a pattern.
The extension captures multiple selectors for each element, ordered by reliability. During replay, each selector is tried in order until one works:
data_testid
2. id
3. name
4. css_class
5. text
6. xpath
You can import flows from CSV or Gherkin-style text files. Use the Import button on the project page.
Use the 'CSV complete with selectors' export format to get a round-trip compatible file. The columns are:
Example CSV:
Position,Action,URL,Value,Delay (ms),Target Strategies
1,visit,https://example.com,,,[]
2,click,,,0,"[{""kind"":""id"",""value"":""login-btn""}]"
3,fill_in,,,0,"[{""kind"":""name"",""value"":""email""}]"
A simplified Gherkin syntax. Each line maps to a step. Supported keywords: Given, When, Then.
Example:
Given I visit "https://example.com" When I click on "#login-btn" When I fill in "email" with "user@test.com" Then I should see text "Welcome"
You can build flows step by step using the inline editor at the bottom of the steps table on any flow page.
Navigate to a URL. This is typically the first step in a flow.
Click on an element identified by a selector.
Type text into an input field or textarea.
Submit a form.
Select an option from a dropdown / select element.
Check a checkbox.
Uncheck a checkbox.
Accept a browser alert / confirm dialog.
Dismiss a browser alert / confirm dialog.
Scroll the page to bring an element into view.
Assertions verify that your application is in the expected state. If an assertion fails, the run is marked as failed.
Verify that specific text appears on the page.
Verify that an element is visible on the page.
Verify that an element is NOT visible on the page.
Verify that an input field contains a specific value.
Verify the current URL matches the expected value.
Verify the page title matches the expected value.
Verify that an element exists in the DOM (even if hidden).
Use placeholders in step values to generate unique data on every run. Perfect for testing registration forms, unique fields, or any input that rejects duplicates.
| Placeholder | Description | Example Output |
|---|---|---|
{{random_email}} |
Unique email address | test_a1b2c3d4_1714423200@horusqa.test |
{{random_name}} |
Random username | User_a1b2c3d4 |
{{random_number}} |
5-digit random number | 47382 |
{{random_phone}} |
Random US phone number | +12345678901 |
{{random_password}} |
Secure password (uppercase, symbol, digits) | Hq!a1b2c3d4e587 |
{{random_text}} |
Random alphanumeric string | a1b2c3d4e5f6 |
{{uuid}} |
UUID v4 identifier | 550e8400-e29b-41d4-a716-446655440000 |
{{timestamp}} |
Unix timestamp (seconds) | 1714423200 |
The same placeholder resolves to the same value across all steps in a single run. For example, if two steps use {{random_email}}, both will receive the same generated email — useful for 'email' and 'confirm email' fields.
A flow that tests user signup with unique data on every run:
{{random_email}}
{{random_name}}
{{random_password}}
{{random_email}}
Both {{random_email}} steps will use the same generated email within this run.
Placeholders can be combined with literal text in the same value:
Order #{{random_number}} — {{random_name}}
There are four ways to trigger a flow run:
Manual
Click 'Run Now' on any flow page or from the project dashboard.
Scheduled
Configure a schedule (every 15min to weekly) on the flow edit page. Runs are dispatched automatically while respecting plan limits.
API
Trigger a run via the REST API. Create an API token in Settings > API Tokens.
curl -X POST https://horusqa.ai/api/v1/flows/:id/run \ -H "Authorization: Bearer YOUR_TOKEN"
GitHub Webhook
Configure a GitHub webhook to trigger runs on push or pull request events. See the API documentation for the webhook endpoint.
Record a flow once and run it against any environment — staging, production, or your local machine via ngrok.
When triggering a run, use the 'Override URL' field to replace the original domain in all step URLs. Leave it empty to use the URLs as recorded.
If your flow was recorded on https://staging.mysite.com and you enter https://mysite.com as the override, all steps will run against production.
When triggering runs via the API, pass the base_url_override parameter:
curl -X POST https://horusqa.ai/api/v1/runs \
-H "Authorization: Bearer YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{"flow_id": 123, "base_url_override": "https://abc123.ngrok-free.app"}'
ngrok creates a public tunnel to your local development server, letting HorusQA reach your machine.
ngrok http 3000
Your ngrok URL changes each time you restart the tunnel (unless you have a paid plan with a fixed domain).
Get notified when runs complete. Configure integrations in your project's Integrations page.
/newbot and follow the prompts to create your bot.https://api.telegram.org/bot<TOKEN>/getUpdates — look for the chat.id field.Every step is tried up to three times. The second attempt waits for the page to finish loading; the third also waits for network activity to settle and scrolls the page. Most timing problems on slow staging environments resolve themselves this way.
A step that only passed on a retry shows an amber warning icon in the run. If a flow shows it often, the app is slow at that point, not flaky.
repo and workflow scopes.If a secret is set, verify the signature header:
X-HorusQA-Signature: sha256=abc123...
Each integration can be configured to notify on specific run outcomes. By default, notifications are sent for failed and error runs only.
A step assertion failed. The test detected a problem in your application.
The run could not complete — timeout, browser crash, or infrastructure issue.
All steps passed. Enable this for full visibility or audit trails.