@lambdatest/cypress-driver 1.0.4
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/index.js +3 -0
- package/package.json +30 -0
- package/src/smartui.js +53 -0
- package/src/utils/httpClient.js +38 -0
- package/src/utils/logger.js +34 -0
- package/src/utils/utils.js +8 -0
package/index.js
ADDED
package/package.json
ADDED
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@lambdatest/cypress-driver",
|
|
3
|
+
"version": "1.0.4",
|
|
4
|
+
"description": "Cypress driver for all Lambdatest functionalities",
|
|
5
|
+
"main": "index.js",
|
|
6
|
+
"repository": {
|
|
7
|
+
"type": "git",
|
|
8
|
+
"url": "git+https://github.com/LambdaTest/lambdatest-js-sdk.git",
|
|
9
|
+
"directory": "packages/cypress"
|
|
10
|
+
},
|
|
11
|
+
"bugs": {
|
|
12
|
+
"url": "https://github.com/LambdaTest/lambdatest-js-sdk/issues"
|
|
13
|
+
},
|
|
14
|
+
"homepage": "https://github.com/LambdaTest/lambdatest-js-sdk/packages/cypress#readme",
|
|
15
|
+
"keywords": [
|
|
16
|
+
"lambdatest",
|
|
17
|
+
"cypress"
|
|
18
|
+
],
|
|
19
|
+
"author": "LambdaTest <keys@lambdatest.com>",
|
|
20
|
+
"license": "MIT",
|
|
21
|
+
"devDependencies": {
|
|
22
|
+
"cypress": "4.x"
|
|
23
|
+
},
|
|
24
|
+
"peerDependencies": {
|
|
25
|
+
"cypress": "4.x"
|
|
26
|
+
},
|
|
27
|
+
"scripts": {
|
|
28
|
+
"test": "echo \"Error: no test specified\" && exit 1"
|
|
29
|
+
}
|
|
30
|
+
}
|
package/src/smartui.js
ADDED
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
const { cylog, log } = require('./utils/logger');
|
|
2
|
+
const client = require('./utils/httpClient');
|
|
3
|
+
const testType = 'cypress-driver';
|
|
4
|
+
const CY_TIMEOUT = 30 * 1000 * 1.5;
|
|
5
|
+
|
|
6
|
+
function smartuiSnapshot(name, options = {}) {
|
|
7
|
+
// Default name to test title
|
|
8
|
+
name = name || cy.state('runnable').fullTitle();
|
|
9
|
+
|
|
10
|
+
return cy.then({ timeout: CY_TIMEOUT }, async () => {
|
|
11
|
+
if (Cypress.config('isInteractive') && !Cypress.config('enableSmartUIInteractiveMode')) {
|
|
12
|
+
return cylog('smartuiSnapshot', 'Disabled in interactive mode', {
|
|
13
|
+
details: 'use "cypress run" instead of "cypress open"',
|
|
14
|
+
snapshot: name,
|
|
15
|
+
});
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
if (!(await client.isSmartUIRunning())) {
|
|
19
|
+
throw new Error('Cannot find SmartUI server.');
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
let resp = await client.fetchDOMSerializer();
|
|
23
|
+
eval(resp.body.data.dom);
|
|
24
|
+
|
|
25
|
+
return cy.document({ log: false }).then({ timeout: CY_TIMEOUT }, dom => {
|
|
26
|
+
let domSnapshot = window.SmartUIDOM.serialize({ ...options, dom });
|
|
27
|
+
|
|
28
|
+
return client.postSnapshot({
|
|
29
|
+
dom: domSnapshot,
|
|
30
|
+
url: dom.URL,
|
|
31
|
+
name,
|
|
32
|
+
options
|
|
33
|
+
}, testType).then(resp => {
|
|
34
|
+
if (resp.status >= 200 && resp.status < 300) {
|
|
35
|
+
if (resp.body.data?.warnings?.length) {
|
|
36
|
+
resp.body.data.warnings.map(e => cy.task('log', log('warn', e)));
|
|
37
|
+
}
|
|
38
|
+
cylog('smartuiSnapshot', `Snapshot captured: ${name}`);
|
|
39
|
+
cy.task('log', log('info', `Snapshot captured: ${name}`));
|
|
40
|
+
} else {
|
|
41
|
+
throw new Error(resp.body.error.message);
|
|
42
|
+
}
|
|
43
|
+
}).catch(error => {
|
|
44
|
+
cy.task('log', log('error', `SmartUI snapshot failed "${name}"`));
|
|
45
|
+
cy.task('log', log('error', error.message));
|
|
46
|
+
});
|
|
47
|
+
});
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
module.exports = {
|
|
52
|
+
smartuiSnapshot
|
|
53
|
+
}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
const { cylog } = require('./logger');
|
|
2
|
+
const utils = require('./utils');
|
|
3
|
+
|
|
4
|
+
module.exports = new class httpClient {
|
|
5
|
+
async request(options) {
|
|
6
|
+
return Cypress.backend('http:request', {
|
|
7
|
+
retryOnNetworkFailure: false, ...options
|
|
8
|
+
});
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
isSmartUIRunning() {
|
|
12
|
+
return this.request({
|
|
13
|
+
url: `${utils.getSmartUIServerAddress()}/healthcheck`,
|
|
14
|
+
method: 'GET',
|
|
15
|
+
})
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
fetchDOMSerializer() {
|
|
19
|
+
return this.request({
|
|
20
|
+
url: `${utils.getSmartUIServerAddress()}/domserializer`,
|
|
21
|
+
method: 'GET'
|
|
22
|
+
})
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
postSnapshot(snapshot, testType) {
|
|
26
|
+
return this.request({
|
|
27
|
+
url: `${utils.getSmartUIServerAddress()}/snapshot`,
|
|
28
|
+
method: 'POST',
|
|
29
|
+
body: JSON.stringify({
|
|
30
|
+
snapshot,
|
|
31
|
+
testType
|
|
32
|
+
}),
|
|
33
|
+
headers: {
|
|
34
|
+
'Content-Type': 'application/json',
|
|
35
|
+
}
|
|
36
|
+
})
|
|
37
|
+
}
|
|
38
|
+
};
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
const chalk = require('chalk');
|
|
2
|
+
const pkgName = require('../../package.json').name;
|
|
3
|
+
|
|
4
|
+
function cylog(name, message, meta = {}) {
|
|
5
|
+
return Cypress.log({
|
|
6
|
+
name,
|
|
7
|
+
message,
|
|
8
|
+
displayName: pkgName,
|
|
9
|
+
consoleProps: () => meta
|
|
10
|
+
});
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
function log(level, message) {
|
|
14
|
+
if (typeof message === 'object') {
|
|
15
|
+
message = JSON.stringify(message);
|
|
16
|
+
}
|
|
17
|
+
switch (level) {
|
|
18
|
+
case 'debug':
|
|
19
|
+
message = chalk.blue(message);
|
|
20
|
+
break;
|
|
21
|
+
case 'warn':
|
|
22
|
+
message = chalk.yellow(`Warning: ${message}`);
|
|
23
|
+
break;
|
|
24
|
+
case 'error':
|
|
25
|
+
message = chalk.red(`Error: ${message}`);
|
|
26
|
+
break;
|
|
27
|
+
}
|
|
28
|
+
return `[${pkgName}] ${message}`;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
module.exports = {
|
|
32
|
+
cylog,
|
|
33
|
+
log
|
|
34
|
+
}
|