form-tester 0.7.2 → 0.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -69,8 +69,27 @@ Dokumenter verification (only when modal confirms storage):
69
69
  1. Navigate to `/dokumenter?pnr={PNR}` and select the same person used during form fill.
70
70
  2. The document list loads sorted newest first. The first entry should match the form title.
71
71
  3. Click "Se detaljer" on the first document, then click "Åpne dokumentet".
72
- 4. IMPORTANT - document capture depends on format:
73
- - PDF documents: DOWNLOAD the file. Use `form-tester exec pdf --filename "$OUTPUT_DIR/document.pdf"` or save via browser download. Do NOT screenshot PDFs.
74
- - HTML documents: Take a FULL-PAGE screenshot of the ENTIRE document (`form-tester exec screenshot --filename "$OUTPUT_DIR/document_screenshot.png" --full-page`). HTML documents cannot be downloaded as files, so the full-page screenshot is the primary artifact. Also save the snapshot and raw HTML.
75
- - XML/other formats: Note the document type in test_results.txt and skip capture.
72
+ 4. After clicking "Åpne dokumentet", the document may open in a dialog, a new tab, or inline. FIRST determine the format before capturing:
73
+
74
+ Step A Detect format:
75
+ Run `form-tester exec snapshot` and examine the result.
76
+ - If you see an iframe/embed/object with a src containing `.pdf`, `blob:`, or a PDF viewer → it's a PDF.
77
+ - If you see rendered HTML content (headings, paragraphs, form data) → it's HTML.
78
+ - If `--full-page` screenshot times out → it's almost certainly a PDF viewer. Do NOT retry the screenshot. Switch to PDF download.
79
+
80
+ Step B — PDF documents (viewer in dialog/modal/iframe/new tab):
81
+ Do NOT screenshot PDFs — it will timeout or produce garbage. Download the file:
82
+ 1. Extract PDF URL from the iframe/embed/object:
83
+ `form-tester exec eval "document.querySelector('iframe')?.src || document.querySelector('embed')?.src || document.querySelector('object')?.data"`
84
+ 2. If the result is a URL, download it with run-code:
85
+ `form-tester exec run-code "async page => { const url = await page.evaluate(() => document.querySelector('iframe')?.src || document.querySelector('embed')?.src || document.querySelector('object')?.data); if (url) { const resp = await page.request.get(url); require('fs').writeFileSync('$OUTPUT_DIR/document.pdf', await resp.body()); } }"`
86
+ 3. Or if the PDF viewer has a download button, click it.
87
+ 4. Record in test_results.txt: document type PDF, downloaded to document.pdf.
88
+
89
+ Step C — HTML documents:
90
+ Take a FULL-PAGE screenshot (`form-tester exec screenshot --filename "$OUTPUT_DIR/document_screenshot.png" --full-page`).
91
+ Also save raw HTML: `form-tester exec eval "document.documentElement.outerHTML"` → save to document.html.
92
+
93
+ Step D — XML/other: Note type in test_results.txt, skip capture.
94
+
76
95
  5. Include the document verification results in test_results.txt (document title, whether it matched the form h1, document type: HTML/PDF/XML).
@@ -82,7 +82,14 @@ After submission, read the modal text:
82
82
  - If it mentions Dokumenter storage -> navigate to `/dokumenter?pnr={PNR}`, verify the document appears.
83
83
  - If it does NOT mention Dokumenter -> skip verification, note in test_results.txt.
84
84
 
