Skip to content

Commit

Permalink
Merge pull request #570 from chromaui/chdx-1030
Browse files Browse the repository at this point in the history
Ignore selectors
  • Loading branch information
winkerVSbecks authored Oct 1, 2024
2 parents fb7bbe5 + 45030b1 commit 4cf3e0a
Show file tree
Hide file tree
Showing 7 changed files with 205 additions and 128 deletions.
2 changes: 1 addition & 1 deletion src/content/guides/config-with-story-params.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ sidebar: { order: 7, label: Config via params }

When using Chromatic with Storybook, you can control the snapshot capturing behavior through Storybook parameters. [Parameters](https://storybook.js.org/docs/api/parameters#story-parameters) are static metadata that can be attached at the story, component (meta), and project (global) levels.

This guide will show you how to configure Chromatic features like [`diffThreshold`](/docs/threshold), [`forcedColors`](/docs/media-features), [`disableSnapshot`](/docs/ignoring-elements#ignore-tests), and more using Storybook parameters.
This guide will show you how to configure Chromatic features like [`diffThreshold`](/docs/threshold), [`forcedColors`](/docs/media-features), [`disableSnapshot`](/docs/disable-snapshots), and more using Storybook parameters.

## Story level parameters

Expand Down
2 changes: 1 addition & 1 deletion src/content/overview/diff-inspector.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -118,7 +118,7 @@ it("A test that does something", {

You can configure Chromatic to ignore changes in certain parts of a snapshot by attaching the `chromatic-ignore` as a class or a data attribute to DOM elements. These ignored regions can then be easily highlighted within the Diff Inspector.

[Learn more about ignoring elements »](/docs/ignoring-elements/#ignore-dom-elements)
[Learn more about ignoring elements »](/docs/ignoring-elements)

<video autoPlay muted playsInline loop width="542px" style="margin-bottom: 1em">
<source src="/docs/assets/ignored-regions.mp4" type="video/mp4" />
Expand Down
2 changes: 1 addition & 1 deletion src/content/snapshot/troubleshooting-snapshots.md
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ It's essential that your components and stories render in a **consistent** fashi

- **UI takes time to render**: UI can take extra time to "settle" into it's final orientation. Add a [delay](/docs/delay) to take a snapshot after waiting a period of time. Note that this technique can make the UI rendering inconsistency less obvious in snapshots, but it won't eliminate the underlying issue in how UI renders.

- **Intentional randomness**: Some stories may render unpredictably intentionally. If this is the case you may want to [ignore the story](/docs/ignoring-elements#with-storybook) from UI Tests and move on.
- **Intentional randomness**: Some stories may render unpredictably intentionally. If this is the case you may want to [ignore the story](/docs/disable-snapshots#with-storybook) from UI Tests and move on.
If you still need inconsistent elements for local development purposes inside Storybook, you can use `isChromatic()` exported from [our package](/docs/ischromatic) to apply the solutions above only when in the Chromatic environment.

### Serve static files
Expand Down
8 changes: 3 additions & 5 deletions src/content/snapshotOptions/animations.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -74,7 +74,7 @@ By default, CSS animations are paused at the end of their animation cycle (i.e.,
<Fragment slot="cypress">
```ts title="cypress/e2e/Product.cy.js|ts"
describe("Not found", () => {
it("Successfully loads the page", { env: {
it("Successfully loads the page", { env: {
pauseAnimationAtEnd: false // Overrides the default behavior and pauses the animation at the first frame for this test.
}}, () => {
cy.visit("/products");
Expand All @@ -101,11 +101,10 @@ MotionGlobalConfig.skipAnimations = isChromatic();

<div class="aside">

ℹ️ For more information on disabling animations in other libraries, refer to the library's documentation or community resources to learn how to achieve this.
ℹ️ For more information on disabling animations in other libraries, refer to the library's documentation or community resources to learn how to achieve this.

</div>


## GIFs and Videos

Chromatic automatically pauses videos and animated GIFs at their first frame, ensuring consistent visual tests without the need for custom workarounds. If you specify a [poster](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/video#poster) attribute for videos, Chromatic will use that image instead.
Expand All @@ -116,12 +115,11 @@ If you cannot turn off animations (for example, if disabling JavaScript animatio

Alternatively, [ignore an element](/docs/ignoring-elements) to omit a visible area of your component when comparing snapshots.


## Troubleshooting

<details>
<summary>Why are my animations working differently in Chromatic?</summary>

If you're experiencing issues with animations not being paused as expected, it is likely due to an infrastructure update. With Capture Stack's [version 6](/docs/infrastructure-release-notes#version-6) general availability (released in February 2024), the `pauseAnimationAtEnd` feature was enabled by default, leading to a change in behavior. If your tests relied on the previous behavior, you need to update your tests and configure the `pauseAnimationAtEnd` option to `false`.

</details>
</details>
118 changes: 118 additions & 0 deletions src/content/snapshotOptions/disable-snapshots.mdx
Original file line number Diff line number Diff line change
@@ -0,0 +1,118 @@
---
layout: "../../layouts/Layout.astro"
title: Disable snapshots
description: Learn how you can tell Chromatic to skip snapshots for certain tests
sidebar: { order: 5 }
---

import ParamsCallout from "../../components/ParamsCallout.astro";

import IntegrationSnippets from "../../components/IntegrationSnippets.astro";

# Disable snapshots for specific tests

By default, Chromatic captures snapshots for all your UI components, whether you're testing with Storybook, [Playwright](/docs/playwright) or [Cypress](/docs/cypress), ensuring your UI remains consistent at all times. However, you can disable specific tests that are irrelevant or cause false positives.

## With Storybook

If you're running tests with Storybook, you can enable the `disableSnapshot` option to configure Chromatic to ignore stories and prevent them from being snapshotted. This is useful if you're adopting Chromatic incrementally and want to turn off snapshotting for specific stories or work with components that could contain dynamic content or animations that may trigger unwanted visual changes.

```ts title="src/components/NotFound.stories.ts|tsx"
// Adjust this import to match your framework (e.g., nextjs, vue3-vite)
import type { Meta, StoryObj } from "@storybook/your-framework";

/*
* Replace the @storybook/test package with the following if you are using a version of Storybook earlier than 8.0:
* import { within } from "@storybook/testing-library";
* import { expect } from "@storybook/jest";
*/
import { expect, within } from "@storybook/test";

import { NotFound } from "./NotFound";

const meta: Meta<typeof NotFound> = {
component: NotFound,
title: "NotFound",
parameters: {
// Disables Chromatic's snapshotting on a component level
chromatic: { disableSnapshot: true },
},
};

export default meta;
type Story = StoryObj<typeof NotFound>;

export const Default: Story = {
play: async ({ canvasElement }) => {
const canvas = within(canvasElement);
await expect(canvas.getByText("Page not found")).toBeInTheDocument();
},
};
```

<ParamsCallout name="disableSnapshot" integration="storybook" />

## With Playwright or Cypress

By default, Chromatic's Playwright and Cypress integrations run tests and captures a snapshot at the end of each E2E test; either it passes or fails. However, if you've enabled targeted snapshots with [Playwright](/docs/playwright/targeted-snapshots) or [Cypress](/docs/cypress/targeted-snapshots) to pinpoint visual changes when the test reaches a specific point, you can opt out of the automated snapshotting process by enabling the `disableAutoSnapshot` configuration option. This is useful when capturing snapshots at specific points in your test, such as when a particular element is visible or when a specific action is performed.

{/* prettier-ignore-start */}

<IntegrationSnippets>
<Fragment slot="playwright" visible="true">
```ts title="tests/NotFound.spec.js|ts"
import { expect, takeSnapshot, test } from "@chromatic-com/playwright";

test.describe("Not found", () => {
test.use({
disableAutoSnapshot: true, // Disables the automated snapshot generated at the end of the test
})
test("should show a 404 page", async ({ page }, testInfo) => {
await page.goto("/404");

await expect(page).toHaveTitle("Page not found");

await takeSnapshot(page, 'Initial 404 page', testInfo);

// Interacts with the page by clicking the "Go back" button
await page.getByRole("button", { name: "Go back" }).click();

await takeSnapshot(page, 'Home page loaded', testInfo);
});
});
```
<ParamsCallout name="disableAutoSnapshot" integration="playwright" />
</Fragment>
<Fragment slot="cypress" visible="true">
```ts title="cypress/e2e/NotFound.cy.js|ts"
describe("Not found", () => {
it("should show a 404 page", { env: {
disableAutoSnapshot: true // Disables the automated snapshot generated at the end of the test
}}, () => {
cy.visit("/404");
cy.title().should("equal", "Page not found");
cy.takeSnapshot('Initial 404 page');
// Interacts with the page by clicking the "Go back" button
cy.get("button").contains("Go back").click()
cy.takeSnapshot('Home page loaded');
});
});
```
<ParamsCallout name="disableAutoSnapshot" integration="cypress" />
</Fragment>
</IntegrationSnippets>

{/* prettier-ignore-end */}

## Frequently asked questions

<details>
<summary>Why are disabled stories still listed?</summary>

If you enable the `disabledSnapshot` configuration option to prevent your stories from being snapshotted, Chromatic will continue to index them and display them in the Library view. However, the "Snapshot" tab will no longer be visible in the UI for these stories. To remove the story altogether, you will need to delete it from your Storybook.

</details>
Loading

0 comments on commit 4cf3e0a

Please sign in to comment.