From 1f25eed9d147a44eed74f09bd931735c7359a5d1 Mon Sep 17 00:00:00 2001 From: Tomas Kikutis Date: Tue, 12 May 2020 10:13:59 +0200 Subject: [PATCH] Fix unstable e2e tests (#3465) --- end-to-end-testing-helpers/index.ts | 36 ++++++++++++++++----- end-to-end-testing-helpers/package.json | 2 +- package.json | 4 +-- scripts/extensions/markForUser/package.json | 2 +- spec/_unstable-tests.txt | 3 +- spec/authoring_spec.ts | 8 ++--- spec/editor3_spec.ts | 11 +++++-- spec/internal_destinations_spec.ts | 22 +++---------- spec/publishing_spec.ts | 4 +-- 9 files changed, 52 insertions(+), 40 deletions(-) diff --git a/end-to-end-testing-helpers/index.ts b/end-to-end-testing-helpers/index.ts index f04a4119a5..6a624fc95b 100644 --- a/end-to-end-testing-helpers/index.ts +++ b/end-to-end-testing-helpers/index.ts @@ -4,8 +4,6 @@ import {executeContextMenuAction} from './articlesList'; import {navigateTo} from './workspace'; import * as path from 'path'; -const WAIT_TIMEOUT = 200; - const getTestSelector = (testIds: Array | null = null, text: string | null = null): Locator => { const selector = (testIds == null ? [] : testIds) .map((testId) => `[data-test-id="${testId}"]`) @@ -29,7 +27,34 @@ export function el( const elem = byLocator == null ? locator : locator.element(byLocator); - browser.wait(() => elem.isPresent(), WAIT_TIMEOUT); + [ + 'click', + 'sendKeys', + 'getTagName', + 'getCssValue', + 'getAttribute', + 'getText', + 'getSize', + 'getLocation', + 'isEnabled', + 'isSelected', + 'submit', + 'clear', + 'isDisplayed', + 'getId', + 'takeScreenshot', + ].forEach((methodName) => { + const originalHandler = elem[methodName]; + + // override methods to wait for an element to be visible + // if the element is already visible, the action will be executed immediately + elem[methodName] = (...args: Array) => { + return browser.wait(ECE.presenceOf(elem), 5000).then(() => { + return originalHandler(...args); // forward arguments + }); + }; + }); + return elem; } @@ -73,11 +98,6 @@ export function hover(elem: ElementFinder) { browser.actions().mouseMove(elem).perform(); } -export function waitAndClick(elem: ElementFinder) { - browser.wait(ECE.visibilityOf(elem)); - elem.click(); -} - export function selectFilesForUpload( fileInput: ElementFinder, fileNames: Array, // relative to spec/test-files folder diff --git a/end-to-end-testing-helpers/package.json b/end-to-end-testing-helpers/package.json index 46ae06a75c..8d09228938 100644 --- a/end-to-end-testing-helpers/package.json +++ b/end-to-end-testing-helpers/package.json @@ -1,6 +1,6 @@ { "name": "end-to-end-testing-helpers", - "version": "1.0.5", + "version": "1.0.6", "main": "dist/index.js", "types": "dist/index.d.ts", "files": [ diff --git a/package.json b/package.json index b598e3f5d1..58b2ff16c0 100644 --- a/package.json +++ b/package.json @@ -61,7 +61,7 @@ "docs-soap": "github:tomaskikutis/docs-soap#convert-tables", "draft-js": "github:tomaskikutis/draft-js#add-subscript-superscript", "draft-js-export-html": "1.3.3", - "end-to-end-testing-helpers": "^1.0.5", + "end-to-end-testing-helpers": "1.0.6", "eslint": "6.6.0", "eslint-plugin-react": "7.16.0", "extract-text-webpack-plugin": "3.0.2", @@ -164,7 +164,7 @@ "build": "grunt build", "lint": "tsc -p scripts --noEmit && tslint -c tslint.json './**/*.{ts,tsx}' && eslint --parser=@typescript-eslint/parser --ext .js --ext .jsx --ext .ts --ext .tsx scripts spec tasks *.js", "lint-fix": "tsc -p scripts --noEmit && tslint --fix -c tslint.json 'scripts/**/*.{ts,tsx}' && eslint --fix --parser=@typescript-eslint/parser --ext .js --ext .jsx --ext .ts --ext .tsx scripts spec tasks *.js", - "start-test-server": "cd test-server && docker-compose up -d", + "start-test-server": "cd test-server && docker-compose build && docker-compose up -d", "stop-test-server": "cd test-server && docker-compose stop", "start-client-server": "http-server dist -p 9000 -s &", "stop-client-server": "fuser -k 9000/tcp", diff --git a/scripts/extensions/markForUser/package.json b/scripts/extensions/markForUser/package.json index b5b3285f22..2a2da9b914 100644 --- a/scripts/extensions/markForUser/package.json +++ b/scripts/extensions/markForUser/package.json @@ -9,7 +9,7 @@ "devDependencies": { "@types/jasmine": "2.8.9", "@types/react": "16.8.23", - "end-to-end-testing-helpers": "^1.0.3", + "end-to-end-testing-helpers": "1.0.6", "superdesk-code-style": "1.3.0", "typescript": "3.7.2" }, diff --git a/spec/_unstable-tests.txt b/spec/_unstable-tests.txt index fb9d2d9381..39e0807fd9 100644 --- a/spec/_unstable-tests.txt +++ b/spec/_unstable-tests.txt @@ -1,8 +1,7 @@ content can open package using hotkey ctrl+0 -editor3 ctrl+z on tables mantains cursor position in the middle monitoring can close already opened preview on an item action editor3 can edit body with toolbar monitoring can display the item in Desk Output when it's published in a production desk authoring related item widget can open published item send warns that there are spelling mistakes -Not modifying crops will not trigger an article change +master_desk show content view - edit item diff --git a/spec/authoring_spec.ts b/spec/authoring_spec.ts index 9803876321..10fcf30ab9 100644 --- a/spec/authoring_spec.ts +++ b/spec/authoring_spec.ts @@ -15,7 +15,7 @@ import {dictionaries} from './helpers/dictionaries'; import {workspace} from './helpers/workspace'; import {authoring} from './helpers/authoring'; -import {el, ECE, els, waitAndClick, hover, selectFilesForUpload} from 'end-to-end-testing-helpers'; +import {el, ECE, els, hover, selectFilesForUpload} from 'end-to-end-testing-helpers'; describe('authoring', () => { beforeEach(() => { @@ -706,7 +706,7 @@ describe('authoring', () => { el(['multi-image-edit--start-upload']).click(); - waitAndClick(el(['change-image', 'done'])); + el(['change-image', 'done']).click(); assertToastMsg('success', 'Item updated.'); waitForToastMsgDissapear('success', 'Item updated.'); @@ -739,7 +739,7 @@ describe('authoring', () => { el(['multi-image-edit--start-upload']).click(); - waitAndClick(el(['change-image', 'done'])); + el(['change-image', 'done']).click(); browser.wait(ECE.hasElementCount(els(['authoring-field--media-gallery', 'media-gallery-image']), 1)); }); @@ -764,7 +764,7 @@ describe('authoring', () => { el(['multi-image-edit--start-upload']).click(); - waitAndClick(el(['change-image', 'done'])); + el(['change-image', 'done']).click(); browser.wait(ECE.hasElementCount(els(['authoring-field--media-gallery', 'media-gallery-image']), 1)); diff --git a/spec/editor3_spec.ts b/spec/editor3_spec.ts index 748ceaa536..7b759a184b 100644 --- a/spec/editor3_spec.ts +++ b/spec/editor3_spec.ts @@ -2,6 +2,8 @@ import {element, browser, protractor, by} from 'protractor'; import {monitoring} from './helpers/monitoring'; import {authoring} from './helpers/authoring'; +import {ECE, el} from 'end-to-end-testing-helpers'; +import {assertToastMsg} from './helpers/utils'; class Editor3Toolbar { controls: any; @@ -56,6 +58,7 @@ describe('editor3', () => { monitoring.openMonitoring(); monitoring.selectDesk('xeditor3'); monitoring.createFromDeskTemplate(); + browser.wait(ECE.presenceOf(editors.get(0))); }); it('can edit headline', () => { @@ -152,9 +155,11 @@ describe('editor3', () => { }); function getPreviewBody() { - browser.sleep(1000); // wait for autosave (input is debounced) - authoring.save(); - browser.sleep(500); // wait for saving to complete + const saveButton = el(['authoring', 'authoring-topbar', 'save']); + + browser.wait(ECE.elementToBeClickable(saveButton)); + saveButton.click(); + assertToastMsg('success', 'Item updated.'); monitoring.previewAction(0, 0); return monitoring.getPreviewBody(); } diff --git a/spec/internal_destinations_spec.ts b/spec/internal_destinations_spec.ts index aa852e4375..858c1bbcef 100644 --- a/spec/internal_destinations_spec.ts +++ b/spec/internal_destinations_spec.ts @@ -1,7 +1,7 @@ /* eslint-disable newline-per-chained-call */ import {browser, element, by} from 'protractor'; -import {el, els, s, ECE} from 'end-to-end-testing-helpers'; +import {el, els, s, ECE, hover} from 'end-to-end-testing-helpers'; import {nav} from './helpers/utils'; describe('internal destinations & generic-page-list', () => { @@ -33,10 +33,7 @@ describe('internal destinations & generic-page-list', () => { var firstItem = items.get(0); - // hover in order for action buttons to show up - browser.actions() - .mouseMove(firstItem) - .perform(); + hover(firstItem); // in order for action buttons to show up el(['edit'], null, firstItem).click(); @@ -71,10 +68,7 @@ describe('internal destinations & generic-page-list', () => { browser.wait(ECE.textToBePresentInElementValue(el(['list-page--view-edit', 'gform-input--name']), 'alpha')); - // hover in order for action buttons to show up - browser.actions() - .mouseMove(items.get(1)) - .perform(); + hover(items.get(1)); // in order for action buttons to show up el(['edit'], null, items.get(1)).click(); @@ -93,10 +87,7 @@ describe('internal destinations & generic-page-list', () => { var firstItem = items.get(0); - // hover in order for action buttons to show up - browser.actions() - .mouseMove(firstItem) - .perform(); + hover(firstItem); // in order for action buttons to show up el(['delete'], null, firstItem).click(); @@ -111,10 +102,7 @@ describe('internal destinations & generic-page-list', () => { var firstItem = items.get(0); - // hover in order for action buttons to show up - browser.actions() - .mouseMove(firstItem) - .perform(); + hover(firstItem); // in order for action buttons to show up el(['delete'], null, firstItem).click(); diff --git a/spec/publishing_spec.ts b/spec/publishing_spec.ts index f505f8308c..c1193de945 100644 --- a/spec/publishing_spec.ts +++ b/spec/publishing_spec.ts @@ -7,7 +7,7 @@ import { import {monitoring} from './helpers/monitoring'; import {workspace} from './helpers/workspace'; import {authoring} from './helpers/authoring'; -import {el, els, waitAndClick, ECE, s} from 'end-to-end-testing-helpers'; +import {el, els, ECE} from 'end-to-end-testing-helpers'; import {executeContextMenuAction} from 'end-to-end-testing-helpers/dist/articlesList'; describe('publishing', () => { @@ -88,7 +88,7 @@ describe('publishing', () => { const slugline = 'testing-send-and-publish'; el(['authoring', 'field-slugline']).sendKeys(slugline); - waitAndClick(el(['authoring', 'save'])); + el(['authoring', 'save']).click(); el(['authoring', 'open-send-publish-pane']).click(); el(['authoring', 'send-publish-pane', 'tab--publish']).click();