{
  "doc": {
    "id": "app/run-tests/launching-browsers",
    "title": "Launching browsers in Cypress: Chrome, Firefox, Edge & WebKit",
    "description": "Learn how Cypress launches and controls Chrome, Firefox, Edge, Electron, and WebKit. Choose and customize browsers, run headless, and fix launch issues.",
    "section": "app",
    "source_path": "/llm/markdown/app/run-tests/launching-browsers.md",
    "version": "066c46e056f0f322a0670d2d3aa4e6adaebfe717",
    "updated_at": "2026-09-10T13:30:12.426Z",
    "headings": [
      {
        "id": "app/run-tests/launching-browsers#browser-launch-options",
        "text": "Browser launch options",
        "level": 1
      },
      {
        "id": "app/run-tests/launching-browsers#supported-browsers",
        "text": "Supported browsers",
        "level": 2
      },
      {
        "id": "app/run-tests/launching-browsers#launching-headed-or-headless",
        "text": "Launching headed or headless",
        "level": 3
      },
      {
        "id": "app/run-tests/launching-browsers#browser-versions-supported",
        "text": "Browser versions supported",
        "level": 3
      },
      {
        "id": "app/run-tests/launching-browsers#download-specific-chrome-version",
        "text": "Download specific Chrome version",
        "level": 3
      },
      {
        "id": "app/run-tests/launching-browsers#electron-browser-deprecated",
        "text": "Electron Browser (deprecated)",
        "level": 3
      },
      {
        "id": "app/run-tests/launching-browsers#chrome-browsers",
        "text": "Chrome Browsers",
        "level": 3
      },
      {
        "id": "app/run-tests/launching-browsers#chrome-policy",
        "text": "Chrome policy",
        "level": 4
      },
      {
        "id": "app/run-tests/launching-browsers#skipping-chrome-preference-reads-writes",
        "text": "Skipping Chrome preference reads/writes",
        "level": 4
      },
      {
        "id": "app/run-tests/launching-browsers#edge-browsers",
        "text": "Edge Browsers",
        "level": 3
      },
      {
        "id": "app/run-tests/launching-browsers#edge-policy",
        "text": "Edge policy",
        "level": 4
      },
      {
        "id": "app/run-tests/launching-browsers#firefox-browsers",
        "text": "Firefox Browsers",
        "level": 3
      },
      {
        "id": "app/run-tests/launching-browsers#mozilla-geckodriver",
        "text": "Mozilla geckodriver",
        "level": 4
      },
      {
        "id": "app/run-tests/launching-browsers#webkit-experimental",
        "text": "WebKit (Experimental)",
        "level": 3
      },
      {
        "id": "app/run-tests/launching-browsers#linux-dependencies",
        "text": "Linux Dependencies",
        "level": 4
      },
      {
        "id": "app/run-tests/launching-browsers#known-issues-with-experimentalwebkitsupport",
        "text": "Known Issues with experimentalWebKitSupport",
        "level": 4
      },
      {
        "id": "app/run-tests/launching-browsers#launching-by-a-path",
        "text": "Launching by a path",
        "level": 3
      },
      {
        "id": "app/run-tests/launching-browsers#customize-available-browsers",
        "text": "Customize available browsers",
        "level": 3
      },
      {
        "id": "app/run-tests/launching-browsers#browser-environment",
        "text": "Browser environment",
        "level": 2
      },
      {
        "id": "app/run-tests/launching-browsers#cypress-profile",
        "text": "Cypress Profile",
        "level": 3
      },
      {
        "id": "app/run-tests/launching-browsers#disabled-barriers",
        "text": "Disabled Barriers",
        "level": 3
      },
      {
        "id": "app/run-tests/launching-browsers#extra-tabs",
        "text": "Extra Tabs",
        "level": 3
      },
      {
        "id": "app/run-tests/launching-browsers#customize-the-browser-launch",
        "text": "Customize the browser launch",
        "level": 3
      },
      {
        "id": "app/run-tests/launching-browsers#distinguishing-the-cypress-browser",
        "text": "Distinguishing the Cypress browser",
        "level": 3
      },
      {
        "id": "app/run-tests/launching-browsers#headless-mode",
        "text": "Headless mode",
        "level": 2
      },
      {
        "id": "app/run-tests/launching-browsers#headless-rendering-defaults",
        "text": "Headless rendering defaults",
        "level": 3
      },
      {
        "id": "app/run-tests/launching-browsers#debugging-headless-only-failures",
        "text": "Debugging headless-only failures",
        "level": 3
      },
      {
        "id": "app/run-tests/launching-browsers#downloading-files",
        "text": "Downloading files",
        "level": 2
      },
      {
        "id": "app/run-tests/launching-browsers#troubleshooting",
        "text": "Troubleshooting",
        "level": 2
      },
      {
        "id": "app/run-tests/launching-browsers#see-also",
        "text": "See also",
        "level": 2
      }
    ]
  },
  "chunks": [
    {
      "id": "app/run-tests/launching-browsers#supported-browsers",
      "doc_id": "app/run-tests/launching-browsers",
      "heading": "Supported browsers",
      "heading_level": 2,
      "content_markdown": "## Supported browsers\n\nWhen Cypress is launched, you can choose to test your application using a number of browsers, including:\n\n*   [Chrome for Testing](https://github.com/GoogleChromeLabs/chrome-for-testing/)\n*   [Chrome](https://www.google.com/chrome/)\n*   [Chrome Beta](https://www.google.com/chrome/beta/)\n*   [Chrome Canary](https://www.google.com/chrome/canary/)\n*   [Chromium](https://www.chromium.org/Home)\n*   [Edge](https://www.microsoft.com/edge)\n*   [Edge Beta](https://www.microsoftedgeinsider.com/download)\n*   [Edge Canary](https://www.microsoftedgeinsider.com/download)\n*   [Edge Dev](https://www.microsoftedgeinsider.com/download)\n*   [Electron](https://electron.atom.io/) (deprecated)\n*   [Firefox](https://www.mozilla.org/firefox/)\n*   [Firefox Developer Edition](https://www.mozilla.org/firefox/developer/)\n*   [Firefox Nightly](https://www.mozilla.org/firefox/nightly/)\n*   [WebKit (Experimental)](#WebKit-Experimental)\n\nCypress automatically detects the browsers installed on your OS so you don't have to configure paths by hand. In `cypress open`, switch browsers using the drop down near the top right corner; in `cypress run`, choose one with the [`--browser`](/llm/markdown/app/references/command-line.md#cypress-run-browser-lt-browser-name-or-path-gt) flag.\n\n### Launching headed or headless\n\nBy default, when running [cypress run](/llm/markdown/app/references/command-line.md#cypress-run) from the CLI, Cypress launches browsers headlessly. To run headed, pass the `--headed` argument:\n\n```\ncypress run --headed\n```\n\n### Browser versions supported\n\nCypress officially supports the latest 3 major versions of Chrome, Firefox, and Edge. (For example, if the stable release of Chrome was 150, Cypress would officially support Chrome 148, 149, and 150.)\n\nSticking to recent versions matters because these browsers are evergreen and their automation interfaces evolve quickly, so supporting the latest versions lets Cypress rely on stable, modern automation APIs.\n\nRegardless of the above, Cypress cannot launch **Firefox versions older than 140**. Cypress automates Firefox through [WebDriver BiDi](https://w3c.github.io/webdriver-bidi/), and Firefox versions below 140 implement it incompletely, so older versions will fail with an error. Cypress `15.0.0` through `15.18.1` set this floor at Firefox 135.\n\nSee each browser's official release schedule for more information.\n\n*   [Chrome Release Schedule](https://chromiumdash.appspot.com/schedule)\n*   [Firefox Release Schedule](https://whattrainisitnow.com/release/?version=release)\n*   [Edge Release Schedule](https://learn.microsoft.com/en-us/deployedge/microsoft-edge-release-schedule#microsoft-edge-releases)\n\n### Download specific Chrome version\n\nThe Chrome browser is evergreen - meaning it will automatically update itself, sometimes causing a breaking change in your automated tests. To keep your test runs deterministic, you can pin a fixed browser version instead of letting it drift. You can use the information in [Download Chromium](https://on.cypress.io/chromium-downloads) to download a specific released version of Chrome for Testing or Chromium for every platform.\n\n### Electron Browser (deprecated)\n\nIn addition to the browsers found on your system, you'll notice that Electron is an available browser. The Electron browser is a version of Chromium that comes with [Electron](https://electron.atom.io/).\n\n**Electron is deprecated as a test browser** and will be removed in a future version of Cypress. Switch to Chrome or another installed browser to avoid a breaking change when you upgrade. Set a [`defaultBrowser`](/llm/markdown/app/references/configuration.md#Browser) (for example, `'chrome'`) and/or pass [`--browser`](/llm/markdown/app/references/command-line.md#cypress-run) so your runs don't rely on the bundled Electron default.\n\nAfter Electron is removed, runs that target it (`--browser electron`, or an implicit fallback to Electron) will fail. See [Migrating away from the Electron browser](/llm/markdown/app/references/migration-guide.md#Migrating-away-from-the-Electron-browser).\n\n### Chrome Browsers\n\nAll Chrome\\* flavored browsers are detected and supported by Cypress.\n\nYou can launch Chrome like this:\n\n*   npm\n*   Yarn\n*   pnpm\n*   Bun\n\n```\nnpx cypress run --browser chrome\n```\n\n```\nyarn cypress run --browser chrome\n```\n\n```\npnpm cypress run --browser chrome\n```\n\n```\nbunx cypress run --browser chrome\n```\n\nTo use this command in CI, you need to install the browser you want - or use one of our [docker images](/llm/markdown/app/continuous-integration/overview.md#Cypress-Docker-Images).\n\nBy default, we will launch Chrome headlessly during `cypress run`. To run Chrome headed, you can pass the `--headed` argument to `cypress run`.\n\nYou can also launch Chromium:\n\n*   npm\n*   Yarn\n*   pnpm\n*   Bun\n\n```\nnpx cypress run --browser chromium\n```\n\n```\nyarn cypress run --browser chromium\n```\n\n```\npnpm cypress run --browser chromium\n```\n\n```\nbunx cypress run --browser chromium\n```\n\nOr Chrome Beta:\n\n*   npm\n*   Yarn\n*   pnpm\n*   Bun\n\n```\nnpx cypress run --browser chrome:beta\n```\n\n```\nyarn cypress run --browser chrome:beta\n```\n\n```\npnpm cypress run --browser chrome:beta\n```\n\n```\nbunx cypress run --browser chrome:beta\n```\n\nOr Chrome Canary:\n\n*   npm\n*   Yarn\n*   pnpm\n*   Bun\n\n```\nnpx cypress run --browser chrome:canary\n```\n\n```\nyarn cypress run --browser chrome:canary\n```\n\n```\npnpm cypress run --browser chrome:canary\n```\n\n```\nbunx cypress run --browser chrome:canary\n```\n\nOr Chrome for Testing:\n\n*   npm\n*   Yarn\n*   pnpm\n*   Bun\n\n```\nnpx cypress run --browser chrome-for-testing\n```\n\n```\nyarn cypress run --browser chrome-for-testing\n```\n\n```\npnpm cypress run --browser chrome-for-testing\n```\n\n```\nbunx cypress run --browser chrome-for-testing\n```\n\n**Prefer Chrome for Testing for reliable, reproducible runs**\n\nWhere possible, we recommend running your tests in [Chrome for Testing](https://developer.chrome.com/blog/chrome-for-testing). It is a dedicated Chrome flavor that Google builds specifically for automation, and it has a few advantages over a standard, day-to-day Chrome install:\n\n*   **No auto-update.** Regular Chrome is evergreen and silently updates itself, which can change browser behavior between runs and cause tests that passed yesterday to fail today. Chrome for Testing is pinned to a specific version and never updates on its own, so your environment stays deterministic.\n*   **Versioned, reproducible binaries.** A matching build is published for every Chrome version and every major OS, so you can install the exact same browser locally and in CI. See [Download specific Chrome version](#Download-specific-Chrome-version).\n*   **Built for automation, not browsing.** Because it is intended only for testing, it is not subject to the enterprise/group [policies](#Chrome-policy) often applied to branded Chrome (such as disabling remote debugging), which removes a common cause of launch failures.\n*   **Extension loading still works.** Standard Chrome 137 and above can no longer load extensions via the [Browser Launch API](/llm/markdown/api/node-events/browser-launch-api.md#Add-browser-extensions), but Chrome for Testing and Chromium still can.\n\n#### Chrome policy\n\nIf Chrome policy is set, ensure that [RemoteDebuggingAllowed](https://chromeenterprise.google/policies/#RemoteDebuggingAllowed) is either undefined or set to `true`. If this is not the case, then Cypress will timeout, returning an `ECONNREFUSED` error, attempting to connect to the browser. Chrome policy is generally applied to a Chrome-branded browser only, not to Chromium or Chrome for Testing browsers. Check by browsing to **chrome://policy**. See [Cypress failed to make a connection to the Chrome DevTools Protocol](/llm/markdown/app/references/troubleshooting.md#Cypress-failed-to-make-a-connection-to-the-Chrome-DevTools-Protocol) for more.\n\n#### Skipping Chrome preference reads/writes\n\nTo set up a consistent testing environment, Cypress reads and writes Chrome preference files inside its [isolated profile](#Cypress-Profile) in the browser's user-data directory (the `Preferences`, `Secure Preferences`, and `Local State` files). This is how Cypress applies preference-based settings, for example, disabling password saving and autofill, configuring the [downloads behavior](#Downloading-files), and any preferences you set through the [`before:browser:launch`](/llm/markdown/api/node-events/browser-launch-api.md#Change-browser-preferences) event.\n\nSome applications and environments **encrypt the user-data directory** (for example, certain enterprise security tooling). In that case, Cypress reading or writing the preference files can fail or corrupt the encrypted profile. To work around this, set the `IGNORE_CHROME_PREFERENCES` system environment variable, which tells Cypress to skip reading and writing Chrome preferences entirely:\n\n*   npm\n*   Yarn\n*   pnpm\n*   Bun\n\n```\nIGNORE_CHROME_PREFERENCES=1 npx cypress run --browser chrome\n```\n\n```\nIGNORE_CHROME_PREFERENCES=1 yarn cypress run --browser chrome\n```\n\n```\nIGNORE_CHROME_PREFERENCES=1 pnpm cypress run --browser chrome\n```\n\n```\nIGNORE_CHROME_PREFERENCES=1 bunx cypress run --browser chrome\n```\n\n### Edge Browsers\n\nMicrosoft Edge-family (Chromium-based) browsers are supported by Cypress.\n\nYou can launch Microsoft Edge like this:\n\n*   npm\n*   Yarn\n*   pnpm\n*   Bun\n\n```\nnpx cypress run --browser edge\n```\n\n```\nyarn cypress run --browser edge\n```\n\n```\npnpm cypress run --browser edge\n```\n\n```\nbunx cypress run --browser edge\n```\n\nOr Microsoft Edge Beta:\n\n*   npm\n*   Yarn\n*   pnpm\n*   Bun\n\n```\nnpx cypress run --browser edge:beta\n```\n\n```\nyarn cypress run --browser edge:beta\n```\n\n```\npnpm cypress run --browser edge:beta\n```\n\n```\nbunx cypress run --browser edge:beta\n```\n\nOr Microsoft Edge Canary:\n\n*   npm\n*   Yarn\n*   pnpm\n*   Bun\n\n```\nnpx cypress run --browser edge:canary\n```\n\n```\nyarn cypress run --browser edge:canary\n```\n\n```\npnpm cypress run --browser edge:canary\n```\n\n```\nbunx cypress run --browser edge:canary\n```\n\nOr Microsoft Edge Dev:\n\n*   npm\n*   Yarn\n*   pnpm\n*   Bun\n\n```\nnpx cypress run --browser edge:dev\n```\n\n```\nyarn cypress run --browser edge:dev\n```\n\n```\npnpm cypress run --browser edge:dev\n```\n\n```\nbunx cypress run --browser edge:dev\n```\n\n#### Edge policy\n\nIf Edge policy is set, ensure that [RemoteDebuggingAllowed](https://learn.microsoft.com/en-us/deployedge/microsoft-edge-browser-policies/remotedebuggingallowed) is either undefined or set to `true`. If this is not the case, then Cypress will timeout, returning an `ECONNREFUSED` error, attempting to connect to the browser. Check by browsing to **edge://policy**. See [Cypress failed to make a connection to the Chrome DevTools Protocol](/llm/markdown/app/references/troubleshooting.md#Cypress-failed-to-make-a-connection-to-the-Chrome-DevTools-Protocol) for more.\n\n### Firefox Browsers\n\nFirefox-family browsers are supported by Cypress.\n\nYou can launch Firefox like this:\n\n*   npm\n*   Yarn\n*   pnpm\n*   Bun\n\n```\nnpx cypress run --browser firefox\n```\n\n```\nyarn cypress run --browser firefox\n```\n\n```\npnpm cypress run --browser firefox\n```\n\n```\nbunx cypress run --browser firefox\n```\n\nOr Firefox Developer Edition:\n\n*   npm\n*   Yarn\n*   pnpm\n*   Bun\n\n```\nnpx cypress run --browser firefox:dev\n```\n\n```\nyarn cypress run --browser firefox:dev\n```\n\n```\npnpm cypress run --browser firefox:dev\n```\n\n```\nbunx cypress run --browser firefox:dev\n```\n\nOr Firefox Nightly:\n\n*   npm\n*   Yarn\n*   pnpm\n*   Bun\n\n```\nnpx cypress run --browser firefox:nightly\n```\n\n```\nyarn cypress run --browser firefox:nightly\n```\n\n```\npnpm cypress run --browser firefox:nightly\n```\n\n```\nbunx cypress run --browser firefox:nightly\n```\n\nTo use this command in CI, you need to install these other browsers - or use one of our [docker images](/llm/markdown/app/continuous-integration/overview.md#Cypress-Docker-Images).\n\nBy default, we will launch Firefox headlessly during `cypress run`. To run Firefox headed, you can pass the `--headed` argument to `cypress run`.\n\n#### Mozilla geckodriver\n\nCypress requires the [Mozilla geckodriver](https://github.com/mozilla/geckodriver) to launch Firefox. To meet this requirement, the Cypress binary uses the separate npm wrapper package [geckodriver](https://github.com/webdriverio-community/node-geckodriver) to provide the Mozilla geckodriver. The wrapper downloads the latest driver version if it does not find any driver version cached locally.\n\nRetrieving the driver may fail if you are operating Cypress in an air-gapped environment without Internet connectivity and you do not have a cached driver version available.\n\nTo avoid this issue, use a current [Cypress Docker image](/llm/markdown/app/continuous-integration/overview.md#Cypress-Docker-Images) `cypress/browsers` or `cypress/included`, built with Firefox 139, or above. These images include a Mozilla geckodriver version pre-installed. Using `cypress/factory:5.9.0`, or above, you can also build your own custom Cypress Docker image that includes a Mozilla geckodriver version. Refer to the `cypress/factory` [documentation](https://github.com/cypress-io/cypress-docker-images/blob/master/factory/README.md) for instructions on building custom images.\n\nIf you need to work without Docker, refer to the npm wrapper package geckodriver [documentation](https://github.com/webdriverio-community/node-geckodriver) for information about how to define a custom path for the driver or how to refer to a local CDN mirror site. Download the Mozilla geckodriver from the [releases](https://github.com/mozilla/geckodriver/releases) location.\n\n### WebKit (Experimental)\n\nCypress has [experimental](/llm/markdown/app/references/experiments.md) support for WebKit, Safari's browser engine. Because Apple does not ship Safari's automation on every platform, testing against WebKit is the practical way to validate how your app behaves in Safari from Windows, Linux, or CI, without needing a Mac. To opt-in to `experimentalWebKitSupport`, follow these steps:\n\n1.  Add `experimentalWebKitSupport: true` to your [configuration](/llm/markdown/app/references/configuration.md) to enable the experiment.\n2.  For installation on Linux, refer to [Linux Dependencies](#Linux-Dependencies) below.\n3.  Install the `playwright-webkit` npm package in your repo to acquire WebKit itself:\n    \n    ```\n    npm install playwright-webkit --save-dev\n    ```\n    \n4.  Now, you should be able to use WebKit like any other browser. For example, to record with WebKit in CI:\n\n*   npm\n*   Yarn\n*   pnpm\n*   Bun\n\n```\nnpx cypress run --browser webkit --record\n```\n\n```\nyarn cypress run --browser webkit --record\n```\n\n```\npnpm cypress run --browser webkit --record\n```\n\n```\nbunx cypress run --browser webkit --record\n```\n\nWe built this experiment on top of the Playwright WebKit browser as a stepping stone towards creating a better UX with Cypress-provided browsers in the future. Thank you, Playwright contributors.\n\nWebKit support is _experimental_, so you may encounter issues. If you encounter an issue not on the \"Known Issues\" list, please [open an issue](https://github.com/cypress-io/cypress/issues/new/choose) on the GitHub repository.\n\n#### Linux Dependencies\n\nWebKit requires additional dependencies to run on Linux. To install the required dependencies, run this:\n\n*   npm\n*   Yarn\n*   pnpm\n*   Bun\n\n```\nnpx playwright install-deps webkit\n```\n\n```\nyarn dlx playwright install-deps webkit\n```\n\n```\npnpm dlx playwright install-deps webkit\n```\n\n```\nbunx playwright install-deps webkit\n```\n\n#### Known Issues with `experimentalWebKitSupport`\n\n*   `cy.origin()` is not yet supported.\n*   [Test Replay](/llm/markdown/cloud/features/test-replay.md) is not supported.\n*   `cy.intercept()`'s `forceNetworkError` option is disabled.\n*   When using `experimentalSingleTabRunMode` with video recording in WebKit, only the video for the first spec is recorded.\n*   Some differences in `cy.type()` behavior:\n    *   `textInput` events are missing the `data` property\n    *   `beforeinput` events are missing the `inputType` property\n    *   `cy.type('{uparrow}')` and `cy.type('{downarrow}')` on an `input[type=number]` do not round to the nearest `step` specified\n*   Stack traces may be missing some function names and location information.\n*   See issues labeled [`experiment: webkit`](https://github.com/cypress-io/cypress/issues?q=is%3Aissue+is%3Aopen+sort%3Aupdated-desc+label%3A%22experiment%3A+webkit%22) for a complete list.\n\n### Launching by a path\n\nIf a browser isn't auto-detected, for example a portable install or a custom build, you can launch any supported browser by specifying a path to the binary:\n\n*   npm\n*   Yarn\n*   pnpm\n*   Bun\n\n```\nnpx cypress open --browser /usr/bin/chromium\n```\n\n```\nyarn cypress open --browser /usr/bin/chromium\n```\n\n```\npnpm cypress open --browser /usr/bin/chromium\n```\n\n```\nbunx cypress open --browser /usr/bin/chromium\n```\n\nCypress will automatically detect the type of browser supplied and launch it for you.\n\n[See the Command Line guide for more information about the `--browser` arguments](/llm/markdown/app/references/command-line.md#cypress-run-browser-lt-browser-name-or-path-gt)\n\n[Having trouble launching a browser? Check out our troubleshooting guide](/llm/markdown/app/references/troubleshooting.md#Launching-browsers)\n\n### Customize available browsers\n\nSometimes you might want to modify the list of browsers found before running tests. This is useful when your application only targets certain browsers, or when you want to test in a Chromium-based browser that Cypress doesn't detect on its own.\n\nIn the [setupNodeEvents](/llm/markdown/api/node-events/configuration-api.md) function, you can filter the list of browsers passed inside the `config` object and return the list of browsers you want available for selection during `cypress open`.\n\n*   cypress.config.js\n*   cypress.config.ts\n\n```\nconst { defineConfig } = require('cypress')\n\nmodule.exports = defineConfig({\n  // setupNodeEvents can be defined in either\n  // the e2e or component configuration\n  e2e: {\n    setupNodeEvents(on, config) {\n      // inside config.browsers array each object has information like\n      // {\n      //   name: 'chrome',\n      //   channel: 'canary',\n      //   family: 'chromium',\n      //   displayName: 'Chrome Canary',\n      //   version: '133.0.6890.0',\n      //   path:\n      //    '/Applications/Google Chrome Canary.app/Contents/MacOS/Canary',\n      //   majorVersion: 133\n      // }\n      return {\n        browsers: config.browsers.filter(\n          (b) => b.family === 'chromium' && b.name !== 'electron'\n        ),\n      }\n    },\n  },\n})\n```\n\n```\nimport { defineConfig } from 'cypress'\n\nexport default defineConfig({\n  // setupNodeEvents can be defined in either\n  // the e2e or component configuration\n  e2e: {\n    setupNodeEvents(on, config) {\n      // inside config.browsers array each object has information like\n      // {\n      //   name: 'chrome',\n      //   channel: 'canary',\n      //   family: 'chromium',\n      //   displayName: 'Chrome Canary',\n      //   version: '133.0.6890.0',\n      //   path:\n      //    '/Applications/Google Chrome Canary.app/Contents/MacOS/Canary',\n      //   majorVersion: 133\n      // }\n      return {\n        browsers: config.browsers.filter(\n          (b) => b.family === 'chromium' && b.name !== 'electron'\n        ),\n      }\n    },\n  },\n})\n```\n\nWhen you open Cypress in a project that uses the above modifications to the `setupNodeEvents` function, Electron will no longer display in the list of available browsers.\n\nIf you return an empty list of browsers or `browsers: null`, the default list will be restored automatically.\n\nIf you have installed a Chromium-based browser like [Brave](https://brave.com/), [Vivaldi](https://vivaldi.com/) you can add them to the list of returned browsers. Here is a configuration that inserts a local Brave browser into the returned list.\n\n*   cypress.config.js\n*   cypress.config.ts\n\n```\nconst { defineConfig } = require('cypress')\nconst execa = require('execa')\nconst findBrowser = () => {\n  // the path is hard-coded for simplicity\n  const browserPath =\n    '/Applications/Brave Browser.app/Contents/MacOS/Brave Browser'\n\n  return execa(browserPath, ['--version']).then((result) => {\n    // STDOUT will be like \"Brave Browser 77.0.69.135\"\n    const [, version] = /Brave Browser (\\d+\\.\\d+\\.\\d+\\.\\d+)/.exec(result.stdout)\n    const majorVersion = parseInt(version.split('.')[0])\n\n    return {\n      name: 'Brave',\n      channel: 'stable',\n      family: 'chromium',\n      displayName: 'Brave',\n      version,\n      path: browserPath,\n      majorVersion,\n    }\n  })\n}\n\nmodule.exports = defineConfig({\n  // setupNodeEvents can be defined in either\n  // the e2e or component configuration\n  e2e: {\n    setupNodeEvents(on, config) {\n      return findBrowser().then((browser) => {\n        return {\n          browsers: config.browsers.concat(browser),\n        }\n      })\n    },\n  },\n})\n```\n\n```\nimport { defineConfig } from 'cypress'\nimport execa from 'execa'\nconst findBrowser = () => {\n  // the path is hard-coded for simplicity\n  const browserPath =\n    '/Applications/Brave Browser.app/Contents/MacOS/Brave Browser'\n\n  return execa(browserPath, ['--version']).then((result) => {\n    // STDOUT will be like \"Brave Browser 77.0.69.135\"\n    const [, version] = /Brave Browser (\\d+\\.\\d+\\.\\d+\\.\\d+)/.exec(result.stdout)\n    const majorVersion = parseInt(version.split('.')[0])\n\n    return {\n      name: 'Brave',\n      channel: 'stable',\n      family: 'chromium',\n      displayName: 'Brave',\n      version,\n      path: browserPath,\n      majorVersion,\n    }\n  })\n}\n\nexport default defineConfig({\n  // setupNodeEvents can be defined in either\n  // the e2e or component configuration\n  e2e: {\n    setupNodeEvents(on, config) {\n      return findBrowser().then((browser) => {\n        return {\n          browsers: config.browsers.concat(browser),\n        }\n      })\n    },\n  },\n})\n```\n\nOnce selected, the Brave browser is detected using the same approach as any other browser of the `chromium` family.\n\nIf you modify the list of browsers, you can see the [resolved configuration](/llm/markdown/app/references/configuration.md#Resolved-Configuration) in the **Settings** tab.\n",
      "section": "app",
      "anchors": [
        "supported-browsers"
      ],
      "path": "/llm/json/chunked/app/run-tests/launching-browsers.json",
      "token_estimate": 3663
    },
    {
      "id": "app/run-tests/launching-browsers#launching-headed-or-headless",
      "doc_id": "app/run-tests/launching-browsers",
      "heading": "Launching headed or headless",
      "heading_level": 3,
      "content_markdown": "### Launching headed or headless\n\nBy default, when running [cypress run](/llm/markdown/app/references/command-line.md#cypress-run) from the CLI, Cypress launches browsers headlessly. To run headed, pass the `--headed` argument:\n\n```\ncypress run --headed\n```\n",
      "section": "app",
      "anchors": [
        "launching-headed-or-headless"
      ],
      "path": "/llm/json/chunked/app/run-tests/launching-browsers.json",
      "token_estimate": 40
    },
    {
      "id": "app/run-tests/launching-browsers#browser-versions-supported",
      "doc_id": "app/run-tests/launching-browsers",
      "heading": "Browser versions supported",
      "heading_level": 3,
      "content_markdown": "### Browser versions supported\n\nCypress officially supports the latest 3 major versions of Chrome, Firefox, and Edge. (For example, if the stable release of Chrome was 150, Cypress would officially support Chrome 148, 149, and 150.)\n\nSticking to recent versions matters because these browsers are evergreen and their automation interfaces evolve quickly, so supporting the latest versions lets Cypress rely on stable, modern automation APIs.\n\nRegardless of the above, Cypress cannot launch **Firefox versions older than 140**. Cypress automates Firefox through [WebDriver BiDi](https://w3c.github.io/webdriver-bidi/), and Firefox versions below 140 implement it incompletely, so older versions will fail with an error. Cypress `15.0.0` through `15.18.1` set this floor at Firefox 135.\n\nSee each browser's official release schedule for more information.\n\n*   [Chrome Release Schedule](https://chromiumdash.appspot.com/schedule)\n*   [Firefox Release Schedule](https://whattrainisitnow.com/release/?version=release)\n*   [Edge Release Schedule](https://learn.microsoft.com/en-us/deployedge/microsoft-edge-release-schedule#microsoft-edge-releases)\n",
      "section": "app",
      "anchors": [
        "browser-versions-supported"
      ],
      "path": "/llm/json/chunked/app/run-tests/launching-browsers.json",
      "token_estimate": 173
    },
    {
      "id": "app/run-tests/launching-browsers#download-specific-chrome-version",
      "doc_id": "app/run-tests/launching-browsers",
      "heading": "Download specific Chrome version",
      "heading_level": 3,
      "content_markdown": "### Download specific Chrome version\n\nThe Chrome browser is evergreen - meaning it will automatically update itself, sometimes causing a breaking change in your automated tests. To keep your test runs deterministic, you can pin a fixed browser version instead of letting it drift. You can use the information in [Download Chromium](https://on.cypress.io/chromium-downloads) to download a specific released version of Chrome for Testing or Chromium for every platform.\n",
      "section": "app",
      "anchors": [
        "download-specific-chrome-version"
      ],
      "path": "/llm/json/chunked/app/run-tests/launching-browsers.json",
      "token_estimate": 89
    },
    {
      "id": "app/run-tests/launching-browsers#electron-browser-deprecated",
      "doc_id": "app/run-tests/launching-browsers",
      "heading": "Electron Browser (deprecated)",
      "heading_level": 3,
      "content_markdown": "### Electron Browser (deprecated)\n\nIn addition to the browsers found on your system, you'll notice that Electron is an available browser. The Electron browser is a version of Chromium that comes with [Electron](https://electron.atom.io/).\n\n**Electron is deprecated as a test browser** and will be removed in a future version of Cypress. Switch to Chrome or another installed browser to avoid a breaking change when you upgrade. Set a [`defaultBrowser`](/llm/markdown/app/references/configuration.md#Browser) (for example, `'chrome'`) and/or pass [`--browser`](/llm/markdown/app/references/command-line.md#cypress-run) so your runs don't rely on the bundled Electron default.\n\nAfter Electron is removed, runs that target it (`--browser electron`, or an implicit fallback to Electron) will fail. See [Migrating away from the Electron browser](/llm/markdown/app/references/migration-guide.md#Migrating-away-from-the-Electron-browser).\n",
      "section": "app",
      "anchors": [
        "electron-browser-deprecated"
      ],
      "path": "/llm/json/chunked/app/run-tests/launching-browsers.json",
      "token_estimate": 145
    },
    {
      "id": "app/run-tests/launching-browsers#chrome-browsers",
      "doc_id": "app/run-tests/launching-browsers",
      "heading": "Chrome Browsers",
      "heading_level": 3,
      "content_markdown": "### Chrome Browsers\n\nAll Chrome\\* flavored browsers are detected and supported by Cypress.\n\nYou can launch Chrome like this:\n\n*   npm\n*   Yarn\n*   pnpm\n*   Bun\n\n```\nnpx cypress run --browser chrome\n```\n\n```\nyarn cypress run --browser chrome\n```\n\n```\npnpm cypress run --browser chrome\n```\n\n```\nbunx cypress run --browser chrome\n```\n\nTo use this command in CI, you need to install the browser you want - or use one of our [docker images](/llm/markdown/app/continuous-integration/overview.md#Cypress-Docker-Images).\n\nBy default, we will launch Chrome headlessly during `cypress run`. To run Chrome headed, you can pass the `--headed` argument to `cypress run`.\n\nYou can also launch Chromium:\n\n*   npm\n*   Yarn\n*   pnpm\n*   Bun\n\n```\nnpx cypress run --browser chromium\n```\n\n```\nyarn cypress run --browser chromium\n```\n\n```\npnpm cypress run --browser chromium\n```\n\n```\nbunx cypress run --browser chromium\n```\n\nOr Chrome Beta:\n\n*   npm\n*   Yarn\n*   pnpm\n*   Bun\n\n```\nnpx cypress run --browser chrome:beta\n```\n\n```\nyarn cypress run --browser chrome:beta\n```\n\n```\npnpm cypress run --browser chrome:beta\n```\n\n```\nbunx cypress run --browser chrome:beta\n```\n\nOr Chrome Canary:\n\n*   npm\n*   Yarn\n*   pnpm\n*   Bun\n\n```\nnpx cypress run --browser chrome:canary\n```\n\n```\nyarn cypress run --browser chrome:canary\n```\n\n```\npnpm cypress run --browser chrome:canary\n```\n\n```\nbunx cypress run --browser chrome:canary\n```\n\nOr Chrome for Testing:\n\n*   npm\n*   Yarn\n*   pnpm\n*   Bun\n\n```\nnpx cypress run --browser chrome-for-testing\n```\n\n```\nyarn cypress run --browser chrome-for-testing\n```\n\n```\npnpm cypress run --browser chrome-for-testing\n```\n\n```\nbunx cypress run --browser chrome-for-testing\n```\n\n**Prefer Chrome for Testing for reliable, reproducible runs**\n\nWhere possible, we recommend running your tests in [Chrome for Testing](https://developer.chrome.com/blog/chrome-for-testing). It is a dedicated Chrome flavor that Google builds specifically for automation, and it has a few advantages over a standard, day-to-day Chrome install:\n\n*   **No auto-update.** Regular Chrome is evergreen and silently updates itself, which can change browser behavior between runs and cause tests that passed yesterday to fail today. Chrome for Testing is pinned to a specific version and never updates on its own, so your environment stays deterministic.\n*   **Versioned, reproducible binaries.** A matching build is published for every Chrome version and every major OS, so you can install the exact same browser locally and in CI. See [Download specific Chrome version](#Download-specific-Chrome-version).\n*   **Built for automation, not browsing.** Because it is intended only for testing, it is not subject to the enterprise/group [policies](#Chrome-policy) often applied to branded Chrome (such as disabling remote debugging), which removes a common cause of launch failures.\n*   **Extension loading still works.** Standard Chrome 137 and above can no longer load extensions via the [Browser Launch API](/llm/markdown/api/node-events/browser-launch-api.md#Add-browser-extensions), but Chrome for Testing and Chromium still can.\n\n#### Chrome policy\n\nIf Chrome policy is set, ensure that [RemoteDebuggingAllowed](https://chromeenterprise.google/policies/#RemoteDebuggingAllowed) is either undefined or set to `true`. If this is not the case, then Cypress will timeout, returning an `ECONNREFUSED` error, attempting to connect to the browser. Chrome policy is generally applied to a Chrome-branded browser only, not to Chromium or Chrome for Testing browsers. Check by browsing to **chrome://policy**. See [Cypress failed to make a connection to the Chrome DevTools Protocol](/llm/markdown/app/references/troubleshooting.md#Cypress-failed-to-make-a-connection-to-the-Chrome-DevTools-Protocol) for more.\n\n#### Skipping Chrome preference reads/writes\n\nTo set up a consistent testing environment, Cypress reads and writes Chrome preference files inside its [isolated profile](#Cypress-Profile) in the browser's user-data directory (the `Preferences`, `Secure Preferences`, and `Local State` files). This is how Cypress applies preference-based settings, for example, disabling password saving and autofill, configuring the [downloads behavior](#Downloading-files), and any preferences you set through the [`before:browser:launch`](/llm/markdown/api/node-events/browser-launch-api.md#Change-browser-preferences) event.\n\nSome applications and environments **encrypt the user-data directory** (for example, certain enterprise security tooling). In that case, Cypress reading or writing the preference files can fail or corrupt the encrypted profile. To work around this, set the `IGNORE_CHROME_PREFERENCES` system environment variable, which tells Cypress to skip reading and writing Chrome preferences entirely:\n\n*   npm\n*   Yarn\n*   pnpm\n*   Bun\n\n```\nIGNORE_CHROME_PREFERENCES=1 npx cypress run --browser chrome\n```\n\n```\nIGNORE_CHROME_PREFERENCES=1 yarn cypress run --browser chrome\n```\n\n```\nIGNORE_CHROME_PREFERENCES=1 pnpm cypress run --browser chrome\n```\n\n```\nIGNORE_CHROME_PREFERENCES=1 bunx cypress run --browser chrome\n```\n",
      "section": "app",
      "anchors": [
        "chrome-browsers"
      ],
      "path": "/llm/json/chunked/app/run-tests/launching-browsers.json",
      "token_estimate": 907
    },
    {
      "id": "app/run-tests/launching-browsers#chrome-policy",
      "doc_id": "app/run-tests/launching-browsers",
      "heading": "Chrome policy",
      "heading_level": 4,
      "content_markdown": "#### Chrome policy\n\nIf Chrome policy is set, ensure that [RemoteDebuggingAllowed](https://chromeenterprise.google/policies/#RemoteDebuggingAllowed) is either undefined or set to `true`. If this is not the case, then Cypress will timeout, returning an `ECONNREFUSED` error, attempting to connect to the browser. Chrome policy is generally applied to a Chrome-branded browser only, not to Chromium or Chrome for Testing browsers. Check by browsing to **chrome://policy**. See [Cypress failed to make a connection to the Chrome DevTools Protocol](/llm/markdown/app/references/troubleshooting.md#Cypress-failed-to-make-a-connection-to-the-Chrome-DevTools-Protocol) for more.\n",
      "section": "app",
      "anchors": [
        "chrome-policy"
      ],
      "path": "/llm/json/chunked/app/run-tests/launching-browsers.json",
      "token_estimate": 100
    },
    {
      "id": "app/run-tests/launching-browsers#skipping-chrome-preference-reads-writes",
      "doc_id": "app/run-tests/launching-browsers",
      "heading": "Skipping Chrome preference reads/writes",
      "heading_level": 4,
      "content_markdown": "#### Skipping Chrome preference reads/writes\n\nTo set up a consistent testing environment, Cypress reads and writes Chrome preference files inside its [isolated profile](#Cypress-Profile) in the browser's user-data directory (the `Preferences`, `Secure Preferences`, and `Local State` files). This is how Cypress applies preference-based settings, for example, disabling password saving and autofill, configuring the [downloads behavior](#Downloading-files), and any preferences you set through the [`before:browser:launch`](/llm/markdown/api/node-events/browser-launch-api.md#Change-browser-preferences) event.\n\nSome applications and environments **encrypt the user-data directory** (for example, certain enterprise security tooling). In that case, Cypress reading or writing the preference files can fail or corrupt the encrypted profile. To work around this, set the `IGNORE_CHROME_PREFERENCES` system environment variable, which tells Cypress to skip reading and writing Chrome preferences entirely:\n\n*   npm\n*   Yarn\n*   pnpm\n*   Bun\n\n```\nIGNORE_CHROME_PREFERENCES=1 npx cypress run --browser chrome\n```\n\n```\nIGNORE_CHROME_PREFERENCES=1 yarn cypress run --browser chrome\n```\n\n```\nIGNORE_CHROME_PREFERENCES=1 pnpm cypress run --browser chrome\n```\n\n```\nIGNORE_CHROME_PREFERENCES=1 bunx cypress run --browser chrome\n```\n",
      "section": "app",
      "anchors": [
        "skipping-chrome-preference-reads-writes"
      ],
      "path": "/llm/json/chunked/app/run-tests/launching-browsers.json",
      "token_estimate": 207
    },
    {
      "id": "app/run-tests/launching-browsers#edge-browsers",
      "doc_id": "app/run-tests/launching-browsers",
      "heading": "Edge Browsers",
      "heading_level": 3,
      "content_markdown": "### Edge Browsers\n\nMicrosoft Edge-family (Chromium-based) browsers are supported by Cypress.\n\nYou can launch Microsoft Edge like this:\n\n*   npm\n*   Yarn\n*   pnpm\n*   Bun\n\n```\nnpx cypress run --browser edge\n```\n\n```\nyarn cypress run --browser edge\n```\n\n```\npnpm cypress run --browser edge\n```\n\n```\nbunx cypress run --browser edge\n```\n\nOr Microsoft Edge Beta:\n\n*   npm\n*   Yarn\n*   pnpm\n*   Bun\n\n```\nnpx cypress run --browser edge:beta\n```\n\n```\nyarn cypress run --browser edge:beta\n```\n\n```\npnpm cypress run --browser edge:beta\n```\n\n```\nbunx cypress run --browser edge:beta\n```\n\nOr Microsoft Edge Canary:\n\n*   npm\n*   Yarn\n*   pnpm\n*   Bun\n\n```\nnpx cypress run --browser edge:canary\n```\n\n```\nyarn cypress run --browser edge:canary\n```\n\n```\npnpm cypress run --browser edge:canary\n```\n\n```\nbunx cypress run --browser edge:canary\n```\n\nOr Microsoft Edge Dev:\n\n*   npm\n*   Yarn\n*   pnpm\n*   Bun\n\n```\nnpx cypress run --browser edge:dev\n```\n\n```\nyarn cypress run --browser edge:dev\n```\n\n```\npnpm cypress run --browser edge:dev\n```\n\n```\nbunx cypress run --browser edge:dev\n```\n\n#### Edge policy\n\nIf Edge policy is set, ensure that [RemoteDebuggingAllowed](https://learn.microsoft.com/en-us/deployedge/microsoft-edge-browser-policies/remotedebuggingallowed) is either undefined or set to `true`. If this is not the case, then Cypress will timeout, returning an `ECONNREFUSED` error, attempting to connect to the browser. Check by browsing to **edge://policy**. See [Cypress failed to make a connection to the Chrome DevTools Protocol](/llm/markdown/app/references/troubleshooting.md#Cypress-failed-to-make-a-connection-to-the-Chrome-DevTools-Protocol) for more.\n",
      "section": "app",
      "anchors": [
        "edge-browsers"
      ],
      "path": "/llm/json/chunked/app/run-tests/launching-browsers.json",
      "token_estimate": 308
    },
    {
      "id": "app/run-tests/launching-browsers#edge-policy",
      "doc_id": "app/run-tests/launching-browsers",
      "heading": "Edge policy",
      "heading_level": 4,
      "content_markdown": "#### Edge policy\n\nIf Edge policy is set, ensure that [RemoteDebuggingAllowed](https://learn.microsoft.com/en-us/deployedge/microsoft-edge-browser-policies/remotedebuggingallowed) is either undefined or set to `true`. If this is not the case, then Cypress will timeout, returning an `ECONNREFUSED` error, attempting to connect to the browser. Check by browsing to **edge://policy**. See [Cypress failed to make a connection to the Chrome DevTools Protocol](/llm/markdown/app/references/troubleshooting.md#Cypress-failed-to-make-a-connection-to-the-Chrome-DevTools-Protocol) for more.\n",
      "section": "app",
      "anchors": [
        "edge-policy"
      ],
      "path": "/llm/json/chunked/app/run-tests/launching-browsers.json",
      "token_estimate": 76
    },
    {
      "id": "app/run-tests/launching-browsers#firefox-browsers",
      "doc_id": "app/run-tests/launching-browsers",
      "heading": "Firefox Browsers",
      "heading_level": 3,
      "content_markdown": "### Firefox Browsers\n\nFirefox-family browsers are supported by Cypress.\n\nYou can launch Firefox like this:\n\n*   npm\n*   Yarn\n*   pnpm\n*   Bun\n\n```\nnpx cypress run --browser firefox\n```\n\n```\nyarn cypress run --browser firefox\n```\n\n```\npnpm cypress run --browser firefox\n```\n\n```\nbunx cypress run --browser firefox\n```\n\nOr Firefox Developer Edition:\n\n*   npm\n*   Yarn\n*   pnpm\n*   Bun\n\n```\nnpx cypress run --browser firefox:dev\n```\n\n```\nyarn cypress run --browser firefox:dev\n```\n\n```\npnpm cypress run --browser firefox:dev\n```\n\n```\nbunx cypress run --browser firefox:dev\n```\n\nOr Firefox Nightly:\n\n*   npm\n*   Yarn\n*   pnpm\n*   Bun\n\n```\nnpx cypress run --browser firefox:nightly\n```\n\n```\nyarn cypress run --browser firefox:nightly\n```\n\n```\npnpm cypress run --browser firefox:nightly\n```\n\n```\nbunx cypress run --browser firefox:nightly\n```\n\nTo use this command in CI, you need to install these other browsers - or use one of our [docker images](/llm/markdown/app/continuous-integration/overview.md#Cypress-Docker-Images).\n\nBy default, we will launch Firefox headlessly during `cypress run`. To run Firefox headed, you can pass the `--headed` argument to `cypress run`.\n\n#### Mozilla geckodriver\n\nCypress requires the [Mozilla geckodriver](https://github.com/mozilla/geckodriver) to launch Firefox. To meet this requirement, the Cypress binary uses the separate npm wrapper package [geckodriver](https://github.com/webdriverio-community/node-geckodriver) to provide the Mozilla geckodriver. The wrapper downloads the latest driver version if it does not find any driver version cached locally.\n\nRetrieving the driver may fail if you are operating Cypress in an air-gapped environment without Internet connectivity and you do not have a cached driver version available.\n\nTo avoid this issue, use a current [Cypress Docker image](/llm/markdown/app/continuous-integration/overview.md#Cypress-Docker-Images) `cypress/browsers` or `cypress/included`, built with Firefox 139, or above. These images include a Mozilla geckodriver version pre-installed. Using `cypress/factory:5.9.0`, or above, you can also build your own custom Cypress Docker image that includes a Mozilla geckodriver version. Refer to the `cypress/factory` [documentation](https://github.com/cypress-io/cypress-docker-images/blob/master/factory/README.md) for instructions on building custom images.\n\nIf you need to work without Docker, refer to the npm wrapper package geckodriver [documentation](https://github.com/webdriverio-community/node-geckodriver) for information about how to define a custom path for the driver or how to refer to a local CDN mirror site. Download the Mozilla geckodriver from the [releases](https://github.com/mozilla/geckodriver/releases) location.\n",
      "section": "app",
      "anchors": [
        "firefox-browsers"
      ],
      "path": "/llm/json/chunked/app/run-tests/launching-browsers.json",
      "token_estimate": 468
    },
    {
      "id": "app/run-tests/launching-browsers#mozilla-geckodriver",
      "doc_id": "app/run-tests/launching-browsers",
      "heading": "Mozilla geckodriver",
      "heading_level": 4,
      "content_markdown": "#### Mozilla geckodriver\n\nCypress requires the [Mozilla geckodriver](https://github.com/mozilla/geckodriver) to launch Firefox. To meet this requirement, the Cypress binary uses the separate npm wrapper package [geckodriver](https://github.com/webdriverio-community/node-geckodriver) to provide the Mozilla geckodriver. The wrapper downloads the latest driver version if it does not find any driver version cached locally.\n\nRetrieving the driver may fail if you are operating Cypress in an air-gapped environment without Internet connectivity and you do not have a cached driver version available.\n\nTo avoid this issue, use a current [Cypress Docker image](/llm/markdown/app/continuous-integration/overview.md#Cypress-Docker-Images) `cypress/browsers` or `cypress/included`, built with Firefox 139, or above. These images include a Mozilla geckodriver version pre-installed. Using `cypress/factory:5.9.0`, or above, you can also build your own custom Cypress Docker image that includes a Mozilla geckodriver version. Refer to the `cypress/factory` [documentation](https://github.com/cypress-io/cypress-docker-images/blob/master/factory/README.md) for instructions on building custom images.\n\nIf you need to work without Docker, refer to the npm wrapper package geckodriver [documentation](https://github.com/webdriverio-community/node-geckodriver) for information about how to define a custom path for the driver or how to refer to a local CDN mirror site. Download the Mozilla geckodriver from the [releases](https://github.com/mozilla/geckodriver/releases) location.\n",
      "section": "app",
      "anchors": [
        "mozilla-geckodriver"
      ],
      "path": "/llm/json/chunked/app/run-tests/launching-browsers.json",
      "token_estimate": 236
    },
    {
      "id": "app/run-tests/launching-browsers#webkit-experimental",
      "doc_id": "app/run-tests/launching-browsers",
      "heading": "WebKit (Experimental)",
      "heading_level": 3,
      "content_markdown": "### WebKit (Experimental)\n\nCypress has [experimental](/llm/markdown/app/references/experiments.md) support for WebKit, Safari's browser engine. Because Apple does not ship Safari's automation on every platform, testing against WebKit is the practical way to validate how your app behaves in Safari from Windows, Linux, or CI, without needing a Mac. To opt-in to `experimentalWebKitSupport`, follow these steps:\n\n1.  Add `experimentalWebKitSupport: true` to your [configuration](/llm/markdown/app/references/configuration.md) to enable the experiment.\n2.  For installation on Linux, refer to [Linux Dependencies](#Linux-Dependencies) below.\n3.  Install the `playwright-webkit` npm package in your repo to acquire WebKit itself:\n    \n    ```\n    npm install playwright-webkit --save-dev\n    ```\n    \n4.  Now, you should be able to use WebKit like any other browser. For example, to record with WebKit in CI:\n\n*   npm\n*   Yarn\n*   pnpm\n*   Bun\n\n```\nnpx cypress run --browser webkit --record\n```\n\n```\nyarn cypress run --browser webkit --record\n```\n\n```\npnpm cypress run --browser webkit --record\n```\n\n```\nbunx cypress run --browser webkit --record\n```\n\nWe built this experiment on top of the Playwright WebKit browser as a stepping stone towards creating a better UX with Cypress-provided browsers in the future. Thank you, Playwright contributors.\n\nWebKit support is _experimental_, so you may encounter issues. If you encounter an issue not on the \"Known Issues\" list, please [open an issue](https://github.com/cypress-io/cypress/issues/new/choose) on the GitHub repository.\n\n#### Linux Dependencies\n\nWebKit requires additional dependencies to run on Linux. To install the required dependencies, run this:\n\n*   npm\n*   Yarn\n*   pnpm\n*   Bun\n\n```\nnpx playwright install-deps webkit\n```\n\n```\nyarn dlx playwright install-deps webkit\n```\n\n```\npnpm dlx playwright install-deps webkit\n```\n\n```\nbunx playwright install-deps webkit\n```\n\n#### Known Issues with `experimentalWebKitSupport`\n\n*   `cy.origin()` is not yet supported.\n*   [Test Replay](/llm/markdown/cloud/features/test-replay.md) is not supported.\n*   `cy.intercept()`'s `forceNetworkError` option is disabled.\n*   When using `experimentalSingleTabRunMode` with video recording in WebKit, only the video for the first spec is recorded.\n*   Some differences in `cy.type()` behavior:\n    *   `textInput` events are missing the `data` property\n    *   `beforeinput` events are missing the `inputType` property\n    *   `cy.type('{uparrow}')` and `cy.type('{downarrow}')` on an `input[type=number]` do not round to the nearest `step` specified\n*   Stack traces may be missing some function names and location information.\n*   See issues labeled [`experiment: webkit`](https://github.com/cypress-io/cypress/issues?q=is%3Aissue+is%3Aopen+sort%3Aupdated-desc+label%3A%22experiment%3A+webkit%22) for a complete list.\n",
      "section": "app",
      "anchors": [
        "webkit-experimental"
      ],
      "path": "/llm/json/chunked/app/run-tests/launching-browsers.json",
      "token_estimate": 485
    },
    {
      "id": "app/run-tests/launching-browsers#linux-dependencies",
      "doc_id": "app/run-tests/launching-browsers",
      "heading": "Linux Dependencies",
      "heading_level": 4,
      "content_markdown": "#### Linux Dependencies\n\nWebKit requires additional dependencies to run on Linux. To install the required dependencies, run this:\n\n*   npm\n*   Yarn\n*   pnpm\n*   Bun\n\n```\nnpx playwright install-deps webkit\n```\n\n```\nyarn dlx playwright install-deps webkit\n```\n\n```\npnpm dlx playwright install-deps webkit\n```\n\n```\nbunx playwright install-deps webkit\n```\n",
      "section": "app",
      "anchors": [
        "linux-dependencies"
      ],
      "path": "/llm/json/chunked/app/run-tests/launching-browsers.json",
      "token_estimate": 69
    },
    {
      "id": "app/run-tests/launching-browsers#known-issues-with-experimentalwebkitsupport",
      "doc_id": "app/run-tests/launching-browsers",
      "heading": "Known Issues with experimentalWebKitSupport",
      "heading_level": 4,
      "content_markdown": "#### Known Issues with `experimentalWebKitSupport`\n\n*   `cy.origin()` is not yet supported.\n*   [Test Replay](/llm/markdown/cloud/features/test-replay.md) is not supported.\n*   `cy.intercept()`'s `forceNetworkError` option is disabled.\n*   When using `experimentalSingleTabRunMode` with video recording in WebKit, only the video for the first spec is recorded.\n*   Some differences in `cy.type()` behavior:\n    *   `textInput` events are missing the `data` property\n    *   `beforeinput` events are missing the `inputType` property\n    *   `cy.type('{uparrow}')` and `cy.type('{downarrow}')` on an `input[type=number]` do not round to the nearest `step` specified\n*   Stack traces may be missing some function names and location information.\n*   See issues labeled [`experiment: webkit`](https://github.com/cypress-io/cypress/issues?q=is%3Aissue+is%3Aopen+sort%3Aupdated-desc+label%3A%22experiment%3A+webkit%22) for a complete list.\n",
      "section": "app",
      "anchors": [
        "known-issues-with-experimentalwebkitsupport"
      ],
      "path": "/llm/json/chunked/app/run-tests/launching-browsers.json",
      "token_estimate": 133
    },
    {
      "id": "app/run-tests/launching-browsers#launching-by-a-path",
      "doc_id": "app/run-tests/launching-browsers",
      "heading": "Launching by a path",
      "heading_level": 3,
      "content_markdown": "### Launching by a path\n\nIf a browser isn't auto-detected, for example a portable install or a custom build, you can launch any supported browser by specifying a path to the binary:\n\n*   npm\n*   Yarn\n*   pnpm\n*   Bun\n\n```\nnpx cypress open --browser /usr/bin/chromium\n```\n\n```\nyarn cypress open --browser /usr/bin/chromium\n```\n\n```\npnpm cypress open --browser /usr/bin/chromium\n```\n\n```\nbunx cypress open --browser /usr/bin/chromium\n```\n\nCypress will automatically detect the type of browser supplied and launch it for you.\n\n[See the Command Line guide for more information about the `--browser` arguments](/llm/markdown/app/references/command-line.md#cypress-run-browser-lt-browser-name-or-path-gt)\n\n[Having trouble launching a browser? Check out our troubleshooting guide](/llm/markdown/app/references/troubleshooting.md#Launching-browsers)\n",
      "section": "app",
      "anchors": [
        "launching-by-a-path"
      ],
      "path": "/llm/json/chunked/app/run-tests/launching-browsers.json",
      "token_estimate": 139
    },
    {
      "id": "app/run-tests/launching-browsers#customize-available-browsers",
      "doc_id": "app/run-tests/launching-browsers",
      "heading": "Customize available browsers",
      "heading_level": 3,
      "content_markdown": "### Customize available browsers\n\nSometimes you might want to modify the list of browsers found before running tests. This is useful when your application only targets certain browsers, or when you want to test in a Chromium-based browser that Cypress doesn't detect on its own.\n\nIn the [setupNodeEvents](/llm/markdown/api/node-events/configuration-api.md) function, you can filter the list of browsers passed inside the `config` object and return the list of browsers you want available for selection during `cypress open`.\n\n*   cypress.config.js\n*   cypress.config.ts\n\n```\nconst { defineConfig } = require('cypress')\n\nmodule.exports = defineConfig({\n  // setupNodeEvents can be defined in either\n  // the e2e or component configuration\n  e2e: {\n    setupNodeEvents(on, config) {\n      // inside config.browsers array each object has information like\n      // {\n      //   name: 'chrome',\n      //   channel: 'canary',\n      //   family: 'chromium',\n      //   displayName: 'Chrome Canary',\n      //   version: '133.0.6890.0',\n      //   path:\n      //    '/Applications/Google Chrome Canary.app/Contents/MacOS/Canary',\n      //   majorVersion: 133\n      // }\n      return {\n        browsers: config.browsers.filter(\n          (b) => b.family === 'chromium' && b.name !== 'electron'\n        ),\n      }\n    },\n  },\n})\n```\n\n```\nimport { defineConfig } from 'cypress'\n\nexport default defineConfig({\n  // setupNodeEvents can be defined in either\n  // the e2e or component configuration\n  e2e: {\n    setupNodeEvents(on, config) {\n      // inside config.browsers array each object has information like\n      // {\n      //   name: 'chrome',\n      //   channel: 'canary',\n      //   family: 'chromium',\n      //   displayName: 'Chrome Canary',\n      //   version: '133.0.6890.0',\n      //   path:\n      //    '/Applications/Google Chrome Canary.app/Contents/MacOS/Canary',\n      //   majorVersion: 133\n      // }\n      return {\n        browsers: config.browsers.filter(\n          (b) => b.family === 'chromium' && b.name !== 'electron'\n        ),\n      }\n    },\n  },\n})\n```\n\nWhen you open Cypress in a project that uses the above modifications to the `setupNodeEvents` function, Electron will no longer display in the list of available browsers.\n\nIf you return an empty list of browsers or `browsers: null`, the default list will be restored automatically.\n\nIf you have installed a Chromium-based browser like [Brave](https://brave.com/), [Vivaldi](https://vivaldi.com/) you can add them to the list of returned browsers. Here is a configuration that inserts a local Brave browser into the returned list.\n\n*   cypress.config.js\n*   cypress.config.ts\n\n```\nconst { defineConfig } = require('cypress')\nconst execa = require('execa')\nconst findBrowser = () => {\n  // the path is hard-coded for simplicity\n  const browserPath =\n    '/Applications/Brave Browser.app/Contents/MacOS/Brave Browser'\n\n  return execa(browserPath, ['--version']).then((result) => {\n    // STDOUT will be like \"Brave Browser 77.0.69.135\"\n    const [, version] = /Brave Browser (\\d+\\.\\d+\\.\\d+\\.\\d+)/.exec(result.stdout)\n    const majorVersion = parseInt(version.split('.')[0])\n\n    return {\n      name: 'Brave',\n      channel: 'stable',\n      family: 'chromium',\n      displayName: 'Brave',\n      version,\n      path: browserPath,\n      majorVersion,\n    }\n  })\n}\n\nmodule.exports = defineConfig({\n  // setupNodeEvents can be defined in either\n  // the e2e or component configuration\n  e2e: {\n    setupNodeEvents(on, config) {\n      return findBrowser().then((browser) => {\n        return {\n          browsers: config.browsers.concat(browser),\n        }\n      })\n    },\n  },\n})\n```\n\n```\nimport { defineConfig } from 'cypress'\nimport execa from 'execa'\nconst findBrowser = () => {\n  // the path is hard-coded for simplicity\n  const browserPath =\n    '/Applications/Brave Browser.app/Contents/MacOS/Brave Browser'\n\n  return execa(browserPath, ['--version']).then((result) => {\n    // STDOUT will be like \"Brave Browser 77.0.69.135\"\n    const [, version] = /Brave Browser (\\d+\\.\\d+\\.\\d+\\.\\d+)/.exec(result.stdout)\n    const majorVersion = parseInt(version.split('.')[0])\n\n    return {\n      name: 'Brave',\n      channel: 'stable',\n      family: 'chromium',\n      displayName: 'Brave',\n      version,\n      path: browserPath,\n      majorVersion,\n    }\n  })\n}\n\nexport default defineConfig({\n  // setupNodeEvents can be defined in either\n  // the e2e or component configuration\n  e2e: {\n    setupNodeEvents(on, config) {\n      return findBrowser().then((browser) => {\n        return {\n          browsers: config.browsers.concat(browser),\n        }\n      })\n    },\n  },\n})\n```\n\nOnce selected, the Brave browser is detected using the same approach as any other browser of the `chromium` family.\n\nIf you modify the list of browsers, you can see the [resolved configuration](/llm/markdown/app/references/configuration.md#Resolved-Configuration) in the **Settings** tab.\n",
      "section": "app",
      "anchors": [
        "customize-available-browsers"
      ],
      "path": "/llm/json/chunked/app/run-tests/launching-browsers.json",
      "token_estimate": 773
    },
    {
      "id": "app/run-tests/launching-browsers#browser-environment",
      "doc_id": "app/run-tests/launching-browsers",
      "heading": "Browser environment",
      "heading_level": 2,
      "content_markdown": "## Browser environment\n\nCypress launches the browser in a way that's different from a regular browser environment. These differences are deliberate: each one removes a source of noise or unpredictability so that your tests are _more reliable_, _more reproducible_, and _easier to debug_.\n\n### Cypress Profile\n\nCypress generates its own isolated profile apart from your normal browser profile. This means things like `history` entries, `cookies`, and `3rd party extensions` from your regular browsing session will not affect your tests in Cypress.\n\n**Using your developer extensions**\n\nBecause Cypress runs in its own profile, your usual extensions won't carry over automatically. If you rely on developer extensions, install them once in the Cypress-launched browser. Cypress reuses the same testing profile on every subsequent launch, so your extensions and other configuration are preserved.\n\n### Disabled Barriers\n\nCypress automatically disables certain functionality in the Cypress launched browser that tend to get in the way of automated testing. This includes various features and prompts that are commonly disabled in automation, for example, ignoring certificate errors, allowing blocked pop-ups, and disabling things like password saving, autofill, session restoring, background throttling, and device permission prompts.\n\nThe goal is to keep these native browser behaviors from interrupting an unattended run. A \"Save password?\" dialog or a throttled background tab can stall or destabilize a test, so Cypress turns them off up front.\n\n### Extra Tabs\n\nAny extra tabs (i.e. tabs other than the one opened by Cypress) will be closed between tests. We recommend using your own browser instead of the one launched by Cypress for general-purpose browsing.\n\n### Customize the browser launch\n\nWhen Cypress goes to launch your browser, it gives you an opportunity to modify the arguments, preferences, environment, and extensions used to launch it. This is the main extension point for tailoring the browser to your application's needs.\n\nThis enables you to do things like:\n\n*   Load your own extension\n*   Enable or disable experimental features\n*   Change command-line arguments, preferences, and environment variables\n\n[This part of the API is documented here.](/llm/markdown/api/node-events/browser-launch-api.md)\n\n### Distinguishing the Cypress browser\n\nYou might notice that if you already have the browser open you will see two of the same browser icons in your dock.\n\nBecause Cypress runs in its own profile, it can be difficult to tell its browser apart from your normal one, and accidentally treating the Cypress browser like a regular one (or vice versa) leads to confusion.\n\nIn Chrome-based browsers, we've made the browser spawned by Cypress look different than regular sessions. You'll see a darker theme around the chrome of the browser, so you'll always be able to visually distinguish them.\n",
      "section": "app",
      "anchors": [
        "browser-environment"
      ],
      "path": "/llm/json/chunked/app/run-tests/launching-browsers.json",
      "token_estimate": 581
    },
    {
      "id": "app/run-tests/launching-browsers#cypress-profile",
      "doc_id": "app/run-tests/launching-browsers",
      "heading": "Cypress Profile",
      "heading_level": 3,
      "content_markdown": "### Cypress Profile\n\nCypress generates its own isolated profile apart from your normal browser profile. This means things like `history` entries, `cookies`, and `3rd party extensions` from your regular browsing session will not affect your tests in Cypress.\n\n**Using your developer extensions**\n\nBecause Cypress runs in its own profile, your usual extensions won't carry over automatically. If you rely on developer extensions, install them once in the Cypress-launched browser. Cypress reuses the same testing profile on every subsequent launch, so your extensions and other configuration are preserved.\n",
      "section": "app",
      "anchors": [
        "cypress-profile"
      ],
      "path": "/llm/json/chunked/app/run-tests/launching-browsers.json",
      "token_estimate": 116
    },
    {
      "id": "app/run-tests/launching-browsers#disabled-barriers",
      "doc_id": "app/run-tests/launching-browsers",
      "heading": "Disabled Barriers",
      "heading_level": 3,
      "content_markdown": "### Disabled Barriers\n\nCypress automatically disables certain functionality in the Cypress launched browser that tend to get in the way of automated testing. This includes various features and prompts that are commonly disabled in automation, for example, ignoring certificate errors, allowing blocked pop-ups, and disabling things like password saving, autofill, session restoring, background throttling, and device permission prompts.\n\nThe goal is to keep these native browser behaviors from interrupting an unattended run. A \"Save password?\" dialog or a throttled background tab can stall or destabilize a test, so Cypress turns them off up front.\n",
      "section": "app",
      "anchors": [
        "disabled-barriers"
      ],
      "path": "/llm/json/chunked/app/run-tests/launching-browsers.json",
      "token_estimate": 125
    },
    {
      "id": "app/run-tests/launching-browsers#extra-tabs",
      "doc_id": "app/run-tests/launching-browsers",
      "heading": "Extra Tabs",
      "heading_level": 3,
      "content_markdown": "### Extra Tabs\n\nAny extra tabs (i.e. tabs other than the one opened by Cypress) will be closed between tests. We recommend using your own browser instead of the one launched by Cypress for general-purpose browsing.\n",
      "section": "app",
      "anchors": [
        "extra-tabs"
      ],
      "path": "/llm/json/chunked/app/run-tests/launching-browsers.json",
      "token_estimate": 48
    },
    {
      "id": "app/run-tests/launching-browsers#customize-the-browser-launch",
      "doc_id": "app/run-tests/launching-browsers",
      "heading": "Customize the browser launch",
      "heading_level": 3,
      "content_markdown": "### Customize the browser launch\n\nWhen Cypress goes to launch your browser, it gives you an opportunity to modify the arguments, preferences, environment, and extensions used to launch it. This is the main extension point for tailoring the browser to your application's needs.\n\nThis enables you to do things like:\n\n*   Load your own extension\n*   Enable or disable experimental features\n*   Change command-line arguments, preferences, and environment variables\n\n[This part of the API is documented here.](/llm/markdown/api/node-events/browser-launch-api.md)\n",
      "section": "app",
      "anchors": [
        "customize-the-browser-launch"
      ],
      "path": "/llm/json/chunked/app/run-tests/launching-browsers.json",
      "token_estimate": 103
    },
    {
      "id": "app/run-tests/launching-browsers#distinguishing-the-cypress-browser",
      "doc_id": "app/run-tests/launching-browsers",
      "heading": "Distinguishing the Cypress browser",
      "heading_level": 3,
      "content_markdown": "### Distinguishing the Cypress browser\n\nYou might notice that if you already have the browser open you will see two of the same browser icons in your dock.\n\nBecause Cypress runs in its own profile, it can be difficult to tell its browser apart from your normal one, and accidentally treating the Cypress browser like a regular one (or vice versa) leads to confusion.\n\nIn Chrome-based browsers, we've made the browser spawned by Cypress look different than regular sessions. You'll see a darker theme around the chrome of the browser, so you'll always be able to visually distinguish them.\n",
      "section": "app",
      "anchors": [
        "distinguishing-the-cypress-browser"
      ],
      "path": "/llm/json/chunked/app/run-tests/launching-browsers.json",
      "token_estimate": 132
    },
    {
      "id": "app/run-tests/launching-browsers#headless-mode",
      "doc_id": "app/run-tests/launching-browsers",
      "heading": "Headless mode",
      "heading_level": 2,
      "content_markdown": "## Headless mode\n\nWhen running [cypress run](/llm/markdown/app/references/command-line.md#cypress-run) from the CLI, Cypress launches browsers **headlessly** by default. The browser runs without a visible UI. This is what makes Cypress well suited to Continuous Integration, where there is no display to render to and headless runs are faster and lighter. When running [cypress open](/llm/markdown/app/references/command-line.md#cypress-open), the browser is **always headed** so you can watch and debug interactively.\n\nHow each browser is launched headlessly differs slightly:\n\n| Browser | Default during `cypress run` | How it runs headless |\n| --- | --- | --- |\n| Electron | Headless | Internal Electron headless mode |\n| Chrome / Chromium / Edge | Headless | Launched with `--headless=new` |\n| Firefox | Headless | Launched with `-headless` |\n| WebKit (Experimental) | Headless | Launched headless via Playwright |\n\nTo show the browser while running `cypress run`, pass the [`--headed`](/llm/markdown/app/references/command-line.md#cypress-run-headed) flag:\n\n*   npm\n*   Yarn\n*   pnpm\n*   Bun\n\n```\nnpx cypress run --headed\n```\n\n```\nyarn cypress run --headed\n```\n\n```\npnpm cypress run --headed\n```\n\n```\nbunx cypress run --headed\n```\n\nBecause Electron is the default browser, it is typically the one running in CI. You can also explicitly hide a headed browser with `--headless`.\n\n### Headless rendering defaults\n\nWhen a browser runs headlessly, there is no physical display, so Cypress uses the following defaults for rendering:\n\n*   A default screen size of **1280x720**.\n*   A device pixel ratio (DPR) forced to **1**.\n\nKnowing these defaults matters because they determine the size and resolution of the screenshots and videos captured during the run. You can override them in the [`before:browser:launch`](/llm/markdown/api/node-events/browser-launch-api.md#Set-screen-size-when-running-headless) event, for example, to change the window size or force a retina-like DPR for higher-resolution output.\n\n### Debugging headless-only failures\n\nOccasionally a test passes when the browser is headed but fails when run headlessly (or vice versa). When this happens, the quickest way to debug is to reproduce the failure locally with the browser shown:\n\n*   npm\n*   Yarn\n*   pnpm\n*   Bun\n\n```\nnpx cypress run --headed --no-exit --browser chrome\n```\n\n```\nyarn cypress run --headed --no-exit --browser chrome\n```\n\n```\npnpm cypress run --headed --no-exit --browser chrome\n```\n\n```\nbunx cypress run --headed --no-exit --browser chrome\n```\n\nThe `--headed` flag shows the browser so you can watch the run, and `--no-exit` keeps Cypress open afterward so you can inspect the [command log](/llm/markdown/app/core-concepts/open-mode.md#Command-Log) and the application's final state. Comparing a headed run against a headless one, along with the recorded screenshots and videos, usually surfaces the difference.\n",
      "section": "app",
      "anchors": [
        "headless-mode"
      ],
      "path": "/llm/json/chunked/app/run-tests/launching-browsers.json",
      "token_estimate": 555
    },
    {
      "id": "app/run-tests/launching-browsers#headless-rendering-defaults",
      "doc_id": "app/run-tests/launching-browsers",
      "heading": "Headless rendering defaults",
      "heading_level": 3,
      "content_markdown": "### Headless rendering defaults\n\nWhen a browser runs headlessly, there is no physical display, so Cypress uses the following defaults for rendering:\n\n*   A default screen size of **1280x720**.\n*   A device pixel ratio (DPR) forced to **1**.\n\nKnowing these defaults matters because they determine the size and resolution of the screenshots and videos captured during the run. You can override them in the [`before:browser:launch`](/llm/markdown/api/node-events/browser-launch-api.md#Set-screen-size-when-running-headless) event, for example, to change the window size or force a retina-like DPR for higher-resolution output.\n",
      "section": "app",
      "anchors": [
        "headless-rendering-defaults"
      ],
      "path": "/llm/json/chunked/app/run-tests/launching-browsers.json",
      "token_estimate": 108
    },
    {
      "id": "app/run-tests/launching-browsers#debugging-headless-only-failures",
      "doc_id": "app/run-tests/launching-browsers",
      "heading": "Debugging headless-only failures",
      "heading_level": 3,
      "content_markdown": "### Debugging headless-only failures\n\nOccasionally a test passes when the browser is headed but fails when run headlessly (or vice versa). When this happens, the quickest way to debug is to reproduce the failure locally with the browser shown:\n\n*   npm\n*   Yarn\n*   pnpm\n*   Bun\n\n```\nnpx cypress run --headed --no-exit --browser chrome\n```\n\n```\nyarn cypress run --headed --no-exit --browser chrome\n```\n\n```\npnpm cypress run --headed --no-exit --browser chrome\n```\n\n```\nbunx cypress run --headed --no-exit --browser chrome\n```\n\nThe `--headed` flag shows the browser so you can watch the run, and `--no-exit` keeps Cypress open afterward so you can inspect the [command log](/llm/markdown/app/core-concepts/open-mode.md#Command-Log) and the application's final state. Comparing a headed run against a headless one, along with the recorded screenshots and videos, usually surfaces the difference.\n",
      "section": "app",
      "anchors": [
        "debugging-headless-only-failures"
      ],
      "path": "/llm/json/chunked/app/run-tests/launching-browsers.json",
      "token_estimate": 176
    },
    {
      "id": "app/run-tests/launching-browsers#downloading-files",
      "doc_id": "app/run-tests/launching-browsers",
      "heading": "Downloading files",
      "heading_level": 2,
      "content_markdown": "## Downloading files\n\nWhen your application downloads a file, Cypress automatically saves it to the [`downloadsFolder`](/llm/markdown/app/references/configuration.md#Downloads) (by default `cypress/downloads`) without showing the browser's native \"Save As\" prompt or download shelf. This is what makes downloads testable end-to-end: a native file-picker dialog would block an unattended run, so Cypress routes downloads to a known folder where you can assert on them directly from disk.\n",
      "section": "app",
      "anchors": [
        "downloading-files"
      ],
      "path": "/llm/json/chunked/app/run-tests/launching-browsers.json",
      "token_estimate": 84
    }
  ]
}