Bug Report: stepByStepReport not capturing screenshots in CodeceptJS 3.6+
Dieses Issue hat noch niemand übernommen.
Bewertung
- Schwierigkeit
- 2/5
- Geschätzter Aufwand
- 1-3 Stunden
- Anfängerfreundlichkeit
- 45/100
- Issue-Typ
- Bug
- Klarheit
- Klar beschrieben
- Aktivitätsstatus
- Veraltet
- Tech-Stack
- javascript, playwright
- Bereich
- testing
Rechercherichtung
Beginne in lib/plugin/stepByStepReport.js und reproduziere das Problem mit der bereitgestellten minimalen CodeceptJS-Konfiguration unter Version 3.7.5. Untersuche den Handler event.step.after und die Verwendung von recorder und überprüfe anschließend, dass ein fehlschlagender Test die erwarteten PNG-Screenshots in output/record*/ sowohl für normale als auch für parallele Ausführungen erzeugt.
Vom Indexierungsmodell aus dem Issue-Text verfasst.
Beschreibung
Hello,
The stepByStepReport plugin does not capture screenshots after each step in CodeceptJS versions 3.6.0 through 3.7.5. The record_*/ directory is created but only contains an empty index.html file with no screenshots (PNG files).
Affected Versions
- Broken: CodeceptJS 3.6.0, 3.6.1, 3.6.2, 3.6.3, 3.6.4, 3.7.0, 3.7.1, 3.7.2, 3.7.3, 3.7.4, 3.7.5
- Working: CodeceptJS 3.5.0 and earlier
Root Cause
The bug was introduced in commit 1040494 (Jun 8, 2024) titled "fix: screenshot error in beforeSuite/AfterSuite (#4385)".
The Change
In lib/plugin/stepByStepReport.js, the event.step.after handler was changed:
Before (working - v3.5.0):
event.dispatcher.on(event.step.after, (step) => {
recorder.add('screenshot of failed test', async () => persistStep(step), true);
});
After (broken - v3.6+):
event.dispatcher.on(event.step.after, persistStep);
Why This Breaks
The persistStep function is an async function that calls helper.saveScreenshot(). In the original implementation, this was wrapped in recorder.add(), which properly queues the async operation and waits for completion.
In the new implementation, persistStep is called directly as an event handler callback. Since it's an async function, the event dispatcher doesn't wait for it to complete. The screenshots are never captured because:
- The async function starts executing
- The event dispatcher immediately moves on to the next event
- The screenshot operation may be cancelled or never completes
Reproduction Steps
- Create a minimal CodeceptJS config with only
stepByStepReportenabled - Run any test that fails (to keep the report)
- Check the
_output/record_*/directory - The directory contains only
index.htmlwith no PNG files
Minimal Reproduction
// codecept.minimal.conf.js
const path = require('path');
exports.config = {
output: path.resolve(__dirname, '_output'),
helpers: {
Playwright: {
browser: 'chromium',
url: 'https://www.google.com',
show: true
}
},
plugins: {
stepByStepReport: {
enabled: true
}
},
tests: './test_minimal.js',
name: 'minimal-test'
};
// test_minimal.js
Feature('Minimal Test');
Scenario('Test stepByStepReport', ({ I }) => {
I.amOnPage('https://www.google.com');
I.wait(2);
I.see('Google');
I.see('TEXT THAT DOES NOT EXIST'); // Force failure to keep report
});
Run with:
npx codeceptjs@3.7.5 run --config codecept.minimal.conf.js
Expected: _output/record_*/ contains 0000.png, 0001.png, etc.
Actual: _output/record_*/ contains only index.html with no PNGs
Suggested Fix
Restore the original behavior by wrapping persistStep in recorder.add():
event.dispatcher.on(event.step.after, step => {
recorder.add('screenshot of step of test', async () => persistStep(step), true);
});
This ensures the async screenshot operation is properly queued and executed.
Additional Context
- This issue has been reported before as #4856 (Feb 2025) and is a follow-up of #4637
- The original fix was intended to prevent errors in BeforeSuite/AfterSuite hooks, but it inadvertently broke the core screenshot functionality
- The issue affects both single-run and parallel execution modes
Environment
- CodeceptJS: 3.7.5
- Node.js: 20.x
- Playwright: 1.57.0
- OS: Linux (Ubuntu 22.04)
Written with help from Claude 4.5 Opus.
- Vorherrschende Sprache
- JavaScript
- Sterne
- 4.2k
- Forks
- 756
- Ø Merge
- 2 T. 9 Std.
- Gemergte PRs (30 T.)
- 16
Beitragsleitfaden
Erste Schritte
- Lesen Sie das ganze Issue und danach den Beitragsleitfaden des Projekts.
- Schreiben Sie ins Issue, dass Sie es übernehmen — das erspart doppelte Arbeit.
- Forken Sie das Repository und arbeiten Sie in einem Branch.
- Öffnen Sie einen Pull Request, der die Issue-Nummer nennt.
Mehr aus codeceptjs/CodeceptJS
-
stale
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 72/100
codeceptjs/CodeceptJS#5420 · 1 Kommentar ·
-
stale
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 76/100
codeceptjs/CodeceptJS#5358 · 1 Kommentar ·
-
stale
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 78/100
codeceptjs/CodeceptJS#4958 · 10 Kommentare · 2 Reaktionen ·
-
stale
Schwierigkeit 1/5 Unter einer Stunde Anfängerfreundlichkeit 72/100
codeceptjs/CodeceptJS#4778 · 3 Kommentare ·
-
stale
Schwierigkeit 4/5 3-5 Tage Anfängerfreundlichkeit 38/100
codeceptjs/CodeceptJS#5618 · 1 Kommentar ·
Alle Issues in codeceptjs/CodeceptJS
Ähnliche Issues
-
Bug
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 70/100
Automattic/safe-publish#594 ·
-
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 75/100
dream-num/dsh-univer-office#104 ·
-
comp/dashboard invalid P3
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 70/100
NousResearch/hermes-agent#121143 ·
-
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 75/100
avniproject/avni-webapp#1811 ·
-
area/auroraboot area/webui bug
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 75/100