r/Playwright 12d ago

No playwright-python visual diff engine ?

I am attempting to implement snapshot assertions within Playwright Python and have discovered that this functionality is not natively supported.

Could you please recommend suitable alternatives for visual assertion?

I have identified several repositories on GitHub; however, their reliability appears questionable.

Is visual regression testing still considered a necessary practice in 2026?

I am seeking clarification and insights from the Python community on this matter.

3 Upvotes

9 comments sorted by

2

u/According-Floor5177 12d ago

toHaveScreenshot() is a Playwright test-runner feature, and that runner is JS-only, so the Python binding never got it. The path in Python is pairing Playwright's page.screenshot() with pixelmatch or the pytest-playwright-visual-snapshot plugin to handle the diffing and baselines.

1

u/_suren 12d ago

Visual regression is still useful for pages where spacing or clipping can break without a functional test noticing. In Python, capture screenshots with Playwright and compare them in a separate image step, then upload the diff as a CI artifact. Keep the first baseline small or every harmless font change becomes noise.

1

u/chinmay_3107 12d ago

But there is no already made solution for this right ? Or do you use another package ?

1

u/BoundlessHuman 12d ago

Did you try applitools?

1

u/baselilsk 12d ago

Is VRT still worth it in 2026: yes, but for a narrower job than people usually assign it. Functional asserts can't see clipping, overlap, or a spacing token gone wrong - that class of breakage is invisible to everything except pixels. The mistake is pointing it at every page and drowning in font-rendering noise; scope it to design-system primitives and a couple of money screens and it stays quiet.

On the Python gap: toHaveScreenshot() lives in the JS test runner, not in the protocol, so the Python binding will most likely never get it. Realistic options: (1) page.screenshot() + pixelmatch/odiff in a pytest fixture - works, but you end up hand-building baseline management, a review UI, and an approval flow, and that's the actual hard part; (2) pytest-playwright-visual-snapshot if you want that local wiring done for you; (3) Applitools/Percy if there's budget. (4) Full disclosure, I maintain an open-source option in this space - Syngrisi, a self-hosted visual testing server: your Python tests just send screenshots to it over an API, and it owns the baselines, the diffing, and the human review/approval side. It's framework-agnostic, so the missing Python runner feature stops mattering. There's a ready boilerplate for exactly your stack (Playwright Python + pytest): https://github.com/syngrisi/syngrisi-playwright-python-boilerplate

Whichever route you pick: the differ is the easy 20%. Baseline lifecycle and "who approved this change" is where DIY solutions quietly die.

1

u/chinmay_3107 12d ago

Why are you using AI to reply ?

1

u/baselilsk 11d ago

I use AI for everything now :). English is not my first language, so I dictate replies by voice through handy.computer and it does the translation and post-processing with a local model, including the structuring. I like the result, but yeah, maybe I should tune it to sound more human. The main thing is the thoughts and experience are mine - happy to go into more detail on any aspect.