Repository: cypress-io/cypress
Pull request #31481: fix: activate main tab before detecting iframe focus in firefox/bidi implementation of cy.press()
Author: login: cacieprins
Created: 2025-04-10T18:13:23Z | Merged: 2025-04-14T20:13:13Z

<!-- Thanks for contributing! PLEASE...
- Read our contributing guidelines: https://github.com/cypress-io/cypress/blob/develop/CONTRIBUTING.md 
- Read our Code Review Checklist on coding standards and what needs to be done before a PR can be merged: https://github.com/cypress-io/cypress/blob/develop/CONTRIBUTING.md#Code-Review-Checklist
- Mark this PR as "Draft" if it is not ready for review.
- Make sure you set the correct base branch based on what packages you're changing: https://github.com/cypress-io/cypress/blob/develop/CONTRIBUTING.md#branches
-->

- Closes https://github.com/cypress-io/cypress/issues/31466

### Additional details
The webdriver classic window reference does not sync with the webdriver bidi active context automatically; between specs we clear out all of the tabs and create a new one, so webdriver classic needs to be informed of which window/tab needs to be active. The webdriver classic methods in use are in order to determine if the AUT iframe has focus (will receive key press events).

### Steps to test

In run mode, execute any spec prior to executing the `cypress/e2e/commands/actions/press.cy.ts` spec (or any other spec that includes the `cy.press()` command. The `cy.press()` command should not error.

### How has the user experience changed?
<!-- Provide before and after examples of the change.
Screenshots or GIFs are preferred. -->

### PR Tasks
<!-- 
These tasks must be completed before a PR is merged.
If a task does not apply, write [na] instead of checking the box.
DO NOT DELETE the PR checklist.
-->

- [X] Have tests been added/updated?
- [NA] Has a PR for user-facing changes been opened in [`cypress-documentation`](https://github.com/cypress-io/cypress-documentation)? <!-- Link to PR here -->
- [NA] Have API changes been updated in the [`type definitions`](https://github.com/cypress-io/cypress/blob/develop/cli/types/cypress.d.ts)?



Diff:
diff --git a/cli/CHANGELOG.md b/cli/CHANGELOG.md
index 3779ec79155..c36b09f5cb7 100644
--- a/cli/CHANGELOG.md
+++ b/cli/CHANGELOG.md
@@ -3,6 +3,10 @@
 
 _Released 4/22/2025 (PENDING)_
 
+**Bugfixes:**
+
+- The [`cy.press()`](http://on.cypress.io/api/press) command no longer errors when used in specs subsequent to the first spec in run mode. Fixes [#31466](https://github.com/cypress-io/cypress/issues/31466).
+
 **Misc:**
 
 - The UI of the reporter and URL were updated to a darker gray background for better color contrast. Addressed in [#31475](https://github.com/cypress-io/cypress/pull/31475).
diff --git a/packages/server/lib/automation/commands/key_press.ts b/packages/server/lib/automation/commands/key_press.ts
index 5d556a7a743..c54b944499f 100644
--- a/packages/server/lib/automation/commands/key_press.ts
+++ b/packages/server/lib/automation/commands/key_press.ts
@@ -104,6 +104,14 @@ export const BIDI_VALUE: KeyCodeLookup = {
   'Tab': '\uE004',
 }
 
+async function getActiveWindow (client: Client) {
+  try {
+    return await client.getWindowHandle()
+  } catch (e) {
+    return undefined
+  }
+}
+
 export async function bidiKeyPress ({ key }: KeyPressParams, client: Client, autContext: string, idSuffix?: string): Promise<void> {
   const value = BIDI_VALUE[key]
 
@@ -111,17 +119,41 @@ export async function bidiKeyPress ({ key }: KeyPressParams, client: Client, aut
     throw new InvalidKeyError(key)
   }
 
-  const autFrameElement = await client.findElement('css selector', 'iframe.aut-iframe')
-  const activeElement = await client.getActiveElement()
-
-  if (!isEqual(autFrameElement, activeElement)) {
-    await client.scriptEvaluate(
-      {
-        expression: `window.focus()`,
-        target: { context: autContext },
-        awaitPromise: false,
-      },
-    )
+  const activeWindow = await getActiveWindow(client)
+  const { contexts: [{ context: topLevelContext }] } = await client.browsingContextGetTree({})
+
+  // TODO: refactor for Cy15 https://github.com/cypress-io/cypress/issues/31480
+  if (activeWindow !== topLevelContext) {
+    debug('Primary window is not currently active; attempting to activate')
+    try {
+      await client.switchToWindow(topLevelContext)
+    } catch (e) {
+      debug('Error while attempting to activate main browser tab:', e)
+      const err = new Error(`Unable to activate main browser tab: ${e?.message || 'Unknown Error Occurred'}. DEBUG namespace cypress:server:automation:command:keypress for more information.`)
+
+      throw err
+    }
+  }
+
+  try {
+    const autFrameElement = await client.findElement('css selector', 'iframe.aut-iframe')
+    const activeElement = await client.getActiveElement()
+
+    if (!isEqual(autFrameElement, activeElement)) {
+      debug('aut iframe is not currently focused; focusing aut iframe: ', autContext)
+      await client.scriptEvaluate(
+        {
+          expression: `window.focus()`,
+          target: { context: autContext },
+          awaitPromise: false,
+        },
+      )
+    }
+  } catch (e) {
+    debug('Error occurred during aut frame focus detection:', e)
+    const err = new Error(`Unable to focus the AUT iframe: ${e?.message || 'Unknown Error Occurred'}. DEBUG namespace cypress:server:automation:command:keypress for more information.`)
+
+    throw err
   }
 
   try {
@@ -138,6 +170,8 @@ export async function bidiKeyPress ({ key }: KeyPressParams, client: Client, aut
     })
   } catch (e) {
     debug(e)
-    throw e
+    const err = new Error(`Unable to perform key press command for '${key}' key: ${e?.message || 'Unknown Error Occurred'}. DEBUG namespace cypress:server:automation:command:keypress for more information.`)
+
+    throw err
   }
 }
diff --git a/packages/server/lib/browsers/bidi_automation.ts b/packages/server/lib/browsers/bidi_automation.ts
index b9329cefe18..f89395dddaa 100644
--- a/packages/server/lib/browsers/bidi_automation.ts
+++ b/packages/server/lib/browsers/bidi_automation.ts
@@ -288,7 +288,7 @@ export class BidiAutomation {
   public readonly automationMiddleware: AutomationMiddleware = {
     onRequest: async <T extends keyof AutomationCommands> (message: T, data: AutomationCommands[T]['dataType']): Promise<AutomationCommands[T]['returnType']> => {
       debugVerbose('automation command \'%s\' requested with data: %O', message, data)
-
+      debug('BiDi middleware handling msg `%s` for top context %s', message, this.topLevelContextId)
       switch (message) {
         case 'key:press':
           if (this.autContextId) {
diff --git a/packages/server/test/unit/automation/commands/key_press.spec.ts b/packages/server/test/unit/automation/commands/key_press.spec.ts
index a62a4c927d8..8365aab5289 100644
--- a/packages/server/test/unit/automation/commands/key_press.spec.ts
+++ b/packages/server/test/unit/automation/commands/key_press.spec.ts
@@ -1,13 +1,22 @@
 import type Sinon from 'sinon'
+import type { expect as Expect } from 'chai'
 import type { KeyPressSupportedKeys } from '@packages/types'
 import type { SendDebuggerCommand } from '../../../../lib/browsers/cdp_automation'
 import { cdpKeyPress, bidiKeyPress, BIDI_VALUE, CDP_KEYCODE } from '../../../../lib/automation/commands/key_press'
 import { Client as WebdriverClient } from 'webdriver'
 import type { Protocol } from 'devtools-protocol'
-const { expect, sinon } = require('../../../spec_helper')
+const { expect, sinon }: { expect: typeof Expect, sinon: Sinon.SinonSandbox } = require('../../../spec_helper')
+
+type ClientParams<T extends keyof WebdriverClient> = WebdriverClient[T] extends (...args: any[]) => any ?
+  Parameters<WebdriverClient[T]> :
+  never
+
+type ClientReturn<T extends keyof WebdriverClient> = WebdriverClient[T] extends (...args: any[]) => any ?
+  ReturnType<WebdriverClient[T]> :
+  never
 
 describe('key:press automation command', () => {
-  describe('cdp()', () => {
+  describe('cdp', () => {
     let sendFn: Sinon.SinonStub<Parameters<SendDebuggerCommand>, ReturnType<SendDebuggerCommand>>
     const topFrameId = 'abc'
     const autFrameId = 'def'
@@ -178,16 +187,20 @@ describe('key:press automation command', () => {
     const otherElement = {
       'element-6066-11e4-a52e-4f735466cecf': 'uuid-2',
     }
+    const topLevelContext = 'b7173d71-c76c-41ec-beff-25a72f7cae13'
 
     beforeEach(() => {
       // can't create a sinon stubbed instance because webdriver doesn't export the constructor. Because it's known that
       // bidiKeypress only invokes inputPerformActions, and inputPerformActions is properly typed, this is okay.
       // @ts-expect-error
       client = {
-        inputPerformActions: (sinon as Sinon.SinonSandbox).stub<Parameters<WebdriverClient['inputPerformActions']>, ReturnType<WebdriverClient['inputPerformActions']>>(),
-        getActiveElement: (sinon as Sinon.SinonSandbox).stub<Parameters<WebdriverClient['getActiveElement']>, ReturnType<WebdriverClient['getActiveElement']>>(),
-        findElement: (sinon as Sinon.SinonSandbox).stub<Parameters<WebdriverClient['findElement']>, ReturnType<WebdriverClient['findElement']>>(),
-        scriptEvaluate: (sinon as Sinon.SinonSandbox).stub<Parameters<WebdriverClient['scriptEvaluate']>, ReturnType<WebdriverClient['scriptEvaluate']>>(),
+        inputPerformActions: sinon.stub<ClientParams<'inputPerformActions'>, ClientReturn<'inputPerformActions'>>(),
+        getActiveElement: sinon.stub<ClientParams<'getActiveElement'>, ClientReturn<'getActiveElement'>>(),
+        findElement: sinon.stub<ClientParams<'findElement'>, ClientReturn<'findElement'>>(),
+        scriptEvaluate: sinon.stub<ClientParams<'scriptEvaluate'>, ClientReturn<'scriptEvaluate'>>(),
+        getWindowHandle: sinon.stub<ClientParams<'getWindowHandle'>, ClientReturn<'getWindowHandle'>>(),
+        switchToWindow: sinon.stub<ClientParams<'switchToWindow'>, ClientReturn<'switchToWindow'>>().resolves(),
+        browsingContextGetTree: sinon.stub<ClientParams<'browsingContextGetTree'>, ClientReturn<'browsingContextGetTree'>>(),
       }
 
       autContext = 'someContextId'
@@ -195,10 +208,21 @@ describe('key:press automation command', () => {
       key = 'Tab'
 
       client.inputPerformActions.resolves()
+      client.browsingContextGetTree.resolves({
+        contexts: [
+          {
+            context: topLevelContext,
+            children: [],
+            url: 'someUrl',
+            userContext: 'userContext',
+          },
+        ],
+      })
     })
 
     describe('when the aut iframe is not in focus', () => {
       beforeEach(() => {
+        client.getWindowHandle.resolves(topLevelContext)
         client.findElement.withArgs('css selector ', 'iframe.aut-iframe').resolves(iframeElement)
         // @ts-expect-error - webdriver types show this returning a string, but it actually returns an ElementReference, same as findElement
         client.getActiveElement.resolves(otherElement)
@@ -226,7 +250,41 @@ describe('key:press automation command', () => {
       })
     })
 
+    describe('when webdriver classic has no active window', () => {
+      beforeEach(() => {
+        client.getWindowHandle.rejects(new Error())
+      })
+
+      it('activates the top level context window', async () => {
+        await bidiKeyPress({ key }, client as WebdriverClient, autContext, 'idSuffix')
+        expect(client.switchToWindow).to.have.been.calledWith(topLevelContext)
+      })
+    })
+
+    describe('when webdriver classic has the top level context as the active window', () => {
+      beforeEach(() => {
+        client.getWindowHandle.resolves(topLevelContext)
+      })
+
+      it('does not activate the top level context window', async () => {
+        await bidiKeyPress({ key }, client as WebdriverClient, autContext, 'idSuffix')
+        expect(client.switchToWindow).not.to.have.been.called
+      })
+    })
+
+    describe('when webdriver classic has a different window than the top level context as the active window', () => {
+      beforeEach(() => {
+        client.getWindowHandle.resolves('fa54442b-bc42-45fa-9996-88b7fd066211')
+      })
+
+      it('activates the top level context window', async () => {
+        await bidiKeyPress({ key }, client as WebdriverClient, autContext, 'idSuffix')
+        expect(client.switchToWindow).to.have.been.calledWith(topLevelContext)
+      })
+    })
+
     it('calls client.inputPerformActions with a keydown and keyup action', async () => {
+      client.getWindowHandle.resolves(topLevelContext)
       client.findElement.withArgs('css selector ', 'iframe.aut-iframe').resolves(iframeElement)
       // @ts-expect-error - webdriver types show this returning a string, but it actually returns an ElementReference, same as findElement
       client.getActiveElement.resolves(iframeElement)
diff --git a/system-tests/projects/cy-press-second-spec-error/cypress.config.js b/system-tests/projects/cy-press-second-spec-error/cypress.config.js
new file mode 100644
index 00000000000..93b46ace192
--- /dev/null
+++ b/system-tests/projects/cy-press-second-spec-error/cypress.config.js
@@ -0,0 +1,8 @@
+module.exports = {
+  e2e: {
+    supportFile: false,
+    setupNodeEvents (on, config) {
+      // implement node event listeners here
+    },
+  },
+}
diff --git a/system-tests/projects/cy-press-second-spec-error/cypress/e2e/first_spec.cy.js b/system-tests/projects/cy-press-second-spec-error/cypress/e2e/first_spec.cy.js
new file mode 100644
index 00000000000..6c63f4b1453
--- /dev/null
+++ b/system-tests/projects/cy-press-second-spec-error/cypress/e2e/first_spec.cy.js
@@ -0,0 +1,5 @@
+describe('this one should pass', () => {
+  it('dispatches a key press', () => {
+    cy.press(Cypress.Keyboard.Keys.TAB)
+  })
+})
diff --git a/system-tests/projects/cy-press-second-spec-error/cypress/e2e/second_spec.cy.js b/system-tests/projects/cy-press-second-spec-error/cypress/e2e/second_spec.cy.js
new file mode 100644
index 00000000000..c5b93e2b845
--- /dev/null
+++ b/system-tests/projects/cy-press-second-spec-error/cypress/e2e/second_spec.cy.js
@@ -0,0 +1,5 @@
+describe('it should also pass', () => {
+  it('dispatches a key press', () => {
+    cy.press(Cypress.Keyboard.Keys.TAB)
+  })
+})
diff --git a/system-tests/test/issue_31466_spec.ts b/system-tests/test/issue_31466_spec.ts
new file mode 100644
index 00000000000..db98509faf2
--- /dev/null
+++ b/system-tests/test/issue_31466_spec.ts
@@ -0,0 +1,12 @@
+import systemTests from '../lib/system-tests'
+
+describe('e2e issue 31466: cy.press only works in the first spec in firefox', () => {
+  systemTests.setup()
+
+  systemTests.it('does not error when dispatching cy.press', {
+    spec: 'first_spec.cy.js,second_spec.cy.js',
+    project: 'cy-press-second-spec-error',
+    expectedExitCode: 0,
+    browser: 'firefox',
+  })
+})


Reviews:
user: login: AtofStryker
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-04-10T18:38:31Z
user: login: cacieprins
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-04-10T18:55:47Z
user: login: cacieprins
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-04-10T19:01:36Z
user: login: AtofStryker
state: CHANGES_REQUESTED
author_association: CONTRIBUTOR
submitted_at: 2025-04-10T23:20:34Z
user: login: cacieprins
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-04-11T13:17:55Z
user: login: AtofStryker
state: APPROVED
author_association: CONTRIBUTOR
submitted_at: 2025-04-11T14:08:01Z
user: login: cacieprins
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-04-14T14:43:25Z

Review comments:
diff_hunk: @@ -104,24 +104,63 @@ export const BIDI_VALUE: KeyCodeLookup = {
   'Tab': '\uE004',
 }
 
+async function hasActiveWindow (client: Client) {
+  try {
+    return !!(await client.getWindowHandle())
+  } catch (e) {
+    return false
path: packages/server/lib/automation/commands/key_press.ts
user: login: AtofStryker
body: maybe a debug statement here on the error to see why this would fail?
created_at: 2025-04-10T18:36:43Z
author_association: CONTRIBUTOR
diff_hunk: @@ -104,24 +104,63 @@ export const BIDI_VALUE: KeyCodeLookup = {
   'Tab': '\uE004',
 }
 
+async function hasActiveWindow (client: Client) {
+  try {
+    return !!(await client.getWindowHandle())
+  } catch (e) {
+    return false
+  }
+}
+
+async function activateTopWindow (client: Client, autContext: string): Promise<void> {
+  const { contexts: [{ context: topLevelContext }] } = await client.browsingContextGetTree({
+    maxDepth: Infinity,
path: packages/server/lib/automation/commands/key_press.ts
user: login: AtofStryker
body: any reason we need the `Infinity` max depth if we are only getting the top context?
created_at: 2025-04-10T18:37:24Z
author_association: CONTRIBUTOR
diff_hunk: @@ -104,24 +104,63 @@ export const BIDI_VALUE: KeyCodeLookup = {
   'Tab': '\uE004',
 }
 
+async function hasActiveWindow (client: Client) {
+  try {
+    return !!(await client.getWindowHandle())
+  } catch (e) {
+    return false
+  }
+}
+
+async function activateTopWindow (client: Client, autContext: string): Promise<void> {
+  const { contexts: [{ context: topLevelContext }] } = await client.browsingContextGetTree({
+    maxDepth: Infinity,
+  })
+
+  await client.switchToWindow(topLevelContext)
+}
+
 export async function bidiKeyPress ({ key }: KeyPressParams, client: Client, autContext: string, idSuffix?: string): Promise<void> {
   const value = BIDI_VALUE[key]
 
   if (!value) {
     throw new InvalidKeyError(key)
   }
 
-  const autFrameElement = await client.findElement('css selector', 'iframe.aut-iframe')
-  const activeElement = await client.getActiveElement()
-
-  if (!isEqual(autFrameElement, activeElement)) {
-    await client.scriptEvaluate(
-      {
-        expression: `window.focus()`,
-        target: { context: autContext },
-        awaitPromise: false,
-      },
-    )
+  const needsWindowActivation = !(await hasActiveWindow(client))
+
+  // TODO: refactor for Cy15 https://github.com/cypress-io/cypress/issues/31480
+  if (needsWindowActivation) {
+    debug('Primary window is not currently active; attempting to activate')
+    try {
+      await activateTopWindow(client, autContext)
+    } catch (e) {
+      debug('Error while attempting to activate main browser tab:', e)
path: packages/server/lib/automation/commands/key_press.ts
user: login: AtofStryker
body: nvrmind the other comment looks like we have what we need here on the debugging
created_at: 2025-04-10T18:37:47Z
author_association: CONTRIBUTOR
diff_hunk: @@ -104,24 +104,63 @@ export const BIDI_VALUE: KeyCodeLookup = {
   'Tab': '\uE004',
 }
 
+async function hasActiveWindow (client: Client) {
+  try {
+    return !!(await client.getWindowHandle())
+  } catch (e) {
+    return false
+  }
+}
+
+async function activateTopWindow (client: Client, autContext: string): Promise<void> {
+  const { contexts: [{ context: topLevelContext }] } = await client.browsingContextGetTree({
+    maxDepth: Infinity,
path: packages/server/lib/automation/commands/key_press.ts
user: login: cacieprins
body: ope, nice catch thank you
created_at: 2025-04-10T18:55:47Z
author_association: CONTRIBUTOR
diff_hunk: @@ -104,24 +104,63 @@ export const BIDI_VALUE: KeyCodeLookup = {
   'Tab': '\uE004',
 }
 
+async function hasActiveWindow (client: Client) {
+  try {
+    return !!(await client.getWindowHandle())
+  } catch (e) {
+    return false
+  }
+}
+
+async function activateTopWindow (client: Client, autContext: string): Promise<void> {
+  const { contexts: [{ context: topLevelContext }] } = await client.browsingContextGetTree({
+    maxDepth: Infinity,
path: packages/server/lib/automation/commands/key_press.ts
user: login: cacieprins
body: addressed in https://github.com/cypress-io/cypress/pull/31481/commits/162bd219b1cb020d6affff6bdc3f6b9053893112
created_at: 2025-04-10T19:01:36Z
author_association: CONTRIBUTOR
diff_hunk: @@ -104,24 +104,61 @@ export const BIDI_VALUE: KeyCodeLookup = {
   'Tab': '\uE004',
 }
 
+async function hasActiveWindow (client: Client) {
+  try {
+    return !!(await client.getWindowHandle())
+  } catch (e) {
+    return false
+  }
+}
+
+async function activateTopWindow (client: Client, autContext: string): Promise<void> {
+  const { contexts: [{ context: topLevelContext }] } = await client.browsingContextGetTree({})
path: packages/server/lib/automation/commands/key_press.ts
user: login: AtofStryker
body: can we just eliminate this function and just call `client.switchToWindow(topLevelContext)` or remove the `autContext` arg? I don't think `autContext` is used, but my guess is this was looking up the top context before but no longer is? 
created_at: 2025-04-10T23:18:06Z
author_association: CONTRIBUTOR
diff_hunk: @@ -104,24 +104,61 @@ export const BIDI_VALUE: KeyCodeLookup = {
   'Tab': '\uE004',
 }
 
+async function hasActiveWindow (client: Client) {
+  try {
+    return !!(await client.getWindowHandle())
+  } catch (e) {
+    return false
+  }
+}
+
+async function activateTopWindow (client: Client, autContext: string): Promise<void> {
+  const { contexts: [{ context: topLevelContext }] } = await client.browsingContextGetTree({})
path: packages/server/lib/automation/commands/key_press.ts
user: login: cacieprins
body: Addressed in https://github.com/cypress-io/cypress/pull/31481/commits/e0421b25fd802426029bacae61c6e83cb3227791
created_at: 2025-04-11T13:17:55Z
author_association: CONTRIBUTOR
diff_hunk: @@ -226,7 +250,19 @@ describe('key:press automation command', () => {
       })
     })
 
+    describe('when webdriver classic has no active window', () => {
+      beforeEach(() => {
+        client.getWindowHandle.rejects(new Error())
+      })
+
+      it('activates the top level context window', async () => {
+        await bidiKeyPress({ key }, client as WebdriverClient, autContext, 'idSuffix')
+        expect(client.switchToWindow).to.have.been.calledWith(topLevelContext)
path: packages/server/test/unit/automation/commands/key_press.spec.ts
user: login: AtofStryker
body: Probably also testing the case when the top level context is already active and we don't need to call `switchToWindow` if that test doesn't already exist
created_at: 2025-04-11T14:07:29Z
author_association: CONTRIBUTOR
diff_hunk: @@ -226,7 +250,19 @@ describe('key:press automation command', () => {
       })
     })
 
+    describe('when webdriver classic has no active window', () => {
+      beforeEach(() => {
+        client.getWindowHandle.rejects(new Error())
+      })
+
+      it('activates the top level context window', async () => {
+        await bidiKeyPress({ key }, client as WebdriverClient, autContext, 'idSuffix')
+        expect(client.switchToWindow).to.have.been.calledWith(topLevelContext)
path: packages/server/test/unit/automation/commands/key_press.spec.ts
user: login: cacieprins
body: Definitely - also the case where there is an active window, but it's not our `top`. Addressed in https://github.com/cypress-io/cypress/pull/31481/commits/944b91344e425400a6db630a348678f3361f8ede
created_at: 2025-04-14T14:43:25Z
author_association: CONTRIBUTOR

PR comments:
user: login: cypress[bot]
created_at: 2025-04-10T19:31:08Z
body: 
<h3>
  <a href="https://cloud.cypress.io/projects/ypt4pf?utm_source=github&utm_medium=PASSED&utm_campaign=project">cypress</a>&nbsp;
  <img src="https://assets.cypress.io/github-pr-comment-icons/chevron.svg" alt="" height="14" width="14" />&nbsp;
  <a href="https://cloud.cypress.io/projects/ypt4pf/runs/61586/overview?utm_source=github&utm_medium=PASSED&utm_campaign=run%20number">Run #61586</a>
</h3>

<details>
  <summary>
    <strong>Run Properties:</strong>&nbsp;
    <code><img src="https://assets.cypress.io/github-pr-comment-icons/passed.svg" alt="status check passed" height="10" width="10" />&nbsp;Passed&nbsp;<a href="https://cloud.cypress.io/projects/ypt4pf/runs/61586/overview?utm_source=github&utm_medium=PASSED&utm_campaign=run%20number">#61586</a></code> &nbsp;&bull;&nbsp;
    <code><img src="https://assets.cypress.io/github-pr-comment-icons/git-commit.svg" alt="git commit" width="10" height="10" /> <a href="https://github.com/cypress-io/cypress/commit/4bc7525affecd61f149860e0fd6a71d61bcf9eb3">4bc7525aff</a>: Merge branch 'develop' into cacie/fix/ff-press-flake</code>
  </summary><br />

  <table width="744">
    <tbody>
      <tr />
      <tr height="48">
        <td width="224">
          <strong>Project</strong>
        </td>
        <td width="520">
          <code><a href="https://cloud.cypress.io/projects/ypt4pf?utm_source=github&utm_medium=PASSED&utm_campaign=project">cypress</a></code>
        </td>
      </tr>
      <tr />
      <tr height="48">
        <td width="224">
          <strong>Branch Review</strong>
        </th>
        <td>
          <code><a href="https://cloud.cypress.io/projects/ypt4pf/branches/cacie%2Ffix%2Fff-press-flake/review?utm_source=github&utm_medium=PASSED&utm_campaign=review%20changes&changeRequest=31481">cacie/fix/ff-press-flake</a></code>
        </td>
      </tr>
      <tr />
      <tr height="48">
        <td><strong>Run status</strong></td>
        <td>
          <code><img src="https://assets.cypress.io/github-pr-comment-icons/passed.svg" alt="status check passed" height="10" width="10" />&nbsp;Passed&nbsp;<a href="https://cloud.cypress.io/projects/ypt4pf/runs/61586/overview?utm_source=github&utm_medium=PASSED&utm_campaign=run%20number">#61586</a></code>
        </td>
      </tr>
      <tr />
      <tr height="48">
        <td><strong>Run duration</strong></td>
        <td><code>09m 37s</code></td>
      </tr>
      <tr />
      <tr height="48">
        <td><strong>Commit</strong></td>
        <td>
          <code><img src="https://assets.cypress.io/github-pr-comment-icons/git-commit.svg" alt="git commit" width="10" height="10" /> <a href="https://github.com/cypress-io/cypress/commit/4bc7525affecd61f149860e0fd6a71d61bcf9eb3">4bc7525aff</a>: Merge branch 'develop' into cacie/fix/ff-press-flake</code>
        </td>
      </tr>
      <tr />
      <tr height="48">
        <td><strong>Committer</strong></td>
        <td><code>Cacie Prins</code></td>
      </tr>
    </tbody>
    <tfoot>
      <tr />
      <tr height="48">
        <td colspan="2">
          <a href="https://cloud.cypress.io/projects/ypt4pf/runs/61586/properties?utm_source=github&utm_medium=PASSED&utm_campaign=properties">View all properties for this run ↗︎</a>
        </td>
      </tr>
    </tfoot>
  </table>
  <hr />
</details>

<table width="744">
  <thead>
    <tr />
    <tr height="48">
      <th colspan="2" align="left" width="744">Test results</th>
    </tr>
  </thead>
  <tbody>
    <tr height="48">
      <td width="224">
        <img src="https://assets.cypress.io/github-pr-comment-icons/failed.svg" alt="Tests that failed" width="10" height="10" />&nbsp;
        <a href="https://cloud.cypress.io/projects/ypt4pf/runs/61586/overview?reviewViewBy=FAILED&utm_source=github&utm_medium=PASSED&utm_campaign=failed%20tests">
          <strong>Failures</strong>
        </a>
      </td>
      <td>
        <code><strong>0</strong></code>
      </td>
    </tr>
    <tr />
    <tr height="48">
      <td width="224">
        <img src="https://assets.cypress.io/github-pr-comment-icons/flaky-v3.svg" alt="Tests that were flaky" width="10" height="10" />&nbsp;
        <a href="https://cloud.cypress.io/projects/ypt4pf/runs/61586/overview?reviewViewBy=FLAKY&utm_source=github&utm_medium=PASSED&utm_campaign=flaky%20tests">
          <strong>Flaky</strong>
        </a>
      </td>
      <td>
        <code><strong>0</strong></code>
      </td>
    </tr>
    <tr />
    <tr height="48">
      <td width="224">
        <img src="https://assets.cypress.io/github-pr-comment-icons/pending.svg" alt="Tests that did not run due to a developer annotating a test with .skip" width="10" height="10" />&nbsp;
        <a href="https://cloud.cypress.io/projects/ypt4pf/runs/61586/test-results?utm_source=github&utm_medium=PASSED&utm_campaign=pending%20tests&statuses=%5B%7B%22value%22%3A%22PENDING%22%2C%22label%22%3A%22PENDING%22%7D%5D">
          <strong>Pending</strong>
        </a>
      </td>
      <td>
        <code><strong>694</strong></code>
      </td>
    </tr>
    <tr />
    <tr height="48">
      <td width="224">
        <img src="https://assets.cypress.io/github-pr-comment-icons/skipped-v3.svg" alt="Tests that did not run due to a failure in a mocha hook" width="10" height="10" />&nbsp;
        <a href="https://cloud.cypress.io/projects/ypt4pf/runs/61586/test-results?utm_source=github&utm_medium=PASSED&utm_campaign=skipped%20tests&statuses=%5B%7B%22value%22%3A%22SKIPPED%22%2C%22label%22%3A%22SKIPPED%22%7D%5D">
          <strong>Skipped</strong>
        </a>
      </td>
      <td>
        <code><strong>0</strong></code>
      </td>
    </tr>
    <tr />
    <tr height="48">
      <td width="224">
        <img src="https://assets.cypress.io/github-pr-comment-icons/passed.svg" alt="Tests that passed" width="10" height="10" />&nbsp;
        <a href="https://cloud.cypress.io/projects/ypt4pf/runs/61586/overview?utm_source=github&utm_medium=PASSED&utm_campaign=passed%20tests">
          <strong>Passing</strong>
        </a>
      </td>
      <td>
        <code><strong>130</strong></code>
      </td>
    </tr><tfoot>
    <tr height="48"><td colspan="2"><a href="https://cloud.cypress.io/projects/ypt4pf/branches/cacie%2Ffix%2Fff-press-flake/review?utm_source=github&utm_medium=PASSED&utm_campaign=review%20changes&changeRequest=31481">View all changes introduced in this branch ↗︎</a></td></tr></tfoot>
  </tbody>
</table>






author_association: NONE
user: login: cypress-bot[bot]
created_at: 2025-04-17T22:03:41Z
body: Released in [`14.3.1`](https://on.cypress.io/changelog#14-3-1).

This comment thread has been locked. If you are still experiencing this issue after upgrading to
Cypress v14.3.1, please open a new issue.
author_association: CONTRIBUTOR