Skip to content

Releases: webdriverio/visual-testing

@wdio/visual-service@9.2.0

15 Mar 14:09
74d8368

Choose a tag to compare

Minor Changes

  • 994f4da: ## #857 Support ignore regions for web screenshots

    Add ignore support to all web screenshot methods (saveScreen/checkScreen, saveElement/checkElement, saveFullPageScreen/checkFullPageScreen) so that specified elements can be blocked out during visual comparison. This brings web parity with the native-app ignore-region support that already existed.

    Changes

    • Ignore regions for full-page screenshots: new determineWebFullPageIgnoreRegions function that calculates ignore-region rectangles for full-page screenshots, including a fullPageCropTopPaddingCSS correction for mobile scroll-and-stitch scenarios where the address-bar shadow padding shifts element positions
    • Consolidated ignoreRegionPadding: moved ignoreRegionPadding into BaseWebScreenshotOptions so it is inherited by all web methods instead of being duplicated per method
    • Fix isAndroidNativeWebScreenshot type: ensure nativeWebScreenshot is always a boolean (was accidentally an object for LambdaTest capabilities), preventing ignore-region DPR scaling failures
    • Fix viewport rounding for mobile: restore Math.round() in injectWebviewOverlay and remove Math.min clamping in getMobileViewPortPosition to prevent 1-pixel crop shifts during full-page stitching
    • Fix scrollElementIntoView for scrolled pages: account for currentPosition (existing scroll offset) when computing the target scroll position, so elements are scrolled into view correctly when the page is already scrolled
    • Dismiss Chrome Start Surface on Android: when Chrome's tab-overview UI blocks the webview overlay, automatically press the Android Back button (up to 4 retries) to restore the active tab before measuring the viewport
    • Add hybrid status bar blockout: on hybrid apps the statusbar was not blocked out which could result in flaky tests regarding battery and reception

    Committers: 1

Patch Changes

  • Updated dependencies [994f4da]
    • @wdio/image-comparison-core@1.2.0

@wdio/image-comparison-core@1.2.0

15 Mar 14:09
74d8368

Choose a tag to compare

Minor Changes

  • 994f4da: ## #857 Support ignore regions for web screenshots

    Add ignore support to all web screenshot methods (saveScreen/checkScreen, saveElement/checkElement, saveFullPageScreen/checkFullPageScreen) so that specified elements can be blocked out during visual comparison. This brings web parity with the native-app ignore-region support that already existed.

    Changes

    • Ignore regions for full-page screenshots: new determineWebFullPageIgnoreRegions function that calculates ignore-region rectangles for full-page screenshots, including a fullPageCropTopPaddingCSS correction for mobile scroll-and-stitch scenarios where the address-bar shadow padding shifts element positions
    • Consolidated ignoreRegionPadding: moved ignoreRegionPadding into BaseWebScreenshotOptions so it is inherited by all web methods instead of being duplicated per method
    • Fix isAndroidNativeWebScreenshot type: ensure nativeWebScreenshot is always a boolean (was accidentally an object for LambdaTest capabilities), preventing ignore-region DPR scaling failures
    • Fix viewport rounding for mobile: restore Math.round() in injectWebviewOverlay and remove Math.min clamping in getMobileViewPortPosition to prevent 1-pixel crop shifts during full-page stitching
    • Fix scrollElementIntoView for scrolled pages: account for currentPosition (existing scroll offset) when computing the target scroll position, so elements are scrolled into view correctly when the page is already scrolled
    • Dismiss Chrome Start Surface on Android: when Chrome's tab-overview UI blocks the webview overlay, automatically press the Android Back button (up to 4 retries) to restore the active tab before measuring the viewport
    • Add hybrid status bar blockout: on hybrid apps the statusbar was not blocked out which could result in flaky tests regarding battery and reception

    Committers: 1

@wdio/visual-service@9.1.6

24 Feb 19:25
2c343cc

Choose a tag to compare

