From e3cbea562395bcb104205f0bf35c2a2b898cc026 Mon Sep 17 00:00:00 2001 From: Ihor Okhrimenko Date: Wed, 7 Aug 2019 11:59:19 +0300 Subject: [PATCH 01/18] Update chromedriver version Signed-off-by: Ihor Okhrimenko --- e2e/package-lock.json | 108 +++++++++++++++++++++++------------------- e2e/package.json | 2 +- 2 files changed, 61 insertions(+), 49 deletions(-) diff --git a/e2e/package-lock.json b/e2e/package-lock.json index 686ae67dcdd..18a4ee5fa2d 100644 --- a/e2e/package-lock.json +++ b/e2e/package-lock.json @@ -62,9 +62,9 @@ "dev": true }, "ajv": { - "version": "6.10.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.0.tgz", - "integrity": "sha512-nffhOpkymDECQyR0mnsUtoCE8RlX38G0rYP+wgLWFyZuUyuuojSSvi/+euOiQBIn63whYwYVIIH1TvE3tu4OEg==", + "version": "6.10.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.2.tgz", + "integrity": "sha512-TXtUUEYHuaTEbLZWIKUr5pmBuhDLy+8KYtPYdcV8qC+pOZL+NKqYwvWSRrVXHn+ZmRRAu8vJTAznH7Oag6RVRw==", "dev": true, "requires": { "fast-deep-equal": "^2.0.1", @@ -314,12 +314,12 @@ "dev": true }, "chromedriver": { - "version": "2.46.0", - "resolved": "https://registry.npmjs.org/chromedriver/-/chromedriver-2.46.0.tgz", - "integrity": "sha512-dLtKIJW3y/PuFrPmcw6Mb8Nh+HwSqgVrK1rWgTARXhHfWvV822X2VRkx2meU/tg2+YQL6/nNgT6n5qWwIDHbwg==", + "version": "76.0.0", + "resolved": "https://registry.npmjs.org/chromedriver/-/chromedriver-76.0.0.tgz", + "integrity": "sha512-jGyqs0N+lMo9iaNQxGKNPiLJWb2L9s2rwbRr1jJeQ37n6JQ1+5YMGviv/Fx5Z08vBWYbAvrKEzFsuYf8ppl+lw==", "dev": true, "requires": { - "del": "^3.0.0", + "del": "^4.1.1", "extract-zip": "^1.6.7", "mkdirp": "^0.5.1", "request": "^2.88.0", @@ -359,9 +359,9 @@ "dev": true }, "combined-stream": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.7.tgz", - "integrity": "sha512-brWl9y6vOB1xYPZcpZde3N9zDByXTosAeMDo4p1wzo6UMOX4vumB+TP1RZ76sfE6Md68Q0NJSrE/gbezd4Ul+w==", + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", "dev": true, "requires": { "delayed-stream": "~1.0.0" @@ -459,17 +459,29 @@ } }, "del": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/del/-/del-3.0.0.tgz", - "integrity": "sha1-U+z2mf/LyzljdpGrE7rxYIGXZuU=", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/del/-/del-4.1.1.tgz", + "integrity": "sha512-QwGuEUouP2kVwQenAsOof5Fv8K9t3D8Ca8NxcXKrIpEHjTXK5J2nXLdP+ALI1cgv8wj7KuwBhTwBkOZSJKM5XQ==", "dev": true, "requires": { + "@types/glob": "^7.1.1", "globby": "^6.1.0", - "is-path-cwd": "^1.0.0", - "is-path-in-cwd": "^1.0.0", - "p-map": "^1.1.1", - "pify": "^3.0.0", - "rimraf": "^2.2.8" + "is-path-cwd": "^2.0.0", + "is-path-in-cwd": "^2.0.0", + "p-map": "^2.0.0", + "pify": "^4.0.1", + "rimraf": "^2.6.3" + }, + "dependencies": { + "rimraf": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", + "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + } } }, "delayed-stream": { @@ -865,27 +877,27 @@ "dev": true }, "is-path-cwd": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz", - "integrity": "sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0=", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz", + "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==", "dev": true }, "is-path-in-cwd": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.1.tgz", - "integrity": "sha512-FjV1RTW48E7CWM7eE/J2NJvAEEVektecDBVBE5Hh3nM1Jd0kvhHtX68Pr3xsDf857xt3Y4AkwVULK1Vku62aaQ==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-2.1.0.tgz", + "integrity": "sha512-rNocXHgipO+rvnP6dk3zI20RpOtrAM/kzbB258Uw5BWr3TpXi861yzjo16Dn4hUox07iw5AyeMLHWsujkjzvRQ==", "dev": true, "requires": { - "is-path-inside": "^1.0.0" + "is-path-inside": "^2.1.0" } }, "is-path-inside": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz", - "integrity": "sha1-jvW33lBDej/cprToZe96pVy0gDY=", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-2.1.0.tgz", + "integrity": "sha512-wiyhTzfDWsvwAW53OBWF5zuvaOGlZ6PwYxAbPVDhpm+gM09xKQGjBq/8uYN12aDvMxnAnq3dxTyoSoRNmg5YFg==", "dev": true, "requires": { - "path-is-inside": "^1.0.1" + "path-is-inside": "^1.0.2" } }, "is-regex": { @@ -1087,18 +1099,18 @@ } }, "mime-db": { - "version": "1.38.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.38.0.tgz", - "integrity": "sha512-bqVioMFFzc2awcdJZIzR3HjZFX20QhilVS7hytkKrv7xFAn8bM1gzc/FOX2awLISvWe0PV8ptFKcon+wZ5qYkg==", + "version": "1.40.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.40.0.tgz", + "integrity": "sha512-jYdeOMPy9vnxEqFRRo6ZvTZ8d9oPb+k18PKoYNYUe2stVEBPPwsln/qWzdbmaIvnhZ9v2P+CuecK+fpUfsV2mA==", "dev": true }, "mime-types": { - "version": "2.1.22", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.22.tgz", - "integrity": "sha512-aGl6TZGnhm/li6F7yx82bJiBZwgiEa4Hf6CNr8YO+r5UHr53tSTYZb102zyU50DOWWKeOv0uQLRL0/9EiKWCog==", + "version": "2.1.24", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.24.tgz", + "integrity": "sha512-WaFHS3MCl5fapm3oLxU4eYDw77IQM2ACcxQ9RIxfaC3ooc6PFuBMGZZsYpvoXS5D5QTWPieo1jjLdAm3TBP3cQ==", "dev": true, "requires": { - "mime-db": "~1.38.0" + "mime-db": "1.40.0" } }, "mimic-fn": { @@ -1319,9 +1331,9 @@ } }, "p-map": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-1.2.0.tgz", - "integrity": "sha512-r6zKACMNhjPJMTl8KcFH4li//gkrXWfbD6feV8l6doRHlzljFWGJ2AP6iKaCJXyZmAUMOPtvbW7EXkbWO/pLEA==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz", + "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==", "dev": true }, "p-try": { @@ -1385,9 +1397,9 @@ "dev": true }, "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", "dev": true }, "pinkie": { @@ -1412,9 +1424,9 @@ "dev": true }, "psl": { - "version": "1.1.31", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.1.31.tgz", - "integrity": "sha512-/6pt4+C+T+wZUieKR620OpzN/LlnNKuWjy1iFLQ/UG35JqHlR/89MP1d96dUfkf6Dne3TuLQzOYEYshJ+Hx8mw==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.3.0.tgz", + "integrity": "sha512-avHdspHO+9rQTLbv1RO+MPYeP/SzsCoxofjVnHanETfQhTJrmB0HlDoW+EiN/R+C0BZ+gERab9NY0lPN2TxNag==", "dev": true }, "pump": { @@ -1694,9 +1706,9 @@ } }, "ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "dev": true } } diff --git a/e2e/package.json b/e2e/package.json index 8dc390b9cce..e472e7a36c5 100644 --- a/e2e/package.json +++ b/e2e/package.json @@ -19,7 +19,7 @@ "@types/rimraf": "^2.0.2", "@types/selenium-webdriver": "^3.0.16", "chai": "^4.2.0", - "chromedriver": "^2.46.0", + "chromedriver": "^76.0.0", "mocha": "^6.1.4", "rimraf": "^2.6.2", "selenium-webdriver": "^3.6.0", From 80dbe473bebf3cfd1a3eb810a7600ad70c34c712 Mon Sep 17 00:00:00 2001 From: Ihor Okhrimenko Date: Mon, 23 Sep 2019 15:19:11 +0300 Subject: [PATCH 02/18] Create logger Signed-off-by: Ihor Okhrimenko --- e2e/TestConstants.ts | 7 ++- e2e/driver/ChromeDriver.ts | 2 +- e2e/index.ts | 31 ++++++----- e2e/pageobjects/ide/ProjectTree.ts | 33 ++++++++++- e2e/tests/e2e_happy_path/HappyPath.spec.ts | 14 ++--- e2e/utils/DriverHelper.ts | 65 ++++++++++++++++++++++ e2e/utils/Logger.ts | 42 ++++++++++++++ 7 files changed, 166 insertions(+), 28 deletions(-) create mode 100644 e2e/utils/Logger.ts diff --git a/e2e/TestConstants.ts b/e2e/TestConstants.ts index 2a90701a27c..6907e1db776 100644 --- a/e2e/TestConstants.ts +++ b/e2e/TestConstants.ts @@ -157,5 +157,10 @@ export const TestConstants = { /** * Stop and remove workspace if a test fails. */ - DELETE_WORKSPACE_ON_FAILED_TEST: process.env.DELETE_WORKSPACE_ON_FAILED_TEST === 'true' + DELETE_WORKSPACE_ON_FAILED_TEST: process.env.DELETE_WORKSPACE_ON_FAILED_TEST === 'true', + + /** + * Log level settings, possible variants: 'INFO' (by default), 'DEBUG', 'TRACE'. + */ + TS_SELENIUM_LOG_LEVEL: process.env.TS_SELENIUM_LOG_LEVEL || 'INFO' }; diff --git a/e2e/driver/ChromeDriver.ts b/e2e/driver/ChromeDriver.ts index bb26a46a32e..393fc283c47 100644 --- a/e2e/driver/ChromeDriver.ts +++ b/e2e/driver/ChromeDriver.ts @@ -55,7 +55,7 @@ export class ChromeDriver implements IDriver { if (TestConstants.TS_SELENIUM_REMOTE_DRIVER_URL) { builder = builder.usingServer(TestConstants.TS_SELENIUM_REMOTE_DRIVER_URL); } - + return builder; } diff --git a/e2e/index.ts b/e2e/index.ts index 5fdd32c0160..ae011c22271 100644 --- a/e2e/index.ts +++ b/e2e/index.ts @@ -3,37 +3,38 @@ export { inversifyConfig }; export * from './inversify.types'; export * from './TestConstants'; -export * from './driver/ContainerInitializer'; -export * from './driver/IDriver'; export * from './driver/ChromeDriver'; +export * from './driver/IDriver'; +export * from './driver/ContainerInitializer'; export * from './utils/ScreenCatcher'; +export * from './utils/Logger'; export * from './utils/DriverHelper'; export * from './utils/NameGenerator'; export * from './utils/workspace/ITestWorkspaceUtil'; export * from './utils/workspace/WorkspaceStatus'; export * from './utils/workspace/TestWorkspaceUtil'; -export * from './pageobjects/openshift/OcpLoginPage'; -export * from './pageobjects/openshift/OcpWebConsolePage'; export * from './pageobjects/login/OcpLoginByTempAdmin'; -export * from './pageobjects/login/ICheLoginPage'; export * from './pageobjects/login/MultiUserLoginPage'; export * from './pageobjects/login/IOcpLoginPage'; +export * from './pageobjects/login/ICheLoginPage'; export * from './pageobjects/login/SingleUserLoginPage'; +export * from './pageobjects/dashboard/NewWorkspace'; +export * from './pageobjects/dashboard/Workspaces'; export * from './pageobjects/dashboard/workspace-details/WorkspaceDetails'; export * from './pageobjects/dashboard/workspace-details/WorkspaceDetailsPlugins'; -export * from './pageobjects/dashboard/Workspaces'; export * from './pageobjects/dashboard/Dashboard'; -export * from './pageobjects/dashboard/NewWorkspace'; export * from './pageobjects/ide/Terminal'; -export * from './pageobjects/ide/Editor'; -export * from './pageobjects/ide/OpenWorkspaceWidget'; -export * from './pageobjects/ide/ProjectTree'; -export * from './pageobjects/ide/QuickOpenContainer'; +export * from './pageobjects/ide/TopMenu'; export * from './pageobjects/ide/RightToolbar'; -export * from './pageobjects/ide/ContextMenu'; +export * from './pageobjects/ide/OpenWorkspaceWidget'; export * from './pageobjects/ide/Ide'; -export * from './pageobjects/ide/DebugView'; +export * from './pageobjects/ide/Editor'; +export * from './pageobjects/ide/ProjectTree'; +export * from './pageobjects/ide/PreviewWidget'; export * from './pageobjects/ide/GitHubPlugin'; -export * from './pageobjects/ide/TopMenu'; +export * from './pageobjects/ide/DebugView'; +export * from './pageobjects/ide/ContextMenu'; export * from './pageobjects/ide/WarningDialog'; -export * from './pageobjects/ide/PreviewWidget'; +export * from './pageobjects/ide/QuickOpenContainer'; +export * from './pageobjects/openshift/OcpWebConsolePage'; +export * from './pageobjects/openshift/OcpLoginPage'; diff --git a/e2e/pageobjects/ide/ProjectTree.ts b/e2e/pageobjects/ide/ProjectTree.ts index d01fe021cf7..d4cefb46f80 100644 --- a/e2e/pageobjects/ide/ProjectTree.ts +++ b/e2e/pageobjects/ide/ProjectTree.ts @@ -15,6 +15,7 @@ import { Ide, RightToolbarButton } from './Ide'; import { TestConstants } from '../../TestConstants'; import { By, error } from 'selenium-webdriver'; import { Editor } from './Editor'; +import { Logger } from '../../utils/Logger'; @injectable() export class ProjectTree { @@ -26,6 +27,8 @@ export class ProjectTree { @inject(CLASSES.Editor) private readonly editor: Editor) { } async openProjectTreeContainer(timeout: number = TestConstants.TS_SELENIUM_DEFAULT_TIMEOUT) { + Logger.debug('ProjectTree.openProjectTreeContainer'); + const selectedExplorerButtonLocator: By = By.css(Ide.SELECTED_EXPLORER_BUTTON_CSS); await this.ide.waitRightToolbarButton(RightToolbarButton.Explorer, timeout); @@ -40,12 +43,16 @@ export class ProjectTree { } async waitItemExpanded(itemPath: string, timeout: number = TestConstants.TS_SELENIUM_DEFAULT_TIMEOUT) { + Logger.debug('ProjectTree.waitItemExpanded'); + const locator: string = await this.getExpandedItemCssLocator(itemPath); const expandedItemLocator: By = By.css(locator); await this.driverHelper.waitVisibility(expandedItemLocator, timeout); } async waitItemCollapsed(itemPath: string, timeout: number = TestConstants.TS_SELENIUM_DEFAULT_TIMEOUT) { + Logger.debug('ProjectTree.waitItemCollapsed'); + const locator: string = await this.getCollapsedItemCssLocator(itemPath); const collapsedItemLocator: By = By.css(locator); @@ -53,16 +60,22 @@ export class ProjectTree { } async waitProjectTreeContainer(timeout: number = TestConstants.TS_SELENIUM_DEFAULT_TIMEOUT) { + Logger.debug('ProjectTree.waitProjectTreeContainer'); + await this.driverHelper.waitPresence(By.css(ProjectTree.PROJECT_TREE_CONTAINER_CSS), timeout); } async waitProjectTreeContainerClosed(attempts: number = TestConstants.TS_SELENIUM_DEFAULT_ATTEMPTS, polling: number = TestConstants.TS_SELENIUM_DEFAULT_POLLING) { + Logger.debug('ProjectTree.waitProjectTreeContainerClosed'); + await this.driverHelper.waitDisappearance(By.css(ProjectTree.PROJECT_TREE_CONTAINER_CSS), attempts, polling); } async waitItem(itemPath: string, timeout: number = TestConstants.TS_SELENIUM_DEFAULT_TIMEOUT) { + Logger.debug('ProjectTree.waitItem'); + const locator: string = await this.getItemCss(itemPath); await this.driverHelper.waitVisibility(By.css(locator), timeout); } @@ -70,11 +83,16 @@ export class ProjectTree { async waitItemDisappearance(itemPath: string, attempts: number = TestConstants.TS_SELENIUM_DEFAULT_ATTEMPTS, polling: number = TestConstants.TS_SELENIUM_DEFAULT_POLLING) { + + Logger.debug('ProjectTree.waitItemDisappearance'); + const locator: string = await this.getItemCss(itemPath); await this.driverHelper.waitDisappearance(By.css(locator), attempts, polling); } async clickOnItem(itemPath: string, timeout: number = TestConstants.TS_SELENIUM_DEFAULT_TIMEOUT) { + Logger.debug('ProjectTree.clickOnItem'); + const locator: string = await this.getItemCss(itemPath); await this.driverHelper.waitAndClick(By.css(locator), timeout); await this.waitItemSelected(itemPath, timeout); @@ -82,11 +100,15 @@ export class ProjectTree { } async waitItemSelected(itemPath: string, timeout: number = TestConstants.TS_SELENIUM_DEFAULT_TIMEOUT) { + Logger.debug('ProjectTree.waitItemSelected'); + const selectedItemLocator: By = By.css(`div[title='/projects/${itemPath}'].theia-mod-selected.theia-mod-focus`); await this.driverHelper.waitVisibility(selectedItemLocator, timeout); } async expandItem(itemPath: string, timeout: number = TestConstants.TS_SELENIUM_DEFAULT_TIMEOUT) { + Logger.debug('ProjectTree.expandItem'); + const locator: string = await this.getExpandIconCssLocator(itemPath); const expandIconLocator: By = By.css(locator); const treeItemLocator: By = By.css(this.getTreeItemCssLocator(itemPath)); @@ -116,6 +138,8 @@ export class ProjectTree { } async collapseItem(itemPath: string, timeout: number = TestConstants.TS_SELENIUM_DEFAULT_TIMEOUT) { + Logger.debug('ProjectTree.collapseItem'); + const locator: string = await this.getExpandIconCssLocator(itemPath); const expandIconLocator: By = By.css(locator); const treeItemLocator: By = By.css(this.getTreeItemCssLocator(itemPath)); @@ -131,6 +155,8 @@ export class ProjectTree { } async expandPathAndOpenFile(pathToItem: string, fileName: string, timeout: number = TestConstants.TS_SELENIUM_DEFAULT_TIMEOUT) { + Logger.debug('ProjectTree.expandPathAndOpenFile'); + let items: Array = pathToItem.split('/'); let projectName: string = items[0]; let paths: Array = new Array(); @@ -157,6 +183,8 @@ export class ProjectTree { } async expandPathAndOpenFileInAssociatedWorkspace(pathToItem: string, fileName: string, timeout: number = TestConstants.TS_SELENIUM_DEFAULT_TIMEOUT) { + Logger.debug('ProjectTree.expandPathAndOpenFileInAssociatedWorkspace'); + let projectName: string = pathToItem.split('/')[0]; let pathEntry = `${projectName}`; let pathToItemInAssociatedWorkspace = pathToItem.replace(`${projectName}/`, ''); @@ -193,13 +221,12 @@ export class ProjectTree { visibilityItemPolling: number = TestConstants.TS_SELENIUM_DEFAULT_POLLING * 5, triesPolling: number = TestConstants.TS_SELENIUM_DEFAULT_POLLING * 30) { + Logger.debug('ProjectTree.waitProjectImported'); + const rootItem: string = `${projectName}`; const rootItemLocator: By = By.css(this.getTreeItemCssLocator(`${projectName}`)); const rootSubitemLocator: By = By.css(this.getTreeItemCssLocator(`${projectName}/${rootSubItem}`)); - - - for (let i = 0; i < attempts; i++) { const isProjectFolderVisible = await this.driverHelper.waitVisibilityBoolean(rootItemLocator, attempts, visibilityItemPolling); diff --git a/e2e/tests/e2e_happy_path/HappyPath.spec.ts b/e2e/tests/e2e_happy_path/HappyPath.spec.ts index 534d654b523..f3f6ae10b84 100644 --- a/e2e/tests/e2e_happy_path/HappyPath.spec.ts +++ b/e2e/tests/e2e_happy_path/HappyPath.spec.ts @@ -89,7 +89,7 @@ suite('Validation of workspace start', async () => { }); -suite('Language server validation', async () => { +suite.skip('Language server validation', async () => { test('Java LS initialization', async () => { await projectTree.expandPathAndOpenFileInAssociatedWorkspace(pathToJavaFolder, javaFileName); await editor.selectTab(javaFileName); @@ -125,9 +125,7 @@ suite('Language server validation', async () => { try { await editor.performKeyCombination(javaFileName, Key.chord(Key.CONTROL, Key.F12)); await editor.waitEditorAvailable(codeNavigationClassName); - } - // workaround for issue: https://github.com/eclipse/che/issues/14520 - catch (err) { + } catch (err) { if (err instanceof error.TimeoutError) { checkCodeNavigationWithContextMenu(); } @@ -145,7 +143,7 @@ suite('Language server validation', async () => { }); }); -suite('Validation of workspace build and run', async () => { +suite.skip('Validation of workspace build and run', async () => { test('Build application', async () => { await runTask('che: build-file-output'); await projectTree.expandPathAndOpenFileInAssociatedWorkspace(projectName, 'build-output.txt'); @@ -175,8 +173,8 @@ suite('Validation of workspace build and run', async () => { }); }); -suite('Display source code changes in the running application', async () => { - test('Change source code', async () => { +suite.skip('Display source code changes in the running application', async () => { + test('Change source code', async () => { await projectTree.expandPathAndOpenFileInAssociatedWorkspace(pathToChangedJavaFileFolder, changedJavaFileName); await editor.waitEditorAvailable(changedJavaFileName); await editor.clickOnTab(changedJavaFileName); @@ -219,7 +217,7 @@ suite('Display source code changes in the running application', async () => { }); }); -suite('Validation of debug functionality', async () => { +suite.skip('Validation of debug functionality', async () => { test('Open file and activate breakpoint', async () => { await projectTree.expandPathAndOpenFileInAssociatedWorkspace(pathToJavaFolder, javaFileName); await editor.activateBreakpoint(javaFileName, 32); diff --git a/e2e/utils/DriverHelper.ts b/e2e/utils/DriverHelper.ts index de93c0db99b..96cf90b5939 100644 --- a/e2e/utils/DriverHelper.ts +++ b/e2e/utils/DriverHelper.ts @@ -14,6 +14,7 @@ import { error, ActionSequence } from 'selenium-webdriver'; import 'reflect-metadata'; import { ThenableWebDriver, By, until, WebElement } from 'selenium-webdriver'; import { TestConstants } from '../TestConstants'; +import { Logger } from './Logger'; @injectable() @@ -25,10 +26,14 @@ export class DriverHelper { } public getAction(): ActionSequence { + Logger.trace('DriverHelper.getAction'); + return this.driver.actions(); } public async isVisible(locator: By): Promise { + Logger.trace('DriverHelper.isVisible'); + try { const element: WebElement = await this.driver.findElement(locator); const isVisible: boolean = await element.isDisplayed(); @@ -39,6 +44,8 @@ export class DriverHelper { } public async wait(miliseconds: number) { + Logger.trace('DriverHelper.wait'); + await this.driver.sleep(miliseconds); } @@ -46,6 +53,8 @@ export class DriverHelper { attempts: number = TestConstants.TS_SELENIUM_DEFAULT_ATTEMPTS, polling: number = TestConstants.TS_SELENIUM_DEFAULT_POLLING): Promise { + Logger.trace('DriverHelper.waitVisibilityBoolean'); + for (let i = 0; i < attempts; i++) { const isVisible: boolean = await this.isVisible(locator); @@ -63,6 +72,8 @@ export class DriverHelper { attempts: number = TestConstants.TS_SELENIUM_DEFAULT_ATTEMPTS, polling: number = TestConstants.TS_SELENIUM_DEFAULT_POLLING): Promise { + Logger.trace('DriverHelper.waitDisappearanceBoolean'); + for (let i = 0; i < attempts; i++) { const isVisible: boolean = await this.isVisible(locator); @@ -80,6 +91,8 @@ export class DriverHelper { const attempts: number = TestConstants.TS_SELENIUM_DEFAULT_ATTEMPTS; const polling: number = TestConstants.TS_SELENIUM_DEFAULT_POLLING; + Logger.trace('DriverHelper.waitVisibility'); + for (let i = 0; i < attempts; i++) { const webElement: WebElement = await this.driver.wait(until.elementLocated(elementLocator), timeout); @@ -103,6 +116,8 @@ export class DriverHelper { const attempts: number = TestConstants.TS_SELENIUM_DEFAULT_ATTEMPTS; const polling: number = TestConstants.TS_SELENIUM_DEFAULT_POLLING; + Logger.trace('DriverHelper.waitPresence'); + for (let i = 0; i < attempts; i++) { try { const webElement: WebElement = await this.driver.wait(until.elementLocated(elementLocator), timeout); @@ -124,6 +139,8 @@ export class DriverHelper { const attempts: number = TestConstants.TS_SELENIUM_DEFAULT_ATTEMPTS; const polling: number = TestConstants.TS_SELENIUM_DEFAULT_POLLING; + Logger.trace('DriverHelper.waitAllPresence'); + for (let i = 0; i < attempts; i++) { try { const webElements: Array = await this.driver.wait(until.elementsLocated(elementLocator), timeout); @@ -142,6 +159,8 @@ export class DriverHelper { } public async waitAllVisibility(locators: Array, timeout: number = TestConstants.TS_SELENIUM_DEFAULT_TIMEOUT) { + Logger.trace('DriverHelper.waitAllVisibility'); + for (const elementLocator of locators) { await this.waitVisibility(elementLocator, timeout); } @@ -151,6 +170,8 @@ export class DriverHelper { attempts: number = TestConstants.TS_SELENIUM_DEFAULT_ATTEMPTS, polling: number = TestConstants.TS_SELENIUM_DEFAULT_POLLING) { + Logger.trace('DriverHelper.waitDisappearance'); + const isDisappeared = await this.waitDisappearanceBoolean(elementLocator, attempts, polling); if (!isDisappeared) { @@ -159,6 +180,8 @@ export class DriverHelper { } public async waitDisappearanceWithTimeout(elementLocator: By, timeout: number = TestConstants.TS_SELENIUM_DEFAULT_TIMEOUT) { + Logger.trace('DriverHelper.waitDisappearanceWithTimeout'); + await this.getDriver().wait(async () => { const isVisible: boolean = await this.isVisible(elementLocator); @@ -172,6 +195,8 @@ export class DriverHelper { attempts: number = TestConstants.TS_SELENIUM_DEFAULT_ATTEMPTS, polling: number = TestConstants.TS_SELENIUM_DEFAULT_POLLING) { + Logger.trace('DriverHelper.waitAllDisappearance'); + for (const elementLocator of locators) { await this.waitDisappearance(elementLocator, attempts, polling); } @@ -181,6 +206,8 @@ export class DriverHelper { const attempts: number = TestConstants.TS_SELENIUM_DEFAULT_ATTEMPTS; const polling: number = TestConstants.TS_SELENIUM_DEFAULT_POLLING; + Logger.trace('DriverHelper.waitAndClick'); + for (let i = 0; i < attempts; i++) { const element: WebElement = await this.waitVisibility(elementLocator, timeout); @@ -213,6 +240,8 @@ export class DriverHelper { const attempts: number = TestConstants.TS_SELENIUM_DEFAULT_ATTEMPTS; const polling: number = TestConstants.TS_SELENIUM_DEFAULT_POLLING; + Logger.trace('DriverHelper.waitAndGetElementAttribute'); + for (let i = 0; i < attempts; i++) { const element: WebElement = await this.waitVisibility(elementLocator, visibilityTimeout); @@ -239,6 +268,8 @@ export class DriverHelper { const attempts: number = TestConstants.TS_SELENIUM_DEFAULT_ATTEMPTS; const polling: number = TestConstants.TS_SELENIUM_DEFAULT_POLLING; + Logger.trace('DriverHelper.waitAndGetCssValue'); + for (let i = 0; i < attempts; i++) { const element: WebElement = await this.waitVisibility(elementLocator, visibilityTimeout); @@ -263,6 +294,8 @@ export class DriverHelper { expectedValue: string, timeout: number = TestConstants.TS_SELENIUM_DEFAULT_TIMEOUT) { + Logger.trace('DriverHelper.waitAttributeValue'); + await this.driver.wait(async () => { const attributeValue: string = await this.waitAndGetElementAttribute(elementLocator, attribute, timeout); @@ -276,6 +309,8 @@ export class DriverHelper { const attempts: number = TestConstants.TS_SELENIUM_DEFAULT_ATTEMPTS; const polling: number = TestConstants.TS_SELENIUM_DEFAULT_POLLING; + Logger.trace('DriverHelper.type'); + for (let i = 0; i < attempts; i++) { const element: WebElement = await this.waitVisibility(elementLocator, timeout); @@ -299,6 +334,8 @@ export class DriverHelper { const attempts: number = TestConstants.TS_SELENIUM_DEFAULT_ATTEMPTS; const polling: number = TestConstants.TS_SELENIUM_DEFAULT_POLLING; + Logger.trace('DriverHelper.typeToInvisible'); + for (let i = 0; i < attempts; i++) { const element: WebElement = await this.waitPresence(elementLocator, timeout); @@ -322,6 +359,8 @@ export class DriverHelper { const attempts: number = TestConstants.TS_SELENIUM_DEFAULT_ATTEMPTS; const polling: number = TestConstants.TS_SELENIUM_DEFAULT_POLLING; + Logger.trace('DriverHelper.clear'); + for (let i = 0; i < attempts; i++) { const element: WebElement = await this.waitVisibility(elementLocator, timeout); @@ -342,6 +381,8 @@ export class DriverHelper { } public async enterValue(elementLocator: By, text: string, timeout: number = TestConstants.TS_SELENIUM_DEFAULT_TIMEOUT) { + Logger.trace('DriverHelper.enterValue'); + await this.waitVisibility(elementLocator, timeout); await this.clear(elementLocator, timeout); await this.waitAttributeValue(elementLocator, 'value', '', timeout); @@ -350,6 +391,8 @@ export class DriverHelper { } public async waitAndSwitchToFrame(iframeLocator: By, timeout: number = TestConstants.TS_SELENIUM_DEFAULT_TIMEOUT) { + Logger.trace('DriverHelper.waitAndSwitchToFrame'); + await this.driver.wait(until.ableToSwitchToFrame(iframeLocator), timeout); } @@ -357,6 +400,8 @@ export class DriverHelper { const attempts: number = TestConstants.TS_SELENIUM_DEFAULT_ATTEMPTS; const polling: number = TestConstants.TS_SELENIUM_DEFAULT_POLLING; + Logger.trace('DriverHelper.waitAndGetText'); + for (let i = 0; i < attempts; i++) { const element: WebElement = await this.waitVisibility(elementLocator, timeout); @@ -377,28 +422,40 @@ export class DriverHelper { } public async waitAndGetValue(elementLocator: By, timeout: number = TestConstants.TS_SELENIUM_DEFAULT_TIMEOUT): Promise { + Logger.trace('DriverHelper.waitAndGetValue'); + const elementValue: string = await this.waitAndGetElementAttribute(elementLocator, 'value', timeout); return elementValue; } public async waitUntilTrue(callback: any, timeout: number = TestConstants.TS_SELENIUM_DEFAULT_TIMEOUT) { + Logger.trace('DriverHelper.waitUntilTrue'); + await this.driver.wait(callback(), timeout); } public async reloadPage() { + Logger.trace('DriverHelper.reloadPage'); + await this.driver.navigate().refresh(); } public async navigateAndWaitToUrl(url: string) { + Logger.trace('DriverHelper.navigateAndWaitToUrl'); + await this.navigateToUrl(url); await this.waitURL(url); } public async navigateToUrl(url: string) { + Logger.trace('DriverHelper.navigateToUrl'); + await this.driver.navigate().to(url); } public async waitURL(expectedUrl: string, timeout: number = TestConstants.TS_SELENIUM_DEFAULT_TIMEOUT) { + Logger.trace('DriverHelper.waitURL'); + await this.getDriver().wait(async () => { const currentUrl: string = await this.getDriver().getCurrentUrl(); const urlEquals: boolean = currentUrl === expectedUrl; @@ -413,6 +470,8 @@ export class DriverHelper { const attempts: number = TestConstants.TS_SELENIUM_DEFAULT_ATTEMPTS; const polling: number = TestConstants.TS_SELENIUM_DEFAULT_POLLING; + Logger.trace('DriverHelper.scrollTo'); + for (let i = 0; i < attempts; i++) { const element: WebElement = await this.waitPresence(elementLocator, timeout); @@ -433,10 +492,14 @@ export class DriverHelper { } getDriver(): ThenableWebDriver { + Logger.trace('DriverHelper.getDriver'); + return this.driver; } async waitOpenningSecondWindow(timeout: number = TestConstants.TS_SELENIUM_DEFAULT_TIMEOUT) { + Logger.trace('DriverHelper.waitOpenningSecondWindow'); + await this.driver.wait(async () => { const handles: string[] = await this.driver.getAllWindowHandles(); if (handles.length > 1) { @@ -446,6 +509,8 @@ export class DriverHelper { } async switchToSecondWindow(mainWindowHandle: string) { + Logger.trace('DriverHelper.switchToSecondWindow'); + await this.waitOpenningSecondWindow(); const handles: string[] = await this.driver.getAllWindowHandles(); handles.splice(handles.indexOf(mainWindowHandle), 1); diff --git a/e2e/utils/Logger.ts b/e2e/utils/Logger.ts new file mode 100644 index 00000000000..04947349d15 --- /dev/null +++ b/e2e/utils/Logger.ts @@ -0,0 +1,42 @@ +import { TestConstants } from '../TestConstants'; + +/********************************************************************* + * Copyright (c) 2019 Red Hat, Inc. + * + * This program and the accompanying materials are made + * available under the terms of the Eclipse Public License 2.0 + * which is available at https://www.eclipse.org/legal/epl-2.0/ + * + * SPDX-License-Identifier: EPL-2.0 + **********************************************************************/ + +export abstract class Logger { + // public error(text: string) { + // console.log(text); + // } + + // public info(text: string) { + // console.log(text); + // } + + public static debug(text: string) { + if (TestConstants.TS_SELENIUM_LOG_LEVEL === 'INFO') { + return; + } + + console.log(` ----> ${text}`); + } + + public static trace(text: string) { + if (TestConstants.TS_SELENIUM_LOG_LEVEL === 'INFO') { + return; + } + + if (TestConstants.TS_SELENIUM_LOG_LEVEL === 'DEBUG') { + return; + } + + console.log(` ----> ${text}`); + } + +} From cc208d61beb97267f939b897ad678d7ae6fbf7e3 Mon Sep 17 00:00:00 2001 From: Ihor Okhrimenko Date: Mon, 23 Sep 2019 16:10:03 +0300 Subject: [PATCH 03/18] Add log covering Signed-off-by: Ihor Okhrimenko --- e2e/utils/DriverHelper.ts | 56 +++++++++++++++++++-------------------- e2e/utils/Logger.ts | 6 +++-- 2 files changed, 32 insertions(+), 30 deletions(-) diff --git a/e2e/utils/DriverHelper.ts b/e2e/utils/DriverHelper.ts index 96cf90b5939..05b7f0273a6 100644 --- a/e2e/utils/DriverHelper.ts +++ b/e2e/utils/DriverHelper.ts @@ -32,7 +32,7 @@ export class DriverHelper { } public async isVisible(locator: By): Promise { - Logger.trace('DriverHelper.isVisible'); + Logger.trace(`DriverHelper.isVisible ${locator}`); try { const element: WebElement = await this.driver.findElement(locator); @@ -43,17 +43,17 @@ export class DriverHelper { } } - public async wait(miliseconds: number) { - Logger.trace('DriverHelper.wait'); + public async wait(milliseconds: number) { + Logger.trace(`DriverHelper.wait (${milliseconds} milliseconds)`); - await this.driver.sleep(miliseconds); + await this.driver.sleep(milliseconds); } public async waitVisibilityBoolean(locator: By, attempts: number = TestConstants.TS_SELENIUM_DEFAULT_ATTEMPTS, polling: number = TestConstants.TS_SELENIUM_DEFAULT_POLLING): Promise { - Logger.trace('DriverHelper.waitVisibilityBoolean'); + Logger.trace(`DriverHelper.waitVisibilityBoolean ${locator}`); for (let i = 0; i < attempts; i++) { const isVisible: boolean = await this.isVisible(locator); @@ -72,7 +72,7 @@ export class DriverHelper { attempts: number = TestConstants.TS_SELENIUM_DEFAULT_ATTEMPTS, polling: number = TestConstants.TS_SELENIUM_DEFAULT_POLLING): Promise { - Logger.trace('DriverHelper.waitDisappearanceBoolean'); + Logger.trace(`DriverHelper.waitDisappearanceBoolean ${locator}`); for (let i = 0; i < attempts; i++) { const isVisible: boolean = await this.isVisible(locator); @@ -91,7 +91,7 @@ export class DriverHelper { const attempts: number = TestConstants.TS_SELENIUM_DEFAULT_ATTEMPTS; const polling: number = TestConstants.TS_SELENIUM_DEFAULT_POLLING; - Logger.trace('DriverHelper.waitVisibility'); + Logger.trace(`DriverHelper.waitVisibility ${elementLocator}`); for (let i = 0; i < attempts; i++) { const webElement: WebElement = await this.driver.wait(until.elementLocated(elementLocator), timeout); @@ -116,7 +116,7 @@ export class DriverHelper { const attempts: number = TestConstants.TS_SELENIUM_DEFAULT_ATTEMPTS; const polling: number = TestConstants.TS_SELENIUM_DEFAULT_POLLING; - Logger.trace('DriverHelper.waitPresence'); + Logger.trace(`DriverHelper.waitPresence ${elementLocator}`); for (let i = 0; i < attempts; i++) { try { @@ -139,7 +139,7 @@ export class DriverHelper { const attempts: number = TestConstants.TS_SELENIUM_DEFAULT_ATTEMPTS; const polling: number = TestConstants.TS_SELENIUM_DEFAULT_POLLING; - Logger.trace('DriverHelper.waitAllPresence'); + Logger.trace(`DriverHelper.waitAllPresence ${elementLocator}`); for (let i = 0; i < attempts; i++) { try { @@ -159,7 +159,7 @@ export class DriverHelper { } public async waitAllVisibility(locators: Array, timeout: number = TestConstants.TS_SELENIUM_DEFAULT_TIMEOUT) { - Logger.trace('DriverHelper.waitAllVisibility'); + Logger.trace(`DriverHelper.waitAllVisibility ${locators}`); for (const elementLocator of locators) { await this.waitVisibility(elementLocator, timeout); @@ -170,7 +170,7 @@ export class DriverHelper { attempts: number = TestConstants.TS_SELENIUM_DEFAULT_ATTEMPTS, polling: number = TestConstants.TS_SELENIUM_DEFAULT_POLLING) { - Logger.trace('DriverHelper.waitDisappearance'); + Logger.trace(`DriverHelper.waitDisappearance ${elementLocator}`); const isDisappeared = await this.waitDisappearanceBoolean(elementLocator, attempts, polling); @@ -180,7 +180,7 @@ export class DriverHelper { } public async waitDisappearanceWithTimeout(elementLocator: By, timeout: number = TestConstants.TS_SELENIUM_DEFAULT_TIMEOUT) { - Logger.trace('DriverHelper.waitDisappearanceWithTimeout'); + Logger.trace(`DriverHelper.waitDisappearanceWithTimeout ${elementLocator}`); await this.getDriver().wait(async () => { const isVisible: boolean = await this.isVisible(elementLocator); @@ -195,7 +195,7 @@ export class DriverHelper { attempts: number = TestConstants.TS_SELENIUM_DEFAULT_ATTEMPTS, polling: number = TestConstants.TS_SELENIUM_DEFAULT_POLLING) { - Logger.trace('DriverHelper.waitAllDisappearance'); + Logger.trace(`DriverHelper.waitAllDisappearance ${locators}`); for (const elementLocator of locators) { await this.waitDisappearance(elementLocator, attempts, polling); @@ -206,7 +206,7 @@ export class DriverHelper { const attempts: number = TestConstants.TS_SELENIUM_DEFAULT_ATTEMPTS; const polling: number = TestConstants.TS_SELENIUM_DEFAULT_POLLING; - Logger.trace('DriverHelper.waitAndClick'); + Logger.trace(`DriverHelper.waitAndClick ${elementLocator}`); for (let i = 0; i < attempts; i++) { const element: WebElement = await this.waitVisibility(elementLocator, timeout); @@ -240,7 +240,7 @@ export class DriverHelper { const attempts: number = TestConstants.TS_SELENIUM_DEFAULT_ATTEMPTS; const polling: number = TestConstants.TS_SELENIUM_DEFAULT_POLLING; - Logger.trace('DriverHelper.waitAndGetElementAttribute'); + Logger.trace(`DriverHelper.waitAndGetElementAttribute ${elementLocator} attribute: '${attribute}'`); for (let i = 0; i < attempts; i++) { const element: WebElement = await this.waitVisibility(elementLocator, visibilityTimeout); @@ -268,7 +268,7 @@ export class DriverHelper { const attempts: number = TestConstants.TS_SELENIUM_DEFAULT_ATTEMPTS; const polling: number = TestConstants.TS_SELENIUM_DEFAULT_POLLING; - Logger.trace('DriverHelper.waitAndGetCssValue'); + Logger.trace(`DriverHelper.waitAndGetCssValue ${elementLocator} cssAttribute: ${cssAttribute}`); for (let i = 0; i < attempts; i++) { const element: WebElement = await this.waitVisibility(elementLocator, visibilityTimeout); @@ -294,7 +294,7 @@ export class DriverHelper { expectedValue: string, timeout: number = TestConstants.TS_SELENIUM_DEFAULT_TIMEOUT) { - Logger.trace('DriverHelper.waitAttributeValue'); + Logger.trace(`DriverHelper.waitAttributeValue ${elementLocator}`); await this.driver.wait(async () => { const attributeValue: string = await this.waitAndGetElementAttribute(elementLocator, attribute, timeout); @@ -309,7 +309,7 @@ export class DriverHelper { const attempts: number = TestConstants.TS_SELENIUM_DEFAULT_ATTEMPTS; const polling: number = TestConstants.TS_SELENIUM_DEFAULT_POLLING; - Logger.trace('DriverHelper.type'); + Logger.trace(`DriverHelper.type ${elementLocator} text: ${text}`); for (let i = 0; i < attempts; i++) { const element: WebElement = await this.waitVisibility(elementLocator, timeout); @@ -334,7 +334,7 @@ export class DriverHelper { const attempts: number = TestConstants.TS_SELENIUM_DEFAULT_ATTEMPTS; const polling: number = TestConstants.TS_SELENIUM_DEFAULT_POLLING; - Logger.trace('DriverHelper.typeToInvisible'); + Logger.trace(`DriverHelper.typeToInvisible ${elementLocator} text: ${text}`); for (let i = 0; i < attempts; i++) { const element: WebElement = await this.waitPresence(elementLocator, timeout); @@ -359,7 +359,7 @@ export class DriverHelper { const attempts: number = TestConstants.TS_SELENIUM_DEFAULT_ATTEMPTS; const polling: number = TestConstants.TS_SELENIUM_DEFAULT_POLLING; - Logger.trace('DriverHelper.clear'); + Logger.trace(`DriverHelper.clear ${elementLocator}`); for (let i = 0; i < attempts; i++) { const element: WebElement = await this.waitVisibility(elementLocator, timeout); @@ -381,7 +381,7 @@ export class DriverHelper { } public async enterValue(elementLocator: By, text: string, timeout: number = TestConstants.TS_SELENIUM_DEFAULT_TIMEOUT) { - Logger.trace('DriverHelper.enterValue'); + Logger.trace(`DriverHelper.enterValue ${elementLocator} text: ${text}`); await this.waitVisibility(elementLocator, timeout); await this.clear(elementLocator, timeout); @@ -391,7 +391,7 @@ export class DriverHelper { } public async waitAndSwitchToFrame(iframeLocator: By, timeout: number = TestConstants.TS_SELENIUM_DEFAULT_TIMEOUT) { - Logger.trace('DriverHelper.waitAndSwitchToFrame'); + Logger.trace(`DriverHelper.waitAndSwitchToFrame ${iframeLocator}`); await this.driver.wait(until.ableToSwitchToFrame(iframeLocator), timeout); } @@ -400,7 +400,7 @@ export class DriverHelper { const attempts: number = TestConstants.TS_SELENIUM_DEFAULT_ATTEMPTS; const polling: number = TestConstants.TS_SELENIUM_DEFAULT_POLLING; - Logger.trace('DriverHelper.waitAndGetText'); + Logger.trace(`DriverHelper.waitAndGetText ${elementLocator}`); for (let i = 0; i < attempts; i++) { const element: WebElement = await this.waitVisibility(elementLocator, timeout); @@ -422,7 +422,7 @@ export class DriverHelper { } public async waitAndGetValue(elementLocator: By, timeout: number = TestConstants.TS_SELENIUM_DEFAULT_TIMEOUT): Promise { - Logger.trace('DriverHelper.waitAndGetValue'); + Logger.trace(`DriverHelper.waitAndGetValue ${elementLocator}`); const elementValue: string = await this.waitAndGetElementAttribute(elementLocator, 'value', timeout); return elementValue; @@ -441,20 +441,20 @@ export class DriverHelper { } public async navigateAndWaitToUrl(url: string) { - Logger.trace('DriverHelper.navigateAndWaitToUrl'); + Logger.trace(`DriverHelper.navigateAndWaitToUrl ${url}`); await this.navigateToUrl(url); await this.waitURL(url); } public async navigateToUrl(url: string) { - Logger.trace('DriverHelper.navigateToUrl'); + Logger.trace(`DriverHelper.navigateToUrl ${url}`); await this.driver.navigate().to(url); } public async waitURL(expectedUrl: string, timeout: number = TestConstants.TS_SELENIUM_DEFAULT_TIMEOUT) { - Logger.trace('DriverHelper.waitURL'); + Logger.trace(`DriverHelper.waitURL ${expectedUrl}`); await this.getDriver().wait(async () => { const currentUrl: string = await this.getDriver().getCurrentUrl(); @@ -470,7 +470,7 @@ export class DriverHelper { const attempts: number = TestConstants.TS_SELENIUM_DEFAULT_ATTEMPTS; const polling: number = TestConstants.TS_SELENIUM_DEFAULT_POLLING; - Logger.trace('DriverHelper.scrollTo'); + Logger.trace(`DriverHelper.scrollTo ${elementLocator}`); for (let i = 0; i < attempts; i++) { const element: WebElement = await this.waitPresence(elementLocator, timeout); diff --git a/e2e/utils/Logger.ts b/e2e/utils/Logger.ts index 04947349d15..15a4aba573b 100644 --- a/e2e/utils/Logger.ts +++ b/e2e/utils/Logger.ts @@ -24,7 +24,8 @@ export abstract class Logger { return; } - console.log(` ----> ${text}`); + // console.log(` ----> ${text}`); + console.log(` ▼ ${text}`); } public static trace(text: string) { @@ -36,7 +37,8 @@ export abstract class Logger { return; } - console.log(` ----> ${text}`); + // console.log(` ----> ${text}`); + console.log(` ‣ ${text}`); } } From cd17c84469e9631064928cae0a0af2d54bfca8fd Mon Sep 17 00:00:00 2001 From: Ihor Okhrimenko Date: Tue, 24 Sep 2019 12:27:40 +0300 Subject: [PATCH 04/18] Cleanup code Signed-off-by: Ihor Okhrimenko --- e2e/pageobjects/ide/Ide.ts | 65 ++++++++++++++++++---- e2e/pageobjects/ide/ProjectTree.ts | 25 ++++----- e2e/tests/e2e_happy_path/HappyPath.spec.ts | 8 +-- e2e/utils/Logger.ts | 19 +++---- 4 files changed, 79 insertions(+), 38 deletions(-) diff --git a/e2e/pageobjects/ide/Ide.ts b/e2e/pageobjects/ide/Ide.ts index 309964f2a58..0acedc93e90 100644 --- a/e2e/pageobjects/ide/Ide.ts +++ b/e2e/pageobjects/ide/Ide.ts @@ -13,6 +13,7 @@ import { injectable, inject } from 'inversify'; import { CLASSES } from '../../inversify.types'; import { TestConstants } from '../../TestConstants'; import { By, WebElement, error } from 'selenium-webdriver'; +import { Logger } from '../../utils/Logger'; export enum RightToolbarButton { Explorer = 'Explorer', @@ -35,12 +36,15 @@ export class Ide { @inject(CLASSES.DriverHelper) private readonly driverHelper: DriverHelper) { } async waitAndSwitchToIdeFrame(timeout: number = TestConstants.TS_SELENIUM_LOAD_PAGE_TIMEOUT) { + Logger.debug('Ide.waitAndSwitchToIdeFrame'); + await this.driverHelper.waitAndSwitchToFrame(By.css(Ide.IDE_IFRAME_CSS), timeout); } async waitNotification(notificationText: string, timeout: number = TestConstants.TS_SELENIUM_DEFAULT_TIMEOUT) { - const notificationLocator: By = By.xpath(this.getNotificationXpathLocator(notificationText)); + Logger.debug(`Ide.waitNotification "${notificationText}"`); + const notificationLocator: By = By.xpath(this.getNotificationXpathLocator(notificationText)); await this.driverHelper.waitVisibility(notificationLocator, timeout); } @@ -48,6 +52,8 @@ export class Ide { buttonText: string, timeout: number = TestConstants.TS_SELENIUM_DEFAULT_TIMEOUT) { + Logger.debug(`Ide.waitNotificationAndClickOnButton "${notificationText}" buttonText: "${buttonText}"`); + await this.driverHelper.getDriver().wait(async () => { await this.waitNotification(notificationText, timeout); await this.clickOnNotificationButton(notificationText, buttonText); @@ -69,29 +75,38 @@ export class Ide { } async waitNotificationAndConfirm(notificationText: string, timeout: number = TestConstants.TS_SELENIUM_DEFAULT_TIMEOUT) { + Logger.debug(`Ide.waitNotificationAndConfirm "${notificationText}"`); + await this.waitNotificationAndClickOnButton(notificationText, 'yes', timeout); } async waitNotificationAndOpenLink(notificationText: string, timeout: number = TestConstants.TS_SELENIUM_DEFAULT_TIMEOUT) { + Logger.debug(`Ide.waitNotificationAndOpenLink "${notificationText}"`); + await this.waitApllicationIsReady(await this.getApplicationUrlFromNotification(notificationText)); await this.waitNotificationAndClickOnButton(notificationText, 'Open Link', timeout); } async isNotificationPresent(notificationText: string): Promise { - const notificationLocator: By = By.xpath(this.getNotificationXpathLocator(notificationText)); + Logger.debug(`Ide.isNotificationPresent "${notificationText}"`); + const notificationLocator: By = By.xpath(this.getNotificationXpathLocator(notificationText)); return await this.driverHelper.waitVisibilityBoolean(notificationLocator); } async waitNotificationDisappearance(notificationText: string, attempts: number = TestConstants.TS_SELENIUM_DEFAULT_ATTEMPTS, polling: number = TestConstants.TS_SELENIUM_DEFAULT_POLLING) { - const notificationLocator: By = By.xpath(this.getNotificationXpathLocator(notificationText)); + Logger.debug(`Ide.waitNotificationDisappearance "${notificationText}"`); + + const notificationLocator: By = By.xpath(this.getNotificationXpathLocator(notificationText)); await this.driverHelper.waitDisappearance(notificationLocator, attempts, polling); } async clickOnNotificationButton(notificationText: string, buttonText: string) { + Logger.debug(`Ide.clickOnNotificationButton "${notificationText}" buttonText: "${buttonText}"`); + const yesButtonLocator: string = `//div[@class='theia-notification-list']//span[contains(.,'${notificationText}')]/parent::div/parent::div/parent::div/div[@class='theia-notification-list-item-content-bottom']//div[@class='theia-notification-buttons']//button[text()='${buttonText}'] `; await this.driverHelper.waitAndClick(By.xpath(yesButtonLocator)); } @@ -100,11 +115,15 @@ export class Ide { workspaceName: string, timeout: number = TestConstants.TS_SELENIUM_LOAD_PAGE_TIMEOUT) { + Logger.debug('Ide.waitWorkspaceAndIde'); + await this.waitAndSwitchToIdeFrame(timeout); await this.waitIde(timeout); } async waitIde(timeout: number = TestConstants.TS_SELENIUM_LOAD_PAGE_TIMEOUT) { + Logger.debug('Ide.waitIde'); + const mainIdeParts: Array = [By.css(Ide.TOP_MENU_PANEL_CSS), By.css(Ide.LEFT_CONTENT_PANEL_CSS), By.id(Ide.EXPLORER_BUTTON_ID)]; for (const idePartLocator of mainIdeParts) { @@ -113,33 +132,44 @@ export class Ide { } async waitRightToolbarButton(buttonTitle: RightToolbarButton, timeout: number = TestConstants.TS_SELENIUM_DEFAULT_TIMEOUT) { - const buttonLocator: By = this.getRightToolbarButtonLocator(buttonTitle); + Logger.debug('Ide.waitRightToolbarButton'); + const buttonLocator: By = this.getRightToolbarButtonLocator(buttonTitle); await this.driverHelper.waitVisibility(buttonLocator, timeout); } async waitAndClickRightToolbarButton(buttonTitle: RightToolbarButton, timeout: number = TestConstants.TS_SELENIUM_DEFAULT_TIMEOUT) { - const buttonLocator: By = this.getRightToolbarButtonLocator(buttonTitle); + Logger.debug('Ide.waitAndClickRightToolbarButton'); + const buttonLocator: By = this.getRightToolbarButtonLocator(buttonTitle); await this.driverHelper.waitAndClick(buttonLocator, timeout); } async waitTopMenuPanel(timeout: number = TestConstants.TS_SELENIUM_DEFAULT_TIMEOUT) { + Logger.debug('Ide.waitTopMenuPanel'); + await this.driverHelper.waitVisibility(By.css(Ide.TOP_MENU_PANEL_CSS), timeout); } async waitLeftContentPanel(timeout: number = TestConstants.TS_SELENIUM_DEFAULT_TIMEOUT) { + Logger.debug('Ide.waitLeftContentPanel'); + await this.driverHelper.waitVisibility(By.css(Ide.LEFT_CONTENT_PANEL_CSS)); } async waitPreloaderAbsent(attempts: number = TestConstants.TS_SELENIUM_DEFAULT_ATTEMPTS, polling: number = TestConstants.TS_SELENIUM_DEFAULT_POLLING) { + + Logger.debug('Ide.waitPreloaderAbsent'); + await this.driverHelper.waitDisappearance(By.css(Ide.PRELOADER_CSS), attempts, polling); } async waitStatusBarContains(expectedText: string, timeout: number = TestConstants.TS_SELENIUM_LANGUAGE_SERVER_START_TIMEOUT) { const statusBarLocator: By = By.css('div[id=\'theia-statusBar\']'); + Logger.debug(`Ide.waitStatusBarContains "${expectedText}"`); + await this.driverHelper.getDriver().wait(async () => { const elementText: string = await this.driverHelper.waitAndGetText(statusBarLocator, timeout); const isTextPresent: boolean = elementText.search(expectedText) > 0; @@ -148,12 +178,16 @@ export class Ide { return true; } + await this.driverHelper.wait(TestConstants.TS_SELENIUM_DEFAULT_POLLING * 2); + }, timeout); } async waitStatusBarTextAbsence(expectedText: string, timeout: number = TestConstants.TS_SELENIUM_DEFAULT_TIMEOUT) { const statusBarLocator: By = By.css('div[id=\'theia-statusBar\']'); + Logger.debug(`Ide.waitStatusBarTextAbsence "${expectedText}"`); + // for ensuring that check is not invoked in the gap of status displaying for (let i: number = 0; i < 3; i++) { await this.driverHelper.getDriver().wait(async () => { @@ -165,15 +199,21 @@ export class Ide { return true; } + await this.driverHelper.wait(TestConstants.TS_SELENIUM_DEFAULT_POLLING * 2); + }, timeout); } } async waitIdeFrameAndSwitchOnIt(timeout: number = TestConstants.TS_SELENIUM_LOAD_PAGE_TIMEOUT) { + Logger.debug('Ide.waitIdeFrameAndSwitchOnIt'); + await this.driverHelper.waitAndSwitchToFrame(By.css(Ide.IDE_IFRAME_CSS), timeout); } async checkLsInitializationStart(expectedTextInStatusBar: string) { + Logger.debug('Ide.checkLsInitializationStart'); + try { await this.waitStatusBarContains(expectedTextInStatusBar, 20000); } catch (err) { @@ -191,6 +231,8 @@ export class Ide { async closeAllNotifications() { const notificationLocator: By = By.css('.theia-Notification'); + Logger.debug('Ide.closeAllNotifications'); + if (! await this.driverHelper.isVisible(notificationLocator)) { return; } @@ -215,20 +257,23 @@ export class Ide { } async performKeyCombination(keyCombination: string) { - const bodyLocator: By = By.tagName('body'); + Logger.debug(`Ide.performKeyCombination "${keyCombination}"`); + const bodyLocator: By = By.tagName('body'); await this.driverHelper.type(bodyLocator, keyCombination); } async waitRightToolbarButtonSelection(buttonTitle: string, timeout: number = TestConstants.TS_SELENIUM_DEFAULT_TIMEOUT) { - const selectedRightToolbarButtonLocator: By = this.getSelectedRightToolbarButtonLocator(buttonTitle); + Logger.debug('Ide.waitRightToolbarButtonSelection'); + const selectedRightToolbarButtonLocator: By = this.getSelectedRightToolbarButtonLocator(buttonTitle); await this.driverHelper.waitVisibility(selectedRightToolbarButtonLocator, timeout); } async getApplicationUrlFromNotification(notificationText: string) { - const notificationTextLocator: By = By.xpath(`//div[@class='theia-notification-message']/span[contains(.,'${notificationText}')]`); + Logger.debug(`Ide.getApplicationUrlFromNotification ${notificationText}`); + const notificationTextLocator: By = By.xpath(`//div[@class='theia-notification-message']/span[contains(.,'${notificationText}')]`); let notification = await this.driverHelper.waitAndGetText(notificationTextLocator); let regexp: RegExp = new RegExp('^.*(https?://.*)$'); @@ -242,6 +287,8 @@ export class Ide { async waitApllicationIsReady(url: string, timeout: number = TestConstants.TS_SELENIUM_DEFAULT_TIMEOUT) { + Logger.debug(`Ide.waitApllicationIsReady ${url}`); + await this.driverHelper.getDriver().wait(async () => { try { const res = await axios.get(url); @@ -269,6 +316,4 @@ export class Ide { return `//div[@class='theia-notification-message']/span[contains(.,'${notificationText}')]`; } - - } diff --git a/e2e/pageobjects/ide/ProjectTree.ts b/e2e/pageobjects/ide/ProjectTree.ts index d4cefb46f80..4d7a7e72f96 100644 --- a/e2e/pageobjects/ide/ProjectTree.ts +++ b/e2e/pageobjects/ide/ProjectTree.ts @@ -43,7 +43,7 @@ export class ProjectTree { } async waitItemExpanded(itemPath: string, timeout: number = TestConstants.TS_SELENIUM_DEFAULT_TIMEOUT) { - Logger.debug('ProjectTree.waitItemExpanded'); + Logger.debug(`ProjectTree.waitItemExpanded "${itemPath}"`); const locator: string = await this.getExpandedItemCssLocator(itemPath); const expandedItemLocator: By = By.css(locator); @@ -51,7 +51,7 @@ export class ProjectTree { } async waitItemCollapsed(itemPath: string, timeout: number = TestConstants.TS_SELENIUM_DEFAULT_TIMEOUT) { - Logger.debug('ProjectTree.waitItemCollapsed'); + Logger.debug(`ProjectTree.waitItemCollapsed "${itemPath}"`); const locator: string = await this.getCollapsedItemCssLocator(itemPath); const collapsedItemLocator: By = By.css(locator); @@ -74,7 +74,7 @@ export class ProjectTree { } async waitItem(itemPath: string, timeout: number = TestConstants.TS_SELENIUM_DEFAULT_TIMEOUT) { - Logger.debug('ProjectTree.waitItem'); + Logger.debug(`ProjectTree.waitItem "${itemPath}"`); const locator: string = await this.getItemCss(itemPath); await this.driverHelper.waitVisibility(By.css(locator), timeout); @@ -84,30 +84,29 @@ export class ProjectTree { attempts: number = TestConstants.TS_SELENIUM_DEFAULT_ATTEMPTS, polling: number = TestConstants.TS_SELENIUM_DEFAULT_POLLING) { - Logger.debug('ProjectTree.waitItemDisappearance'); + Logger.debug(`ProjectTree.waitItemDisappearance "${itemPath}"`); const locator: string = await this.getItemCss(itemPath); await this.driverHelper.waitDisappearance(By.css(locator), attempts, polling); } async clickOnItem(itemPath: string, timeout: number = TestConstants.TS_SELENIUM_DEFAULT_TIMEOUT) { - Logger.debug('ProjectTree.clickOnItem'); + Logger.debug(`ProjectTree.clickOnItem "${itemPath}"`); const locator: string = await this.getItemCss(itemPath); await this.driverHelper.waitAndClick(By.css(locator), timeout); await this.waitItemSelected(itemPath, timeout); - } async waitItemSelected(itemPath: string, timeout: number = TestConstants.TS_SELENIUM_DEFAULT_TIMEOUT) { - Logger.debug('ProjectTree.waitItemSelected'); + Logger.debug(`ProjectTree.waitItemSelected "${itemPath}"`); const selectedItemLocator: By = By.css(`div[title='/projects/${itemPath}'].theia-mod-selected.theia-mod-focus`); await this.driverHelper.waitVisibility(selectedItemLocator, timeout); } async expandItem(itemPath: string, timeout: number = TestConstants.TS_SELENIUM_DEFAULT_TIMEOUT) { - Logger.debug('ProjectTree.expandItem'); + Logger.debug(`ProjectTree.expandItem "${itemPath}"`); const locator: string = await this.getExpandIconCssLocator(itemPath); const expandIconLocator: By = By.css(locator); @@ -138,7 +137,7 @@ export class ProjectTree { } async collapseItem(itemPath: string, timeout: number = TestConstants.TS_SELENIUM_DEFAULT_TIMEOUT) { - Logger.debug('ProjectTree.collapseItem'); + Logger.debug(`ProjectTree.collapseItem "${itemPath}"`); const locator: string = await this.getExpandIconCssLocator(itemPath); const expandIconLocator: By = By.css(locator); @@ -155,7 +154,7 @@ export class ProjectTree { } async expandPathAndOpenFile(pathToItem: string, fileName: string, timeout: number = TestConstants.TS_SELENIUM_DEFAULT_TIMEOUT) { - Logger.debug('ProjectTree.expandPathAndOpenFile'); + Logger.debug(`ProjectTree.expandPathAndOpenFile "${pathToItem}"`); let items: Array = pathToItem.split('/'); let projectName: string = items[0]; @@ -183,7 +182,7 @@ export class ProjectTree { } async expandPathAndOpenFileInAssociatedWorkspace(pathToItem: string, fileName: string, timeout: number = TestConstants.TS_SELENIUM_DEFAULT_TIMEOUT) { - Logger.debug('ProjectTree.expandPathAndOpenFileInAssociatedWorkspace'); + Logger.debug(`ProjectTree.expandPathAndOpenFileInAssociatedWorkspace "${pathToItem}"`); let projectName: string = pathToItem.split('/')[0]; let pathEntry = `${projectName}`; @@ -221,7 +220,7 @@ export class ProjectTree { visibilityItemPolling: number = TestConstants.TS_SELENIUM_DEFAULT_POLLING * 5, triesPolling: number = TestConstants.TS_SELENIUM_DEFAULT_POLLING * 30) { - Logger.debug('ProjectTree.waitProjectImported'); + Logger.debug(`ProjectTree.waitProjectImported "${projectName}" rootSubItem: "${rootSubItem}"`); const rootItem: string = `${projectName}`; const rootItemLocator: By = By.css(this.getTreeItemCssLocator(`${projectName}`)); @@ -259,7 +258,6 @@ export class ProjectTree { throw new error.TimeoutError('Exceeded the maximum number of checking attempts, project has not been imported'); } - private async getWorkspacePathEntry(): Promise { const nodeAttribute: string = 'data-node-id'; const splitDelimeter = ':'; @@ -267,7 +265,6 @@ export class ProjectTree { return attribute.split(splitDelimeter)[0] + splitDelimeter; } - private async getItemCss(itemPath: string): Promise { const entry: string = await this.getWorkspacePathEntry(); return `div[id='${entry}/projects/${itemPath}']`; diff --git a/e2e/tests/e2e_happy_path/HappyPath.spec.ts b/e2e/tests/e2e_happy_path/HappyPath.spec.ts index f3f6ae10b84..97bca900e9e 100644 --- a/e2e/tests/e2e_happy_path/HappyPath.spec.ts +++ b/e2e/tests/e2e_happy_path/HappyPath.spec.ts @@ -89,7 +89,7 @@ suite('Validation of workspace start', async () => { }); -suite.skip('Language server validation', async () => { +suite('Language server validation', async () => { test('Java LS initialization', async () => { await projectTree.expandPathAndOpenFileInAssociatedWorkspace(pathToJavaFolder, javaFileName); await editor.selectTab(javaFileName); @@ -143,7 +143,7 @@ suite.skip('Language server validation', async () => { }); }); -suite.skip('Validation of workspace build and run', async () => { +suite('Validation of workspace build and run', async () => { test('Build application', async () => { await runTask('che: build-file-output'); await projectTree.expandPathAndOpenFileInAssociatedWorkspace(projectName, 'build-output.txt'); @@ -173,7 +173,7 @@ suite.skip('Validation of workspace build and run', async () => { }); }); -suite.skip('Display source code changes in the running application', async () => { +suite('Display source code changes in the running application', async () => { test('Change source code', async () => { await projectTree.expandPathAndOpenFileInAssociatedWorkspace(pathToChangedJavaFileFolder, changedJavaFileName); await editor.waitEditorAvailable(changedJavaFileName); @@ -217,7 +217,7 @@ suite.skip('Display source code changes in the running application', async () => }); }); -suite.skip('Validation of debug functionality', async () => { +suite('Validation of debug functionality', async () => { test('Open file and activate breakpoint', async () => { await projectTree.expandPathAndOpenFileInAssociatedWorkspace(pathToJavaFolder, javaFileName); await editor.activateBreakpoint(javaFileName, 32); diff --git a/e2e/utils/Logger.ts b/e2e/utils/Logger.ts index 15a4aba573b..3314cc9c3dc 100644 --- a/e2e/utils/Logger.ts +++ b/e2e/utils/Logger.ts @@ -11,23 +11,23 @@ import { TestConstants } from '../TestConstants'; **********************************************************************/ export abstract class Logger { - // public error(text: string) { - // console.log(text); - // } - - // public info(text: string) { - // console.log(text); - // } - + /** + * Uses for logging of the public methods of the pageobjects. + * @param text log text + */ public static debug(text: string) { if (TestConstants.TS_SELENIUM_LOG_LEVEL === 'INFO') { return; } - // console.log(` ----> ${text}`); console.log(` ▼ ${text}`); } + /** + * Uses for logging of the public methods of the {@link DriverHelper} or + * private methods inside of pageobjects. + * @param text log text + */ public static trace(text: string) { if (TestConstants.TS_SELENIUM_LOG_LEVEL === 'INFO') { return; @@ -37,7 +37,6 @@ export abstract class Logger { return; } - // console.log(` ----> ${text}`); console.log(` ‣ ${text}`); } From f29784c41dbe25b6d3aa3352eb3b85dbd2dddd4c Mon Sep 17 00:00:00 2001 From: Ihor Okhrimenko Date: Tue, 24 Sep 2019 16:19:10 +0300 Subject: [PATCH 05/18] Cover classes from 'ide' package by logging Signed-off-by: Ihor Okhrimenko --- e2e/pageobjects/ide/ContextMenu.ts | 9 ++++++++ e2e/pageobjects/ide/DebugView.ts | 7 ++++++ e2e/pageobjects/ide/GitHubPlugin.ts | 11 +++++++++- e2e/pageobjects/ide/OpenWorkspaceWidget.ts | 16 +++++++++++++- e2e/pageobjects/ide/PreviewWidget.ts | 25 ++++++++++++++++++++-- e2e/pageobjects/ide/QuickOpenContainer.ts | 9 ++++++++ e2e/pageobjects/ide/RightToolbar.ts | 5 +++++ e2e/pageobjects/ide/Terminal.ts | 19 ++++++++++++++++ e2e/pageobjects/ide/TopMenu.ts | 9 ++++++++ e2e/pageobjects/ide/WarningDialog.ts | 8 +++++++ 10 files changed, 114 insertions(+), 4 deletions(-) diff --git a/e2e/pageobjects/ide/ContextMenu.ts b/e2e/pageobjects/ide/ContextMenu.ts index b02713c6960..6caa706e0a9 100644 --- a/e2e/pageobjects/ide/ContextMenu.ts +++ b/e2e/pageobjects/ide/ContextMenu.ts @@ -4,6 +4,7 @@ import { DriverHelper } from '../../utils/DriverHelper'; import { CLASSES } from '../../inversify.types'; import { WebElement, Button, By, Key } from 'selenium-webdriver'; import { TestConstants } from '../../TestConstants'; +import { Logger } from '../../utils/Logger'; @@ -15,23 +16,31 @@ export class ContextMenu { async invokeContextMenuOnTheElementWithMouse(elementLocator: By, timeout: number = TestConstants.TS_SELENIUM_DEFAULT_TIMEOUT) { + Logger.debug(`ContextMenu.invokeContextMenuOnTheElementWithMouse ${elementLocator}`); + const webElement: WebElement = await this.driverHelper.waitVisibility(elementLocator, timeout); await this.driverHelper.getAction().click(webElement, Button.RIGHT).perform(); this.waitContextMenu(timeout); } async invokeContextMenuOnActiveElementWithKeys(timeout: number = TestConstants.TS_SELENIUM_DEFAULT_TIMEOUT) { + Logger.debug('ContextMenu.invokeContextMenuOnActiveElementWithKeys'); + this.driverHelper.getDriver().switchTo().activeElement().sendKeys(Key.SHIFT + Key.F10); this.waitContextMenu(timeout); } async waitContextMenuAndClickOnItem(nameOfItem: string, timeout: number = TestConstants.TS_SELENIUM_DEFAULT_TIMEOUT) { + Logger.debug(`ContextMenu.waitContextMenuAndClickOnItem "${nameOfItem}"`); + const itemLocator: string = `//div[@class='p-Menu-itemLabel' and text()='${nameOfItem}']`; await this.waitContextMenu(); await this.driverHelper.waitAndClick(By.xpath(itemLocator), timeout); } async waitContextMenu(timeout: number = TestConstants.TS_SELENIUM_DEFAULT_TIMEOUT) { + Logger.debug(`ContextMenu.waitContextMenu`); + await this.driverHelper.waitVisibility(By.css(ContextMenu.SUGGESTION_WIDGET_BODY_CSS), timeout); } diff --git a/e2e/pageobjects/ide/DebugView.ts b/e2e/pageobjects/ide/DebugView.ts index 152c13d503d..feafe5fea4b 100644 --- a/e2e/pageobjects/ide/DebugView.ts +++ b/e2e/pageobjects/ide/DebugView.ts @@ -12,6 +12,7 @@ import { CLASSES } from '../../inversify.types'; import { DriverHelper } from '../../utils/DriverHelper'; import { By, Key } from 'selenium-webdriver'; import { Ide } from './Ide'; +import { Logger } from '../../utils/Logger'; @injectable() @@ -20,10 +21,14 @@ export class DebugView { @inject(CLASSES.Ide) private readonly ide: Ide) { } async clickOnDebugConfigurationDropDown() { + Logger.debug('DebugView.clickOnDebugConfigurationDropDown'); + await this.driverHelper.waitAndClick(By.css('select.debug-configuration')); } async clickOnDebugConfigurationItem(itemText: string) { + Logger.debug(`DebugView.clickOnDebugConfigurationItem "${itemText}"`); + const configurationItemLocator: By = By.xpath(`//select[@class='debug-configuration']//option[text()=\'${itemText}\']`); await this.driverHelper.waitAndClick(configurationItemLocator); @@ -31,6 +36,8 @@ export class DebugView { } async clickOnRunDebugButton() { + Logger.debug('DebugView.clickOnRunDebugButton'); + const runDebugButtonLocator: By = By.xpath('//span[@title=\'Start Debugging\']'); await this.driverHelper.waitAndClick(runDebugButtonLocator); diff --git a/e2e/pageobjects/ide/GitHubPlugin.ts b/e2e/pageobjects/ide/GitHubPlugin.ts index c53aa2df56e..312941f32a6 100644 --- a/e2e/pageobjects/ide/GitHubPlugin.ts +++ b/e2e/pageobjects/ide/GitHubPlugin.ts @@ -4,6 +4,7 @@ import { DriverHelper } from '../../utils/DriverHelper'; import { TestConstants } from '../../TestConstants'; import { By, WebElement } from 'selenium-webdriver'; import { Ide, RightToolbarButton } from './Ide'; +import { Logger } from '../../utils/Logger'; /********************************************************************* * Copyright (c) 2019 Red Hat, Inc. @@ -21,6 +22,8 @@ export class GitHubPlugin { @inject(CLASSES.Ide) private readonly ide: Ide) { } async openGitHubPluginContainer(timeout: number = TestConstants.TS_SELENIUM_DEFAULT_TIMEOUT) { + Logger.debug('GitHubPlugin.openGitHubPluginContainer'); + const selectedGitButtonLocator: By = By.xpath(Ide.SELECTED_GIT_BUTTON_XPATH); await this.ide.waitRightToolbarButton(RightToolbarButton.Git, timeout); @@ -34,12 +37,16 @@ export class GitHubPlugin { } async waitGitHubContainer(timeout: number = TestConstants.TS_SELENIUM_DEFAULT_TIMEOUT) { + Logger.debug('GitHubPlugin.waitGitHubContainer'); + const githubContainerLocator: By = By.css('#theia-gitContainer .theia-git-main-container'); await this.driverHelper.waitVisibility(githubContainerLocator, timeout); } async getChangesList(): Promise { + Logger.debug('GitHubPlugin.getChangesList'); + const gitHubChangesLocator: By = By.xpath('//div[@id=\'theia-gitContainer\']//div[@id=\'unstagedChanges\']//div[contains(@class, \'gitItem\')]'); const changesElements: WebElement[] = await this.driverHelper.waitAllPresence(gitHubChangesLocator); const changesCount: number = changesElements.length; @@ -56,6 +63,8 @@ export class GitHubPlugin { } async waitChangesPresence(changesText: string, timeout: number = TestConstants.TS_SELENIUM_DEFAULT_TIMEOUT) { + Logger.debug(`GitHubPlugin.waitChangesPresence "${changesText}"`); + await this.driverHelper .getDriver() .wait(async () => { @@ -69,7 +78,7 @@ export class GitHubPlugin { }, timeout); } - getGitHubChangesItemXpathLocator(index: number): string { + private getGitHubChangesItemXpathLocator(index: number): string { return `(//div[@id='theia-gitContainer']//div[@id='unstagedChanges']//div[contains(@class, 'gitItem')])[${index + 1}]`; } diff --git a/e2e/pageobjects/ide/OpenWorkspaceWidget.ts b/e2e/pageobjects/ide/OpenWorkspaceWidget.ts index 728b6273c73..3bbfc0e0be7 100644 --- a/e2e/pageobjects/ide/OpenWorkspaceWidget.ts +++ b/e2e/pageobjects/ide/OpenWorkspaceWidget.ts @@ -12,6 +12,7 @@ import { CLASSES } from '../../inversify.types'; import { DriverHelper } from '../../utils/DriverHelper'; import { By } from 'selenium-webdriver'; import { TestConstants } from '../../TestConstants'; +import { Logger } from '../../utils/Logger'; @injectable() export class OpenWorkspaceWidget { @@ -23,28 +24,40 @@ export class OpenWorkspaceWidget { } async waitOpenWorkspaceWidget(timeout: number = TestConstants.TS_SELENIUM_DEFAULT_TIMEOUT) { + Logger.debug('OpenWorkspaceWidget.waitOpenWorkspaceWidget'); + await this.driverHelper.waitVisibility(By.xpath(OpenWorkspaceWidget.OPEN_WORKSPACE_MAIN_VIEW_XPATH), timeout); } async waitWidgetIsClosed(timeout: number = TestConstants.TS_SELENIUM_DEFAULT_TIMEOUT) { + Logger.debug('OpenWorkspaceWidget.waitWidgetIsClosed'); + await this.driverHelper.waitDisappearance(By.xpath(OpenWorkspaceWidget.OPEN_WORKSPACE_MAIN_VIEW_XPATH), timeout); } async selectItemInTree(pathToItem: string, timeout: number = TestConstants.TS_SELENIUM_DEFAULT_TIMEOUT) { + Logger.debug(`OpenWorkspaceWidget.selectItemInTree "${pathToItem}"`); + await this.driverHelper.waitAndClick(By.id(pathToItem), timeout); } async clickOnOpenButton(timeout: number = TestConstants.TS_SELENIUM_DEFAULT_TIMEOUT) { + Logger.debug('OpenWorkspaceWidget.clickOnOpenButton'); + await this.driverHelper.waitAndClick(By.css(OpenWorkspaceWidget.OPEN_WORKSPACE_OPEN_BTN_CSS), timeout); } async selectItemInTreeAndOpenWorkspace(item: string, timeout: number = TestConstants.TS_SELENIUM_DEFAULT_TIMEOUT) { + Logger.debug(`OpenWorkspaceWidget.selectItemInTreeAndOpenWorkspace "${item}"`); + await this.selectItemInTree(item, timeout); await this.clickOnOpenButton(); await this.waitWidgetIsClosed(); } async expandTreeToPath(path: string) { + Logger.debug(`OpenWorkspaceWidget.expandTreeToPath "${path}"`); + const pathNodes: string[] = path.split('/'); for (let currentPath of pathNodes) { await this.driverHelper.waitAndClick(By.id(`/${currentPath}`)); @@ -52,9 +65,10 @@ export class OpenWorkspaceWidget { } async selectRootWorkspaceItemInDropDawn(rootProject: string) { + Logger.debug(`OpenWorkspaceWidget.selectRootWorkspaceItemInDropDawn "${rootProject}"`); + await this.driverHelper.waitAndClick(By.css(OpenWorkspaceWidget.THEIA_LOCATION_LIST_CSS)); await this.driverHelper.waitAndClick(By.css(`option[value=\'file:///${rootProject}']`)); } - } diff --git a/e2e/pageobjects/ide/PreviewWidget.ts b/e2e/pageobjects/ide/PreviewWidget.ts index 59d0b310e6c..cc4230e155a 100644 --- a/e2e/pageobjects/ide/PreviewWidget.ts +++ b/e2e/pageobjects/ide/PreviewWidget.ts @@ -13,6 +13,7 @@ import { DriverHelper } from '../../utils/DriverHelper'; import { By } from 'selenium-webdriver'; import { TestConstants } from '../../TestConstants'; import { Ide } from './Ide'; +import { Logger } from '../../utils/Logger'; @injectable() export class PreviewWidget { @@ -20,22 +21,31 @@ export class PreviewWidget { @inject(CLASSES.Ide) private readonly ide: Ide) { } async waitAndSwitchToWidgetFrame() { + Logger.debug('PreviewWidget.waitAndSwitchToWidgetFrame'); + const iframeLocator: By = By.css('div.theia-mini-browser iframe'); await this.driverHelper.waitAndSwitchToFrame(iframeLocator); } async waitPreviewWidget(timeout: number = TestConstants.TS_SELENIUM_DEFAULT_TIMEOUT) { + Logger.debug('PreviewWidget.waitPreviewWidget'); + await this.driverHelper.waitVisibility(By.css('div.theia-mini-browser'), timeout); } async waitPreviewWidgetAbsence() { + Logger.debug('PreviewWidget.waitPreviewWidgetAbsence'); + await this.driverHelper.waitDisappearance(By.css('div.theia-mini-browser')); } async waitContentAvailable(contentLocator: By, timeout: number = TestConstants.TS_SELENIUM_DEFAULT_TIMEOUT, polling: number = TestConstants.TS_SELENIUM_DEFAULT_POLLING * 5) { + + Logger.debug(`PreviewWidget.waitContentAvailable ${contentLocator}`); + await this.waitAndSwitchToWidgetFrame(); await this.driverHelper.getDriver().wait(async () => { const isApplicationTitleVisible: boolean = await this.driverHelper.isVisible(contentLocator); @@ -55,9 +65,12 @@ export class PreviewWidget { async waitContentAvailableInAssociatedWorkspace(contentLocator: By, timeout: number = TestConstants.TS_SELENIUM_DEFAULT_TIMEOUT, polling: number = TestConstants.TS_SELENIUM_DEFAULT_POLLING * 5) { + + Logger.debug(`PreviewWidget.waitContentAvailableInAssociatedWorkspace ${contentLocator}`); + await this.waitAndSwitchToWidgetFrame(); await this.driverHelper.getDriver().wait(async () => { - const isApplicationTitleVisible: boolean = await this.driverHelper.isVisible(contentLocator); + const isApplicationTitleVisible: boolean = await this.driverHelper.isVisible(contentLocator); if (isApplicationTitleVisible) { await this.driverHelper.getDriver().switchTo().defaultContent(); return true; @@ -67,23 +80,31 @@ export class PreviewWidget { await this.refreshPage(); await this.waitAndSwitchToWidgetFrame(); await this.driverHelper.wait(polling); - }, timeout); + }, timeout); } async waitVisibility(element: By, timeout: number = TestConstants.TS_SELENIUM_DEFAULT_TIMEOUT) { + Logger.debug(`PreviewWidget.waitVisibility ${element}`); + await this.driverHelper.waitVisibility(element, timeout); } async waitAndClick(element: By, timeout: number = TestConstants.TS_SELENIUM_DEFAULT_TIMEOUT) { + Logger.debug(`PreviewWidget.waitAndClick ${element}`); + await this.driverHelper.waitAndClick(element, timeout); } async refreshPage() { + Logger.debug('PreviewWidget.refreshPage'); + const refreshButtonLocator: By = By.css('.theia-mini-browser .theia-mini-browser-refresh'); await this.driverHelper.waitAndClick(refreshButtonLocator); } async switchBackToIdeFrame() { + Logger.debug('PreviewWidget.switchBackToIdeFrame'); + await this.driverHelper.getDriver().switchTo().defaultContent(); await this.ide.waitAndSwitchToIdeFrame(); } diff --git a/e2e/pageobjects/ide/QuickOpenContainer.ts b/e2e/pageobjects/ide/QuickOpenContainer.ts index 3fb503e30c0..d865f180dfe 100644 --- a/e2e/pageobjects/ide/QuickOpenContainer.ts +++ b/e2e/pageobjects/ide/QuickOpenContainer.ts @@ -3,6 +3,7 @@ import { CLASSES } from '../../inversify.types'; import { DriverHelper } from '../../utils/DriverHelper'; import { TestConstants } from '../../TestConstants'; import { By } from 'selenium-webdriver'; +import { Logger } from '../../utils/Logger'; /********************************************************************* * Copyright (c) 2019 Red Hat, Inc. @@ -19,16 +20,22 @@ export class QuickOpenContainer { constructor(@inject(CLASSES.DriverHelper) private readonly driverHelper: DriverHelper) { } public async waitContainer(timeout: number = TestConstants.TS_SELENIUM_DEFAULT_TIMEOUT) { + Logger.debug('QuickOpenContainer.waitContainer'); + const monacoQuickOpenContainerLocator: By = By.xpath('//div[@class=\'monaco-quick-open-widget\']'); await this.driverHelper.waitVisibility(monacoQuickOpenContainerLocator, timeout); } public async waitContainerDisappearance() { + Logger.debug('QuickOpenContainer.waitContainerDisappearance'); + const monacoQuickOpenContainerLocator: By = By.xpath('//div[@class=\'monaco-quick-open-widget\' and @aria-hidden=\'true\']'); await this.driverHelper.waitDisappearance(monacoQuickOpenContainerLocator); } public async clickOnContainerItem(itemText: string, timeout: number = TestConstants.TS_SELENIUM_DEFAULT_TIMEOUT) { + Logger.debug(`QuickOpenContainer.clickOnContainerItem "${itemText}"`); + const quickContainerItemLocator: By = By.xpath(`//div[@class='quick-open-entry']//span[text()='${itemText}']`); await this.waitContainer(timeout); @@ -37,6 +44,8 @@ export class QuickOpenContainer { } public async type(text: string) { + Logger.debug(`QuickOpenContainer.type "${text}"`); + await this.driverHelper.enterValue(By.css('.quick-open-input input'), text); } diff --git a/e2e/pageobjects/ide/RightToolbar.ts b/e2e/pageobjects/ide/RightToolbar.ts index 0108f1f6478..914cdabfc49 100644 --- a/e2e/pageobjects/ide/RightToolbar.ts +++ b/e2e/pageobjects/ide/RightToolbar.ts @@ -12,16 +12,21 @@ import { CLASSES } from '../../inversify.types'; import { DriverHelper } from '../../utils/DriverHelper'; import { TestConstants } from '../../TestConstants'; import { By } from 'selenium-webdriver'; +import { Logger } from '../../utils/Logger'; @injectable() export class RightToolbar { constructor(@inject(CLASSES.DriverHelper) private readonly driverHelper: DriverHelper) { } async waitToolbar(timeout: number = TestConstants.TS_SELENIUM_DEFAULT_TIMEOUT) { + Logger.debug('RightToolbar.waitToolbar'); + await this.driverHelper.waitVisibility(By.css('div.theia-app-right'), timeout); } async clickOnToolIcon(iconTitle: string, timeout: number = TestConstants.TS_SELENIUM_DEFAULT_TIMEOUT) { + Logger.debug(`RightToolbar.clickOnToolIcon "${iconTitle}"`); + const toolIconLocator: By = By.css(`div.theia-app-right .p-TabBar-content li[title='${iconTitle}']`); await this.driverHelper.waitAndClick(toolIconLocator, timeout); diff --git a/e2e/pageobjects/ide/Terminal.ts b/e2e/pageobjects/ide/Terminal.ts index dcdf996de6a..a6cf815037c 100644 --- a/e2e/pageobjects/ide/Terminal.ts +++ b/e2e/pageobjects/ide/Terminal.ts @@ -12,41 +12,54 @@ import { CLASSES } from '../../inversify.types'; import { DriverHelper } from '../../utils/DriverHelper'; import { By, Key, WebElement, error } from 'selenium-webdriver'; import { TestConstants } from '../../TestConstants'; +import { Logger } from '../../utils/Logger'; @injectable() export class Terminal { constructor(@inject(CLASSES.DriverHelper) private readonly driverHelper: DriverHelper) { } async waitTab(tabTitle: string, timeout: number = TestConstants.TS_SELENIUM_DEFAULT_TIMEOUT) { + Logger.debug(`Terminal.waitTab "${tabTitle}"`); + const terminalTabLocator: By = By.css(this.getTerminalTabCssLocator(tabTitle)); await this.driverHelper.waitVisibility(terminalTabLocator, timeout); } async waitTabAbsence(tabTitle: string, timeout: number = TestConstants.TS_SELENIUM_DEFAULT_TIMEOUT) { + Logger.debug(`Terminal.waitTabAbsence "${tabTitle}"`); + const terminalTabLocator: By = By.css(this.getTerminalTabCssLocator(tabTitle)); await this.driverHelper.waitDisappearanceWithTimeout(terminalTabLocator, timeout); } async clickOnTab(tabTitle: string, timeout: number = TestConstants.TS_SELENIUM_DEFAULT_TIMEOUT) { + Logger.debug(`Terminal.clickOnTab "${tabTitle}"`); + const terminalTabLocator: By = By.css(this.getTerminalTabCssLocator(tabTitle)); await this, this.driverHelper.waitAndClick(terminalTabLocator, timeout); } async waitTabFocused(tabTitle: string, timeout: number = TestConstants.TS_SELENIUM_DEFAULT_TIMEOUT) { + Logger.debug(`Terminal.waitTabFocused "${tabTitle}"`); + const focusedTerminalTabLocator: By = this.getFocusedTerminalTabLocator(tabTitle); await this.driverHelper.waitVisibility(focusedTerminalTabLocator, timeout); } async selectTerminalTab(tabTitle: string, timeout: number = TestConstants.TS_SELENIUM_DEFAULT_TIMEOUT) { + Logger.debug(`Terminal.selectTerminalTab "${tabTitle}"`); + await this.clickOnTab(tabTitle, timeout); await this.waitTabFocused(tabTitle, timeout); } async clickOnTabCloseIcon(tabTitle: string, timeout: number = TestConstants.TS_SELENIUM_DEFAULT_TIMEOUT) { + Logger.debug(`Terminal.clickOnTabCloseIcon "${tabTitle}"`); + const terminalTabCloseIconLocator: By = By.css(`${this.getTerminalTabCssLocator(tabTitle)} div.p-TabBar-tabCloseIcon`); @@ -54,11 +67,15 @@ export class Terminal { } async closeTerminalTab(tabTitle: string, timeout: number = TestConstants.TS_SELENIUM_DEFAULT_TIMEOUT) { + Logger.debug(`Terminal.closeTerminalTab "${tabTitle}"`); + await this.clickOnTabCloseIcon(tabTitle, timeout); await this.waitTabAbsence(tabTitle, timeout); } async type(terminalTabTitle: string, text: string) { + Logger.debug(`Terminal.type "${terminalTabTitle}"`); + const terminalIndex: number = await this.getTerminalIndex(terminalTabTitle); const terminalInteractionContainer: By = this.getTerminalEditorInteractionEditorLocator(terminalIndex); @@ -66,6 +83,8 @@ export class Terminal { } async rejectTerminalProcess(tabTitle: string, timeout: number = TestConstants.TS_SELENIUM_DEFAULT_TIMEOUT) { + Logger.debug(`Terminal.rejectTerminalProcess "${tabTitle}"`); + await this.selectTerminalTab(tabTitle, timeout); await this.type(tabTitle, Key.chord(Key.CONTROL, 'c')); } diff --git a/e2e/pageobjects/ide/TopMenu.ts b/e2e/pageobjects/ide/TopMenu.ts index 5cdb25a46e6..a6728128417 100644 --- a/e2e/pageobjects/ide/TopMenu.ts +++ b/e2e/pageobjects/ide/TopMenu.ts @@ -4,6 +4,7 @@ import { DriverHelper } from '../../utils/DriverHelper'; import { TestConstants } from '../../TestConstants'; import { By } from 'selenium-webdriver'; import { Ide } from './Ide'; +import { Logger } from '../../utils/Logger'; /********************************************************************* * Copyright (c) 2019 Red Hat, Inc. @@ -23,6 +24,8 @@ export class TopMenu { @inject(CLASSES.Ide) private readonly ide: Ide) { } public async waitTopMenu(timeout: number = TestConstants.TS_SELENIUM_DEFAULT_TIMEOUT) { + Logger.debug('TopMenu.waitTopMenu'); + for (const buttonText of TopMenu.TOP_MENU_BUTTONS) { const buttonLocator: By = this.getTopMenuButtonLocator(buttonText); await this.driverHelper.waitVisibility(buttonLocator, timeout); @@ -30,11 +33,15 @@ export class TopMenu { } public async selectOption(topMenuButtonText: string, submenuItemtext: string) { + Logger.debug(`TopMenu.selectOption "${topMenuButtonText}"`); + await this.clickOnTopMenuButton(topMenuButtonText); await this.clickOnSubmenuItem(submenuItemtext); } public async clickOnTopMenuButton(buttonText: string, timeout: number = TestConstants.TS_SELENIUM_DEFAULT_TIMEOUT) { + Logger.debug(`TopMenu.clickOnTopMenuButton "${buttonText}"`); + const buttonLocator: By = this.getTopMenuButtonLocator(buttonText); await this.ide.closeAllNotifications(); @@ -42,6 +49,8 @@ export class TopMenu { } public async clickOnSubmenuItem(itemText: string, timeout: number = TestConstants.TS_SELENIUM_DEFAULT_TIMEOUT) { + Logger.debug(`TopMenu.clickOnSubmenuItem "${itemText}"`); + const submenuItemLocator: By = this.getSubmenuItemLocator(itemText); await this.driverHelper.waitAndClick(submenuItemLocator, timeout); } diff --git a/e2e/pageobjects/ide/WarningDialog.ts b/e2e/pageobjects/ide/WarningDialog.ts index c76b4976a26..fb2af8de5bf 100644 --- a/e2e/pageobjects/ide/WarningDialog.ts +++ b/e2e/pageobjects/ide/WarningDialog.ts @@ -11,6 +11,7 @@ import { injectable, inject } from 'inversify'; import { CLASSES } from '../../inversify.types'; import { DriverHelper } from '../../utils/DriverHelper'; import { By } from 'selenium-webdriver'; +import { Logger } from '../../utils/Logger'; @injectable() export class WarningDialog { @@ -20,11 +21,14 @@ export class WarningDialog { constructor(@inject(CLASSES.DriverHelper) private readonly driverHelper: DriverHelper) { } async dialogDisplayes(): Promise { + Logger.debug('WarningDialog.dialogDisplayes'); return await this.driverHelper.isVisible(By.xpath(WarningDialog.DIALOG_BODY_XPATH_LOCATOR)); } async waitAndCloseIfAppear() { + Logger.debug('WarningDialog.waitAndCloseIfAppear'); + const dialogDisplayes: boolean = await this.driverHelper.waitVisibilityBoolean(By.xpath(WarningDialog.DIALOG_BODY_XPATH_LOCATOR)); if (dialogDisplayes) { @@ -35,10 +39,14 @@ export class WarningDialog { } async closeDialog() { + Logger.debug('WarningDialog.closeDialog'); + await this.driverHelper.waitAndClick(By.xpath(WarningDialog.CLOSE_BUTTON_XPATH_LOCATOR)); } async waitDialogDissappearance() { + Logger.debug('WarningDialog.waitDialogDissappearance'); + await this.driverHelper.waitDisappearanceWithTimeout(By.xpath(WarningDialog.CLOSE_BUTTON_XPATH_LOCATOR)); } From 00a443c1ddcf39101399327415f70558c3d25970 Mon Sep 17 00:00:00 2001 From: Ihor Okhrimenko Date: Wed, 25 Sep 2019 09:42:19 +0300 Subject: [PATCH 06/18] Add logging of 'Editor' pageobject Signed-off-by: Ihor Okhrimenko --- e2e/pageobjects/ide/Editor.ts | 79 +++++++++++++++++++++++++++++++---- 1 file changed, 72 insertions(+), 7 deletions(-) diff --git a/e2e/pageobjects/ide/Editor.ts b/e2e/pageobjects/ide/Editor.ts index 7316d267b84..59d6fdb5669 100644 --- a/e2e/pageobjects/ide/Editor.ts +++ b/e2e/pageobjects/ide/Editor.ts @@ -14,6 +14,7 @@ import { CLASSES } from '../../inversify.types'; import { TestConstants } from '../../TestConstants'; import { By, Key, error, ActionSequence, Button } from 'selenium-webdriver'; import { Ide } from './Ide'; +import { Logger } from '../../utils/Logger'; @injectable() @@ -28,10 +29,14 @@ export class Editor { @inject(CLASSES.Ide) private readonly ide: Ide) { } public async waitSuggestionContainer(timeout: number = TestConstants.TS_SELENIUM_DEFAULT_TIMEOUT) { + Logger.debug('Editor.waitSuggestionContainer'); + await this.driverHelper.waitVisibility(By.css(Editor.SUGGESTION_WIDGET_BODY_CSS), timeout); } public async waitSuggestionContainerClosed() { + Logger.debug('Editor.waitSuggestionContainerClosed'); + await this.driverHelper.waitDisappearanceWithTimeout(By.css(Editor.SUGGESTION_WIDGET_BODY_CSS)); } @@ -39,6 +44,8 @@ export class Editor { suggestionText: string, timeout: number = TestConstants.TS_SELENIUM_DEFAULT_TIMEOUT) { + Logger.debug(`Editor.waitSuggestion tabTitle: "${editorTabTitle}" suggestion: "${suggestionText}"`); + const suggestionLocator: By = this.getSuggestionLineXpathLocator(suggestionText); await this.driverHelper.getDriver().wait(async () => { @@ -59,39 +66,56 @@ export class Editor { } public async pressControlSpaceCombination(editorTabTitle: string) { + Logger.debug(`Editor.pressControlSpaceCombination "${editorTabTitle}"`); + await this.performKeyCombination(editorTabTitle, Key.chord(Key.CONTROL, Key.SPACE)); } public async pressEscapeButton(editorTabTitle: string) { + Logger.debug(`Editor.pressEscapeButton "${editorTabTitle}"`); + await this.performKeyCombination(editorTabTitle, Key.ESCAPE); } public async clickOnSuggestion(suggestionText: string, timeout: number = TestConstants.TS_SELENIUM_DEFAULT_TIMEOUT) { + Logger.debug(`Editor.clickOnSuggestion "${suggestionText}"`); + await this.driverHelper.waitAndClick(this.getSuggestionLineXpathLocator(suggestionText), timeout); } public async waitTab(tabTitle: string, timeout: number = TestConstants.TS_SELENIUM_DEFAULT_TIMEOUT) { + Logger.debug(`Editor.waitTab "${tabTitle}"`); + await this.driverHelper.waitVisibility(By.xpath(this.getTabXpathLocator(tabTitle)), timeout); } public async waitTabDisappearance(tabTitle: string, attempt: number = TestConstants.TS_SELENIUM_DEFAULT_ATTEMPTS, polling: number = TestConstants.TS_SELENIUM_DEFAULT_POLLING) { + + Logger.debug(`Editor.waitTabDisappearance "${tabTitle}"`); + await this.driverHelper.waitDisappearance(By.xpath(this.getTabXpathLocator(tabTitle)), attempt, polling); } public async clickOnTab(tabTitle: string, timeout: number = TestConstants.TS_SELENIUM_DEFAULT_TIMEOUT) { + Logger.debug(`Editor.clickOnTab "${tabTitle}"`); + await this.ide.closeAllNotifications(); await this.driverHelper.waitAndClick(By.xpath(this.getTabXpathLocator(tabTitle)), timeout); } public async waitTabFocused(tabTitle: string, timeout: number = TestConstants.TS_SELENIUM_DEFAULT_TIMEOUT) { + Logger.debug(`Editor.waitTabFocused "${tabTitle}"`); + const focusedTabLocator: By = By.xpath(`//li[contains(@class, 'p-TabBar-tab') and contains(@class, 'theia-mod-active')]//div[text()='${tabTitle}']`); await this.driverHelper.waitVisibility(focusedTabLocator, timeout); } public async selectTab(tabTitle: string, timeout: number = TestConstants.TS_SELENIUM_DEFAULT_TIMEOUT) { + Logger.debug(`Editor.selectTab "${tabTitle}"`); + await this.ide.closeAllNotifications(); await this.waitTab(tabTitle, timeout); await this.clickOnTab(tabTitle, timeout); @@ -99,18 +123,24 @@ export class Editor { } async closeTab(tabTitle: string, timeout: number = TestConstants.TS_SELENIUM_DEFAULT_TIMEOUT) { + Logger.debug(`Editor.closeTab "${tabTitle}"`); + const tabCloseButtonLocator: By = By.xpath(`//div[text()='${tabTitle}']/parent::li//div[contains(@class, 'p-TabBar-tabCloseIcon')]`); await this.driverHelper.waitAndClick(tabCloseButtonLocator, timeout); } async waitTabWithUnsavedStatus(tabTitle: string, timeout: number = TestConstants.TS_SELENIUM_DEFAULT_TIMEOUT) { + Logger.debug(`Editor.waitTabWithUnsavedStatus "${tabTitle}"`); + const unsavedTabLocator: By = this.getTabWithUnsavedStatus(tabTitle); await this.driverHelper.waitVisibility(unsavedTabLocator, timeout); } async waitTabWithSavedStatus(tabTitle: string, timeout: number = TestConstants.TS_SELENIUM_DEFAULT_TIMEOUT) { + Logger.debug(`Editor.waitTabWithSavedStatus "${tabTitle}"`); + const unsavedTabLocator: By = this.getTabWithUnsavedStatus(tabTitle); await this.driverHelper.getDriver().wait(async () => { @@ -130,6 +160,8 @@ export class Editor { } async waitEditorOpened(editorTabTitle: string, timeout: number = TestConstants.TS_SELENIUM_DEFAULT_TIMEOUT) { + Logger.debug(`Editor.waitEditorOpened "${editorTabTitle}"`); + const firstEditorLineLocator: By = By.xpath(this.getEditorLineXpathLocator(1)); await this.driverHelper.waitPresence(this.getEditorBodyLocator(editorTabTitle), timeout); @@ -137,11 +169,15 @@ export class Editor { } async waitEditorAvailable(tabTitle: string, timeout: number = TestConstants.TS_SELENIUM_DEFAULT_TIMEOUT) { + Logger.debug(`Editor.waitEditorAvailable "${tabTitle}"`); + await this.waitTab(tabTitle, timeout); await this.waitEditorOpened(tabTitle, timeout); } async getLineText(tabTitle: string, lineNumber: number): Promise { + Logger.debug(`Editor.getLineText "${tabTitle}"`); + const lineIndex: number = lineNumber - 1; const editorText: string = await this.getEditorVisibleText(tabTitle); const editorLines: string[] = editorText.split('\n'); @@ -151,6 +187,8 @@ export class Editor { } async getEditorVisibleText(tabTitle: string): Promise { + Logger.debug(`Editor.getEditorVisibleText "${tabTitle}"`); + const editorBodyLocator: By = By.xpath(`//div[contains(@data-uri, \'${tabTitle}')]//div[@class=\'view-lines\']`); // const editorBodyLocator: By = By.xpath('//div[@class=\'view-lines\']'); const editorText: string = await this.driverHelper.waitAndGetText(editorBodyLocator); @@ -160,6 +198,9 @@ export class Editor { async waitText(tabTitle: string, expectedText: string, timeout: number = TestConstants.TS_SELENIUM_DEFAULT_TIMEOUT, polling: number = TestConstants.TS_SELENIUM_DEFAULT_POLLING) { + + Logger.debug(`Editor.waitText "${tabTitle}"`); + await this.driverHelper.getDriver().wait(async () => { const editorText: string = await this.getEditorVisibleText(tabTitle); const isEditorContainText: boolean = editorText.includes(expectedText); @@ -177,6 +218,8 @@ export class Editor { timeout: number = TestConstants.TS_SELENIUM_DEFAULT_TIMEOUT, polling: number = TestConstants.TS_SELENIUM_DEFAULT_POLLING) { + Logger.debug(`Editor.followAndWaitForText title: "${editorTabTitle}" text: "${expectedText}"`); + await this.selectTab(editorTabTitle, timeout); await this.driverHelper.getDriver().wait(async () => { await this.performKeyCombination(editorTabTitle, Key.chord(Key.CONTROL, Key.END)); @@ -193,6 +236,8 @@ export class Editor { } async moveCursorToLineAndChar(editorTabTitle: string, line: number, char: number) { + Logger.debug(`Editor.moveCursorToLineAndChar title: "${editorTabTitle}" line: "${line}" char: "${char}"`); + // set cursor to the 1:1 position await this.performKeyCombination(editorTabTitle, Key.chord(Key.CONTROL, Key.HOME)); @@ -208,59 +253,71 @@ export class Editor { } async performKeyCombination(editorTabTitle: string, text: string) { - const interactionContainerLocator: By = this.getEditorActionArreaLocator(editorTabTitle); + Logger.debug(`Editor.performKeyCombination title: "${editorTabTitle}" text: "${text}"`); + const interactionContainerLocator: By = this.getEditorActionArreaLocator(editorTabTitle); await this.driverHelper.type(interactionContainerLocator, text); } async type(editorTabTitle: string, text: string, line: number) { + Logger.debug(`Editor.type title: "${editorTabTitle}" text: "${text}"`); + await this.selectTab(editorTabTitle); await this.moveCursorToLineAndChar(editorTabTitle, line, 1); await this.performKeyCombination(editorTabTitle, text); } async waitErrorInLine(lineNumber: number, timeout: number = TestConstants.TS_SELENIUM_DEFAULT_TIMEOUT) { - const errorInLineLocator: By = await this.getErrorInLineLocator(lineNumber); + Logger.debug(`Editor.waitErrorInLine line: "${lineNumber}"`); + const errorInLineLocator: By = await this.getErrorInLineLocator(lineNumber); await this.driverHelper.waitVisibility(errorInLineLocator, timeout); } async waitErrorInLineDisappearance(lineNumber: number, timeout: number = TestConstants.TS_SELENIUM_DEFAULT_TIMEOUT) { - const errorInLineLocator: By = await this.getErrorInLineLocator(lineNumber); + Logger.debug(`Editor.waitErrorInLineDisappearance line: "${lineNumber}"`); + const errorInLineLocator: By = await this.getErrorInLineLocator(lineNumber); await this.driverHelper.waitDisappearanceWithTimeout(errorInLineLocator, timeout); } async waitStoppedDebugBreakpoint(tabTitle: string, lineNumber: number, timeout: number = TestConstants.TS_SELENIUM_DEFAULT_TIMEOUT) { + Logger.debug(`Editor.waitStoppedDebugBreakpoint title: "${tabTitle}" line: "${lineNumber}"`); + const stoppedDebugBreakpointLocator: By = By.xpath(await this.getStoppedDebugBreakpointXpathLocator(tabTitle, lineNumber)); await this.driverHelper.waitVisibility(stoppedDebugBreakpointLocator, timeout); } async waitBreakpoint(tabTitle: string, lineNumber: number, timeout: number = TestConstants.TS_SELENIUM_DEFAULT_TIMEOUT) { - const debugBreakpointLocator: By = await this.getDebugBreakpointLocator(tabTitle, lineNumber); + Logger.debug(`Editor.waitBreakpoint title: "${tabTitle}" line: "${lineNumber}"`); + const debugBreakpointLocator: By = await this.getDebugBreakpointLocator(tabTitle, lineNumber); await this.driverHelper.waitVisibility(debugBreakpointLocator, timeout); } async waitBreakpointAbsence(tabTitle: string, lineNumber: number, timeout: number = TestConstants.TS_SELENIUM_DEFAULT_TIMEOUT) { - const debugBreakpointLocator: By = await this.getDebugBreakpointLocator(tabTitle, lineNumber); + Logger.debug(`Editor.waitBreakpointAbsence title: "${tabTitle}" line: "${lineNumber}"`); + const debugBreakpointLocator: By = await this.getDebugBreakpointLocator(tabTitle, lineNumber); await this.driverHelper.waitDisappearanceWithTimeout(debugBreakpointLocator, timeout); } async waitBreakpointHint(tabTitle: string, lineNumber: number, timeout: number = TestConstants.TS_SELENIUM_DEFAULT_TIMEOUT) { - const debugBreakpointHintLocator: By = await this.getDebugBreakpointHintLocator(tabTitle, lineNumber); + Logger.debug(`Editor.waitBreakpointHint title: "${tabTitle}" line: "${lineNumber}"`); + const debugBreakpointHintLocator: By = await this.getDebugBreakpointHintLocator(tabTitle, lineNumber); await this.driverHelper.waitVisibility(debugBreakpointHintLocator, timeout); } async waitBreakpointHintDisappearance(tabTitle: string, lineNumber: number, timeout: number = TestConstants.TS_SELENIUM_DEFAULT_TIMEOUT) { - const debugBreakpointHintLocator: By = await this.getDebugBreakpointHintLocator(tabTitle, lineNumber); + Logger.debug(`Editor.waitBreakpointHintDisappearance title: "${tabTitle}" line: "${lineNumber}"`); + const debugBreakpointHintLocator: By = await this.getDebugBreakpointHintLocator(tabTitle, lineNumber); await this.driverHelper.waitDisappearanceWithTimeout(debugBreakpointHintLocator, timeout); } async activateBreakpoint(tabTitle: string, lineNumber: number) { + Logger.debug(`Editor.activateBreakpoint title: "${tabTitle}" line: "${lineNumber}"`); const attempts: number = TestConstants.TS_SELENIUM_DEFAULT_ATTEMPTS; const polling: number = TestConstants.TS_SELENIUM_DEFAULT_POLLING; @@ -285,6 +342,8 @@ export class Editor { async getLineYCoordinates(lineNumber: number): Promise { + Logger.debug(`Editor.getLineYCoordinates line: "${lineNumber}"`); + const lineNumberLocator: By = By.xpath(`//div[contains(@class, 'line-numbers') and text()='${lineNumber}']` + `//parent::div[contains(@style, 'position')]`); @@ -303,6 +362,8 @@ export class Editor { } async clickOnLineAndChar(line: number, char: number) { + Logger.debug(`Editor.clickOnLineAndChar line: "${line}" char: "${char}"`); + const yPosition: number = await this.getLineYCoordinates(line) + Editor.ADDITIONAL_SHIFTING_TO_Y; const xPosition: number = char + Editor.ADDITIONAL_SHIFTING_TO_X; @@ -313,6 +374,8 @@ export class Editor { } async goToDefinitionWithMouseClicking(line: number, char: number) { + Logger.debug(`Editor.goToDefinitionWithMouseClicking line: "${line}" char: "${char}"`); + const yPosition: number = await this.getLineYCoordinates(line) + Editor.ADDITIONAL_SHIFTING_TO_Y; new ActionSequence(this.driverHelper.getDriver()). @@ -324,6 +387,8 @@ export class Editor { } async mouseRightButtonClick(line: number, char: number) { + Logger.debug(`Editor.mouseRightButtonClick line: "${line}" char: "${char}"`); + const yPosition: number = await this.getLineYCoordinates(line) + Editor.ADDITIONAL_SHIFTING_TO_Y; new ActionSequence(this.driverHelper.getDriver()). From 75f4ca2c386a746e9ac2b6326464f073bb076e82 Mon Sep 17 00:00:00 2001 From: Ihor Okhrimenko Date: Wed, 25 Sep 2019 12:00:45 +0300 Subject: [PATCH 07/18] Cover the 'WorkspaceDetails' by logging Signed-off-by: Ihor Okhrimenko --- .../workspace-details/WorkspaceDetails.ts | 22 ++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/e2e/pageobjects/dashboard/workspace-details/WorkspaceDetails.ts b/e2e/pageobjects/dashboard/workspace-details/WorkspaceDetails.ts index 8c0ab2b1edd..da685ec1a7c 100644 --- a/e2e/pageobjects/dashboard/workspace-details/WorkspaceDetails.ts +++ b/e2e/pageobjects/dashboard/workspace-details/WorkspaceDetails.ts @@ -16,6 +16,7 @@ import { By } from 'selenium-webdriver'; import { Ide } from '../../ide/Ide'; import { ITestWorkspaceUtil } from '../../../utils/workspace/ITestWorkspaceUtil'; import { WorkspaceStatus } from '../../../utils/workspace/WorkspaceStatus'; +import { Logger } from '../../../utils/Logger'; @injectable() @@ -30,16 +31,22 @@ export class WorkspaceDetails { @inject(TYPES.WorkspaceUtil) private readonly testWorkspaceUtil: ITestWorkspaceUtil) { } async waitLoaderDisappearance(attempts: number = TestConstants.TS_SELENIUM_DEFAULT_ATTEMPTS, polling: number = TestConstants.TS_SELENIUM_DEFAULT_POLLING) { + Logger.debug('WorkspaceDetails.waitLoaderDisappearance'); + await this.driverHelper.waitDisappearance(By.css(WorkspaceDetails.WORKSPACE_DETAILS_LOADER_CSS), attempts, polling); } async saveChanges() { + Logger.debug('WorkspaceDetails.saveChanges'); + await this.waitSaveButton(); await this.clickOnSaveButton(); await this.waitSaveButtonDisappearance(); } async waitPage(workspaceName: string, timeout: number = TestConstants.TS_SELENIUM_LOAD_PAGE_TIMEOUT) { + Logger.debug(`WorkspaceDetails.saveChanges workspace: "${workspaceName}"`); + await this.waitWorkspaceTitle(workspaceName, timeout); await this.waitOpenButton(timeout); await this.waitRunButton(timeout); @@ -48,31 +55,42 @@ export class WorkspaceDetails { } async waitWorkspaceTitle(workspaceName: string, timeout: number = TestConstants.TS_SELENIUM_LOAD_PAGE_TIMEOUT) { + Logger.debug(`WorkspaceDetails.waitWorkspaceTitle title: "${workspaceName}"`); + const workspaceTitleLocator: By = By.css(this.getWorkspaceTitleCssLocator(workspaceName)); await this.driverHelper.waitVisibility(workspaceTitleLocator, timeout); } async waitRunButton(timeout: number = TestConstants.TS_SELENIUM_LOAD_PAGE_TIMEOUT) { + Logger.debug('WorkspaceDetails.waitRunButton'); + await this.driverHelper.waitVisibility(By.css(WorkspaceDetails.RUN_BUTTON_CSS), timeout); } async clickOnRunButton(timeout: number = TestConstants.TS_SELENIUM_LOAD_PAGE_TIMEOUT) { + Logger.debug('WorkspaceDetails.clickOnRunButton'); + await this.driverHelper.waitAndClick(By.css(WorkspaceDetails.RUN_BUTTON_CSS), timeout); } async waitOpenButton(timeout: number = TestConstants.TS_SELENIUM_LOAD_PAGE_TIMEOUT) { + Logger.debug('WorkspaceDetails.waitOpenButton'); + await this.driverHelper.waitVisibility(By.css(WorkspaceDetails.OPEN_BUTTON_CSS), timeout); } async openWorkspace(namespace: string, workspaceName: string, timeout: number = TestConstants.TS_SELENIUM_LOAD_PAGE_TIMEOUT) { - await this.clickOnOpenButton(timeout); + Logger.debug(`WorkspaceDetails.openWorkspace "${namespace}/${workspaceName}"`); + await this.clickOnOpenButton(timeout); await this.driverHelper.waitVisibility(By.css(Ide.ACTIVATED_IDE_IFRAME_CSS)); await this.testWorkspaceUtil.waitWorkspaceStatus(namespace, workspaceName, WorkspaceStatus.STARTING); } async waitTabsPresence(timeout: number = TestConstants.TS_SELENIUM_LOAD_PAGE_TIMEOUT) { + Logger.debug('WorkspaceDetails.waitTabsPresence'); + const workspaceDetailsTabs: Array = ['Overview', 'Projects', 'Containers', 'Servers', 'Env Variables', 'Volumes', 'Config', 'SSH', 'Plugins', 'Editors']; @@ -84,6 +102,8 @@ export class WorkspaceDetails { } async selectTab(tabTitle: string, timeout: number = TestConstants.TS_SELENIUM_DEFAULT_TIMEOUT) { + Logger.debug(`WorkspaceDetails.selectTab ${tabTitle}`); + await this.clickOnTab(tabTitle, timeout); await this.waitTabSelected(tabTitle, timeout); } From 1aa2970f83c40c098c515e9240fd8aa9ce7e13c3 Mon Sep 17 00:00:00 2001 From: Ihor Okhrimenko Date: Wed, 25 Sep 2019 12:07:58 +0300 Subject: [PATCH 08/18] Cover the 'WorkspaceDetailsPlugins' by logging Signed-off-by: Ihor Okhrimenko --- .../workspace-details/WorkspaceDetailsPlugins.ts | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/e2e/pageobjects/dashboard/workspace-details/WorkspaceDetailsPlugins.ts b/e2e/pageobjects/dashboard/workspace-details/WorkspaceDetailsPlugins.ts index ebfbdc427a8..1d094c7c66a 100644 --- a/e2e/pageobjects/dashboard/workspace-details/WorkspaceDetailsPlugins.ts +++ b/e2e/pageobjects/dashboard/workspace-details/WorkspaceDetailsPlugins.ts @@ -12,10 +12,11 @@ import { injectable, inject } from 'inversify'; import 'reflect-metadata'; import { CLASSES, TYPES } from '../../../inversify.types'; import { TestConstants } from '../../../TestConstants'; -import { By } from 'selenium-webdriver'; +import { By, logging } from 'selenium-webdriver'; import { WorkspaceDetails } from './WorkspaceDetails'; import { ITestWorkspaceUtil } from '../../../utils/workspace/ITestWorkspaceUtil'; import { WorkspaceStatus } from '../../../utils/workspace/WorkspaceStatus'; +import { Logger } from '../../../utils/Logger'; @injectable() @@ -25,24 +26,32 @@ export class WorkspaceDetailsPlugins { @inject(TYPES.WorkspaceUtil) private readonly testWorkspaceUtil: ITestWorkspaceUtil) { } async waitPluginListItem(pluginName: string, timeout: number = TestConstants.TS_SELENIUM_DEFAULT_TIMEOUT) { + Logger.debug(`WorkspaceDetailsPlugins.waitPluginListItem ${pluginName}`); + const pluginListItemLocator: By = By.css(this.getPluginListItemCssLocator(pluginName)); await this.driverHelper.waitVisibility(pluginListItemLocator, timeout); } async enablePlugin(pluginName: string, pluginVersion?: string, timeout: number = TestConstants.TS_SELENIUM_DEFAULT_TIMEOUT) { + Logger.debug(`WorkspaceDetailsPlugins.enablePlugin ${pluginName}:${pluginVersion}`); + await this.waitPluginDisabling(pluginName, pluginVersion, timeout); await this.clickOnPluginListItemSwitcher(pluginName, pluginVersion, timeout); await this.waitPluginEnabling(pluginName, pluginVersion, timeout); } async disablePlugin(pluginName: string, pluginVersion?: string, timeout: number = TestConstants.TS_SELENIUM_DEFAULT_TIMEOUT) { + Logger.debug(`WorkspaceDetailsPlugins.disablePlugin ${pluginName}:${pluginVersion}`); + await this.waitPluginEnabling(pluginName, pluginVersion, timeout); await this.clickOnPluginListItemSwitcher(pluginName, pluginVersion, timeout); await this.waitPluginDisabling(pluginName, pluginVersion, timeout); } async addPluginAndOpenWorkspace(namespace: string, workspaceName: string, pluginName: string, pluginId: string, pluginVersion?: string) { + Logger.debug(`WorkspaceDetailsPlugins.addPluginAndOpenWorkspace ${namespace}/${workspaceName} plugin: ${pluginName}:${pluginVersion}`); + await this.workspaceDetails.selectTab('Plugins'); await this.enablePlugin(pluginName, pluginVersion); await this.workspaceDetails.saveChanges(); From dca6d0738c0cd37c3ca8c24d2cb717479c24dfe4 Mon Sep 17 00:00:00 2001 From: Ihor Okhrimenko Date: Wed, 25 Sep 2019 12:16:50 +0300 Subject: [PATCH 09/18] Cover the 'Dashboard' by logging Signed-off-by: Ihor Okhrimenko --- e2e/pageobjects/dashboard/Dashboard.ts | 25 +++++++++++++++++++++++-- 1 file changed, 23 insertions(+), 2 deletions(-) diff --git a/e2e/pageobjects/dashboard/Dashboard.ts b/e2e/pageobjects/dashboard/Dashboard.ts index 089ca570351..dda069fd539 100644 --- a/e2e/pageobjects/dashboard/Dashboard.ts +++ b/e2e/pageobjects/dashboard/Dashboard.ts @@ -14,6 +14,7 @@ import { By } from 'selenium-webdriver'; import { DriverHelper } from '../../utils/DriverHelper'; import { TestConstants } from '../../TestConstants'; import { Workspaces } from './Workspaces'; +import { Logger } from '../../utils/Logger'; @injectable() export class Dashboard { @@ -27,6 +28,8 @@ export class Dashboard { @inject(CLASSES.Workspaces) private readonly workspaces: Workspaces) { } async stopWorkspaceByUI(workspaceName: string) { + Logger.debug(`Dashboard.stopWorkspaceByUI "${workspaceName}"`); + await this.openDashboard(); await this.clickWorkspacesButton(); await this.workspaces.waitPage(); @@ -37,6 +40,8 @@ export class Dashboard { } async deleteWorkspaceByUI(workspaceName: string) { + Logger.debug(`Dashboard.deleteWorkspaceByUI "${workspaceName}"`); + await this.openDashboard(); await this.clickWorkspacesButton(); await this.workspaces.waitPage(); @@ -49,12 +54,16 @@ export class Dashboard { } async openDashboard() { - await this.driverHelper.getDriver().navigate().to(TestConstants.TS_SELENIUM_BASE_URL); - await this.waitPage(); + Logger.debug('Dashboard.openDashboard'); + + await this.driverHelper.getDriver().navigate().to(TestConstants.TS_SELENIUM_BASE_URL); + await this.waitPage(); } async waitPage(timeout: number = TestConstants.TS_SELENIUM_LOAD_PAGE_TIMEOUT) { + Logger.debug('Dashboard.waitPage'); + await this.driverHelper.waitVisibility(By.css(Dashboard.DASHBOARD_BUTTON_CSS), timeout); await this.driverHelper.waitVisibility(By.css(Dashboard.WORKSPACES_BUTTON_CSS), timeout); await this.driverHelper.waitVisibility(By.css(Dashboard.STACKS_BUTTON_CSS), timeout); @@ -62,26 +71,38 @@ export class Dashboard { } async clickDashboardButton(timeout: number = TestConstants.TS_SELENIUM_DEFAULT_TIMEOUT) { + Logger.debug('Dashboard.clickDashboardButton'); + await this.driverHelper.waitAndClick(By.css(Dashboard.DASHBOARD_BUTTON_CSS), timeout); } async clickWorkspacesButton(timeout: number = TestConstants.TS_SELENIUM_DEFAULT_TIMEOUT) { + Logger.debug('Dashboard.clickWorkspacesButton'); + await this.driverHelper.waitAndClick(By.css(Dashboard.WORKSPACES_BUTTON_CSS), timeout); } async clickStacksdButton(timeout: number = TestConstants.TS_SELENIUM_DEFAULT_TIMEOUT) { + Logger.debug('Dashboard.clickStacksdButton'); + await this.driverHelper.waitAndClick(By.css(Dashboard.STACKS_BUTTON_CSS), timeout); } async clickFactoriesButton(timeout: number = TestConstants.TS_SELENIUM_DEFAULT_TIMEOUT) { + Logger.debug('Dashboard.clickFactoriesButton'); + await this.driverHelper.waitAndClick(By.css(Dashboard.FACTORIES_BUTTON_CSS), timeout); } async waitLoader(timeout: number = TestConstants.TS_SELENIUM_DEFAULT_TIMEOUT) { + Logger.debug('Dashboard.waitLoader'); + await this.driverHelper.waitVisibility(By.css(Dashboard.LOADER_PAGE_CSS), timeout); } async waitLoaderDisappearance(timeout: number = TestConstants.TS_SELENIUM_DEFAULT_TIMEOUT) { + Logger.debug('Dashboard.waitLoaderDisappearance'); + await this.driverHelper.waitDisappearance(By.css(Dashboard.LOADER_PAGE_CSS), timeout); } From c53f36b3b0a60c24343c378612cc6084af250c4e Mon Sep 17 00:00:00 2001 From: Ihor Okhrimenko Date: Wed, 25 Sep 2019 12:28:52 +0300 Subject: [PATCH 10/18] Cover the 'NewWorkspace' by logging Signed-off-by: Ihor Okhrimenko --- e2e/pageobjects/dashboard/NewWorkspace.ts | 45 +++++++++++++++++++++++ 1 file changed, 45 insertions(+) diff --git a/e2e/pageobjects/dashboard/NewWorkspace.ts b/e2e/pageobjects/dashboard/NewWorkspace.ts index 5a32ed245b9..cd63615ad33 100644 --- a/e2e/pageobjects/dashboard/NewWorkspace.ts +++ b/e2e/pageobjects/dashboard/NewWorkspace.ts @@ -17,6 +17,7 @@ import { Dashboard } from './Dashboard'; import { Workspaces } from './Workspaces'; import { WorkspaceDetails } from './workspace-details/WorkspaceDetails'; import { ITestWorkspaceUtil, Ide, WorkspaceStatus } from '../..'; +import { Logger } from '../../utils/Logger'; @injectable() @@ -40,6 +41,8 @@ export class NewWorkspace { @inject(CLASSES.WorkspaceDetails) private readonly workspaceDetails: WorkspaceDetails) { } async createAndRunWorkspace(namespace: string, workspaceName: string, dataStackId: string) { + Logger.debug(`NewWorkspace.createAndRunWorkspace "${namespace}/${workspaceName}" stackID: "${dataStackId}"`); + await this.prepareWorkspace(workspaceName, dataStackId); await this.clickOnCreateAndOpenButton(); @@ -49,11 +52,15 @@ export class NewWorkspace { } async waitPageAbsence(timeout: number = TestConstants.TS_SELENIUM_LOAD_PAGE_TIMEOUT) { + Logger.debug('NewWorkspace.waitPageAbsence'); + await this.driverHelper.waitDisappearanceWithTimeout(By.css(NewWorkspace.NAME_FIELD_CSS), timeout); await this.driverHelper.waitDisappearanceWithTimeout(By.css(NewWorkspace.TITLE_CSS), timeout); } async createWorkspaceAndProceedEditing(workspaceName: string, dataStackId: string) { + Logger.debug(`NewWorkspace.createWorkspaceAndProceedEditing "${workspaceName}" stackID: "${dataStackId}"`); + await this.prepareWorkspace(workspaceName, dataStackId); await this.selectCreateWorkspaceAndProceedEditing(); @@ -61,20 +68,28 @@ export class NewWorkspace { } async createAndOpenWorkspace(workspaceName: string, dataStackId: string) { + Logger.debug(`NewWorkspace.createAndOpenWorkspace "${workspaceName}" stackID: "${dataStackId}"`); + await this.prepareWorkspace(workspaceName, dataStackId); await this.clickOnCreateAndOpenButton(); } async confirmProjectAdding(sampleName: string, timeout: number = TestConstants.TS_SELENIUM_DEFAULT_TIMEOUT) { + Logger.debug(`NewWorkspace.confirmProjectAdding "${sampleName}"`); + await this.clickOnAddButton(timeout); await this.waitProjectAdding(sampleName, timeout); } async waitProjectSourceForm(timeout: number = TestConstants.TS_SELENIUM_DEFAULT_TIMEOUT) { + Logger.debug('NewWorkspace.waitProjectSourceForm'); + await this.driverHelper.waitVisibility(By.css(NewWorkspace.PROJECT_SOURCE_FORM_CSS), timeout); } async selectStack(dataStackId: string, timeout: number = TestConstants.TS_SELENIUM_DEFAULT_TIMEOUT) { + Logger.debug(`NewWorkspace.selectStack datastackID: "${dataStackId}"`); + const stackLocator: By = By.css(this.getStackCssLocator(dataStackId)); await this.driverHelper.waitAndClick(stackLocator, timeout); @@ -82,12 +97,16 @@ export class NewWorkspace { } async waitStackSelection(dataStackId: string, timeout: number = TestConstants.TS_SELENIUM_DEFAULT_TIMEOUT) { + Logger.debug(`NewWorkspace.waitStackSelection datastackID: "${dataStackId}"`); + const selectedStackLocator: By = By.css(this.getSelectedStackCssLocator(dataStackId)); await this.driverHelper.waitAndClick(selectedStackLocator, timeout); } async openPageByUI() { + Logger.debug('NewWorkspace.openPageByUI'); + await this.dashboard.waitPage(); await this.dashboard.clickWorkspacesButton(); await this.workspaces.clickAddWorkspaceButton(); @@ -96,16 +115,22 @@ export class NewWorkspace { } async waitPage(timeout: number = TestConstants.TS_SELENIUM_LOAD_PAGE_TIMEOUT) { + Logger.debug('NewWorkspace.waitPage'); + await this.driverHelper.waitVisibility(By.css(NewWorkspace.NAME_FIELD_CSS), timeout); await this.driverHelper.waitVisibility(By.css(NewWorkspace.TITLE_CSS), timeout); await this.waitLoaderAbsence(timeout); } async waitLoaderAbsence(timeout: number = TestConstants.TS_SELENIUM_LOAD_PAGE_TIMEOUT) { + Logger.debug('NewWorkspace.waitLoaderAbsence'); + await this.driverHelper.waitPresence(By.css(NewWorkspace.HIDDEN_LOADER_CSS), timeout); } async selectCreateWorkspaceAndProceedEditing(timeout: number = TestConstants.TS_SELENIUM_DEFAULT_TIMEOUT) { + Logger.debug('NewWorkspace.selectCreateWorkspaceAndProceedEditing'); + const createAndProceedEditingButtonLocator: By = By.xpath('//span[text()=\'Create & Proceed Editing\']'); // open drop down list @@ -116,12 +141,16 @@ export class NewWorkspace { } async typeWorkspaceName(workspaceName: string, timeout: number = TestConstants.TS_SELENIUM_DEFAULT_TIMEOUT) { + Logger.debug(`NewWorkspace.typeWorkspaceName "${workspaceName}"`); + const workspaceNameFieldLocator: By = By.css(NewWorkspace.NAME_FIELD_CSS); await this.driverHelper.enterValue(workspaceNameFieldLocator, workspaceName, timeout); } async clickOnChe7Stack(timeout: number = TestConstants.TS_SELENIUM_DEFAULT_TIMEOUT) { + Logger.debug('NewWorkspace.clickOnChe7Stack'); + const che7StackLocator: By = By.css(NewWorkspace.CHE_7_STACK_CSS); await this.driverHelper.waitAndClick(che7StackLocator, timeout); @@ -129,12 +158,16 @@ export class NewWorkspace { } async waitChe7StackSelected(timeout: number = TestConstants.TS_SELENIUM_DEFAULT_TIMEOUT) { + Logger.debug('NewWorkspace.waitChe7StackSelected'); + const che7SelectedStackLocator: By = By.css(NewWorkspace.SELECTED_CHE_7_STACK_CSS); await this.driverHelper.waitVisibility(che7SelectedStackLocator, timeout); } async clickOnCreateAndOpenButton(timeout: number = TestConstants.TS_SELENIUM_DEFAULT_TIMEOUT) { + Logger.debug('NewWorkspace.clickOnCreateAndOpenButton'); + const ideFrameLocator: By = By.xpath('//ide-iframe[@id=\'ide-iframe-window\' and @aria-hidden=\'false\']'); await this.driverHelper.waitAndClick(By.xpath(NewWorkspace.CREATE_AND_OPEN_BUTTON_XPATH), timeout); @@ -144,6 +177,8 @@ export class NewWorkspace { } async clickOnAddOrImportProjectButton(timeout: number = TestConstants.TS_SELENIUM_DEFAULT_TIMEOUT) { + Logger.debug('NewWorkspace.clickOnAddOrImportProjectButton'); + const addOrImportProjectButtonLocator: By = By.css(NewWorkspace.ADD_OR_IMPORT_PROJECT_BUTTON_CSS); await this.driverHelper.waitAndClick(addOrImportProjectButtonLocator, timeout); @@ -151,12 +186,16 @@ export class NewWorkspace { } async waitSampleCheckboxEnabling(sampleName: string, timeout: number = TestConstants.TS_SELENIUM_DEFAULT_TIMEOUT) { + Logger.debug(`NewWorkspace.waitSampleCheckboxEnabling "${sampleName}"`); + const enabledSampleCheckboxLocator: By = By.css(`#sample-${sampleName}>md-checkbox[aria-checked='true']`); await this.driverHelper.waitVisibility(enabledSampleCheckboxLocator, timeout); } async enableSampleCheckbox(sampleName: string, timeout: number = TestConstants.TS_SELENIUM_DEFAULT_TIMEOUT) { + Logger.debug(`NewWorkspace.enableSampleCheckbox "${sampleName}"`); + const sampleCheckboxLocator: By = By.xpath(`(//*[@id='sample-${sampleName}']//md-checkbox//div)[1]`); await this.driverHelper.waitAndClick(sampleCheckboxLocator, timeout); @@ -164,18 +203,24 @@ export class NewWorkspace { } async waitProjectAdding(projectName: string, timeout: number = TestConstants.TS_SELENIUM_DEFAULT_TIMEOUT) { + Logger.debug(`NewWorkspace.waitProjectAdding "${projectName}"`); + const addedProjectLocator: By = By.css(`#project-source-selector toggle-single-button#${projectName}`); await this.driverHelper.waitVisibility(addedProjectLocator, timeout); } async waitProjectAbsence(projectName: string, timeout: number = TestConstants.TS_SELENIUM_DEFAULT_TIMEOUT) { + Logger.debug(`NewWorkspace.waitProjectAbsence "${projectName}"`); + const addedProjectLocator: By = By.css(`#project-source-selector toggle-single-button#${projectName}`); await this.driverHelper.waitDisappearance(addedProjectLocator, timeout); } async clickOnAddButton(timeout: number = TestConstants.TS_SELENIUM_DEFAULT_TIMEOUT) { + Logger.debug('NewWorkspace.clickOnAddButton'); + await this.driverHelper.waitAndClick(By.css(NewWorkspace.ADD_BUTTON_CSS), timeout); } From f267fa111ee9582f691b7b13eb7421a854103cda Mon Sep 17 00:00:00 2001 From: Ihor Okhrimenko Date: Wed, 25 Sep 2019 12:33:14 +0300 Subject: [PATCH 11/18] Cover the 'Workspaces' by logging Signed-off-by: Ihor Okhrimenko --- e2e/pageobjects/dashboard/Workspaces.ts | 25 +++++++++++++++++++++++-- 1 file changed, 23 insertions(+), 2 deletions(-) diff --git a/e2e/pageobjects/dashboard/Workspaces.ts b/e2e/pageobjects/dashboard/Workspaces.ts index 62e838528ec..c18b588c2b3 100644 --- a/e2e/pageobjects/dashboard/Workspaces.ts +++ b/e2e/pageobjects/dashboard/Workspaces.ts @@ -13,6 +13,7 @@ import { injectable, inject } from 'inversify'; import { DriverHelper } from '../../utils/DriverHelper'; import { CLASSES } from '../../inversify.types'; import { By } from 'selenium-webdriver'; +import { Logger } from '../../utils/Logger'; @injectable() @@ -22,58 +23,78 @@ export class Workspaces { constructor(@inject(CLASSES.DriverHelper) private readonly driverHelper: DriverHelper) { } async waitPage(timeout: number = TestConstants.TS_SELENIUM_DEFAULT_TIMEOUT) { + Logger.debug('Workspaces.waitPage'); + await this.driverHelper.waitVisibility(By.css(Workspaces.ADD_WORKSPACE_BUTTON_CSS), timeout); } async clickAddWorkspaceButton(timeout: number = TestConstants.TS_SELENIUM_DEFAULT_TIMEOUT) { + Logger.debug('Workspaces.clickAddWorkspaceButton'); + await this.driverHelper.waitAndClick(By.css(Workspaces.ADD_WORKSPACE_BUTTON_CSS), timeout); } async waitWorkspaceListItem(workspaceName: string, timeout: number = TestConstants.TS_SELENIUM_DEFAULT_TIMEOUT) { + Logger.debug(`Workspaces.waitWorkspaceListItem "${workspaceName}"`); + const workspaceListItemLocator: By = By.css(this.getWorkspaceListItemLocator(workspaceName)); await this.driverHelper.waitVisibility(workspaceListItemLocator, timeout); } async clickOnStopWorkspaceButton(workspaceName: string, timeout: number = TestConstants.TS_SELENIUM_DEFAULT_TIMEOUT) { + Logger.debug(`Workspaces.clickOnStopWorkspaceButton "${workspaceName}"`); + const stopWorkspaceButtonLocator: By = By.css(`#ws-name-${workspaceName} .workspace-status[uib-tooltip="Stop workspace"]`); await this.driverHelper.waitAndClick(stopWorkspaceButtonLocator, timeout); } async waitWorkspaceWithRunningStatus(workspaceName: string, timeout: number = TestConstants.TS_SELENIUM_START_WORKSPACE_TIMEOUT) { + Logger.debug(`Workspaces.waitWorkspaceWithRunningStatus "${workspaceName}"`); + const runningStatusLocator: By = By.css(this.getWorkspaceStatusCssLocator(workspaceName, 'RUNNING')); await this.driverHelper.waitVisibility(runningStatusLocator, timeout); } async waitWorkspaceWithStoppedStatus(workspaceName: string, timeout: number = TestConstants.TS_SELENIUM_START_WORKSPACE_TIMEOUT) { + Logger.debug(`Workspaces.waitWorkspaceWithStoppedStatus "${workspaceName}"`); + const stoppedStatusLocator: By = By.css(this.getWorkspaceStatusCssLocator(workspaceName, 'STOPPED')); await this.driverHelper.waitVisibility(stoppedStatusLocator, timeout); } async clickWorkspaceListItem(workspaceName: string, timeout: number = TestConstants.TS_SELENIUM_START_WORKSPACE_TIMEOUT) { - var namespace : string = TestConstants.TS_SELENIUM_USERNAME; + Logger.debug(`Workspaces.clickWorkspaceListItem "${workspaceName}"`); + + var namespace: string = TestConstants.TS_SELENIUM_USERNAME; const workspaceListItemLocator: By = By.css(`div[id='ws-full-name-${namespace}/${workspaceName}']`); await this.driverHelper.waitAndClick(workspaceListItemLocator, timeout); } async clickDeleteButtonOnWorkspaceDetails(timeout: number = TestConstants.TS_SELENIUM_START_WORKSPACE_TIMEOUT) { + Logger.debug('Workspaces.clickDeleteButtonOnWorkspaceDetails'); + const deleteButtonOnWorkspaceDetailsLocator: By = By.css('che-button-danger[che-button-title=\'Delete\']'); await this.driverHelper.waitAndClick(deleteButtonOnWorkspaceDetailsLocator, timeout); } async waitWorkspaceListItemAbcence(workspaceName: string, timeout: number = TestConstants.TS_SELENIUM_START_WORKSPACE_TIMEOUT) { - var namespace : string = TestConstants.TS_SELENIUM_USERNAME; + Logger.debug(`Workspaces.waitWorkspaceListItemAbcence "${workspaceName}"`); + + var namespace: string = TestConstants.TS_SELENIUM_USERNAME; const workspaceListItemLocator: By = By.css(`div[id='ws-full-name-${namespace}/${workspaceName}']`); await this.driverHelper.waitDisappearance(workspaceListItemLocator, timeout); } async clickConfirmDeletionButton(timeout: number = TestConstants.TS_SELENIUM_START_WORKSPACE_TIMEOUT) { + Logger.debug('Workspaces.clickConfirmDeletionButton'); + await this.driverHelper.waitAndClick(By.css('#ok-dialog-button'), timeout); } From 00b22c3520b971bc1948a9cba0d48212a85db717 Mon Sep 17 00:00:00 2001 From: Ihor Okhrimenko Date: Wed, 25 Sep 2019 12:36:47 +0300 Subject: [PATCH 12/18] Cover the 'MultiUserLoginPage' by logging Signed-off-by: Ihor Okhrimenko --- e2e/pageobjects/login/MultiUserLoginPage.ts | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/e2e/pageobjects/login/MultiUserLoginPage.ts b/e2e/pageobjects/login/MultiUserLoginPage.ts index fbfe1ad3b0e..688a556810f 100644 --- a/e2e/pageobjects/login/MultiUserLoginPage.ts +++ b/e2e/pageobjects/login/MultiUserLoginPage.ts @@ -14,6 +14,7 @@ import { DriverHelper } from '../../utils/DriverHelper'; import { CLASSES } from '../../inversify.types'; import { By } from 'selenium-webdriver'; import { TestConstants } from '../../TestConstants'; +import { Logger } from '../../utils/Logger'; @injectable() export class MultiUserLoginPage implements ICheLoginPage { @@ -22,6 +23,8 @@ export class MultiUserLoginPage implements ICheLoginPage { @inject(CLASSES.DriverHelper) private readonly driverHelper: DriverHelper) { } async login() { + Logger.debug('MultiUserLoginPage.login'); + await this.waitEclipseCheLoginFormPage(); await this.inputUserNameEclipseCheLoginPage(TestConstants.TS_SELENIUM_USERNAME); await this.inputPaswordEclipseCheLoginPage(TestConstants.TS_SELENIUM_PASSWORD); @@ -29,18 +32,26 @@ export class MultiUserLoginPage implements ICheLoginPage { } async waitEclipseCheLoginFormPage() { + Logger.debug('MultiUserLoginPage.waitEclipseCheLoginFormPage'); + await this.driverHelper.waitVisibility(By.id('kc-form-login')); } async inputUserNameEclipseCheLoginPage(userName: string) { + Logger.debug(`MultiUserLoginPage.inputUserNameEclipseCheLoginPage username: "${userName}"`); + await this.driverHelper.enterValue(By.id('username'), userName); } async inputPaswordEclipseCheLoginPage(passw: string) { + Logger.debug(`MultiUserLoginPage.inputPaswordEclipseCheLoginPage password: "${passw}"`); + await this.driverHelper.enterValue(By.id('password'), passw); } async clickEclipseCheLoginButton() { + Logger.debug('MultiUserLoginPage.clickEclipseCheLoginButton'); + await this.driverHelper.waitAndClick(By.id('kc-login')); } From c615a063555f13c0d664bcbe72d2a2634cbb2ee7 Mon Sep 17 00:00:00 2001 From: Ihor Okhrimenko Date: Wed, 25 Sep 2019 12:38:06 +0300 Subject: [PATCH 13/18] Cover the 'OcpLoginByTempAdmin' by logging Signed-off-by: Ihor Okhrimenko --- e2e/pageobjects/login/OcpLoginByTempAdmin.ts | 3 +++ 1 file changed, 3 insertions(+) diff --git a/e2e/pageobjects/login/OcpLoginByTempAdmin.ts b/e2e/pageobjects/login/OcpLoginByTempAdmin.ts index 8947dd06512..cd7b240598b 100644 --- a/e2e/pageobjects/login/OcpLoginByTempAdmin.ts +++ b/e2e/pageobjects/login/OcpLoginByTempAdmin.ts @@ -13,6 +13,7 @@ import { injectable, inject } from 'inversify'; import { OcpLoginPage } from '../openshift/OcpLoginPage'; import { CLASSES } from '../../inversify.types'; import { TestConstants } from '../../TestConstants'; +import { Logger } from '../../utils/Logger'; @injectable() export class OcpLoginByTempAdmin implements IOcpLoginPage { @@ -21,6 +22,8 @@ export class OcpLoginByTempAdmin implements IOcpLoginPage { @inject(CLASSES.OcpLoginPage) private readonly ocpLogin: OcpLoginPage) { } async login() { + Logger.debug('OcpLoginByTempAdmin.login'); + if (TestConstants.TS_OCP_LOGIN_PAGE_HTPASW) { await this.ocpLogin.clickOnLoginWitnKubeAdmin(); } From ac9fdb86d9ae0fdbbfd7025d4369418d1fb4bf08 Mon Sep 17 00:00:00 2001 From: Ihor Okhrimenko Date: Wed, 25 Sep 2019 12:39:19 +0300 Subject: [PATCH 14/18] Cover the 'SingleUserLoginPage' by logging Signed-off-by: Ihor Okhrimenko --- e2e/pageobjects/login/SingleUserLoginPage.ts | 3 +++ 1 file changed, 3 insertions(+) diff --git a/e2e/pageobjects/login/SingleUserLoginPage.ts b/e2e/pageobjects/login/SingleUserLoginPage.ts index 42e2986aca6..a3369e13fdd 100644 --- a/e2e/pageobjects/login/SingleUserLoginPage.ts +++ b/e2e/pageobjects/login/SingleUserLoginPage.ts @@ -11,11 +11,14 @@ import 'reflect-metadata'; import { ICheLoginPage } from './ICheLoginPage'; import { injectable } from 'inversify'; import { TestConstants } from '../../TestConstants'; +import { Logger } from '../../utils/Logger'; @injectable() export class SingleUserLoginPage implements ICheLoginPage { async login(timeout: number = TestConstants.TS_SELENIUM_LOAD_PAGE_TIMEOUT) { + Logger.debug('SingleUserLoginPage.login'); + // do nothing } From b4d5c160fdba42f9b84b1968309206df7175a2a5 Mon Sep 17 00:00:00 2001 From: Ihor Okhrimenko Date: Wed, 25 Sep 2019 12:44:26 +0300 Subject: [PATCH 15/18] Cover the 'OcpLoginPage' by logging Signed-off-by: Ihor Okhrimenko --- e2e/pageobjects/openshift/OcpLoginPage.ts | 31 +++++++++++++++++------ 1 file changed, 23 insertions(+), 8 deletions(-) diff --git a/e2e/pageobjects/openshift/OcpLoginPage.ts b/e2e/pageobjects/openshift/OcpLoginPage.ts index 35d79072d39..130a3d00806 100644 --- a/e2e/pageobjects/openshift/OcpLoginPage.ts +++ b/e2e/pageobjects/openshift/OcpLoginPage.ts @@ -13,6 +13,7 @@ import { DriverHelper } from '../../utils/DriverHelper'; import { CLASSES } from '../../inversify.types'; import { TestConstants } from '../../TestConstants'; import { By } from 'selenium-webdriver'; +import { Logger } from '../../utils/Logger'; @injectable() export class OcpLoginPage { @@ -20,35 +21,49 @@ export class OcpLoginPage { private static readonly LOGIN_PAGE_OPENSHIFT: string = 'div[class=container]'; constructor( - @inject(CLASSES.DriverHelper) private readonly driverHelper: DriverHelper) { } + @inject(CLASSES.DriverHelper) private readonly driverHelper: DriverHelper) { } + + async openLoginPageOpenShift() { + Logger.debug('OcpLoginPage.openLoginPageOpenShift'); - async openLoginPageOpenShift () { await this.driverHelper.navigateToUrl(TestConstants.TS_SELENIUM_BASE_URL); } - async waitOpenShiftLoginPage () { + async waitOpenShiftLoginPage() { + Logger.debug('OcpLoginPage.waitOpenShiftLoginPage'); + await this.driverHelper.waitVisibility(By.css(OcpLoginPage.LOGIN_PAGE_OPENSHIFT)); } - async clickOnLoginWitnKubeAdmin () { + async clickOnLoginWitnKubeAdmin() { + Logger.debug('OcpLoginPage.clickOnLoginWitnKubeAdmin'); + const loginWithKubeAdminLocator: By = By.css('a[title=\'Log in with kube:admin\']'); await this.driverHelper.waitAndClick(loginWithKubeAdminLocator); } - async enterUserNameOpenShift (userName: string) { + async enterUserNameOpenShift(userName: string) { + Logger.debug(`OcpLoginPage.enterUserNameOpenShift "${userName}"`); + await this.driverHelper.enterValue(By.id('inputUsername'), userName); } - async enterPasswordOpenShift (passw: string) { + async enterPasswordOpenShift(passw: string) { + Logger.debug(`OcpLoginPage.enterPasswordOpenShift "${passw}"`); + await this.driverHelper.enterValue(By.id('inputPassword'), passw); } - async clickOnLoginButton () { + async clickOnLoginButton() { + Logger.debug('OcpLoginPage.clickOnLoginButton'); + const loginButtonlocator: By = By.css('button[type=submit]'); await this.driverHelper.waitAndClick(loginButtonlocator); } - async waitDisappearanceLoginPageOpenShift () { + async waitDisappearanceLoginPageOpenShift() { + Logger.debug('OcpLoginPage.waitDisappearanceLoginPageOpenShift'); + await this.driverHelper.waitDisappearance(By.css(OcpLoginPage.LOGIN_PAGE_OPENSHIFT)); } } From 402cf48d388582a5f6bf479614c960a4c03375a7 Mon Sep 17 00:00:00 2001 From: Ihor Okhrimenko Date: Wed, 25 Sep 2019 12:54:21 +0300 Subject: [PATCH 16/18] Cover the 'OcpWebConsolePage' by logging Signed-off-by: Ihor Okhrimenko --- .../openshift/OcpWebConsolePage.ts | 134 +++++++++++++----- 1 file changed, 101 insertions(+), 33 deletions(-) diff --git a/e2e/pageobjects/openshift/OcpWebConsolePage.ts b/e2e/pageobjects/openshift/OcpWebConsolePage.ts index 34d5de69903..499f10d9080 100644 --- a/e2e/pageobjects/openshift/OcpWebConsolePage.ts +++ b/e2e/pageobjects/openshift/OcpWebConsolePage.ts @@ -13,6 +13,7 @@ import { DriverHelper } from '../../utils/DriverHelper'; import { CLASSES } from '../../inversify.types'; import { TestConstants } from '../../TestConstants'; import { By, Key } from 'selenium-webdriver'; +import { Logger } from '../../utils/Logger'; @injectable() export class OcpWebConsolePage { @@ -23,162 +24,229 @@ export class OcpWebConsolePage { constructor( @inject(CLASSES.DriverHelper) private readonly driverHelper: DriverHelper) { } - async waitNavpanelOpenShift () { + async waitNavpanelOpenShift() { + Logger.debug('OcpWebConsolePage.waitNavpanelOpenShift'); + const navPanelOpenShiftLocator: By = By.css('nav[class=pf-c-nav]'); await this.driverHelper.waitVisibility(navPanelOpenShiftLocator); } - async clickOnCatalogListNavPanelOpenShift () { + async clickOnCatalogListNavPanelOpenShift() { + Logger.debug('OcpWebConsolePage.clickOnCatalogListNavPanelOpenShift'); + const catalogListLocator: By = By.xpath('//a[text()=\'Catalog\']'); await this.driverHelper.waitAndClick(catalogListLocator); } - async clickOnOperatorHubItemNavPanel () { + async clickOnOperatorHubItemNavPanel() { + Logger.debug('OcpWebConsolePage.clickOnOperatorHubItemNavPanel'); + const operatorHubItemLocator: By = By.xpath('//a[text()=\'OperatorHub\']'); await this.driverHelper.waitAndClick(operatorHubItemLocator); } - async waitOperatorHubMainPage () { + async waitOperatorHubMainPage() { + Logger.debug('OcpWebConsolePage.waitOperatorHubMainPage'); + const catalogOperatorHubPageLocator: By = By.xpath('//span[@id=\'resource-title\' and text()=\'OperatorHub\']'); await this.driverHelper.waitVisibility(catalogOperatorHubPageLocator); } - async clickOnEclipseCheOperatorIcon () { + async clickOnEclipseCheOperatorIcon() { + Logger.debug('OcpWebConsolePage.clickOnEclipseCheOperatorIcon'); + const catalogEclipseCheOperatorTitleLocator: By = By.css('a[data-test^=eclipse-che-preview-openshift]'); await this.driverHelper.waitAndClick(catalogEclipseCheOperatorTitleLocator, TestConstants.TS_SELENIUM_LOAD_PAGE_TIMEOUT); } - async clickOnInstallEclipseCheButton () { + async clickOnInstallEclipseCheButton() { + Logger.debug('OcpWebConsolePage.clickOnInstallEclipseCheButton'); + const installEclipsCheOperatorButtonLocator: By = By.xpath('//button[text()=\'Install\']'); await this.driverHelper.waitAndClick(installEclipsCheOperatorButtonLocator); } - async waitCreateOperatorSubscriptionPage () { + async waitCreateOperatorSubscriptionPage() { + Logger.debug('OcpWebConsolePage.waitCreateOperatorSubscriptionPage'); + const createOperatorSubscriptionPageLocator: By = By.xpath('//h1[text()=\'Create Operator Subscription\']'); await this.driverHelper.waitVisibility(createOperatorSubscriptionPageLocator); } - async selectUpdateChannelOnSubscriptionPage (channelName: string) { + async selectUpdateChannelOnSubscriptionPage(channelName: string) { + Logger.debug(`OcpWebConsolePage.selectUpdateChannelOnSubscriptionPage "${channelName}"`); + const updateChannelOperatorLocator: By = By.css(`input[value=${channelName}]`); await this.driverHelper.waitAndClick(updateChannelOperatorLocator); } - async clickOnDropdownNamespaceListOnSubscriptionPage () { + async clickOnDropdownNamespaceListOnSubscriptionPage() { + Logger.debug('OcpWebConsolePage.clickOnDropdownNamespaceListOnSubscriptionPage'); + const selectNamespaceLocator: By = By.id('dropdown-selectbox'); await this.driverHelper.waitAndClick(selectNamespaceLocator); } - async waitListBoxNamespacesOnSubscriptionPage () { + async waitListBoxNamespacesOnSubscriptionPage() { + Logger.debug('OcpWebConsolePage.waitListBoxNamespacesOnSubscriptionPage'); + const listBoxNamespaceLocator: By = By.css('ul[class^=dropdown-menu]'); await this.driverHelper.waitVisibility(listBoxNamespaceLocator); } - async selectDefinedNamespaceOnSubscriptionPage (projectName: string) { + async selectDefinedNamespaceOnSubscriptionPage(projectName: string) { + Logger.debug('OcpWebConsolePage.selectDefinedNamespaceOnSubscriptionPage'); + const namespaceItemInDropDownLocator: By = By.id(`${projectName}-Project-link`); await this.driverHelper.waitAndClick(namespaceItemInDropDownLocator); } - async clickOnSubscribeButtonOnSubscriptionPage () { + async clickOnSubscribeButtonOnSubscriptionPage() { + Logger.debug('OcpWebConsolePage.clickOnSubscribeButtonOnSubscriptionPage'); + const subscribeOperatorButtonLocator: By = By.xpath('//button[text()=\'Subscribe\']'); await this.driverHelper.waitAndClick(subscribeOperatorButtonLocator); } - async waitSubscriptionOverviewPage () { + async waitSubscriptionOverviewPage() { + Logger.debug('OcpWebConsolePage.waitSubscriptionOverviewPage'); + const subscriptionOverviewPageLocator: By = By.xpath('//h2[text()=\'Subscription Overview\']'); await this.driverHelper.waitVisibility(subscriptionOverviewPageLocator); } - async waitChannelNameOnSubscriptionOverviewPage (channelName: string) { + async waitChannelNameOnSubscriptionOverviewPage(channelName: string) { + Logger.debug(`OcpWebConsolePage.waitChannelNameOnSubscriptionOverviewPage "${channelName}"`); + const channelNameOnSubscriptionOverviewLocator: By = By.xpath(`//button[@type='button' and text()='${channelName}']`); await this.driverHelper.waitVisibility(channelNameOnSubscriptionOverviewLocator); } - async waitUpgradeStatusOnSubscriptionOverviewPage () { + async waitUpgradeStatusOnSubscriptionOverviewPage() { + Logger.debug('OcpWebConsolePage.waitUpgradeStatusOnSubscriptionOverviewPage'); + const upgradeStatuslocator: By = By.xpath('//span[text()=\' Up to date\']'); await this.driverHelper.waitVisibility(upgradeStatuslocator, TestConstants.TS_SELENIUM_LOAD_PAGE_TIMEOUT); } - async waitCatalogSourceNameOnSubscriptionOverviewPage (projectName: string) { + async waitCatalogSourceNameOnSubscriptionOverviewPage(projectName: string) { + Logger.debug(`OcpWebConsolePage.waitCatalogSourceNameOnSubscriptionOverviewPage "${projectName}"`); + const catalogSourceNameLolcator: By = By.css(`a[title=\'installed-custom-${projectName}\']`); await this.driverHelper.waitVisibility(catalogSourceNameLolcator); } - async selectInstalledOperatorsOnNavPanel () { + async selectInstalledOperatorsOnNavPanel() { + Logger.debug('OcpWebConsolePage.selectInstalledOperatorsOnNavPanel'); + const installedOperatorsItemNavPanelLocator: By = By.xpath('//a[text()=\'Installed Operators\']'); await this.driverHelper.waitAndClick(installedOperatorsItemNavPanelLocator); } - async waitEclipseCheOperatorLogoName () { + async waitEclipseCheOperatorLogoName() { + Logger.debug('OcpWebConsolePage.waitEclipseCheOperatorLogoName'); + await this.driverHelper.waitVisibility(By.xpath(OcpWebConsolePage.CHE_OPERATOR_LOGO_NAME)); } - async waitStatusInstalledEclipseCheOperator () { + async waitStatusInstalledEclipseCheOperator() { + Logger.debug('OcpWebConsolePage.waitStatusInstalledEclipseCheOperator'); + const statusInstalledCheOperatorLocator: By = By.xpath('//span[text()=\'InstallSucceeded\']'); await this.driverHelper.waitVisibility(statusInstalledCheOperatorLocator, TestConstants.TS_SELENIUM_LOAD_PAGE_TIMEOUT); } - async clickOnEclipseCheOperatorLogoName () { + async clickOnEclipseCheOperatorLogoName() { + Logger.debug('OcpWebConsolePage.clickOnEclipseCheOperatorLogoName'); + await this.driverHelper.waitAndClick(By.xpath(OcpWebConsolePage.CHE_OPERATOR_LOGO_NAME)); } - async waitOverviewCsvEclipseCheOperator () { + async waitOverviewCsvEclipseCheOperator() { + Logger.debug('OcpWebConsolePage.waitOverviewCsvEclipseCheOperator'); + await this.driverHelper.waitVisibility(By.xpath(OcpWebConsolePage.CHE_OPERATOR_LOGO_NAME)); } - async clickCreateNewCheClusterLink () { + async clickCreateNewCheClusterLink() { + Logger.debug('OcpWebConsolePage.clickCreateNewCheClusterLink'); + const createNewCheLusterLinkLocator: By = By.xpath('//a[text()=\' Create New\']'); await this.driverHelper.waitAndClick(createNewCheLusterLinkLocator); } - async waitCreateCheClusterYaml () { + async waitCreateCheClusterYaml() { + Logger.debug('OcpWebConsolePage.waitCreateCheClusterYaml'); + const createCheClusterYamlLocator: By = By.xpath('//h1[text()=\'Create Che Cluster\']'); await this.driverHelper.waitVisibility(createCheClusterYamlLocator); } - async selectOpenShiftOAuthFieldInYaml (line: string) { + async selectOpenShiftOAuthFieldInYaml(line: string) { + Logger.debug(`OcpWebConsolePage.selectOpenShiftOAuthFieldInYaml line: "${line}"`); + const openShiftOAuthFieldLocator: By = By.xpath(`//div[@class=\'ace_gutter-cell \' and text()=\'${line}\']`); await this.driverHelper.waitAndClick(openShiftOAuthFieldLocator); } - async changeValueOpenShiftOAuthField () { + async changeValueOpenShiftOAuthField() { + Logger.debug('OcpWebConsolePage.changeValueOpenShiftOAuthField'); + await this.driverHelper.getAction().sendKeys(Key.DELETE.toString()).sendKeys(Key.ENTER.toString()).sendKeys(Key.UP.toString()).perform(); await this.driverHelper.getAction().sendKeys(' openShiftoAuth: false'); } - async clickOnCreateCheClusterButton () { + async clickOnCreateCheClusterButton() { + Logger.debug('OcpWebConsolePage.clickOnCreateCheClusterButton'); + const createCheClusterButtonLocator: By = By.id('save-changes'); await this.driverHelper.waitAndClick(createCheClusterButtonLocator); } - async waitResourcesCheClusterTitle () { + async waitResourcesCheClusterTitle() { + Logger.debug('OcpWebConsolePage.waitResourcesCheClusterTitle'); + const resourcesCheClusterTitleLocator: By = By.id('resource-title'); await this.driverHelper.waitVisibility(resourcesCheClusterTitleLocator); } - async waitResourcesCheClusterTimestamp () { + async waitResourcesCheClusterTimestamp() { + Logger.debug('OcpWebConsolePage.waitResourcesCheClusterTimestamp'); + const resourcesCheClusterTimestampLocator: By = By.xpath('//div[contains(@class, \'timestamp\')]/div[text()=\'a minute ago\']'); await this.driverHelper.waitVisibility(resourcesCheClusterTimestampLocator, TestConstants.TS_SELENIUM_LOAD_PAGE_TIMEOUT); } - async clickOnCheClusterResourcesName () { + + async clickOnCheClusterResourcesName() { + Logger.debug('OcpWebConsolePage.clickOnCheClusterResourcesName'); + const cheClusterResourcesNameLocator: By = By.css('a[class=co-resource-item__resource-name]'); await this.driverHelper.waitAndClick(cheClusterResourcesNameLocator); } - async clickCheClusterOverviewExpandButton () { + async clickCheClusterOverviewExpandButton() { + Logger.debug('OcpWebConsolePage.clickCheClusterOverviewExpandButton'); + const cheClusterOverviewExpandButton: By = By.css('label[class=\'btn compaction-btn btn-default\']'); await this.driverHelper.waitAndClick(cheClusterOverviewExpandButton); } - async waitKeycloakAdminConsoleUrl (projectName: string) { + async waitKeycloakAdminConsoleUrl(projectName: string) { + Logger.debug('OcpWebConsolePage.waitKeycloakAdminConsoleUrl'); + const keyCloakAdminWebConsoleUrl: By = By.partialLinkText(`keycloak-${projectName}`); await this.driverHelper.waitVisibility(keyCloakAdminWebConsoleUrl, TestConstants.TS_SELENIUM_INSTALL_ECLIPSE_CHE_TIMEOUT); } - async waitEclipseCheUrl (projectName: string) { + async waitEclipseCheUrl(projectName: string) { + Logger.debug('OcpWebConsolePage.waitEclipseCheUrl'); + const eclipseCheUrlLocator: By = By.partialLinkText(`${OcpWebConsolePage.ECLIPSE_CHE_PREFIX_URL}${projectName}`); await this.driverHelper.waitVisibility(eclipseCheUrlLocator, TestConstants.TS_SELENIUM_INSTALL_ECLIPSE_CHE_TIMEOUT); } - async clickOnEclipseCHeUrl (projectName: string) { + async clickOnEclipseCHeUrl(projectName: string) { + Logger.debug('OcpWebConsolePage.clickOnEclipseCHeUrl'); + const eclipseCheUrlLocator: By = By.partialLinkText(`${OcpWebConsolePage.ECLIPSE_CHE_PREFIX_URL}${projectName}`); await this.driverHelper.waitAndClick(eclipseCheUrlLocator); } From 68b7c58d3acb26e43ab056f09911cfe722b4989e Mon Sep 17 00:00:00 2001 From: Ihor Okhrimenko Date: Thu, 26 Sep 2019 11:19:36 +0300 Subject: [PATCH 17/18] Intermediate changes Signed-off-by: Ihor Okhrimenko --- .../dashboard/workspace-details/WorkspaceDetailsPlugins.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/e2e/pageobjects/dashboard/workspace-details/WorkspaceDetailsPlugins.ts b/e2e/pageobjects/dashboard/workspace-details/WorkspaceDetailsPlugins.ts index 1d094c7c66a..83583753d2c 100644 --- a/e2e/pageobjects/dashboard/workspace-details/WorkspaceDetailsPlugins.ts +++ b/e2e/pageobjects/dashboard/workspace-details/WorkspaceDetailsPlugins.ts @@ -12,7 +12,7 @@ import { injectable, inject } from 'inversify'; import 'reflect-metadata'; import { CLASSES, TYPES } from '../../../inversify.types'; import { TestConstants } from '../../../TestConstants'; -import { By, logging } from 'selenium-webdriver'; +import { By } from 'selenium-webdriver'; import { WorkspaceDetails } from './WorkspaceDetails'; import { ITestWorkspaceUtil } from '../../../utils/workspace/ITestWorkspaceUtil'; import { WorkspaceStatus } from '../../../utils/workspace/WorkspaceStatus'; From ee08d0e043b19ad46ec1a83deb302ecd9d883a1e Mon Sep 17 00:00:00 2001 From: Ihor Okhrimenko Date: Fri, 27 Sep 2019 12:00:24 +0300 Subject: [PATCH 18/18] Increase timeot in the 'waitSuggestion' method Signed-off-by: Ihor Okhrimenko --- e2e/pageobjects/ide/Editor.ts | 2 +- e2e/tests/e2e_happy_path/HappyPath.spec.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/e2e/pageobjects/ide/Editor.ts b/e2e/pageobjects/ide/Editor.ts index f1db2ad219c..1055e5bb041 100644 --- a/e2e/pageobjects/ide/Editor.ts +++ b/e2e/pageobjects/ide/Editor.ts @@ -61,7 +61,7 @@ export class Editor { await this.driverHelper.getDriver().wait(async () => { try { - await this.scrollAndSearchSuggestion(editorTabTitle, suggestionLocator); + await this.scrollAndSearchSuggestion(editorTabTitle, suggestionLocator, 40000); return true; } catch (err) { if (!(err instanceof error.TimeoutError)) { diff --git a/e2e/tests/e2e_happy_path/HappyPath.spec.ts b/e2e/tests/e2e_happy_path/HappyPath.spec.ts index d3b02650039..598749a021f 100644 --- a/e2e/tests/e2e_happy_path/HappyPath.spec.ts +++ b/e2e/tests/e2e_happy_path/HappyPath.spec.ts @@ -116,7 +116,7 @@ suite('Language server validation', async () => { test('Suggestion', async () => { await editor.moveCursorToLineAndChar(javaFileName, 32, 27); await editor.pressControlSpaceCombination(javaFileName); - await editor.waitSuggestion(javaFileName, 'run(Class primarySource, String... args) : ConfigurableApplicationContext'); + await editor.waitSuggestion(javaFileName, 'run(Class primarySource, String... args) : ConfigurableApplicationContext', 120000); });