From 92aff4501c9822681e486f05abc84a893ba75fc6 Mon Sep 17 00:00:00 2001 From: Chris Breiding Date: Fri, 19 Aug 2022 10:13:07 -0400 Subject: [PATCH 01/15] document Cypress.require() --- content/_data/sidebar.json | 4 + content/api/commands/origin.md | 115 ++++++++++++++++++++++------- content/api/cypress-api/require.md | 66 +++++++++++++++++ 3 files changed, 159 insertions(+), 26 deletions(-) create mode 100644 content/api/cypress-api/require.md diff --git a/content/_data/sidebar.json b/content/_data/sidebar.json index b68c2543a5..96b965ab34 100644 --- a/content/_data/sidebar.json +++ b/content/_data/sidebar.json @@ -966,6 +966,10 @@ "title": "platform", "slug": "platform" }, + { + "title": "require", + "slug": "require" + }, { "title": "session", "slug": "session" diff --git a/content/api/commands/origin.md b/content/api/commands/origin.md index fb87ba110d..3d8a31885b 100755 --- a/content/api/commands/origin.md +++ b/content/api/commands/origin.md @@ -290,7 +290,7 @@ do this with `cy.origin()`. ```js Cypress.Commands.add('login', (username, password) => { - // Remember to pass in dependencies via `args` + // Remember to pass in arguments via `args` const args = { username, password } cy.origin('my-auth.com', { args }, ({ username, password }) => { // Go to https://auth-provider.com/login @@ -473,49 +473,112 @@ of [restrictions on the data which may be passed](https://developer.mozilla.org/en-US/docs/Web/API/Web_Workers_API/Structured_clone_algorithm#things_that_dont_work_with_structured_clone) into the callback. -### Callback restrictions +### Dependencies / Sharing Code -Because of the way in which the callback is transmitted and executed, there are -certain limitations on what code may be run inside it. In particular, the -following Cypress commands will throw errors if used in the callback: +It is not possible to use +[CommonJS `require()`](https://nodejs.org/en/knowledge/getting-started/what-is-require/) +or +[dynamic ES module `import()`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/import#dynamic_imports) +within the callback. However, [`Cypress.require()`](/api/cypress-api/require) +can be utilized to include [npm](https://www.npmjs.com/) packages and other +files. It works exactly the same as +[CommonJS `require()`](https://nodejs.org/en/knowledge/getting-started/what-is-require/). -- `cy.origin()` -- [`cy.intercept()`](/api/commands/intercept) -- [`cy.session()`](/api/commands/session) -- [`cy.server()`](/api/commands/server) -- [`cy.route()`](/api/commands/route) -- [`Cypress.Cookies.preserveOnce()`](/api/cypress-api/cookies) +```js +cy.origin('somesite.com', () => { + const _ = Cypress.require('lodash') + const utils = Cypress.require('../support/utils') -It is also currently not possible to use -[`require()`](https://nodejs.org/en/knowledge/getting-started/what-is-require/) -or -[dynamic `import()`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/import#dynamic_imports) -within the callback. Because of this limitation, it cannot use -[npm](https://www.npmjs.com/) packages or other third-party libraries inside the -callback, as there is no mechanism to reference them. This functionality will be -provided in a future version of Cypress. + // ... use lodash and utils ... +}) +``` + +This can be used to share custom commands between tests run in primary and +secondary origins. We recommend this pattern for setting up your +[support file](/guides/core-concepts/writing-and-organizing-tests#Support-file) +and setting up custom commands to run within the `cy.origin()` callback: + +`cypress/support/commands.js`: + +```js +Cypress.Commands.add('clickLink', (label) => { + cy.get('a').contains(label).click() +}) +``` -While third-party packages are strictly unavailable, it is possible to reuse -your **own** code between `cy.origin()` callbacks. The workaround is to create a -custom Cypress command within the secondary origin in a `before` block: +`cypress/support/e2e.js`: + +```js +// makes custom commands available to all Cypress tests, outside of +// cy.origin() callbacks +import './commands' + +// code we only want run per test, so it shouldn't be run as part of +// the execution of cy.origin() as well +beforeEach(() => { + // ... code to run before each test ... +}) +``` + +`cypress/e2e/spec.cy.js`: + +```js +cy.origin('somesite.com', () => { + // makes custom commands available to all subsequent + // cy.origin('somesite.com') calls + Cypress.require('../support/commands') + + cy.visit('/page') + cy.clickLink('Click Me') +}) +``` + +The JavaScript execution context is persisted between `cy.origin()` callbacks +that share the same origin. This can be utilized to share code between +successive `cy.origin()` calls. ```js before(() => { cy.origin('somesite.com', () => { - Cypress.Commands.add('clickLink', (label) => { - cy.get('a').contains(label).click() - }) + // makes commands defined in this file available to all callbacks + // for somesite.com + Cypress.require('../support/commands') + }) +}) + +it('uses cy.origin() + custom command', () => { + cy.origin('somesite.com', () => { + cy.visit('/page') + cy.clickLink('Click Me') }) }) -it('clicks the secondary origin link', () => { +it('also uses cy.origin() + custom command', () => { cy.origin('somesite.com', () => { cy.visit('/page') cy.clickLink('Click Me') }) + + cy.origin('differentsite.com', () => { + // WARNING: cy.clickLink() will not be available because it is a + // different origin + }) }) ``` +### Callback restrictions + +Because of the way in which the callback is transmitted and executed, there are +certain limitations on what code may be run inside it. In particular, the +following Cypress commands will throw errors if used in the callback: + +- `cy.origin()` +- [`cy.intercept()`](/api/commands/intercept) +- [`cy.session()`](/api/commands/session) +- [`cy.server()`](/api/commands/server) +- [`cy.route()`](/api/commands/route) +- [`Cypress.Cookies.preserveOnce()`](/api/cypress-api/cookies) + ### Other limitations There are other testing scenarios which are not currently covered by diff --git a/content/api/cypress-api/require.md b/content/api/cypress-api/require.md new file mode 100644 index 0000000000..a3a2357694 --- /dev/null +++ b/content/api/cypress-api/require.md @@ -0,0 +1,66 @@ +--- +title: Cypress.require +--- + +`Cypress.require` is used with [`cy.origin()`](/api/commands/origin) to utilize +dependencies within the [`cy.origin()`](/api/commands/ callback function. It +enables the use of [npm](https://www.npmjs.com/) packages and sharing code from +other files. + +It is functionally the same as the +[CommonJS `require()`](https://nodejs.org/en/knowledge/getting-started/what-is-require/) +used in NodeJs. + +## Syntax + +```js +Cypress.require(moduleId) +``` + +## Usage + +** Correct Usage** + +```js +cy.origin('somesite.com', () => { + const _ = Cypress.require('lodash') + const utils = Cypress.require('./utils') + + // ... use lodash and utils ... +}) +``` + +** Incorrect Usage** + +```js +// `Cypress.require()` cannot be used outside the `cy.origin()` callback. +// Use `require()` instead +const _ = Cypress.require('lodash') + +cy.origin('somesite.com', () => { + // `require()` cannot be used inside the `cy.origin()` callback. + // Use `Cypress.require()` instead + const _ = require('lodash') +}) +``` + +## Examples + +See [`cy.origin()` Dependencies / Sharing Code]() for example usages. + +## Limitations + +- `Cypress.require` only works when called within the + [`cy.origin()`](/api/commands/origin) callback function. It will error if used + elsewhere. +- `Cypress.require` only works in conjunction with the + [webpack preprocessor](https://www.npmjs.com/package/@cypress/webpack-preprocessor), + which is the default preprocessor for Cypress. If you have manually installed + and configured the webpack preprocessor, ensure you are using version `5.13.0` + or greater. + +## History + +| Version | Changes | +| --------------------------------------------- | ----------------------- | +| [10.7.0](/guides/references/changelog#10-7-0) | `Cypress.require` added | From 165b3ce98fe59ece27075ce57e95cbb4a0edc76e Mon Sep 17 00:00:00 2001 From: Chris Breiding Date: Fri, 19 Aug 2022 15:07:59 -0400 Subject: [PATCH 02/15] address feedback --- content/api/commands/origin.md | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/content/api/commands/origin.md b/content/api/commands/origin.md index 3d8a31885b..9ae1088968 100755 --- a/content/api/commands/origin.md +++ b/content/api/commands/origin.md @@ -493,8 +493,8 @@ cy.origin('somesite.com', () => { }) ``` -This can be used to share custom commands between tests run in primary and -secondary origins. We recommend this pattern for setting up your +`Cypress.require()` can be used to share custom commands between tests run in +primary and secondary origins. We recommend this pattern for setting up your [support file](/guides/core-concepts/writing-and-organizing-tests#Support-file) and setting up custom commands to run within the `cy.origin()` callback: @@ -523,13 +523,15 @@ beforeEach(() => { `cypress/e2e/spec.cy.js`: ```js -cy.origin('somesite.com', () => { - // makes custom commands available to all subsequent - // cy.origin('somesite.com') calls - Cypress.require('../support/commands') +it('tests somesite.com', () => { + cy.origin('somesite.com', () => { + // makes custom commands available to all subsequent + // cy.origin('somesite.com') calls + Cypress.require('../support/commands') - cy.visit('/page') - cy.clickLink('Click Me') + cy.visit('/page') + cy.clickLink('Click Me') + }) }) ``` From bee2787cfaa9457f05742e1129d9c2755f29e4ad Mon Sep 17 00:00:00 2001 From: Chris Breiding Date: Fri, 19 Aug 2022 15:08:16 -0400 Subject: [PATCH 03/15] add variable assignment limitation --- content/api/cypress-api/require.md | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/content/api/cypress-api/require.md b/content/api/cypress-api/require.md index a3a2357694..7ced8a47be 100644 --- a/content/api/cypress-api/require.md +++ b/content/api/cypress-api/require.md @@ -42,6 +42,14 @@ cy.origin('somesite.com', () => { // Use `Cypress.require()` instead const _ = require('lodash') }) + +// the callback must be inline and cannot be assigned to a variable for +// `Cypress.require()` to work +const callback = () => { + const _ = Cypress.require('lodash') +}) + +cy.origin('somesite.com', callback) ``` ## Examples @@ -58,6 +66,8 @@ See [`cy.origin()` Dependencies / Sharing Code]() for example usages. which is the default preprocessor for Cypress. If you have manually installed and configured the webpack preprocessor, ensure you are using version `5.13.0` or greater. +- For `Cypress.require` to work, the callback function must be written inline + with the `cy.origin()` call. The callback cannot be assigned to a variable. ## History From f38e9b5594c74ca9ccd1658b92a8195675fad5f0 Mon Sep 17 00:00:00 2001 From: Chris Breiding Date: Fri, 19 Aug 2022 15:25:54 -0400 Subject: [PATCH 04/15] rework Cypress.require description --- content/api/cypress-api/require.md | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/content/api/cypress-api/require.md b/content/api/cypress-api/require.md index 7ced8a47be..07682608cf 100644 --- a/content/api/cypress-api/require.md +++ b/content/api/cypress-api/require.md @@ -2,10 +2,9 @@ title: Cypress.require --- -`Cypress.require` is used with [`cy.origin()`](/api/commands/origin) to utilize -dependencies within the [`cy.origin()`](/api/commands/ callback function. It -enables the use of [npm](https://www.npmjs.com/) packages and sharing code from -other files. +`Cypress.require` enables utilizing dependencies within the +[`cy.origin()`](/api/commands/ callback function. It is used to require modules +such as [npm](https://www.npmjs.com/) packages and other local files. It is functionally the same as the [CommonJS `require()`](https://nodejs.org/en/knowledge/getting-started/what-is-require/) From 5005028f0a0d8a9148c74701fa18ab4222431233 Mon Sep 17 00:00:00 2001 From: Chris Breiding Date: Mon, 22 Aug 2022 09:27:55 -0400 Subject: [PATCH 05/15] add Cypress.require to sidebar overrides --- cypress/fixtures/sidebar-overrides.json | 1 + 1 file changed, 1 insertion(+) diff --git a/cypress/fixtures/sidebar-overrides.json b/cypress/fixtures/sidebar-overrides.json index d8653b2086..6776822221 100644 --- a/cypress/fixtures/sidebar-overrides.json +++ b/cypress/fixtures/sidebar-overrides.json @@ -34,6 +34,7 @@ "/api/cypress-api/iscy": "Cypress.isCy", "/api/cypress-api/cypress-log": "Cypress.log", "/api/cypress-api/platform": "Cypress.platform", + "/api/cypress-api/require": "Cypress.require", "/api/cypress-api/spec": "Cypress.spec", "/api/cypress-api/session": "Cypress.session", "/api/cypress-api/testing-type": "Cypress.testingType", From b6685be47aad42384813fb3f48e3e39828a519a6 Mon Sep 17 00:00:00 2001 From: Chris Breiding Date: Wed, 24 Aug 2022 10:05:01 -0400 Subject: [PATCH 06/15] apply changes based on feedback --- content/api/commands/origin.md | 5 +++-- content/api/cypress-api/require.md | 8 ++++---- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/content/api/commands/origin.md b/content/api/commands/origin.md index 9ae1088968..cd8b5742f6 100755 --- a/content/api/commands/origin.md +++ b/content/api/commands/origin.md @@ -481,8 +481,9 @@ or [dynamic ES module `import()`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/import#dynamic_imports) within the callback. However, [`Cypress.require()`](/api/cypress-api/require) can be utilized to include [npm](https://www.npmjs.com/) packages and other -files. It works exactly the same as -[CommonJS `require()`](https://nodejs.org/en/knowledge/getting-started/what-is-require/). +files. It is functionally the same as using +[CommonJS `require()`](https://nodejs.org/en/knowledge/getting-started/what-is-require/) +in browser-targeted code. ```js cy.origin('somesite.com', () => { diff --git a/content/api/cypress-api/require.md b/content/api/cypress-api/require.md index 07682608cf..efa0d7bb1b 100644 --- a/content/api/cypress-api/require.md +++ b/content/api/cypress-api/require.md @@ -3,12 +3,12 @@ title: Cypress.require --- `Cypress.require` enables utilizing dependencies within the -[`cy.origin()`](/api/commands/ callback function. It is used to require modules -such as [npm](https://www.npmjs.com/) packages and other local files. +[`cy.origin()`](/api/commands/origin) callback function. It is used to require +modules such as [npm](https://www.npmjs.com/) packages and other local files. -It is functionally the same as the +It is functionally the same as using [CommonJS `require()`](https://nodejs.org/en/knowledge/getting-started/what-is-require/) -used in NodeJs. +in browser-targeted code. ## Syntax From f24610d16e03ccae6eb1e763a0ef9e4fb0633c32 Mon Sep 17 00:00:00 2001 From: Chris Breiding Date: Wed, 21 Sep 2022 09:30:58 -0400 Subject: [PATCH 07/15] v10.9.0 From f850260b3e82013dea687114de688b5401d6a9c0 Mon Sep 17 00:00:00 2001 From: Matt Henkes Date: Mon, 26 Sep 2022 13:03:42 -0500 Subject: [PATCH 08/15] update docs for async attach feature (#4753) * update docs for async attach feature * Apply suggestions from code review Co-authored-by: Emily Rohrbough * Apply suggestions from code review * Apply suggestions from code review Co-authored-by: Chris Breiding * fix md issues Co-authored-by: Emily Rohrbough Co-authored-by: Chris Breiding --- content/api/commands/origin.md | 54 +++++++++++++++++++++++++++------- content/api/commands/visit.md | 19 ++++++++++++ 2 files changed, 62 insertions(+), 11 deletions(-) diff --git a/content/api/commands/origin.md b/content/api/commands/origin.md index cd8b5742f6..6f09e76106 100755 --- a/content/api/commands/origin.md +++ b/content/api/commands/origin.md @@ -33,9 +33,8 @@ Enabling this flag does the following: - It supersedes the [`Cypress.Cookies.preserveOnce()`](/api/cypress-api/cookies#Preserve-Once) and [`Cypress.Cookies.defaults()`](/api/cypress-api/cookies#Defaults) methods. -- Cross-origin requests will no longer fail immediately, but instead, time out - based on [`pageLoadTimeout`](/guides/references/configuration#Timeouts). -- Tests will no longer wait on page loads before moving on to the next test. +- Cross-origin requests will now succeed, however, to interact with a + cross-origin page you must use a `cy.origin` block. Because the page is cleared before each test, [`cy.visit()`](/api/commands/visit) must be explicitly called in each test @@ -91,10 +90,11 @@ cy.get('h1').contains('My cool site under test') ```js const hits = getHits() -// cy.visit() should be inside cy.origin() callback cy.visit('https://www.acme.com/history/founder') +// to interact with cross-origin content, move this inside cy.origin() callback +cy.get('h1').contains('About our Founder, Marvin Acme') cy.origin('https://www.acme.com', () => { - // Fails because origin was visited before cy.origin() block + cy.visit('/history/founder') cy.get('h1').contains('About our Founder, Marvin Acme') // Fails because hits is not passed in via args cy.get('#hitcounter').contains(hits) @@ -214,9 +214,10 @@ cy.origin('https://www.acme.com', () => { ### Navigating to secondary origin with cy.visit -When navigating to a secondary origin using `cy.visit()`, it is essential to -trigger the navigation **after** entering the origin callback, otherwise a -cross-origin error will be thrown. +When navigating to a secondary origin using `cy.visit()`, you can either +navigate prior to or after the `cy.origin` block. Errors are no longer thrown on +cross-origin navigation, but instead when commands interact with a cross-origin +page. ```js // Do things in primary origin... @@ -233,11 +234,42 @@ and the protocol defaults to `https`. When `cy.visit()` is called with the path `/history/founder`, the three are concatenated to make `https://www.acme.com/history/founder`. +#### Alternative navigation + +```js +// Do things in primary origin... + +cy.visit('https://www.acme.com/history/founder') + +// The cy.origin block is required to interact with the cross-origin page. +cy.origin('www.acme.com', () => { + cy.get('h1').contains('About our Founder, Marvin Acme') +}) +``` + +Here the cross-origin page is visited prior to the `cy.origin` block, but any +interactions with the window are performed within the block which can +communicate with the cross-origin page + +#### Incorrect usage + +```js +// Do things in primary origin... + +cy.visit('https://www.acme.com/history/founder') + +// This command will fail, it's executed on localhost but the application is at acme.com +cy.get('h1').contains('About our Founder, Marvin Acme') +``` + +Here `cy.get('h1')` fails because we are trying to interact with a cross-origin +page outside of the cy.origin block, due to 'same-origin' restrictions, the +'localhost' javascript context can't communicate with 'acme.com'. + ### Navigating to secondary origin with UI -When navigating to a secondary origin by clicking a link or button in the -primary origin, it is essential to trigger the navigation _before_ entering the -origin callback, otherwise a cross-origin error will be thrown. +Navigating to a secondary origin by clicking a link or button in the primary +origin is supported. ```js // Button in primary origin goes to https://www.acme.com diff --git a/content/api/commands/visit.md b/content/api/commands/visit.md index c31a2c6377..197d5c64a7 100644 --- a/content/api/commands/visit.md +++ b/content/api/commands/visit.md @@ -413,6 +413,25 @@ to pass event.
  • `cy.visit()` can time out waiting for assertions you've added to pass.
  • +## Visiting cross-origin sites + + + + +Experimental + +Visiting cross-origin sites will currently throw an error. It can be enabled by +setting +the [`experimentalSessionAndOrigin`](/guides/references/experiments) flag +to `true` in the Cypress config. This will allow you to visit the cross-origin +site without errors. However, to interact with the content on the cross-origin +site, you must use a [`cy.origin()`](/api/commands/origin) block. + +When visiting a cross-origin site, the `onBeforeLoad` and `onLoad` options are +not supported. + + + ## Command Log **_Visit example application in a `beforeEach`_** From 5c3984493f0e48438adb9ab39ed40391212fc559 Mon Sep 17 00:00:00 2001 From: Emily Rohrbough Date: Mon, 26 Sep 2022 17:06:50 -0500 Subject: [PATCH 09/15] docs: add docs for new cacheAcrossSpecs cy.session option (#4746) Co-authored-by: Matt Henkes --- assets/img/api/session/sessions-panel.png | Bin 27542 -> 38506 bytes content/api/commands/session.md | 67 +++++++++++++++++----- 2 files changed, 53 insertions(+), 14 deletions(-) diff --git a/assets/img/api/session/sessions-panel.png b/assets/img/api/session/sessions-panel.png index b5ed72fb401f85dfd1e3a78d5ffe8b7b53b35cf7..13dd16aa804a563a76f8dc0179158dbd9f62cfc4 100644 GIT binary patch literal 38506 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 literal 27542 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�hQh_qTb721n~B6U28(NM*K3g% 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 { }) // Caching session when logging in via page visit -// Used in E2E Testing cy.session(name, () => { cy.visit('/login') cy.get('[data-test=name]').type(name) @@ -135,14 +134,14 @@ The page and all active session data (cookies, `localStorage` and ** options** **_(Object)_** -| Option | Default | Description | -| ---------- | ----------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | -| `validate` | `undefined` | Validates the newly-created or restored session.

    The `validate` function is run immediately after the `setup` function runs, and also every time `cy.session()` restores a cached session. If the `validate` function returns `false`, throws an exception, returns a Promise that resolves to `false` or rejects, or contains any failing Cypress command, the session will be considered invalid, and `setup` will be re-run. If validation fails immediately after `setup` runs, the test will fail.

    The page is always cleared before `validate` runs. | +| Option | Default | Description | +| ------------------ | ----------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `validate` | `undefined` | Validates the newly-created or restored session.

    Function to run immediately after the session is created and `setup` function runs or after a session is restored and the page is cleared. If this returns `false`, throws an exception, contains any failing Cypress command, or returns a Promise which rejects or resolves to `false`, the session is considered invalid.

    - If validation fails immediately after `setup`, the test will fail.
    - If validation fails after restoring a session, `setup` will re-run. | +| `cacheAcrossSpecs` | `false` | When enabled, the newly created session is considered "global" and can be restored in any spec during the test execution in the same Cypress run on the same machine. Use this option for a session that will be used multiple times, across many specs. | ### Yields [](/guides/core-concepts/introduction-to-cypress#Subject-Management) - `cy.session()` yields `null`. -- `cy.session()` cannot be chained further. ## Examples @@ -422,6 +421,43 @@ cy.session('user', () => { }) ``` +### Caching session data across specs + +If you want to use the same session across multiple specs in the same Cypress +run on the same machine, add `cacheAcrossSpecs=true` to the session options to +leverage the session through the run. + +```js +const login = (name = 'user1') => { + cy.session(name, () => { + cy.request({ + method: 'POST', + url: '/login', + body: { name, password: 's3cr3t' }, + }).then(({ body }) => { + window.localStorage.setItem('authToken', body.token) + }) + }, { + validate() { + cy.visit('/user_profile') + cy.contains(`Hello ${name}`) + } + cacheAcrossSpecs: true, + }) +} + +// profile.cy.js +it('can view profile', () => { + cy.login() +}) + +// add_blog.cy.js +it('can create a blog post', () => { + cy.login() +}) + +``` + ### Multiple login commands A more complex app may require multiple login commands, which may require @@ -461,7 +497,7 @@ const loginByApi = (name, password) => { } ``` -### Where to call `cy.visit()` +### Where to call `cy.visit()` If you call [`cy.visit()`](/api/commands/visit) immediately after `cy.session()` in your login function or custom command, it will effectively behave the same as @@ -593,7 +629,7 @@ it('is a redundant test', () => { }) ``` -### Cross-domain sessions +### Cross-domain sessions It's possible to switch domains while caching sessions, just be sure to explicitly visit the domain in your login command before calling `cy.session()`. @@ -662,15 +698,18 @@ always create a new session with a different `id`. In order to reduce development time, when running Cypress in "open" mode, sessions will be cached _for spec file reruns_. +To persist a session across multiple specs, use the option +`cacheAcrossSpecs=true`. + ### Explicitly clearing sessions -When running Cypress in "open" mode, you can explicitly clear all sessions and -re-run the spec file by clicking the "Clear All Sessions" button in the -[Instrument Panel](#The-Instrument-Panel). +When running Cypress in "open" mode, you can explicitly clear all spec and +global sessions and re-run the spec file by clicking the "Clear All Sessions" +button in the [Instrument Panel](#The-Instrument-Panel). -For debugging purposes, all sessions can be cleared with the +For debugging purposes, all spec and global sessions can be cleared with the [`Cypress.session.clearAllSavedSessions()`](/api/cypress-api/session) method. ### Where to call `cy.session()` @@ -811,9 +850,9 @@ panel is displayed at the top of the test to give more information about the state of your sessions. Clicking any session `id` in the panel will print that session's details to the -console, and clicking the "Clear All Sessions" button will clear all saved -sessions and re-run the spec file (see [Session caching](#Session-caching) for -more details). +console, and clicking the "Clear All Sessions" button will clear all saved spec +and global sessions and re-run the spec file (see +[Session caching](#Session-caching) for more details). From a0cca06d5ce14032a8348725460eedb527e47725 Mon Sep 17 00:00:00 2001 From: Ryan Duffy Date: Tue, 27 Sep 2022 05:36:50 -0700 Subject: [PATCH 10/15] Update browser launch options for env key (#4730) Co-authored-by: Lachlan Miller Co-authored-by: Paul Jaffre Co-authored-by: Emily Rohrbough Co-authored-by: Adam Murray Co-authored-by: Adam Murray --- content/_data/plugins.json | 24 ++++++--- content/api/plugins/browser-launch-api.md | 21 +++++++- .../component-framework-configuration.md | 51 +++++++++++++++++++ netlify.toml | 6 +++ 4 files changed, 94 insertions(+), 8 deletions(-) diff --git a/content/_data/plugins.json b/content/_data/plugins.json index 906279a290..9b13e2bb29 100644 --- a/content/_data/plugins.json +++ b/content/_data/plugins.json @@ -342,6 +342,13 @@ "link": "https://github.com/nils-hoyer/cypress-fail-on-console-error", "keywords": ["console", "error", "fail"], "badge": "community" + }, + { + "name": "Cypress Chrome Recorder Extension", + "description": "Official Cypress extension for Chrome DevTools that allows you to export Cypress tests directly from the Recorder panel.", + "link": "https://chrome.google.com/webstore/detail/cypress-chrome-recorder/fellcphjglholofndfmmjmheedhomgin", + "keywords": ["recording", "chrome", "extension", "devtools"], + "badge": "official" } ] }, @@ -608,7 +615,13 @@ "name": "cypress-forced-colors", "description": "Cypress commands to enable and disable browser forced colors mode", "link": "https://github.com/ling1726/cypress-forced-colors", - "keywords": ["forced colors", "high contrast", "high contrast mode", "contrast", "testing"], + "keywords": [ + "forced colors", + "high contrast", + "high contrast mode", + "contrast", + "testing" + ], "badge": "community" }, { @@ -650,12 +663,12 @@ "link": "https://picklejs.com", "keywords": ["cucumber", "collection", "actions", "commands"], "badge": "community" - }, + }, { "name": "Pact Cypress Adapter", "description": "Simple commands to generate Pact contracts from your existing Cypress tests, maintained by the Pactflow team", "link": "https://github.com/pactflow/pact-cypress-adapter", - "keywords": ["pact","pactflow", "contract testing", "commands"], + "keywords": ["pact", "pactflow", "contract testing", "commands"], "badge": "community" } ] @@ -961,10 +974,7 @@ "name": "Cypress Chrome Recorder", "description": "Tool for exporting Cypress Tests from Google Chrome DevTools' Recordings", "link": "https://github.com/cypress-io/cypress-chrome-recorder", - "keywords": [ - "visual testing", - "recorder" - ], + "keywords": ["visual testing", "recorder"], "badge": "experimental" } ] diff --git a/content/api/plugins/browser-launch-api.md b/content/api/plugins/browser-launch-api.md index b4db037704..2e60d61c1f 100644 --- a/content/api/plugins/browser-launch-api.md +++ b/content/api/plugins/browser-launch-api.md @@ -48,10 +48,11 @@ following properties: | `preferences` | `object` | An object describing browser preferences. Differs between browsers. See [Changing browser preferences](#Changing-browser-preferences) for details. | | `args` | `string[]` | An array of strings that will be passed as command-line args when the browser is launched. Has no effect on Electron. See [Modify browser launch arguments](#Modify-browser-launch-arguments) for details. | | `extensions` | `string[]` | An array of paths to folders containing unpacked WebExtensions to be loaded before the browser starts. Note: Electron currently only supports Chrome DevTools extensions. See [Add browser extensions](#Add-browser-extensions) for details. | +| `env` | `object` | An object of environment variables to pass to the launched browser. See [Configure browser environment](#Configure-browser-environment) for details. | ## Usage -### Modify browser launch arguments, preferences, and extensions +### Modify browser launch arguments, preferences, extensions, and environment Using the [setupNodeEvents](/guides/tooling/plugins-guide#Using-a-plugin) function you can tap into the `before:browser:launch` event and modify how @@ -120,6 +121,24 @@ on('before:browser:launch', (browser, launchOptions) => { ::: +#### Configure browser environment: + + +This option is not supported when targeting Electron. + + +:::cypress-plugin-example + +```js +on('before:browser:launch', (browser, launchOptions) => { + launchOptions.env.CUSTOM_ENV_VALUE = '1' + + return launchOptions +}) +``` + +::: + #### Changing browser preferences: Here are preferences available for the currently supported browsers: diff --git a/content/guides/component-testing/component-framework-configuration.md b/content/guides/component-testing/component-framework-configuration.md index 73a33b3c32..af54219aec 100644 --- a/content/guides/component-testing/component-framework-configuration.md +++ b/content/guides/component-testing/component-framework-configuration.md @@ -215,6 +215,15 @@ module.exports = defineConfig({ devServer: { framework: 'react', bundler: 'vite', + // optionally pass in vite config + viteConfig: require('./webpack.config'), + // or a function - the result is merged with + // any `vite.config` file that is detected + viteConfig: async () => { + // ... do things ... + const modifiedConfig = await injectCustomConfig(baseConfig) + return modifiedConfig + }, }, }, }) @@ -225,12 +234,22 @@ module.exports = defineConfig({ ```ts import { defineConfig } from 'cypress' +import customViteConfig from './customConfig' export default defineConfig({ component: { devServer: { framework: 'react', bundler: 'vite', + // optionally pass in vite config + viteConfig: customViteConfig, + // or a function - the result is merged with + // any `vite.config` file that is detected + viteConfig: async () => { + // ... do things ... + const modifiedConfig = await injectCustomConfig(baseConfig) + return modifiedConfig + }, }, }, }) @@ -260,6 +279,13 @@ module.exports = { bundler: 'webpack', // optionally pass in webpack config webpackConfig: require('./webpack.config'), + // or a function - the result is merged with any + // webpack.config that is found + webpackConfig: async () => { + // ... do things ... + const modifiedConfig = await injectCustomConfig(baseConfig) + return modifiedConfig + }, }, }, } @@ -279,6 +305,13 @@ export default defineConfig({ bundler: 'webpack', // optionally pass in webpack config webpackConfig, + // or a function - the result is merged with any + // webpack.config that is found + webpackConfig: async () => { + // ... do things ... + const modifiedConfig = await injectCustomConfig(baseConfig) + return modifiedConfig + }, }, }, }) @@ -472,6 +505,13 @@ module.exports = { bundler: 'webpack', // optionally pass in webpack config webpackConfig: require('./webpack.config'), + // or a function - the result is merged with any + // webpack.config that is found + webpackConfig: async () => { + // ... do things ... + const modifiedConfig = await injectCustomConfig(baseConfig) + return modifiedConfig + }, }, }, } @@ -491,6 +531,11 @@ export default defineConfig({ bundler: 'webpack', // optionally pass in webpack config webpackConfig, + webpackConfig: async () => { + // ... do things ... + const modifiedConfig = await injectCustomConfig(baseConfig) + return modifiedConfig + }, }, }, }) @@ -675,6 +720,12 @@ module.exports = { bundler: 'webpack', // optionally pass in webpack config webpackConfig: require('./webpack.config'), + // or a function - the result is merged with the base config + webpackConfig: async () => { + // ... do things ... + const modifiedConfig = await injectCustomConfig(baseConfig) + return modifiedConfig + }, }, }, } diff --git a/netlify.toml b/netlify.toml index 4af6967cfe..59c08f8175 100644 --- a/netlify.toml +++ b/netlify.toml @@ -148,6 +148,12 @@ to = "/guides/references/bundled-libraries" status = 301 force = true + +[[redirects]] + from = "/guides/references/bundled-tools.html" + to = "/guides/references/bundled-libraries" + status = 301 + force = true [[redirects]] from = "/guides/component-testing/props-vue" From 779f648983525f65151b1627e8590e611456f837 Mon Sep 17 00:00:00 2001 From: Chris Breiding Date: Tue, 27 Sep 2022 08:59:28 -0400 Subject: [PATCH 11/15] lint fix --- content/api/plugins/browser-launch-api.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/api/plugins/browser-launch-api.md b/content/api/plugins/browser-launch-api.md index 2e60d61c1f..25bc5a453c 100644 --- a/content/api/plugins/browser-launch-api.md +++ b/content/api/plugins/browser-launch-api.md @@ -48,7 +48,7 @@ following properties: | `preferences` | `object` | An object describing browser preferences. Differs between browsers. See [Changing browser preferences](#Changing-browser-preferences) for details. | | `args` | `string[]` | An array of strings that will be passed as command-line args when the browser is launched. Has no effect on Electron. See [Modify browser launch arguments](#Modify-browser-launch-arguments) for details. | | `extensions` | `string[]` | An array of paths to folders containing unpacked WebExtensions to be loaded before the browser starts. Note: Electron currently only supports Chrome DevTools extensions. See [Add browser extensions](#Add-browser-extensions) for details. | -| `env` | `object` | An object of environment variables to pass to the launched browser. See [Configure browser environment](#Configure-browser-environment) for details. | +| `env` | `object` | An object of environment variables to pass to the launched browser. See [Configure browser environment](#Configure-browser-environment) for details. | ## Usage From cba137b235520ecbfdee308c88686548f5b88cbd Mon Sep 17 00:00:00 2001 From: Chris Breiding Date: Tue, 27 Sep 2022 09:10:56 -0400 Subject: [PATCH 12/15] 10.9.0 Changelog (#4752) --- content/_changelogs/10.8.0.md | 6 +-- content/_changelogs/10.9.0.md | 70 +++++++++++++++++++++++++++++++++++ 2 files changed, 73 insertions(+), 3 deletions(-) create mode 100644 content/_changelogs/10.9.0.md diff --git a/content/_changelogs/10.8.0.md b/content/_changelogs/10.8.0.md index cf79a52c83..1c05c9626e 100644 --- a/content/_changelogs/10.8.0.md +++ b/content/_changelogs/10.8.0.md @@ -10,7 +10,7 @@ _Released 9/13/2022_ [`playwright-webkit`](https://www.npmjs.com/package/playwright-webkit). For more details, read [our blog post](https://www.cypress.io/blog/2022/09/13/cypress-10-8-experimental-run-tests-in-webkit). - Addressed [#17336](https://github.com/cypress-io/cypress/issues/6422). + Addresses [#6422](https://github.com/cypress-io/cypress/issues/6422). **Performance:** @@ -36,7 +36,7 @@ _Released 9/13/2022_ - Fixed a bug where projects using Node.js 16.17+ and 18.6+ with ES Modules and TypeScript were not working with Cypress. Fixes [#22795](https://github.com/cypress-io/cypress/issues/22795), - [#23393](https://github.com/cypress-io/cypress/issues/23393) and + [#23393](https://github.com/cypress-io/cypress/issues/23393), and [#23552](https://github.com/cypress-io/cypress/issues/23552). - When searching for specs we now normalize OS-specific path separators so that Windows users can use back- and forward-slashes. Fixes @@ -58,7 +58,7 @@ _Released 9/13/2022_ [#23357](https://github.com/cypress-io/cypress/issues/23357). - Fixed a regression introduced in Cypress [10.0.0](#10-0-0) where Cypress was incompatible with Chrome v64 - v70. Fixes - [#23509](https://github.com/cypress-io/cypress/issues/23644). + [#23509](https://github.com/cypress-io/cypress/issues/23509). - Fixes an issue where outdated organization and project information could be shown in dialogs when connecting a project to the Cypress Dashboard. Fixes [#23538](https://github.com/cypress-io/cypress/issues/23538). diff --git a/content/_changelogs/10.9.0.md b/content/_changelogs/10.9.0.md new file mode 100644 index 0000000000..9c7a94ef3a --- /dev/null +++ b/content/_changelogs/10.9.0.md @@ -0,0 +1,70 @@ +## 10.9.0 + +_Released 9/27/2022_ + +**Features:** + +- Added support for requiring dependencies within the + [`cy.origin()`](/api/commands/origin) callback. See the + [`Cypress.require()`](/api/cypress-api/require) and + [`cy.origin()`](/api/commands/origin#Dependencies-Sharing-Code) docs for more + information. +- Added support for visiting cross-origin pages outside of a + [`cy.origin()`](/api/commands/origin) callback. See the + [`cy.origin()`](/api/commands/origin#Alternative-navigation) and + [`cy.visit()`](/api/commands/visit#Visiting-cross-origin-sites) docs for more + information and caveats. Addresses + [#21485](https://github.com/cypress-io/cypress/issues/21485), + [#22282](https://github.com/cypress-io/cypress/issues/22282), + [#21300](https://github.com/cypress-io/cypress/issues/21300), and + [#23236](https://github.com/cypress-io/cypress/issues/23236). +- Added support for re-using session data cached by + [`cy.session()`](/api/commands/session) across specs via the + `cacheAcrossSpecs` option. Addresses + [#17710](https://github.com/cypress-io/cypress/issues/17710). +- Added support for advanced dev server configuration via an async function that + can optionally modify the dev server config. Addresses + [#23302](https://github.com/cypress-io/cypress/issues/23302). +- Launch options returned from the + [`before:browser:launch`](/api/plugins/browser-launch-api) event can now + include an `env` key that can be used to pass environment variables to the + browser when it is launched. Addressed by + [#23624](https://github.com/cypress-io/cypress/pull/23624). +- Component tests that fail now display a code frame of the source location of + the error within the Cypress reporter. Addresses + [#21720](https://github.com/cypress-io/cypress/issues/21720). + +**Bugfixes:** + +- The spec results printed stdout after a test run now show the path to the spec + and not just the file name. Fixes + [#22304](https://github.com/cypress-io/cypress/issues/22304). +- The viewport dropdown in the Cypress App now displays the correct text. Fixes + [#23789](https://github.com/cypress-io/cypress/issues/23789). +- Compile errors are now surfaced in the command log during tests for Angular + and Next projects. Fixes + [#23219](https://github.com/cypress-io/cypress/issues/23219). +- The error "Automatic publicPath is not supported in this browser" will no + longer be displayed when using Webpack 5 and dynamic imports. Fixes + [#18435](https://github.com/cypress-io/cypress/issues/18435). +- The correct source control link is now sent to the Cypress Dashboard for + failed specs when the cypress config file is not the project root. Fixes + [#22971](https://github.com/cypress-io/cypress/issues/22971). +- The error "Invalid left-hand-side in assignment" will no longer be thrown when + the `experimentalModifyObstructiveThirdPartyCode` flag is enabled. Fixes + [#23647](https://github.com/cypress-io/cypress/issues/23647). +- `it.skip` now functions correctly in Angular component tests. Fixes + [#23409](https://github.com/cypress-io/cypress/issues/23409). +- The `tsConfig` build option is now respected for Angular component tests. + Fixes [#23673](https://github.com/cypress-io/cypress/issues/23673). +- Configuring a custom browser no longer logs a warning when trying to use that + browser. Addressed in + [#23446](https://github.com/cypress-io/cypress/pull/23446). + +**Misc:** + +- Improved the accessibility of a few components within the Cypress Launchpad + and App. Addressed in + [#23745](https://github.com/cypress-io/cypress/pull/23745). +- Improved the UI of the Sessions instrument panel in the Cypress reporter. + Addresses [#21400](https://github.com/cypress-io/cypress/issues/21400). From 59809e4535f7b28141413884c0c21767bffeed94 Mon Sep 17 00:00:00 2001 From: Chris Breiding Date: Tue, 27 Sep 2022 12:21:54 -0400 Subject: [PATCH 13/15] updates from feedback --- content/api/commands/origin.md | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/content/api/commands/origin.md b/content/api/commands/origin.md index 6f09e76106..163f345f8a 100755 --- a/content/api/commands/origin.md +++ b/content/api/commands/origin.md @@ -251,7 +251,7 @@ Here the cross-origin page is visited prior to the `cy.origin` block, but any interactions with the window are performed within the block which can communicate with the cross-origin page -#### Incorrect usage +#### ** Incorrect Usage** ```js // Do things in primary origin... @@ -542,8 +542,8 @@ Cypress.Commands.add('clickLink', (label) => { `cypress/support/e2e.js`: ```js -// makes custom commands available to all Cypress tests, outside of -// cy.origin() callbacks +// makes custom commands available to all Cypress tests in this spec, +// outside of cy.origin() callbacks import './commands' // code we only want run per test, so it shouldn't be run as part of @@ -556,12 +556,17 @@ beforeEach(() => { `cypress/e2e/spec.cy.js`: ```js -it('tests somesite.com', () => { +before(() => { + // makes custom commands available to all subsequent cy.origin('somesite.com') + // calls in this spec. put it in your support file to make them available to + // all specs cy.origin('somesite.com', () => { - // makes custom commands available to all subsequent - // cy.origin('somesite.com') calls Cypress.require('../support/commands') + }) +}) +it('tests somesite.com', () => { + cy.origin('somesite.com', () => { cy.visit('/page') cy.clickLink('Click Me') }) From 5653543ab352b0a62ce3a66039c5da3209c29123 Mon Sep 17 00:00:00 2001 From: Chris Breiding Date: Tue, 27 Sep 2022 12:32:52 -0400 Subject: [PATCH 14/15] add missing link --- content/api/cypress-api/require.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/content/api/cypress-api/require.md b/content/api/cypress-api/require.md index efa0d7bb1b..f87b53b8f9 100644 --- a/content/api/cypress-api/require.md +++ b/content/api/cypress-api/require.md @@ -53,7 +53,9 @@ cy.origin('somesite.com', callback) ## Examples -See [`cy.origin()` Dependencies / Sharing Code]() for example usages. +See +[`cy.origin()` Dependencies / Sharing Code](/api/commands/origin#Dependencies-Sharing-Code) +for example usages. ## Limitations From 58d9d341fa2b3eef33bdda51ab23e30811d36f1d Mon Sep 17 00:00:00 2001 From: Chris Breiding Date: Tue, 27 Sep 2022 12:39:00 -0400 Subject: [PATCH 15/15] remove bold from heading --- content/api/commands/origin.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/api/commands/origin.md b/content/api/commands/origin.md index 163f345f8a..0f620fee82 100755 --- a/content/api/commands/origin.md +++ b/content/api/commands/origin.md @@ -251,7 +251,7 @@ Here the cross-origin page is visited prior to the `cy.origin` block, but any interactions with the window are performed within the block which can communicate with the cross-origin page -#### ** Incorrect Usage** +#### Incorrect Usage ```js // Do things in primary origin...