View all files | ||||
Cypress based cypress-io/github-action runs End-to-End or Component tests in GitHub Actions Continuous Integration (CI) workflows, optionally recording to Cypress Cloud
In addition to running Cypress tests, the action includes dependency installation, caching and more:
| Single-line call | Simplified use by installing dependencies and running Cypress in one line of workflow code |
| Build app, Start server and Wait for server options | Convenience of app, server and test coordination |
| cypress run CLI type options | Improved readability with vertically listed workflow options |
| Dependency installation based on npm, pnpm and Yarn Classic lock files | Reduced command complexity |
| Caching of Cypress binary and dependencies for npm and Yarn Classic installations | Reduced download bandwidth requirements |
| Job summary | Fast access to results overview |
| Docker compatibility | Improved independence from GitHub-hosted runner image version changes. Fixed Docker environments can be used. |
| Recording to Cypress Cloud compatibility including parallel execution | Improved interpretation of test results through Cypress Cloud |
| Live examples | Speeds up introduction and troubleshooting |
| Yarn Modern usage and cache examples | Extends usage beyond Yarn Classic |
| pnpm cache examples | Reduced download bandwidth requirements for pnpm |
| Debug enabled | Improved workflow troubleshooting |
| Ping utility | Improved server reachability troubleshooting |
The following examples demonstrate the actions' functions.
Examples contained in this repository, based on current Cypress versions, can be found in the examples directory.
Live examples, such as example-basic.yml are shown together with a status badge. Click on the status badge to read the source code of the workflow, for example
Note: this package assumes that cypress is declared as a development dependency in the package.json file. The cypress npm module is required to run Cypress via its Module API.
The workflow file example-basic.yml shows how Cypress runs on GH Actions using Ubuntu (22.04 and 24.04), Windows, and macOS without additional OS dependencies necessary.
This workflow uses the default test type of End-to-End (E2E) Testing. Alternatively, Component Testing can be utilized by referencing the Component Testing section below.
To use Cypress Component Testing add component: true
See the example project component-tests and the example-component-test.yml workflow for more details.
Best practice:
Our examples specify using branch v7 which is the action's recommended major version:
When using cypress-io/github-action@v7 from your workflow file, you will automatically use the latest tag from branch v7.
Alternatively, to mitigate unforeseen breaks, bind to a specific tag, for example:
The changes associated with each tag are shown under GitHub's releases list. Refer also to the CHANGELOG for an overview of major changes.
The workflows in the examples directory use the latest commit from the repo's current branch. This allows all tests to run in CI before release. If you copy any of the examples to your own repo, you should replace ./ and specify instead the action and version as described above.
Specify the browser name or path with the browser parameter. The default browser, if none is specified, is the built-in Electron browser.
To install Google Chrome for Testing, specify a partial or full numerical Chrome for Testing version using browser-actions/setup-chrome. Refer to Chrome for Testing availability for current versions or JSON API endpoints for all available versions.
Run the browser in headed mode - as of Cypress v8.0 the cypress run command executes tests in headless mode by default
You can run the action in a Docker container.
Replace the latest tag with a specific version image tag from cypress/browsers on Docker Hub to avoid breaking changes when new images are released (especially when they include new major versions of Node.js).
Include options: --user 1001 to avoid permissions issues.
When using cypress/included Docker images, set the environment variable CYPRESS_INSTALL_BINARY=0 to suppress saving the Cypress binary cache, otherwise cache restore errors may occur. The example below shows how to do this:
Refer to cypress-io/cypress-docker-images for further information about using Cypress Docker images. Cypress offers the Cypress Docker Factory to generate additional Docker images with selected components and versions.
Specify the env argument with env parameter
When passing the environment variables this way, unfortunately due to GitHub Actions syntax, the variables should be listed in a single line, which can be hard to read. As an alternative, you can use the step's env block where every variable can be set on its own line. In this case, you should prefix every variable with CYPRESS_ because such variables are loaded by Cypress automatically. The above code example is equivalent to:
For more examples, see the workflows below, using environment variables for recording.
Specify the expose argument with expose parameter. Expose variables are for non-sensitive, public config values that are synchronous and exposed to the browser (requires Cypress 15.10.0 or later).
For more information, see Cypress.expose() in the Cypress documentation.
Specify the spec files to run with spec parameter
You can pass multiple specs and wild card patterns using multi-line parameter, see example-config.yml:
For more information, visit the Cypress command-line docs.
Specify the project to run with the project parameter
The project parameter may be used to pass on the location of a sub-directory containing a Cypress configuration file and Cypress tests specs. For more information, visit the Cypress command-line docs.
A package manager lock file, including Cypress, must be provided in the root of the repository so that the action is able to install Cypress.
If the parameter working-directory is also defined, then this is the location to place the package manager lock file, and the project directory would be a subdirectory of the working-directory. The project parameter location may not be above the level of a specified working-directory in the file hierarchy.
By setting the parameter record to true, you can record your test results into Cypress Cloud. Read the Cypress Cloud setup documentation to learn how to sign up to Cypress Cloud, to create and set up a Cloud project to get the required projectId and record key for recording.
The projectId can either be stored in the Cypress Configuration File or passed to the action as an environment variable CYPRESS_PROJECT_ID. In the example below, it is retrieved from a GitHub secret variable.
The record key is passed to the action as an environment variable CYPRESS_RECORD_KEY. We recommend you treat this value as sensitive and store it as a GitHub secret variable, so that access is restricted.
We recommend passing the GITHUB_TOKEN secret (created by the GH Action automatically) as an environment variable. This will allow correctly identifying every build and avoid confusion when re-running a build.
Cypress uses the @cypress/commit-info package to associate Git details (branch, commit message, author) with each run. It typically uses Git commands, expecting a .git folder. In Docker or similar environments where .git is absent, or if you need different data in the Cypress Cloud, Git information can be passed via custom environment variables.
Please refer to the Cypress Cloud Git information environment variables section in our documentation for more examples.
Please refer to the default GitHub environment variables for additional GitHub examples.
When recording runs to Cypress Cloud, the PR number and URL can be automatically detected if you pass GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} via the workflow env. When set, this value enables the Action to perform additional logic that grabs the related PR number and URL (if they exist) and sets them in the environment variables CYPRESS_PULL_REQUEST_ID and CYPRESS_PULL_REQUEST_URL, respectively.
Example workflow using the variables:
For either of these events, we set CYPRESS_PULL_REQUEST_ID and CYPRESS_PULL_REQUEST_URL to that of the PR number and URL, respectively, of the PR that triggered the workflow.
When a commit on a branch without a PR is made, the Cypress GitHub Action checks to see if the commit that triggered the workflow has a related PR. If the commit exists in any other PRs, it's considered a related PR. When there are related PRs, we grab the first related PR and use that PR's number and URL for CYPRESS_PULL_REQUEST_ID and CYPRESS_PULL_REQUEST_URL, respectively.
If no related PR is detected, CYPRESS_PULL_REQUEST_ID and CYPRESS_PULL_REQUEST_URL will be undefined.
We recommend using the action with on: push rather than on: pull_request or on: merge_group for more accurate commit information in Cypress Cloud. When running on pull_request or merge_group, the commit message defaults to "merge SHA into SHA". You can overwrite the commit message sent to Cypress Cloud by setting an environment variable.
See issue 124 for details.
You can pass a single or multiple tags when recording a run. For example
The recording will have tags as labels on the run.
You can pass multiple tags using commas like tag: node-22,nightly,staging.
Specify the number of failed tests that will cancel a run when using the Cypress Cloud Auto Cancellation feature.
This feature requires Cypress 12.6.0 or later and a Cypress Cloud Business or Enterprise account.
See Auto Cancellation for more information.
If you don't record the test run on Cypress Cloud, you can still store generated videos and screenshots as CI artifacts. See the workflow example below.
You can provide quiet flag for cypress run to silence any Cypress specific output from stdout
Specify configuration values with config parameter
Specify the path to your Configuration File with config-file parameter
Note: Cypress parallelization requires a Cypress Cloud account.
You can spin multiple containers running in parallel using strategy: matrix argument. Just add more dummy items to the containers: [1, 2, ...] array to spin more free or paid containers. Then use record and parallel parameters to load balance tests.
The Cypress GH Action does not spawn or create any additional containers - it only links the multiple containers spawned using the matrix strategy into a single logical Cypress Cloud run where it splits the specs amongst the machines. See the Cypress Cloud Smart Orchestration guide for a detailed explanation.
If you use the GitHub Actions facility for Re-running workflows and jobs, note that Re-running failed jobs in a workflow is not suited for use with parallel recording into Cypress Cloud. Re-running failed jobs in this situation does not simply re-run failed Cypress tests. Instead it re-runs all Cypress tests, load-balanced over the containers with failed jobs.
To optimize runs when there are failing tests present, refer to optional Cypress Cloud Smart Orchestration Premium features:
During staged rollout of a new GitHub-hosted runner version, GitHub may provide a mixture of current and new image versions used by the container matrix. It is recommended to use a Docker image in the parallel job run which avoids any Cypress Cloud errors due to browser major version mismatch from the two different image versions. A Docker image is not necessary if testing against the default built-in Electron browser because this browser version is fixed by the Cypress version in use and it is unaffected by any GitHub runner image rollout.
Component Testing and End-to-End (E2E) Testing types can be combined in the same job using separate steps
See the example project component-test and the example-component-test.yml workflow for more details.
You can run a build step before starting tests
If your tests run against a local server, use the start parameter to start your server. The server will run in the background.
Caution: use the start parameter only to start a server, not to run Cypress, otherwise tests may be run twice. The action runs Cypress tests by default, unless the parameter runTests is set to false.
Note: sometimes on Windows you need to run a different start command. You can use the start-windows parameter for this.
Note: A server continues to run until the end of the GitHub workflow job that started it. At the end of the job the GitHub workflow runner executes a "Complete job" phase automatically where it terminates any server processes which are still running.
You can start multiple server processes. For example, if you have an API to start using npm run api and the web server to start using npm run web you can put those commands in start using comma separation.
You can place the start commands in separate lines
If you are starting a local server and it takes a while to start, you can add a parameter wait-on and pass url to wait for the server to respond.
By default, wait-on will retry for 60 seconds. You can pass a custom timeout in seconds using wait-on-timeout.
You can wait for multiple URLs to respond by separating urls with a comma
The action will wait for the first url to respond, then will check the second url, and so on.
You can even use your own command (usually by using npm, yarn, npx) to wait for the server to respond. For example, if you want to use the wait-on utility to ping the server and run the Cypress tests after the server responds:
See example-wait-on.yml workflow file.
If this action times out waiting for the server to respond, please see Debugging section in this README file.
The action installs dependencies based on a package manager lock file using default commands described in the Installation section below. If you want to overwrite the default install command you can use the install-command option:
See example-install-command.yml workflow file.
If you do not commit a lock file to the repository, you cannot use the action to install dependencies. In this case you must ensure that dependencies are installed before using the action, and you must use the action option setting install: false.
You can prefix a test command using the command-prefix parameter. This is useful, for example, when running BrowserStack Percy, which requires the test command to be prefixed with percy exec --. When this parameter is used, the action constructs and executes a CLI command using npx in the following form:
where the <command-prefix> is the literal string value from the command-prefix parameter and <cli run options> are put together from action parameters such as the value of the browser parameter. The complete constructed command is shown in the logs. For the example below, this is shown as:
Since command-prefix is run using npx, it is compatible with npm and Yarn Classic. It may also be used with pnpm and Yarn Modern when they are configured for nodeLinker compatibility with the node_modules directory structure of npm. An alternative to using command-prefix is to pass a complete command parameter instead, including the exact command to be passed to the CLI.
If command-prefix is used, then no job summary is produced, since it runs Cypress with a CLI cypress run command instead of using the Cypress Module API. The command parameter overrides the command-prefix parameter, preventing these two parameters from being used together.
The command parameter executes a CLI command using the GitHub @actions/exec action.
This parameter is useful for special test cases, for example:
If you don't have a special case and you just need to convert a cypress run CLI command to use the Cypress GitHub Action, refer to the section Migrating from CLI command which explains how to map CLI options to equivalent action parameters, avoiding the need for the command parameter in most cases.
There are some parameters that cannot be used together with the command parameter, and these are ignored. The parameters include action input parameters listed in the table CLI Run Option / Action Parameter, the publish-summary, summary-title and command-prefix. If any such parameters are passed to the action, a warning message appears in the logs that the parameters have been ignored.
Correct example snippet:
You can overwrite ci-build-id used to link separate machines running tests into a single parallel run.
Tip: see Learn GitHub Actions, with sections on Expressions, Contexts and Environment variables.
If you re-run the GitHub workflow, if you use the same custom build id during recording, Cypress Cloud will cancel the run with "Build already finished" error. To avoid this, you need to generate a new custom build id on every workflow re-run. A good solution showing in the example-custom-ci-build-id.yml file is to run a common job first that just generates a new random ID. This ID can be used by the testing jobs to tie the build together. If the user re-runs the workflow a new unique build id is generated, allowing recording the new Cypress Cloud run.
See the example-custom-ci-build-id.yml for the full workflow.
In a monorepo, the end-to-end or component test might be placed in a different sub-folder from the application itself. This sub-folder is the Cypress "working directory" which you can specify using the working-directory parameter.
In the following example of a directory layout for end-to-end testing, the Cypress working directory is app-test. The working directory contains the Cypress tests and a package manager lock file:
We use working-directory: app-test to match the above example directory structure:
See the Cypress documentation Folder structure section for examples of standard directory layouts, covering end-to-end testing and component testing with both JavaScript and TypeScript options.
Each of the examples in this monorepo is separated from other examples by using different working directories. See example-basic.yml for one end-to-end test example using the parameter working-directory and example-component-test.yml for a component test example.
Sometimes the application under test and the Cypress end-to-end tests may have separately defined dependencies. In the example below, Cypress has its own package.json file in a subfolder:
In this case you can first install the dependencies for the application (npm ci), then start the application server (npm start) before calling cypress-io/github-action to install the dependencies for Cypress and to run Cypress. You may also need to use the wait-on parameter to make sure that the app server is fully available.
The package manager pnpm is not pre-installed in GitHub Actions runner images (unlike npm and Yarn Classic) and so it must be installed in a separate workflow step (see below). If the action finds a pnpm-lock.yaml file, it uses the pnpm command pnpm install --frozen-lockfile by default to install dependencies.
The example below follows pnpm recommendations for installing pnpm and caching the pnpm store. Follow the Cypress pnpm configuration instructions and apply them to your project, to enable pnpm to install the Cypress binary.
The action does not directly support using pnpm workspaces (see feature request #1144). As a workaround, you can install dependencies and run Cypress tests in a workspace in separate steps. The snippet below shows this principle.
See the example project start-and-pnpm-workspaces and the example-start-and-pnpm-workspaces.yml workflow for a full working example.
If a yarn.lock file is found, the action uses the Yarn 1 (Classic) command yarn --frozen-lockfile by default to install dependencies.
To install dependencies using a yarn.lock file from Yarn Modern (Yarn 2 and later) you need to override the default Yarn 1 (Classic) installation command yarn --frozen-lockfile. You can do this by using the install-command parameter and specifying yarn install as in the example below.
The action supports built-in caching of Yarn Classic dependencies only. To cache Yarn Modern dependencies additionally use actions/setup-node and specify cache: yarn.
This example covers the .yarnrc.yml configuration nodeLinker: node-modules which Yarn uses by default for projects updated from Yarn Classic. For nodeLinker: pnp see Yarn Plug'n'Play below. (Note that github-action is not compatible with the nodeLinker: pnpm setting.)
When using Yarn Modern (Yarn 2 and later) with Plug'n'Play enabled, you will need to use the command parameter to run yarn instead of npx.
See the above Yarn Modern section for information on caching Yarn Modern dependencies.
This example covers the .yarnrc.yml configuration when nodeLinker is undefined or set to nodeLinker: pnp corresponding to Yarn Plug'n'Play. Yarn uses this by default for projects newly created with Yarn Modern.
Caution: using the action parameter command causes multiple other parameters to be ignored. See command section for more information.
This action should discover the Yarn workspaces correctly. For example, see folder examples/start-and-yarn-workspaces and workflow file example-start-and-yarn-workspaces.yml
When the action installs dependencies, it caches the package manager cache from npm or from Yarn 1 (Classic) by default, based on the lockfile it discovers. If package manager caching is implemented separately from the action, for example to work with Yarn Modern or pnpm, then disable the actions' package manager caching by setting the parameter package-manager-cache to false.
GitHub's actions/setup-node offers a convenient way to install a chosen version of Node.js and to set up caching of package manager caches in one step.
Sometimes the default cache key does not work. For example, if you cannot share the Node modules across Node versions due to native extensions. In that case pass your own cache-key parameter.
You can run your tests across multiple Node versions.
See the Node.js section for information about supported versions and usage of Node.js.
Sometimes you may want to run additional commands between installation and tests. To enable this use the install and runTests parameters.
See cypress-gh-action-monorepo for a working example.
If your test job(s) first need a build step, you can split the jobs into a separate build job followed by test jobs. You pass the build results to any subsequent jobs using GitHub Actions artifacts.
In the build job, use upload-artifact to store the build results, then in subsequent jobs use download-artifact to restore them.
Your tests jobs may use a GitHub Actions matrix strategy, such as when recording to Cypress Cloud with parallel jobs.
Finally, you might not need this GH Action at all. For example, if you want to split the npm dependencies installation from the Cypress binary installation, then it makes no sense to use this action. Instead you can install and cache Cypress yourself.
If the project has many dependencies, but you want to install just Cypress you can combine this action with actions/cache and npm i cypress commands yourself.
You can tell the CI to stop the job or the individual step if it runs for longer then a given time limit. This is a good practice to ensure the hanging process does not accidentally use up all your CI minutes.
| cypress-io/cypress-example-kitchensink | Runs every API command in Cypress using various CI platforms including GitHub Actions |
| cypress-io/cypress-realworld-app | A real-world example payment application. Uses GitHub Actions and CircleCI. |
To migrate from Cypress CLI run command options to Cypress GitHub Action parameters, check the CLI Run Option / Action Parameter table below. In most cases, the name of the action parameter is the same as the long form of the cypress run CLI option.
Create a GitHub Actions workflow referring to Workflow syntax for GitHub Actions. The action cypress-io/github-action@v7 is invoked with the uses keyword. Cypress GitHub Action input parameters are specified under the with keyword.
If you have previously been using a CLI command to run Cypress locally or in a CI environment, you will be familiar with testing commands like this:
or you may be using a script defined in your project's package.json file, such as:
Here is the equivalent GitHub Actions example workflow. The action runs Cypress by passing the action parameters (browser and spec) programmatically to the Cypress Module API without using any CLI. The complete workflow also checks out the repo and installs dependencies before running Cypress.
| --auto-cancel-after-failures | auto-cancel-after-failures | Set the failed test threshold for auto cancellation or disable auto cancellation for Cloud recording |
| --browser, -b | browser | Select browser that Cypress runs in. A filesystem path to a browser can also be used. |
| --ci-build-id | ci-build-id | Specify a unique identifier for a run to enable grouping or parallelization for Cloud recording |
| --component | component | Run component tests |
| --config, -c | config | Specify configuration |
| --config-file, -C | config-file | Specify configuration file |
| --e2e | component: false (default) | Run end to end tests |
| --env, -e | env | Specify environment variables |
| --expose, -x | expose | Specify expose variables for non-sensitive, public config values |
| --group | group | Group recorded tests together under a single run for Cloud recording |
| --headed | headed | Display the browser instead of running headlessly |
| --headless | headed: false (default) | Hide the browser instead of running headed |
| --parallel | parallel | Run recorded specs in parallel across multiple machines for Cloud recording |
| --project, -P | project | Path to a specific project |
| --quiet, -q | quiet | Reduce output to stdout |
| --record | record | Record the test run to Cypress Cloud |
| --spec, -s | spec | Specify the spec files to run |
| --tag, -t | tag | Identify a run with a tag or tags |
There is no equivalent action parameter for the CLI options help, key, --no-exit, --no-runner-ui, port, reporter, reporter-options or runner-ui. See the section Record test results on Cypress Cloud for information on passing a Cypress Cloud record key to the action.
This action installs local dependencies using lock files. Ensure that exactly one type of lock file is used at the root of the repo or in each working-directory of a monorepo from the following supported package managers:
| package-lock.json | npm | npm ci |
| pnpm-lock.yaml | pnpm | pnpm install --frozen-lockfile |
| yarn.lock | Yarn Classic | yarn --frozen-lockfile |
See section Yarn Modern for information about using Yarn version 2 and later.
When the action installs dependencies, it also caches these where possible using GitHub Actions @actions/cache.
The Cypress binary is saved to the $HOME/.cache/Cypress directory or to a location defined by the environment variable CYPRESS_CACHE_FOLDER. This location is then cached by GitHub Actions and carries the cache label cypress-<platform-and-architecture>-hash.
Based on the package manager lock file, the action caches the following package manager cache locations:
| package-lock.json | npm | $HOME/.npm |
| yarn.lock | Yarn Classic | $HOME/.cache/yarn |
The cache carries the label npm-<platform-and-architecture>-hash. In the cache label, npm refers to the npm public registry at https://registry.npmjs.org from which both the above package managers download npm modules by default.
Note that the Cypress GitHub action does not include any built-in caching for pnpm and Yarn Modern. GitHub Actions however provides actions/setup-node which includes functionality to optionally cache npm, Yarn and pnpm dependencies. This can be added to any GitHub Actions workflow if needed. Examples are shown above for pnpm and Yarn Modern.
This action uses the debug module to output additional verbose logs. You can see these debug messages by setting the following environment variable:
You can set the environment variable using GitHub UI interface, or in the workflow file:
See the example-debug.yml workflow file.
To collect more verbose GitHub Action logs you can set a GitHub secret or variable ACTIONS_STEP_DEBUG to true. This is useful to see detailed caching steps. See Enabling debug logging from GitHub Actions documentation for more information.
To see all Cypress debug logs, add the environment variable DEBUG to the workflow using the value cypress:*:
Replace the value cypress:* with specific Cypress log sources to filter debug log output.
If you have a problem with wait-on not working, you can check the src/ping.js logic from the local machine.
For example:
You can also enable debug logs by setting the environment variable DEBUG='@cypress/github-action', for example:
Each of the example-* workflows in the .github/workflows directory is configured to trigger on a workflow_dispatch event. This allows any of these workflows to be run manually.
Fork and clone this repository to try out the examples live in your own repository copy. Refer to the GitHub Actions documentation Manually running a workflow which explains how to run a workflow from the Actions tab on GitHub. Workflows can also be run using the GitHub CLI or the REST API.
If you configure a workflow_dispatch event in your own workflows, you will be able to run them manually in the same way.
This action sets a GitHub step output resultsUrl if the run was recorded on Cypress Cloud using the action parameter setting record: true (see Record test results on Cypress Cloud). Note that if a custom test command with the command parameter or the command-prefix parameter are used then no resultsUrl step output is saved.
This is an example of using the step output resultsUrl:
The GitHub step output dashboardUrl is deprecated. Cypress Dashboard is now Cypress Cloud.
Note: every GitHub workflow step can have outcome and conclusion properties. See the GitHub Contexts documentation section steps context. In particular, the outcome or conclusion value can be success, failure, cancelled, or skipped which you can use in any following steps.
Sometimes you might want to print Cypress and OS information, like the list of detected browsers. You can use the cypress info command for this.
If you are NOT using the build command in your project, you can run the cypress info command:
If you are already using the build parameter, you can split the installation and the test steps and insert the cypress info command in between:
Sometimes you want to execute the workflow on a schedule. For example, to run Cypress tests nightly, you can schedule the workflow using cron syntax:
By default, the action produces a job summary in the GitHub Actions log for each workflow step where github-action is used. Each job summary shows a Passing / Failing status, the test counts for Passed, Failed, Pending & Skipped, followed by the Duration of the run. The job summaries are grouped by job.
To specify a title for a Job Summary, use the parameter summary-title. If no title is specified, then the default "Cypress Results" is used:
The name of the GitHub Actions job is shown at the top of one or more job summaries from the same job. If multiple summaries belong to the same job, then giving them separate titles allows them to be uniquely identified.
See the example-chrome.yml workflow, with multiple calls to cypress-io/github-action in one job, making use of the summary-title parameter. View the example-chrome.yml - actions log for an example of the resulting job summaries.
The default job summary can be suppressed by using the parameter publish-summary and setting its value to false.
Node.js is required to run this action. The recommended version v7 supports:
and is generally aligned with Node.js's release schedule.
github-action command-type options such as install-command, build, start and command are executed with the runner's version of Node.js. You can use GitHub's actions/setup-node to install an explicit Node.js version into the runner.
Cypress itself runs with a fixed Node.js version specified by the runs.using parameter of action.yml. github-action@v7 uses node24.
View the CHANGELOG document for an overview of version changes.
Cypress lists browser compatibility information under System Requirements.
Please see our Contributing Guideline which explains how to contribute fixes or features to the repo and how to test.
This project is licensed under the terms of the MIT license.