creevey 0.9.1 → 0.10.0-beta.0

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.
Files changed (259) hide show
  1. package/chromatic.config.json +5 -0
  2. package/dist/client/addon/components/Addon.d.ts +1 -0
  3. package/dist/client/addon/components/Addon.js.map +1 -1
  4. package/dist/client/addon/components/Icons.d.ts +1 -0
  5. package/dist/client/addon/components/Icons.js.map +1 -1
  6. package/dist/client/addon/components/Panel.d.ts +1 -0
  7. package/dist/client/addon/components/Panel.js.map +1 -1
  8. package/dist/client/addon/components/TestSelect.d.ts +1 -0
  9. package/dist/client/addon/components/TestSelect.js +4 -3
  10. package/dist/client/addon/components/TestSelect.js.map +1 -1
  11. package/dist/client/addon/components/Tools.d.ts +1 -0
  12. package/dist/client/addon/components/Tools.js +7 -8
  13. package/dist/client/addon/components/Tools.js.map +1 -1
  14. package/dist/client/addon/controller.d.ts +1 -1
  15. package/dist/client/addon/controller.js.map +1 -1
  16. package/dist/client/addon/decorator.d.ts +1 -1
  17. package/dist/client/addon/manager.js +3 -2
  18. package/dist/client/addon/manager.js.map +1 -1
  19. package/dist/client/addon/preview.d.ts +1 -1
  20. package/dist/client/addon/withCreevey.d.ts +6 -8
  21. package/dist/client/addon/withCreevey.js +21 -19
  22. package/dist/client/addon/withCreevey.js.map +1 -1
  23. package/dist/client/shared/components/ImagesView/BlendView.d.ts +1 -1
  24. package/dist/client/shared/components/ImagesView/BlendView.js.map +1 -1
  25. package/dist/client/shared/components/ImagesView/ImagesView.d.ts +1 -0
  26. package/dist/client/shared/components/ImagesView/ImagesView.js.map +1 -1
  27. package/dist/client/shared/components/ImagesView/SideBySideView.d.ts +1 -1
  28. package/dist/client/shared/components/ImagesView/SideBySideView.js.map +1 -1
  29. package/dist/client/shared/components/ImagesView/SlideView.d.ts +1 -1
  30. package/dist/client/shared/components/ImagesView/SlideView.js.map +1 -1
  31. package/dist/client/shared/components/ImagesView/SwapView.d.ts +1 -1
  32. package/dist/client/shared/components/ImagesView/SwapView.js.map +1 -1
  33. package/dist/client/shared/components/PageFooter/PageFooter.d.ts +1 -0
  34. package/dist/client/shared/components/PageFooter/PageFooter.js +1 -1
  35. package/dist/client/shared/components/PageFooter/PageFooter.js.map +1 -1
  36. package/dist/client/shared/components/PageFooter/Paging.d.ts +2 -2
  37. package/dist/client/shared/components/PageFooter/Paging.js +8 -6
  38. package/dist/client/shared/components/PageFooter/Paging.js.map +1 -1
  39. package/dist/client/shared/components/PageHeader/ImagePreview.js.map +1 -1
  40. package/dist/client/shared/components/PageHeader/PageHeader.d.ts +1 -0
  41. package/dist/client/shared/components/PageHeader/PageHeader.js +2 -1
  42. package/dist/client/shared/components/PageHeader/PageHeader.js.map +1 -1
  43. package/dist/client/shared/components/ResultsPage.d.ts +2 -2
  44. package/dist/client/shared/components/ResultsPage.js.map +1 -1
  45. package/dist/client/web/CreeveyApp.d.ts +1 -0
  46. package/dist/client/web/CreeveyApp.js.map +1 -1
  47. package/dist/client/web/CreeveyLoader.d.ts +1 -0
  48. package/dist/client/web/CreeveyLoader.js.map +1 -1
  49. package/dist/client/web/CreeveyView/SideBar/Checkbox.d.ts +1 -1
  50. package/dist/client/web/CreeveyView/SideBar/Checkbox.js +4 -4
  51. package/dist/client/web/CreeveyView/SideBar/Checkbox.js.map +1 -1
  52. package/dist/client/web/CreeveyView/SideBar/Search.d.ts +1 -0
  53. package/dist/client/web/CreeveyView/SideBar/Search.js +4 -4
  54. package/dist/client/web/CreeveyView/SideBar/Search.js.map +1 -1
  55. package/dist/client/web/CreeveyView/SideBar/SideBar.d.ts +1 -1
  56. package/dist/client/web/CreeveyView/SideBar/SideBar.js +1 -7
  57. package/dist/client/web/CreeveyView/SideBar/SideBar.js.map +1 -1
  58. package/dist/client/web/CreeveyView/SideBar/SideBarFooter.d.ts +1 -0
  59. package/dist/client/web/CreeveyView/SideBar/SideBarFooter.js +5 -4
  60. package/dist/client/web/CreeveyView/SideBar/SideBarFooter.js.map +1 -1
  61. package/dist/client/web/CreeveyView/SideBar/SideBarHeader.d.ts +1 -0
  62. package/dist/client/web/CreeveyView/SideBar/SideBarHeader.js +4 -3
  63. package/dist/client/web/CreeveyView/SideBar/SideBarHeader.js.map +1 -1
  64. package/dist/client/web/CreeveyView/SideBar/SuiteLink.d.ts +3 -7
  65. package/dist/client/web/CreeveyView/SideBar/SuiteLink.js +6 -5
  66. package/dist/client/web/CreeveyView/SideBar/SuiteLink.js.map +1 -1
  67. package/dist/client/web/CreeveyView/SideBar/TestLink.d.ts +1 -0
  68. package/dist/client/web/CreeveyView/SideBar/TestLink.js +5 -1
  69. package/dist/client/web/CreeveyView/SideBar/TestLink.js.map +1 -1
  70. package/dist/client/web/CreeveyView/SideBar/TestStatusIcon.js +15 -8
  71. package/dist/client/web/CreeveyView/SideBar/TestStatusIcon.js.map +1 -1
  72. package/dist/client/web/CreeveyView/SideBar/TestsStatus.js +5 -4
  73. package/dist/client/web/CreeveyView/SideBar/TestsStatus.js.map +1 -1
  74. package/dist/client/web/CreeveyView/SideBar/Toggle.d.ts +1 -0
  75. package/dist/client/web/CreeveyView/SideBar/Toggle.js.map +1 -1
  76. package/dist/client/web/KeyboardEventsContext.d.ts +3 -4
  77. package/dist/client/web/KeyboardEventsContext.js.map +1 -1
  78. package/dist/client/web/assets/index-DkmZfG9C.js +591 -0
  79. package/dist/client/web/index.html +1 -1
  80. package/dist/client/web/index.js +5 -6
  81. package/dist/client/web/index.js.map +1 -1
  82. package/dist/creevey.js +21 -9
  83. package/dist/creevey.js.map +1 -1
  84. package/dist/index.js +7 -3
  85. package/dist/index.js.map +1 -1
  86. package/dist/server/config.d.ts +1 -1
  87. package/dist/server/config.js +9 -5
  88. package/dist/server/config.js.map +1 -1
  89. package/dist/server/docker.d.ts +2 -2
  90. package/dist/server/docker.js +46 -40
  91. package/dist/server/docker.js.map +1 -1
  92. package/dist/server/index.js +54 -15
  93. package/dist/server/index.js.map +1 -1
  94. package/dist/server/master/master.d.ts +1 -5
  95. package/dist/server/master/master.js +3 -3
  96. package/dist/server/master/master.js.map +1 -1
  97. package/dist/server/master/pool.d.ts +2 -1
  98. package/dist/server/master/pool.js +13 -7
  99. package/dist/server/master/pool.js.map +1 -1
  100. package/dist/server/master/runner.d.ts +1 -1
  101. package/dist/server/master/runner.js +4 -2
  102. package/dist/server/master/runner.js.map +1 -1
  103. package/dist/server/master/server.js +1 -0
  104. package/dist/server/master/server.js.map +1 -1
  105. package/dist/server/master/start.d.ts +3 -0
  106. package/dist/server/master/{index.js → start.js} +6 -9
  107. package/dist/server/master/start.js.map +1 -0
  108. package/dist/server/messages.d.ts +4 -10
  109. package/dist/server/messages.js +4 -58
  110. package/dist/server/messages.js.map +1 -1
  111. package/dist/server/playwright/docker-file.d.ts +1 -0
  112. package/dist/server/playwright/docker-file.js +26 -0
  113. package/dist/server/playwright/docker-file.js.map +1 -0
  114. package/dist/server/playwright/docker.d.ts +1 -0
  115. package/dist/server/playwright/docker.js +31 -0
  116. package/dist/server/playwright/docker.js.map +1 -0
  117. package/dist/server/playwright/internal.d.ts +25 -0
  118. package/dist/server/playwright/internal.js +319 -0
  119. package/dist/server/playwright/internal.js.map +1 -0
  120. package/dist/server/playwright/webdriver.d.ts +16 -0
  121. package/dist/server/playwright/webdriver.js +105 -0
  122. package/dist/server/playwright/webdriver.js.map +1 -0
  123. package/dist/server/providers/browser.d.ts +2 -0
  124. package/dist/server/{storybook/providers → providers}/browser.js +6 -7
  125. package/dist/server/providers/browser.js.map +1 -0
  126. package/dist/server/providers/hybrid.d.ts +2 -0
  127. package/dist/server/{storybook/providers → providers}/hybrid.js +8 -8
  128. package/dist/server/providers/hybrid.js.map +1 -0
  129. package/dist/server/reporter.d.ts +26 -0
  130. package/dist/server/{worker/reporter.js → reporter.js} +34 -56
  131. package/dist/server/reporter.js.map +1 -0
  132. package/dist/server/selenium/internal.d.ts +31 -0
  133. package/dist/server/selenium/internal.js +606 -0
  134. package/dist/server/selenium/internal.js.map +1 -0
  135. package/dist/server/selenium/selenoid.js +6 -13
  136. package/dist/server/selenium/selenoid.js.map +1 -1
  137. package/dist/server/selenium/webdriver.d.ts +24 -0
  138. package/dist/server/selenium/webdriver.js +106 -0
  139. package/dist/server/selenium/webdriver.js.map +1 -0
  140. package/dist/server/stories.js +16 -9
  141. package/dist/server/stories.js.map +1 -1
  142. package/dist/server/telemetry.d.ts +1 -1
  143. package/dist/server/telemetry.js +4 -4
  144. package/dist/server/telemetry.js.map +1 -1
  145. package/dist/server/utils.d.ts +3 -4
  146. package/dist/server/utils.js +10 -9
  147. package/dist/server/utils.js.map +1 -1
  148. package/dist/server/webdriver.d.ts +19 -0
  149. package/dist/server/webdriver.js +79 -0
  150. package/dist/server/webdriver.js.map +1 -0
  151. package/dist/server/worker/chai-image.d.ts +2 -5
  152. package/dist/server/worker/chai-image.js +14 -102
  153. package/dist/server/worker/chai-image.js.map +1 -1
  154. package/dist/server/worker/match-image.d.ts +14 -0
  155. package/dist/server/worker/match-image.js +231 -0
  156. package/dist/server/worker/match-image.js.map +1 -0
  157. package/dist/server/worker/start.d.ts +2 -0
  158. package/dist/server/worker/start.js +258 -0
  159. package/dist/server/worker/start.js.map +1 -0
  160. package/dist/types.d.ts +127 -64
  161. package/dist/types.js +15 -9
  162. package/dist/types.js.map +1 -1
  163. package/package.json +108 -110
  164. package/src/client/addon/components/Addon.tsx +1 -1
  165. package/src/client/addon/components/Icons.tsx +1 -1
  166. package/src/client/addon/components/Panel.tsx +1 -1
  167. package/src/client/addon/components/TestSelect.tsx +5 -5
  168. package/src/client/addon/components/Tools.tsx +9 -9
  169. package/src/client/addon/controller.ts +1 -1
  170. package/src/client/addon/manager.ts +4 -4
  171. package/src/client/addon/withCreevey.ts +26 -28
  172. package/src/client/shared/components/ImagesView/BlendView.tsx +1 -1
  173. package/src/client/shared/components/ImagesView/ImagesView.tsx +2 -2
  174. package/src/client/shared/components/ImagesView/SideBySideView.tsx +1 -1
  175. package/src/client/shared/components/ImagesView/SlideView.tsx +1 -1
  176. package/src/client/shared/components/ImagesView/SwapView.tsx +1 -1
  177. package/src/client/shared/components/PageFooter/PageFooter.tsx +2 -2
  178. package/src/client/shared/components/PageFooter/Paging.tsx +13 -13
  179. package/src/client/shared/components/PageHeader/ImagePreview.tsx +1 -1
  180. package/src/client/shared/components/PageHeader/PageHeader.tsx +4 -3
  181. package/src/client/shared/components/ResultsPage.tsx +1 -1
  182. package/src/client/web/CreeveyApp.tsx +1 -1
  183. package/src/client/web/CreeveyLoader.tsx +1 -1
  184. package/src/client/web/CreeveyView/SideBar/Checkbox.tsx +6 -7
  185. package/src/client/web/CreeveyView/SideBar/Search.tsx +4 -4
  186. package/src/client/web/CreeveyView/SideBar/SideBar.tsx +3 -10
  187. package/src/client/web/CreeveyView/SideBar/SideBarFooter.tsx +7 -6
  188. package/src/client/web/CreeveyView/SideBar/SideBarHeader.tsx +7 -6
  189. package/src/client/web/CreeveyView/SideBar/SuiteLink.tsx +8 -6
  190. package/src/client/web/CreeveyView/SideBar/TestLink.tsx +8 -3
  191. package/src/client/web/CreeveyView/SideBar/TestStatusIcon.tsx +18 -10
  192. package/src/client/web/CreeveyView/SideBar/TestsStatus.tsx +7 -10
  193. package/src/client/web/CreeveyView/SideBar/Toggle.tsx +1 -2
  194. package/src/client/web/KeyboardEventsContext.tsx +3 -4
  195. package/src/client/web/index.html +1 -1
  196. package/src/client/web/index.tsx +4 -3
  197. package/src/creevey.ts +25 -8
  198. package/src/index.ts +4 -2
  199. package/src/server/config.ts +12 -8
  200. package/src/server/docker.ts +58 -44
  201. package/src/server/index.ts +57 -18
  202. package/src/server/master/master.ts +3 -6
  203. package/src/server/master/pool.ts +25 -9
  204. package/src/server/master/runner.ts +4 -2
  205. package/src/server/master/server.ts +1 -0
  206. package/src/server/master/{index.ts → start.ts} +13 -11
  207. package/src/server/messages.ts +11 -75
  208. package/src/server/playwright/docker-file.ts +21 -0
  209. package/src/server/playwright/docker.ts +41 -0
  210. package/src/server/playwright/internal.ts +387 -0
  211. package/src/server/playwright/webdriver.ts +126 -0
  212. package/src/server/{storybook/providers → providers}/browser.ts +7 -8
  213. package/src/server/{storybook/providers → providers}/hybrid.ts +19 -19
  214. package/src/server/{worker/reporter.ts → reporter.ts} +40 -72
  215. package/src/server/selenium/internal.ts +785 -0
  216. package/src/server/selenium/selenoid.ts +12 -17
  217. package/src/server/selenium/webdriver.ts +136 -0
  218. package/src/server/stories.ts +18 -11
  219. package/src/server/telemetry.ts +2 -2
  220. package/src/server/utils.ts +9 -9
  221. package/src/server/webdriver.ts +127 -0
  222. package/src/server/worker/chai-image.ts +21 -133
  223. package/src/server/worker/match-image.ts +303 -0
  224. package/src/server/worker/start.ts +303 -0
  225. package/src/types.ts +162 -60
  226. package/dist/client/web/202.js +0 -1
  227. package/dist/client/web/270.js +0 -43
  228. package/dist/client/web/752.js +0 -1
  229. package/dist/client/web/main.js +0 -79
  230. package/dist/client/web/main.js.LICENSE.txt +0 -34
  231. package/dist/server/master/index.d.ts +0 -3
  232. package/dist/server/master/index.js.map +0 -1
  233. package/dist/server/selenium/browser.d.ts +0 -19
  234. package/dist/server/selenium/browser.js +0 -640
  235. package/dist/server/selenium/browser.js.map +0 -1
  236. package/dist/server/selenium/index.d.ts +0 -2
  237. package/dist/server/selenium/index.js +0 -19
  238. package/dist/server/selenium/index.js.map +0 -1
  239. package/dist/server/storybook/providers/browser.d.ts +0 -2
  240. package/dist/server/storybook/providers/browser.js.map +0 -1
  241. package/dist/server/storybook/providers/hybrid.d.ts +0 -2
  242. package/dist/server/storybook/providers/hybrid.js.map +0 -1
  243. package/dist/server/worker/helpers.d.ts +0 -8
  244. package/dist/server/worker/helpers.js +0 -57
  245. package/dist/server/worker/helpers.js.map +0 -1
  246. package/dist/server/worker/index.d.ts +0 -1
  247. package/dist/server/worker/index.js +0 -6
  248. package/dist/server/worker/index.js.map +0 -1
  249. package/dist/server/worker/reporter.d.ts +0 -8
  250. package/dist/server/worker/reporter.js.map +0 -1
  251. package/dist/server/worker/worker.d.ts +0 -4
  252. package/dist/server/worker/worker.js +0 -212
  253. package/dist/server/worker/worker.js.map +0 -1
  254. package/src/server/selenium/browser.ts +0 -840
  255. package/src/server/selenium/index.ts +0 -2
  256. package/src/server/worker/helpers.ts +0 -61
  257. package/src/server/worker/index.ts +0 -1
  258. package/src/server/worker/worker.ts +0 -240
  259. package/types/mocha.d.ts +0 -20