Patch Changes

  • 0a19d78: Fix clearRuntimeFolder clearing the actual and diff folders after each spec/feature execution instead of once before all workers start. This caused only the last spec's visual data to be present in the output when running multiple specs.

    Committers: 1

  • ed0bea6: Fix EISDIR error when using resolveSnapshotPath with the visual service. The service now uses dirname() of the resolved path as the baseline folder, preventing it from creating a directory at a path that expect-webdriverio's snapshot service expects to be a file. Fixes #984.

    Committers: 1

  • cbf1d22: Fix incomplete wdio-ics:options type augmentation on WebdriverIO.Capabilities. The global type declaration now uses the WdioIcsOptions interface directly, ensuring all supported properties (logName, name) are available to TypeScript users in both standalone and multiremote configurations. Fixes #732.

    Committers: 1

  • Updated dependencies [0a19d78]

  • Updated dependencies [ce74703]

    • @wdio/image-comparison-core@1.1.4

@wdio/visual-service@9.1.5

24 Feb 17:11
b076e37

Choose a tag to compare

Patch Changes

  • 6ed0469: ## Fix: support appium:options nested capability format and avd fallback (#1118)

    Appium caps need to be prefixed with appium:, but this can feel redundant when you have a lot of caps. So you can also put them inside the appium:options-object. This was not supported by the visual module and was reported in #1118. It is now supported.

    The following capabilities are now correctly read from both appium:-prefixed top-level format and the nested appium:options format:

    • deviceName
    • nativeWebScreenshot
    • avd (new, see below)

    Second issue that is fixed is that for Android the deviceName could be left away and the avd could be provided. This is now also supported where deviceName takes priority over avd if both are provided.

    Committers: 1

@wdio/image-comparison-core@1.1.4

24 Feb 19:25
2c343cc

Choose a tag to compare

Patch Changes

  • 0a19d78: Fix clearRuntimeFolder clearing the actual and diff folders after each spec/feature execution instead of once before all workers start. This caused only the last spec's visual data to be present in the output when running multiple specs.

    Committers: 1

  • ce74703: Stop creating empty diff folders when no visual differences exist. The diff directory is now only created on disk when a diff image is actually saved, instead of being eagerly created during path preparation. Fixes #879.

    Committers: 1

@wdio/visual-service@9.1.4

10 Feb 07:26
0296efc

Choose a tag to compare

