This repo contains various recipes for testing common scenarios using Cypress: Fundamentals, Testing the DOM, Logging in, Preprocessors, Blogs, Stubbing and spying, Unit Testing, Server Communication
| Recipe | Description | 
|---|---|
| Node Modules | Import your own node modules | 
| Environment variables | Passing environment variables to tests | 
| Dynamic tests | Create tests dynamically from data | 
| Fixtures | Loading single or multiple fixtures | 
| Adding Chai Assertions | Add new or custom chai assertions | 
| Cypress module API | Run Cypress via its module API | 
| Recipe | Description | 
|---|---|
| Tab Handling and Links | Links that open in a new tab | 
| Hover and Hidden Elements | Test hidden elements requiring hover | 
| Form Interactions | Test form elements like input type range | 
| Drag and Drop | Use .trigger()to test drag and drop | 
| Recipe | Description | 
|---|---|
| Single Sign On | Log in across multiple servers or providers | 
| HTML Web Forms | Log in with a basic HTML form | 
| XHR Web Forms | Log in using an XHR | 
| CSRF Tokens | Log in with a required CSRF token | 
Also see Authentication plugins and watch video "Organizing Tests, Logging In, Controlling State"
| Recipe | Description | 
|---|---|
| grep | Filter tests by name using Mocha-like grepsyntax | 
| Typescript with Browserify | Add typescript support with browserify | 
| Typescript with Webpack | Add typescript support with webpack | 
Demo recipes from the blog posts at www.cypress.io/blog
| Recipe | Description | 
|---|---|
| Application Actions | Application actions are a replacement for Page Objects | 
| Direct Control of AngularJS | Bypass the DOM and control AngularJS | 
| E2E API Testing | Run your API Tests with a GUI | 
| E2E Snapshots | End-to-End Snapshot Testing | 
| Element Coverage | Track elements covered by tests | 
| Codepen.io Testing | Test a HyperApp Codepen demo | 
| Testing Redux Store | Test an application that uses Redux data store | 
| Vue + Vuex + REST Testing | Test an application that uses central data store | 
| A11y Testing | Accessability testing with cypress-axe | 
| Recipe | Description | 
|---|---|
| Stubbing Functions | Use cy.stub()to test function calls | 
| Stubbing window.fetch | Use cy.stub()to control fetch requests | 
| Stubbing methods called on window | Use cy.stub()for methods called onwindow | 
| Stubbing Google Analytics | Use cy.stub()to test Google Analytics calls | 
| Recipe | Description | 
|---|---|
| Application Code | Import and test your own application code | 
| React | Test your React components in isolation | 
| File Upload in React | Test file upload in React app | 
| Recipe | Description | 
|---|---|
| Bootstrapping your App | Seed your application with test data | 
| Seeding your Database in Node | Seed your database with test data | 
- This repo is structured similar to how other "Monorepos" work.
- Each example projecthas it's own Cypress configuration, tests, backend and frontend assets.
- Each of these example projectsshare a single "root" Cypress that is installed in the rootnode_modulesfolder.
- This structure looks different from normal projects, but its the easiest way to manage multiple projects without installing Cypress independently for each one.
## install all dependencies
npm installcd ./examples/testing-dom__drag-drop
# start local server
npm start &
# and open Cypress GUI
npm run cypress:openSame as running Cypress GUI but with cypress run command (and any CLI arguments)
cd ./examples/testing-dom__drag-drop
# start local server
npm start &
# run Cypress tests headlessly
npm run cypress:run
### runs all example projects in specific browser
### similar to cypress run --browser <name>
npm run cypress:run -- --browser chrome
### sends test results, videos, screenshots
### to Cypress dashboard
npm run cypress:run -- --record- Import ES2015 modules.
- Require CommonJS modules.
- Organize reusable utility functions.
- Import 3rd party node_modules.
- Login when authentication is done on a 3rd party server.
- Parse tokens using cy.request().
- Manually set tokens on local storage.
- Map external hosts and point to local servers.
- Test a standard username/passwordHTML form.
- Test errors submitting invalid data.
- Test unauthenticated redirects.
- Authenticate users with cookies.
- Create a custom cy.login()test command.
- Bypass needing to use your actual UI.
- Increase speed of testing with cy.request().
- Test an AJAX backed username/passwordform.
- Test errors submitting invalid data.
- Stub JSON based XHR requests.
- Stub application functions.
- Create a custom cy.login()test command.
- Bypass needing to use your actual UI.
- Increase speed of testing with cy.request().
- Use cy.request()to get around CSRF protections.
- Parse CSRF tokens out of HTML.
- Parse CSRF tokens out of response headers.
- Expose CSRF via a route.
- Disable CSRF when not in production.
- Test anchor links opening in new tabs: <a target="_blank">.
- Test anchor links that link to external domains: <a href="...">.
- Prevent content from opening in a new tab.
- Request external content that would open in a new tab using cy.request().
- Speed up tests by reducing loading times.
- Interact with elements that are hidden by CSS.
- Use .invoke()and.trigger()to simulate hovering.
- Trigger mouseover,mouseout,mouseenter,mouseleaveevents. Get around the lack of a.hover()command.
- Use .invoke()and.trigger()to test a range input (slider).
- Use .trigger()to test drag-n-drop that uses mouse events.
- Use .trigger()to test drag-n-drop that uses drag events.
- Use cypress-file-uploadfor file upload testing with drag-n-drop.
- Use Mocha-like syntax to select tests to run
- Implemented as a preprocessor cypress-select-tests
- Use @cypress/browserify-preprocessorto write Cypress tests in Typescript
- Use @cypress/webpack-preprocessorto write Cypress tests in Typescript
- Lint TypeScript spec code against Cypress type definitions
This demo shows the cypress-axe plugin which can run the Axe-core library against the webpage to check if the page follows accessibility practices.
- Invoke methods on the application's model object
- Avoid code duplication and need to create page object hierarchy
- Run e2e very quickly by skipping UI unless testing that specific UI feature
- Blog article written here
- Programmatically control AngularJS
- Bypass the DOM, update scopes directly
- Create custom command for controlling services
- Blog article written here
- Use cy.request()to perform API Testing
- Use the Cypress GUI to help debug requests
- Blog post End-to-End Snapshot Testing
- Adding .snapshot()command by requiring 3rd party module
- Capturing and saving snapshots of primitive values
- Testing central data Vuex store using snapshots
- Making assertions against a DOM element with cy.get('...').snapshot()
- Blog post
- Load Codepen and get around iframe security restrictions.
- Use cy.request()to load a document into test iframe.
- Test HyperApp.js application through the DOM and through actions.
- Blog post Element coverage
- Overwrite several built-in Cypress commands like cy.typeandcy.click
- Draw elements after the tests finish
- control application via DOM and check that Redux store has been properly updated
- drive application by dispatching Redux actions
- use Redux actions directly from tests
- load initial Redux state from a fixture file
- Blog post
- Test a Vue.js web application that uses central data store
- Mock REST calls to the server
- Dispatch actions to the Vuex store
- Test text file upload
- Use cy.stub()to stub dependencies in a unit test.
- Handle promises returned by stubbed functions.
- Handle callbacks in stubbed functions.
- Use cy.spy()to verify the behavior of a function.
- Use cy.stub()to verify and control the behavior of a function.
- Use cy.clock()andcy.tick()to control time.
- Stub window.fetchto control server responses.
- Replace window.fetchwith a polyfill that uses XHR and is loaded only for tests.
- Delete window.fetchduring specific visit or every window load.
- Use cy.spy()to testwindow.openbehavior.
- Use blacklistHoststo block Google Analytics from receiving requests.
- Use cy.stub()to verify thatwindow.ga(...)was called with the correct arguments
- Unit test your own application code libraries.
- Import modules using ES2015.
- Test simple math functions.
- Test the canonical fizzbuzz test.
- Automatically retry assertion until a given property inside an object:
- is added or deleted
- has expected value
 