@@ -0,0 +1,606 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.InternalBrowser = void 0;
7
+ const core_events_1 = require("@storybook/core-events");
8
+ const chalk_1 = __importDefault(require("chalk"));
9
+ const http_1 = __importDefault(require("http"));
10
+ const https_1 = __importDefault(require("https"));
11
+ const loglevel_1 = __importDefault(require("loglevel"));
12
+ const loglevel_plugin_prefix_1 = __importDefault(require("loglevel-plugin-prefix"));
13
+ const pngjs_1 = require("pngjs");
14
+ const selenium_webdriver_1 = require("selenium-webdriver");
15
+ // import { Options as IeOptions } from 'selenium-webdriver/ie';
16
+ // import { Options as EdgeOptions } from 'selenium-webdriver/edge';
17
+ // import { Options as ChromeOptions } from 'selenium-webdriver/chrome';
18
+ // import { Options as SafariOptions } from 'selenium-webdriver/safari';
19
+ // import { Options as FirefoxOptions } from 'selenium-webdriver/firefox';
20
+ const capabilities_js_1 = require("selenium-webdriver/lib/capabilities.js");
21
+ const types_js_1 = require("../../types.js");
22
+ const logger_js_1 = require("../logger.js");
23
+ const messages_js_1 = require("../messages.js");
24
+ const utils_js_1 = require("../utils.js");
25
+ const webdriver_js_1 = require("../webdriver.js");
26
+ // type UnPromise<P> = P extends Promise<infer T> ? T : never;
27
+ // let context: UnPromise<ReturnType<typeof BrowsingContext>> | null = null;
28
+ function getSessionData(grid, sessionId = '') {
29
+ const gridUrl = new URL(grid);
30
+ gridUrl.pathname = `/host/${sessionId}`;
31
+ return new Promise((resolve, reject) => (gridUrl.protocol == 'https:' ? https_1.default : http_1.default).get(gridUrl.toString(), (res) => {
32
+ if (res.statusCode !== 200) {
33
+ reject(new Error(`Couldn't get session data for ${sessionId}. Status code: ${res.statusCode ?? 'Unknown'}`));
34
+ return;
35
+ }
36
+ let data = '';
37
+ res.setEncoding('utf-8');
38
+ res.on('data', (chunk) => (data += chunk));
39
+ res.on('end', () => {
40
+ try {
41
+ resolve(JSON.parse(data));
42
+ }
43
+ catch (error) {
44
+ reject(new Error(`Couldn't get session data for ${sessionId}. ${error instanceof Error ? (error.stack ?? error.message) : error}`));
45
+ }
46
+ });
47
+ }));
48
+ }
49
+ async function openUrlAndWaitForPageSource(browser, url, predicate) {
50
+ let source = '';
51
+ await browser.get(url);
52
+ do {
53
+ try {
54
+ source = await browser.getPageSource();
55
+ }
56
+ catch {
57
+ // NOTE: Firefox can raise exception "curContainer.frame.document.documentElement is null"
58
+ }
59
+ } while (predicate(source));
60
+ return source;
61
+ }
62
+ async function buildWebdriver(browserName, gridUrl, config, options) {
63
+ const browserConfig = config.browsers[browserName];
64
+ const { _storybookGlobals, /*customizeBuilder,*/ ...userCapabilities } = browserConfig;
65
+ const url = new URL(gridUrl);
66
+ url.username = url.username ? '********' : '';
67
+ url.password = url.password ? '********' : '';
68
+ logger_js_1.logger.debug(`(${browserName}) Connecting to Selenium ${chalk_1.default.magenta(url.toString())}`);
69
+ // TODO Define some capabilities explicitly and define typings
70
+ const capabilities = new selenium_webdriver_1.Capabilities({ ...userCapabilities, pageLoadStrategy: capabilities_js_1.PageLoadStrategy.EAGER });
71
+ const prefs = new selenium_webdriver_1.logging.Preferences();
72
+ if (options.trace) {
73
+ for (const type of Object.values(selenium_webdriver_1.logging.Type)) {
74
+ prefs.setLevel(type, selenium_webdriver_1.logging.Level.ALL);
75
+ }
76
+ }
77
+ // TODO Fetch selenium grid capabilities
78
+ // TODO Validate browsers, versions, and platform
79
+ // TODO Use `customizeBuilder`
80
+ let browser;
81
+ try {
82
+ // const ie = new IeOptions();
83
+ // const edge = new EdgeOptions();
84
+ // const chrome = new ChromeOptions();
85
+ // const safari = new SafariOptions();
86
+ // const firefox = new FirefoxOptions();
87
+ // edge.enableBidi();
88
+ // chrome.enableBidi();
89
+ // firefox.enableBidi();
90
+ browser = await new selenium_webdriver_1.Builder()
91
+ // .setIeOptions(ie)
92
+ // .setEdgeOptions(edge)
93
+ // .setChromeOptions(chrome)
94
+ // .setSafariOptions(safari)
95
+ // .setFirefoxOptions(firefox)
96
+ .usingServer(gridUrl)
97
+ .withCapabilities(capabilities)
98
+ .setLoggingPrefs(prefs) // NOTE: Should go last
99
+ .build();
100
+ // const id = await browser.getWindowHandle();
101
+ // context = await BrowsingContext(browser, { browsingContextId: id });
102
+ }
103
+ catch (error) {
104
+ logger_js_1.logger.error(`(${browserName}) Failed to start browser:`, error);
105
+ return null;
106
+ }
107
+ return browser;
108
+ }
109
+ class InternalBrowser {
110
+ #isShuttingDown = false;
111
+ #browser;
112
+ #serverHost = null;
113
+ #serverPort;
114
+ #logger;
115
+ #unsubscribe = types_js_1.noop;
116
+ #keepAliveInterval = null;
117
+ constructor(browser, port, logger) {
118
+ this.#browser = browser;
119
+ this.#serverPort = port;
120
+ this.#logger = logger;
121
+ this.#unsubscribe = (0, messages_js_1.subscribeOn)('shutdown', () => {
122
+ void this.closeBrowser();
123
+ });
124
+ }
125
+ get browser() {
126
+ return this.#browser;
127
+ }
128
+ async closeBrowser() {
129
+ if (this.#isShuttingDown)
130
+ return;
131
+ this.#isShuttingDown = true;
132
+ this.#unsubscribe();
133
+ if (this.#keepAliveInterval !== null)
134
+ clearInterval(this.#keepAliveInterval);
135
+ try {
136
+ await this.#browser.quit();
137
+ }
138
+ catch (_) {
139
+ /* noop */
140
+ }
141
+ }
142
+ async takeScreenshot(captureElement, ignoreElements) {
143
+ let screenshot;
144
+ const ignoreStyles = await this.insertIgnoreStyles(ignoreElements);
145
+ if (this.#logger.getLevel() <= loglevel_1.default.levels.DEBUG) {
146
+ const { innerWidth, innerHeight } = await this.#browser.executeScript(function () {
147
+ return {
148
+ innerWidth: window.innerWidth,
149
+ innerHeight: window.innerHeight,
150
+ };
151
+ });
152
+ this.#logger.debug(`Viewport size is: ${innerWidth}x${innerHeight}`);
153
+ }
154
+ try {
155
+ if (!captureElement) {
156
+ this.#logger.debug('Capturing viewport screenshot');
157
+ screenshot = await this.#browser.takeScreenshot();
158
+ this.#logger.debug('Viewport screenshot is captured');
159
+ }
160
+ else {
161
+ this.#logger.debug(`Checking is element ${chalk_1.default.cyan(captureElement)} fit into viewport`);
162
+ const rects = await this.#browser.executeScript(function (selector) {
163
+ window.scrollTo(0, 0); // TODO Maybe we should remove same code from `resetMousePosition`
164
+ // eslint-disable-next-line no-var
165
+ var element = document.querySelector(selector);
166
+ if (!element)
167
+ return;
168
+ // eslint-disable-next-line no-var
169
+ var elementRect = element.getBoundingClientRect();
170
+ return {
171
+ elementRect: {
172
+ top: elementRect.top,
173
+ left: elementRect.left,
174
+ width: elementRect.width,
175
+ height: elementRect.height,
176
+ },
177
+ // NOTE page_Offset is used only for IE9-11
178
+ windowRect: {
179
+ // eslint-disable-next-line @typescript-eslint/no-deprecated
180
+ top: Math.round(window.scrollY || window.pageYOffset),
181
+ // eslint-disable-next-line @typescript-eslint/no-deprecated
182
+ left: Math.round(window.scrollX || window.pageXOffset),
183
+ width: window.innerWidth,
184
+ height: window.innerHeight,
185
+ },
186
+ };
187
+ }, captureElement);
188
+ const { elementRect, windowRect } = rects ?? {};
189
+ if (!elementRect || !windowRect)
190
+ throw new Error(`Couldn't find element with selector: '${captureElement}'`);
191
+ const isFitIntoViewport = elementRect.width + elementRect.left <= windowRect.width &&
192
+ elementRect.height + elementRect.top <= windowRect.height;
193
+ if (isFitIntoViewport) {
194
+ this.#logger.debug(`Capturing ${chalk_1.default.cyan(captureElement)} with size: ${elementRect.width}x${elementRect.height}`);
195
+ }
196
+ else
197
+ this.#logger.debug(`Capturing composite screenshot image of ${chalk_1.default.cyan(captureElement)} with size: ${elementRect.width}x${elementRect.height}`);
198
+ // const element = await browser.findElement(By.css(captureElement));
199
+ // screenshot = isFitIntoViewport
200
+ // ? context
201
+ // ? await context.captureElementScreenshot(await element.getId())
202
+ // : await browser.findElement(By.css(captureElement)).takeScreenshot()
203
+ // : // TODO pointer-events: none, need to research
204
+ // await takeCompositeScreenshot(browser, windowRect, elementRect);
205
+ screenshot = isFitIntoViewport
206
+ ? await this.#browser.findElement(selenium_webdriver_1.By.css(captureElement)).takeScreenshot()
207
+ : // TODO pointer-events: none, need to research
208
+ await this.takeCompositeScreenshot(windowRect, elementRect);
209
+ this.#logger.debug(`${chalk_1.default.cyan(captureElement)} is captured`);
210
+ }
211
+ }
212
+ finally {
213
+ await this.removeIgnoreStyles(ignoreStyles);
214
+ }
215
+ return typeof screenshot === 'string' ? Buffer.from(screenshot, 'base64') : screenshot;
216
+ }
217
+ waitForComplete(callback) {
218
+ void this.#browser
219
+ .executeAsyncScript(function (callback) {
220
+ void window.__CREEVEY_HAS_PLAY_COMPLETED_YET__().then(callback);
221
+ })
222
+ .then(callback);
223
+ }
224
+ async selectStory(id, waitForReady = false) {
225
+ // NOTE: Global variables might be reset after hot reload. I think it's workaround, maybe we need better solution
226
+ await this.updateBrowserGlobalVariables();
227
+ await this.resetMousePosition();
228
+ this.#logger.debug(`Triggering 'SetCurrentStory' event with storyId ${chalk_1.default.magenta(id)}`);
229
+ const result = await this.#browser.executeAsyncScript(function (storyId, shouldWaitForReady, callback) {
230
+ if (typeof window.__CREEVEY_SELECT_STORY__ == 'undefined') {
231
+ callback([
232
+ "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.",
233
+ ]);
234
+ return;
235
+ }
236
+ void window.__CREEVEY_SELECT_STORY__(storyId, shouldWaitForReady).then(callback);
237
+ }, id, waitForReady);
238
+ const [errorMessage, isCaptureCalled = false] = result ?? [];
239
+ if (errorMessage)
240
+ throw new Error(errorMessage);
241
+ return isCaptureCalled;
242
+ }
243
+ async updateStoryArgs(story, updatedArgs) {
244
+ await this.#browser.executeAsyncScript(function (storyId, updatedArgs, UPDATE_STORY_ARGS, STORY_RENDERED, callback) {
245
+ window.__STORYBOOK_ADDONS_CHANNEL__.once(STORY_RENDERED, callback);
246
+ window.__STORYBOOK_ADDONS_CHANNEL__.emit(UPDATE_STORY_ARGS, {
247
+ storyId,
248
+ updatedArgs,
249
+ });
250
+ }, story.id, updatedArgs, core_events_1.UPDATE_STORY_ARGS, core_events_1.STORY_RENDERED);
251
+ }
252
+ async loadStoriesFromBrowser() {
253
+ const stories = await this.#browser.executeAsyncScript(function (callback) {
254
+ void window.__CREEVEY_GET_STORIES__().then(callback);
255
+ });
256
+ if (!stories)
257
+ throw new Error("Can't get stories, it seems creevey or storybook API isn't available");
258
+ return stories;
259
+ }
260
+ static async getBrowser(browserName, gridUrl, config, options) {
261
+ const browserConfig = config.browsers[browserName];
262
+ const { storybookUrl: address = config.storybookUrl, limit, viewport, _storybookGlobals } = browserConfig;
263
+ void limit;
264
+ const browser = await buildWebdriver(browserName, gridUrl, config, options);
265
+ if (!browser)
266
+ return null;
267
+ const internalBrowser = new InternalBrowser(browser, options.port, logger_js_1.logger);
268
+ try {
269
+ if (utils_js_1.isShuttingDown.current)
270
+ return null;
271
+ const done = await internalBrowser.init({
272
+ browserName,
273
+ gridUrl,
274
+ viewport,
275
+ storybookUrl: address,
276
+ storybookGlobals: _storybookGlobals,
277
+ resolveStorybookUrl: config.resolveStorybookUrl,
278
+ });
279
+ return done ? internalBrowser : null;
280
+ }
281
+ catch (originalError) {
282
+ void internalBrowser.closeBrowser();
283
+ const message = originalError instanceof Error ? originalError.message : originalError;
284
+ const error = new Error(`Can't load storybook root page by URL ${await browser.getCurrentUrl()}: ${message}`);
285
+ if (originalError instanceof Error)
286
+ error.stack = originalError.stack;
287
+ logger_js_1.logger.error(error);
288
+ return null;
289
+ }
290
+ }
291
+ async init({ browserName, gridUrl, viewport, storybookUrl, storybookGlobals, resolveStorybookUrl, }) {
292
+ const sessionId = (await this.#browser.getSession()).getId();
293
+ let browserHost = '';
294
+ try {
295
+ const { Name } = await getSessionData(gridUrl, sessionId);
296
+ if (typeof Name == 'string')
297
+ browserHost = Name;
298
+ }
299
+ catch {
300
+ /* noop */
301
+ }
302
+ this.#logger = loglevel_1.default.getLogger(sessionId);
303
+ loglevel_plugin_prefix_1.default.apply(this.#logger, {
304
+ format(level) {
305
+ const levelColor = logger_js_1.colors[level.toUpperCase()];
306
+ return `[${browserName}:${chalk_1.default.gray(sessionId)}] ${levelColor(level)} =>`;
307
+ },
308
+ });
309
+ this.#logger.debug(`Connected successful with ${chalk_1.default.green(browserHost)}`);
310
+ return await (0, utils_js_1.runSequence)([
311
+ () => this.#browser.manage().setTimeouts({ pageLoad: 10000, script: 60000 }),
312
+ () => this.openStorybookPage(storybookUrl, resolveStorybookUrl),
313
+ () => this.waitForStorybook(),
314
+ () => this.updateStorybookGlobals(storybookGlobals),
315
+ () => this.resolveCreeveyHost(),
316
+ () => this.updateBrowserGlobalVariables(),
317
+ // NOTE: Selenium draws automation toolbar with some delay after webdriver initialization
318
+ // NOTE: So if we resize window right after getting webdriver instance we might get situation
319
+ // NOTE: When the toolbar appears after resize and final viewport size become smaller than we set
320
+ () => this.resizeViewport(viewport),
321
+ () => {
322
+ this.keepAlive();
323
+ },
324
+ ], () => !this.#isShuttingDown);
325
+ }
326
+ async openStorybookPage(storybookUrl, resolver) {
327
+ if (!webdriver_js_1.LOCALHOST_REGEXP.test(storybookUrl)) {
328
+ return this.#browser.get((0, webdriver_js_1.appendIframePath)(storybookUrl));
329
+ }
330
+ try {
331
+ if (resolver) {
332
+ this.#logger.debug('Resolving storybook url with custom resolver');
333
+ const resolvedUrl = await resolver();
334
+ this.#logger.debug(`Resolver storybook url ${resolvedUrl}`);
335
+ await this.#browser.get((0, webdriver_js_1.appendIframePath)(resolvedUrl));
336
+ }
337
+ else {
338
+ // NOTE: getUrlChecker already calls `browser.get` so we don't need another one
339
+ await (0, webdriver_js_1.resolveStorybookUrl)((0, webdriver_js_1.appendIframePath)(storybookUrl), (url) => this.checkUrl(url), this.#logger);
340
+ }
341
+ }
342
+ catch (error) {
343
+ this.#logger.error('Failed to resolve storybook URL', error instanceof Error ? error.message : '');
344
+ throw error;
345
+ }
346
+ }
347
+ async checkUrl(url) {
348
+ try {
349
+ // NOTE: Before trying a new url, reset the current one
350
+ this.#logger.debug(`Opening ${chalk_1.default.magenta('about:blank')} page`);
351
+ await openUrlAndWaitForPageSource(this.#browser, 'about:blank', (source) => !source.includes('<body></body>'));
352
+ this.#logger.debug(`Opening ${chalk_1.default.magenta(url)} and checking the page source`);
353
+ const source = await openUrlAndWaitForPageSource(this.#browser, url,
354
+ // NOTE: IE11 can return only `head` without body
355
+ (source) => source.length == 0 || !/<body([^>]*>).+<\/body>/s.test(source));
356
+ // NOTE: This is the most optimal way to check if we in storybook or not
357
+ // We don't use any page load strategies except `NONE`
358
+ // because other add significant delay and some of them don't work in earlier chrome versions
359
+ // Browsers always load page successful even it's failed
360
+ // So we just check `root` element
361
+ this.#logger.debug(`Checking ${chalk_1.default.cyan(`#${webdriver_js_1.storybookRootID}`)} existence on ${chalk_1.default.magenta(url)}`);
362
+ return source.includes(`id="${webdriver_js_1.storybookRootID}"`);
363
+ }
364
+ catch {
365
+ return false;
366
+ }
367
+ }
368
+ async waitForStorybook() {
369
+ this.#logger.debug('Waiting for `setStories` event to make sure that storybook is initiated');
370
+ const isTimeout = await Promise.race([
371
+ new Promise((resolve) => {
372
+ setTimeout(() => {
373
+ resolve(true);
374
+ }, 60000);
375
+ }),
376
+ (async () => {
377
+ let wait = true;
378
+ do {
379
+ try {
380
+ // TODO Research a different way to ensure storybook is initiated
381
+ wait = await this.#browser.executeScript(function (SET_GLOBALS) {
382
+ // TODO Maybe use
383
+ // import { global } from '@storybook/global';
384
+ // global.IS_STORYBOOK
385
+ if (typeof window.__STORYBOOK_ADDONS_CHANNEL__ == 'undefined')
386
+ return true;
387
+ if (window.__STORYBOOK_ADDONS_CHANNEL__.last(SET_GLOBALS) == undefined)
388
+ return true;
389
+ return false;
390
+ }, core_events_1.SET_GLOBALS);
391
+ }
392
+ catch (e) {
393
+ this.#logger.debug('An error has been caught during the script:', e);
394
+ }
395
+ } while (wait);
396
+ return false;
397
+ })(),
398
+ ]);
399
+ // TODO Change the message to describe a reason why it might happen
400
+ if (isTimeout)
401
+ throw new Error('Failed to wait `setStories` event');
402
+ }
403
+ async updateStorybookGlobals(globals) {
404
+ if (!globals)
405
+ return;
406
+ this.#logger.debug('Applying storybook globals');
407
+ await this.#browser.executeScript(function (globals) {
408
+ window.__CREEVEY_UPDATE_GLOBALS__(globals);
409
+ }, globals);
410
+ }
411
+ async resolveCreeveyHost() {
412
+ const addresses = (0, webdriver_js_1.getAddresses)();
413
+ this.#serverHost = await this.#browser.executeAsyncScript(function (hosts, port, callback) {
414
+ void Promise.all(hosts.map(function (host) {
415
+ return Promise.race([
416
+ // eslint-disable-next-line @typescript-eslint/restrict-plus-operands
417
+ fetch('http://' + host + ':' + port + '/ping').then(function (response) {
418
+ return response.text();
419
+ }),
420
+ new Promise((_resolve, reject) => {
421
+ setTimeout(reject, 5000);
422
+ }),
423
+ ])
424
+ .then(function (pong) {
425
+ return pong == 'pong' ? host : null;
426
+ })
427
+ .catch(function () {
428
+ return null;
429
+ });
430
+ })).then(function (hosts) {
431
+ callback(hosts.find(function (host) {
432
+ return host != null;
433
+ }));
434
+ });
435
+ }, addresses, this.#serverPort);
436
+ if (this.#serverHost == null)
437
+ throw new Error("Can't reach creevey server from a browser");
438
+ }
439
+ async updateBrowserGlobalVariables() {
440
+ await this.#browser.executeScript(function (workerId, creeveyHost, creeveyPort) {
441
+ window.__CREEVEY_WORKER_ID__ = workerId;
442
+ window.__CREEVEY_SERVER_HOST__ = creeveyHost;
443
+ window.__CREEVEY_SERVER_PORT__ = creeveyPort;
444
+ }, process.pid, this.#serverHost, this.#serverPort);
445
+ }
446
+ async resizeViewport(viewport) {
447
+ if (!viewport)
448
+ return;
449
+ const windowRect = await this.#browser.manage().window().getRect();
450
+ const { innerWidth, innerHeight } = await this.#browser.executeScript(function () {
451
+ return {
452
+ innerWidth: window.innerWidth,
453
+ innerHeight: window.innerHeight,
454
+ };
455
+ });
456
+ this.#logger.debug(`Resizing viewport from ${innerWidth}x${innerHeight} to ${viewport.width}x${viewport.height}`);
457
+ const dWidth = windowRect.width - innerWidth;
458
+ const dHeight = windowRect.height - innerHeight;
459
+ await this.#browser
460
+ .manage()
461
+ .window()
462
+ .setRect({
463
+ width: viewport.width + dWidth,
464
+ height: viewport.height + dHeight,
465
+ });
466
+ }
467
+ async resetMousePosition() {
468
+ this.#logger.debug('Resetting mouse position to the top-left corner');
469
+ const browserName = (await this.#browser.getCapabilities()).getBrowserName();
470
+ const [browserVersion] = (await this.#browser.getCapabilities()).getBrowserVersion()?.split('.') ??
471
+ (await this.#browser.getCapabilities()).get('version')?.split('.') ??
472
+ [];
473
+ // NOTE Reset mouse position to support keweb selenium grid browser versions
474
+ if (browserName == 'chrome' && browserVersion == '70') {
475
+ const { top, left, width, height } = await this.#browser.executeScript(function () {
476
+ const bodyRect = document.body.getBoundingClientRect();
477
+ return {
478
+ top: bodyRect.top,
479
+ left: bodyRect.left,
480
+ width: bodyRect.width,
481
+ height: bodyRect.height,
482
+ };
483
+ });
484
+ // NOTE Bridge mode doesn't support `Origin.VIEWPORT`, move mouse relative
485
+ await this.#browser
486
+ .actions({ bridge: true })
487
+ .move({
488
+ origin: this.#browser.findElement(selenium_webdriver_1.By.css('body')),
489
+ x: Math.ceil((-1 * width) / 2) - left,
490
+ y: Math.ceil((-1 * height) / 2) - top,
491
+ })
492
+ .perform();
493
+ }
494
+ else if (browserName == 'firefox' && browserVersion == '61') {
495
+ // NOTE Firefox for some reason moving by 0 x 0 move cursor in bottom left corner :sad:
496
+ await this.#browser.actions().move({ origin: selenium_webdriver_1.Origin.VIEWPORT, x: 0, y: 1 }).perform();
497
+ }
498
+ else {
499
+ // NOTE IE don't emit move events until force window focus or connect by RDP on virtual machine
500
+ await this.#browser.actions().move({ origin: selenium_webdriver_1.Origin.VIEWPORT, x: 0, y: 0 }).perform();
501
+ }
502
+ }
503
+ async insertIgnoreStyles(ignoreElements) {
504
+ const ignoreSelectors = Array.prototype.concat(ignoreElements).filter(Boolean);
505
+ if (!ignoreSelectors.length)
506
+ return null;
507
+ this.#logger.debug('Hiding ignored elements before capturing');
508
+ return await this.#browser.executeScript(function (ignoreSelectors) {
509
+ return window.__CREEVEY_INSERT_IGNORE_STYLES__(ignoreSelectors);
510
+ }, ignoreSelectors);
511
+ }
512
+ async takeCompositeScreenshot(windowRect, elementRect) {
513
+ const screens = [];
514
+ const isScreenshotWithoutScrollBar = !(await this.hasScrollBar());
515
+ const scrollBarWidth = await this.getScrollBarWidth();
516
+ // NOTE Sometimes viewport has been scrolled somewhere
517
+ const normalizedElementRect = {
518
+ left: elementRect.left - windowRect.left,
519
+ right: elementRect.left + elementRect.width - windowRect.left,
520
+ top: elementRect.top - windowRect.top,
521
+ bottom: elementRect.top + elementRect.height - windowRect.top,
522
+ };
523
+ const isFitHorizontally = windowRect.width >= elementRect.width + normalizedElementRect.left;
524
+ const isFitVertically = windowRect.height >= elementRect.height + normalizedElementRect.top;
525
+ const viewportWidth = windowRect.width - (isFitVertically ? 0 : scrollBarWidth);
526
+ const viewportHeight = windowRect.height - (isFitHorizontally ? 0 : scrollBarWidth);
527
+ const cols = Math.ceil(elementRect.width / viewportWidth);
528
+ const rows = Math.ceil(elementRect.height / viewportHeight);
529
+ const xOffset = Math.round(isFitHorizontally ? normalizedElementRect.left : Math.max(0, cols * viewportWidth - elementRect.width));
530
+ const yOffset = Math.round(isFitVertically ? normalizedElementRect.top : Math.max(0, rows * viewportHeight - elementRect.height));
531
+ for (let row = 0; row < rows; row += 1) {
532
+ for (let col = 0; col < cols; col += 1) {
533
+ const dx = Math.min(viewportWidth * col + normalizedElementRect.left, Math.max(0, normalizedElementRect.right - viewportWidth));
534
+ const dy = Math.min(viewportHeight * row + normalizedElementRect.top, Math.max(0, normalizedElementRect.bottom - viewportHeight));
535
+ await this.#browser.executeScript(function (x, y) {
536
+ window.scrollTo(x, y);
537
+ }, dx, dy);
538
+ screens.push(await this.#browser.takeScreenshot());
539
+ }
540
+ }
541
+ const images = screens.map((s) => Buffer.from(s, 'base64')).map((b) => pngjs_1.PNG.sync.read(b));
542
+ const compositeImage = new pngjs_1.PNG({ width: Math.round(elementRect.width), height: Math.round(elementRect.height) });
543
+ for (let y = 0; y < compositeImage.height; y += 1) {
544
+ for (let x = 0; x < compositeImage.width; x += 1) {
545
+ const col = Math.floor(x / viewportWidth);
546
+ const row = Math.floor(y / viewportHeight);
547
+ const isLastCol = cols - col == 1;
548
+ const isLastRow = rows - row == 1;
549
+ const scrollOffset = isFitVertically || isScreenshotWithoutScrollBar ? 0 : scrollBarWidth;
550
+ const i = (y * compositeImage.width + x) * 4;
551
+ const j =
552
+ // NOTE compositeImage(x, y) => image(x, y)
553
+ ((y % viewportHeight) * (viewportWidth + scrollOffset) + (x % viewportWidth)) * 4 +
554
+ // NOTE Offset for last row/col image
555
+ (isLastRow ? yOffset * (viewportWidth + scrollOffset) * 4 : 0) +
556
+ (isLastCol ? xOffset * 4 : 0);
557
+ const image = images[row * cols + col];
558
+ compositeImage.data[i + 0] = image.data[j + 0];
559
+ compositeImage.data[i + 1] = image.data[j + 1];
560
+ compositeImage.data[i + 2] = image.data[j + 2];
561
+ compositeImage.data[i + 3] = image.data[j + 3];
562
+ }
563
+ }
564
+ return compositeImage.data;
565
+ }
566
+ async removeIgnoreStyles(ignoreStyles) {
567
+ if (ignoreStyles) {
568
+ this.#logger.debug('Revert hiding ignored elements');
569
+ await this.#browser.executeScript(function (ignoreStyles) {
570
+ window.__CREEVEY_REMOVE_IGNORE_STYLES__(ignoreStyles);
571
+ }, ignoreStyles);
572
+ }
573
+ }
574
+ // NOTE Firefox and Safari take viewport screenshot without scrollbars
575
+ async hasScrollBar() {
576
+ const browserName = (await this.#browser.getCapabilities()).getBrowserName();
577
+ const [browserVersion] = (await this.#browser.getCapabilities()).getBrowserVersion()?.split('.') ?? [];
578
+ return (browserName != 'Safari' &&
579
+ // NOTE This need to work with keweb selenium grid
580
+ !(browserName == 'firefox' && browserVersion == '61'));
581
+ }
582
+ async getScrollBarWidth() {
583
+ const scrollBarWidth = await this.#browser.executeScript(function () {
584
+ // eslint-disable-next-line no-var
585
+ var div = document.createElement('div');
586
+ div.innerHTML = 'a'; // NOTE: In IE clientWidth is 0 if this div is empty.
587
+ div.style.overflowY = 'scroll';
588
+ document.body.appendChild(div);
589
+ // eslint-disable-next-line no-var
590
+ var widthDiff = div.offsetWidth - div.clientWidth;
591
+ document.body.removeChild(div);
592
+ return widthDiff;
593
+ });
594
+ return scrollBarWidth;
595
+ }
596
+ keepAlive() {
597
+ this.#keepAliveInterval = setInterval(() => {
598
+ // NOTE Simple way to keep session alive
599
+ void this.#browser.getCurrentUrl().then((url) => {
600
+ logger_js_1.logger.debug('current url', chalk_1.default.magenta(url));
601
+ });
602
+ }, 10 * 1000);
603
+ }
604
+ }
605
+ exports.InternalBrowser = InternalBrowser;
606
+ //# sourceMappingURL=internal.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"internal.js","sourceRoot":"","sources":["../../../src/server/selenium/internal.ts"],"names":[],"mappings":"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"}