@testim/testim-cli 3.252.0 → 3.254.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 (97) hide show
  1. package/OverrideTestDataBuilder.js +1 -1
  2. package/agent/routers/cliJsCode/index.js +4 -4
  3. package/agent/routers/cliJsCode/router.js +46 -42
  4. package/agent/routers/cliJsCode/service.js +18 -13
  5. package/agent/routers/codim/router.js +14 -17
  6. package/agent/routers/codim/router.test.js +15 -14
  7. package/agent/routers/codim/service.js +1 -1
  8. package/agent/routers/general/index.js +4 -8
  9. package/agent/routers/hybrid/registerRoutes.js +18 -18
  10. package/agent/routers/index.js +9 -8
  11. package/agent/routers/playground/router.js +12 -11
  12. package/agent/routers/playground/service.js +19 -18
  13. package/agent/routers/standalone-browser/registerRoutes.js +10 -10
  14. package/cdpTestRunner.js +4 -3
  15. package/chromiumInstaller.js +4 -5
  16. package/cli/onExit.js +2 -2
  17. package/cli.js +7 -6
  18. package/cliAgentMode.js +4 -5
  19. package/codim/codim-cli.js +11 -10
  20. package/codim/hybrid-utils.js +1 -1
  21. package/codim/measure-perf.js +9 -6
  22. package/codim/template.js/tests/examples/01-simple-text-validation.test.js +6 -6
  23. package/codim/template.js/tests/examples/02-using-locators.test.js +13 -15
  24. package/codim/template.js/tests/examples/03-using-hooks.test.js +17 -19
  25. package/codim/template.js/tests/examples/04-skip-and-only.test.js +16 -17
  26. package/codim/template.js/tests/examples/05-multiple-windows.test.js +16 -17
  27. package/codim/template.js/webpack.config.js +1 -1
  28. package/codim/template.ts/webpack.config.js +3 -3
  29. package/commons/AbortError.js +4 -4
  30. package/commons/chrome-launcher.js +6 -6
  31. package/commons/constants.js +2 -0
  32. package/commons/detectDebugger.js +4 -2
  33. package/commons/getSessionPlayerRequire.js +2 -20
  34. package/commons/initializeUserWithAuth.js +2 -2
  35. package/commons/lazyRequire.js +10 -9
  36. package/commons/logger.js +4 -4
  37. package/commons/performance-logger.js +14 -8
  38. package/commons/prepareRunnerAndTestimStartUtils.js +6 -7
  39. package/commons/socket/baseSocketServiceSocketIO.js +32 -34
  40. package/commons/socket/realDataService.js +6 -5
  41. package/commons/socket/realDataServiceSocketIO.js +4 -4
  42. package/commons/socket/remoteStepService.js +4 -3
  43. package/commons/socket/remoteStepServiceSocketIO.js +11 -12
  44. package/commons/socket/socketService.js +50 -52
  45. package/commons/socket/testResultServiceSocketIO.js +11 -11
  46. package/commons/testimDesiredCapabilitiesBuilder.js +44 -0
  47. package/commons/testimNgrok.js +2 -2
  48. package/commons/testimNgrok.test.js +1 -1
  49. package/commons/testimServicesApi.js +37 -21
  50. package/commons/xhr2.js +97 -100
  51. package/credentialsManager.js +17 -20
  52. package/errors.js +5 -0
  53. package/fixLocalBuild.js +2 -0
  54. package/npm-shrinkwrap.json +4455 -1576
  55. package/package.json +9 -7
  56. package/player/WebdriverioWebDriverApi.js +7 -2
  57. package/player/appiumTestPlayer.js +102 -0
  58. package/player/chromeLauncherTestPlayer.js +0 -1
  59. package/player/seleniumTestPlayer.js +3 -2
  60. package/player/services/frameLocator.js +2 -1
  61. package/player/services/mobileFrameLocatorMock.js +32 -0
  62. package/player/services/playbackTimeoutCalculator.js +1 -0
  63. package/player/services/portSelector.js +10 -8
  64. package/player/services/tabService.js +29 -0
  65. package/player/services/tabServiceMock.js +166 -0
  66. package/player/stepActions/navigationStepAction.js +11 -10
  67. package/player/stepActions/sleepStepAction.js +4 -5
  68. package/player/stepActions/stepAction.js +15 -1
  69. package/player/stepActions/textStepAction.js +4 -11
  70. package/player/utils/stepActionUtils.js +4 -2
  71. package/player/utils/windowUtils.js +139 -125
  72. package/player/webdriver.js +40 -26
  73. package/processHandler.js +3 -3
  74. package/processHandler.test.js +1 -1
  75. package/reports/consoleReporter.js +3 -2
  76. package/reports/debugReporter.js +41 -39
  77. package/reports/jsonReporter.js +53 -50
  78. package/reports/junitReporter.js +1 -2
  79. package/reports/reporter.js +135 -136
  80. package/runOptions.js +8 -7
  81. package/runner.js +13 -0
  82. package/runners/ParallelWorkerManager.js +2 -0
  83. package/runners/TestPlanRunner.js +142 -74
  84. package/runners/buildCodeTests.js +38 -37
  85. package/runners/runnerUtils.js +3 -3
  86. package/services/lambdatestService.js +3 -5
  87. package/stepPlayers/cliJsStepPlayback.js +22 -17
  88. package/testRunHandler.js +8 -0
  89. package/testRunStatus.js +458 -460
  90. package/{utils.js → utils/index.js} +25 -117
  91. package/utils/promiseUtils.js +78 -0
  92. package/utils/stringUtils.js +96 -0
  93. package/{utils.test.js → utils/utils.test.js} +2 -2
  94. package/workers/BaseWorker.js +29 -20
  95. package/workers/WorkerAppium.js +123 -0
  96. package/workers/WorkerExtensionSingleBrowser.js +4 -4
  97. package/workers/WorkerSelenium.js +5 -2
