Skip to content

Commit e2553fd

Browse files
authored
fix: onBeforeScreenshot and pause called before each theme screenshot (#61)
This adds extra screenshot stability by waiting for potential layout and paint in browser triggered by theme change
1 parent ba657fc commit e2553fd

File tree

3 files changed

+24
-10
lines changed

3 files changed

+24
-10
lines changed

actions/README.md

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -132,7 +132,8 @@ type MatchScreenshotOptions = {
132132
*/
133133
themes?: Theme[];
134134
/**
135-
* Callback before taking screenshot. Useful for special stabilizing actions
135+
* Callback before taking screenshot. Useful for special stabilizing actions.
136+
* Called before each individual screenshot (including each theme when multiple themes are configured).
136137
* @param page Page current page
137138
* @param options ScreenshotOptions screenshot options being used
138139
* @defaultValue globalSettings.matchScreenshot.onBeforeScreenshot
@@ -390,7 +391,8 @@ When reassigning settings, sections are merged, settings per section are also me
390391
*/
391392
hideBySelector: undefined as string[] | undefined,
392393
/**
393-
* Pause before screenshot (ms)
394+
* Pause before each screenshot (ms).
395+
* Applied per individual screenshot capture (including each theme).
394396
*/
395397
pause: 1000,
396398
/**
@@ -411,7 +413,8 @@ When reassigning settings, sections are merged, settings per section are also me
411413
*/
412414
themes: undefined as Theme[] | undefined,
413415
/**
414-
* Callback before taking screenshot. Useful for special stabilizing actions
416+
* Callback before taking screenshot. Useful for special stabilizing actions.
417+
* Called before each individual screenshot (including each theme).
415418
*/
416419
onBeforeScreenshot: undefined as OnBeforeScreenshotCallback | undefined,
417420
/**

actions/matchScreenshot.ts

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -158,33 +158,35 @@ export async function matchScreenshot(
158158
await page.mouse.move(x, y);
159159
}
160160

161-
await onBeforeScreenshot?.(page, combinedOptions);
162-
163161
const slug = shouldPrependSlugToName ? getTestSlug(page) : undefined;
164162

165-
await page.waitForTimeout(pause);
166-
167163
if (themes && themes.length) {
168164
for (const theme of themes) {
169165
await onSwitchTheme?.(theme, page);
170166

171167
const resolvedName = name ? `${name}-${theme}` : undefined;
172168

173169
await doMatchScreenshot({
170+
page,
174171
locator,
175172
name: resolvedName,
176173
slug,
177174
options: combinedOptions,
178175
soft,
176+
onBeforeScreenshot,
177+
pause,
179178
});
180179
}
181180
} else {
182181
await doMatchScreenshot({
182+
page,
183183
locator,
184184
name,
185185
slug,
186186
options: combinedOptions,
187187
soft,
188+
onBeforeScreenshot,
189+
pause,
188190
});
189191
}
190192

@@ -195,13 +197,20 @@ export async function matchScreenshot(
195197
}
196198

197199
async function doMatchScreenshot(params: {
200+
page: Page;
198201
locator: Locator | Page;
199202
name?: string;
200203
slug?: string;
201204
options: ScreenshotOptions;
202205
soft: boolean;
206+
onBeforeScreenshot?: OnBeforeScreenshotCallback;
207+
pause: number;
203208
}): Promise<void> {
204-
const { locator, name, slug, options, soft } = params;
209+
const { page, locator, name, slug, options, soft, onBeforeScreenshot, pause } = params;
210+
211+
await onBeforeScreenshot?.(page, options);
212+
await page.waitForTimeout(pause);
213+
205214
const resolvedName = resolveScreenshotName({ name, slug });
206215
const resolvedExpect = soft ? expect.soft : expect;
207216

fixtures/README.md

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -118,7 +118,8 @@ type ExpectScreenshotFixtureBuilderParams = {
118118
*/
119119
hideBySelector?: string[];
120120
/**
121-
* Pause before screenshot (ms)
121+
* Pause before each screenshot (ms).
122+
* Applied per individual screenshot capture (including each theme).
122123
* @defaultValue `1000`
123124
*/
124125
pause?: number;
@@ -138,7 +139,8 @@ type ExpectScreenshotFixtureBuilderParams = {
138139
*/
139140
themes?: Theme[];
140141
/**
141-
* Callback before taking screenshot. Useful for special stabilizing actions
142+
* Callback before taking screenshot. Useful for special stabilizing actions.
143+
* Called before each individual screenshot (including each theme when multiple themes are configured).
142144
* @param page Page current page
143145
*/
144146
onBeforeScreenshot?: (page: Page, options: ScreenshotOptions) => Promise<void>;

0 commit comments

Comments
 (0)