skip to content

You have only the trace zip from a Playwright run where an order-tracker test timed out in CI. Which Trace Viewer tabs do you read, and what does each settle?

level: seniorimportance: should knowfreq 48%

answer

  1. Start where the run already failed
  2. One tab, one question each
  3. What you asked versus what happened
  4. Empty panel means check requests
  5. The record stops at the browser

basics

~20 s

Start at the failing action, then let each tab answer one question: Call for the recorded arguments, Log for what the call waited on, the snapshots for what was on screen, Network and Console for why.

solid answer

~40 s

Open the trace, click the last action — the failing one is marked in the Actions list — and let each tab answer one question. **Call** shows the recorded call with its arguments and duration, so you confirm you targeted what you thought you did. **Log** shows what that call was waiting on while the clock ran. The **Before** and **After** snapshots show whether the element was ever on the page. **Console** surfaces page errors that broke rendering. **Network** shows whether the order-status request returned, returned an error, or never came back at all. **Source** shows the test line, and **Attachments** holds anything the run attached. In Playwright 1.63 the **Metadata** pane also records browser, viewport and run details — often the fastest explanation of a difference between a CI machine and a laptop.

code

bash · 2 lines
bash
unzip -o ci-artifacts.zip -d ./ci-artifacts
npx playwright show-trace ./ci-artifacts/test-results/order-tracker-live-status-chromium/trace.zip

go deeper

for a junior

Learn that the failing action is marked in the list and that clicking it drives every other pane. Start with the snapshots and the console before anything else.

for a middle

Be able to name each tab and the one question it answers, and explain why Call and Log are different things — one is what you asked for, the other is what happened while it ran.

for a senior

Show a converging order rather than a tour: failing action, snapshot, call, log, network, console, and a clear statement of what the trace does not cover once you reach the server boundary.

for a principal

Make trace reading a shared skill rather than one person's party trick, and be clear about where a browser-side trace stops so investigations do not stall at the service boundary.

## Start from the failing action, not the top The Actions list is ordered, timed, and marks the action that failed. Open it there. Reading a trace forwards from the first `goto()` wastes the one advantage the viewer gives you: it already knows which call ran out of time. Select that row and every other pane in the window rebinds to it. Then work outwards. Each tab settles a different question, and knowing which tab settles which is most of the skill. ## The tab map | Tab | What it holds | What it settles | |---|---|---| | **Actions** | Every recorded call, in order, with durations | Which step failed, and how long the ones before it took | | **Call** | The call's parameters, duration and result | Whether you targeted the thing you meant to target | | **Log** | The call's internal progress entries | What the call was waiting for while the clock ran down | | **Console** | Messages the page emitted | Whether the app threw and stopped rendering | | **Network** | Requests with headers, timings and bodies | Whether the data the UI needed ever arrived | | **Source** | The test file with the current line highlighted | Which line of your code issued this call | | **Attachments** | Files the run attached to the test | Extra evidence recorded alongside the trace | | **Metadata** | Browser, viewport and run details | Whether the environment differed from your machine | ## A reading order that converges fast For an order tracker whose test timed out waiting on a delivery-status element: 1. **Actions** — confirm which call failed and note how long the preceding calls took. A slow `goto()` followed by a fast failure tells a different story from one long wait at the end. 2. **Before snapshot** — was the element on the page at all? If the page is showing a skeleton loader, you are looking at a data problem, not a locator problem. 3. **Call** — read the arguments actually recorded. A selector built from a template string can differ from the one you believe you wrote. 4. **Log** — read what the call reported while it waited. This is where a call that found the element but never got it into a usable state separates from one that never found anything. 5. **Network** — find the request behind the missing content. A `/api/orders/8412/status` entry that returned 500, returned an empty payload, or is still pending at the end of the trace explains an empty UI immediately. 6. **Console** — check for an exception thrown by the page. A crashed render leaves the DOM frozen mid-update and every downstream locator fails for the same reason. 7. **Source** — jump to the test line to see the assertion in context before you decide the fix. ## What the trace can and cannot tell you The trace ends where the browser ends. It is complete about what the page did and utterly silent about what the server did internally: - It shows a request went out, its headers, its status and its body — not why the service produced that status. - It shows a long wait — not what the CI host was doing while it waited. - It shows the DOM as recorded — not state living only in component memory. ## Reading Metadata before blaming CI When a test passes locally and fails on a build machine, the Metadata pane is worth thirty seconds early rather than an hour late: browser and version, viewport size, and run details. A narrower viewport that pushes the delivery-status panel below the fold, or a different browser engine, is a mundane and very common explanation that costs nothing to rule out. ## Habits worth building - Read **Call before Log**: know what you asked for before you read what it did. - Treat a **timeout as a symptom**, then let Network and Console compete to explain it. - Check the **action immediately before** the failure. A fill that silently targeted the wrong field is invisible until you look one row up. - Keep the failing trace open next to a trace from a passing run of the same test; comparing two Actions lists side by side finds a diverged step faster than any amount of reasoning about one.

  • The Network tab shows the order-status request returned 200 with the right body, yet the panel is empty in the After snapshot. Where next?
    Console, then the following action's Before snapshot. A 200 with good data and an empty panel points at the page failing to render it — an exception during the update is the usual cause, and the console message names the component. The snapshots then tell you whether the DOM ever changed.
  • Why open the Call tab when the Actions list already shows which call failed?
    Because the list shows the call, and Call shows its recorded arguments and duration. Selectors assembled at runtime, values read from fixtures and timeouts resolved from configuration are frequently not what the author assumed, and only the recorded parameters settle that.
  • What in a trace helps when a test passes locally and fails on the build machine?
    Metadata first — browser, version and viewport — since an environment difference is cheap to rule out. Then compare the Actions lists of the failing trace and a passing one to find the first step that diverged, and read Network for requests the CI environment answered differently.

saying these in an interview costs you the question

  • Reads the trace from the first action forward every time
  • Treats a timeout message as the diagnosis rather than a symptom
  • Expects the trace to explain server-side behaviour
  • Never opens Call, so never checks the recorded arguments
  • Ignores Console and blames the locator for a page exception
  • Skips Metadata when a failure is CI-only