85
- Document capture depends on format:
86
- - **PDF documents**: download the file (`form-tester exec pdf --filename "..." `). Do NOT screenshot PDFs.
87
- - **HTML documents**: take a full-page screenshot of the ENTIRE document (`form-tester exec screenshot --filename "..." --full-page`). HTML documents cannot be downloaded, so the screenshot is the primary artifact.
88
- - **XML/other**: note the type in test_results.txt and skip capture.
85
+ Document capture FIRST detect the format by running `form-tester exec snapshot`:
86
+
87
+ **PDF documents** (iframe/embed with .pdf or blob: URL, or screenshot times out): Do NOT screenshot PDFs. Download instead:
88
+ 1. Extract URL: `form-tester exec eval "document.querySelector('iframe')?.src || document.querySelector('embed')?.src || document.querySelector('object')?.data"`
89
+ 2. Download: `form-tester exec run-code "async page => { const url = await page.evaluate(() => document.querySelector('iframe')?.src || document.querySelector('embed')?.src || document.querySelector('object')?.data); if (url) { const resp = await page.request.get(url); require('fs').writeFileSync('OUTPUT_DIR/document.pdf', await resp.body()); } }"`
90
+ 3. Or click the download button in the PDF viewer if available.
91
+ 4. If `--full-page` screenshot times out, it's a PDF — switch to download, don't retry screenshot.
92
+
93
+ **HTML documents**: `form-tester exec screenshot --filename "..." --full-page`. Also save raw HTML.
94
+
95
+ **XML/other**: note the type in test_results.txt and skip capture.
@@ -3,10 +3,6 @@ name: Publish to npm
3
3
  on:
4
4
  release:
5
5
  types: [published]
6
- push:
7
- branches: [master]
8
- paths:
9
- - 'package.json'
10
6
 
11
7
  jobs:
12
8
  publish:
package/form-tester.js CHANGED
@@ -6,7 +6,7 @@ const { spawn, execSync } = require("child_process");
6
6
 
7
7
  const CONFIG_PATH = path.join(process.cwd(), "form-tester.config.json");
8
8
  const OUTPUT_BASE = path.resolve(process.cwd(), "output");
9
- const LOCAL_VERSION = "0.7.2";
9
+ const LOCAL_VERSION = "0.8.0";
10
10
  const RECOMMENDED_PERSON = "Uromantisk Direktør";
11
11
 
12
12
  // Recording — persisted to disk so `form-tester exec` can append across processes
@@ -955,12 +955,10 @@ async function handleTest(url, config) {
955
955
  "/dokumenter?pnr={PNR}",
956
956
  );
957
957
 
958
- // Save recording
959
- const recordingPath = saveRecording();
960
- if (recordingPath) {
961
- console.log(`Recording saved: ${recordingPath}`);
962
- console.log(`Replay with: form-tester replay "${recordingPath}"`);
963
- }
958
+ // Don't finalize recording — exec commands will keep appending.
959
+ console.log(`Recording active: ${config.activeRecording}`);
960
+ console.log(`Use 'form-tester exec' for all playwright-cli commands to record them.`);
961
+ console.log(`Recording finalizes on 'form-tester exec close'.`);
964
962
  }
965
963
 
966
964
  async function handleTestAuto(url, config, flags) {
@@ -1073,12 +1071,11 @@ async function handleTestAuto(url, config, flags) {
1073
1071
  printNextSteps(outputDir, dokumenterUrl || "/dokumenter?pnr={PNR}");
1074
1072
  }
1075
1073
 
1076
- // Save recording
1077
- const recordingPath = saveRecording();
1078
- if (recordingPath) {
1079
- log(`Recording saved: ${recordingPath}`);
1080
- log(`Replay with: form-tester replay "${recordingPath}"`);
1081
- }
1074
+ // Don't finalize recording here — `form-tester exec` commands will keep appending.
1075
+ // Recording is finalized when `form-tester exec close` is called.
1076
+ log(`Recording active: ${config.activeRecording}`);
1077
+ log(`Use 'form-tester exec' for all playwright-cli commands to record them.`);
1078
+ log(`Recording finalizes on 'form-tester exec close'.`);
1082
1079
  }
1083
1080
 
1084
1081
  async function handleReplay(filePath) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "form-tester",
3
- "version": "0.7.2",
3
+ "version": "0.8.0",
4
4
  "description": "AI-powered form testing skill for /skjemautfyller forms using Playwright CLI. Works with Claude Code and GitHub Copilot.",
5
5
  "main": "form-tester.js",
6
6
  "bin": {