creevey 0.10.0-beta.9 → 0.10.0-rc.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AUTHORS +2 -0
- package/CHANGELOG.md +281 -0
- package/README.md +19 -41
- package/dist/client/addon/components/Addon.js +18 -8
- package/dist/client/addon/components/Addon.js.map +1 -1
- package/dist/client/addon/components/Panel.js +2 -2
- package/dist/client/addon/components/Panel.js.map +1 -1
- package/dist/client/addon/components/TestSelect.js +2 -2
- package/dist/client/addon/components/TestSelect.js.map +1 -1
- package/dist/client/addon/components/Tools.js +19 -9
- package/dist/client/addon/components/Tools.js.map +1 -1
- package/dist/client/addon/controller.d.ts +1 -1
- package/dist/client/addon/controller.js +3 -3
- package/dist/client/addon/controller.js.map +1 -1
- package/dist/client/addon/decorator.d.ts +1 -1
- package/dist/client/addon/makeDecorator.d.ts +9 -0
- package/dist/client/addon/makeDecorator.js +48 -0
- package/dist/client/addon/makeDecorator.js.map +1 -0
- package/dist/client/addon/manager.js +38 -39
- package/dist/client/addon/manager.js.map +1 -1
- package/dist/client/addon/preset.d.ts +0 -1
- package/dist/client/addon/preset.js +3 -2
- package/dist/client/addon/preset.js.map +1 -1
- package/dist/client/addon/preview.d.ts +1 -1
- package/dist/client/addon/withCreevey.d.ts +5 -3
- package/dist/client/addon/withCreevey.js +5 -20
- package/dist/client/addon/withCreevey.js.map +1 -1
- package/dist/client/shared/components/ImagesView/BlendView.d.ts +2 -2
- package/dist/client/shared/components/ImagesView/BlendView.js +18 -8
- package/dist/client/shared/components/ImagesView/BlendView.js.map +1 -1
- package/dist/client/shared/components/ImagesView/ImagesView.js +1 -1
- package/dist/client/shared/components/ImagesView/ImagesView.js.map +1 -1
- package/dist/client/shared/components/ImagesView/SideBySideView.d.ts +2 -2
- package/dist/client/shared/components/ImagesView/SideBySideView.js +19 -9
- package/dist/client/shared/components/ImagesView/SideBySideView.js.map +1 -1
- package/dist/client/shared/components/ImagesView/SlideView.d.ts +2 -2
- package/dist/client/shared/components/ImagesView/SlideView.js +19 -9
- package/dist/client/shared/components/ImagesView/SlideView.js.map +1 -1
- package/dist/client/shared/components/ImagesView/SwapView.d.ts +2 -2
- package/dist/client/shared/components/ImagesView/SwapView.js +19 -9
- package/dist/client/shared/components/ImagesView/SwapView.js.map +1 -1
- package/dist/client/shared/components/ImagesView/common.d.ts +1 -1
- package/dist/client/shared/components/PageFooter/PageFooter.js +1 -1
- package/dist/client/shared/components/PageFooter/PageFooter.js.map +1 -1
- package/dist/client/shared/components/PageFooter/Paging.js +1 -1
- package/dist/client/shared/components/PageFooter/Paging.js.map +1 -1
- package/dist/client/shared/components/PageHeader/ImagePreview.d.ts +2 -2
- package/dist/client/shared/components/PageHeader/ImagePreview.js +1 -1
- package/dist/client/shared/components/PageHeader/ImagePreview.js.map +1 -1
- package/dist/client/shared/components/PageHeader/PageHeader.js +34 -13
- package/dist/client/shared/components/PageHeader/PageHeader.js.map +1 -1
- package/dist/client/shared/components/ResultsPage.d.ts +2 -2
- package/dist/client/shared/components/ResultsPage.js +22 -10
- package/dist/client/shared/components/ResultsPage.js.map +1 -1
- package/dist/client/shared/creeveyClientApi.js +18 -1
- package/dist/client/shared/creeveyClientApi.js.map +1 -1
- package/dist/client/shared/helpers.d.ts +1 -3
- package/dist/client/shared/helpers.js +4 -19
- package/dist/client/shared/helpers.js.map +1 -1
- package/dist/client/web/CreeveyApp.d.ts +1 -0
- package/dist/client/web/CreeveyApp.js +22 -9
- package/dist/client/web/CreeveyApp.js.map +1 -1
- package/dist/client/web/CreeveyContext.d.ts +1 -0
- package/dist/client/web/CreeveyContext.js +18 -7
- package/dist/client/web/CreeveyContext.js.map +1 -1
- package/dist/client/web/CreeveyLoader.d.ts +1 -1
- package/dist/client/web/CreeveyLoader.js +3 -3
- package/dist/client/web/CreeveyLoader.js.map +1 -1
- package/dist/client/web/CreeveyView/SideBar/Checkbox.d.ts +4 -4
- package/dist/client/web/CreeveyView/SideBar/Checkbox.js +36 -6
- package/dist/client/web/CreeveyView/SideBar/Checkbox.js.map +1 -1
- package/dist/client/web/CreeveyView/SideBar/Search.js +18 -8
- package/dist/client/web/CreeveyView/SideBar/Search.js.map +1 -1
- package/dist/client/web/CreeveyView/SideBar/SideBar.js +26 -12
- package/dist/client/web/CreeveyView/SideBar/SideBar.js.map +1 -1
- package/dist/client/web/CreeveyView/SideBar/SideBarFooter.js +28 -17
- package/dist/client/web/CreeveyView/SideBar/SideBarFooter.js.map +1 -1
- package/dist/client/web/CreeveyView/SideBar/SideBarHeader.js +32 -12
- package/dist/client/web/CreeveyView/SideBar/SideBarHeader.js.map +1 -1
- package/dist/client/web/CreeveyView/SideBar/SuiteLink.d.ts +6 -6
- package/dist/client/web/CreeveyView/SideBar/SuiteLink.js +20 -11
- package/dist/client/web/CreeveyView/SideBar/SuiteLink.js.map +1 -1
- package/dist/client/web/CreeveyView/SideBar/TestLink.js +20 -11
- package/dist/client/web/CreeveyView/SideBar/TestLink.js.map +1 -1
- package/dist/client/web/CreeveyView/SideBar/TestStatusIcon.d.ts +2 -2
- package/dist/client/web/CreeveyView/SideBar/TestStatusIcon.js +2 -2
- package/dist/client/web/CreeveyView/SideBar/TestStatusIcon.js.map +1 -1
- package/dist/client/web/CreeveyView/SideBar/TestsStatus.d.ts +2 -2
- package/dist/client/web/CreeveyView/SideBar/TestsStatus.js +3 -2
- package/dist/client/web/CreeveyView/SideBar/TestsStatus.js.map +1 -1
- package/dist/client/web/CreeveyView/SideBar/Toggle.js +1 -1
- package/dist/client/web/CreeveyView/SideBar/Toggle.js.map +1 -1
- package/dist/client/web/KeyboardEventsContext.js +17 -7
- package/dist/client/web/KeyboardEventsContext.js.map +1 -1
- package/dist/client/web/assets/index-CtSq3IhG.js +518 -0
- package/dist/client/web/index.html +1 -1
- package/dist/client/web/index.js +26 -11
- package/dist/client/web/index.js.map +1 -1
- package/dist/client/web/themes.d.ts +2 -0
- package/dist/client/web/themes.js +22 -0
- package/dist/client/web/themes.js.map +1 -0
- package/dist/creevey.d.ts +1 -1
- package/dist/creevey.js +122 -41
- package/dist/creevey.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/playwright/generator.d.ts +34 -0
- package/dist/playwright/generator.js +267 -0
- package/dist/playwright/generator.js.map +1 -0
- package/dist/playwright/helpers.d.ts +2 -0
- package/dist/playwright/helpers.js +29 -0
- package/dist/playwright/helpers.js.map +1 -0
- package/dist/playwright/reporter.d.ts +83 -0
- package/dist/playwright/reporter.js +334 -0
- package/dist/playwright/reporter.js.map +1 -0
- package/dist/playwright/setup.d.ts +3 -0
- package/dist/playwright/setup.js +72 -0
- package/dist/playwright/setup.js.map +1 -0
- package/dist/playwright.d.ts +1 -0
- package/dist/playwright.js +3 -1
- package/dist/playwright.js.map +1 -1
- package/dist/server/compare.d.ts +18 -0
- package/dist/server/compare.js +182 -0
- package/dist/server/compare.js.map +1 -0
- package/dist/server/config.d.ts +3 -3
- package/dist/server/config.js +75 -8
- package/dist/server/config.js.map +1 -1
- package/dist/server/connection.d.ts +3 -0
- package/dist/server/connection.js +28 -0
- package/dist/server/connection.js.map +1 -0
- package/dist/server/docker.d.ts +1 -1
- package/dist/server/docker.js +54 -32
- package/dist/server/docker.js.map +1 -1
- package/dist/server/index.d.ts +2 -2
- package/dist/server/index.js +166 -64
- package/dist/server/index.js.map +1 -1
- package/dist/server/master/api.d.ts +11 -6
- package/dist/server/master/api.js +88 -25
- package/dist/server/master/api.js.map +1 -1
- package/dist/server/master/handlers/capture-handler.d.ts +5 -0
- package/dist/server/master/handlers/capture-handler.js +25 -0
- package/dist/server/master/handlers/capture-handler.js.map +1 -0
- package/dist/server/master/handlers/index.d.ts +4 -0
- package/dist/server/master/handlers/index.js +21 -0
- package/dist/server/master/handlers/index.js.map +1 -0
- package/dist/server/master/handlers/ping-handler.d.ts +2 -0
- package/dist/server/master/handlers/ping-handler.js +8 -0
- package/dist/server/master/handlers/ping-handler.js.map +1 -0
- package/dist/server/master/handlers/static-handler.d.ts +1 -0
- package/dist/server/master/handlers/static-handler.js +20 -0
- package/dist/server/master/handlers/static-handler.js.map +1 -0
- package/dist/server/master/handlers/stories-handler.d.ts +4 -0
- package/dist/server/master/handlers/stories-handler.js +24 -0
- package/dist/server/master/handlers/stories-handler.js.map +1 -0
- package/dist/server/master/master.js +7 -24
- package/dist/server/master/master.js.map +1 -1
- package/dist/server/master/pool.d.ts +1 -0
- package/dist/server/master/pool.js +5 -3
- package/dist/server/master/pool.js.map +1 -1
- package/dist/server/master/queue.d.ts +1 -1
- package/dist/server/master/queue.js +14 -6
- package/dist/server/master/queue.js.map +1 -1
- package/dist/server/master/runner.d.ts +6 -6
- package/dist/server/master/runner.js +98 -130
- package/dist/server/master/runner.js.map +1 -1
- package/dist/server/master/server.d.ts +1 -1
- package/dist/server/master/server.js +193 -88
- package/dist/server/master/server.js.map +1 -1
- package/dist/server/master/start.d.ts +1 -2
- package/dist/server/master/start.js +13 -29
- package/dist/server/master/start.js.map +1 -1
- package/dist/server/master/testsManager.d.ts +81 -0
- package/dist/server/master/testsManager.js +282 -0
- package/dist/server/master/testsManager.js.map +1 -0
- package/dist/server/playwright/docker-file.d.ts +1 -1
- package/dist/server/playwright/docker-file.js +17 -8
- package/dist/server/playwright/docker-file.js.map +1 -1
- package/dist/server/playwright/docker.d.ts +2 -1
- package/dist/server/playwright/docker.js +10 -2
- package/dist/server/playwright/docker.js.map +1 -1
- package/dist/server/playwright/index-source.mjs +16 -0
- package/dist/server/playwright/internal.d.ts +7 -7
- package/dist/server/playwright/internal.js +137 -79
- package/dist/server/playwright/internal.js.map +1 -1
- package/dist/server/playwright/webdriver.d.ts +3 -3
- package/dist/server/playwright/webdriver.js +0 -6
- package/dist/server/playwright/webdriver.js.map +1 -1
- package/dist/server/providers/browser.js +4 -3
- package/dist/server/providers/browser.js.map +1 -1
- package/dist/server/providers/hybrid.js +2 -2
- package/dist/server/providers/hybrid.js.map +1 -1
- package/dist/server/report.d.ts +10 -0
- package/dist/server/report.js +45 -0
- package/dist/server/report.js.map +1 -0
- package/dist/server/reporters/creevey.d.ts +7 -0
- package/dist/server/reporters/creevey.js +63 -0
- package/dist/server/reporters/creevey.js.map +1 -0
- package/dist/server/reporters/index.d.ts +2 -0
- package/dist/server/reporters/index.js +16 -0
- package/dist/server/reporters/index.js.map +1 -0
- package/dist/server/reporters/junit.d.ts +16 -0
- package/dist/server/reporters/junit.js +167 -0
- package/dist/server/reporters/junit.js.map +1 -0
- package/dist/server/reporters/teamcity.d.ts +7 -0
- package/dist/server/reporters/teamcity.js +60 -0
- package/dist/server/reporters/teamcity.js.map +1 -0
- package/dist/server/selenium/internal.d.ts +3 -3
- package/dist/server/selenium/internal.js +48 -34
- package/dist/server/selenium/internal.js.map +1 -1
- package/dist/server/selenium/selenoid.js +12 -6
- package/dist/server/selenium/selenoid.js.map +1 -1
- package/dist/server/selenium/webdriver.d.ts +3 -3
- package/dist/server/selenium/webdriver.js +4 -8
- package/dist/server/selenium/webdriver.js.map +1 -1
- package/dist/server/shutdown.d.ts +1 -0
- package/dist/server/shutdown.js +23 -0
- package/dist/server/shutdown.js.map +1 -0
- package/dist/server/stories.d.ts +0 -1
- package/dist/server/stories.js +0 -12
- package/dist/server/stories.js.map +1 -1
- package/dist/server/telemetry.js +3 -3
- package/dist/server/telemetry.js.map +1 -1
- package/dist/server/testsFiles/parser.js +45 -5
- package/dist/server/testsFiles/parser.js.map +1 -1
- package/dist/server/utils.d.ts +23 -0
- package/dist/server/utils.js +113 -13
- package/dist/server/utils.js.map +1 -1
- package/dist/server/webdriver.d.ts +1 -1
- package/dist/server/worker/context.d.ts +3 -0
- package/dist/server/worker/context.js +15 -0
- package/dist/server/worker/context.js.map +1 -0
- package/dist/server/worker/match-image.d.ts +8 -12
- package/dist/server/worker/match-image.js +11 -178
- package/dist/server/worker/match-image.js.map +1 -1
- package/dist/server/worker/start.d.ts +2 -2
- package/dist/server/worker/start.js +27 -63
- package/dist/server/worker/start.js.map +1 -1
- package/dist/shared/index.d.ts +1 -1
- package/dist/shared/index.js +9 -7
- package/dist/shared/index.js.map +1 -1
- package/dist/types.d.ts +84 -43
- package/dist/types.js +65 -1
- package/dist/types.js.map +1 -1
- package/docs/cli.md +80 -0
- package/docs/config.md +179 -165
- package/docs/examples/playwright-reporer/playwright.config.ts +36 -0
- package/docs/migration-0.9-to-0.10.md +182 -0
- package/docs/playwright-reporter.md +170 -0
- package/docs/storybook.md +60 -0
- package/docs/tests.md +50 -45
- package/package.json +78 -83
- package/playwright.config.mts +46 -0
- package/src/client/addon/components/Addon.tsx +1 -1
- package/src/client/addon/components/Panel.tsx +2 -2
- package/src/client/addon/components/TestSelect.tsx +2 -2
- package/src/client/addon/components/Tools.tsx +2 -2
- package/src/client/addon/controller.ts +4 -4
- package/src/client/addon/makeDecorator.ts +69 -0
- package/src/client/addon/manager.ts +38 -37
- package/src/client/addon/preset.ts +2 -1
- package/src/client/addon/withCreevey.ts +10 -18
- package/src/client/shared/components/ImagesView/BlendView.tsx +1 -1
- package/src/client/shared/components/ImagesView/ImagesView.tsx +1 -1
- package/src/client/shared/components/ImagesView/SideBySideView.tsx +2 -2
- package/src/client/shared/components/ImagesView/SlideView.tsx +2 -2
- package/src/client/shared/components/ImagesView/SwapView.tsx +2 -2
- package/src/client/shared/components/ImagesView/common.ts +1 -1
- package/src/client/shared/components/PageFooter/PageFooter.tsx +1 -1
- package/src/client/shared/components/PageFooter/Paging.tsx +1 -1
- package/src/client/shared/components/PageHeader/ImagePreview.tsx +1 -1
- package/src/client/shared/components/PageHeader/PageHeader.tsx +23 -7
- package/src/client/shared/components/ResultsPage.tsx +6 -4
- package/src/client/shared/creeveyClientApi.ts +19 -1
- package/src/client/shared/helpers.ts +4 -24
- package/src/client/web/CreeveyApp.tsx +5 -2
- package/src/client/web/CreeveyContext.tsx +2 -0
- package/src/client/web/CreeveyLoader.tsx +2 -2
- package/src/client/web/CreeveyView/SideBar/Checkbox.tsx +3 -3
- package/src/client/web/CreeveyView/SideBar/Search.tsx +1 -1
- package/src/client/web/CreeveyView/SideBar/SideBar.tsx +11 -6
- package/src/client/web/CreeveyView/SideBar/SideBarFooter.tsx +21 -19
- package/src/client/web/CreeveyView/SideBar/SideBarHeader.tsx +20 -5
- package/src/client/web/CreeveyView/SideBar/SuiteLink.tsx +10 -8
- package/src/client/web/CreeveyView/SideBar/TestLink.tsx +9 -7
- package/src/client/web/CreeveyView/SideBar/TestStatusIcon.tsx +2 -2
- package/src/client/web/CreeveyView/SideBar/TestsStatus.tsx +3 -2
- package/src/client/web/CreeveyView/SideBar/Toggle.tsx +1 -1
- package/src/client/web/index.tsx +10 -5
- package/src/client/web/themes.ts +24 -0
- package/src/creevey.ts +92 -38
- package/src/playwright/generator.ts +360 -0
- package/src/playwright/helpers.ts +31 -0
- package/src/playwright/reporter.ts +381 -0
- package/src/playwright/setup.ts +84 -0
- package/src/playwright.ts +1 -0
- package/src/server/compare.ts +260 -0
- package/src/server/config.ts +52 -9
- package/src/server/connection.ts +26 -0
- package/src/server/docker.ts +62 -34
- package/src/server/index.ts +165 -79
- package/src/server/master/api.ts +94 -28
- package/src/server/master/handlers/capture-handler.ts +20 -0
- package/src/server/master/handlers/index.ts +4 -0
- package/src/server/master/handlers/ping-handler.ts +6 -0
- package/src/server/master/handlers/static-handler.ts +16 -0
- package/src/server/master/handlers/stories-handler.ts +20 -0
- package/src/server/master/master.ts +10 -27
- package/src/server/master/pool.ts +7 -3
- package/src/server/master/queue.ts +21 -7
- package/src/server/master/runner.ts +123 -134
- package/src/server/master/server.ts +214 -101
- package/src/server/master/start.ts +19 -41
- package/src/server/master/testsManager.ts +316 -0
- package/src/server/playwright/docker-file.ts +20 -8
- package/src/server/playwright/docker.ts +16 -3
- package/src/server/playwright/index-source.mjs +16 -0
- package/src/server/playwright/internal.ts +169 -96
- package/src/server/playwright/webdriver.ts +4 -10
- package/src/server/providers/browser.ts +4 -3
- package/src/server/providers/hybrid.ts +2 -3
- package/src/server/report.ts +51 -0
- package/src/server/reporters/creevey.ts +74 -0
- package/src/server/reporters/index.ts +11 -0
- package/src/server/reporters/junit.ts +207 -0
- package/src/server/reporters/teamcity.ts +74 -0
- package/src/server/selenium/internal.ts +62 -45
- package/src/server/selenium/selenoid.ts +13 -6
- package/src/server/selenium/webdriver.ts +8 -12
- package/src/server/shutdown.ts +19 -0
- package/src/server/stories.ts +1 -12
- package/src/server/telemetry.ts +3 -3
- package/src/server/testsFiles/parser.ts +52 -4
- package/src/server/utils.ts +123 -14
- package/src/server/webdriver.ts +1 -1
- package/src/server/worker/context.ts +14 -0
- package/src/server/worker/match-image.ts +16 -248
- package/src/server/worker/start.ts +32 -75
- package/src/shared/index.ts +10 -8
- package/src/types.ts +91 -58
- package/types/global.d.ts +1 -0
- package/dist/client/web/assets/index-BE9CL5_G.js +0 -591
- package/dist/server/reporter.d.ts +0 -26
- package/dist/server/reporter.js +0 -108
- package/dist/server/reporter.js.map +0 -1
- package/dist/server/update.d.ts +0 -2
- package/dist/server/update.js +0 -53
- package/dist/server/update.js.map +0 -1
- package/src/server/reporter.ts +0 -139
- package/src/server/update.ts +0 -74
@@ -0,0 +1,182 @@
|
|
1
|
+
# Migrating from Creevey 0.9 to 0.10
|
2
|
+
|
3
|
+
This guide outlines the key changes and steps required to update your Creevey setup from version 0.9 to 0.10. Version 0.10 introduces several significant updates, including Playwright support, a new test context API, and changes to configuration.
|
4
|
+
|
5
|
+
---
|
6
|
+
|
7
|
+
## Breaking Changes
|
8
|
+
|
9
|
+
### 1. CLI Commands Structure (Breaking Change)
|
10
|
+
|
11
|
+
Creevey 0.10 introduces a command-based CLI structure. You can no longer run Creevey without specifying a command.
|
12
|
+
|
13
|
+
**Before (0.9):**
|
14
|
+
|
15
|
+
```bash
|
16
|
+
# Running tests
|
17
|
+
creevey --ui
|
18
|
+
creevey -s --ui
|
19
|
+
creevey --debug
|
20
|
+
|
21
|
+
# Update mode (approving images all at once with no way to review them)
|
22
|
+
creevey --update
|
23
|
+
|
24
|
+
# Viewing reports
|
25
|
+
# Doesn't have this feature
|
26
|
+
```
|
27
|
+
|
28
|
+
**After (0.10):**
|
29
|
+
|
30
|
+
```bash
|
31
|
+
# Running tests
|
32
|
+
creevey test --ui
|
33
|
+
creevey test -s --ui
|
34
|
+
creevey test --debug
|
35
|
+
|
36
|
+
# Viewing reports (approving images)
|
37
|
+
creevey report
|
38
|
+
creevey report ./custom-report-dir
|
39
|
+
```
|
40
|
+
|
41
|
+
**Key Changes:**
|
42
|
+
|
43
|
+
- All test execution now requires the `test` command
|
44
|
+
- Image approval/update mode uses the `report` command instead of `-u/--update` flags
|
45
|
+
- Report viewing uses the `report` command
|
46
|
+
|
47
|
+
### 2. Browser Configuration in `creevey.config.ts`
|
48
|
+
|
49
|
+
The way browsers are configured has been updated to better distinguish between Selenium and Playwright settings.
|
50
|
+
|
51
|
+
- The new `webdriver` field lets you choose your WebDriver implementation. While it defaults to Selenium for now, this may change. We recommend explicitly setting it by importing and using either `SeleniumWebdriver` or `PlaywrightWebdriver`.
|
52
|
+
- Selenium-specific capabilities (e.g., `browserVersion`, `platformName`) must now be nested under a `seleniumCapabilities` object.
|
53
|
+
- Playwright-specific options should be placed under a `playwrightOptions` object.
|
54
|
+
|
55
|
+
**Before (0.9):**
|
56
|
+
|
57
|
+
```javascript
|
58
|
+
// creevey.config.js
|
59
|
+
export default {
|
60
|
+
browsers: {
|
61
|
+
chrome: {
|
62
|
+
browserName: 'chrome',
|
63
|
+
browserVersion: '90.0',
|
64
|
+
platformName: 'linux',
|
65
|
+
},
|
66
|
+
},
|
67
|
+
};
|
68
|
+
```
|
69
|
+
|
70
|
+
**After (0.10):**
|
71
|
+
|
72
|
+
```typescript
|
73
|
+
// creevey.config.ts
|
74
|
+
import type { CreeveyConfig } from 'creevey';
|
75
|
+
import { SeleniumWebdriver } from 'creevey/selenium';
|
76
|
+
// or
|
77
|
+
// import { PlaywrightWebdriver } from 'creevey/playwright';
|
78
|
+
|
79
|
+
const config: CreeveyConfig = {
|
80
|
+
webdriver: SeleniumWebdriver, // or PlaywrightWebdriver
|
81
|
+
browsers: {
|
82
|
+
chrome: {
|
83
|
+
// For Selenium
|
84
|
+
browserName: 'chrome',
|
85
|
+
seleniumCapabilities: {
|
86
|
+
browserVersion: '90.0',
|
87
|
+
platformName: 'linux',
|
88
|
+
},
|
89
|
+
},
|
90
|
+
firefoxPlaywright: {
|
91
|
+
// For Playwright
|
92
|
+
browserName: 'firefox', // 'chromium', 'firefox', or 'webkit' for Playwright
|
93
|
+
playwrightOptions: {
|
94
|
+
headless: true,
|
95
|
+
},
|
96
|
+
},
|
97
|
+
},
|
98
|
+
};
|
99
|
+
|
100
|
+
export default config;
|
101
|
+
```
|
102
|
+
|
103
|
+
### 3. Mocha Removal and New `CreeveyTestContext` API
|
104
|
+
|
105
|
+
Creevey no longer uses the Mocha testing framework. Tests now use a `CreeveyTestContext` object passed as an argument to the test function.
|
106
|
+
|
107
|
+
- Replace `this` with the `context` parameter in your tests.
|
108
|
+
- Image matching methods (e.g., `matchImage`, `takeScreenshot`) are now called on the `context` object.
|
109
|
+
- The `context.webdriver` property gives you direct access to the configured WebDriver instance (Selenium or Playwright) for advanced browser interactions.
|
110
|
+
|
111
|
+
**Before (0.9 - Mocha style):**
|
112
|
+
|
113
|
+
```javascript
|
114
|
+
it('should match the image', async function () {
|
115
|
+
this.expect(await this.takeScreenshot()).to.matchImage('example');
|
116
|
+
});
|
117
|
+
```
|
118
|
+
|
119
|
+
**After (0.10 - New context style):**
|
120
|
+
|
121
|
+
```javascript
|
122
|
+
it('should match the image', async (context) => {
|
123
|
+
await context.matchImage(await context.takeScreenshot(), 'example');
|
124
|
+
});
|
125
|
+
|
126
|
+
// Example using context.webdriver with Selenium WebDriver API
|
127
|
+
it('should interact with an element using Selenium', async (context) => {
|
128
|
+
const seleniumWebDriver = context.webdriver; // Assuming SeleniumWebdriver is configured
|
129
|
+
const element = await seleniumWebDriver.findElement({ css: '#myElement' });
|
130
|
+
await element.click();
|
131
|
+
// ... more Selenium interactions
|
132
|
+
await context.matchImage(await context.takeScreenshot(), 'selenium-interaction');
|
133
|
+
});
|
134
|
+
|
135
|
+
// Example using context.webdriver with Playwright API
|
136
|
+
it('should interact with an element using Playwright', async (context) => {
|
137
|
+
const playwrightPage = context.webdriver; // Assuming PlaywrightWebdriver is configured
|
138
|
+
await playwrightPage.click('#myElement');
|
139
|
+
// ... more Playwright interactions
|
140
|
+
await context.matchImage(await context.takeScreenshot(), 'playwright-interaction');
|
141
|
+
});
|
142
|
+
```
|
143
|
+
|
144
|
+
### 4. Reporter Configuration
|
145
|
+
|
146
|
+
Reporter setup has moved from command-line options to the `creevey.config.ts` file.
|
147
|
+
|
148
|
+
**Example (0.10):**
|
149
|
+
|
150
|
+
```typescript
|
151
|
+
// creevey.config.ts
|
152
|
+
import type { CreeveyConfig } from 'creevey';
|
153
|
+
|
154
|
+
const config: CreeveyConfig = {
|
155
|
+
reporter: 'junit', // or 'teamcity', 'creevey'
|
156
|
+
reporterOptions: {
|
157
|
+
// For JUnit: { outputFile: 'report.xml' }
|
158
|
+
// For Creevey HTML reporter (default): { reportDir: './report' }
|
159
|
+
},
|
160
|
+
};
|
161
|
+
|
162
|
+
export default config;
|
163
|
+
```
|
164
|
+
|
165
|
+
---
|
166
|
+
|
167
|
+
## Key New Features & Updates
|
168
|
+
|
169
|
+
- **Creevey Playwright Reporter:** Integrate Creevey's visual testing into your existing Playwright test suites. See `docs/playwright-reporter.md` for details.
|
170
|
+
- **Approve Tests from Report UI (Update Mode):** Approve visual changes directly in the Creevey report UI. Run with `creevey report` to use the web UI for reviewing and approving screenshots.
|
171
|
+
- **ODiff Image Comparison:** Use `odiff` for image comparison with the `--odiff` flag and `odiffOptions` in config.
|
172
|
+
- **Easier Storybook Autostart:** Use `creevey test -s` or `creevey test --storybook-start` to automatically start Storybook. Creevey will find a free port if necessary.
|
173
|
+
|
174
|
+
---
|
175
|
+
|
176
|
+
## Other Notable Changes
|
177
|
+
|
178
|
+
- **`--no-docker` Option:** A command-line flag to disable Docker, overriding `useDocker: true` in your config.
|
179
|
+
|
180
|
+
---
|
181
|
+
|
182
|
+
We recommend reviewing the full announcement for details on all new features and improvements. After updating, test your suite thoroughly to ensure a smooth transition.
|
@@ -0,0 +1,170 @@
|
|
1
|
+
# Playwright Reporter for Creevey
|
2
|
+
|
3
|
+
Creevey provides a Playwright-compatible reporter that allows you to use Creevey's image comparison, reporting, and UI features with Playwright tests.
|
4
|
+
|
5
|
+
## Installation
|
6
|
+
|
7
|
+
The reporter is included with the Creevey package. Install Playwright and Creevey in your project:
|
8
|
+
|
9
|
+
```bash
|
10
|
+
npm install --save-dev @playwright/test creevey
|
11
|
+
```
|
12
|
+
|
13
|
+
## Configuration
|
14
|
+
|
15
|
+
Add the Creevey reporter to your Playwright configuration file:
|
16
|
+
|
17
|
+
```typescript
|
18
|
+
// playwright.config.ts
|
19
|
+
import { defineConfig, devices } from '@playwright/test';
|
20
|
+
|
21
|
+
export default defineConfig({
|
22
|
+
testDir: './tests',
|
23
|
+
testMatch: 'visual.spec.ts',
|
24
|
+
globalSetup: 'creevey/playwright/setup',
|
25
|
+
// Configure reporters
|
26
|
+
reporter: [
|
27
|
+
['list'], // Standard Playwright reporter for console output
|
28
|
+
['creevey/playwright/reporter'],
|
29
|
+
],
|
30
|
+
// Reference images and report will be saved in these directories
|
31
|
+
snapshotDir: './images',
|
32
|
+
outputDir: './report',
|
33
|
+
use: {
|
34
|
+
viewport: { width: 1280, height: 720 },
|
35
|
+
baseURL: 'http://localhost:6006',
|
36
|
+
},
|
37
|
+
projects: [
|
38
|
+
{
|
39
|
+
name: 'chromium',
|
40
|
+
use: { ...devices['Desktop Chrome'] },
|
41
|
+
metadata: {
|
42
|
+
// Define storybook globals here (optional)
|
43
|
+
storybookGlobals: {
|
44
|
+
theme: 'dark',
|
45
|
+
},
|
46
|
+
},
|
47
|
+
},
|
48
|
+
],
|
49
|
+
webServer: {
|
50
|
+
command: 'yarn storybook dev --ci -p 6006',
|
51
|
+
url: 'http://localhost:6006',
|
52
|
+
reuseExistingServer: !process.env.CI,
|
53
|
+
},
|
54
|
+
});
|
55
|
+
```
|
56
|
+
|
57
|
+
### Required Configuration
|
58
|
+
|
59
|
+
- **Global Setup**: `globalSetup: 'creevey/playwright/setup'` - Required for proper initialization
|
60
|
+
- **Reporter**: `['creevey/playwright/reporter', options]` - The Creevey reporter
|
61
|
+
- **Output Directories**: Use standard Playwright `snapshotDir` and `outputDir` options
|
62
|
+
|
63
|
+
## Usage
|
64
|
+
|
65
|
+
### Basic Test Setup
|
66
|
+
|
67
|
+
Create a visual test file using Creevey's `definePlaywrightTests()` function:
|
68
|
+
|
69
|
+
```typescript
|
70
|
+
// tests/visual.spec.ts
|
71
|
+
import { definePlaywrightTests } from 'creevey/playwright';
|
72
|
+
|
73
|
+
definePlaywrightTests();
|
74
|
+
```
|
75
|
+
|
76
|
+
This simple setup will automatically:
|
77
|
+
|
78
|
+
- Discover your Storybook stories
|
79
|
+
- Generate Playwright tests for each story
|
80
|
+
- Take screenshots and compare them with reference images
|
81
|
+
- Integrate with the Creevey UI for reviewing differences
|
82
|
+
|
83
|
+
### Storybook Globals Configuration
|
84
|
+
|
85
|
+
You can configure Storybook globals for each browser project:
|
86
|
+
|
87
|
+
```typescript
|
88
|
+
projects: [
|
89
|
+
{
|
90
|
+
name: 'chromium-light',
|
91
|
+
use: { ...devices['Desktop Chrome'] },
|
92
|
+
metadata: {
|
93
|
+
storybookGlobals: {
|
94
|
+
theme: 'light',
|
95
|
+
},
|
96
|
+
},
|
97
|
+
},
|
98
|
+
{
|
99
|
+
name: 'chromium-dark',
|
100
|
+
use: { ...devices['Desktop Chrome'] },
|
101
|
+
metadata: {
|
102
|
+
storybookGlobals: {
|
103
|
+
theme: 'dark',
|
104
|
+
},
|
105
|
+
},
|
106
|
+
},
|
107
|
+
];
|
108
|
+
```
|
109
|
+
|
110
|
+
## Running Tests
|
111
|
+
|
112
|
+
Run your visual tests with Playwright:
|
113
|
+
|
114
|
+
```bash
|
115
|
+
# Run all tests
|
116
|
+
yarn playwright test
|
117
|
+
|
118
|
+
# Run with debug output
|
119
|
+
yarn playwright test --debug
|
120
|
+
|
121
|
+
|
122
|
+
# Run tests for specific browser
|
123
|
+
yarn playwright test --project=chromium
|
124
|
+
```
|
125
|
+
|
126
|
+
### Viewing Results
|
127
|
+
|
128
|
+
After running your tests, you can run `yarn creevey report` to start the Creevey UI to review results:
|
129
|
+
|
130
|
+
1. The reporter will output the URL where you can view results
|
131
|
+
2. Navigate to the provided URL in your browser
|
132
|
+
3. Browse test results, view image comparisons, and approve changes
|
133
|
+
|
134
|
+
### Approving Screenshots
|
135
|
+
|
136
|
+
You can approve screenshots directly from the Creevey UI by:
|
137
|
+
|
138
|
+
1. Selecting the test with the failed comparison
|
139
|
+
2. Reviewing the differences between expected and actual images
|
140
|
+
3. Clicking the "Approve" button to update the reference image
|
141
|
+
|
142
|
+
## Troubleshooting
|
143
|
+
|
144
|
+
### Common Issues
|
145
|
+
|
146
|
+
**Tests not discovering stories**:
|
147
|
+
|
148
|
+
- Ensure your Storybook server is running on the configured URL
|
149
|
+
- Check that `globalSetup: 'creevey/playwright/setup'` is included in your config
|
150
|
+
- Verify your `baseURL` points to your Storybook instance
|
151
|
+
|
152
|
+
**Screenshots not being captured**:
|
153
|
+
|
154
|
+
- Make sure you're using the `definePlaywrightTests()` function
|
155
|
+
- Check that `snapshotDir` is properly configured and writable
|
156
|
+
|
157
|
+
**Port conflicts**:
|
158
|
+
|
159
|
+
- If Storybook fails to start, ensure the port isn't already in use
|
160
|
+
- Configure a different port in the `webServer` configuration
|
161
|
+
|
162
|
+
### Storybook Issues
|
163
|
+
|
164
|
+
If tests can't connect to Storybook:
|
165
|
+
|
166
|
+
1. Ensure Storybook starts successfully with `yarn storybook dev`
|
167
|
+
2. Check that the URL in `webServer.url` matches your Storybook instance
|
168
|
+
3. Verify your `baseURL` is correctly configured
|
169
|
+
|
170
|
+
For more help, please check the main Creevey documentation or open an issue on GitHub.
|
@@ -0,0 +1,60 @@
|
|
1
|
+
## Creevey Storybook Parameters
|
2
|
+
|
3
|
+
Creevey allows you to customize how stories will be captured. You could define parameters on `global`, `kind` or `story` levels. All these parameters are deeply merged by Storybook for each story.
|
4
|
+
|
5
|
+
```ts
|
6
|
+
// .storybook/preview.tsx
|
7
|
+
export const parameters = {
|
8
|
+
creevey: {
|
9
|
+
// Global parameters are applied to all stories
|
10
|
+
captureElement: '#storybook-root',
|
11
|
+
},
|
12
|
+
};
|
13
|
+
```
|
14
|
+
|
15
|
+
```ts
|
16
|
+
// stories/MyModal.stories.tsx
|
17
|
+
import React from 'react';
|
18
|
+
import { Meta, StoryObj } from '@storybook/react';
|
19
|
+
import { CreeveyMeta, CreeveyStory } from 'creevey';
|
20
|
+
import MyModal from './src/components/MyModal';
|
21
|
+
|
22
|
+
const Kind: Meta<typeof MyModal> = {
|
23
|
+
title: 'MyModal',
|
24
|
+
component: MyModal,
|
25
|
+
parameters: {
|
26
|
+
creevey: {
|
27
|
+
// It's possible to add additional delay before capturing screenshot
|
28
|
+
delay: 1000,
|
29
|
+
|
30
|
+
// For capturing the whole browser viewport, you can define `null` instead of css selector.
|
31
|
+
captureElement: null,
|
32
|
+
|
33
|
+
// You can skip some stories from capturing, by defining `skip` option:
|
34
|
+
// skip: { "The reason why story is skipped": { in: 'chrome', stories: 'Loading' } }
|
35
|
+
// - `in` - browser name, regex or array of browser names, which are defined in the Creevey config
|
36
|
+
// - `stories` - story name, regex or array of story names
|
37
|
+
// - `tests` - test name, regex or array of test names
|
38
|
+
// NOTE: If you try to skip stories by story name, the storybook name format will be used
|
39
|
+
// For more info see [storybook-export-vs-name-handling](https://storybook.js.org/docs/formats/component-story-format/#storybook-export-vs-name-handling))
|
40
|
+
skip: {
|
41
|
+
"`MyModal` doesn't support ie11": { in: 'ie11' },
|
42
|
+
'Loading stories are flaky in firefox': { in: 'firefox', stories: 'Loading' },
|
43
|
+
"`MyModal` hovering doesn't work correctly": {
|
44
|
+
in: ['firefox', 'chrome'],
|
45
|
+
tests: /.*hover$/,
|
46
|
+
},
|
47
|
+
},
|
48
|
+
},
|
49
|
+
},
|
50
|
+
};
|
51
|
+
|
52
|
+
export default Kind;
|
53
|
+
|
54
|
+
export const Basic: StoryObj<typeof MyModal> = {
|
55
|
+
creevey: {
|
56
|
+
// Lastly some elements can be ignored in capturing screenshot
|
57
|
+
ignoreElements: ['button', '.local-time'],
|
58
|
+
},
|
59
|
+
};
|
60
|
+
```
|
package/docs/tests.md
CHANGED
@@ -1,63 +1,68 @@
|
|
1
|
-
## Write tests
|
1
|
+
## Write interactive screenshot tests
|
2
2
|
|
3
|
-
|
3
|
+
In most cases following Storybook's ideology of [writing stories](https://storybook.js.org/docs/get-started/whats-a-story) is enough to test your UI components. Where each component has a separate stories file with its different states. But sometimes you might have pretty complicated components with a lot of interactions and internal states. In this case, you can write tests for your stories.
|
4
4
|
|
5
|
-
|
6
|
-
import React from 'react';
|
7
|
-
import { Story } from '@storybook/react';
|
8
|
-
import { CreeveyStory } from 'creevey';
|
9
|
-
import MyComponent from './src/components/MyComponent';
|
5
|
+
There are two different ways how to write interactive tests with Creevey:
|
10
6
|
|
11
|
-
|
7
|
+
### Write tests in `*.creevey.ts` files
|
12
8
|
|
13
|
-
|
14
|
-
Basic.parameters = {
|
15
|
-
creevey: {
|
16
|
-
captureElement: '#storybook-root',
|
17
|
-
tests: {
|
18
|
-
async click() {
|
19
|
-
await this.browser.actions().click(this.captureElement).perform();
|
9
|
+
It's the recommended way to write tests. It allows you to run these tests by Creevey itself and utilize webdriver benefits. The crucial part of it is webdriver action calls are more close to real user interactions and mitigate flakiness and false-negative results. Here is a simple example of how to write tests in `*.creevey.ts` files
|
20
10
|
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
11
|
+
```ts
|
12
|
+
// stories/MyComponent.creevey.ts
|
13
|
+
import { kind, story, test } from 'creevey';
|
14
|
+
|
15
|
+
kind('MyComponent', () => {
|
16
|
+
story('Story', ({ setStoryParameters }) => {
|
17
|
+
// It's possible to pass Creevey parameters to story
|
18
|
+
setStoryParameters({
|
19
|
+
captureElement: 'span[data-test-id~="x"]',
|
20
|
+
ignoreElements: [],
|
21
|
+
});
|
22
|
+
|
23
|
+
test('idle', async (context) => {
|
24
|
+
await context.matchImage(await context.takeScreenshot());
|
25
|
+
});
|
26
|
+
|
27
|
+
test('input', async (context) => {
|
28
|
+
await context.webdriver.keyboard.press('Tab');
|
29
|
+
const focus = await context.takeScreenshot();
|
30
|
+
await context.webdriver.keyboard.type('Hello Creevey');
|
31
|
+
const input = await context.takeScreenshot();
|
32
|
+
await context.matchImages({ focus, input });
|
33
|
+
});
|
34
|
+
});
|
35
|
+
});
|
26
36
|
```
|
27
37
|
|
28
|
-
|
38
|
+
In the example above, we used Playwright API to interact with the story. But Creevey also supports Selenium webdriver. And in that case `context.webdriver` will be an instance of Selenium webdriver. Obviously Selenium API is different from Playwright.
|
29
39
|
|
30
|
-
|
40
|
+
### Using Storybook's `play` function
|
31
41
|
|
32
|
-
|
33
|
-
import React from 'react';
|
34
|
-
import { CSFStory } from 'creevey';
|
35
|
-
import MyForm from './src/components/MyForm';
|
42
|
+
Storybook allows you to write tests in the story file itself by using [`play` function](https://storybook.js.org/docs/writing-tests/component-testing). It's a good way to write simple tests. But there are couple drawbacks of this approach:
|
36
43
|
|
37
|
-
|
44
|
+
- You can have only one test per story. Which is not a big deal, but sometimes you might not want to have multiple stories with the same markup.
|
45
|
+
- Tests are running in browser environment and use https://testing-library.com API under the hood. It's good for unit tests, but might not be suitable for visual regression tests, because testing-library relies on DOM API and not even close to real user interactions. For example, you might have a button that could be visible for user, but it's covered by some other transparent element. With testing-library the button easily accessible and clickable, but the user can't interact with it.
|
38
46
|
|
39
|
-
|
40
|
-
Basic.story = {
|
41
|
-
parameters: {
|
42
|
-
creevey: {
|
43
|
-
captureElement: '#storybook-root',
|
44
|
-
delay: 1000,
|
45
|
-
tests: {
|
46
|
-
async submit() {
|
47
|
-
const input = await this.browser.findElement({ css: '.my-input' });
|
47
|
+
Here is an example of how to write tests using Storybook's `play` function:
|
48
48
|
|
49
|
-
|
49
|
+
```tsx
|
50
|
+
// stories/MyComponent.stories.tsx
|
51
|
+
import React from 'react';
|
52
|
+
import { Meta, StoryObj } from '@storybook/react';
|
53
|
+
import { fireEvent, within } from '@storybook/test';
|
54
|
+
import MyComponent from './src/components/MyComponent';
|
50
55
|
|
51
|
-
|
56
|
+
export default {
|
57
|
+
title: 'MyComponent',
|
58
|
+
component: MyComponent,
|
59
|
+
};
|
52
60
|
|
53
|
-
|
61
|
+
export const Basic: StoryObj<typeof MyComponent> = {
|
62
|
+
play: async ({ canvasElement }) => {
|
63
|
+
const slider = await within(canvasElement).findByTestId('slider');
|
54
64
|
|
55
|
-
|
56
|
-
},
|
57
|
-
},
|
58
|
-
},
|
65
|
+
await fireEvent.change(slider, { target: { value: 50 } });
|
59
66
|
},
|
60
67
|
};
|
61
68
|
```
|
62
|
-
|
63
|
-
NOTE: In this example I fill some simple form and submit it. Also as you could see, I taking two different screenshots `empty` and `submitted` and assert these in the end.
|