Proposal: a noise-tolerant compare mode with pixelmatch 8's windowSize
メンテナーはふだん 1 日以内に返信
@plum117 がすでに取り組んでいます。
2026年10月9日 から。
評価
この issue はまだ評価されていません。
説明
@wswebcreation, this is a proposal for v11, and I would like your approval (or your changes) before any code is written.
Problem
Today a check counts all different pixels and compares the percentage with a tolerance. This mixes 2 different things:
- Noise: anti-aliasing, GPU dithering or font rendering change many single pixels all over the screenshot. The total can be larger than a small tolerance, so the check fails, and users increase the tolerance or use
ignoreAntialiasing. - A real change in a small area (an icon, a badge, a few letters) changes few pixels in total, so a tolerance can hide it.
What pixelmatch 8 gives us
Since #1289 we use pixelmatch 8. It has a new option: with windowSize: N, pixelmatch returns the highest number of different pixels in any N×N square instead of the total (README). Scattered noise never fills one small square; a real change usually does.
Measured with pixelmatch 8.0.0 on a 1366×768 image, threshold: 0.1:
| Change | Total (what we report today) | Max in one 16×16 window |
|---|---|---|
| A: 3 000 scattered single-pixel changes (like noise) | 3 000 px = 0.286 % | 6 |
| B: one missing 16×16 icon | 256 px = 0.024 % | 256 |
With a tolerance of 0.05 %, today A fails and B passes. With windows, A is clearly noise and B is clearly a change.
Proposal
A new, optional compare option. Nothing changes when it is not set.
await expect(browser).toMatchScreenSnapshot('home', {
windowSize: 16, // compare in 16×16 windows
})
When windowSize is set:
- The check returns the worst window as a percentage of the window area (6 / 256 = 2.3 % for A, 256 / 256 = 100 % for B). The existing tolerance semantics and matchers stay the same: "fail above X %", but X now means "of one window".
- One pixelmatch pass is enough: pixelmatch still writes the diff image, and we already read the different pixels from it for the diff bounding boxes.
- Ignore regions keep working: since #1301 they are a pixelmatch
ignoreMask, so masked pixels are not in any window. - The diff image does not change (all different pixels are still marked).
- With
returnAllCompareData, the result also has the total, so users can see both numbers.
Questions for you
- Do you agree with this feature for v11?
- Name and place:
windowSizeas a compare option (method and service level), like the other compare options? - Result: the worst window as a percentage of the window area (proposal above), or the pixel count (with a separate option for the limit)?
- Defaults: off by default (my proposal), or a recommended value in the docs (pixelmatch's example uses 16)?
- Reporter: show "worst window" next to the total in the visual reporter now, or later?
Scope
- In: the option in
@wdio/image-comparison-coreand@wdio/visual-service, unit tests, a local e2e check with known images, docs (compare options on webdriver.io), the v11 guide, a minor changeset. - Out (later): the reporter display, if you prefer to keep it separate.
- 主要言語
- TypeScript
- スター
- 156
- フォーク
- 62
- 平均マージ
- 2時間 2分
- マージ済み PR(30日)
- 111
環境構築
- Dockerfile・Docker Compose ファイルなし
- プルリクエストのテンプレートなし
- コントリビューションガイドを読む
はじめの一歩
- issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
- 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
- リポジトリをフォークし、ブランチを切って変更します。
- issue 番号を参照したプルリクエストを送ります。
webdriverio/visual-testing のほかの issue
-
bug: the visual service fails on Android Chrome through Appium 3 in the default WebDriver BiDi session (workaround: `wdio:enforceWebDriverClassic`)対応中かも @plum117 が 4 日前に担当しました。 オープン
難易度 4/5 3〜5日 初心者へのやさしさ 48/100
webdriverio/visual-testing#1232 · コメント 2 件 · 担当者 1 名 ·
メンテナーはふだん 1 日以内に返信
-
feat: support element screenshots of elements in a frame in WebDriver BiDi sessions (v9 `switchFrame()`, v10 `context.frame()`)対応中かも @plum117 が 4 日前に担当しました。 オープン
難易度 5/5 1週間以上 初心者へのやさしさ 50/100
webdriverio/visual-testing#1228 · 担当者 1 名 ·
メンテナーはふだん 1 日以内に返信
-
Wait for Screenshot to Match対応中かも @plum117 が 3 日前に担当しました。 オープン
難易度 4/5 3〜5日 初心者へのやさしさ 45/100
webdriverio/visual-testing#690 · 担当者 1 名 ·
メンテナーはふだん 1 日以内に返信
-
Using checkFullPageScreen method, capturing images with duplicate viewport and is not scrolling to the bottom of the page対応中かも @plum117 が 3 日前に担当しました。 オープンhelp wanted
難易度 4/5 3〜5日 初心者へのやさしさ 35/100
webdriverio/visual-testing#125 · コメント 2 件 · 担当者 1 名 ·
メンテナーはふだん 1 日以内に返信
webdriverio/visual-testing の issue をすべて見る
似ている issue
-
難易度 2/5 1〜3時間 初心者へのやさしさ 82/100
メンテナーはふだん 1 日以内に返信
-
high priority
難易度 2/5 1〜3時間 初心者へのやさしさ 62/100
CI-CMG/deep-sea-corals-exb#84 · コメント 1 件 ·
-
Create/import wallet form shows raw "password must be at least 1 characters" instead of the translated message対応中かも @CapThunder19 が今日担当しました。 オープンbug
難易度 2/5 1〜3時間 初心者へのやさしさ 82/100
joinmarket-webui/jam#1538 ·
メンテナーはふだん 1 日以内に返信
-
t0ggles
難易度 2/5 1〜3時間 初心者へのやさしさ 70/100
nolimits4web/swiper#8240 · コメント 1 件 ·
-
難易度 2/5 1〜3時間 初心者へのやさしさ 82/100
メンテナーはふだん 1 日以内に返信