--- name: jmeter-har-conversion description: >- Convert HAR (HTTP Archive) files into JMeter JMX scripts. Use when the user mentions HAR files, HAR conversion, Chrome DevTools recording, Fiddler capture, mitmproxy, Postman export, or creating a JMeter script from browser network traffic. --- # HAR to JMeter JMX Conversion ## When to Use This Skill - User wants to convert a HAR file into a JMeter script - User mentions HAR, Chrome DevTools, Fiddler, Charles, mitmproxy, or Postman recording - User has a `.har` file from a browser recording and needs a `.jmx` load test script --- ## Reference This section provides context for humans and capable models. For the step-by-step execution instructions, skip to the **Execution** section below. ### What This Workflow Does 1. Converts a HAR file into a structured network capture JSON 2. Analyzes the capture to identify dynamic values (correlations) and auto-generates variable names for them 3. **(Gate)** If low-confidence or orphan correlations are found, pauses for correlation variable name review before script generation 4. Generates a parameterized JMeter JMX script from the finalized naming data ### Parameter Reference **Required:** - `test_run_id` — Unique identifier for this test run (e.g., `hardemo1`). All artifacts are written to `artifacts/{test_run_id}/jmeter/`. - `har_path` — Absolute filesystem path to the `.har` file. Relative paths will fail. **Optional:** - `step_strategy` — How to group HAR entries into test steps. Defaults to `auto`. - `auto` — Use HAR page references when available, fall back to time-gap detection - `page` — Group strictly by HAR page entries - `time_gap` — Group by time gaps between requests - `single_step` — All entries in one step - `time_gap_threshold_ms` — Gap threshold in milliseconds for the `time_gap` strategy. Defaults to `3000`. ### Related Rules These Cursor Rules apply when using this skill: - **`prerequisites.mdc`** — `test_run_id` and artifact structure validation - **`skill-execution-rules.mdc`** — Follow steps in order, collect inputs first, do not skip - **`mcp-error-handling.mdc`** — Error handling for MCP tool calls (retry policy, reporting format) - **`jmeter-script-guardrails.mdc`** — Applies to downstream HITL editing and debugging after conversion ### Notes - HAR files from real browser sessions contain actual request/response data, so correlation analysis typically finds more meaningful results than synthetic Swagger-based captures. - Use `page` strategy if the HAR has clean page entries. Use `time_gap` if pages are missing. - Cache-busting parameters (e.g., `_t`, `_`) with epoch-millisecond values are common. These are typically orphan IDs best handled with JMeter's `__time()` function. - OAuth redirect flows may have tokens exchanged outside the capture window, resulting in orphan correlations for auth-related values. - After conversion, the user can proceed to HITL editing or debugging workflows. - The correlation naming file is auto-generated by the analysis tool. **Always review and adjust variable names before generating the JMX script** when the analysis reports any low-confidence or orphan correlations — variable names are baked into the JMX at generation time and cannot be updated retroactively without re-generating or manually editing the script. Use the correlation naming skill at `.cursor/skills/jmeter-correlation-naming/SKILL.md` (Scenario A) for the review. --- ## Execution Follow these steps exactly, in order. Each step has one action. --- ### Collect Inputs Ask the user for the following values. Do not proceed until all required values are collected. ``` REQUIRED: test_run_id = [ask user] har_path = [ask user — must be absolute path] OPTIONAL: step_strategy = [ask user or use default: "auto"] time_gap_threshold_ms = [ask user or use default: 3000] ``` --- ### Step 1 — Convert HAR to Network Capture **Input:** `test_run_id`, `har_path`, `step_strategy`, `time_gap_threshold_ms` **Action:** Call MCP tool `convert_har_to_capture` ``` convert_har_to_capture( test_run_id = {test_run_id}, har_path = {har_path}, step_strategy = {step_strategy}, time_gap_threshold_ms = {time_gap_threshold_ms} ) ``` **Expected response:** ```json { "status": "OK", "network_capture_path": "artifacts/{test_run_id}/jmeter/network-capture/network_capture_YYYYMMDD_HHMMSS.json", "test_run_id": "{test_run_id}" } ``` **Save:** `capture_path` = value of `network_capture_path` from the response. **On error:** If `status` is `"ERROR"`, stop. Report the full error message to the user. --- ### Step 2 — Analyze Network Traffic **Input:** `test_run_id` **Action:** Call MCP tool `analyze_network_traffic` ``` analyze_network_traffic( test_run_id = {test_run_id} ) ``` **Expected response:** ```json { "status": "OK", "correlation_spec_path": "artifacts/{test_run_id}/jmeter/correlation_spec.json", "correlation_naming_path": "artifacts/{test_run_id}/jmeter/correlation_naming.json", "count": 7, "summary": { "total_correlations": 7, "business_ids": 3, "..." : "..." } } ``` **Save:** `correlation_count` = value of `count` from the response. **On error:** If `status` is `"ERROR"`, stop. Report the full error message to the user. This step produces two files: - `correlation_spec.json` — raw correlation analysis - `correlation_naming.json` — auto-generated variable names --- ### Step 2a — Correlation Naming Review (Conditional Gate) **Condition:** Check the `summary` from Step 2. If any of the following are non-zero, this gate is **mandatory** before proceeding to Step 3: - `low_confidence` > 0 - `orphan_ids` > 0 **Action:** Pause and present the low-confidence and orphan correlations to the user. For each flagged correlation, show: - The auto-generated `variable_name` - The `type` and `value_type` (e.g. `orphan_id / email`, `progressive_auth / jwt`) - Where the value was found (source URL and location) - A suggested rename if the auto-generated name is generic or ambiguous Ask the user to confirm or provide corrected names before continuing. Once names are confirmed, follow the correlation naming skill at `.cursor/skills/jmeter-correlation-naming/SKILL.md` (Scenario A) to apply any changes to `correlation_naming.json`. **If all correlations are high or medium confidence with no orphans:** skip this gate and proceed directly to Step 3. > **Why this gate exists:** `generate_jmeter_script` reads `correlation_naming.json` > at generation time. Variable names are baked into extractor names and parameterized > request fields in the JMX. Renaming after generation only updates the naming file — > it does not retroactively update the script. --- ### Step 3 — Generate JMeter JMX Script **Input:** `test_run_id`, `capture_path` (saved from Step 1) **Action:** Call MCP tool `generate_jmeter_script` ``` generate_jmeter_script( test_run_id = {test_run_id}, json_path = {capture_path} ) ``` **Expected response:** ```json { "status": "success", "jmx_path": "artifacts/{test_run_id}/jmeter/ai-generated_script_YYYYMMDD_HHMMSS.jmx", "message": "JMX script generated successfully: ..." } ``` **Save:** `jmx_path` = value of `jmx_path` from the response. **On error:** If `status` is `"error"`, stop. Report the full error message to the user. > Note: This tool returns lowercase `"success"` / `"error"`, unlike the other tools > which return uppercase `"OK"` / `"ERROR"`. --- ### Step 4 — Report to User **Input:** `test_run_id`, `jmx_path` (saved from Step 3), `correlation_count` (saved from Step 2) **Action:** Present the results to the user. Tell the user: - The JMX script was created at `{jmx_path}` - `{correlation_count}` correlations were detected and parameterized - The following artifacts were generated: ``` artifacts/{test_run_id}/jmeter/ ├── network-capture/ │ └── network_capture_.json ├── capture_manifest.json ├── correlation_spec.json ├── correlation_naming.json ├── ai-generated_script_.jmx └── testdata_csv/ └── environment.csv ``` Ask the user: - "Do you want to proceed with HITL editing or debugging?" — If yes, proceed to the appropriate downstream workflow. --- ## Error Handling These rules apply to every step: - If any MCP tool returns an error status, stop immediately. - Report the full error message to the user. - Do NOT write code to fix MCP tool issues. - Do NOT proceed to the next step if the current step failed. - Ask the user for next steps.