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