- Unit test a React JSX Component using Enzyme, react-testing-library and cypress-react-unit-test libraries.
- Passing synthetic test file to upload via an .trigger('change')event
- Stub remote server using cy.route()
- Alternatively stub axios.postmethod usingcy.stub()
- Alternatively use cypress-file-uploadfor file upload testing.
- Extend chaiwith thechai-date-stringassertion plugin.
- Extend chaiwith thechai-colorsassertion plugin.
- Globally extend chaifor all specs.
- Set up Intelligent Code completion for custom assertions.
- Run Cypress tests using its Node module API
require('cypress').run({
  // options
}).then(testResults => {
  // rerun failing specs
  // or email test report
  // or post it on Slack
  // ...
})- Use cy.visit()onBeforeLoadcallback.
- Start your application with test data.
- Stub an XHR to seed with test data.
- Wait on an XHR to finish.
- Use cy.task()to communicate with node via thepluginsFile.
- Seed your database with test data.
- Wrap your pluginsFileso you can require files that use ES modules (import/export).
- Pass values via envobject incypress.json.
- Pass any variable that starts with CYPRESS_.
- Extract any other variable from process.envusingcypress/plugins/index.jscallback.
- Run the same test against different viewport resolutions
- Run the same test against multiple subdomains
- Generate tests based on the fetched data
- loading a single fixture file or multiple fixtures in multiple ways
See Development.md