@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.
- package/OverrideTestDataBuilder.js +1 -1
- package/agent/routers/cliJsCode/index.js +4 -4
- package/agent/routers/cliJsCode/router.js +46 -42
- package/agent/routers/cliJsCode/service.js +18 -13
- package/agent/routers/codim/router.js +14 -17
- package/agent/routers/codim/router.test.js +15 -14
- package/agent/routers/codim/service.js +1 -1
- package/agent/routers/general/index.js +4 -8
- package/agent/routers/hybrid/registerRoutes.js +18 -18
- package/agent/routers/index.js +9 -8
- package/agent/routers/playground/router.js +12 -11
- package/agent/routers/playground/service.js +19 -18
- package/agent/routers/standalone-browser/registerRoutes.js +10 -10
- package/cdpTestRunner.js +4 -3
- package/chromiumInstaller.js +4 -5
- package/cli/onExit.js +2 -2
- package/cli.js +7 -6
- package/cliAgentMode.js +4 -5
- package/codim/codim-cli.js +11 -10
- package/codim/hybrid-utils.js +1 -1
- package/codim/measure-perf.js +9 -6
- package/codim/template.js/tests/examples/01-simple-text-validation.test.js +6 -6
- package/codim/template.js/tests/examples/02-using-locators.test.js +13 -15
- package/codim/template.js/tests/examples/03-using-hooks.test.js +17 -19
- package/codim/template.js/tests/examples/04-skip-and-only.test.js +16 -17
- package/codim/template.js/tests/examples/05-multiple-windows.test.js +16 -17
- package/codim/template.js/webpack.config.js +1 -1
- package/codim/template.ts/webpack.config.js +3 -3
- package/commons/AbortError.js +4 -4
- package/commons/chrome-launcher.js +6 -6
- package/commons/constants.js +2 -0
- package/commons/detectDebugger.js +4 -2
- package/commons/getSessionPlayerRequire.js +2 -20
- package/commons/initializeUserWithAuth.js +2 -2
- package/commons/lazyRequire.js +10 -9
- package/commons/logger.js +4 -4
- package/commons/performance-logger.js +14 -8
- package/commons/prepareRunnerAndTestimStartUtils.js +6 -7
- package/commons/socket/baseSocketServiceSocketIO.js +32 -34
- package/commons/socket/realDataService.js +6 -5
- package/commons/socket/realDataServiceSocketIO.js +4 -4
- package/commons/socket/remoteStepService.js +4 -3
- package/commons/socket/remoteStepServiceSocketIO.js +11 -12
- package/commons/socket/socketService.js +50 -52
- package/commons/socket/testResultServiceSocketIO.js +11 -11
- package/commons/testimDesiredCapabilitiesBuilder.js +44 -0
- package/commons/testimNgrok.js +2 -2
- package/commons/testimNgrok.test.js +1 -1
- package/commons/testimServicesApi.js +37 -21
- package/commons/xhr2.js +97 -100
- package/credentialsManager.js +17 -20
- package/errors.js +5 -0
- package/fixLocalBuild.js +2 -0
- package/npm-shrinkwrap.json +4455 -1576
- package/package.json +9 -7
- package/player/WebdriverioWebDriverApi.js +7 -2
- package/player/appiumTestPlayer.js +102 -0
- package/player/chromeLauncherTestPlayer.js +0 -1
- package/player/seleniumTestPlayer.js +3 -2
- package/player/services/frameLocator.js +2 -1
- package/player/services/mobileFrameLocatorMock.js +32 -0
- package/player/services/playbackTimeoutCalculator.js +1 -0
- package/player/services/portSelector.js +10 -8
- package/player/services/tabService.js +29 -0
- package/player/services/tabServiceMock.js +166 -0
- package/player/stepActions/navigationStepAction.js +11 -10
- package/player/stepActions/sleepStepAction.js +4 -5
- package/player/stepActions/stepAction.js +15 -1
- package/player/stepActions/textStepAction.js +4 -11
- package/player/utils/stepActionUtils.js +4 -2
- package/player/utils/windowUtils.js +139 -125
- package/player/webdriver.js +40 -26
- package/processHandler.js +3 -3
- package/processHandler.test.js +1 -1
- package/reports/consoleReporter.js +3 -2
- package/reports/debugReporter.js +41 -39
- package/reports/jsonReporter.js +53 -50
- package/reports/junitReporter.js +1 -2
- package/reports/reporter.js +135 -136
- package/runOptions.js +8 -7
- package/runner.js +13 -0
- package/runners/ParallelWorkerManager.js +2 -0
- package/runners/TestPlanRunner.js +142 -74
- package/runners/buildCodeTests.js +38 -37
- package/runners/runnerUtils.js +3 -3
- package/services/lambdatestService.js +3 -5
- package/stepPlayers/cliJsStepPlayback.js +22 -17
- package/testRunHandler.js +8 -0
- package/testRunStatus.js +458 -460
- package/{utils.js → utils/index.js} +25 -117
- package/utils/promiseUtils.js +78 -0
- package/utils/stringUtils.js +96 -0
- package/{utils.test.js → utils/utils.test.js} +2 -2
- package/workers/BaseWorker.js +29 -20
- package/workers/WorkerAppium.js +123 -0
- package/workers/WorkerExtensionSingleBrowser.js +4 -4
- 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
|
|
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
|
|
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
|
|
62
|
-
await
|
|
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
|
|
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, (
|
|
214
|
+
sessionPlayer.playbackManager.on(event, () => {
|
|
212
215
|
perf.log(`Got event ${event}`);
|
|
213
216
|
});
|
|
214
217
|
}
|