@@ -0,0 +1,123 @@
1
+ 'use strict';
2
+
3
+ const jsdom = require('jsdom');
4
+ const BaseWorker = require('./BaseWorker');
5
+ const logger = require('../commons/logger').getLogger('worker-appium');
6
+ const reporter = require('../reports/reporter');
7
+ const AppiumTestPlayer = require('../player/appiumTestPlayer');
8
+ const sessionPlayerInit = require('../commons/getSessionPlayerRequire');
9
+ const AppiumApi = require('../commons/getSessionPlayerRequire').AppiumApi;
10
+ const desiredCapabilitiesBuilder = require('../commons/testimDesiredCapabilitiesBuilder');
11
+
12
+ class WorkerAppium extends BaseWorker {
13
+ constructor(...args) {
14
+ super(...args);
15
+ this.getBrowserOnce = Promise.method(this.getBrowserOnce);
16
+ }
17
+
18
+ initPlayer(testRunHandler) {
19
+ return new AppiumTestPlayer(this.id,
20
+ testRunHandler.getRunParams(),
21
+ this.options.shouldMonitorPerformance,
22
+ testRunHandler.getAutomationMode(),
23
+ undefined,
24
+ testRunHandler.getRetryCount(),
25
+ testRunHandler.getPreviousTestResultId());
26
+ }
27
+
28
+ async getBrowserOnce(testRunHandler, customExtensionLocalLocation, appiumTestPlayer, gridInfo) {
29
+ reporter.onGetSession(this.id, this.testName, testRunHandler.getRunMode());
30
+ const { driver } = appiumTestPlayer;
31
+ const nativeApp = testRunHandler.getNativeAppData();
32
+ const projectType = this.options.projectData.type;
33
+ const capabilities = desiredCapabilitiesBuilder.buildAppiumOptions({ projectType, gridInfo, testRunConfig: this.testRunConfig, nativeApp });
34
+ try {
35
+ //we assume the application is installed on the device. (all headspin allocated devices)
36
+ const activeSession = await driver.remote(capabilities);
37
+ driver.activeSession = activeSession;
38
+ logger.info(`init new appium session testName: ${this.testName}`, { sessionId: activeSession.sessionId, testResultId: this.testResultId, nativeApp });
39
+ } catch (err) {
40
+ //TODO: catch app status validation
41
+ logger.error('failed to start application', { err });
42
+ throw err;
43
+ }
44
+ }
45
+
46
+ getServerAddressFromGrid(testRunHandler) {
47
+ const { _options: { gridData: { host, port, accessToken } } } = testRunHandler;
48
+ return `https://${host}:${port}/v0/${accessToken}/wd/hub`;
49
+ }
50
+
51
+ getDirectAddressConnection(activeSessionCapabilities) {
52
+ const { directConnectProtocol: protocol, directConnectHost: host, directConnectPort: port, directConnectPath: path } = activeSessionCapabilities;
53
+ if (protocol && host && port && path) {
54
+ return `${protocol}://${host}:${port}${path}`;
55
+ }
56
+ return undefined;
57
+ }
58
+
59
+ async runTestOnce(testRunHandler, appiumTestPlayer) {
60
+ const { driver, sessionPlayer } = appiumTestPlayer;
61
+ const version = sessionPlayerInit.manifestVersion || 'runner';
62
+
63
+ reporter.onWaitToTestComplete(this.id, this.isCodeMode);
64
+
65
+ sessionPlayer.playbackManager.executionId = testRunHandler.getExecutionId();
66
+ sessionPlayer.playbackManager.executionName = testRunHandler.getExecutionName();
67
+
68
+ const serverAddress = this.getDirectAddressConnection(driver.activeSession.capabilities) || this.getServerAddressFromGrid(testRunHandler);
69
+ const DOMParser = new (jsdom.JSDOM)('').window.DOMParser;
70
+ sessionPlayer.playbackManager.appiumApi = new AppiumApi(serverAddress, driver.activeSession.sessionId, DOMParser);
71
+
72
+
73
+ if (sessionPlayerInit.localAssetService) {
74
+ sessionPlayerInit.localAssetService.initialize({ serverUrl: this.options.localRCASaver });
75
+ }
76
+ async function runAppiumTest() {
77
+ try {
78
+ const INCOGNITO = false;
79
+ const testResult = await (new Promise((resolve, reject) =>
80
+ // eslint-disable-next-line no-promise-executor-return
81
+ sessionPlayer.playByTestId(
82
+ this.testId,
83
+ this.executionId,
84
+ this.testResultId,
85
+ this.baseUrl,
86
+ this.userData,
87
+ version,
88
+ resolve,
89
+ false,
90
+ this.overrideTestConfigId,
91
+ this.branch,
92
+ INCOGNITO,
93
+ testRunHandler.getRemoteRunId(),
94
+ undefined,
95
+ undefined,
96
+ undefined,
97
+ )));
98
+ if (sessionPlayerInit.localAssetService) {
99
+ await sessionPlayerInit.localAssetService.drain();
100
+ }
101
+ testResult.stepsResults = null;
102
+ testResult.resultId = this.testResultId;
103
+ const resultWithStats = { ...testResult, ...testRunHandler.seleniumPerfStats.getStats() };
104
+ return resultWithStats;
105
+ } catch (err) {
106
+ //TODO: add test timeout and handle Timeout Error TBD
107
+ // if (err instanceof TimeoutError && sessionPlayer.stopPlayingOnTestTimeout) {
108
+ // sessionPlayer.stopPlayingOnTestTimeout();
109
+ // }
110
+ logger.error('error while running appium tests', { err });
111
+ throw err;
112
+ }
113
+ }
114
+ try {
115
+ await super.runTestOnce(testRunHandler, appiumTestPlayer);
116
+ return await runAppiumTest.call(this);
117
+ } catch (err) {
118
+ logger.error('failed to run test once', { err });
119
+ throw err;
120
+ }
121
+ }
122
+ }
123
+ module.exports = WorkerAppium;
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- const Bluebird = require('bluebird');
3
+ const { delay } = require('../utils');
4
4
  const { releasePlayer } = require('./workerUtils');
5
5
  const WorkerExtension = require('./WorkerExtension');
6
6
  const perf = require('../commons/performance-logger');
@@ -14,7 +14,7 @@ class WorkerExtensionSingleBrowser extends WorkerExtension {
14
14
  if (!this.testPlayer) {
15
15
  return;
16
16
  }
17
- await releasePlayer(this.id, this.releaseSlotOnTestFinished, this.userData && this.userData.projectId, this.testPlayer);
17
+ await releasePlayer(this.id, this.releaseSlotOnTestFinished, this.userData?.projectId, this.testPlayer);
18
18
  this.testPlayer = null;
19
19
  }
20
20
 
@@ -58,8 +58,8 @@ class WorkerExtensionSingleBrowser extends WorkerExtension {
58
58
  await this.onQueueCompleted();
59
59
  return;
60
60
  }
61
- if (this.options.lightweightMode && this.options.lightweightMode.general) {
62
- await Bluebird.delay(DELAY_BETWEEN_TESTS);
61
+ if (this.options.lightweightMode?.general) {
62
+ await delay(DELAY_BETWEEN_TESTS);
63
63
  }
64
64
  }
65
65
  }
@@ -92,12 +92,15 @@ class WorkerSelenium extends BaseWorker {
92
92
  sessionPlayer.playbackManager.executionName = testRunHandler.getExecutionName();
93
93
 
94
94
  sessionPlayer.setLightweightMode(this.options.lightweightMode);
95
+ if (testRunHandler.getSfdcCredential()) {
96
+ sessionPlayer.setSfdcCredential(testRunHandler.getSfdcCredential());
97
+ }
95
98
  if (sessionPlayerInit.localAssetService) {
96
99
  sessionPlayerInit.localAssetService.initialize({ serverUrl: this.options.localRCASaver });
97
100
  }
98
101
 
99
102
  let preloadedTest = null;
100
- if (this.options.lightweightMode && this.options.lightweightMode.preloadTests) {
103
+ if (this.options.lightweightMode?.preloadTests) {
101
104
  const preloadedTests = await preloadTests(this.options);
102
105
  preloadedTest = preloadedTests[this.testId];
103
106
  }
@@ -208,7 +211,7 @@ class WorkerSelenium extends BaseWorker {
208
211
  function setupCliPerformanceMonitoring(sessionPlayer) {
209
212
  const { playback } = sessionPlayerInit.commonConstants;
210
213
  function monitorEvent(event) {
211
- sessionPlayer.playbackManager.on(event, (...args) => {
214
+ sessionPlayer.playbackManager.on(event, () => {
212
215
  perf.log(`Got event ${event}`);
213
216
  });
214
217
  }