Proposal: a noise-tolerant compare mode with pixelmatch 8's windowSize
I maintainer di solito rispondono entro 1 giorno
@plum117 ci sta già lavorando.
Dal 9/10/2026.
Valutazione
Questa issue non è ancora stata valutata.
Descrizione
@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.
- Lingua principale
- TypeScript
- Stelle
- 156
- Fork
- 62
- Merge medio
- 2h 2m
- PR unite (30g)
- 111
Preparare l'ambiente
- Nessun Dockerfile né file Docker Compose
- Nessun modello di pull request
- Leggi la guida per i contributori
Come iniziare
- Leggi tutta la issue e poi la guida ai contributi del progetto.
- Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
- Fai un fork del repository e lavora su un branch.
- Apri una pull request che faccia riferimento al numero della issue.
Altre issue di webdriverio/visual-testing
-
bug: the visual service fails on Android Chrome through Appium 3 in the default WebDriver BiDi session (workaround: `wdio:enforceWebDriverClassic`)Forse già presa @plum117 l’ha presa 3 giorni fa. Aperta
Difficoltà 4/5 3-5 giorni Idoneità per principianti 48/100
webdriverio/visual-testing#1232 · 2 commenti · 1 assegnatario ·
I maintainer di solito rispondono entro 1 giorno
-
feat: support element screenshots of elements in a frame in WebDriver BiDi sessions (v9 `switchFrame()`, v10 `context.frame()`)Forse già presa @plum117 l’ha presa 3 giorni fa. Aperta
Difficoltà 5/5 Più di una settimana Idoneità per principianti 50/100
webdriverio/visual-testing#1228 · 1 assegnatario ·
I maintainer di solito rispondono entro 1 giorno
-
Wait for Screenshot to MatchForse già presa @plum117 l’ha presa 2 giorni fa. Aperta
Difficoltà 4/5 3-5 giorni Idoneità per principianti 45/100
webdriverio/visual-testing#690 · 1 assegnatario ·
I maintainer di solito rispondono entro 1 giorno
-
Using checkFullPageScreen method, capturing images with duplicate viewport and is not scrolling to the bottom of the pageForse già presa @plum117 l’ha presa 2 giorni fa. Apertahelp wanted
Difficoltà 4/5 3-5 giorni Idoneità per principianti 35/100
webdriverio/visual-testing#125 · 2 commenti · 1 assegnatario ·
I maintainer di solito rispondono entro 1 giorno
Tutte le issue di webdriverio/visual-testing
Issue simili
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 70/100
NaturalIntelligence/fast-xml-parser#890 · 1 commento ·
I maintainer di solito rispondono entro 3 giorni
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 62/100
zsviczian/obsidian-excalidraw-plugin#3000 ·
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 68/100
pnpm/get.pnpm.io#68 ·
-
[BUG] Cloudflare KV binding 模式下 kvDriver.list() 沿用 EdgeOne 语义,字段名不匹配导致 key 格式下初始化 500 并耗尽 list 配额Forse già presa @wumingzhinu l’ha presa oggi. Apertabug
Difficoltà 2/5 1-3 ore Idoneità per principianti 64/100
OpenListTeam/OpenList-Worker#125 ·
I maintainer di solito rispondono entro 2 giorni
-
Android (vision-camera-location): HybridLocationManager never quits its HandlerThread on disposeAperta
Difficoltà 2/5 1-3 ore Idoneità per principianti 74/100
margelo/react-native-vision-camera#4217 ·
I maintainer di solito rispondono entro 4 giorni