Skip to content

Conversation

@jennifer-shehane
Copy link
Member

@jennifer-shehane jennifer-shehane commented Nov 13, 2025

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:

  • Reducing the calls to getComputedStyles
  • Batching the calls to get offset for element we want to highlight - so the first 50 highlights WILL SHOW UP FIRST, and the other highlights will asynchronously come in. So, when the command shows as 'pinned', it is possible that all of the elements are not highlighted at that point.
  • Cancel the asynchronous calls to highlight the el when another call is made to highlight elements on another snapshot.

Steps to test

  • Open a test that targets 3,000 items that have distinct positions in the DOM

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


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.

  • Runner (app):
    • Highlighting performance: Batch-create/append highlight containers and batch setOffset via requestAnimationFrame; add cancelation with an operation id; reduce redundant _contents()/DOM queries; optimize removeHighlights.
    • Box model layers: _addElementBoxModelLayers now accepts precomputed dimensions, avoids extra getComputedStyle, sets transform/zIndex from dimensions, stores positions in data attrs, and defers offset setting.
    • Dimensions util (packages/app/src/runner/dimensions.ts): Cache a single getComputedStyle call; expose display, transform, zIndex, and offsetWidth/offsetHeight; optimize setOffset.
    • Tests: Add aut-iframe.cy.tsx and dimensions.cy.tsx to assert minimal getComputedStyle calls and layering behavior.
  • Driver:
    • Dimensions (packages/driver/src/dom/dimensions.ts): Use cached getComputedStyle to derive padding/border/margin.
    • Blackout (packages/driver/src/dom/blackout.ts): Create overlays via native DOM and consolidated style string.
  • Changelog: Note performance improvements when viewing command snapshots.

Written by Cursor Bugbot for commit 6690c4b. This will update automatically on new commits. Configure here.

@jennifer-shehane jennifer-shehane self-assigned this Nov 13, 2025
@jennifer-shehane jennifer-shehane changed the title perf: reduce calls to getComputedStyles for element dimension calculations perf: reduce calls to getComputedStyles for element dimension calculations (used for snapshots) Nov 13, 2025
@cypress
Copy link

cypress bot commented Nov 13, 2025

cypress    Run #67349

Run Properties:  status check failed Failed #67349  •  git commit 6690c4bef8: fix true/false race condition of highlighting cancellation
Project cypress
Branch Review snapshot-reduce-get-computed-style
Run status status check failed Failed #67349
Run duration 18m 45s
Commit git commit 6690c4bef8: fix true/false race condition of highlighting cancellation
Committer Jennifer Shehane
View all properties for this run ↗︎

Test results
Tests that failed  Failures 2
Tests that were flaky  Flaky 10
Tests that did not run due to a developer annotating a test with .skip  Pending 1098
Tests that did not run due to a failure in a mocha hook  Skipped 4
Tests that passed  Passing 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%
  Untested elements 187  
  Tested elements 161  
Accessibility  98%
  Failed rules  4 critical   8 serious   2 moderate   2 minor
  Failed elements 101  

Tests for review

Failed  src/runner/aut-iframe.cy.tsx • 2 failed tests • app-ct

View Output

Test Artifacts
AutIframe._addElementBoxModelLayers > should not call getComputedStyle when dimensions are provided Test Replay
AutIframe._addElementBoxModelLayers > should call getComputedStyle only once when dimensions are not provided Test Replay
Flakiness  issues/28527.cy.ts • 1 flaky test • 5x-driver-electron

View Output

Test Artifacts
issue 28527 > fails and then retries and verifies about:blank is not displayed Test Replay Screenshots
Flakiness  commands/querying/querying.cy.ts • 1 flaky test • 5x-driver-chrome

View Output

Test Artifacts
... > intercept aliases > returns null if no xhr is found Test Replay
Flakiness  issues/28527.cy.ts • 1 flaky test • 5x-driver-chrome

View Output

Test Artifacts
issue 28527 > fails and then retries and verifies about:blank is not displayed Test Replay Screenshots
Flakiness  commands/net_stubbing.cy.ts • 1 flaky test • 5x-driver-firefox

View Output

Test Artifacts
... > stops waiting when an xhr request is canceled
    </td>
  </tr></table>
Flakiness  commands/files.cy.js • 1 flaky test • 5x-driver-firefox

View Output

Test Artifacts
src/cy/commands/files > #readFile > retries to read when ENOENT
    </td>
  </tr></table>

The first 5 flaky specs are shown, see all 10 specs in Cypress Cloud.

@jennifer-shehane jennifer-shehane changed the title perf: reduce calls to getComputedStyles for element dimension calculations (used for snapshots) perf: improve performance of pinning snapshots during hover / pin Nov 14, 2025
@@ -0,0 +1,137 @@
import { AutIframe } from './aut-iframe'
Copy link
Member Author

@jennifer-shehane jennifer-shehane Nov 14, 2025

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'
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Another 'unit' test

Comment on lines +11 to +17
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)
Copy link
Member Author

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)

Copy link
Member Author

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.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants