
June 26, 2026

TestInspector streams every test step result to the browser in real time using a WebSocket connection. When a test run begins — whether triggered manually, via the scheduler, or through the CI/CD API — each step execution event is pushed to any connected client as it happens: the step type, the target selector, the outcome, and any assertion detail. This means a QA engineer monitoring a suite does not wait until the entire run completes to understand what is happening. They see each click, navigation, assertion, and HTTP request resolve in sequence, step by step, as the test runner progresses through the suite.
The practical value is clearest on long-running suites. A regression suite that takes twenty minutes to execute generates no intermediate feedback in a traditional polling or batch-log model. In TestInspector's streaming model, the first failure becomes visible within seconds of the failing step executing. For teams trying to reduce the feedback loop between a code change and test failure notification, live streaming is a structural improvement over any approach that buffers results until completion. This guide explains how the streaming mechanism works, how it compares to post-run log models, how to use live visibility to debug failures faster, and how to integrate real-time test output with CI/CD pipeline tooling. For teams evaluating TestInspector as a test execution platform, live streaming is one of the features that most directly affects how quickly failures can be identified and acted on.
The dominant model for test result reporting in CI/CD pipelines is post-run: the test runner executes all tests, aggregates results, and writes a log or report that becomes available when the run completes. This model is adequate when test suites are small, fast, and stable. It becomes a material problem as suites grow in size and execution time.
The core issue is that post-run logs provide no signal about what is happening during execution. When a twenty-minute regression suite is running in CI, the pipeline is blocked and engineers have no information until the run ends. If the suite contains a failure on step three of test one, that failure happened nineteen minutes before the engineer learns about it. During those nineteen minutes, the rest of the suite executes unnecessarily — consuming CI agent time and delaying the feedback that should have been available within seconds.
A secondary issue is that post-run logs are optimized for reading after failure, not for understanding execution in progress. They answer what failed but not what the test was doing at the step level. The log records the failure but often lacks the selector that was targeted, the assertion that was evaluated, or the HTTP status code that was checked. Reconstructing the execution context from a batch log requires more manual work than observing the execution live.
| Aspect | Post-Run Log Model | Live WebSocket Streaming |
|---|---|---|
| Time to first failure signal | After the full run completes | Within seconds of the failing step |
| Step-level detail during execution | Not available | Step type, selector, outcome shown live |
| Ability to stop early | Not practical — no signal | Possible — failure visible mid-run |
| CI agent time on failing runs | Full run duration always consumed | Can terminate on first critical failure |
| Collaborative monitoring | Log file shared after completion | Live URL shared for concurrent viewing |
The operational cost of this gap grows with suite size. A team running a hundred-test suite with a ten-second average per test waits up to seventeen minutes for failure information that could be available in under a minute with a streaming model. For teams where CI run time is a known bottleneck, the shift from post-run reporting to live streaming represents a meaningful reduction in the time engineers spend blocked on feedback. Astaqc's test automation services include suite architecture reviews that specifically address feedback loop latency in CI/CD pipelines, and Astaqc's software testing services cover the broader tooling changes that support faster feedback cycles.
When a test run starts in TestInspector — whether from the dashboard, via a scheduled trigger, or via the CI/CD API endpoint — the platform establishes a WebSocket channel for that run. Any authenticated client viewing the run in the TestInspector dashboard connects to this channel and receives step events as they are emitted by the test runner. The connection is maintained for the duration of the run and closes cleanly when the run completes or is stopped.
Each step in a TestInspector test emits a discrete event when it begins and when it resolves. The begin event carries the step type (navigate, click, fill, assert, HTTP request, accessibility check, visual comparison, or wait), the step index in the test, and the target selector or URL. The resolve event carries the outcome (pass or fail), the assertion result if applicable, the HTTP status code and response body for HTTP request steps, and any error message if the step failed. These events are received in the browser dashboard as they arrive, updating the step-by-step view in real time.
The streaming architecture uses a server-sent event model over WebSocket rather than client polling. The client does not request step results on an interval — the server pushes each event as soon as it is available. This means the latency between a step completing on the test runner and the result appearing in the dashboard is determined by network round-trip time, not by a polling interval. For most browser-based test steps, step events appear in the dashboard within one to two hundred milliseconds of the step completing on the runner.
Security is handled at the run level. Each run has an authenticated WebSocket token scoped to that specific run and to the organization it belongs to. Clients without a valid session for the organization cannot connect to the stream. For teams running tests in a multi-tenant setup, this means run streams for one team are not accessible to other teams in the platform. The streaming connection also handles reconnection transparently: if a client loses its connection mid-run due to network disruption, reconnecting to the run URL resumes streaming from the current point in the run, with the step history for completed steps populated from the run record.
For teams building a complete testing strategy, understanding how test execution feedback reaches the team — and how quickly — is a foundational design decision. The manual testing services offered by Astaqc can be combined with automated runs in TestInspector to create a visibility model where both automated step results and exploratory test notes are available to the team in near real time.
The immediate practical benefit of live streaming is debugging speed. When a test run fails, the first question is always: at which step did it fail, and what was the runner doing at that point? Post-run logs answer this question after the fact. Live streaming answers it as the failure occurs, with the full execution context visible at the moment of failure.
In TestInspector's streaming view, a step that fails highlights immediately. The failed step shows the selector that was targeted (or the URL that was navigated to), the action that was attempted, and the specific assertion or condition that was not met. For assertion failures, the expected value and the actual value are both displayed. For click failures, the selector is shown alongside the error — whether it was element not found, element not interactable, or a timeout. This level of detail in the live view eliminates the most common diagnostic step in post-run debugging: cross-referencing the log timestamp with the selector in the test definition to reconstruct what was being attempted.
The self-healing mechanism in TestInspector interacts directly with the streaming view. When a step fails because the primary selector does not find an element, TestInspector's AI retry logic attempts alternative selectors and emits these retry events as part of the stream. The streaming view shows each retry attempt, the alternative selector that was tried, and whether the retry succeeded. For teams diagnosing selector drift — where an element's CSS class or attribute has changed in the application under test — the retry stream provides a live audit of how the self-healing mechanism responded to the change, including which selector ultimately worked or which failed.
For HTTP request steps, the live stream includes the full response context: the status code, the response time, and the assertion outcome. When an API endpoint returns an unexpected status code mid-suite, the streaming view captures this immediately, including the URL, the method, and the response body snippet, without requiring engineers to wait for the suite to complete and then search through a log for the relevant request entry.
For teams with established test automation pipelines, integrating TestInspector's live streaming into the debugging workflow means engineers can monitor runs actively during development — particularly when new tests are being stabilized — rather than switching back to check log files at intervals. The guide on manual versus automated testing covers how real-time feedback from automated runners can be combined with exploratory manual testing to reduce overall defect escape rates.
TestInspector runs triggered via the CI/CD API produce the same WebSocket stream as runs triggered manually from the dashboard. The run URL — which carries the live streaming view — is returned in the API response when a run is initiated. CI/CD pipeline scripts can capture this URL and output it as a build annotation, a Slack notification, or a PR comment, giving engineers direct access to the live stream for every CI-triggered run without navigating to the TestInspector dashboard manually.
The API trigger pattern for a CI/CD integration is straightforward. The pipeline sends an HTTP POST to the TestInspector API with the suite ID and optionally a set of variable overrides for that run. The response includes the run ID and the run URL. The pipeline can then optionally poll the run status endpoint to determine when the run completes and retrieve the final pass/fail result for the pipeline decision. During the polling window, the live stream URL is accessible to any engineer who wants to observe the run in real time from their browser.
Scheduling in TestInspector — via cron expressions, fixed intervals, or one-time scheduled triggers — also produces streamed runs. A nightly regression suite scheduled to run at 2:00 AM generates a stream that can be observed live by any team member who chooses to monitor it, and the full step-by-step result is persisted in the run history for review the next morning. The combination of live streaming during execution and persistent run history after completion means the same run record serves both the immediate monitoring use case and the retrospective audit use case.
For teams running tests across multiple browsers — Chrome, Firefox, Edge, and Safari are all supported in TestInspector's Selenium-based runner — each browser variant of a run produces its own stream. Teams that run suites in parallel across browsers can monitor each browser's stream in separate dashboard tabs, with the same step-by-step detail for each. Cross-browser failures — where a step passes on Chrome but fails on Firefox — are immediately distinguishable in the streaming views without aggregating results after the run.
The accessibility assertion steps in TestInspector, which run axe-core checks at specified points in a test flow, also emit streaming events. When an axe-core check runs, the stream emits the check event, the severity levels scanned, and the number of violations found at each severity level. For teams that include accessibility checks as part of their regression suite, live streaming provides immediate visibility into whether a code change introduced new WCAG violations at the point in the test flow where the check runs.
For teams building a CI/CD integration with TestInspector, Astaqc's test automation services provide setup and configuration support, including pipeline script templates for common CI platforms. The guide on outsourcing QA covers how to structure visibility and reporting requirements when test execution is handled by an external team. See also the software testing cost guide for how test infrastructure choices affect overall QA programme costs.
TestInspector streams a discrete event for each step in the test: the step type (navigate, click, fill, assert, HTTP request, accessibility check, visual comparison, or wait), the step's target (selector, URL, or endpoint), and the outcome (pass or fail). For assertion steps, the expected and actual values are included. For HTTP request steps, the response status code and response time are streamed. For self-healing retry attempts, each alternative selector and its outcome is streamed as a sub-event of the failed step. All of this is delivered as events arrive from the runner, not buffered until the run completes.
The streaming overhead is minimal. Each step event is a small JSON payload that the runner emits over the existing WebSocket connection at step completion. The event emission adds no meaningful latency to the step execution itself — the runner does not wait for the stream consumer to acknowledge receipt before proceeding to the next step. In practice, runs with and without active streaming clients complete in statistically indistinguishable times.
Yes. Multiple authenticated clients can connect to the same run's WebSocket channel concurrently. Each client receives the same event sequence independently. This makes live streaming useful for collaborative debugging sessions — a developer and a QA engineer can both observe a failing run simultaneously without one of them sharing screen capture. The live run URL can be copied from the dashboard and shared directly in Slack or a PR comment.
Reconnecting to the run URL after a connection drop resumes streaming from the current point in the run. The step history for all completed steps is loaded from the persistent run record when you reconnect, so you see a complete picture of everything that happened before and after the disconnection. The live stream then continues with new step events as they arrive. You do not miss events that occurred while disconnected — they are available in the run record as soon as you reconnect.
All run types — manual from the dashboard, scheduled via cron or interval, and API-triggered from CI/CD pipelines — produce a WebSocket stream. The run URL returned by the API trigger response links directly to the live streaming view for that run. For CI/CD-triggered runs, teams commonly post this URL as a build annotation or PR comment so engineers can access the live stream without searching the TestInspector dashboard for the current run. See TestInspector for API documentation and integration examples.
After a run completes, the full step-by-step result — including all events that were streamed during execution — is persisted in the run history. The step detail available in the post-run history is identical to what was visible in the live stream during execution, so teams can review any run at a later time with the same level of detail that was available live. Retention periods depend on the organization plan level in TestInspector. See TestInspector for details on plan limits and data retention.

Sign up to receive and connect to our newsletter