creevey 0.9.0-beta.2 → 0.9.0-beta.20
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/.yarn/install-state.gz +0 -0
- package/.yarnrc.yml +1 -0
- package/CHANGELOG.md +51 -0
- package/README.md +9 -1
- package/addon/README.md +3 -0
- package/addon/package.json +5 -0
- package/docs/config.md +29 -26
- package/jest.config.js +6 -0
- package/lib/cjs/cli.js +1 -0
- package/lib/cjs/client/addon/Manager.js +170 -390
- package/lib/cjs/client/addon/components/Addon.js +17 -45
- package/lib/cjs/client/addon/components/Icons.js +12 -14
- package/lib/cjs/client/addon/components/Panel.js +21 -30
- package/lib/cjs/client/addon/components/TestSelect.js +20 -31
- package/lib/cjs/client/addon/components/Tools.js +35 -65
- package/lib/cjs/client/addon/decorator.js +1 -4
- package/lib/cjs/client/addon/index.js +27 -0
- package/lib/cjs/client/addon/preset.js +3 -76
- package/lib/cjs/client/addon/preview.js +11 -0
- package/lib/cjs/client/addon/readyForCapture.js +1 -4
- package/lib/cjs/client/addon/register.js +43 -82
- package/lib/cjs/client/addon/utils.js +4 -8
- package/lib/cjs/client/addon/withCreevey.js +145 -404
- package/lib/cjs/client/shared/components/ImagesView/BlendView.js +25 -35
- package/lib/cjs/client/shared/components/ImagesView/ImagesView.js +29 -41
- package/lib/cjs/client/shared/components/ImagesView/SideBySideView.js +46 -83
- package/lib/cjs/client/shared/components/ImagesView/SlideView.js +39 -67
- package/lib/cjs/client/shared/components/ImagesView/SwapView.js +26 -57
- package/lib/cjs/client/shared/components/ImagesView/index.js +9 -14
- package/lib/cjs/client/shared/components/PageFooter/PageFooter.js +13 -16
- package/lib/cjs/client/shared/components/PageFooter/Paging.js +16 -37
- package/lib/cjs/client/shared/components/PageHeader/ImagePreview.js +42 -34
- package/lib/cjs/client/shared/components/PageHeader/PageHeader.js +40 -84
- package/lib/cjs/client/shared/components/ResultsPage.js +42 -99
- package/lib/cjs/client/shared/creeveyClientApi.js +56 -93
- package/lib/cjs/client/shared/helpers.js +149 -274
- package/lib/cjs/client/shared/viewMode.js +5 -9
- package/lib/cjs/client/web/192.js +1 -0
- package/lib/cjs/client/web/632.js +43 -0
- package/lib/cjs/client/web/794.js +1 -0
- package/lib/cjs/client/web/main.js +79 -38
- package/lib/cjs/client/web/main.js.LICENSE.txt +34 -0
- package/lib/cjs/creevey.js +15 -30
- package/lib/cjs/index.js +0 -15
- package/lib/cjs/server/config.js +16 -36
- package/lib/cjs/server/docker.js +8 -34
- package/lib/cjs/server/index.js +9 -34
- package/lib/cjs/server/logger.js +7 -20
- package/lib/cjs/server/master/api.js +1 -14
- package/lib/cjs/server/master/index.js +25 -49
- package/lib/cjs/server/master/master.js +6 -21
- package/lib/cjs/server/master/pool.js +10 -53
- package/lib/cjs/server/master/runner.js +65 -105
- package/lib/cjs/server/master/server.js +10 -29
- package/lib/cjs/server/messages.js +14 -62
- package/lib/cjs/server/selenium/browser.js +149 -185
- package/lib/cjs/server/selenium/index.js +0 -4
- package/lib/cjs/server/selenium/selenoid.js +18 -44
- package/lib/cjs/server/stories.js +35 -57
- package/lib/cjs/server/storybook/providers/browser.js +15 -29
- package/lib/cjs/server/storybook/providers/hybrid.js +16 -37
- package/lib/cjs/server/telemetry.js +167 -0
- package/lib/cjs/server/testsFiles/parser.js +3 -19
- package/lib/cjs/server/testsFiles/register.js +8 -14
- package/lib/cjs/server/update.js +4 -25
- package/lib/cjs/server/utils.js +35 -76
- package/lib/cjs/server/worker/chai-image.js +1 -27
- package/lib/cjs/server/worker/helpers.js +2 -12
- package/lib/cjs/server/worker/index.js +1 -3
- package/lib/cjs/server/worker/reporter.js +16 -43
- package/lib/cjs/server/worker/worker.js +32 -72
- package/lib/cjs/shared/index.js +87 -0
- package/lib/cjs/shared/serializeRegExp.js +34 -0
- package/lib/cjs/types.js +11 -20
- package/lib/esm/cli.js +1 -1
- package/lib/esm/client/addon/Manager.js +170 -381
- package/lib/esm/client/addon/components/Addon.js +15 -34
- package/lib/esm/client/addon/components/Icons.js +10 -6
- package/lib/esm/client/addon/components/Panel.js +20 -18
- package/lib/esm/client/addon/components/TestSelect.js +19 -23
- package/lib/esm/client/addon/components/Tools.js +33 -49
- package/lib/esm/client/addon/decorator.js +1 -1
- package/lib/esm/client/addon/index.js +2 -0
- package/lib/esm/client/addon/preset.js +2 -56
- package/lib/esm/client/addon/preview.js +5 -0
- package/lib/esm/client/addon/readyForCapture.js +1 -3
- package/lib/esm/client/addon/register.js +41 -67
- package/lib/esm/client/addon/utils.js +3 -7
- package/lib/esm/client/addon/withCreevey.js +142 -388
- package/lib/esm/client/shared/components/ImagesView/BlendView.js +22 -18
- package/lib/esm/client/shared/components/ImagesView/ImagesView.js +27 -25
- package/lib/esm/client/shared/components/ImagesView/SideBySideView.js +43 -63
- package/lib/esm/client/shared/components/ImagesView/SlideView.js +36 -47
- package/lib/esm/client/shared/components/ImagesView/SwapView.js +23 -40
- package/lib/esm/client/shared/components/PageFooter/PageFooter.js +12 -8
- package/lib/esm/client/shared/components/PageFooter/Paging.js +15 -29
- package/lib/esm/client/shared/components/PageHeader/ImagePreview.js +40 -25
- package/lib/esm/client/shared/components/PageHeader/PageHeader.js +38 -66
- package/lib/esm/client/shared/components/ResultsPage.js +39 -75
- package/lib/esm/client/shared/creeveyClientApi.js +56 -90
- package/lib/esm/client/shared/helpers.js +133 -230
- package/lib/esm/client/shared/viewMode.js +4 -4
- package/lib/esm/client/web/192.js +1 -0
- package/lib/esm/client/web/632.js +43 -0
- package/lib/esm/client/web/794.js +1 -0
- package/lib/esm/client/web/index.html +19 -0
- package/lib/esm/client/web/main.js +79 -0
- package/lib/esm/client/web/main.js.LICENSE.txt +34 -0
- package/lib/esm/creevey.js +13 -16
- package/lib/esm/index.js +1 -4
- package/lib/esm/server/config.js +9 -16
- package/lib/esm/server/docker.js +6 -14
- package/lib/esm/server/index.js +8 -22
- package/lib/esm/server/logger.js +0 -1
- package/lib/esm/server/master/api.js +0 -9
- package/lib/esm/server/master/index.js +25 -35
- package/lib/esm/server/master/master.js +2 -7
- package/lib/esm/server/master/pool.js +8 -41
- package/lib/esm/server/master/runner.js +64 -90
- package/lib/esm/server/master/server.js +9 -11
- package/lib/esm/server/messages.js +8 -42
- package/lib/esm/server/selenium/browser.js +147 -163
- package/lib/esm/server/selenium/selenoid.js +16 -27
- package/lib/esm/server/stories.js +34 -46
- package/lib/esm/server/storybook/providers/browser.js +12 -17
- package/lib/esm/server/storybook/providers/hybrid.js +11 -22
- package/lib/esm/server/telemetry.js +160 -0
- package/lib/esm/server/testsFiles/parser.js +0 -6
- package/lib/esm/server/testsFiles/register.js +6 -7
- package/lib/esm/server/update.js +1 -13
- package/lib/esm/server/utils.js +20 -41
- package/lib/esm/server/worker/chai-image.js +0 -21
- package/lib/esm/server/worker/helpers.js +2 -9
- package/lib/esm/server/worker/reporter.js +15 -29
- package/lib/esm/server/worker/worker.js +31 -48
- package/lib/esm/shared/index.js +77 -0
- package/lib/esm/shared/serializeRegExp.js +24 -0
- package/lib/esm/types.js +5 -1
- package/lib/types/client/addon/Manager.d.ts +3 -3
- package/lib/types/client/addon/components/Addon.d.ts +1 -0
- package/lib/types/client/addon/components/Icons.d.ts +1 -0
- package/lib/types/client/addon/components/Panel.d.ts +1 -0
- package/lib/types/client/addon/components/Tools.d.ts +1 -0
- package/lib/types/client/addon/decorator.d.ts +1 -1
- package/lib/types/client/addon/index.d.ts +2 -0
- package/lib/types/client/addon/preset.d.ts +2 -24
- package/lib/types/client/addon/preview.d.ts +4 -0
- package/lib/types/client/addon/utils.d.ts +1 -0
- package/lib/types/client/addon/withCreevey.d.ts +4 -3
- package/lib/types/client/shared/components/ImagesView/BlendView.d.ts +3 -1
- package/lib/types/client/shared/components/ImagesView/SideBySideView.d.ts +3 -1
- package/lib/types/client/shared/components/ImagesView/SlideView.d.ts +3 -1
- package/lib/types/client/shared/components/ImagesView/SwapView.d.ts +3 -1
- package/lib/types/client/shared/components/PageHeader/ImagePreview.d.ts +3 -1
- package/lib/types/client/shared/components/ResultsPage.d.ts +3 -1
- package/lib/types/client/web/CreeveyLoader.d.ts +1 -1
- package/lib/types/client/web/CreeveyView/SideBar/Checkbox.d.ts +6 -3
- package/lib/types/client/web/CreeveyView/SideBar/Search.d.ts +1 -0
- package/lib/types/client/web/CreeveyView/SideBar/SuiteLink.d.ts +19 -14
- package/lib/types/client/web/CreeveyView/SideBar/TestStatusIcon.d.ts +3 -1
- package/lib/types/client/web/CreeveyView/SideBar/TestsStatus.d.ts +3 -1
- package/lib/types/client/web/CreeveyView/SideBar/Toggle.d.ts +1 -0
- package/lib/types/client/web/KeyboardEventsContext.d.ts +4 -2
- package/lib/types/index.d.ts +4 -1
- package/lib/types/server/logger.d.ts +6 -2
- package/lib/types/server/messages.d.ts +14 -12
- package/lib/types/server/selenium/browser.d.ts +5 -3
- package/lib/types/server/storybook/providers/browser.d.ts +2 -4
- package/lib/types/server/storybook/providers/hybrid.d.ts +2 -4
- package/lib/types/server/telemetry.d.ts +2 -0
- package/lib/types/server/utils.d.ts +5 -1
- package/lib/types/shared/index.d.ts +7 -0
- package/lib/types/shared/serializeRegExp.d.ts +9 -0
- package/lib/types/types.d.ts +29 -36
- package/package.json +132 -133
- package/types/global.d.ts +5 -0
- package/lib/cjs/client/web/1.js +0 -13
- package/lib/cjs/client/web/2.js +0 -1
- package/lib/cjs/server/extract.js +0 -50
- package/lib/cjs/server/loaders/babel/creevey-plugin.js +0 -88
- package/lib/cjs/server/loaders/babel/helpers.js +0 -479
- package/lib/cjs/server/loaders/babel/register.js +0 -126
- package/lib/cjs/server/loaders/hooks/mdx.js +0 -30
- package/lib/cjs/server/loaders/hooks/svelte.js +0 -65
- package/lib/cjs/server/loaders/webpack/compile.js +0 -286
- package/lib/cjs/server/loaders/webpack/creevey-loader.js +0 -174
- package/lib/cjs/server/loaders/webpack/dummy-hmr.js +0 -44
- package/lib/cjs/server/loaders/webpack/mdx-loader.js +0 -72
- package/lib/cjs/server/loaders/webpack/start.js +0 -41
- package/lib/cjs/server/storybook/entry.js +0 -68
- package/lib/cjs/server/storybook/helpers.js +0 -165
- package/lib/cjs/server/storybook/providers/nodejs.js +0 -239
- package/lib/cjs/shared.js +0 -124
- package/lib/esm/server/extract.js +0 -34
- package/lib/esm/server/loaders/babel/creevey-plugin.js +0 -74
- package/lib/esm/server/loaders/babel/helpers.js +0 -462
- package/lib/esm/server/loaders/babel/register.js +0 -105
- package/lib/esm/server/loaders/hooks/mdx.js +0 -15
- package/lib/esm/server/loaders/hooks/svelte.js +0 -49
- package/lib/esm/server/loaders/webpack/compile.js +0 -263
- package/lib/esm/server/loaders/webpack/creevey-loader.js +0 -153
- package/lib/esm/server/loaders/webpack/dummy-hmr.js +0 -36
- package/lib/esm/server/loaders/webpack/mdx-loader.js +0 -58
- package/lib/esm/server/loaders/webpack/start.js +0 -27
- package/lib/esm/server/storybook/entry.js +0 -44
- package/lib/esm/server/storybook/helpers.js +0 -106
- package/lib/esm/server/storybook/providers/nodejs.js +0 -217
- package/lib/esm/shared.js +0 -93
- package/lib/types/server/extract.d.ts +0 -2
- package/lib/types/server/loaders/babel/creevey-plugin.d.ts +0 -1
- package/lib/types/server/loaders/babel/helpers.d.ts +0 -19
- package/lib/types/server/loaders/babel/register.d.ts +0 -5
- package/lib/types/server/loaders/hooks/mdx.d.ts +0 -1
- package/lib/types/server/loaders/hooks/svelte.d.ts +0 -1
- package/lib/types/server/loaders/webpack/compile.d.ts +0 -2
- package/lib/types/server/loaders/webpack/creevey-loader.d.ts +0 -2
- package/lib/types/server/loaders/webpack/dummy-hmr.d.ts +0 -10
- package/lib/types/server/loaders/webpack/mdx-loader.d.ts +0 -6
- package/lib/types/server/loaders/webpack/start.d.ts +0 -1
- package/lib/types/server/storybook/entry.d.ts +0 -18
- package/lib/types/server/storybook/helpers.d.ts +0 -24
- package/lib/types/server/storybook/providers/nodejs.d.ts +0 -9
- package/lib/types/shared.d.ts +0 -16
- package/preset.js +0 -9
- package/storybook-static/stories.json +0 -21
- package/types/mdx.d.ts +0 -6
@@ -1,33 +1,38 @@
|
|
1
|
+
import { SET_GLOBALS, UPDATE_STORY_ARGS, STORY_RENDERED } from '@storybook/core-events';
|
1
2
|
import chalk from 'chalk';
|
2
3
|
import http from 'http';
|
3
4
|
import https from 'https';
|
4
|
-
import { getLogger } from 'loglevel';
|
5
|
+
import { getLogger, levels } from 'loglevel';
|
5
6
|
import prefix from 'loglevel-plugin-prefix';
|
6
7
|
import { networkInterfaces } from 'os';
|
7
8
|
import { PNG } from 'pngjs';
|
8
|
-
import { Builder, By, Capabilities, Origin } from 'selenium-webdriver';
|
9
|
+
import { Builder, By, Capabilities, Origin, logging } from 'selenium-webdriver';
|
10
|
+
// import { Options as IeOptions } from 'selenium-webdriver/ie';
|
11
|
+
// import { Options as EdgeOptions } from 'selenium-webdriver/edge';
|
12
|
+
// import { Options as ChromeOptions } from 'selenium-webdriver/chrome';
|
13
|
+
// import { Options as SafariOptions } from 'selenium-webdriver/safari';
|
14
|
+
// import { Options as FirefoxOptions } from 'selenium-webdriver/firefox';
|
9
15
|
import { PageLoadStrategy } from 'selenium-webdriver/lib/capabilities';
|
10
16
|
import { isDefined, noop } from '../../types';
|
11
17
|
import { colors, logger } from '../logger';
|
12
18
|
import { emitStoriesMessage, subscribeOn } from '../messages';
|
13
|
-
import { importStorybookCoreEvents, isStorybookVersionLessThan } from '../storybook/helpers';
|
14
19
|
import { isShuttingDown, LOCALHOST_REGEXP, runSequence } from '../utils';
|
20
|
+
// type UnPromise<P> = P extends Promise<infer T> ? T : never;
|
21
|
+
|
22
|
+
const storybookRootID = 'storybook-root';
|
15
23
|
const DOCKER_INTERNAL = 'host.docker.internal';
|
16
24
|
let browserLogger = logger;
|
17
25
|
let browserName = '';
|
18
26
|
let browser = null;
|
27
|
+
// let context: UnPromise<ReturnType<typeof BrowsingContext>> | null = null;
|
19
28
|
let creeveyServerHost = null;
|
20
|
-
|
21
29
|
function getSessionData(grid, sessionId = '') {
|
22
30
|
const gridUrl = new URL(grid);
|
23
31
|
gridUrl.pathname = `/host/${sessionId}`;
|
24
32
|
return new Promise((resolve, reject) => (gridUrl.protocol == 'https:' ? https : http).get(gridUrl.toString(), res => {
|
25
33
|
if (res.statusCode !== 200) {
|
26
|
-
|
27
|
-
|
28
|
-
return reject(new Error(`Couldn't get session data for ${sessionId}. Status code: ${(_res$statusCode = res.statusCode) !== null && _res$statusCode !== void 0 ? _res$statusCode : 'Unknown'}`));
|
34
|
+
return reject(new Error(`Couldn't get session data for ${sessionId}. Status code: ${res.statusCode ?? 'Unknown'}`));
|
29
35
|
}
|
30
|
-
|
31
36
|
let data = '';
|
32
37
|
res.setEncoding('utf8');
|
33
38
|
res.on('data', chunk => data += chunk);
|
@@ -35,51 +40,42 @@ function getSessionData(grid, sessionId = '') {
|
|
35
40
|
try {
|
36
41
|
resolve(JSON.parse(data));
|
37
42
|
} catch (error) {
|
38
|
-
|
39
|
-
|
40
|
-
reject(new Error(`Couldn't get session data for ${sessionId}. ${error instanceof Error ? (_error$stack = error.stack) !== null && _error$stack !== void 0 ? _error$stack : error.message : error}`));
|
43
|
+
reject(new Error(`Couldn't get session data for ${sessionId}. ${error instanceof Error ? error.stack ?? error.message : error}`));
|
41
44
|
}
|
42
45
|
});
|
43
46
|
}));
|
44
47
|
}
|
45
|
-
|
46
48
|
function getAddresses() {
|
49
|
+
// TODO Check if docker is used
|
47
50
|
return [DOCKER_INTERNAL].concat(...Object.values(networkInterfaces()).filter(isDefined).map(network => network.filter(info => info.family == 'IPv4').map(info => info.address)));
|
48
51
|
}
|
49
|
-
|
50
52
|
async function resolveStorybookUrl(storybookUrl, checkUrl) {
|
51
53
|
browserLogger.debug('Resolving storybook url');
|
52
54
|
const addresses = getAddresses();
|
53
|
-
|
54
55
|
for (const ip of addresses) {
|
55
56
|
const resolvedUrl = storybookUrl.replace(LOCALHOST_REGEXP, ip);
|
56
57
|
browserLogger.debug(`Checking storybook availability on ${chalk.magenta(resolvedUrl)}`);
|
57
|
-
|
58
58
|
if (await checkUrl(resolvedUrl)) {
|
59
59
|
browserLogger.debug(`Resolved storybook url ${chalk.magenta(resolvedUrl)}`);
|
60
60
|
return resolvedUrl;
|
61
61
|
}
|
62
62
|
}
|
63
|
-
|
64
63
|
const error = new Error('Please specify `storybookUrl` with IP address that accessible from remote browser');
|
65
64
|
error.name = 'ResolveUrlError';
|
66
65
|
throw error;
|
67
66
|
}
|
68
|
-
|
69
67
|
async function openUrlAndWaitForPageSource(browser, url, predicate) {
|
70
68
|
let source = '';
|
71
69
|
await browser.get(url);
|
72
|
-
|
73
70
|
do {
|
74
71
|
try {
|
75
72
|
source = await browser.getPageSource();
|
76
|
-
} catch (_) {
|
73
|
+
} catch (_) {
|
74
|
+
// NOTE: Firefox can raise exception "curContainer.frame.document.documentElement is null"
|
77
75
|
}
|
78
76
|
} while (predicate(source));
|
79
|
-
|
80
77
|
return source;
|
81
78
|
}
|
82
|
-
|
83
79
|
function getUrlChecker(browser) {
|
84
80
|
return async url => {
|
85
81
|
try {
|
@@ -87,61 +83,50 @@ function getUrlChecker(browser) {
|
|
87
83
|
browserLogger.debug(`Opening ${chalk.magenta('about:blank')} page`);
|
88
84
|
await openUrlAndWaitForPageSource(browser, 'about:blank', source => !source.includes('<body></body>'));
|
89
85
|
browserLogger.debug(`Opening ${chalk.magenta(url)} and checking the page source`);
|
90
|
-
const source = await openUrlAndWaitForPageSource(browser, url,
|
91
|
-
|
86
|
+
const source = await openUrlAndWaitForPageSource(browser, url,
|
87
|
+
// NOTE: IE11 can return only `head` without body
|
88
|
+
source => source.length == 0 || !/<body([^>]*>).+<\/body>/s.test(source));
|
89
|
+
// NOTE: This is the most optimal way to check if we in storybook or not
|
92
90
|
// We don't use any page load strategies except `NONE`
|
93
91
|
// because other add significant delay and some of them don't work in earlier chrome versions
|
94
92
|
// Browsers always load page successful even it's failed
|
95
|
-
// So we just check
|
96
|
-
|
97
|
-
|
98
|
-
return source.includes('<div id="root"></div>');
|
93
|
+
// So we just check `root` element
|
94
|
+
browserLogger.debug(`Checking ${chalk.cyan(`#${storybookRootID}`)} existence on ${chalk.magenta(url)}`);
|
95
|
+
return source.includes(`id="${storybookRootID}"`);
|
99
96
|
} catch (error) {
|
100
97
|
return false;
|
101
98
|
}
|
102
99
|
};
|
103
100
|
}
|
104
|
-
|
105
101
|
async function waitForStorybook(browser) {
|
106
|
-
// NOTE: Storybook 5.x doesn't have the `last` method
|
107
|
-
if (isStorybookVersionLessThan(6)) {
|
108
|
-
browserLogger.debug('Waiting for `load` event to make sure that storybook is initiated');
|
109
|
-
return browser.executeAsyncScript(function (callback) {
|
110
|
-
if (document.readyState == 'complete') return callback();
|
111
|
-
window.addEventListener('load', function () {
|
112
|
-
callback();
|
113
|
-
});
|
114
|
-
});
|
115
|
-
}
|
116
|
-
|
117
102
|
browserLogger.debug('Waiting for `setStories` event to make sure that storybook is initiated');
|
118
103
|
let wait = true;
|
119
104
|
let isTimeout = false;
|
120
|
-
const Events = await importStorybookCoreEvents();
|
121
105
|
const initiateTimeout = setTimeout(() => {
|
122
106
|
wait = false;
|
123
107
|
isTimeout = true;
|
124
108
|
}, 60000);
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
109
|
+
while (wait !== false) {
|
110
|
+
try {
|
111
|
+
wait = await browser.executeScript(function (SET_GLOBALS) {
|
112
|
+
if (typeof window.__STORYBOOK_ADDONS_CHANNEL__ == 'undefined') return true;
|
113
|
+
if (window.__STORYBOOK_ADDONS_CHANNEL__.last(SET_GLOBALS) == undefined) return true;
|
114
|
+
return false;
|
115
|
+
}, SET_GLOBALS);
|
116
|
+
} catch (e) {
|
117
|
+
browserLogger.debug('An error has been caught during the script: ', e);
|
118
|
+
}
|
132
119
|
if (!wait) clearTimeout(initiateTimeout);
|
133
120
|
}
|
134
|
-
|
135
121
|
if (isTimeout) throw new Error('Failed to wait `setStories` event');
|
136
122
|
}
|
137
|
-
|
138
123
|
async function resetMousePosition(browser) {
|
139
|
-
var
|
140
|
-
|
124
|
+
var _await$browser$getCap, _await$browser$getCap2;
|
141
125
|
browserLogger.debug('Resetting mouse position to the top-left corner');
|
142
126
|
const browserName = (await browser.getCapabilities()).getBrowserName();
|
143
|
-
const [browserVersion] = (
|
127
|
+
const [browserVersion] = ((_await$browser$getCap = (await browser.getCapabilities()).getBrowserVersion()) === null || _await$browser$getCap === void 0 ? void 0 : _await$browser$getCap.split('.')) ?? ((_await$browser$getCap2 = (await browser.getCapabilities()).get('version')) === null || _await$browser$getCap2 === void 0 ? void 0 : _await$browser$getCap2.split('.')) ?? [];
|
144
128
|
|
129
|
+
// NOTE Reset mouse position to support keweb selenium grid browser versions
|
145
130
|
if (browserName == 'chrome' && browserVersion == '70') {
|
146
131
|
const {
|
147
132
|
top,
|
@@ -156,8 +141,8 @@ async function resetMousePosition(browser) {
|
|
156
141
|
width: bodyRect.width,
|
157
142
|
height: bodyRect.height
|
158
143
|
};
|
159
|
-
});
|
160
|
-
|
144
|
+
});
|
145
|
+
// NOTE Bridge mode doesn't support `Origin.VIEWPORT`, move mouse relative
|
161
146
|
await browser.actions({
|
162
147
|
bridge: true
|
163
148
|
}).move({
|
@@ -181,7 +166,6 @@ async function resetMousePosition(browser) {
|
|
181
166
|
}).perform();
|
182
167
|
}
|
183
168
|
}
|
184
|
-
|
185
169
|
async function resizeViewport(browser, viewport) {
|
186
170
|
const windowRect = await browser.manage().window().getRect();
|
187
171
|
const {
|
@@ -201,7 +185,6 @@ async function resizeViewport(browser, viewport) {
|
|
201
185
|
height: viewport.height + dHeight
|
202
186
|
});
|
203
187
|
}
|
204
|
-
|
205
188
|
const getScrollBarWidth = (() => {
|
206
189
|
let scrollBarWidth = null;
|
207
190
|
return async browser => {
|
@@ -210,33 +193,31 @@ const getScrollBarWidth = (() => {
|
|
210
193
|
// eslint-disable-next-line no-var
|
211
194
|
var div = document.createElement('div');
|
212
195
|
div.innerHTML = 'a'; // NOTE: In IE clientWidth is 0 if this div is empty.
|
213
|
-
|
214
196
|
div.style.overflowY = 'scroll';
|
215
|
-
document.body.appendChild(div);
|
216
|
-
|
197
|
+
document.body.appendChild(div);
|
198
|
+
// eslint-disable-next-line no-var
|
217
199
|
var widthDiff = div.offsetWidth - div.clientWidth;
|
218
200
|
document.body.removeChild(div);
|
219
201
|
return widthDiff;
|
220
202
|
});
|
221
203
|
return scrollBarWidth;
|
222
204
|
};
|
223
|
-
})();
|
224
|
-
|
205
|
+
})();
|
225
206
|
|
207
|
+
// NOTE Firefox and Safari take viewport screenshot without scrollbars
|
226
208
|
async function hasScrollBar(browser) {
|
227
|
-
var _await$browser$
|
228
|
-
|
209
|
+
var _await$browser$getCap3;
|
229
210
|
const browserName = (await browser.getCapabilities()).getBrowserName();
|
230
|
-
const [browserVersion] = (
|
231
|
-
return browserName != 'Safari' &&
|
211
|
+
const [browserVersion] = ((_await$browser$getCap3 = (await browser.getCapabilities()).getBrowserVersion()) === null || _await$browser$getCap3 === void 0 ? void 0 : _await$browser$getCap3.split('.')) ?? [];
|
212
|
+
return browserName != 'Safari' &&
|
213
|
+
// NOTE This need to work with keweb selenium grid
|
232
214
|
!(browserName == 'firefox' && browserVersion == '61');
|
233
215
|
}
|
234
|
-
|
235
216
|
async function takeCompositeScreenshot(browser, windowRect, elementRect) {
|
236
217
|
const screens = [];
|
237
218
|
const isScreenshotWithoutScrollBar = !(await hasScrollBar(browser));
|
238
|
-
const scrollBarWidth = await getScrollBarWidth(browser);
|
239
|
-
|
219
|
+
const scrollBarWidth = await getScrollBarWidth(browser);
|
220
|
+
// NOTE Sometimes viewport has been scrolled somewhere
|
240
221
|
const normalizedElementRect = {
|
241
222
|
left: elementRect.left - windowRect.left,
|
242
223
|
right: elementRect.left + elementRect.width - windowRect.left,
|
@@ -251,7 +232,6 @@ async function takeCompositeScreenshot(browser, windowRect, elementRect) {
|
|
251
232
|
const rows = Math.ceil(elementRect.height / viewportHeight);
|
252
233
|
const xOffset = Math.round(isFitHorizontally ? normalizedElementRect.left : Math.max(0, cols * viewportWidth - elementRect.width));
|
253
234
|
const yOffset = Math.round(isFitVertically ? normalizedElementRect.top : Math.max(0, rows * viewportHeight - elementRect.height));
|
254
|
-
|
255
235
|
for (let row = 0; row < rows; row += 1) {
|
256
236
|
for (let col = 0; col < cols; col += 1) {
|
257
237
|
const dx = Math.min(viewportWidth * col + normalizedElementRect.left, Math.max(0, normalizedElementRect.right - viewportWidth));
|
@@ -262,13 +242,11 @@ async function takeCompositeScreenshot(browser, windowRect, elementRect) {
|
|
262
242
|
screens.push(await browser.takeScreenshot());
|
263
243
|
}
|
264
244
|
}
|
265
|
-
|
266
245
|
const images = screens.map(s => Buffer.from(s, 'base64')).map(b => PNG.sync.read(b));
|
267
246
|
const compositeImage = new PNG({
|
268
247
|
width: Math.round(elementRect.width),
|
269
248
|
height: Math.round(elementRect.height)
|
270
249
|
});
|
271
|
-
|
272
250
|
for (let y = 0; y < compositeImage.height; y += 1) {
|
273
251
|
for (let x = 0; x < compositeImage.width; x += 1) {
|
274
252
|
const col = Math.floor(x / viewportWidth);
|
@@ -277,8 +255,11 @@ async function takeCompositeScreenshot(browser, windowRect, elementRect) {
|
|
277
255
|
const isLastRow = rows - row == 1;
|
278
256
|
const scrollOffset = isFitVertically || isScreenshotWithoutScrollBar ? 0 : scrollBarWidth;
|
279
257
|
const i = (y * compositeImage.width + x) * 4;
|
280
|
-
const j =
|
281
|
-
|
258
|
+
const j =
|
259
|
+
// NOTE compositeImage(x, y) => image(x, y)
|
260
|
+
(y % viewportHeight * (viewportWidth + scrollOffset) + x % viewportWidth) * 4 + (
|
261
|
+
// NOTE Offset for last row/col image
|
262
|
+
isLastRow ? yOffset * (viewportWidth + scrollOffset) * 4 : 0) + (isLastCol ? xOffset * 4 : 0);
|
282
263
|
const image = images[row * cols + col];
|
283
264
|
compositeImage.data[i + 0] = image.data[j + 0];
|
284
265
|
compositeImage.data[i + 1] = image.data[j + 1];
|
@@ -286,16 +267,25 @@ async function takeCompositeScreenshot(browser, windowRect, elementRect) {
|
|
286
267
|
compositeImage.data[i + 3] = image.data[j + 3];
|
287
268
|
}
|
288
269
|
}
|
289
|
-
|
290
270
|
return PNG.sync.write(compositeImage).toString('base64');
|
291
271
|
}
|
292
|
-
|
293
272
|
export async function takeScreenshot(browser, captureElement, ignoreElements) {
|
294
273
|
let screenshot;
|
295
274
|
const ignoreStyles = await insertIgnoreStyles(browser, ignoreElements);
|
296
|
-
|
297
275
|
try {
|
298
276
|
if (!captureElement) {
|
277
|
+
if (browserLogger.getLevel() <= levels.DEBUG) {
|
278
|
+
const {
|
279
|
+
innerWidth,
|
280
|
+
innerHeight
|
281
|
+
} = await browser.executeScript(function () {
|
282
|
+
return {
|
283
|
+
innerWidth: window.innerWidth,
|
284
|
+
innerHeight: window.innerHeight
|
285
|
+
};
|
286
|
+
});
|
287
|
+
browserLogger.debug(`Viewport size is: ${innerWidth}x${innerHeight}`);
|
288
|
+
}
|
299
289
|
browserLogger.debug('Capturing viewport screenshot');
|
300
290
|
screenshot = await browser.takeScreenshot();
|
301
291
|
browserLogger.debug('Viewport screenshot is captured');
|
@@ -304,10 +294,10 @@ export async function takeScreenshot(browser, captureElement, ignoreElements) {
|
|
304
294
|
const rects = await browser.executeScript(function (selector) {
|
305
295
|
window.scrollTo(0, 0); // TODO Maybe we should remove same code from `resetMousePosition`
|
306
296
|
// eslint-disable-next-line no-var
|
307
|
-
|
308
297
|
var element = document.querySelector(selector);
|
309
|
-
if (!element) return;
|
298
|
+
if (!element) return;
|
310
299
|
|
300
|
+
// eslint-disable-next-line no-var
|
311
301
|
var elementRect = element.getBoundingClientRect();
|
312
302
|
return {
|
313
303
|
elementRect: {
|
@@ -327,21 +317,28 @@ export async function takeScreenshot(browser, captureElement, ignoreElements) {
|
|
327
317
|
const {
|
328
318
|
elementRect,
|
329
319
|
windowRect
|
330
|
-
} = rects
|
320
|
+
} = rects ?? {};
|
331
321
|
if (!elementRect || !windowRect) throw new Error(`Couldn't find element with selector: '${captureElement}'`);
|
332
322
|
const isFitIntoViewport = elementRect.width + elementRect.left <= windowRect.width && elementRect.height + elementRect.top <= windowRect.height;
|
333
323
|
if (isFitIntoViewport) browserLogger.debug(`Capturing ${chalk.cyan(captureElement)}`);else browserLogger.debug(`Capturing composite screenshot image of ${chalk.cyan(captureElement)}`);
|
334
|
-
|
324
|
+
|
325
|
+
// const element = await browser.findElement(By.css(captureElement));
|
326
|
+
// screenshot = isFitIntoViewport
|
327
|
+
// ? context
|
328
|
+
// ? await context.captureElementScreenshot(await element.getId())
|
329
|
+
// : await browser.findElement(By.css(captureElement)).takeScreenshot()
|
330
|
+
// : // TODO pointer-events: none, need to research
|
331
|
+
// await takeCompositeScreenshot(browser, windowRect, elementRect);
|
332
|
+
screenshot = isFitIntoViewport ? await browser.findElement(By.css(captureElement)).takeScreenshot() :
|
333
|
+
// TODO pointer-events: none, need to research
|
335
334
|
await takeCompositeScreenshot(browser, windowRect, elementRect);
|
336
335
|
browserLogger.debug(`${chalk.cyan(captureElement)} is captured`);
|
337
336
|
}
|
338
337
|
} finally {
|
339
338
|
await removeIgnoreStyles(browser, ignoreStyles);
|
340
339
|
}
|
341
|
-
|
342
340
|
return screenshot;
|
343
341
|
}
|
344
|
-
|
345
342
|
async function selectStory(browser, {
|
346
343
|
id,
|
347
344
|
kind,
|
@@ -352,63 +349,51 @@ async function selectStory(browser, {
|
|
352
349
|
if (typeof window.__CREEVEY_SELECT_STORY__ == 'undefined') {
|
353
350
|
return callback(["Creevey can't switch story. This may happened if forget to add `creevey` addon to your storybook config, or storybook not loaded in browser due syntax error."]);
|
354
351
|
}
|
355
|
-
|
356
|
-
window.__CREEVEY_SELECT_STORY__(id, kind, name, shouldWaitForReady, callback);
|
352
|
+
void window.__CREEVEY_SELECT_STORY__(id, kind, name, shouldWaitForReady, callback);
|
357
353
|
}, id, kind, name, waitForReady);
|
358
|
-
const [errorMessage, isCaptureCalled = false] = result
|
354
|
+
const [errorMessage, isCaptureCalled = false] = result ?? [];
|
359
355
|
if (errorMessage) throw new Error(errorMessage);
|
360
356
|
return isCaptureCalled;
|
361
357
|
}
|
362
|
-
|
363
358
|
export async function updateStorybookGlobals(browser, globals) {
|
364
|
-
if (isStorybookVersionLessThan(6)) {
|
365
|
-
browserLogger.warn('Globals are not supported by Storybook versions less than 6');
|
366
|
-
return;
|
367
|
-
}
|
368
|
-
|
369
359
|
browserLogger.debug('Applying storybook globals');
|
370
360
|
await browser.executeScript(function (globals) {
|
371
361
|
window.__CREEVEY_UPDATE_GLOBALS__(globals);
|
372
362
|
}, globals);
|
373
363
|
}
|
374
|
-
|
375
364
|
function appendIframePath(url) {
|
376
365
|
return `${url.replace(/\/$/, '')}/iframe.html`;
|
377
366
|
}
|
378
|
-
|
379
367
|
async function openStorybookPage(browser, storybookUrl, resolver) {
|
380
368
|
if (!LOCALHOST_REGEXP.test(storybookUrl)) {
|
381
369
|
return browser === null || browser === void 0 ? void 0 : browser.get(appendIframePath(storybookUrl));
|
382
370
|
}
|
383
|
-
|
384
371
|
try {
|
385
372
|
if (resolver) {
|
386
373
|
browserLogger.debug('Resolving storybook url with custom resolver');
|
387
374
|
const resolvedUrl = await resolver();
|
388
375
|
browserLogger.debug(`Resolver storybook url ${resolvedUrl}`);
|
389
376
|
return browser.get(appendIframePath(resolvedUrl));
|
390
|
-
}
|
391
|
-
|
392
|
-
|
377
|
+
}
|
378
|
+
// NOTE: getUrlChecker already calls `browser.get` so we don't need another one
|
393
379
|
return void (await resolveStorybookUrl(appendIframePath(storybookUrl), getUrlChecker(browser)));
|
394
380
|
} catch (error) {
|
395
381
|
browserLogger.error('Failed to resolve storybook URL', error instanceof Error ? error.message : '');
|
396
382
|
throw error;
|
397
383
|
}
|
398
384
|
}
|
399
|
-
|
400
385
|
async function resolveCreeveyHost(browser, port) {
|
401
386
|
if (creeveyServerHost != null) return creeveyServerHost;
|
402
387
|
const addresses = getAddresses();
|
403
388
|
creeveyServerHost = await browser.executeAsyncScript(function (hosts, port, callback) {
|
404
389
|
void Promise.all(hosts.map(function (host) {
|
405
|
-
return
|
406
|
-
|
407
|
-
|
408
|
-
fetch('//' + host + ':' + port + '/ping').then(resolve).catch(reject);
|
409
|
-
}).then(function (response) {
|
390
|
+
return Promise.race([
|
391
|
+
// eslint-disable-next-line @typescript-eslint/restrict-plus-operands
|
392
|
+
fetch('http://' + host + ':' + port + '/ping').then(function (response) {
|
410
393
|
return response.text();
|
411
|
-
})
|
394
|
+
}), new Promise((_resolve, reject) => {
|
395
|
+
setTimeout(reject, 5000);
|
396
|
+
})]).then(function (pong) {
|
412
397
|
return pong == 'pong' ? host : null;
|
413
398
|
}).catch(function () {
|
414
399
|
return null;
|
@@ -422,21 +407,17 @@ async function resolveCreeveyHost(browser, port) {
|
|
422
407
|
if (creeveyServerHost == null) throw new Error("Can't reach creevey server from a browser");
|
423
408
|
return creeveyServerHost;
|
424
409
|
}
|
425
|
-
|
426
|
-
export async function loadStoriesFromBrowser(port) {
|
410
|
+
export async function loadStoriesFromBrowser() {
|
427
411
|
if (!browser) throw new Error("Can't get stories from browser if webdriver isn't connected");
|
428
|
-
const
|
429
|
-
const stories = await browser.executeAsyncScript(function (creeveyHost, creeveyPort, callback) {
|
430
|
-
window.__CREEVEY_SERVER_HOST__ = creeveyHost;
|
431
|
-
window.__CREEVEY_SERVER_PORT__ = creeveyPort;
|
412
|
+
const stories = await browser.executeAsyncScript(function (callback) {
|
432
413
|
void window.__CREEVEY_GET_STORIES__().then(callback);
|
433
|
-
}
|
414
|
+
});
|
434
415
|
if (!stories) throw new Error("Can't get stories, it seems creevey or storybook API isn't available");
|
435
416
|
return stories;
|
436
417
|
}
|
437
|
-
export async function getBrowser(config,
|
418
|
+
export async function getBrowser(config, options) {
|
438
419
|
if (browser) return browser;
|
439
|
-
browserName =
|
420
|
+
browserName = options.browser;
|
440
421
|
const browserConfig = config.browsers[browserName];
|
441
422
|
const {
|
442
423
|
gridUrl = config.gridUrl,
|
@@ -447,30 +428,56 @@ export async function getBrowser(config, name) {
|
|
447
428
|
...userCapabilities
|
448
429
|
} = browserConfig;
|
449
430
|
void limit;
|
450
|
-
const realAddress = address;
|
431
|
+
const realAddress = address;
|
451
432
|
|
452
|
-
|
453
|
-
|
433
|
+
// TODO Define some capabilities explicitly and define typings
|
434
|
+
const capabilities = new Capabilities({
|
435
|
+
...userCapabilities,
|
436
|
+
pageLoadStrategy: PageLoadStrategy.EAGER
|
454
437
|
});
|
455
438
|
subscribeOn('shutdown', () => {
|
456
439
|
var _browser;
|
457
|
-
|
458
|
-
|
440
|
+
(_browser = browser) === null || _browser === void 0 || _browser.quit().finally(() =>
|
441
|
+
// eslint-disable-next-line no-process-exit
|
459
442
|
process.exit());
|
460
443
|
browser = null;
|
461
444
|
});
|
462
|
-
|
463
445
|
try {
|
464
446
|
var _await$browser$getSes;
|
465
|
-
|
466
447
|
const url = new URL(gridUrl);
|
467
448
|
url.username = url.username ? '********' : '';
|
468
449
|
url.password = url.password ? '********' : '';
|
469
|
-
browserLogger.debug(`(${
|
470
|
-
|
450
|
+
browserLogger.debug(`(${browserName}) Connecting to Selenium ${chalk.magenta(url.toString())}`);
|
451
|
+
const prefs = new logging.Preferences();
|
452
|
+
if (options.trace) {
|
453
|
+
for (const type of Object.values(logging.Type)) {
|
454
|
+
prefs.setLevel(type, logging.Level.ALL);
|
455
|
+
}
|
456
|
+
}
|
457
|
+
|
458
|
+
// const ie = new IeOptions();
|
459
|
+
// const edge = new EdgeOptions();
|
460
|
+
// const chrome = new ChromeOptions();
|
461
|
+
// const safari = new SafariOptions();
|
462
|
+
// const firefox = new FirefoxOptions();
|
463
|
+
// edge.enableBidi();
|
464
|
+
// chrome.enableBidi();
|
465
|
+
// firefox.enableBidi();
|
466
|
+
|
467
|
+
browser = await new Builder()
|
468
|
+
// .setIeOptions(ie)
|
469
|
+
// .setEdgeOptions(edge)
|
470
|
+
// .setChromeOptions(chrome)
|
471
|
+
// .setSafariOptions(safari)
|
472
|
+
// .setFirefoxOptions(firefox)
|
473
|
+
.usingServer(gridUrl).withCapabilities(capabilities).setLoggingPrefs(prefs) // NOTE: Should go last
|
474
|
+
.build();
|
475
|
+
|
476
|
+
// const id = await browser.getWindowHandle();
|
477
|
+
// context = await BrowsingContext(browser, { browsingContextId: id });
|
478
|
+
|
471
479
|
const sessionId = (_await$browser$getSes = await browser.getSession()) === null || _await$browser$getSes === void 0 ? void 0 : _await$browser$getSes.getId();
|
472
480
|
let browserHost = '';
|
473
|
-
|
474
481
|
try {
|
475
482
|
const {
|
476
483
|
Name
|
@@ -479,66 +486,56 @@ export async function getBrowser(config, name) {
|
|
479
486
|
} catch (_) {
|
480
487
|
/* noop */
|
481
488
|
}
|
482
|
-
|
483
|
-
browserLogger.debug(`(${name}) Connected successful with ${[chalk.green(browserHost), chalk.magenta(sessionId)].filter(Boolean).join(':')}`);
|
489
|
+
browserLogger.debug(`(${browserName}) Connected successful with ${[chalk.green(browserHost), chalk.magenta(sessionId)].filter(Boolean).join(':')}`);
|
484
490
|
browserLogger = getLogger(sessionId);
|
485
491
|
prefix.apply(browserLogger, {
|
486
492
|
format(level) {
|
487
493
|
const levelColor = colors[level.toUpperCase()];
|
488
|
-
return `[${
|
494
|
+
return `[${browserName}:${chalk.gray(sessionId)}] ${levelColor(level)} =>`;
|
489
495
|
}
|
490
|
-
|
491
496
|
});
|
492
497
|
await runSequence([() => {
|
493
498
|
var _browser2;
|
494
|
-
|
495
499
|
return (_browser2 = browser) === null || _browser2 === void 0 ? void 0 : _browser2.manage().setTimeouts({
|
496
|
-
pageLoad:
|
500
|
+
pageLoad: 10000,
|
497
501
|
script: 60000
|
498
502
|
});
|
499
503
|
}, () => viewport && browser && resizeViewport(browser, viewport), () => browser && openStorybookPage(browser, realAddress, config.resolveStorybookUrl), () => browser && waitForStorybook(browser)], () => !isShuttingDown.current);
|
500
504
|
} catch (originalError) {
|
501
|
-
var
|
502
|
-
|
505
|
+
var _browser4;
|
503
506
|
if (isShuttingDown.current) {
|
504
507
|
var _browser3;
|
505
|
-
|
506
|
-
(_browser3 = browser) === null || _browser3 === void 0 ? void 0 : _browser3.quit().catch(noop);
|
508
|
+
(_browser3 = browser) === null || _browser3 === void 0 || _browser3.quit().catch(noop);
|
507
509
|
browser = null;
|
508
510
|
return null;
|
509
511
|
}
|
510
|
-
|
511
512
|
if (originalError instanceof Error && originalError.name == 'ResolveUrlError') throw originalError;
|
512
|
-
const error = new Error(`Can't load storybook root page by URL ${(
|
513
|
+
const error = new Error(`Can't load storybook root page by URL ${(await ((_browser4 = browser) === null || _browser4 === void 0 ? void 0 : _browser4.getCurrentUrl())) ?? realAddress}`);
|
513
514
|
if (originalError instanceof Error) error.stack = originalError.stack;
|
514
515
|
throw error;
|
515
516
|
}
|
516
|
-
|
517
517
|
if (_storybookGlobals) {
|
518
518
|
await updateStorybookGlobals(browser, _storybookGlobals);
|
519
519
|
}
|
520
|
-
|
521
|
-
await browser.executeScript(function (workerId) {
|
520
|
+
const creeveyHost = await resolveCreeveyHost(browser, options.port);
|
521
|
+
await browser.executeScript(function (workerId, creeveyHost, creeveyPort) {
|
522
522
|
window.__CREEVEY_WORKER_ID__ = workerId;
|
523
|
-
|
523
|
+
window.__CREEVEY_SERVER_HOST__ = creeveyHost;
|
524
|
+
window.__CREEVEY_SERVER_PORT__ = creeveyPort;
|
525
|
+
}, process.pid, creeveyHost, options.port);
|
524
526
|
return browser;
|
525
527
|
}
|
526
|
-
|
527
528
|
async function updateStoryArgs(browser, story, updatedArgs) {
|
528
|
-
const Events = await importStorybookCoreEvents();
|
529
529
|
await browser.executeAsyncScript(function (storyId, updatedArgs, UPDATE_STORY_ARGS, STORY_RENDERED, callback) {
|
530
530
|
window.__STORYBOOK_ADDONS_CHANNEL__.once(STORY_RENDERED, callback);
|
531
|
-
|
532
531
|
window.__STORYBOOK_ADDONS_CHANNEL__.emit(UPDATE_STORY_ARGS, {
|
533
532
|
storyId,
|
534
533
|
updatedArgs
|
535
534
|
});
|
536
|
-
}, story.id, updatedArgs,
|
535
|
+
}, story.id, updatedArgs, UPDATE_STORY_ARGS, STORY_RENDERED);
|
537
536
|
}
|
538
|
-
|
539
537
|
export async function closeBrowser() {
|
540
538
|
if (!browser) return;
|
541
|
-
|
542
539
|
try {
|
543
540
|
await browser.quit();
|
544
541
|
} finally {
|
@@ -546,22 +543,18 @@ export async function closeBrowser() {
|
|
546
543
|
}
|
547
544
|
}
|
548
545
|
export async function switchStory() {
|
549
|
-
var _this$currentTest
|
550
|
-
|
546
|
+
var _this$currentTest;
|
551
547
|
let testOrSuite = this.currentTest;
|
552
548
|
if (!testOrSuite) throw new Error("Can't switch story, because test context doesn't have 'currentTest' field");
|
553
549
|
this.testScope.length = 0;
|
554
550
|
this.screenshots.length = 0;
|
555
551
|
this.testScope.push(this.browserName);
|
556
|
-
|
557
552
|
while ((_testOrSuite = testOrSuite) !== null && _testOrSuite !== void 0 && _testOrSuite.title) {
|
558
553
|
var _testOrSuite;
|
559
|
-
|
560
554
|
this.testScope.push(testOrSuite.title);
|
561
555
|
testOrSuite = testOrSuite.parent;
|
562
556
|
}
|
563
|
-
|
564
|
-
const story = (_this$currentTest = this.currentTest) === null || _this$currentTest === void 0 ? void 0 : (_this$currentTest$ctx = _this$currentTest.ctx) === null || _this$currentTest$ctx === void 0 ? void 0 : _this$currentTest$ctx.story;
|
557
|
+
const story = (_this$currentTest = this.currentTest) === null || _this$currentTest === void 0 || (_this$currentTest = _this$currentTest.ctx) === null || _this$currentTest === void 0 ? void 0 : _this$currentTest.story;
|
565
558
|
if (!story) throw new Error(`Current test '${this.testScope.join('/')}' context doesn't have 'story' field`);
|
566
559
|
const {
|
567
560
|
id,
|
@@ -570,27 +563,22 @@ export async function switchStory() {
|
|
570
563
|
parameters
|
571
564
|
} = story;
|
572
565
|
const {
|
573
|
-
captureElement =
|
566
|
+
captureElement = `#${storybookRootID}`,
|
574
567
|
waitForReady,
|
575
568
|
ignoreElements
|
576
|
-
} =
|
569
|
+
} = parameters.creevey ?? {};
|
577
570
|
browserLogger.debug(`Switching to story ${chalk.cyan(kind)}/${chalk.cyan(name)} by id ${chalk.magenta(id)}`);
|
578
571
|
if (captureElement) Object.defineProperty(this, 'captureElement', {
|
579
572
|
enumerable: true,
|
580
573
|
configurable: true,
|
581
574
|
get: () => this.browser.findElement(By.css(captureElement))
|
582
575
|
});else Reflect.deleteProperty(this, 'captureElement');
|
583
|
-
|
584
576
|
this.takeScreenshot = () => takeScreenshot(this.browser, captureElement, ignoreElements);
|
585
|
-
|
586
577
|
this.updateStoryArgs = updatedArgs => updateStoryArgs(this.browser, story, updatedArgs);
|
587
|
-
|
588
578
|
this.testScope.reverse();
|
589
579
|
let storyPlayResolver;
|
590
580
|
let waitForComplete = new Promise(resolve => storyPlayResolver = resolve);
|
591
581
|
const unsubscribe = subscribeOn('stories', message => {
|
592
|
-
var _payload$captureEleme, _payload$ignoreElemen;
|
593
|
-
|
594
582
|
if (message.type != 'capture') return;
|
595
583
|
const {
|
596
584
|
payload = {},
|
@@ -598,7 +586,7 @@ export async function switchStory() {
|
|
598
586
|
imageName
|
599
587
|
} = {}
|
600
588
|
} = message;
|
601
|
-
void takeScreenshot(this.browser,
|
589
|
+
void takeScreenshot(this.browser, payload.captureElement ?? captureElement, payload.ignoreElements ?? ignoreElements).then(screenshot => {
|
602
590
|
this.screenshots.push({
|
603
591
|
imageName,
|
604
592
|
screenshot
|
@@ -617,17 +605,14 @@ export async function switchStory() {
|
|
617
605
|
kind,
|
618
606
|
name
|
619
607
|
}, waitForReady);
|
620
|
-
|
621
608
|
if (isCaptureCalled) {
|
622
609
|
while (!(await waitForComplete)) {
|
623
610
|
waitForComplete = new Promise(resolve => storyPlayResolver = resolve);
|
624
611
|
}
|
625
612
|
}
|
626
|
-
|
627
613
|
unsubscribe();
|
628
614
|
browserLogger.debug(`Story ${chalk.magenta(id)} ready for capturing`);
|
629
615
|
}
|
630
|
-
|
631
616
|
async function insertIgnoreStyles(browser, ignoreElements) {
|
632
617
|
const ignoreSelectors = Array.prototype.concat(ignoreElements).filter(Boolean);
|
633
618
|
if (!ignoreSelectors.length) return null;
|
@@ -636,7 +621,6 @@ async function insertIgnoreStyles(browser, ignoreElements) {
|
|
636
621
|
return window.__CREEVEY_INSERT_IGNORE_STYLES__(ignoreSelectors);
|
637
622
|
}, ignoreSelectors);
|
638
623
|
}
|
639
|
-
|
640
624
|
async function removeIgnoreStyles(browser, ignoreStyles) {
|
641
625
|
if (ignoreStyles) {
|
642
626
|
browserLogger.debug('Revert hiding ignored elements');
|