diff --git a/cli/CHANGELOG.md b/cli/CHANGELOG.md index 4af8d8bd1ca..d4d9353fbc4 100644 --- a/cli/CHANGELOG.md +++ b/cli/CHANGELOG.md @@ -12,6 +12,7 @@ _Released 10/20/2025 (PENDING)_ - Fixed an issue where grouped command text jumps up and down when expanding and collapsing in the command log. Addressed in [#32757](https://github.com/cypress-io/cypress/pull/32757). - Fixed an issue where command snapshots were not correctly displayed in Studio. Addressed in [#32808](https://github.com/cypress-io/cypress/pull/32808). - Fixed an issue with grouped console prop items having a hard to read blue color in the console log and duplicate `:` characters being displayed. Addressed in [#32776](https://github.com/cypress-io/cypress/pull/32776). +- Fixed an issue where `cy.wait('@alias')` could time out when the underlying network request was canceled by navigation (e.g., `cy.visit`, `cy.reload`). Fixes [#19326](https://github.com/cypress-io/cypress/issues/19326). **Misc:** diff --git a/packages/driver/cypress/e2e/commands/navigation.cy.js b/packages/driver/cypress/e2e/commands/navigation.cy.js index 668e76f30a7..aa5d3089f4a 100644 --- a/packages/driver/cypress/e2e/commands/navigation.cy.js +++ b/packages/driver/cypress/e2e/commands/navigation.cy.js @@ -1884,6 +1884,28 @@ describe('src/cy/commands/navigation', () => { }) }) }) + + it('should resolve wait for a request canceled by navigation', () => { + const alias = crypto.randomUUID() + + cy.intercept(/jsonplaceholder.cypress.io/).as(alias) + + cy.visit('https://example.cypress.io/commands/network-requests') + cy.get('.network-btn').click() + + cy.visit('https://example.cypress.io/commands/network-requests') + cy.wait(`@${alias}`).then((interception) => { + const actual = JSON.parse( + JSON.stringify(interception, (_, value) => value), + ) + + cy.wrap(actual).should('deep.equal', { + ...actual, + state: 'Errored', + error: { ...interception.error }, + }) + }) + }) }) // TODO(webkit): fix+unskip for webkit release diff --git a/packages/driver/src/cy/commands/navigation.ts b/packages/driver/src/cy/commands/navigation.ts index 4fab0f6a710..1b9c9ab4496 100644 --- a/packages/driver/src/cy/commands/navigation.ts +++ b/packages/driver/src/cy/commands/navigation.ts @@ -175,6 +175,18 @@ const pageLoading = (bool, Cypress, state) => { Cypress.action('app:page:loading', bool) } +const markRequestAsCancelled = (request: any) => { + if ( + request && + request.state === 'Received' && + !request.response && + !request.error + ) { + request.state = 'Errored' + request.error = new Error('Request was cancelled due to navigation.') + } +} + const stabilityChanged = async (Cypress, state, config, stable) => { debug('stabilityChanged:', stable) @@ -187,6 +199,25 @@ const stabilityChanged = async (Cypress, state, config, stable) => { return } + // Mark inflight requests as canceled at navigation start. + try { + const routes = state('routes') ?? {} + + _.forEach(routes, ({ requests }) => { + _.forEach(requests, markRequestAsCancelled) + }) + + const aliasedRequests = state('aliasedRequests') ?? [] + + aliasedRequests.forEach(({ request }) => { + markRequestAsCancelled(request) + }) + } catch (_) { + // TODO: Should I use `$errUtils.logError` or another method from + // `$errUtils` here? Alternatively, should I do nothing, since canceled + // requests aren't necessarily a problem in Cypress? + } + // if we purposefully just caused the page to load // (and thus instability) don't log this out if (knownCommandCausedInstability) { diff --git a/packages/electron/src/print-node-version.ts b/packages/electron/src/print-node-version.ts index 35be0a591ca..618ec8e0c7e 100644 --- a/packages/electron/src/print-node-version.ts +++ b/packages/electron/src/print-node-version.ts @@ -1,2 +1,3 @@ +// eslint-disable-next-line no-console console.log(process.version.replace('v', '')) process.exit(0)