-
Notifications
You must be signed in to change notification settings - Fork 3.4k
perf: improve performance of pinning snapshots during hover / pin #32951
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: develop
Are you sure you want to change the base?
Conversation
…tions (used for snapshots)
cypress
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Project |
cypress
|
| Branch Review |
snapshot-reduce-get-computed-style
|
| Run status |
|
| Run duration | 18m 45s |
| Commit |
|
| Committer | Jennifer Shehane |
| View all properties for this run ↗︎ | |
| Test results | |
|---|---|
|
|
2
|
|
|
10
|
|
|
1098
|
|
|
4
|
|
|
26595
|
| View all changes introduced in this branch ↗︎ | |
Warning
Partial Report: The results for the Application Quality reports may be incomplete.
UI Coverage
45.61%
|
|
|---|---|
|
|
187
|
|
|
161
|
Accessibility
98%
|
|
|---|---|
|
|
4 critical
8 serious
2 moderate
2 minor
|
|
|
101
|
Tests for review
src/runner/aut-iframe.cy.tsx • 2 failed tests • app-ct
issues/28527.cy.ts • 1 flaky test • 5x-driver-electron
| Test | Artifacts | |
|---|---|---|
| issue 28527 > fails and then retries and verifies about:blank is not displayed |
Test Replay
Screenshots
|
|
commands/querying/querying.cy.ts • 1 flaky test • 5x-driver-chrome
| Test | Artifacts | |
|---|---|---|
| ... > intercept aliases > returns null if no xhr is found |
Test Replay
|
|
issues/28527.cy.ts • 1 flaky test • 5x-driver-chrome
| Test | Artifacts | |
|---|---|---|
| issue 28527 > fails and then retries and verifies about:blank is not displayed |
Test Replay
Screenshots
|
|
commands/net_stubbing.cy.ts • 1 flaky test • 5x-driver-firefox
| Test | Artifacts | |||||||
|---|---|---|---|---|---|---|---|---|
| ... > stops waiting when an xhr request is canceled |
| |||||||
| Test | Artifacts | |
|---|---|---|
| src/cy/commands/files > #readFile > retries to read when ENOENT |
The first 5 flaky specs are shown, see all 10 specs in Cypress Cloud. | |
| @@ -0,0 +1,137 @@ | |||
| import { AutIframe } from './aut-iframe' | |||
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I don't think these are in an optimal form for unit tests, but it doesn't seem we have vitest or any other convention here but Cypress tests. I'd like to have a test for this, so welcome to if there's a better way to do this.
| @@ -0,0 +1,58 @@ | |||
| import { getElementDimensions } from './dimensions' | |||
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Another 'unit' test
| const style = `border: none !important; margin: 0 !important; padding: 0 !important; position: absolute; top: ${top}px; left: ${left}px; width: ${width}px; height: ${height}px; background-color: black; z-index: 2147483647;` | ||
|
|
||
| const div = document.createElement('div') | ||
|
|
||
| div.className = '__cypress-blackout' | ||
| div.style.cssText = style | ||
| $body.append(div) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Probably not helpful much, but looked into this function a bit for the blackout of screenshots.
|
|
||
| const getElementDimensions = ($el: JQuery<HTMLElement>) => { | ||
| const el: HTMLElement = $el.get(0) | ||
|
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
We should consolidate these but I didn't want to get distracted with this.
Additional details
Improves performance of hovering or pinning a command to highlight elements within a snapshot. The improvements would be most evident when the command queries A LOT of elements. There are a few strategies employed here:
getComputedStylesSteps to test
How has the user experience changed?
Before
When hovering/clicking to pin a snapshot that targets 3,000 elements completely locks up the UI for 15+ seconds. You cannot hover or pin any other snapshots during this time - or see any highlights.
Screen.Recording.2025-11-14.at.12.42.00.PM.mov
After
When hovering/clicking to pin a snapshot that targets 3,000 element - highlights and pinning shows up within 2 seconds (although ALL of the elements are not done highlighting). You can see when all of the elements finish highlighting in my video where the console.log logs when it's complete.
Screen.Recording.2025-11-14.at.12.38.48.PM.mov
You can click and hover around fairly quickly (feels a little laggy) since the previous batch of highlighting now cancels when you go to highlight other snapshots.
Screen.Recording.2025-11-14.at.12.48.46.PM.mov
PR Tasks
cypress-documentation?type definitions?Note
Speeds up snapshot element highlighting by batching DOM/offset work, caching computed styles, and canceling in-flight operations, with supporting tests and minor driver optimizations.
setOffsetviarequestAnimationFrame; add cancelation with an operation id; reduce redundant_contents()/DOM queries; optimizeremoveHighlights._addElementBoxModelLayersnow accepts precomputed dimensions, avoids extragetComputedStyle, sets transform/zIndex from dimensions, stores positions in data attrs, and defers offset setting.packages/app/src/runner/dimensions.ts): Cache a singlegetComputedStylecall; exposedisplay,transform,zIndex, andoffsetWidth/offsetHeight; optimizesetOffset.aut-iframe.cy.tsxanddimensions.cy.tsxto assert minimalgetComputedStylecalls and layering behavior.packages/driver/src/dom/dimensions.ts): Use cachedgetComputedStyleto derive padding/border/margin.packages/driver/src/dom/blackout.ts): Create overlays via native DOM and consolidated style string.Written by Cursor Bugbot for commit 6690c4b. This will update automatically on new commits. Configure here.