diff --git a/tests/e2e/.eslintrc.js b/tests/e2e/.eslintrc.js index 852e10710a4..2a376d589d2 100644 --- a/tests/e2e/.eslintrc.js +++ b/tests/e2e/.eslintrc.js @@ -93,7 +93,7 @@ module.exports = { '@typescript-eslint/no-unsafe-call': 'off', '@typescript-eslint/restrict-plus-operands': 'off', '@typescript-eslint/no-namespace': 'off', - '@typescript-eslint/no-unused-expressions': 'error', + '@typescript-eslint/no-unused-expressions': 'off', '@typescript-eslint/no-unused-vars': 'error', '@typescript-eslint/no-use-before-define': 'error', '@typescript-eslint/no-var-requires': 'off', diff --git a/tests/e2e/README.md b/tests/e2e/README.md index d652889948d..754798e0639 100644 --- a/tests/e2e/README.md +++ b/tests/e2e/README.md @@ -37,6 +37,7 @@ Note: If there is any modifications in package.json, manually execute the `npm i npm run test ``` Also, environmental variables can be set in files in "constants" folder. +- Local test results can be represented with Allure reporter `npm run open-allure-dasboard` ## Docker launch diff --git a/tests/e2e/configs/mocharc.ts b/tests/e2e/configs/mocharc.ts index 4a4a2529f3f..90a19c3da79 100644 --- a/tests/e2e/configs/mocharc.ts +++ b/tests/e2e/configs/mocharc.ts @@ -18,7 +18,8 @@ import { MOCHA_CONSTANTS } from '../constants/MOCHA_CONSTANTS'; module.exports = { timeout: MOCHA_CONSTANTS.MOCHA_DEFAULT_TIMEOUT, - reporter: 'dist/utils/CheReporter.js', + reporter: 'mocha-multi-reporters', + reporterOptions: 'configFile=configs/reporters-config.json', ui: 'tdd', require: ['dist/specs/MochaHooks.js', 'ts-node/register'], bail: MOCHA_CONSTANTS.MOCHA_BAIL, diff --git a/tests/e2e/configs/reporters-config.json b/tests/e2e/configs/reporters-config.json new file mode 100644 index 00000000000..82a75b921dd --- /dev/null +++ b/tests/e2e/configs/reporters-config.json @@ -0,0 +1,6 @@ +{ + "reporterEnabled": "allure-mocha,dist/utils/CheReporter.js", + "allureMochaReporterOptions": { + "resultsDir": ".allure-results" + } +} diff --git a/tests/e2e/constants/PLUGIN_TEST_CONSTANTS.ts b/tests/e2e/constants/PLUGIN_TEST_CONSTANTS.ts index d658746cfed..2b4406aaa2d 100644 --- a/tests/e2e/constants/PLUGIN_TEST_CONSTANTS.ts +++ b/tests/e2e/constants/PLUGIN_TEST_CONSTANTS.ts @@ -11,5 +11,7 @@ export const PLUGIN_TEST_CONSTANTS: { TS_SAMPLE_LIST: string } = { /** * dashboard samples to check in RecommendedExtensions.spec.ts */ - TS_SAMPLE_LIST: process.env.TS_SAMPLE_LIST || 'Node.js MongoDB,Node.js Express' + TS_SAMPLE_LIST: + process.env.TS_SAMPLE_LIST || + 'Node.js MongoDB,Node.js Express,Java 11 with Lombok,Java 11 with Quarkus,Python,.NET,C/C++,Go,PHP,Ansible' }; diff --git a/tests/e2e/constants/TIMEOUT_CONSTANTS.ts b/tests/e2e/constants/TIMEOUT_CONSTANTS.ts index 6a3649e7402..a3af150a4ea 100644 --- a/tests/e2e/constants/TIMEOUT_CONSTANTS.ts +++ b/tests/e2e/constants/TIMEOUT_CONSTANTS.ts @@ -8,6 +8,7 @@ * SPDX-License-Identifier: EPL-2.0 **********************************************************************/ export const TIMEOUT_CONSTANTS: { + TS_FIND_EXTENSION_TEST_TIMEOUT: number; TS_SELENIUM_WORKSPACE_STATUS_POLLING: number; TS_COMMON_DASHBOARD_WAIT_TIMEOUT: number; TS_EXPAND_PROJECT_TREE_ITEM_TIMEOUT: number; @@ -106,7 +107,7 @@ export const TIMEOUT_CONSTANTS: { // -------------------------------------------- EDITOR -------------------------------------------- /** - * timeout for inetractions with editor tab - wait, click, select, "8 000" by default. + * timeout for interactions with editor tab - wait, click, select, "8 000" by default. */ TS_EDITOR_TAB_INTERACTION_TIMEOUT: Number(process.env.TS_OPEN_PROJECT_TREE_TIMEOUT) || 8_000, @@ -127,5 +128,10 @@ export const TIMEOUT_CONSTANTS: { /** * common timeout for plugins. */ - TS_COMMON_PLUGIN_TEST_TIMEOUT: Number(process.env.TS_COMMON_PLUGIN_TEST_TIMEOUT) || 30_000 + TS_COMMON_PLUGIN_TEST_TIMEOUT: Number(process.env.TS_COMMON_PLUGIN_TEST_TIMEOUT) || 30_000, + + /** + * timeout for searching extension in marketplace. + */ + TS_FIND_EXTENSION_TEST_TIMEOUT: Number(process.env.TS_FIND_EXTENSION_TEST_TIMEOUT) || 15_000 }; diff --git a/tests/e2e/package-lock.json b/tests/e2e/package-lock.json index d1922c383d0..4b994b46367 100644 --- a/tests/e2e/package-lock.json +++ b/tests/e2e/package-lock.json @@ -1,12 +1,12 @@ { "name": "@eclipse-che/che-e2e", - "version": "7.73.0-SNAPSHOT", + "version": "7.75.0-SNAPSHOT", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@eclipse-che/che-e2e", - "version": "7.73.0-SNAPSHOT", + "version": "7.75.0-SNAPSHOT", "license": "ISC", "dependencies": { "@eclipse-che/api": "latest", @@ -25,6 +25,10 @@ "@typescript-eslint/eslint-plugin": "^6.4.1", "@typescript-eslint/eslint-plugin-tslint": "^6.1.0", "@typescript-eslint/parser": "^6.1.0", + "allure-commandline": "^2.22.1", + "allure-decorators": "^2.4.0", + "allure-js-commons": "^2.4.0", + "allure-mocha": "^2.4.0", "axios": "^0.25.0", "chai": "^4.3.4", "chromedriver": "^114.0.2", @@ -37,6 +41,8 @@ "husky": "^8.0.3", "inversify-inject-decorators": "^3.1.0", "mocha": "^9.1.3", + "mocha-allure-reporter": "^1.4.0", + "mocha-multi-reporters": "^1.5.1", "monaco-page-objects": "3.9.1", "prettier": "^3.0.2", "rimraf": "2.6.2", @@ -58,13 +64,13 @@ } }, "node_modules/@babel/code-frame": { - "version": "7.22.10", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.10.tgz", - "integrity": "sha512-/KKIMG4UEL35WmI9OlvMhurwtytjvXoFcGNrOvyG9zIzA8YmPjVtIZUf7b05+TPO7G7/GEmLHDaoCgACHl9hhA==", + "version": "7.22.13", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.13.tgz", + "integrity": "sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==", "dev": true, "peer": true, "dependencies": { - "@babel/highlight": "^7.22.10", + "@babel/highlight": "^7.22.13", "chalk": "^2.4.2" }, "engines": { @@ -150,9 +156,9 @@ } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.5.tgz", - "integrity": "sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ==", + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", + "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", "dev": true, "peer": true, "engines": { @@ -160,13 +166,13 @@ } }, "node_modules/@babel/highlight": { - "version": "7.22.10", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.10.tgz", - "integrity": "sha512-78aUtVcT7MUscr0K5mIEnkwxPE0MaxkR5RxRwuHaQ+JuU5AmTPhY+do2mdzVTnIJJpyBglql2pehuBIWHug+WQ==", + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.20.tgz", + "integrity": "sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg==", "dev": true, "peer": true, "dependencies": { - "@babel/helper-validator-identifier": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.20", "chalk": "^2.4.2", "js-tokens": "^4.0.0" }, @@ -285,14 +291,14 @@ } }, "node_modules/@eclipse-che/api": { - "version": "7.73.0", - "resolved": "https://registry.npmjs.org/@eclipse-che/api/-/api-7.73.0.tgz", - "integrity": "sha512-ydZPC5o7//UGu2D6spTxg5fpMcnqGeQpzhFtiHULKkuZ2xsw5eHiLEzYjBaeUDvSi/reQg7t72VqUD16+4Q2xg==" + "version": "7.74.0", + "resolved": "https://registry.npmjs.org/@eclipse-che/api/-/api-7.74.0.tgz", + "integrity": "sha512-9RVmHG7rc/Tk5RSNRdtIDReGvFu5M6x54NXI7zD0CDcSpJQyrb8o/9fTQn9Q/niLdpY+QDy1ef4FZ8qWYMQ9pQ==" }, "node_modules/@eclipse-che/che-devworkspace-generator": { - "version": "0.0.1-6ef61ae", - "resolved": "https://registry.npmjs.org/@eclipse-che/che-devworkspace-generator/-/che-devworkspace-generator-0.0.1-6ef61ae.tgz", - "integrity": "sha512-QTd4CVuqLjSeIDhP9lUZ3HT+yVKPZh5XbLk0dY4k0E6JEGhDoRk+CoLSa9RWGFATfI3VdlZWdgPkC7Wibnx5nQ==", + "version": "7.75.0-next-50585f6", + "resolved": "https://registry.npmjs.org/@eclipse-che/che-devworkspace-generator/-/che-devworkspace-generator-7.75.0-next-50585f6.tgz", + "integrity": "sha512-n3NpN8xpT8DqbVG+9qcVWglUP744XnfU76w++/n0JsuV/7WdZWawb8Avi+vCHLCoHXHjeCfz8AwffFZ6/HKB9w==", "dev": true, "dependencies": { "@devfile/api": "latest", @@ -352,9 +358,9 @@ } }, "node_modules/@eslint-community/regexpp": { - "version": "4.8.0", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.8.0.tgz", - "integrity": "sha512-JylOEEzDiOryeUnFbQz+oViCXS0KsvR1mvHkoMiu5+UiBvy+RYX7tzlIIIEstF/gVa2tj9AQXk3dgnxv6KxhFg==", + "version": "4.8.1", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.8.1.tgz", + "integrity": "sha512-PWiOzLIUAjN/w5K17PoF4n6sKBw0gqLHPhywmYHP4t1VFQQVYeb1yWsJwnMVEMl3tUHME7X/SJPZLmtG7XBDxQ==", "dev": true, "engines": { "node": "^12.0.0 || ^14.0.0 || >=16.0.0" @@ -384,18 +390,18 @@ } }, "node_modules/@eslint/js": { - "version": "8.47.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.47.0.tgz", - "integrity": "sha512-P6omY1zv5MItm93kLM8s2vr1HICJH8v0dvddDhysbIuZ+vcjOHg5Zbkf1mTkcmi2JA9oBG2anOkRnW8WJTS8Og==", + "version": "8.49.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.49.0.tgz", + "integrity": "sha512-1S8uAY/MTJqVx0SC4epBq+N2yhuwtNwLbJYNZyhL2pO1ZVKn5HFXav5T41Ryzy9K9V7ZId2JB2oy/W4aCd9/2w==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, "node_modules/@humanwhocodes/config-array": { - "version": "0.11.10", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.10.tgz", - "integrity": "sha512-KVVjQmNUepDVGXNuoRRdmmEjruj0KfiGSbS8LVc12LMsWDQzRXJ0qdhN8L8uUigKpfEHRhlaQFY0ib1tnUbNeQ==", + "version": "0.11.11", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.11.tgz", + "integrity": "sha512-N2brEuAadi0CcdeMXUkhbZB84eskAc8MEX1By6qEchoVywSgXPIjou4rYsl0V3Hj0ZnuGycGCjdNgockbzeWNA==", "dev": true, "dependencies": { "@humanwhocodes/object-schema": "^1.2.1", @@ -506,9 +512,9 @@ } }, "node_modules/@testim/chrome-version": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@testim/chrome-version/-/chrome-version-1.1.3.tgz", - "integrity": "sha512-g697J3WxV/Zytemz8aTuKjTGYtta9+02kva3C1xc7KXB8GdbfE1akGJIsZLyY/FSh2QrnE+fiB7vmWU3XNcb6A==", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/@testim/chrome-version/-/chrome-version-1.1.4.tgz", + "integrity": "sha512-kIhULpw9TrGYnHp/8VfdcneIcxKnLixmADtukQRtJUmsVlMg0niMkwV0xZmi8hqa57xqilIHjWFA0GKvEjVU5g==", "dev": true }, "node_modules/@tsconfig/node10": { @@ -542,21 +548,21 @@ "dev": true }, "node_modules/@types/caseless": { - "version": "0.12.2", - "resolved": "https://registry.npmjs.org/@types/caseless/-/caseless-0.12.2.tgz", - "integrity": "sha512-6ckxMjBBD8URvjB6J3NcnuAn5Pkl7t3TizAg+xdlzzQGSPSmBcXf8KoIH0ua/i+tio+ZRUHEXp0HEmvaR4kt0w==", + "version": "0.12.3", + "resolved": "https://registry.npmjs.org/@types/caseless/-/caseless-0.12.3.tgz", + "integrity": "sha512-ZD/NsIJYq/2RH+hY7lXmstfp/v9djGt9ah+xRQ3pcgR79qiKsG4pLl25AI7IcXxVO8dH9GiBE5rAknC0ePntlw==", "dev": true }, "node_modules/@types/chai": { - "version": "4.3.5", - "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.5.tgz", - "integrity": "sha512-mEo1sAde+UCE6b2hxn332f1g1E8WfYRu6p5SvTKr2ZKC1f7gFJXk4h5PyGP9Dt6gCaG8y8XhwnXWC6Iy2cmBng==", + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.6.tgz", + "integrity": "sha512-VOVRLM1mBxIRxydiViqPcKn6MIxZytrbMpd6RJLIWKxUNr3zux8no0Oc7kJx0WAPIitgZ0gkrDS+btlqQpubpw==", "dev": true }, "node_modules/@types/clone-deep": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@types/clone-deep/-/clone-deep-4.0.1.tgz", - "integrity": "sha512-bdkCSkyVHsgl3Goe1y16T9k6JuQx7SiDREkq728QjKmTZkGJZuS8R3gGcnGzVuGBP0mssKrzM/GlMOQxtip9cg==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@types/clone-deep/-/clone-deep-4.0.2.tgz", + "integrity": "sha512-V5zm9f9atBc2gXepJvS4OwD/kphkTenFZibiqrMaXvbGUxEhQFe7b6LaCy+KKItwJPgopLO6RuhTYvVg5gZs8g==", "dev": true }, "node_modules/@types/glob": { @@ -570,9 +576,9 @@ } }, "node_modules/@types/json-schema": { - "version": "7.0.12", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.12.tgz", - "integrity": "sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA==", + "version": "7.0.13", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.13.tgz", + "integrity": "sha512-RbSSoHliUbnXj3ny0CNFOoxrIDV6SUGyStHsvDqosw6CkdPV8TtWGlfecuK4ToyMEAql6pzNxgCFKanovUzlgQ==", "dev": true }, "node_modules/@types/minimatch": { @@ -625,9 +631,9 @@ } }, "node_modules/@types/semver": { - "version": "7.5.0", - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.0.tgz", - "integrity": "sha512-G8hZ6XJiHnuhQKR7ZmysCeJWE08o8T0AXtk5darsCaTVsYZhhgUrq53jizaR2FvsoeCwJhlmwTjkXBY5Pn/ZHw==", + "version": "7.5.2", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.2.tgz", + "integrity": "sha512-7aqorHYgdNO4DM36stTiGO3DvKoex9TQRwsJU6vMaFGyqpBA1MNZkz+PG3gaNUPpTAOYhT1WR7M1JyA3fbS9Cw==", "dev": true }, "node_modules/@types/shelljs": { @@ -651,9 +657,9 @@ } }, "node_modules/@types/tough-cookie": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-4.0.2.tgz", - "integrity": "sha512-Q5vtl1W5ue16D+nIaW8JWebSSraJVlK+EthKn7e7UcD4KWsaSJ8BqGPXNaPghgtcn/fhvrN17Tv8ksUsQpiplw==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-4.0.3.tgz", + "integrity": "sha512-THo502dA5PzG/sfQH+42Lw3fvmYkceefOspdCwpHRul8ik2Jv1K8I5OZz1AT3/rs46kwgMCe9bSBmDLYkkOMGg==", "dev": true }, "node_modules/@types/ws": { @@ -676,16 +682,16 @@ } }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "6.4.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.4.1.tgz", - "integrity": "sha512-3F5PtBzUW0dYlq77Lcqo13fv+58KDwUib3BddilE8ajPJT+faGgxmI9Sw+I8ZS22BYwoir9ZhNXcLi+S+I2bkw==", + "version": "6.7.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.7.2.tgz", + "integrity": "sha512-ooaHxlmSgZTM6CHYAFRlifqh1OAr3PAQEwi7lhYhaegbnXrnh7CDcHmc3+ihhbQC7H0i4JF0psI5ehzkF6Yl6Q==", "dev": true, "dependencies": { "@eslint-community/regexpp": "^4.5.1", - "@typescript-eslint/scope-manager": "6.4.1", - "@typescript-eslint/type-utils": "6.4.1", - "@typescript-eslint/utils": "6.4.1", - "@typescript-eslint/visitor-keys": "6.4.1", + "@typescript-eslint/scope-manager": "6.7.2", + "@typescript-eslint/type-utils": "6.7.2", + "@typescript-eslint/utils": "6.7.2", + "@typescript-eslint/visitor-keys": "6.7.2", "debug": "^4.3.4", "graphemer": "^1.4.0", "ignore": "^5.2.4", @@ -711,12 +717,12 @@ } }, "node_modules/@typescript-eslint/eslint-plugin-tslint": { - "version": "6.4.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin-tslint/-/eslint-plugin-tslint-6.4.1.tgz", - "integrity": "sha512-Vxi7jQuQeJeY9d4eqbzs7trwAf/M9B8109tkzkxPg5tafg/EO0fS8+QS5e5JXyhkOwgWbtMmLHFZFQpk4RBGEw==", + "version": "6.7.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin-tslint/-/eslint-plugin-tslint-6.7.2.tgz", + "integrity": "sha512-3lF/lgcGMFy88ssxGob1v8LsNNizxeqjegeOGx4PCkmnFmKOw107btriSfA7VdEO3PxExrdX/hOVe+/uQkkM6Q==", "dev": true, "dependencies": { - "@typescript-eslint/utils": "6.4.1" + "@typescript-eslint/utils": "6.7.2" }, "engines": { "node": "^16.0.0 || >=18.0.0" @@ -731,42 +737,16 @@ "typescript": "*" } }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/ts-api-utils": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.0.2.tgz", - "integrity": "sha512-Cbu4nIqnEdd+THNEsBdkolnOXhg0I8XteoHaEKgvsxpsbWda4IsUut2c187HxywQCvveojow0Dgw/amxtSKVkQ==", - "dev": true, - "engines": { - "node": ">=16.13.0" - }, - "peerDependencies": { - "typescript": ">=4.2.0" - } - }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/typescript": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.2.2.tgz", - "integrity": "sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==", - "dev": true, - "peer": true, - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" - } - }, "node_modules/@typescript-eslint/parser": { - "version": "6.4.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.4.1.tgz", - "integrity": "sha512-610G6KHymg9V7EqOaNBMtD1GgpAmGROsmfHJPXNLCU9bfIuLrkdOygltK784F6Crboyd5tBFayPB7Sf0McrQwg==", + "version": "6.7.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.7.2.tgz", + "integrity": "sha512-KA3E4ox0ws+SPyxQf9iSI25R6b4Ne78ORhNHeVKrPQnoYsb9UhieoiRoJgrzgEeKGOXhcY1i8YtOeCHHTDa6Fw==", "dev": true, "dependencies": { - "@typescript-eslint/scope-manager": "6.4.1", - "@typescript-eslint/types": "6.4.1", - "@typescript-eslint/typescript-estree": "6.4.1", - "@typescript-eslint/visitor-keys": "6.4.1", + "@typescript-eslint/scope-manager": "6.7.2", + "@typescript-eslint/types": "6.7.2", + "@typescript-eslint/typescript-estree": "6.7.2", + "@typescript-eslint/visitor-keys": "6.7.2", "debug": "^4.3.4" }, "engines": { @@ -786,13 +766,13 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "6.4.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.4.1.tgz", - "integrity": "sha512-p/OavqOQfm4/Hdrr7kvacOSFjwQ2rrDVJRPxt/o0TOWdFnjJptnjnZ+sYDR7fi4OimvIuKp+2LCkc+rt9fIW+A==", + "version": "6.7.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.7.2.tgz", + "integrity": "sha512-bgi6plgyZjEqapr7u2mhxGR6E8WCzKNUFWNh6fkpVe9+yzRZeYtDTbsIBzKbcxI+r1qVWt6VIoMSNZ4r2A+6Yw==", "dev": true, "dependencies": { - "@typescript-eslint/types": "6.4.1", - "@typescript-eslint/visitor-keys": "6.4.1" + "@typescript-eslint/types": "6.7.2", + "@typescript-eslint/visitor-keys": "6.7.2" }, "engines": { "node": "^16.0.0 || >=18.0.0" @@ -803,13 +783,13 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "6.4.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.4.1.tgz", - "integrity": "sha512-7ON8M8NXh73SGZ5XvIqWHjgX2f+vvaOarNliGhjrJnv1vdjG0LVIz+ToYfPirOoBi56jxAKLfsLm40+RvxVVXA==", + "version": "6.7.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.7.2.tgz", + "integrity": "sha512-36F4fOYIROYRl0qj95dYKx6kybddLtsbmPIYNK0OBeXv2j9L5nZ17j9jmfy+bIDHKQgn2EZX+cofsqi8NPATBQ==", "dev": true, "dependencies": { - "@typescript-eslint/typescript-estree": "6.4.1", - "@typescript-eslint/utils": "6.4.1", + "@typescript-eslint/typescript-estree": "6.7.2", + "@typescript-eslint/utils": "6.7.2", "debug": "^4.3.4", "ts-api-utils": "^1.0.1" }, @@ -829,36 +809,10 @@ } } }, - "node_modules/@typescript-eslint/type-utils/node_modules/ts-api-utils": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.0.2.tgz", - "integrity": "sha512-Cbu4nIqnEdd+THNEsBdkolnOXhg0I8XteoHaEKgvsxpsbWda4IsUut2c187HxywQCvveojow0Dgw/amxtSKVkQ==", - "dev": true, - "engines": { - "node": ">=16.13.0" - }, - "peerDependencies": { - "typescript": ">=4.2.0" - } - }, - "node_modules/@typescript-eslint/type-utils/node_modules/typescript": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.2.2.tgz", - "integrity": "sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==", - "dev": true, - "peer": true, - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" - } - }, "node_modules/@typescript-eslint/types": { - "version": "6.4.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.4.1.tgz", - "integrity": "sha512-zAAopbNuYu++ijY1GV2ylCsQsi3B8QvfPHVqhGdDcbx/NK5lkqMnCGU53amAjccSpk+LfeONxwzUhDzArSfZJg==", + "version": "6.7.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.7.2.tgz", + "integrity": "sha512-flJYwMYgnUNDAN9/GAI3l8+wTmvTYdv64fcH8aoJK76Y+1FCZ08RtI5zDerM/FYT5DMkAc+19E4aLmd5KqdFyg==", "dev": true, "engines": { "node": "^16.0.0 || >=18.0.0" @@ -869,13 +823,13 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "6.4.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.4.1.tgz", - "integrity": "sha512-xF6Y7SatVE/OyV93h1xGgfOkHr2iXuo8ip0gbfzaKeGGuKiAnzS+HtVhSPx8Www243bwlW8IF7X0/B62SzFftg==", + "version": "6.7.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.7.2.tgz", + "integrity": "sha512-kiJKVMLkoSciGyFU0TOY0fRxnp9qq1AzVOHNeN1+B9erKFCJ4Z8WdjAkKQPP+b1pWStGFqezMLltxO+308dJTQ==", "dev": true, "dependencies": { - "@typescript-eslint/types": "6.4.1", - "@typescript-eslint/visitor-keys": "6.4.1", + "@typescript-eslint/types": "6.7.2", + "@typescript-eslint/visitor-keys": "6.7.2", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -895,44 +849,18 @@ } } }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/ts-api-utils": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.0.2.tgz", - "integrity": "sha512-Cbu4nIqnEdd+THNEsBdkolnOXhg0I8XteoHaEKgvsxpsbWda4IsUut2c187HxywQCvveojow0Dgw/amxtSKVkQ==", - "dev": true, - "engines": { - "node": ">=16.13.0" - }, - "peerDependencies": { - "typescript": ">=4.2.0" - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/typescript": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.2.2.tgz", - "integrity": "sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==", - "dev": true, - "peer": true, - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" - } - }, "node_modules/@typescript-eslint/utils": { - "version": "6.4.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.4.1.tgz", - "integrity": "sha512-F/6r2RieNeorU0zhqZNv89s9bDZSovv3bZQpUNOmmQK1L80/cV4KEu95YUJWi75u5PhboFoKUJBnZ4FQcoqhDw==", + "version": "6.7.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.7.2.tgz", + "integrity": "sha512-ZCcBJug/TS6fXRTsoTkgnsvyWSiXwMNiPzBUani7hDidBdj1779qwM1FIAmpH4lvlOZNF3EScsxxuGifjpLSWQ==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", "@types/json-schema": "^7.0.12", "@types/semver": "^7.5.0", - "@typescript-eslint/scope-manager": "6.4.1", - "@typescript-eslint/types": "6.4.1", - "@typescript-eslint/typescript-estree": "6.4.1", + "@typescript-eslint/scope-manager": "6.7.2", + "@typescript-eslint/types": "6.7.2", + "@typescript-eslint/typescript-estree": "6.7.2", "semver": "^7.5.4" }, "engines": { @@ -947,12 +875,12 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "6.4.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.4.1.tgz", - "integrity": "sha512-y/TyRJsbZPkJIZQXrHfdnxVnxyKegnpEvnRGNam7s3TRR2ykGefEWOhaef00/UUN3IZxizS7BTO3svd3lCOJRQ==", + "version": "6.7.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.7.2.tgz", + "integrity": "sha512-uVw9VIMFBUTz8rIeaUT3fFe8xIUx8r4ywAdlQv1ifH+6acn/XF8Y6rwJ7XNmkNMDrTW+7+vxFFPIF40nJCVsMQ==", "dev": true, "dependencies": { - "@typescript-eslint/types": "6.4.1", + "@typescript-eslint/types": "6.7.2", "eslint-visitor-keys": "^3.4.1" }, "engines": { @@ -1027,6 +955,45 @@ "url": "https://github.com/sponsors/epoberezkin" } }, + "node_modules/allure-commandline": { + "version": "2.24.0", + "resolved": "https://registry.npmjs.org/allure-commandline/-/allure-commandline-2.24.0.tgz", + "integrity": "sha512-UuLnq9dOaYAoCCr/hxtxFgDor2/CME3z2Ka2Fj2wN8lRT+v60F+zDN+okrYi77+zFJg4cmCM3jWhEWC9QKja1w==", + "dev": true, + "bin": { + "allure": "bin/allure" + } + }, + "node_modules/allure-decorators": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/allure-decorators/-/allure-decorators-2.8.1.tgz", + "integrity": "sha512-lKJMj6DhKRTJEtDXsxUoh9KkKpiz1bdD3BoidUDgMf+fz4wzWGYzZrbH0hy/7M1OPWqSkogpdsQIlvE5JlLWxg==", + "dev": true, + "dependencies": { + "allure-js-commons": "2.8.1" + } + }, + "node_modules/allure-js-commons": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/allure-js-commons/-/allure-js-commons-2.8.1.tgz", + "integrity": "sha512-Rc6ZQQW3OwX77GrgnQ5vcfDFI6WZteeodfCIgY0fBxUZPQFa14dWbFvLxoMSFV1zUFABtYzkQD7r/2+bfPWb6w==", + "dev": true, + "dependencies": { + "properties": "^1.2.1" + } + }, + "node_modules/allure-mocha": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/allure-mocha/-/allure-mocha-2.8.1.tgz", + "integrity": "sha512-VJSvkV5kcFj3If8OuCOEj8N1kXyeGtOajLeekeE+8OLrWrqE47SBLk0tXrHLAlKRV2Pxg9b004d07CyVaW51JA==", + "dev": true, + "dependencies": { + "allure-js-commons": "2.8.1" + }, + "peerDependencies": { + "mocha": ">=6.2.x" + } + }, "node_modules/ansi-colors": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", @@ -1701,9 +1668,9 @@ } }, "node_modules/chromedriver/node_modules/axios": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.4.0.tgz", - "integrity": "sha512-S4XCWMEmzvo64T9GfvQDOXgYRDJ/wsSZc7Jvdgx5u1sd0JwsuPLqb3SYmusag+edF6ziyMensPVqLTSc1PiSEA==", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.5.0.tgz", + "integrity": "sha512-D4DdjDo5CY50Qms0qGQTTw6Q44jl7zRwY7bthds06pUGfChBCTcQs+N743eFWGEd6pRTMd6A+I87aWyFV5wiZQ==", "dev": true, "dependencies": { "follow-redirects": "^1.15.0", @@ -1993,6 +1960,15 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/default-browser/node_modules/human-signals": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-4.3.1.tgz", + "integrity": "sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==", + "dev": true, + "engines": { + "node": ">=14.18.0" + } + }, "node_modules/default-browser/node_modules/is-stream": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", @@ -2005,6 +1981,18 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/default-browser/node_modules/mimic-fn": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", + "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/default-browser/node_modules/npm-run-path": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.1.0.tgz", @@ -2020,6 +2008,21 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/default-browser/node_modules/onetime": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", + "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", + "dev": true, + "dependencies": { + "mimic-fn": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/default-browser/node_modules/path-key": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", @@ -2032,6 +2035,18 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/default-browser/node_modules/strip-final-newline": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", + "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/define-lazy-prop": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz", @@ -2145,16 +2160,16 @@ } }, "node_modules/eslint": { - "version": "8.47.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.47.0.tgz", - "integrity": "sha512-spUQWrdPt+pRVP1TTJLmfRNJJHHZryFmptzcafwSvHsceV81djHOdnEeDmkdotZyLNjDhrOasNK8nikkoG1O8Q==", + "version": "8.49.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.49.0.tgz", + "integrity": "sha512-jw03ENfm6VJI0jA9U+8H5zfl5b+FvuU3YYvZRdZHOlU2ggJkxrlkJH4HcDrZpj6YwD8kuYqvQM8LyesoazrSOQ==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", "@eslint/eslintrc": "^2.1.2", - "@eslint/js": "^8.47.0", - "@humanwhocodes/config-array": "^0.11.10", + "@eslint/js": "8.49.0", + "@humanwhocodes/config-array": "^0.11.11", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", "ajv": "^6.12.4", @@ -2220,9 +2235,9 @@ } }, "node_modules/eslint-plugin-jsdoc": { - "version": "46.5.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-46.5.0.tgz", - "integrity": "sha512-aulXdA4I1dyWpzyS1Nh/GNoS6PavzeucxEapnMR4JUERowWvaEk2Y4A5irpHAcdXtBBHLVe8WIhdXNjoAlGQgA==", + "version": "46.8.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-46.8.1.tgz", + "integrity": "sha512-uTce7IBluPKXIQMWJkIwFsI1gv7sZRmLjctca2K5DIxPi8fSBj9f4iru42XmGwuiMyH2f3nfc60sFmnSGv4Z/A==", "dev": true, "dependencies": { "@es-joy/jsdoccomment": "~0.40.1", @@ -2407,48 +2422,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/execa/node_modules/human-signals": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", - "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", - "dev": true, - "engines": { - "node": ">=10.17.0" - } - }, - "node_modules/execa/node_modules/mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/execa/node_modules/onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "dev": true, - "dependencies": { - "mimic-fn": "^2.1.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/execa/node_modules/strip-final-newline": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", - "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", - "dev": true, - "engines": { - "node": ">=6" - } - }, "node_modules/extend": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", @@ -2566,6 +2539,15 @@ "node": "^10.12.0 || >=12.0.0" } }, + "node_modules/file-type": { + "version": "7.7.1", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-7.7.1.tgz", + "integrity": "sha512-bTrKkzzZI6wH+NXhyD3SOXtb2zXTw2SbwI2RxUlRcXVsnN7jNL5hJzVQLYv7FOQhxFkK4XWdAflEaWFpaLLWpQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, "node_modules/fill-range": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", @@ -2604,16 +2586,17 @@ } }, "node_modules/flat-cache": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", - "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.1.0.tgz", + "integrity": "sha512-OHx4Qwrrt0E4jEIcI5/Xb+f+QmJYNj2rrK8wiIdQOIrB9WrrJL8cjZvXdXuBTkkEwEqLycb5BeZDV1o2i9bTew==", "dev": true, "dependencies": { - "flatted": "^3.1.0", + "flatted": "^3.2.7", + "keyv": "^4.5.3", "rimraf": "^3.0.2" }, "engines": { - "node": "^10.12.0 || >=12.0.0" + "node": ">=12.0.0" } }, "node_modules/flat-cache/node_modules/rimraf": { @@ -2632,15 +2615,15 @@ } }, "node_modules/flatted": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", - "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==", + "version": "3.2.9", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.9.tgz", + "integrity": "sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==", "dev": true }, "node_modules/follow-redirects": { - "version": "1.15.2", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", - "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==", + "version": "1.15.3", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.3.tgz", + "integrity": "sha512-1VzOtuEM8pC9SFU1E+8KfTjZyMztRsgEfwQl44z8A25uy13jSzTj6dyK2Df52iV0vgHCfBwLhDWevLn95w5v6Q==", "dev": true, "funding": [ { @@ -2952,12 +2935,12 @@ } }, "node_modules/human-signals": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-4.3.1.tgz", - "integrity": "sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", "dev": true, "engines": { - "node": ">=14.18.0" + "node": ">=10.17.0" } }, "node_modules/husky": { @@ -3344,6 +3327,15 @@ "js-yaml": "bin/js-yaml.js" } }, + "node_modules/js2xmlparser": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/js2xmlparser/-/js2xmlparser-3.0.0.tgz", + "integrity": "sha512-CSOkdn0/GhRFwxnipmhXfqJ+FG6+wkWBi46kKSsPx6+j65176ZiQcrCYpg6K8x3iLbO4k3zScBnZ7I/L80dAtw==", + "dev": true, + "dependencies": { + "xmlcreate": "^1.0.1" + } + }, "node_modules/jsbn": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", @@ -3368,6 +3360,12 @@ "jsesc": "bin/jsesc" } }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true + }, "node_modules/json-schema": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", @@ -3446,6 +3444,15 @@ "setimmediate": "^1.0.5" } }, + "node_modules/keyv": { + "version": "4.5.3", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.3.tgz", + "integrity": "sha512-QCiSav9WaX1PgETJ+SpNnx2PRRapJ/oRSXM4VO5OGYGSjrxbKPVFVhB3l2OCbLCk329N8qyAtsJjSjvVBWzEug==", + "dev": true, + "dependencies": { + "json-buffer": "3.0.1" + } + }, "node_modules/kind-of": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", @@ -3587,6 +3594,18 @@ "node": ">=8.6" } }, + "node_modules/mime": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", + "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", + "dev": true, + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4.0.0" + } + }, "node_modules/mime-db": { "version": "1.52.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", @@ -3609,15 +3628,12 @@ } }, "node_modules/mimic-fn": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", - "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", "dev": true, "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=6" } }, "node_modules/minimatch": { @@ -3696,6 +3712,77 @@ "url": "https://opencollective.com/mochajs" } }, + "node_modules/mocha-allure-reporter": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/mocha-allure-reporter/-/mocha-allure-reporter-1.4.0.tgz", + "integrity": "sha512-Iqp4qxE9CBbikq3JjST9FY2JYFHtyoXb3i4u0g+h5KZBtjn4Rkb5ROfLeZLsnIf8RPK5nKcFGaH6DKrk7/fmYw==", + "dev": true, + "dependencies": { + "allure-js-commons": "^1.3.2" + }, + "peerDependencies": { + "mocha": "*" + } + }, + "node_modules/mocha-allure-reporter/node_modules/allure-js-commons": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/allure-js-commons/-/allure-js-commons-1.3.2.tgz", + "integrity": "sha512-FTmoqP36ZjHFT4iLdYamyCFhyj1jqD6BIdiZ5pBlyafDJrFRV76XIXNxwRqbHpSw40o1vHzYi4vGpmREnhnHVw==", + "dev": true, + "dependencies": { + "file-type": "^7.7.1", + "fs-extra": "^6.0.1", + "js2xmlparser": "^3.0.0", + "mime": "^2.3.1", + "object-assign": "^4.1.1", + "uuid": "^3.0.0" + } + }, + "node_modules/mocha-allure-reporter/node_modules/fs-extra": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-6.0.1.tgz", + "integrity": "sha512-GnyIkKhhzXZUWFCaJzvyDLEEgDkPfb4/TPvJCJVuS8MWZgoSsErf++QpiAlDnKFcqhRlm+tIOcencCjyJE6ZCA==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + }, + "node_modules/mocha-allure-reporter/node_modules/jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "dev": true, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/mocha-allure-reporter/node_modules/universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "dev": true, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/mocha-multi-reporters": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/mocha-multi-reporters/-/mocha-multi-reporters-1.5.1.tgz", + "integrity": "sha512-Yb4QJOaGLIcmB0VY7Wif5AjvLMUFAdV57D2TWEva1Y0kU/3LjKpeRVmlMIfuO1SVbauve459kgtIizADqxMWPg==", + "dev": true, + "dependencies": { + "debug": "^4.1.1", + "lodash": "^4.17.15" + }, + "engines": { + "node": ">=6.0.0" + }, + "peerDependencies": { + "mocha": ">=3.1.2" + } + }, "node_modules/mocha/node_modules/debug": { "version": "4.3.3", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", @@ -3837,6 +3924,15 @@ "node": "*" } }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", @@ -3847,15 +3943,15 @@ } }, "node_modules/onetime": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", - "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", "dev": true, "dependencies": { - "mimic-fn": "^4.0.0" + "mimic-fn": "^2.1.0" }, "engines": { - "node": ">=12" + "node": ">=6" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -4053,9 +4149,9 @@ } }, "node_modules/prettier": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.0.2.tgz", - "integrity": "sha512-o2YR9qtniXvwEZlOKbveKfDQVyqxbEIWn48Z8m3ZJjBjcCmUy3xZGIv+7AkaeuaTr6yPXJjwv07ZWlsWbEy1rQ==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.0.3.tgz", + "integrity": "sha512-L/4pUDMxcNa8R/EthV08Zt42WBO4h1rarVtK0K+QJG0X187OLo7l699jWw0GKuwzkPQ//jMFA/8Xm6Fh3J/DAg==", "dev": true, "bin": { "prettier": "bin/prettier.cjs" @@ -4094,6 +4190,15 @@ "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", "dev": true }, + "node_modules/properties": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/properties/-/properties-1.2.1.tgz", + "integrity": "sha512-qYNxyMj1JeW54i/EWEFsM1cVwxJbtgPp8+0Wg9XjNaK6VE/c4oRi6PNu5p7w1mNXEIQIjV5Wwn8v8Gz82/QzdQ==", + "dev": true, + "engines": { + "node": ">=0.10" + } + }, "node_modules/proxy-from-env": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", @@ -4287,9 +4392,9 @@ } }, "node_modules/resolve": { - "version": "1.22.4", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.4.tgz", - "integrity": "sha512-PXNdCiPqDqeUou+w1C2eTQbNfxKSuMxqTCuvlmmMsk1NWHL5fRrhY6Pl0qEYYc6+QqGClco1Qj8XnjPego4wfg==", + "version": "1.22.6", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.6.tgz", + "integrity": "sha512-njhxM7mV12JfufShqGy3Rz8j11RPdLy4xi15UurGJeoHLfJpVXKdh3ueuOqbYUcDZnffr6X739JBo5LzyahEsw==", "dev": true, "dependencies": { "is-core-module": "^2.13.0", @@ -4552,9 +4657,9 @@ } }, "node_modules/spdx-license-ids": { - "version": "3.0.13", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.13.tgz", - "integrity": "sha512-XkD+zwiqXHikFZm4AX/7JSCXA98U5Db4AFd5XUg/+9UNtnH75+Z9KxtpYiJZx36mUDVOwH83pl7yvCer6ewM3w==", + "version": "3.0.15", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.15.tgz", + "integrity": "sha512-lpT8hSQp9jAKp9mhtBU4Xjon8LPGBvLIuBiSVhMEtmLecTh2mO0tlqrAMp47tBXzMr13NJMQ2lf7RpQGLJ3HsQ==", "dev": true }, "node_modules/sprintf-js": { @@ -4631,15 +4736,12 @@ } }, "node_modules/strip-final-newline": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", - "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", "dev": true, "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=6" } }, "node_modules/strip-json-comments": { @@ -4809,6 +4911,18 @@ "node": ">=0.10.0" } }, + "node_modules/ts-api-utils": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.0.3.tgz", + "integrity": "sha512-wNMeqtMz5NtwpT/UZGY5alT+VoKdSsOOP/kqHFcUW1P/VRhH2wJ48+DN2WwUliNbQ976ETwDL0Ifd2VVvgonvg==", + "dev": true, + "engines": { + "node": ">=16.13.0" + }, + "peerDependencies": { + "typescript": ">=4.2.0" + } + }, "node_modules/ts-essentials": { "version": "9.4.0", "resolved": "https://registry.npmjs.org/ts-essentials/-/ts-essentials-9.4.0.tgz", @@ -5260,9 +5374,9 @@ "dev": true }, "node_modules/ws": { - "version": "8.13.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.13.0.tgz", - "integrity": "sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==", + "version": "8.14.2", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.14.2.tgz", + "integrity": "sha512-wEBG1ftX4jcglPxgFCMJmZ2PLtSbJ2Peg6TmpJFTbe9GZYOQCDPdMYu/Tm0/bGZkw8paZnJY45J4K2PZrLYq8g==", "dev": true, "engines": { "node": ">=10.0.0" @@ -5280,6 +5394,12 @@ } } }, + "node_modules/xmlcreate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/xmlcreate/-/xmlcreate-1.0.2.tgz", + "integrity": "sha512-Mbe56Dvj00onbnSo9J0qj/XlY5bfN9KidsOnpd5tRCsR3ekB3hyyNU9fGrTdqNT5ZNvv4BsA2TcQlignsZyVcw==", + "dev": true + }, "node_modules/y18n": { "version": "5.0.8", "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", @@ -5296,9 +5416,9 @@ "dev": true }, "node_modules/yaml": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.1.tgz", - "integrity": "sha512-2eHWfjaoXgTBC2jNM1LRef62VQa0umtvRiDSk6HSzW7RvS5YtkabJrwYLLEKWBc8a5U2PTSCs+dJjUTJdlHsWQ==", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.2.tgz", + "integrity": "sha512-N/lyzTPaJasoDmfV7YTrYCI0G/3ivm/9wdG0aHuheKowWQwGTsK0Eoiw6utmzAnI6pkJa0DUVygvp3spqqEKXg==", "dev": true, "engines": { "node": ">= 14" diff --git a/tests/e2e/package.json b/tests/e2e/package.json index cdac89c0ad6..6d15718c972 100644 --- a/tests/e2e/package.json +++ b/tests/e2e/package.json @@ -1,6 +1,6 @@ { "name": "@eclipse-che/che-e2e", - "version": "7.75.0-next", + "version": "7.75.0-SNAPSHOT", "description": "", "main": "dist/index.js", "scripts": { @@ -9,6 +9,7 @@ "tsc": "rm -rf ./dist && ./configs/sh-scripts/generateIndex.sh && tsc -p .", "test": "./configs/sh-scripts/initDefaultValues.sh npm run lint && npm run tsc && export USERSTORY=$USERSTORY && mocha --config dist/configs/mocharc.js", "driver-less-test": "export TS_USE_WEB_DRIVER_FOR_TEST=false && npm run test", + "open-allure-dasboard": "allure generate .allure-results --clean -o .allure-report && allure open .allure-report", "cleanup-docker": "if [ $(docker ps -a | grep -c selenium-e2e) -gt 0 ]; then docker rm -f $(docker ps --filter \"name=selenium-e2e\" -aq); fi;", "test-docker": "npm run cleanup-docker && docker run -it --shm-size=2g -p 5920:5920 --name selenium-e2e -e TS_SELENIUM_BASE_URL=$TS_SELENIUM_BASE_URL eclipse/che-e2e:nightly", "test-docker-mount-e2e": "npm run cleanup-docker && docker run -it --shm-size=2g -p 5920:5920 --name selenium-e2e -e TS_SELENIUM_BASE_URL=$TS_SELENIUM_BASE_URL -v $(pwd):/tmp/e2e:Z eclipse/che-e2e:nightly", @@ -19,6 +20,12 @@ "license": "ISC", "devDependencies": { "@eclipse-che/che-devworkspace-generator": "next", + "allure-decorators": "^2.4.0", + "allure-js-commons": "^2.4.0", + "allure-mocha": "^2.4.0", + "mocha-multi-reporters": "^1.5.1", + "allure-commandline": "^2.22.1", + "mocha-allure-reporter": "^1.4.0", "@types/chai": "^4.3.4", "@types/clone-deep": "^4.0.1", "@types/mocha": "5.2.6", diff --git a/tests/e2e/pageobjects/ide/CheCodeLocatorLoader.ts b/tests/e2e/pageobjects/ide/CheCodeLocatorLoader.ts index aa8eb48508c..51a7203e3b9 100644 --- a/tests/e2e/pageobjects/ide/CheCodeLocatorLoader.ts +++ b/tests/e2e/pageobjects/ide/CheCodeLocatorLoader.ts @@ -39,7 +39,7 @@ export class CheCodeLocatorLoader extends LocatorLoader { locators: { WelcomeContent: { text: By.xpath('//*[@class="dialog-message-text" and contains(text(), "trust")]'), - button: By.xpath('//a[contains(., "trust")]') + button: By.xpath('//div[@class="monaco-dialog-box"]//a[@class="monaco-button monaco-text-button"]') } }, extras: { diff --git a/tests/e2e/specs/MochaHooks.ts b/tests/e2e/specs/MochaHooks.ts index 995633dce33..2d09426fda1 100644 --- a/tests/e2e/specs/MochaHooks.ts +++ b/tests/e2e/specs/MochaHooks.ts @@ -18,15 +18,17 @@ import { e2eContainer } from '../configs/inversify.config'; import { DriverHelper } from '../utils/DriverHelper'; import { ITestWorkspaceUtil } from '../utils/workspace/ITestWorkspaceUtil'; import { Logger } from '../utils/Logger'; +import { allure } from 'allure-mocha/runtime'; import { BASE_TEST_CONSTANTS } from '../constants/BASE_TEST_CONSTANTS'; -import { CHROME_DRIVER_CONSTANTS } from '../constants/CHROME_DRIVER_CONSTANTS'; import { MONACO_CONSTANTS } from '../constants/MONACO_CONSTANTS'; +import { CHROME_DRIVER_CONSTANTS } from '../constants/CHROME_DRIVER_CONSTANTS'; const driverHelper: DriverHelper = e2eContainer.get(CLASSES.DriverHelper); let latestWorkspace: string = ''; export function registerRunningWorkspace(workspaceName: string): void { - Logger.debug(`with workspaceName:${workspaceName}`); + workspaceName !== '' ? Logger.debug(`with workspaceName:${workspaceName}`) : Logger.debug('delete workspace name'); + latestWorkspace = workspaceName; } @@ -63,6 +65,16 @@ exports.mochaHooks = { } ], afterEach: [ + async function (this: Mocha.Context): Promise { + if (this.currentTest?.state === 'failed') { + try { + const screenshot: string = await driverHelper.getDriver().takeScreenshot(); + allure.attachment('Screenshot', Buffer.from(screenshot, 'base64'), 'image/png'); + } catch (e) { + allure.attachment('No screenshot', 'Could not take a screenshot', 'text/plain'); + } + } + }, // stop and remove running workspace function deleteWorkspaceOnFailedTest(this: Mocha.Context): void { if (this.currentTest?.state === 'failed') { @@ -75,6 +87,7 @@ exports.mochaHooks = { } ], afterAll: [ + // stop and remove running workspace async function stopTheDriver(): Promise { if (!BASE_TEST_CONSTANTS.TS_DEBUG_MODE && CHROME_DRIVER_CONSTANTS.TS_USE_WEB_DRIVER_FOR_TEST) { // ensure that fired events done diff --git a/tests/e2e/specs/dashboard-samples/RecommendedExtensions.spec.ts b/tests/e2e/specs/dashboard-samples/RecommendedExtensions.spec.ts index 91ac787c26f..a60ee7427b0 100644 --- a/tests/e2e/specs/dashboard-samples/RecommendedExtensions.spec.ts +++ b/tests/e2e/specs/dashboard-samples/RecommendedExtensions.spec.ts @@ -16,10 +16,8 @@ import { ExtensionsViewItem, ExtensionsViewSection, Locators, - ModalDialog, SideBarView, TextEditor, - ViewItem, ViewSection } from 'monaco-page-objects'; import { registerRunningWorkspace } from '../MochaHooks'; @@ -35,36 +33,36 @@ import { expect } from 'chai'; import { TIMEOUT_CONSTANTS } from '../../constants/TIMEOUT_CONSTANTS'; import { BrowserTabsUtil } from '../../utils/BrowserTabsUtil'; import { PLUGIN_TEST_CONSTANTS } from '../../constants/PLUGIN_TEST_CONSTANTS'; -import { BASE_TEST_CONSTANTS } from '../../constants/BASE_TEST_CONSTANTS'; const samples: string[] = PLUGIN_TEST_CONSTANTS.TS_SAMPLE_LIST.split(','); -suite(`Check if recommended extensions installed for ${samples}`, function (): void { - const projectAndFileTests: ProjectAndFileTests = e2eContainer.get(CLASSES.ProjectAndFileTests); - const workspaceHandlingTests: WorkspaceHandlingTests = e2eContainer.get(CLASSES.WorkspaceHandlingTests); - const loginTests: LoginTests = e2eContainer.get(CLASSES.LoginTests); - const driverHelper: DriverHelper = e2eContainer.get(CLASSES.DriverHelper); - const browserTabsUtil: BrowserTabsUtil = e2eContainer.get(CLASSES.BrowserTabsUtil); - const cheCodeLocatorLoader: CheCodeLocatorLoader = e2eContainer.get(CLASSES.CheCodeLocatorLoader); - const webCheCodeLocators: Locators = cheCodeLocatorLoader.webCheCodeLocators; +for (const sample of samples) { + suite(`Check if recommended extensions installed for ${sample}`, function (): void { + const projectAndFileTests: ProjectAndFileTests = e2eContainer.get(CLASSES.ProjectAndFileTests); + const workspaceHandlingTests: WorkspaceHandlingTests = e2eContainer.get(CLASSES.WorkspaceHandlingTests); + const loginTests: LoginTests = e2eContainer.get(CLASSES.LoginTests); + const driverHelper: DriverHelper = e2eContainer.get(CLASSES.DriverHelper); + const browserTabsUtil: BrowserTabsUtil = e2eContainer.get(CLASSES.BrowserTabsUtil); + const cheCodeLocatorLoader: CheCodeLocatorLoader = e2eContainer.get(CLASSES.CheCodeLocatorLoader); + const webCheCodeLocators: Locators = cheCodeLocatorLoader.webCheCodeLocators; - let projectSection: ViewSection; - let extensionsView: SideBarView | undefined; - let extensionSection: ExtensionsViewSection; + let projectSection: ViewSection; + let extensionSection: ExtensionsViewSection; + let extensionsView: SideBarView | undefined; - const extensionsListFileName: string = 'extensions.json'; - let recommendedExtensions: any = { - recommendations: [] - }; + const [pathToExtensionsListFileName, extensionsListFileName]: string[] = ['.vscode', 'extensions.json']; + let recommendedExtensions: any = { + recommendations: [] + }; - loginTests.loginIntoChe(); + loginTests.loginIntoChe(); - for (const sample of samples) { test(`Create and open new workspace, stack:${sample}`, async function (): Promise { await workspaceHandlingTests.createAndOpenWorkspace(sample); }); test('Obtain workspace name from workspace loader page', async function (): Promise { await workspaceHandlingTests.obtainWorkspaceNameFromStartingPage(); + expect(WorkspaceHandlingTests.getWorkspaceName(), 'Workspace name was not fetched from the loading page').not.undefined; }); test('Registering the running workspace', function (): void { @@ -75,31 +73,20 @@ suite(`Check if recommended extensions installed for ${samples}`, function (): v await projectAndFileTests.waitWorkspaceReadinessForCheCodeEditor(); }); - test('Wait until the project will be imported and accept it as trusted one', async function (): Promise { - [projectSection] = await new SideBarView().getContent().getSections(); - const label: string = BASE_TEST_CONSTANTS.TS_SELENIUM_PROJECT_ROOT_FILE_NAME; - Logger.debug(`projectSection.findItem: find ${label}`); - const isFileImported: ViewItem | undefined = await projectSection.findItem(label); - expect(isFileImported).not.eqls(undefined); - try { - const buttonYesITrustTheAuthors: string = 'Yes, I trust the authors'; - await driverHelper.waitVisibility( - webCheCodeLocators.WelcomeContent.button, - TIMEOUT_CONSTANTS.TS_DIALOG_WINDOW_DEFAULT_TIMEOUT - ); - const trustedProjectDialog: ModalDialog = new ModalDialog(); - Logger.debug(`trustedProjectDialog.pushButton: "${buttonYesITrustTheAuthors}"`); - await trustedProjectDialog.pushButton(buttonYesITrustTheAuthors); - } catch (e) { - Logger.debug(`Welcome modal dialog was not shown: ${e}`); - } + test('Check the project files were imported', async function (): Promise { + const [projectSection]: ViewSection[] = await new SideBarView().getContent().getSections(); + expect(await projectSection.findItem(pathToExtensionsListFileName), 'Files not imported').not.undefined; + }); + + test('Accept the project as a trusted one', async function (): Promise { + await projectAndFileTests.performTrustAuthorDialog(); }); test(`Get recommended extensions list from ${extensionsListFileName}`, async function (): Promise { Logger.debug('projectSection.findItem(item))?.select(): expand .vscode folder and open extensions.json.'); - await (await projectSection.findItem('.vscode'))?.select(); - // time to expand project tree - await driverHelper.wait(TIMEOUT_CONSTANTS.TS_EXPAND_PROJECT_TREE_ITEM_TIMEOUT); + [projectSection] = await new SideBarView().getContent().getSections(); + await (await projectSection.findItem(pathToExtensionsListFileName))?.select(); + await driverHelper.waitVisibility(webCheCodeLocators.DefaultTreeItem.ctor(extensionsListFileName)); await (await projectSection.findItem(extensionsListFileName))?.select(); Logger.debug(`EditorView().openEditor(${extensionsListFileName})`); const editor: TextEditor = (await new EditorView().openEditor(extensionsListFileName)) as TextEditor; @@ -113,69 +100,77 @@ suite(`Check if recommended extensions installed for ${samples}`, function (): v return { publisher, name }; } ); - Logger.info(`Recommended extension for this workspace:\n${JSON.stringify(recommendedExtensions.recommendations)}.`); + Logger.debug(`Recommended extension for this workspace:\n${JSON.stringify(recommendedExtensions.recommendations)}.`); + expect(recommendedExtensions.recommendations, 'Recommendations not found').not.empty; }); test('Open "Extensions" view section', async function (): Promise { Logger.debug('ActivityBar().getViewControl("Extensions"))?.openView(): open Extensions view.'); extensionsView = await (await new ActivityBar().getViewControl('Extensions'))?.openView(); + expect(extensionsView, 'Can`t find Extension section').not.undefined; }); test('Let extensions complete installation', async function (): Promise { - Logger.info( + this.test?.retries(0); + Logger.debug( `Time for extensions installation TimeoutConstants.TS_COMMON_PLUGIN_TEST_TIMEOUT=${TIMEOUT_CONSTANTS.TS_COMMON_PLUGIN_TEST_TIMEOUT}` ); await driverHelper.wait(TIMEOUT_CONSTANTS.TS_COMMON_PLUGIN_TEST_TIMEOUT); }); test('Check if extensions are installed and enabled', async function (): Promise { - this.retries(10); + // timeout 15 seconds per extensions + this.timeout(TIMEOUT_CONSTANTS.TS_FIND_EXTENSION_TEST_TIMEOUT * recommendedExtensions.recommendations.length); Logger.debug('ActivityBar().getViewControl("Extensions"))?.openView(): open Extensions view.'); extensionsView = await (await new ActivityBar().getViewControl('Extensions'))?.openView(); Logger.debug('extensionsView?.getContent().getSections(): get current section.'); [extensionSection] = (await extensionsView?.getContent().getSections()) as ExtensionsViewSection[]; - await driverHelper.waitAllPresence( + expect(extensionSection, 'Can`t find Extension section').not.undefined; + await driverHelper.waitVisibility( webCheCodeLocators.ExtensionsViewSection.itemTitle, TIMEOUT_CONSTANTS.TS_EDITOR_TAB_INTERACTION_TIMEOUT ); for (const extension of recommendedExtensions.recommendations) { - Logger.info(`Check if ${JSON.stringify(extension)} are installed.`); - Logger.debug(`extensionSection.findItem(${extension.name}).`); await extensionSection.findItem(extension.name); - // check if extension require reload the page - if (await driverHelper.isVisible((webCheCodeLocators.ExtensionsViewSection as any).requireReloadButton)) { - Logger.debug('Extension require reload the editor. Refreshing the page..'); + const isReloadRequired: boolean = await driverHelper.isVisible( + (webCheCodeLocators.ExtensionsViewSection as any).requireReloadButton + ); + Logger.debug(`Is extensions require reload the editor: ${isReloadRequired}`); + + if (isReloadRequired) { + Logger.debug('Refreshing the page..'); await browserTabsUtil.refreshPage(); await projectAndFileTests.waitWorkspaceReadinessForCheCodeEditor(); - Logger.debug('ActivityBar().getViewControl("Extensions"))?.openView(): open Extensions view.'); + await driverHelper.waitVisibility( + webCheCodeLocators.ActivityBar.viewContainer, + TIMEOUT_CONSTANTS.TS_EDITOR_TAB_INTERACTION_TIMEOUT + ); + Logger.debug('ActivityBar().getViewControl("Extensions"))?.openView(): reopen Extensions view.'); extensionsView = await (await new ActivityBar().getViewControl('Extensions'))?.openView(); - Logger.debug('extensionsView?.getContent().getSections(): get current section.'); - [extensionSection] = (await extensionsView?.getContent().getSections()) as ExtensionsViewSection[]; - await driverHelper.waitAllPresence( + await driverHelper.waitVisibility( webCheCodeLocators.ExtensionsViewSection.itemTitle, TIMEOUT_CONSTANTS.TS_EDITOR_TAB_INTERACTION_TIMEOUT ); + expect(extensionsView, 'Can`t find Extension View section').not.undefined; + [extensionSection] = (await extensionsView?.getContent().getSections()) as ExtensionsViewSection[]; + expect(extensionSection, 'Can`t find Extension section').not.undefined; Logger.debug(`extensionSection.findItem(${extension.name}).`); await extensionSection.findItem(extension.name); } - Logger.debug('extensionsView?.getContent().getSections(): switch to marketplace section.'); + Logger.debug('extensionsView.getContent().getSections(): switch to marketplace section.'); const [marketplaceSection]: ExtensionsViewSection[] = (await extensionsView ?.getContent() .getSections()) as ExtensionsViewSection[]; - await driverHelper.waitVisibility( - webCheCodeLocators.ExtensionsViewSection.items, - TIMEOUT_CONSTANTS.TS_EDITOR_TAB_INTERACTION_TIMEOUT - ); - Logger.debug('marketplaceSection.getVisibleItems(): get all found items.'); + Logger.debug('marketplaceSection.getVisibleItems()'); const allFinedItems: ExtensionsViewItem[] = await marketplaceSection.getVisibleItems(); - - let itemWithRightNameAndPublisher: ExtensionsViewItem | undefined; + expect(allFinedItems, 'Extensions not found').not.empty; + let itemWithRightNameAndPublisher: ExtensionsViewItem | undefined = undefined; for (const item of allFinedItems) { Logger.debug(`Try to find extension published by ${extension.publisher}.`); if ((await item.getAuthor()) === extension.publisher) { @@ -183,16 +178,14 @@ suite(`Check if recommended extensions installed for ${samples}`, function (): v Logger.debug(`Extension was found: ${await itemWithRightNameAndPublisher?.getTitle()}`); break; } - if (itemWithRightNameAndPublisher === undefined) { - Logger.error(`Extension with publisher as ${extension.publisher} was not found.`); - } + expect(itemWithRightNameAndPublisher, `Extension ${extension.name} not found`).not.undefined; } Logger.debug('itemWithRightNameAndPublisher?.isInstalled()'); const isInstalled: boolean = (await itemWithRightNameAndPublisher?.isInstalled()) as boolean; Logger.debug(`itemWithRightNameAndPublisher?.isInstalled(): ${isInstalled}.`); - expect(isInstalled).eqls(true); + expect(isInstalled, `Extension ${extension.name} not installed`).is.true; Logger.debug('itemWithRightNameAndPublisher.manage(): get context menu.'); const extensionManageMenu: ContextMenu = await (itemWithRightNameAndPublisher as ExtensionsViewItem).manage(); @@ -200,13 +193,13 @@ suite(`Check if recommended extensions installed for ${samples}`, function (): v Logger.debug('extensionManageMenu.getItems(): get menu items.'); const extensionMenuItems: ContextMenuItem[] = await extensionManageMenu.getItems(); let extensionMenuItemLabels: string = ''; + Logger.trace('extensionMenuItems -> item.getLabel(): get menu items names.'); for (const item of extensionMenuItems) { - Logger.trace('extensionMenuItems -> item.getLabel(): get menu items names.'); extensionMenuItemLabels += (await item.getLabel()) + ' '; } Logger.debug(`extensionMenuItemLabels: ${extensionMenuItemLabels}.`); - expect(extensionMenuItemLabels).contains('Disable').and.not.contains('Enable'); + expect(extensionMenuItemLabels, `Extension ${extension.name} not enabled`).contains('Disable').and.not.contains('Enable'); } }); @@ -218,7 +211,7 @@ suite(`Check if recommended extensions installed for ${samples}`, function (): v test('Delete the workspace', async function (): Promise { await workspaceHandlingTests.removeWorkspace(WorkspaceHandlingTests.getWorkspaceName()); }); - } - loginTests.logoutFromChe(); -}); + loginTests.logoutFromChe(); + }); +} diff --git a/tests/e2e/specs/factory/Factory.spec.ts b/tests/e2e/specs/factory/Factory.spec.ts index 45b6d527065..ba5b4ad0d63 100644 --- a/tests/e2e/specs/factory/Factory.spec.ts +++ b/tests/e2e/specs/factory/Factory.spec.ts @@ -16,7 +16,6 @@ import { ContextMenu, EditorView, Locators, - ModalDialog, NewScmView, SideBarView, SingleScmProvider, @@ -104,11 +103,7 @@ suite( }); test('Accept the project as a trusted one', async function (): Promise { - const buttonYesITrustTheAuthors: string = 'Yes, I trust the authors'; - const trustedProjectDialog: ModalDialog = new ModalDialog(); - await driverHelper.waitVisibility(webCheCodeLocators.WelcomeContent.button); - Logger.debug(`trustedProjectDialog.pushButton: "${buttonYesITrustTheAuthors}"`); - await trustedProjectDialog.pushButton(buttonYesITrustTheAuthors); + await projectAndFileTests.performTrustAuthorDialog(); }); test('Make changes to the file', async function (): Promise { diff --git a/tests/e2e/specs/factory/NoSetupRepoFactory.spec.ts b/tests/e2e/specs/factory/NoSetupRepoFactory.spec.ts index 7a756f5f545..36a5314c51e 100644 --- a/tests/e2e/specs/factory/NoSetupRepoFactory.spec.ts +++ b/tests/e2e/specs/factory/NoSetupRepoFactory.spec.ts @@ -14,7 +14,6 @@ import { ActivityBar, ContextMenu, EditorView, - error, InputBox, Locators, ModalDialog, @@ -37,13 +36,11 @@ import { ProjectAndFileTests } from '../../tests-library/ProjectAndFileTests'; import { DriverHelper } from '../../utils/DriverHelper'; import { Dashboard } from '../../pageobjects/dashboard/Dashboard'; import { Workspaces } from '../../pageobjects/dashboard/Workspaces'; -import { TIMEOUT_CONSTANTS } from '../../constants/TIMEOUT_CONSTANTS'; import { Logger } from '../../utils/Logger'; import { LoginTests } from '../../tests-library/LoginTests'; import { FACTORY_TEST_CONSTANTS, GitProviderType } from '../../constants/FACTORY_TEST_CONSTANTS'; import { OAUTH_CONSTANTS } from '../../constants/OAUTH_CONSTANTS'; import { BASE_TEST_CONSTANTS } from '../../constants/BASE_TEST_CONSTANTS'; -import WebDriverError = error.WebDriverError; suite( `Create a workspace via launching a factory from the ${FACTORY_TEST_CONSTANTS.TS_SELENIUM_FACTORY_GIT_PROVIDER} repository without OAuth setup`, @@ -124,29 +121,7 @@ suite( }); test('Accept the project as a trusted one', async function (): Promise { - // click somewhere to trigger "Welcome Content" dialog - try { - await driverHelper.waitAndClick(webCheCodeLocators.Workbench.notificationItem); - } catch (e) { - Logger.info(`Click on ${webCheCodeLocators.Workbench.notificationItem} to get "Welcome Content" dialog ${e as string}`); - } - // "Welcome Content" dialog can be shown before of after dialog with an error for private repo - try { - const buttonYesITrustTheAuthors: string = 'Yes, I trust the authors'; - await driverHelper.waitVisibility( - webCheCodeLocators.WelcomeContent.text, - TIMEOUT_CONSTANTS.TS_SELENIUM_CLICK_ON_VISIBLE_ITEM - ); - const welcomeContentDialog: ModalDialog = new ModalDialog(); - Logger.debug(`trustedProjectDialog.pushButton: "${buttonYesITrustTheAuthors}"`); - await welcomeContentDialog.pushButton(buttonYesITrustTheAuthors); - await driverHelper.waitDisappearance(webCheCodeLocators.WelcomeContent.text); - } catch (e) { - Logger.info(`"Accept the project as a trusted one" dialog was not shown firstly for "${isPrivateRepo}"`); - if (!FACTORY_TEST_CONSTANTS.TS_SELENIUM_IS_PRIVATE_FACTORY_GIT_REPO) { - throw new WebDriverError(e as string); - } - } + await projectAndFileTests.performTrustAuthorDialog(); }); test('Check if the project files were imported', async function (): Promise { diff --git a/tests/e2e/specs/factory/RefusedOAuthFactory.spec.ts b/tests/e2e/specs/factory/RefusedOAuthFactory.spec.ts index 2836fd756ff..1fba8c181ff 100644 --- a/tests/e2e/specs/factory/RefusedOAuthFactory.spec.ts +++ b/tests/e2e/specs/factory/RefusedOAuthFactory.spec.ts @@ -14,7 +14,6 @@ import { ActivityBar, ContextMenu, EditorView, - error, InputBox, Locators, ModalDialog, @@ -37,12 +36,10 @@ import { DriverHelper } from '../../utils/DriverHelper'; import { OauthPage } from '../../pageobjects/git-providers/OauthPage'; import { StringUtil } from '../../utils/StringUtil'; import { Logger } from '../../utils/Logger'; -import { TIMEOUT_CONSTANTS } from '../../constants/TIMEOUT_CONSTANTS'; import { LoginTests } from '../../tests-library/LoginTests'; import { OAUTH_CONSTANTS } from '../../constants/OAUTH_CONSTANTS'; import { BASE_TEST_CONSTANTS } from '../../constants/BASE_TEST_CONSTANTS'; import { FACTORY_TEST_CONSTANTS, GitProviderType } from '../../constants/FACTORY_TEST_CONSTANTS'; -import WebDriverError = error.WebDriverError; suite( `Create a workspace via launching a factory from the ${FACTORY_TEST_CONSTANTS.TS_SELENIUM_FACTORY_GIT_PROVIDER} repository and deny the access`, @@ -107,29 +104,7 @@ suite( }); test('Accept the project as a trusted one', async function (): Promise { - // click somewhere to trigger "Welcome Content" dialog - try { - await driverHelper.waitAndClick(webCheCodeLocators.Workbench.notificationItem); - } catch (e) { - Logger.info(`Click on ${webCheCodeLocators.Workbench.notificationItem} to get "Welcome Content" dialog ${e as string}`); - } - // "Welcome Content" dialog can be shown before of after dialog with an error for private repo - try { - const buttonYesITrustTheAuthors: string = 'Yes, I trust the authors'; - await driverHelper.waitVisibility( - webCheCodeLocators.WelcomeContent.text, - TIMEOUT_CONSTANTS.TS_SELENIUM_CLICK_ON_VISIBLE_ITEM - ); - const welcomeContentDialog: ModalDialog = new ModalDialog(); - Logger.debug(`trustedProjectDialog.pushButton: "${buttonYesITrustTheAuthors}"`); - await welcomeContentDialog.pushButton(buttonYesITrustTheAuthors); - await driverHelper.waitDisappearance(webCheCodeLocators.WelcomeContent.text); - } catch (e) { - Logger.info(`"Accept the project as a trusted one" dialog was not shown firstly for "${isPrivateRepo}"`); - if (!FACTORY_TEST_CONSTANTS.TS_SELENIUM_IS_PRIVATE_FACTORY_GIT_REPO) { - throw new WebDriverError(e as string); - } - } + await projectAndFileTests.performTrustAuthorDialog(); }); if (FACTORY_TEST_CONSTANTS.TS_SELENIUM_IS_PRIVATE_FACTORY_GIT_REPO) { diff --git a/tests/e2e/tests-library/ProjectAndFileTests.ts b/tests/e2e/tests-library/ProjectAndFileTests.ts index 15cfb72f8db..e437e886653 100644 --- a/tests/e2e/tests-library/ProjectAndFileTests.ts +++ b/tests/e2e/tests-library/ProjectAndFileTests.ts @@ -10,30 +10,29 @@ import 'reflect-metadata'; import { inject, injectable } from 'inversify'; -import { By, until } from 'selenium-webdriver'; import { DriverHelper } from '../utils/DriverHelper'; import { CLASSES } from '../configs/inversify.types'; import { Logger } from '../utils/Logger'; import { TIMEOUT_CONSTANTS } from '../constants/TIMEOUT_CONSTANTS'; -import { Locators, ModalDialog } from 'monaco-page-objects'; import { CheCodeLocatorLoader } from '../pageobjects/ide/CheCodeLocatorLoader'; -const webCheCodeLocators: Locators = new CheCodeLocatorLoader().webCheCodeLocators; - @injectable() export class ProjectAndFileTests { constructor( @inject(CLASSES.DriverHelper) - private readonly driverHelper: DriverHelper + private readonly driverHelper: DriverHelper, + @inject(CLASSES.CheCodeLocatorLoader) + private readonly cheCodeLocatorLoader: CheCodeLocatorLoader ) {} async waitWorkspaceReadinessForCheCodeEditor(): Promise { Logger.debug('waiting for editor.'); try { const start: number = new Date().getTime(); - await this.driverHelper - .getDriver() - .wait(until.elementLocated(By.className('monaco-workbench')), TIMEOUT_CONSTANTS.TS_SELENIUM_START_WORKSPACE_TIMEOUT); + await this.driverHelper.waitVisibility( + this.cheCodeLocatorLoader.webCheCodeLocators.Workbench.constructor, + TIMEOUT_CONSTANTS.TS_SELENIUM_START_WORKSPACE_TIMEOUT + ); const end: number = new Date().getTime(); Logger.debug(`editor was opened in ${end - start} seconds.`); } catch (err) { @@ -43,17 +42,20 @@ export class ProjectAndFileTests { } async performTrustAuthorDialog(): Promise { + Logger.debug(); + + await this.driverHelper.waitAndClick( + this.cheCodeLocatorLoader.webCheCodeLocators.WelcomeContent.button, + TIMEOUT_CONSTANTS.TS_DIALOG_WINDOW_DEFAULT_TIMEOUT + ); + try { - const buttonYesITrustTheAuthors: string = 'Yes, I trust the authors'; - await this.driverHelper.waitVisibility( - webCheCodeLocators.WelcomeContent.button, + await this.driverHelper.waitAndClick( + this.cheCodeLocatorLoader.webCheCodeLocators.WelcomeContent.button, TIMEOUT_CONSTANTS.TS_DIALOG_WINDOW_DEFAULT_TIMEOUT ); - const trustedProjectDialog: ModalDialog = new ModalDialog(); - Logger.debug(`trustedProjectDialog.pushButton: "${buttonYesITrustTheAuthors}"`); - await trustedProjectDialog.pushButton(buttonYesITrustTheAuthors); } catch (e) { - Logger.debug(`Welcome modal dialog was not shown: ${e}`); + Logger.info('Second welcome content dialog box was not shown'); } } } diff --git a/tests/e2e/tests-library/WorkspaceHandlingTests.ts b/tests/e2e/tests-library/WorkspaceHandlingTests.ts index c3bf362febe..99f16a5259c 100644 --- a/tests/e2e/tests-library/WorkspaceHandlingTests.ts +++ b/tests/e2e/tests-library/WorkspaceHandlingTests.ts @@ -81,7 +81,7 @@ export class WorkspaceHandlingTests { } async obtainWorkspaceNameFromStartingPage(): Promise { - const timeout: number = TIMEOUT_CONSTANTS.TS_IDE_LOAD_TIMEOUT; + const timeout: number = TIMEOUT_CONSTANTS.TS_SELENIUM_START_WORKSPACE_TIMEOUT; const polling: number = TIMEOUT_CONSTANTS.TS_SELENIUM_DEFAULT_POLLING; const attempts: number = Math.ceil(timeout / polling); diff --git a/tests/e2e/tsconfig.json b/tests/e2e/tsconfig.json index e7d4ff8cd2f..ece61f742c0 100644 --- a/tests/e2e/tsconfig.json +++ b/tests/e2e/tsconfig.json @@ -1,12 +1,12 @@ { "compilerOptions": { "skipLibCheck": true, - "target": "es2017", + "target": "es2021", "module": "commonjs", "strict": true, "esModuleInterop": true, "outDir": "dist", - "lib": ["es2017", "dom"], + "lib": ["es2021", "dom"], "types": ["reflect-metadata", "@types/mocha", "@types/node"], "experimentalDecorators": true, "emitDecoratorMetadata": true, diff --git a/tests/e2e/utils/DriverHelper.ts b/tests/e2e/utils/DriverHelper.ts index b62053e00ec..114ed901140 100644 --- a/tests/e2e/utils/DriverHelper.ts +++ b/tests/e2e/utils/DriverHelper.ts @@ -398,7 +398,7 @@ export class DriverHelper { } throw new error.TimeoutError( - `Exceeded maximum gettin of the '${cssAttribute}' css attribute attempts, from the '${elementLocator}' element` + `Exceeded maximum getting of the '${cssAttribute}' css attribute attempts, from the '${elementLocator}' element` ); }