creevey 0.10.0-beta.0 → 0.10.0-beta.10
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/dist/client/addon/components/Panel.js +2 -2
- package/dist/client/addon/components/Panel.js.map +1 -1
- package/dist/client/addon/controller.js +4 -5
- package/dist/client/addon/controller.js.map +1 -1
- package/dist/client/addon/withCreevey.js +18 -34
- package/dist/client/addon/withCreevey.js.map +1 -1
- package/dist/client/shared/components/ImagesView/SwapView.js +12 -0
- package/dist/client/shared/components/ImagesView/SwapView.js.map +1 -1
- package/dist/client/shared/components/PageHeader/ImagePreview.js +1 -0
- package/dist/client/shared/components/PageHeader/ImagePreview.js.map +1 -1
- package/dist/client/shared/components/ResultsPage.js +23 -5
- package/dist/client/shared/components/ResultsPage.js.map +1 -1
- package/dist/client/web/CreeveyApp.js +22 -6
- package/dist/client/web/CreeveyApp.js.map +1 -1
- package/dist/client/web/CreeveyContext.d.ts +5 -0
- package/dist/client/web/CreeveyContext.js +3 -0
- package/dist/client/web/CreeveyContext.js.map +1 -1
- package/dist/client/web/CreeveyView/SideBar/Search.js +2 -2
- package/dist/client/web/CreeveyView/SideBar/Search.js.map +1 -1
- package/dist/client/web/CreeveyView/SideBar/SideBar.js +1 -0
- package/dist/client/web/CreeveyView/SideBar/SideBar.js.map +1 -1
- package/dist/client/web/CreeveyView/SideBar/SideBarFooter.js +49 -6
- package/dist/client/web/CreeveyView/SideBar/SideBarFooter.js.map +1 -1
- package/dist/client/web/CreeveyView/SideBar/SuiteLink.js +1 -3
- package/dist/client/web/CreeveyView/SideBar/SuiteLink.js.map +1 -1
- package/dist/client/web/CreeveyView/SideBar/TestLink.js +1 -3
- package/dist/client/web/CreeveyView/SideBar/TestLink.js.map +1 -1
- package/dist/client/web/KeyboardEventsContext.d.ts +1 -8
- package/dist/client/web/KeyboardEventsContext.js +62 -57
- package/dist/client/web/KeyboardEventsContext.js.map +1 -1
- package/dist/client/web/assets/{index-DkmZfG9C.js → index-BE9CL5_G.js} +94 -94
- package/dist/client/web/index.html +1 -1
- package/dist/creevey.js +13 -5
- package/dist/creevey.js.map +1 -1
- package/dist/index.js +1 -5
- package/dist/index.js.map +1 -1
- package/dist/playwright.d.ts +2 -0
- package/dist/playwright.js +6 -0
- package/dist/playwright.js.map +1 -0
- package/dist/selenium.d.ts +2 -0
- package/dist/selenium.js +6 -0
- package/dist/selenium.js.map +1 -0
- package/dist/server/config.d.ts +1 -1
- package/dist/server/config.js +12 -5
- package/dist/server/config.js.map +1 -1
- package/dist/server/docker.js +2 -2
- package/dist/server/docker.js.map +1 -1
- package/dist/server/index.js +40 -4
- package/dist/server/index.js.map +1 -1
- package/dist/server/logger.d.ts +2 -1
- package/dist/server/logger.js +7 -3
- package/dist/server/logger.js.map +1 -1
- package/dist/server/master/api.js +1 -1
- package/dist/server/master/api.js.map +1 -1
- package/dist/server/master/pool.d.ts +3 -3
- package/dist/server/master/pool.js +10 -63
- package/dist/server/master/pool.js.map +1 -1
- package/dist/server/master/queue.d.ts +13 -0
- package/dist/server/master/queue.js +64 -0
- package/dist/server/master/queue.js.map +1 -0
- package/dist/server/master/runner.d.ts +1 -0
- package/dist/server/master/runner.js +4 -1
- package/dist/server/master/runner.js.map +1 -1
- package/dist/server/master/server.js +1 -1
- package/dist/server/master/server.js.map +1 -1
- package/dist/server/master/start.js +4 -4
- package/dist/server/master/start.js.map +1 -1
- package/dist/server/playwright/docker-file.js +12 -1
- package/dist/server/playwright/docker-file.js.map +1 -1
- package/dist/server/playwright/docker.d.ts +1 -1
- package/dist/server/playwright/docker.js +1 -6
- package/dist/server/playwright/docker.js.map +1 -1
- package/dist/server/playwright/internal.d.ts +2 -2
- package/dist/server/playwright/internal.js +56 -44
- package/dist/server/playwright/internal.js.map +1 -1
- package/dist/server/playwright/webdriver.d.ts +2 -1
- package/dist/server/playwright/webdriver.js +4 -1
- package/dist/server/playwright/webdriver.js.map +1 -1
- package/dist/server/providers/browser.js +2 -1
- package/dist/server/providers/browser.js.map +1 -1
- package/dist/server/providers/hybrid.js +1 -1
- package/dist/server/providers/hybrid.js.map +1 -1
- package/dist/server/reporter.js +4 -4
- package/dist/server/reporter.js.map +1 -1
- package/dist/server/selenium/internal.d.ts +3 -3
- package/dist/server/selenium/internal.js +126 -89
- package/dist/server/selenium/internal.js.map +1 -1
- package/dist/server/selenium/selenoid.js +2 -2
- package/dist/server/selenium/selenoid.js.map +1 -1
- package/dist/server/selenium/webdriver.d.ts +2 -1
- package/dist/server/selenium/webdriver.js +8 -1
- package/dist/server/selenium/webdriver.js.map +1 -1
- package/dist/server/telemetry.js +7 -3
- package/dist/server/telemetry.js.map +1 -1
- package/dist/server/utils.d.ts +2 -1
- package/dist/server/utils.js +13 -3
- package/dist/server/utils.js.map +1 -1
- package/dist/server/webdriver.d.ts +4 -4
- package/dist/server/webdriver.js +10 -9
- package/dist/server/webdriver.js.map +1 -1
- package/dist/server/worker/chai-image.d.ts +1 -2
- package/dist/server/worker/chai-image.js +4 -3
- package/dist/server/worker/chai-image.js.map +1 -1
- package/dist/server/worker/start.js +27 -39
- package/dist/server/worker/start.js.map +1 -1
- package/dist/types.d.ts +32 -21
- package/dist/types.js +13 -1
- package/dist/types.js.map +1 -1
- package/package.json +45 -38
- package/playwright.d.ts +2 -0
- package/selenium.d.ts +2 -0
- package/src/client/addon/components/Panel.tsx +2 -2
- package/src/client/addon/controller.ts +13 -6
- package/src/client/addon/withCreevey.ts +25 -13
- package/src/client/shared/components/ImagesView/SwapView.tsx +18 -0
- package/src/client/shared/components/PageHeader/ImagePreview.tsx +1 -0
- package/src/client/shared/components/ResultsPage.tsx +28 -7
- package/src/client/web/CreeveyApp.tsx +25 -7
- package/src/client/web/CreeveyContext.tsx +9 -0
- package/src/client/web/CreeveyView/SideBar/Search.tsx +3 -3
- package/src/client/web/CreeveyView/SideBar/SideBar.tsx +1 -0
- package/src/client/web/CreeveyView/SideBar/SideBarFooter.tsx +37 -6
- package/src/client/web/CreeveyView/SideBar/SuiteLink.tsx +3 -5
- package/src/client/web/CreeveyView/SideBar/TestLink.tsx +2 -4
- package/src/client/web/KeyboardEventsContext.tsx +61 -73
- package/src/creevey.ts +13 -6
- package/src/index.ts +0 -2
- package/src/playwright.ts +1 -0
- package/src/selenium.ts +1 -0
- package/src/server/config.ts +19 -7
- package/src/server/docker.ts +2 -2
- package/src/server/index.ts +45 -4
- package/src/server/logger.ts +6 -2
- package/src/server/master/api.ts +1 -1
- package/src/server/master/pool.ts +18 -56
- package/src/server/master/queue.ts +64 -0
- package/src/server/master/runner.ts +4 -1
- package/src/server/master/server.ts +1 -1
- package/src/server/master/start.ts +7 -4
- package/src/server/playwright/docker-file.ts +14 -1
- package/src/server/playwright/docker.ts +2 -12
- package/src/server/playwright/internal.ts +76 -49
- package/src/server/playwright/webdriver.ts +7 -2
- package/src/server/providers/browser.ts +2 -1
- package/src/server/providers/hybrid.ts +1 -1
- package/src/server/reporter.ts +4 -3
- package/src/server/selenium/internal.ts +147 -93
- package/src/server/selenium/selenoid.ts +2 -2
- package/src/server/selenium/webdriver.ts +12 -2
- package/src/server/telemetry.ts +7 -3
- package/src/server/utils.ts +14 -4
- package/src/server/webdriver.ts +13 -15
- package/src/server/worker/chai-image.ts +4 -4
- package/src/server/worker/start.ts +29 -48
- package/src/types.ts +35 -23
- package/types/playwright-context.d.ts +7 -0
- package/types/selenium-context.d.ts +7 -0
- package/.yarnrc.yml +0 -1
- package/chromatic.config.json +0 -5
package/src/server/webdriver.ts
CHANGED
@@ -1,7 +1,6 @@
|
|
1
|
-
import Logger from 'loglevel';
|
2
1
|
import chalk from 'chalk';
|
3
2
|
import { networkInterfaces } from 'os';
|
4
|
-
import { logger
|
3
|
+
import { logger } from './logger.js';
|
5
4
|
import { Args } from '@storybook/csf';
|
6
5
|
import {
|
7
6
|
isDefined,
|
@@ -11,6 +10,7 @@ import {
|
|
11
10
|
CreeveyStoryParams,
|
12
11
|
StoriesRaw,
|
13
12
|
CreeveyWebdriver,
|
13
|
+
ServerTest,
|
14
14
|
} from '../types.js';
|
15
15
|
import { emitStoriesMessage, subscribeOn } from './messages.js';
|
16
16
|
|
@@ -21,15 +21,15 @@ const DOCKER_INTERNAL = 'host.docker.internal';
|
|
21
21
|
export async function resolveStorybookUrl(
|
22
22
|
storybookUrl: string,
|
23
23
|
checkUrl: (url: string) => Promise<boolean>,
|
24
|
-
logger: Logger.Logger = defaultLogger,
|
25
24
|
): Promise<string> {
|
26
|
-
logger.debug('Resolving storybook url');
|
25
|
+
logger().debug('Resolving storybook url');
|
27
26
|
const addresses = getAddresses();
|
27
|
+
// TODO Use Promise.race?
|
28
28
|
for (const ip of addresses) {
|
29
29
|
const resolvedUrl = storybookUrl.replace(LOCALHOST_REGEXP, ip);
|
30
|
-
logger.debug(`Checking storybook availability on ${chalk.magenta(resolvedUrl)}`);
|
30
|
+
logger().debug(`Checking storybook availability on ${chalk.magenta(resolvedUrl)}`);
|
31
31
|
if (await checkUrl(resolvedUrl)) {
|
32
|
-
logger.debug(`Resolved storybook url ${chalk.magenta(resolvedUrl)}`);
|
32
|
+
logger().debug(`Resolved storybook url ${chalk.magenta(resolvedUrl)}`);
|
33
33
|
return resolvedUrl;
|
34
34
|
}
|
35
35
|
}
|
@@ -71,11 +71,9 @@ export abstract class CreeveyWebdriverBase implements CreeveyWebdriver {
|
|
71
71
|
|
72
72
|
abstract loadStoriesFromBrowser(): Promise<StoriesRaw>;
|
73
73
|
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
logger: Logger.Logger,
|
78
|
-
): Promise<CreeveyTestContext> {
|
74
|
+
abstract afterTest(test: ServerTest): Promise<void>;
|
75
|
+
|
76
|
+
async switchStory(story: StoryInput, context: BaseCreeveyTestContext): Promise<CreeveyTestContext> {
|
79
77
|
const { id, title, name, parameters } = story;
|
80
78
|
const {
|
81
79
|
captureElement = `#${storybookRootID}`,
|
@@ -83,7 +81,7 @@ export abstract class CreeveyWebdriverBase implements CreeveyWebdriver {
|
|
83
81
|
ignoreElements,
|
84
82
|
} = (parameters.creevey ?? {}) as CreeveyStoryParams;
|
85
83
|
|
86
|
-
logger.debug(`Switching to story ${chalk.cyan(title)}/${chalk.cyan(name)} by id ${chalk.magenta(id)}`);
|
84
|
+
logger().debug(`Switching to story ${chalk.cyan(title)}/${chalk.cyan(name)} by id ${chalk.magenta(id)}`);
|
87
85
|
|
88
86
|
let storyPlayResolver: (isCompleted: boolean) => void;
|
89
87
|
let waitForComplete = new Promise<boolean>((resolve) => (storyPlayResolver = resolve));
|
@@ -104,7 +102,7 @@ export abstract class CreeveyWebdriverBase implements CreeveyWebdriver {
|
|
104
102
|
const isCaptureCalled = await this.selectStory(id, waitForReady);
|
105
103
|
|
106
104
|
if (isCaptureCalled) {
|
107
|
-
logger.debug(`Capturing screenshots from ${chalk.magenta(id)} story's \`play()\` function`);
|
105
|
+
logger().debug(`Capturing screenshots from ${chalk.magenta(id)} story's \`play()\` function`);
|
108
106
|
while (!(await waitForComplete)) {
|
109
107
|
waitForComplete = new Promise<boolean>((resolve) => (storyPlayResolver = resolve));
|
110
108
|
}
|
@@ -112,8 +110,8 @@ export abstract class CreeveyWebdriverBase implements CreeveyWebdriver {
|
|
112
110
|
|
113
111
|
unsubscribe();
|
114
112
|
|
115
|
-
if (isCaptureCalled) logger.debug(`Story ${chalk.magenta(id)} completed capturing`);
|
116
|
-
else logger.debug(`Story ${chalk.magenta(id)} ready for capturing`);
|
113
|
+
if (isCaptureCalled) logger().debug(`Story ${chalk.magenta(id)} completed capturing`);
|
114
|
+
else logger().debug(`Story ${chalk.magenta(id)} ready for capturing`);
|
117
115
|
|
118
116
|
return Object.assign(
|
119
117
|
{
|
@@ -1,8 +1,8 @@
|
|
1
|
-
import
|
1
|
+
import { logger } from '../logger';
|
2
|
+
|
2
3
|
export default function (
|
3
4
|
matchImage: (image: Buffer, imageName?: string) => Promise<void>,
|
4
5
|
matchImages: (images: Record<string, Buffer>) => Promise<void>,
|
5
|
-
logger: Logger.Logger,
|
6
6
|
) {
|
7
7
|
let isWarningShown = false;
|
8
8
|
return function chaiImage({ Assertion }: Chai.ChaiStatic, utils: Chai.ChaiUtils): void {
|
@@ -11,7 +11,7 @@ export default function (
|
|
11
11
|
'matchImage',
|
12
12
|
async function (this: Record<string, unknown>, imageName?: string) {
|
13
13
|
if (!isWarningShown) {
|
14
|
-
logger.warn(
|
14
|
+
logger().warn(
|
15
15
|
'`expect(...).to.matchImage()` is deprecated and will be removed in the next major release. Please use `context.matchImage()` instead.',
|
16
16
|
);
|
17
17
|
isWarningShown = true;
|
@@ -23,7 +23,7 @@ export default function (
|
|
23
23
|
|
24
24
|
utils.addMethod(Assertion.prototype, 'matchImages', async function (this: Record<string, unknown>) {
|
25
25
|
if (!isWarningShown) {
|
26
|
-
logger.warn(
|
26
|
+
logger().warn(
|
27
27
|
'`expect(...).to.matchImages()` is deprecated and will be removed in the next major release. Please use `context.matchImages()` instead.',
|
28
28
|
);
|
29
29
|
isWarningShown = true;
|
@@ -1,8 +1,5 @@
|
|
1
1
|
import chai from 'chai';
|
2
|
-
import chalk from 'chalk';
|
3
|
-
import Logger from 'loglevel';
|
4
2
|
import EventEmitter from 'events';
|
5
|
-
import { Key, until, WebDriver } from 'selenium-webdriver';
|
6
3
|
import {
|
7
4
|
BaseCreeveyTestContext,
|
8
5
|
Config,
|
@@ -19,7 +16,6 @@ import {
|
|
19
16
|
} from '../../types.js';
|
20
17
|
import { subscribeOn, emitTestMessage, emitWorkerMessage } from '../messages.js';
|
21
18
|
import chaiImage from './chai-image.js';
|
22
|
-
import { SeleniumWebdriver } from '../selenium/webdriver.js';
|
23
19
|
import { getMatchers, getOdiffMatchers, ImageContext } from './match-image.js';
|
24
20
|
import { loadTestsFromStories } from '../stories.js';
|
25
21
|
import { logger } from '../logger.js';
|
@@ -49,22 +45,6 @@ async function getTestsFromStories(
|
|
49
45
|
return testsById;
|
50
46
|
}
|
51
47
|
|
52
|
-
async function outputTraceLogs(browser: WebDriver, test: ServerTest, logger: Logger.Logger): Promise<void> {
|
53
|
-
const output: string[] = [];
|
54
|
-
const types = await browser.manage().logs().getAvailableLogTypes();
|
55
|
-
for (const type of types) {
|
56
|
-
const logs = await browser.manage().logs().get(type);
|
57
|
-
output.push(logs.map((log) => JSON.stringify(log.toJSON(), null, 2)).join('\n'));
|
58
|
-
}
|
59
|
-
logger.debug(
|
60
|
-
'----------',
|
61
|
-
getTestPath(test).join('/'),
|
62
|
-
'----------\n',
|
63
|
-
output.join('\n'),
|
64
|
-
'\n----------------------------------------------------------------------------------------------------',
|
65
|
-
);
|
66
|
-
}
|
67
|
-
|
68
48
|
function runHandler(browserName: string, images: Partial<Record<string, Images>>, error?: unknown): void {
|
69
49
|
// TODO How handle browser corruption?
|
70
50
|
if (isImageError(error)) {
|
@@ -104,7 +84,7 @@ function runHandler(browserName: string, images: Partial<Record<string, Images>>
|
|
104
84
|
|
105
85
|
async function setupWebdriver(webdriver: CreeveyWebdriver): Promise<[string, CreeveyWebdriver] | undefined> {
|
106
86
|
if ((await webdriver.openBrowser(true)) == null) {
|
107
|
-
logger.error('Failed to start browser');
|
87
|
+
logger().error('Failed to start browser');
|
108
88
|
emitWorkerMessage({
|
109
89
|
type: 'error',
|
110
90
|
payload: { subtype: 'browser', error: 'Failed to start browser' },
|
@@ -143,8 +123,6 @@ export async function start(browser: string, gridUrl: string, config: Config, op
|
|
143
123
|
|
144
124
|
if (!webdriver || !sessionId) return;
|
145
125
|
|
146
|
-
const workerLogger = Logger.getLogger(`${browser}:${chalk.gray(sessionId)}`);
|
147
|
-
|
148
126
|
const reporterOptions = {
|
149
127
|
...config.reporterOptions,
|
150
128
|
creevey: {
|
@@ -168,13 +146,13 @@ export async function start(browser: string, gridUrl: string, config: Config, op
|
|
168
146
|
const { matchImage, matchImages } = options.odiff
|
169
147
|
? getOdiffMatchers(imagesContext, config)
|
170
148
|
: await getMatchers(imagesContext, config);
|
171
|
-
chai.use(chaiImage(matchImage, matchImages
|
149
|
+
chai.use(chaiImage(matchImage, matchImages));
|
172
150
|
|
173
151
|
const tests = await (async () => {
|
174
152
|
try {
|
175
153
|
return await getTestsFromStories(config, browser, webdriver);
|
176
154
|
} catch (error) {
|
177
|
-
|
155
|
+
logger().error('Failed to get tests from stories:', error);
|
178
156
|
emitWorkerMessage({
|
179
157
|
type: 'error',
|
180
158
|
payload: { subtype: 'browser', error: serializeError(error) },
|
@@ -192,7 +170,7 @@ export async function start(browser: string, gridUrl: string, config: Config, op
|
|
192
170
|
|
193
171
|
if (!test) {
|
194
172
|
const error = `Test with id ${message.payload.id} not found`;
|
195
|
-
|
173
|
+
logger().error(error);
|
196
174
|
emitWorkerMessage({
|
197
175
|
type: 'error',
|
198
176
|
payload: { subtype: 'test', error },
|
@@ -202,8 +180,9 @@ export async function start(browser: string, gridUrl: string, config: Config, op
|
|
202
180
|
|
203
181
|
const baseContext: BaseCreeveyTestContext = {
|
204
182
|
browserName: browser,
|
205
|
-
//
|
206
|
-
//
|
183
|
+
// @ts-expect-error We defined separate d.ts declarations for each webdriver
|
184
|
+
// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
|
185
|
+
webdriver: webdriver.browser,
|
207
186
|
screenshots: [],
|
208
187
|
|
209
188
|
matchImage: matchImage,
|
@@ -211,9 +190,6 @@ export async function start(browser: string, gridUrl: string, config: Config, op
|
|
211
190
|
|
212
191
|
// NOTE: Deprecated
|
213
192
|
expect: chai.expect,
|
214
|
-
//TODO Move things below to the separate module
|
215
|
-
until: until,
|
216
|
-
keys: Key,
|
217
193
|
};
|
218
194
|
|
219
195
|
imagesContext.attachments = [];
|
@@ -246,16 +222,20 @@ export async function start(browser: string, gridUrl: string, config: Config, op
|
|
246
222
|
runner.emit(TEST_EVENTS.RUN_BEGIN);
|
247
223
|
runner.emit(TEST_EVENTS.TEST_BEGIN, fakeTest);
|
248
224
|
|
225
|
+
let timeout;
|
226
|
+
let isRejected = false;
|
249
227
|
const start = Date.now();
|
250
228
|
try {
|
251
229
|
await Promise.race([
|
252
|
-
new Promise(
|
253
|
-
|
254
|
-
|
255
|
-
|
230
|
+
new Promise(
|
231
|
+
(_, reject) =>
|
232
|
+
(timeout = setTimeout(() => {
|
233
|
+
isRejected = true;
|
234
|
+
reject(new Error(`Timeout of ${config.testTimeout}ms exceeded`));
|
235
|
+
}, config.testTimeout)),
|
256
236
|
),
|
257
237
|
(async () => {
|
258
|
-
const context = await webdriver.switchStory(test.story, baseContext
|
238
|
+
const context = await webdriver.switchStory(test.story, baseContext);
|
259
239
|
await test.fn(context);
|
260
240
|
})(),
|
261
241
|
]);
|
@@ -264,6 +244,7 @@ export async function start(browser: string, gridUrl: string, config: Config, op
|
|
264
244
|
fakeTest.err = error;
|
265
245
|
}
|
266
246
|
const duration = Date.now() - start;
|
247
|
+
clearTimeout(timeout);
|
267
248
|
fakeTest.attachments = imagesContext.attachments;
|
268
249
|
fakeTest.state = error ? 'failed' : 'passed';
|
269
250
|
fakeTest.duration = duration;
|
@@ -277,19 +258,19 @@ export async function start(browser: string, gridUrl: string, config: Config, op
|
|
277
258
|
runner.emit(TEST_EVENTS.TEST_END, fakeTest);
|
278
259
|
runner.emit(TEST_EVENTS.RUN_END);
|
279
260
|
|
280
|
-
|
281
|
-
try {
|
282
|
-
if (webdriver instanceof SeleniumWebdriver && webdriver.browser) {
|
283
|
-
await outputTraceLogs(webdriver.browser, test, workerLogger);
|
284
|
-
}
|
285
|
-
} catch (_) {
|
286
|
-
/* noop */
|
287
|
-
}
|
288
|
-
}
|
261
|
+
await webdriver.afterTest(test);
|
289
262
|
|
290
|
-
|
263
|
+
// eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
|
264
|
+
if (isRejected) {
|
265
|
+
emitWorkerMessage({
|
266
|
+
type: 'error',
|
267
|
+
payload: { subtype: 'unknown', error: serializeError(error) },
|
268
|
+
});
|
269
|
+
} else {
|
270
|
+
runHandler(baseContext.browserName, imagesContext.images, error);
|
271
|
+
}
|
291
272
|
})().catch((error: unknown) => {
|
292
|
-
|
273
|
+
logger().error('Unexpected error:', error);
|
293
274
|
emitWorkerMessage({
|
294
275
|
type: 'error',
|
295
276
|
payload: { subtype: 'test', error: serializeError(error) },
|
@@ -297,7 +278,7 @@ export async function start(browser: string, gridUrl: string, config: Config, op
|
|
297
278
|
});
|
298
279
|
});
|
299
280
|
|
300
|
-
|
281
|
+
logger().info('Browser is ready');
|
301
282
|
|
302
283
|
emitWorkerMessage({ type: 'ready' });
|
303
284
|
}
|
package/src/types.ts
CHANGED
@@ -1,12 +1,10 @@
|
|
1
1
|
import type { StoryContextForEnhancers, DecoratorFunction } from '@storybook/csf';
|
2
|
-
import type { IKey } from 'selenium-webdriver/lib/input.js';
|
3
2
|
import type { Worker as ClusterWorker } from 'cluster';
|
4
|
-
import type { /*Builder,*/ until } from 'selenium-webdriver';
|
5
3
|
import type Pixelmatch from 'pixelmatch';
|
6
4
|
import type { ODiffOptions } from 'odiff-bin';
|
7
5
|
import type { expect } from 'chai';
|
8
6
|
import type EventEmitter from 'events';
|
9
|
-
import
|
7
|
+
import { LaunchOptions } from 'playwright-core';
|
10
8
|
// import type { Browser } from 'playwright-core';
|
11
9
|
|
12
10
|
/* eslint-disable @typescript-eslint/no-explicit-any */
|
@@ -43,6 +41,18 @@ export interface StoryMeta {
|
|
43
41
|
};
|
44
42
|
}
|
45
43
|
|
44
|
+
export enum StorybookEvents {
|
45
|
+
SET_STORIES = 'setStories',
|
46
|
+
SET_CURRENT_STORY = 'setCurrentStory',
|
47
|
+
FORCE_REMOUNT = 'forceRemount',
|
48
|
+
STORY_RENDERED = 'storyRendered',
|
49
|
+
STORY_ERRORED = 'storyErrored',
|
50
|
+
STORY_THREW_EXCEPTION = 'storyThrewException',
|
51
|
+
UPDATE_STORY_ARGS = 'updateStoryArgs',
|
52
|
+
SET_GLOBALS = 'setGlobals',
|
53
|
+
UPDATE_GLOBALS = 'updateGlobals',
|
54
|
+
}
|
55
|
+
|
46
56
|
export interface CreeveyMeta {
|
47
57
|
parameters?: {
|
48
58
|
creevey?: CreeveyStoryParams;
|
@@ -93,14 +103,6 @@ export class ChromeConfig {
|
|
93
103
|
*/
|
94
104
|
export interface BrowserConfigObject {
|
95
105
|
browserName: string;
|
96
|
-
/**
|
97
|
-
* Browser version. Ignored with Playwright webdriver
|
98
|
-
*/
|
99
|
-
browserVersion?: string;
|
100
|
-
/**
|
101
|
-
* Operation system name. Ignored with Playwright webdriver
|
102
|
-
*/
|
103
|
-
platformName?: string;
|
104
106
|
// customizeBuilder?: (builder: Builder) => Builder;
|
105
107
|
limit?: number;
|
106
108
|
/**
|
@@ -124,15 +126,25 @@ export interface BrowserConfigObject {
|
|
124
126
|
* Used only with `useDocker == false`
|
125
127
|
*/
|
126
128
|
webdriverCommand?: string[];
|
127
|
-
// TODO Check version compatibility
|
128
|
-
// playwrightVersion?: string;
|
129
129
|
// /**
|
130
130
|
// * Use to start standalone playwright browser
|
131
131
|
// */
|
132
132
|
// playwrightBrowser?: () => Promise<Browser>;
|
133
133
|
viewport?: { width: number; height: number };
|
134
134
|
|
135
|
-
|
135
|
+
seleniumCapabilities?: {
|
136
|
+
/**
|
137
|
+
* Browser version. Ignored with Playwright webdriver
|
138
|
+
*/
|
139
|
+
browserVersion?: string;
|
140
|
+
/**
|
141
|
+
* Operation system name. Ignored with Playwright webdriver
|
142
|
+
*/
|
143
|
+
platformName?: string;
|
144
|
+
[name: string]: unknown;
|
145
|
+
};
|
146
|
+
|
147
|
+
playwrightOptions?: Omit<LaunchOptions, 'logger'>;
|
136
148
|
}
|
137
149
|
|
138
150
|
export type StorybookGlobals = Record<string, unknown>;
|
@@ -151,7 +163,8 @@ export interface CreeveyWebdriver {
|
|
151
163
|
openBrowser(fresh?: boolean): Promise<CreeveyWebdriver | null>;
|
152
164
|
closeBrowser(): Promise<void>;
|
153
165
|
loadStoriesFromBrowser(): Promise<StoriesRaw>;
|
154
|
-
switchStory(story: StoryInput, context: BaseCreeveyTestContext
|
166
|
+
switchStory(story: StoryInput, context: BaseCreeveyTestContext): Promise<CreeveyTestContext>;
|
167
|
+
afterTest(test: ServerTest): Promise<void>;
|
155
168
|
}
|
156
169
|
|
157
170
|
export interface HookConfig {
|
@@ -293,6 +306,11 @@ export interface Config {
|
|
293
306
|
* The `--ui` CLI option ignores this option
|
294
307
|
*/
|
295
308
|
failFast: boolean;
|
309
|
+
/**
|
310
|
+
* Start workers in sequential queue
|
311
|
+
* @default false
|
312
|
+
*/
|
313
|
+
useWorkerQueue: boolean;
|
296
314
|
/**
|
297
315
|
* Specify platform for docker images
|
298
316
|
*/
|
@@ -413,14 +431,8 @@ export interface TestData extends TestMeta {
|
|
413
431
|
|
414
432
|
export interface BaseCreeveyTestContext {
|
415
433
|
browserName: string;
|
416
|
-
|
417
|
-
|
418
|
-
*/
|
419
|
-
until: typeof until;
|
420
|
-
/**
|
421
|
-
* @deprecated In near future Creevey will additionally support Playwright as a webdriver, so any Selenium specific things might not be available. Please import `keys` explicitly
|
422
|
-
*/
|
423
|
-
keys: IKey;
|
434
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
435
|
+
webdriver: any;
|
424
436
|
/**
|
425
437
|
* @deprecated Usually for screenshot testing you don't need other type of assertions except matching images, but if you really need it, please use external `expect` libs
|
426
438
|
*/
|
package/.yarnrc.yml
DELETED
@@ -1 +0,0 @@
|
|
1
|
-
nodeLinker: node-modules
|