Patch Changes

  • a3bc7a4: ## #1115 Respect alwaysSaveActualImage: false for checkScreen methods

    When using visual matchers like toMatchScreenSnapshot('tag', 0.9) with alwaysSaveActualImage: false, the actual image was still being saved even when the comparison passed within the threshold.

    The root cause was that the matcher's expected threshold was not being passed to the core comparison logic. The core used saveAboveTolerance (defaulting to 0) to decide whether to save images, while the matcher used the user-provided threshold to determine pass/fail - these were disconnected.

    This fix ensures:

    • When alwaysSaveActualImage: false and saveAboveTolerance is not explicitly set, actual images are never saved (respecting the literal meaning of the option)
    • When saveAboveTolerance is explicitly set (like matchers do internally), actual images are saved only when the mismatch exceeds that threshold

    Committers: 1

  • a3bc7a4: ## Fix: save* methods now always save files regardless of alwaysSaveActualImage setting

    Previously, when alwaysSaveActualImage: false was set in the configuration, save* methods (saveScreen, saveElement, saveFullPageScreen, saveAppScreen, saveAppElement) were not saving files to disk, causing test failures.

    The alwaysSaveActualImage option is intended to control whether actual images are saved during check* methods (comparison operations), not save* methods. Since save* methods are explicitly designed to save screenshots, they should always save files regardless of this setting.

    This fix ensures:

    • save* methods always save files to disk, even when alwaysSaveActualImage: false is set in the config
    • alwaysSaveActualImage: false continues to work correctly for check* methods (as intended for issue #1115)
    • The behavior is now consistent: save* = always save, check* = respect alwaysSaveActualImage setting

    Implementation details:

    • The visual service overrides alwaysSaveActualImage: true when calling save* methods directly from the browser API
    • save* methods respect whatever alwaysSaveActualImage value is passed to them (no special logic needed)
    • check* methods pass through the config value (which may be false), so save* methods respect it when called internally
    • This clean separation ensures save* methods work correctly when called directly while still respecting alwaysSaveActualImage for check* methods

    Committers: 1

  • Updated dependencies [a3bc7a4]

  • Updated dependencies [a3bc7a4]

    • @wdio/image-comparison-core@1.1.3

@wdio/image-comparison-core@1.1.3

10 Feb 07:26
0296efc

Choose a tag to compare

Patch Changes

  • a3bc7a4: ## #1115 Respect alwaysSaveActualImage: false for checkScreen methods

    When using visual matchers like toMatchScreenSnapshot('tag', 0.9) with alwaysSaveActualImage: false, the actual image was still being saved even when the comparison passed within the threshold.

    The root cause was that the matcher's expected threshold was not being passed to the core comparison logic. The core used saveAboveTolerance (defaulting to 0) to decide whether to save images, while the matcher used the user-provided threshold to determine pass/fail - these were disconnected.

    This fix ensures:

    • When alwaysSaveActualImage: false and saveAboveTolerance is not explicitly set, actual images are never saved (respecting the literal meaning of the option)
    • When saveAboveTolerance is explicitly set (like matchers do internally), actual images are saved only when the mismatch exceeds that threshold

    Committers: 1

  • a3bc7a4: ## Fix: save* methods now always save files regardless of alwaysSaveActualImage setting

    Previously, when alwaysSaveActualImage: false was set in the configuration, save* methods (saveScreen, saveElement, saveFullPageScreen, saveAppScreen, saveAppElement) were not saving files to disk, causing test failures.

    The alwaysSaveActualImage option is intended to control whether actual images are saved during check* methods (comparison operations), not save* methods. Since save* methods are explicitly designed to save screenshots, they should always save files regardless of this setting.

    This fix ensures:

    • save* methods always save files to disk, even when alwaysSaveActualImage: false is set in the config
    • alwaysSaveActualImage: false continues to work correctly for check* methods (as intended for issue #1115)
    • The behavior is now consistent: save* = always save, check* = respect alwaysSaveActualImage setting

    Implementation details:

    • The visual service overrides alwaysSaveActualImage: true when calling save* methods directly from the browser API
    • save* methods respect whatever alwaysSaveActualImage value is passed to them (no special logic needed)
    • check* methods pass through the config value (which may be false), so save* methods respect it when called internally
    • This clean separation ensures save* methods work correctly when called directly while still respecting alwaysSaveActualImage for check* methods

    Committers: 1

@wdio/visual-service@9.1.3

31 Jan 06:30
77a6621

Choose a tag to compare

Patch Changes

  • 2a518ff: # 🐛 Bugfixes

    #1111 Pass matcher threshold to core as saveAboveTolerance

    When using visual matchers like toMatchScreenSnapshot('tag', 0.9) with alwaysSaveActualImage: false, the actual image was still being saved even when the comparison passed within the threshold.

    The root cause was that the matcher's expected threshold was not being passed to the core comparison logic. The core used saveAboveTolerance (defaulting to 0) to decide whether to save images, while the matcher used the user-provided threshold to determine pass/fail - these were disconnected.

    This fix ensures the matcher passes the expected threshold to the core as saveAboveTolerance, so images are only saved when the mismatch actually exceeds the user's acceptable threshold.

    Committers: 1

@wdio/visual-service@9.1.2

24 Jan 07:03
ad25ea6

Choose a tag to compare

Patch Changes

  • 0a2b6d0: ## #1111 Respect saveAboveTolerance when deciding to save actual images when alwaysSaveActualImage is false.

    When alwaysSaveActualImage is false, the actual image is no longer written to disk if the mismatch is below the configured tolerance, avoiding extra actuals when the comparison still passes.

    Committers: 1

  • Updated dependencies [0a2b6d0]

    • @wdio/image-comparison-core@1.1.2

@wdio/image-comparison-core@1.1.2

24 Jan 07:03
ad25ea6

Choose a tag to compare

Patch Changes

  • 0a2b6d0: ## #1111 Respect saveAboveTolerance when deciding to save actual images when alwaysSaveActualImage is false.

    When alwaysSaveActualImage is false, the actual image is no longer written to disk if the mismatch is below the configured tolerance, avoiding extra actuals when the comparison still passes.

    Committers: 1