Conversation
sgiehl
commented
Jul 5, 2026
sgiehl
left a comment
Member
Author
There was a problem hiding this comment.
incorrectly updates screenshots
sgiehl
force-pushed
the
dev-17333
branch
2 times, most recently
from
July 6, 2026 05:56
e9573c5 to
e23455a
Compare
sgiehl
force-pushed
the
dev-20341
branch
2 times, most recently
from
July 6, 2026 18:22
3dd1874 to
81ddc6b
Compare
sgiehl
force-pushed
the
dev-17333
branch
3 times, most recently
from
July 8, 2026 08:22
accbb95 to
cead076
Compare
sgiehl
force-pushed
the
dev-17333
branch
4 times, most recently
from
July 16, 2026 09:21
431b97a to
aac7203
Compare
This was referenced Jul 21, 2026
The committed expected was a clipped capture from the earlier bulk rebase re-sync, missing the '<- Back to Users' link at the top. The current CI render (consistent across runs) includes the back-link and full heading; re-synced to it. Addresses the reopened review comment about this screenshot looking off.
…icky header) Advance the gitlink to the pushed dev-20341 commit that fixes the ReportsByDimensionAddition ecommerce screenshot capture (position:sticky DataTable header was floating mid-table under Puppeteer 24).
Advance the gitlink to the pushed dev-20341 commit that moves the mouse off the alert-condition dropdown before capturing alert_condition_reloaded_site1/site2, so no option keeps a stray :hover highlight under Puppeteer 24 / Chrome 149.
…cted screenshots)
The permissions page renders several password-confirmation modals that all reuse the #currentUserPassword id, so page.type by that id could hit the wrong (hidden) field or append to a pre-filled one, sending an incorrect password (400 on CI). Target the visible field in the open modal and set its value directly.
…lossary - Comparison large-range widget: wait for the evolution graph (.piwik-graph) before capturing, matching the sibling compare-period test; it was captured blank otherwise. - Widgetized glossary: wait for network idle (entries load asynchronously) instead of a fixed 200ms timeout.
The earlier attempt used an input[type=password]:visible selector that never matched and timed out (cascading into later tests). Revert to the proven .confirm-password-modal.open #currentUserPassword selector used by the sibling single-site test, and clear the field first so page.type does not append to a pre-filled (autofilled) value and send a wrong password (the 400 seen on CI).
The unconditional waitForSelector on the password modal timed out (30s) when the modal did not appear and cascaded failures into the following access-change tests. Restore the conditional handling (fill the modal only when it is shown) so a missing modal no longer breaks later tests. The underlying CI-only failure of this one test remains under investigation.
Rendering drift only (identical content) from the new base's headless Chrome.
…am-add - TagManager (submodule bump): comparisonThreshold on publish_with_content for its intermittent ~0.3% whole-modal variance. - SitesManager add-recommended-params: wait for the added parameters to render before capturing so the block height settles.
Root cause of the cascading UsersManager permission failures on CI: several confirm-password modals share the #currentUserPassword id and the field retains a value, so page.type appended and submitted a wrong password. The first affected test (setting sites to Admin) therefore never applied the access, and every later test that filters or depends on that access failed in turn. Clear the field before typing at each confirm-password-modal fill.
The set-access (all-sites, single-site, change-access, bulk-admin) and set-superuser confirmations submitted a wrong/empty password on CI - #currentUserPassword is duplicated across the several confirm-password modals and page.type of the special-char superuser password (and appending to a retained value) was unreliable. Route them through a helper that sets the value on the visible open-modal field and dispatches input/change so the Vue model updates, then confirms.
bulk_set_access was captured before the bulk change applied and the list refreshed (rows still selected, roles not yet updated); wait for the list to settle (selection cleared) before capturing. delete_bulk_confirm intermittently lost the password field's focus state by capture time under the new headless Chrome; focus it right before the screenshot.
…firm screenshots Benign new-headless-Chrome rendering drift (identical content), reviewed against the previous expected.
…creenshots api_listing grew with new API methods from the rebase; delete_bulk_confirm now captures the focused password field (rendering drift only); permissions_next is a clean render (identical content, back-link present) - all reviewed against the previous expected.
permissions_next and permissions_single_site_access flaked because the 'give access to all websites' Materialize select reflows to a slightly taller height after render, shifting the site table below it. Wait for that header's height to stop changing before capturing so the table position is stable.
Config-file listing content is unchanged (section list + values identical); the diff is new-headless-Chrome font rendering across the long monospace page.
Rendering/spacing drift only (identical content), reviewed against the previous expected.
…shold The settle wait reduces but does not fully eliminate the run-to-run header-height variance on permissions_next/permissions_single_site_access, so allow a small comparison threshold (matching the sibling user-table shots) instead of flaking.
sgiehl
enabled auto-merge (squash)
July 24, 2026 08:05
mneudert
approved these changes
Jul 24, 2026
tzi
added a commit
that referenced
this pull request
Jul 27, 2026
…-dev merge [DEV-20451] The 6.x-dev merge resolved four conflicting expected screenshots to upstream's Node-24 renders (#24677 re-rendered nearly every screenshot in the repo), which dropped this branch's content from them. These three are restored from the CI artifacts of build 30253818158: - configfile: re-adds the record_accurate_page_view_time [Tracker] row - Installation_db_existing: re-adds matomo_log_page_view_time to the table list - Live action tooltip: time on page 6 min 36s -> 12 min 0s (accurate metric) UsersManager_permissions_next.png needed no change; upstream's render already matches, and its UI job passed.
10 tasks
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Modernize the UI screenshot-testing npm stack → Node 24
Brings Matomo's UI screenshot tests (
tests/lib/screenshot-testing/, a separate npm package) onto a modern, Node 24 toolchain — the last piece still pinned to Node 16. The blocker was puppeteer^8.0.0(Feb 2021), whose bundled Chromium can't be provisioned on modern Node.Targets
6.x-dev. The Vue→Vite/Node 24 counterpart (#24668) has merged.Note
Built up in sequential, individually-verified steps; the harness is verified locally in ddev (Node 24) and CI is driven green. Moving the UI jobs onto the new headless Chrome shifted a large number of expected screenshots — these have been reviewed old-vs-new and re-synced from CI artifacts (see below). New headless Chrome installs track the latest stable, so a rebase occasionally needs a further screenshot re-sync.
Plan / progress
puppeteer ^24,engines.node ">=24", lockfile regenerated to v3createBrowserContext,page._client()(method),waitForTimeoutshim (dropwaitForTimeout/waitForXPath/$xfrom the proxy),JSHandle.evaluate()for console argswaitForNetworkIdlemade tolerant of requests Chrome leaves stalled under request interceptionOptOutJS(CDP),Overlay(popup)request/request-promisewith nativefetch(Node 24 built-in); droppedrequest,request-promise,url-parse, unusedchai-image-assertmocha 8 → 11,fs-extra 7 → 11, bumped@testomatio/reporter+mocha-multi-reporters;overridestrimmed toaxios. (chai stays on 4 — chai 5/6 are ESM-only; deferred as tech debt.).ddev/initial-config/config.js— system Chromium on all arches)matomo-tests.yml,run-single-ui-test-suite.yml; JS job on Node 24; submodule plugins added to the UI matrix)Chrome stabilization (surfaced by the new headless Chrome)
Moving to modern headless Chrome exposed several deterministic behaviour changes, all fixed:
waitForNetworkIdletolerates a navigation destroying the execution context mid-evaluate (fixed both OneClick real-update tests)scrollIntoViewIfNeededbounded so a stuckIntersectionObservercan't hang clicks/screenshots to the mocha timeoutwaitForXPath→xpath/query-handler prefix; ManageGoals forced full reload (hash-onlygotono longer reloads under the new Chrome, so tests inherited the prior form/notification state)input/change(reliable for the special-char superuser password across the several duplicated#currentUserPasswordmodals) instead ofpage.type; bulk-remove waits for the list reload before selecting;bulk_set_accesswaits for the change to apply before capturing;delete_bulk_confirmfocuses the field before capture; the "give access to all websites" Materialize-select header height is settled before capturing (permissions_next/permissions_single_site_access)Review of the shifted screenshots
Every failing screenshot was compared old-vs-new before syncing. Several genuinely-wrong renders were caught and fixed at the test level rather than synced:
loaded_ecommerce— sticky DataTable header floating mid-capture on a tall element; viewport grown to fit the report:hoveron an option (opened viaevaluate, cursor left resting); mouse moved off before capturebulk_set_access— captured before the bulk change applied and the list refreshed; settle-wait addedapi_listingre-synced after each rebase (content unchanged / new API methods; new-Chrome font rendering)Genuinely-wrong CI renders (blank Comparison widget, OneClick CSRF-error screen) were not synced.
Notes / follow-ups
page.waitForTimeout(ms)shim keeps their specs working without edits. Submodules with regenerated screenshots or Chrome-specific spec fixes havedev-20341branches with draft PRs againstprepare6x(merge together with this PR):publish_with_content: dynamic "last updated" timestamp@testomatio/reporter1 → 2.AI usage checklist