{
  "doc": {
    "id": "ui-coverage/configuration/overview",
    "title": "Configure UI Coverage in Cypress",
    "description": "Configure Cypress UI Coverage to get a coverage score you can trust: ignore dynamic attributes, filter out noise, group elements, shape views, and count the interactions that matter.",
    "section": "ui-coverage",
    "source_path": "/llm/markdown/ui-coverage/configuration/overview.md",
    "version": "29f95bf8bb06f320986f3749f5bf09a35a409eab",
    "updated_at": "2026-09-04T10:49:54.630Z",
    "headings": [
      {
        "id": "ui-coverage/configuration/overview#configuration-overview",
        "text": "Configuration overview",
        "level": 1
      },
      {
        "id": "ui-coverage/configuration/overview#setting-configuration",
        "text": "Setting configuration",
        "level": 2
      },
      {
        "id": "ui-coverage/configuration/overview#who-can-edit-configuration",
        "text": "Who can edit configuration",
        "level": 3
      },
      {
        "id": "ui-coverage/configuration/overview#configuration-options",
        "text": "Configuration options",
        "level": 2
      },
      {
        "id": "ui-coverage/configuration/overview#which-option-do-i-need",
        "text": "Which option do I need?",
        "level": 3
      },
      {
        "id": "ui-coverage/configuration/overview#comments",
        "text": "Comments",
        "level": 3
      },
      {
        "id": "ui-coverage/configuration/overview#full-configuration-reference",
        "text": "Full configuration reference",
        "level": 3
      },
      {
        "id": "ui-coverage/configuration/overview#how-rules-are-applied",
        "text": "How rules are applied",
        "level": 2
      },
      {
        "id": "ui-coverage/configuration/overview#configuration-scope",
        "text": "Configuration scope",
        "level": 2
      },
      {
        "id": "ui-coverage/configuration/overview#viewing-configuration-for-a-run",
        "text": "Viewing configuration for a run",
        "level": 2
      },
      {
        "id": "ui-coverage/configuration/overview#in-cypress-cloud",
        "text": "In Cypress Cloud",
        "level": 3
      },
      {
        "id": "ui-coverage/configuration/overview#from-the-results-api",
        "text": "From the Results API",
        "level": 3
      },
      {
        "id": "ui-coverage/configuration/overview#see-also",
        "text": "See also",
        "level": 2
      }
    ]
  },
  "chunks": [
    {
      "id": "ui-coverage/configuration/overview#setting-configuration",
      "doc_id": "ui-coverage/configuration/overview",
      "heading": "Setting configuration",
      "heading_level": 2,
      "content_markdown": "## Setting configuration\n\nConfiguration lives in Cypress Cloud, not in your repository. To view or change it for a project:\n\n1.  Open your project in Cypress Cloud and go to **Project Settings**.\n2.  Select the **App Quality** tab, which holds the configuration editor.\n3.  Edit the configuration as JSON, then **Save**. **Discard** reverts unsaved edits back to the last saved version.\n\nThe editor validates your JSON against the schema when you save, so an invalid configuration can't be saved, and it shows how long ago the configuration was last saved.\n\nAfter you save configuration changes, you can reprocess any historical run to apply them. You can start a reprocess from two places:\n\n*   The **Properties** tab, using the \"regenerate\" button next to the configuration values that were used for that run.\n*   The UI Coverage report, using the \"configuration updated\" message that appears when you view a historical run that was processed with an older configuration.\n\nRegenerating reports in this way allows you to make config changes and see their effects without running your Cypress tests again.\n\n### Who can edit configuration\n\nEditing is limited to Admin users by default. Your Cypress point-of-contact can enable editing for all users on request.\n",
      "section": "ui-coverage",
      "anchors": [
        "setting-configuration"
      ],
      "path": "/llm/json/chunked/ui-coverage/configuration/overview.json",
      "token_estimate": 268
    },
    {
      "id": "ui-coverage/configuration/overview#configuration-options",
      "doc_id": "ui-coverage/configuration/overview",
      "heading": "Configuration options",
      "heading_level": 2,
      "content_markdown": "## Configuration options\n\nFor a quick overview of the practical application of the most common UI Coverage configuration properties, you can read [this blog post](https://www.cypress.io/blog/making-the-most-of-ui-coverage).\n\n### Which option do I need?\n\nSeveral options change what appears in reports and how it's organized. Pick the one that matches your goal:\n\n| Your goal | Use |\n| --- | --- |\n| Control how URLs are grouped into views | [`views`](/llm/markdown/ui-coverage/configuration/views.md) |\n| Remove entire views from reports | [`viewFilters`](/llm/markdown/ui-coverage/configuration/viewfilters.md) |\n| Remove elements from reports and scores entirely | [`elementFilters`](/llm/markdown/ui-coverage/configuration/elementfilters.md) |\n| Rename or stabilize the identity of a single element | [`elements`](/llm/markdown/ui-coverage/configuration/elements.md) |\n| Combine repeated or related elements so they count as one | [`elementGroups`](/llm/markdown/ui-coverage/configuration/elementgroups.md) |\n| Define groups in your application's markup instead of configuration | [`data-cy-ui-group` attribute](/llm/markdown/ui-coverage/core-concepts/element-grouping.md#Grouping-with-markup-attributes) |\n| Prioritize your own attributes for identifying and naming elements | [`significantAttributes`](/llm/markdown/ui-coverage/configuration/significantattributes.md) |\n| Stop dynamic or generated attributes from identifying elements | [`attributeFilters`](/llm/markdown/ui-coverage/configuration/attributefilters.md) |\n| Count your custom commands as interactions | [`additionalInteractionCommands`](/llm/markdown/ui-coverage/configuration/additionalinteractioncommands.md) |\n| Limit which interaction commands count for specific elements | [`allowedInteractionCommands`](/llm/markdown/ui-coverage/configuration/allowedinteractioncommands.md) |\n| Apply different configuration to runs based on run tags | [`profiles`](/llm/markdown/ui-coverage/configuration/profiles.md) |\n\n### Comments\n\nMost configuration rules support an optional `comment` property that you can use to record why a value is set. This makes your configuration easier to understand and maintain, especially when working in a team or revisiting configuration after some time. Any rule defined as an object accepts a `comment`; the options that are plain lists of strings, such as [`significantAttributes`](/llm/markdown/ui-coverage/configuration/significantattributes.md) and [`additionalInteractionCommands`](/llm/markdown/ui-coverage/configuration/additionalinteractioncommands.md), do not take a per-entry comment.\n\nA `comment` lives inside the rule and has no effect on behavior. Comments appear only in the configuration itself and are never displayed in reports. Because Cypress Cloud validates every rule and rejects properties it doesn't recognize, `comment` is the supported place to keep notes.\n\nApp Quality Config\n\n```\n{\n  \"elementFilters\": [\n    {\n      \"selector\": \".intercom-launcher\",\n      \"include\": false,\n      \"comment\": \"Third-party chat widget, not covered by our tests\"\n    }\n  ]\n}\n```\n\n### Full configuration reference\n\nThe shape of every available option, with the type each value expects:\n\nApp Quality Config\n\n```\n{\n  // Root level only: applies to both UI Coverage and Cypress Accessibility\n  \"views\": [\n    {\n      \"pattern\": string,\n      \"groupBy\": string | [string],\n      \"comment\": string\n    }\n  ],\n  // or as a bare pattern string, if you do not want comments or grouping: \"views\": [\"/users/*\"]\n\n  // Shared properties. Valid here and, with the same shape, nested under\n  // \"uiCoverage\". If both are present, the nested list replaces the root-level one\n  \"viewFilters\": [\n    {\n      \"pattern\": string,\n      \"include\": boolean,\n      \"comment\": string\n    }\n  ],\n  \"elementFilters\": [\n    {\n      \"selector\": string,\n      \"include\": boolean,\n      \"documentScope\": [string],\n      \"comment\": string\n    }\n  ],\n  \"significantAttributes\": [\n    string\n  ],\n  \"attributeFilters\": [\n    {\n      \"attribute\": string,\n      \"value\": string,\n      \"include\": boolean,\n      \"comment\": string\n    }\n  ],\n  \"comment\": string,\n\n  \"uiCoverage\": {\n    // UI Coverage only\n    \"elements\": [\n      {\n        \"selector\": string,\n        \"name\": string,\n        \"documentScope\": [string],\n        \"comment\": string\n      }\n    ],\n    \"elementGroups\": [\n      {\n        \"selector\": string,\n        \"name\": string,\n        \"documentScope\": [string],\n        \"comment\": string\n      }\n    ],\n    \"additionalInteractionCommands\": [\n      string\n    ],\n    \"allowedInteractionCommands\": [\n      {\n        \"selector\": string,\n        \"commands\": [string],\n        \"documentScope\": [string],\n        \"comment\": string\n      }\n    ],\n    \"comment\": string\n    // plus viewFilters, elementFilters, significantAttributes, and\n    // attributeFilters: same shape as the root, replacing it for UI Coverage\n  },\n\n  \"profiles\": [\n    {\n      \"name\": string,\n      \"config\": {\n        // Any App Quality configuration options\n      },\n      \"comment\": string\n    }\n  ]\n}\n```\n",
      "section": "ui-coverage",
      "anchors": [
        "configuration-options"
      ],
      "path": "/llm/json/chunked/ui-coverage/configuration/overview.json",
      "token_estimate": 737
    },
    {
      "id": "ui-coverage/configuration/overview#which-option-do-i-need",
      "doc_id": "ui-coverage/configuration/overview",
      "heading": "Which option do I need?",
      "heading_level": 3,
      "content_markdown": "### Which option do I need?\n\nSeveral options change what appears in reports and how it's organized. Pick the one that matches your goal:\n\n| Your goal | Use |\n| --- | --- |\n| Control how URLs are grouped into views | [`views`](/llm/markdown/ui-coverage/configuration/views.md) |\n| Remove entire views from reports | [`viewFilters`](/llm/markdown/ui-coverage/configuration/viewfilters.md) |\n| Remove elements from reports and scores entirely | [`elementFilters`](/llm/markdown/ui-coverage/configuration/elementfilters.md) |\n| Rename or stabilize the identity of a single element | [`elements`](/llm/markdown/ui-coverage/configuration/elements.md) |\n| Combine repeated or related elements so they count as one | [`elementGroups`](/llm/markdown/ui-coverage/configuration/elementgroups.md) |\n| Define groups in your application's markup instead of configuration | [`data-cy-ui-group` attribute](/llm/markdown/ui-coverage/core-concepts/element-grouping.md#Grouping-with-markup-attributes) |\n| Prioritize your own attributes for identifying and naming elements | [`significantAttributes`](/llm/markdown/ui-coverage/configuration/significantattributes.md) |\n| Stop dynamic or generated attributes from identifying elements | [`attributeFilters`](/llm/markdown/ui-coverage/configuration/attributefilters.md) |\n| Count your custom commands as interactions | [`additionalInteractionCommands`](/llm/markdown/ui-coverage/configuration/additionalinteractioncommands.md) |\n| Limit which interaction commands count for specific elements | [`allowedInteractionCommands`](/llm/markdown/ui-coverage/configuration/allowedinteractioncommands.md) |\n| Apply different configuration to runs based on run tags | [`profiles`](/llm/markdown/ui-coverage/configuration/profiles.md) |\n",
      "section": "ui-coverage",
      "anchors": [
        "which-option-do-i-need"
      ],
      "path": "/llm/json/chunked/ui-coverage/configuration/overview.json",
      "token_estimate": 223
    },
    {
      "id": "ui-coverage/configuration/overview#comments",
      "doc_id": "ui-coverage/configuration/overview",
      "heading": "Comments",
      "heading_level": 3,
      "content_markdown": "### Comments\n\nMost configuration rules support an optional `comment` property that you can use to record why a value is set. This makes your configuration easier to understand and maintain, especially when working in a team or revisiting configuration after some time. Any rule defined as an object accepts a `comment`; the options that are plain lists of strings, such as [`significantAttributes`](/llm/markdown/ui-coverage/configuration/significantattributes.md) and [`additionalInteractionCommands`](/llm/markdown/ui-coverage/configuration/additionalinteractioncommands.md), do not take a per-entry comment.\n\nA `comment` lives inside the rule and has no effect on behavior. Comments appear only in the configuration itself and are never displayed in reports. Because Cypress Cloud validates every rule and rejects properties it doesn't recognize, `comment` is the supported place to keep notes.\n\nApp Quality Config\n\n```\n{\n  \"elementFilters\": [\n    {\n      \"selector\": \".intercom-launcher\",\n      \"include\": false,\n      \"comment\": \"Third-party chat widget, not covered by our tests\"\n    }\n  ]\n}\n```\n",
      "section": "ui-coverage",
      "anchors": [
        "comments"
      ],
      "path": "/llm/json/chunked/ui-coverage/configuration/overview.json",
      "token_estimate": 187
    },
    {
      "id": "ui-coverage/configuration/overview#full-configuration-reference",
      "doc_id": "ui-coverage/configuration/overview",
      "heading": "Full configuration reference",
      "heading_level": 3,
      "content_markdown": "### Full configuration reference\n\nThe shape of every available option, with the type each value expects:\n\nApp Quality Config\n\n```\n{\n  // Root level only: applies to both UI Coverage and Cypress Accessibility\n  \"views\": [\n    {\n      \"pattern\": string,\n      \"groupBy\": string | [string],\n      \"comment\": string\n    }\n  ],\n  // or as a bare pattern string, if you do not want comments or grouping: \"views\": [\"/users/*\"]\n\n  // Shared properties. Valid here and, with the same shape, nested under\n  // \"uiCoverage\". If both are present, the nested list replaces the root-level one\n  \"viewFilters\": [\n    {\n      \"pattern\": string,\n      \"include\": boolean,\n      \"comment\": string\n    }\n  ],\n  \"elementFilters\": [\n    {\n      \"selector\": string,\n      \"include\": boolean,\n      \"documentScope\": [string],\n      \"comment\": string\n    }\n  ],\n  \"significantAttributes\": [\n    string\n  ],\n  \"attributeFilters\": [\n    {\n      \"attribute\": string,\n      \"value\": string,\n      \"include\": boolean,\n      \"comment\": string\n    }\n  ],\n  \"comment\": string,\n\n  \"uiCoverage\": {\n    // UI Coverage only\n    \"elements\": [\n      {\n        \"selector\": string,\n        \"name\": string,\n        \"documentScope\": [string],\n        \"comment\": string\n      }\n    ],\n    \"elementGroups\": [\n      {\n        \"selector\": string,\n        \"name\": string,\n        \"documentScope\": [string],\n        \"comment\": string\n      }\n    ],\n    \"additionalInteractionCommands\": [\n      string\n    ],\n    \"allowedInteractionCommands\": [\n      {\n        \"selector\": string,\n        \"commands\": [string],\n        \"documentScope\": [string],\n        \"comment\": string\n      }\n    ],\n    \"comment\": string\n    // plus viewFilters, elementFilters, significantAttributes, and\n    // attributeFilters: same shape as the root, replacing it for UI Coverage\n  },\n\n  \"profiles\": [\n    {\n      \"name\": string,\n      \"config\": {\n        // Any App Quality configuration options\n      },\n      \"comment\": string\n    }\n  ]\n}\n```\n",
      "section": "ui-coverage",
      "anchors": [
        "full-configuration-reference"
      ],
      "path": "/llm/json/chunked/ui-coverage/configuration/overview.json",
      "token_estimate": 295
    },
    {
      "id": "ui-coverage/configuration/overview#how-rules-are-applied",
      "doc_id": "ui-coverage/configuration/overview",
      "heading": "How rules are applied",
      "heading_level": 2,
      "content_markdown": "## How rules are applied\n\nTwo behaviors govern the rules you write:\n\n*   **Order matters** for [`views`](/llm/markdown/ui-coverage/configuration/views.md), [`viewFilters`](/llm/markdown/ui-coverage/configuration/viewfilters.md), [`elementFilters`](/llm/markdown/ui-coverage/configuration/elementfilters.md), [`elementGroups`](/llm/markdown/ui-coverage/configuration/elementgroups.md), [`attributeFilters`](/llm/markdown/ui-coverage/configuration/attributefilters.md), and [`profiles`](/llm/markdown/ui-coverage/configuration/profiles.md): rules are evaluated top to bottom and the **first** rule that matches an element or URL wins; later rules that also match it are ignored. List specific rules before broad, catch-all rules, and place an `include: true` exception above the `include: false` rule it should override. Two properties differ: for [`elements`](/llm/markdown/ui-coverage/configuration/elements.md) the **last** matching rule wins, and for [`allowedInteractionCommands`](/llm/markdown/ui-coverage/configuration/allowedinteractioncommands.md), order has no effect.\n*   **Unknown properties are rejected.** When you save, Cypress Cloud validates your configuration against a strict schema and rejects anything it doesn't recognize, such as a misspelled property, a value of the wrong type, or a note on a property that doesn't accept one. Correct the flagged property to save, and keep freeform notes in a [`comment`](#Comments).\n",
      "section": "ui-coverage",
      "anchors": [
        "how-rules-are-applied"
      ],
      "path": "/llm/json/chunked/ui-coverage/configuration/overview.json",
      "token_estimate": 191
    },
    {
      "id": "ui-coverage/configuration/overview#configuration-scope",
      "doc_id": "ui-coverage/configuration/overview",
      "heading": "Configuration scope",
      "heading_level": 2,
      "content_markdown": "## Configuration scope\n\nSome properties are shared across App Quality products, and some belong to UI Coverage alone.\n\n*   **Shared properties**: `elementFilters`, `viewFilters`, `attributeFilters`, and `significantAttributes` apply to both UI Coverage and Cypress Accessibility when set at the root of your configuration. To apply one to a single product, nest it under a `uiCoverage` or `accessibility` key. A nested value **completely replaces** the root-level value for that product (the two are not merged), so repeat any shared rules you still want in the nested list. To disable a shared property for one product, nest an empty list (`\"elementFilters\": []`) rather than `null`, which falls back to the root value.\n*   **Shared, but not nestable**: `views` applies to both UI Coverage and Cypress Accessibility and can only be set at the root.\n*   **UI Coverage only**: `elementGroups`, `elements`, `additionalInteractionCommands`, and `allowedInteractionCommands` are specific to UI Coverage and are always set under the `uiCoverage` key.\n",
      "section": "ui-coverage",
      "anchors": [
        "configuration-scope"
      ],
      "path": "/llm/json/chunked/ui-coverage/configuration/overview.json",
      "token_estimate": 204
    },
    {
      "id": "ui-coverage/configuration/overview#viewing-configuration-for-a-run",
      "doc_id": "ui-coverage/configuration/overview",
      "heading": "Viewing configuration for a run",
      "heading_level": 2,
      "content_markdown": "## Viewing configuration for a run\n\nEvery run permanently records the exact configuration it was processed with, so the runs themselves are the history of how your configuration has changed over time. You can review a run's configuration in Cypress Cloud, or read it programmatically with the Results API.\n\n### In Cypress Cloud\n\nTo review the configuration a specific run used, open its **Properties** tab, as shown below. This displays the configuration as it was applied when the run was processed. When you open a run that was processed with an older configuration than the one currently saved, the report flags it with a \"configuration updated\" message, and you can [regenerate](#Setting-configuration) the run to reprocess it with the current configuration.\n\n### From the Results API\n\nThe [UI Coverage Results API](/llm/markdown/ui-coverage/results-api.md) exposes the applied configuration on the `config` property of its result, so you can read it in a CI workflow:\n\n```\nconst { getUICoverageResults } = require('@cypress/extract-cloud-results')\n\ngetUICoverageResults().then((results) => {\n  if (results.config) {\n    // ISO timestamp of when the applied configuration was last saved\n    console.log(results.config.updatedAt)\n\n    // The App Quality configuration that was applied to the run\n    console.log(results.config.value)\n  }\n})\n```\n\nIf no configuration was applied to the run, `config` may be absent, so check for it before reading `value`.\n",
      "section": "ui-coverage",
      "anchors": [
        "viewing-configuration-for-a-run"
      ],
      "path": "/llm/json/chunked/ui-coverage/configuration/overview.json",
      "token_estimate": 279
    },
    {
      "id": "ui-coverage/configuration/overview#in-cypress-cloud",
      "doc_id": "ui-coverage/configuration/overview",
      "heading": "In Cypress Cloud",
      "heading_level": 3,
      "content_markdown": "### In Cypress Cloud\n\nTo review the configuration a specific run used, open its **Properties** tab, as shown below. This displays the configuration as it was applied when the run was processed. When you open a run that was processed with an older configuration than the one currently saved, the report flags it with a \"configuration updated\" message, and you can [regenerate](#Setting-configuration) the run to reprocess it with the current configuration.\n",
      "section": "ui-coverage",
      "anchors": [
        "in-cypress-cloud"
      ],
      "path": "/llm/json/chunked/ui-coverage/configuration/overview.json",
      "token_estimate": 95
    },
    {
      "id": "ui-coverage/configuration/overview#from-the-results-api",
      "doc_id": "ui-coverage/configuration/overview",
      "heading": "From the Results API",
      "heading_level": 3,
      "content_markdown": "### From the Results API\n\nThe [UI Coverage Results API](/llm/markdown/ui-coverage/results-api.md) exposes the applied configuration on the `config` property of its result, so you can read it in a CI workflow:\n\n```\nconst { getUICoverageResults } = require('@cypress/extract-cloud-results')\n\ngetUICoverageResults().then((results) => {\n  if (results.config) {\n    // ISO timestamp of when the applied configuration was last saved\n    console.log(results.config.updatedAt)\n\n    // The App Quality configuration that was applied to the run\n    console.log(results.config.value)\n  }\n})\n```\n\nIf no configuration was applied to the run, `config` may be absent, so check for it before reading `value`.\n",
      "section": "ui-coverage",
      "anchors": [
        "from-the-results-api"
      ],
      "path": "/llm/json/chunked/ui-coverage/configuration/overview.json",
      "token_estimate": 119
    },
    {
      "id": "ui-coverage/configuration/overview#see-also",
      "doc_id": "ui-coverage/configuration/overview",
      "heading": "See also",
      "heading_level": 2,
      "content_markdown": "## See also\n\n*   [Views](/llm/markdown/ui-coverage/configuration/views.md)\n*   [View Filters](/llm/markdown/ui-coverage/configuration/viewfilters.md)\n*   [Element Filters](/llm/markdown/ui-coverage/configuration/elementfilters.md)\n*   [Elements](/llm/markdown/ui-coverage/configuration/elements.md)\n*   [Element Groups](/llm/markdown/ui-coverage/configuration/elementgroups.md)\n*   [Significant Attributes](/llm/markdown/ui-coverage/configuration/significantattributes.md)\n*   [Attribute Filters](/llm/markdown/ui-coverage/configuration/attributefilters.md)\n*   [Additional Interaction Commands](/llm/markdown/ui-coverage/configuration/additionalinteractioncommands.md)\n*   [Allowed Interaction Commands](/llm/markdown/ui-coverage/configuration/allowedinteractioncommands.md)\n*   [Profiles](/llm/markdown/ui-coverage/configuration/profiles.md)\n",
      "section": "ui-coverage",
      "anchors": [
        "see-also"
      ],
      "path": "/llm/json/chunked/ui-coverage/configuration/overview.json",
      "token_estimate": 43
    }
  ]
}