diff --git a/.travis.yml b/.travis.yml index 3fbc55738e..fa0f810d1d 100644 --- a/.travis.yml +++ b/.travis.yml @@ -5,7 +5,7 @@ git: language: node_js dist: bionic node_js: - - '12.16.3' + - '12.18.4' before_install: . ./scripts/ci/job_hooks/before_install.sh install: @@ -46,8 +46,6 @@ stages: addons: chrome: stable before_script: - - "sudo chown root /opt/google/chrome/chrome-sandbox" - - "sudo chmod 4755 /opt/google/chrome/chrome-sandbox" - export GIT_HASH=`git rev-parse HEAD` services: - xvfb diff --git a/e2e/content-services/directives/favorite-directive.e2e.ts b/e2e/content-services/directives/favorite-directive.e2e.ts index 7f808082ea..0a161fa863 100644 --- a/e2e/content-services/directives/favorite-directive.e2e.ts +++ b/e2e/content-services/directives/favorite-directive.e2e.ts @@ -141,7 +141,7 @@ describe('Favorite directive', () => { await customSourcesPage.checkRowIsNotDisplayed(testFile.entry.name); await navigationBarPage.clickTrashcanButton(); - await trashcanPage.waitForTableBody(); + await trashcanPage.contentList.dataTablePage().waitTillContentLoaded(); await expect(await trashcanPage.numberOfResultsDisplayed()).toBe(1); await trashcanPage.getDocumentList().dataTablePage().clickRowByContent(testFile.entry.name); await trashcanPage.getDocumentList().dataTablePage().checkRowByContentIsSelected(testFile.entry.name); diff --git a/e2e/core/pages/login-shell.page.ts b/e2e/core/pages/login-shell.page.ts index d5ddc14a18..ed12d6b4aa 100644 --- a/e2e/core/pages/login-shell.page.ts +++ b/e2e/core/pages/login-shell.page.ts @@ -92,6 +92,10 @@ export class LoginShellPage { return BrowserActions.getText(this.loginError); } + async checkLoginErrorIsDisplayed(loginError: string): Promise { + await BrowserVisibility.waitUntilElementHasText(this.loginError, loginError); + } + async checkLoginImgURL(): Promise { await BrowserVisibility.waitUntilElementIsVisible(this.logoImg); return this.logoImg.getAttribute('src'); diff --git a/e2e/core/pages/notification.page.ts b/e2e/core/pages/notification.page.ts index b25cc22317..66d35793a4 100644 --- a/e2e/core/pages/notification.page.ts +++ b/e2e/core/pages/notification.page.ts @@ -55,7 +55,7 @@ export class NotificationDemoPage { } async waitForSnackBarToClose(): Promise { - await this.snackbarPage.waitForSnackBarToClose(); + await this.snackbarPage.waitForSnackBarToClose(15000); } async enterMessageField(text: string): Promise { diff --git a/e2e/core/settings-component.e2e.ts b/e2e/core/settings-component.e2e.ts index c642c2ddcf..9f1c9b8b13 100644 --- a/e2e/core/settings-component.e2e.ts +++ b/e2e/core/settings-component.e2e.ts @@ -82,7 +82,7 @@ describe('Settings component', () => { await loginPage.enterUsername(browser.params.testConfig.admin.email); await loginPage.enterPassword(browser.params.testConfig.admin.password); await loginPage.clickSignInButton(); - await expect(await loginPage.getLoginError()).toMatch(loginError); + await loginPage.checkLoginErrorIsDisplayed(loginError); }); it('[C291952] Should not be able to sign in with invalid Process Services Url', async () => { @@ -93,7 +93,7 @@ describe('Settings component', () => { await loginPage.enterUsername(browser.params.testConfig.admin.email); await loginPage.enterPassword(browser.params.testConfig.admin.password); await loginPage.clickSignInButton(); - await expect(await loginPage.getLoginError()).toMatch(loginError); + await loginPage.checkLoginErrorIsDisplayed(loginError); }); }); diff --git a/e2e/process-services-cloud/task-list-properties.e2e.ts b/e2e/process-services-cloud/task-list-properties.e2e.ts index 84d0f71053..cb374d1c18 100644 --- a/e2e/process-services-cloud/task-list-properties.e2e.ts +++ b/e2e/process-services-cloud/task-list-properties.e2e.ts @@ -99,6 +99,7 @@ describe('Edit task filters and task list properties', () => { }); describe('Edit task filters and task list properties - filter properties', () => { + beforeEach(async () => { await navigationBarPage.navigateToProcessServicesCloudPage(); await appListCloudComponent.checkApsContainer(); diff --git a/e2e/process-services/custom-tasks-filters.e2e.ts b/e2e/process-services/custom-tasks-filters.e2e.ts index bcf5e4b15d..4d28908ea9 100644 --- a/e2e/process-services/custom-tasks-filters.e2e.ts +++ b/e2e/process-services/custom-tasks-filters.e2e.ts @@ -259,23 +259,34 @@ describe('Start Task - Custom App', () => { it('[C286404] Navigate using page field', async () => { currentPage = 1; await taskListSinglePage.typeItemsPerPage(itemsPerPage.fiveValue); + await taskListSinglePage.taskList().getDataTable().waitTillContentLoaded(); + await taskListSinglePage.typePage(currentPage); await taskListSinglePage.taskList().getDataTable().waitTillContentLoaded(); + await expect(await paginationPage.getCurrentPage()).toEqual('Page ' + currentPage); await expect(await paginationPage.getTotalPages()).toEqual(totalNrOfPages); + await paginationPage.checkPageSelectorIsDisplayed(); + await expect(await taskListSinglePage.taskList().getDataTable().numberOfRows()).toBe(itemsPerPage.fiveValue); + await taskListSinglePage.taskList().getAllRowsNameColumn().then(async (list) => { await expect(ArrayUtil.arrayContainsArray(list, allTasksName.slice(0, 5))).toEqual(true); }); currentPage++; + await taskListSinglePage.typePage(currentPage); await taskListSinglePage.taskList().getDataTable().waitTillContentLoaded(); + await expect(await paginationPage.getCurrentPage()).toEqual('Page ' + currentPage); await expect(await paginationPage.getTotalPages()).toEqual(totalNrOfPages); + await paginationPage.checkPageSelectorIsDisplayed(); + await expect(await taskListSinglePage.taskList().getDataTable().numberOfRows()).toBe(itemsPerPage.fiveValue); + await taskListSinglePage.taskList().getAllRowsNameColumn().then(async (list) => { await expect(ArrayUtil.arrayContainsArray(list, allTasksName.slice(5, 10))).toEqual(true); }); @@ -283,9 +294,12 @@ describe('Start Task - Custom App', () => { currentPage++; await taskListSinglePage.typePage(currentPage); await taskListSinglePage.taskList().getDataTable().waitTillContentLoaded(); + await expect(await paginationPage.getCurrentPage()).toEqual('Page ' + currentPage); await expect(await paginationPage.getTotalPages()).toEqual(totalNrOfPages); + await paginationPage.checkPageSelectorIsDisplayed(); + await expect(await taskListSinglePage.taskList().getDataTable().numberOfRows()).toBe(itemsPerPage.fiveValue); await taskListSinglePage.taskList().getAllRowsNameColumn().then(async (list) => { await expect(ArrayUtil.arrayContainsArray(list, allTasksName.slice(10, 15))).toEqual(true); @@ -294,10 +308,14 @@ describe('Start Task - Custom App', () => { currentPage++; await taskListSinglePage.typePage(currentPage); await taskListSinglePage.taskList().getDataTable().waitTillContentLoaded(); + await expect(await paginationPage.getCurrentPage()).toEqual('Page ' + currentPage); await expect(await paginationPage.getTotalPages()).toEqual(totalNrOfPages); + await paginationPage.checkPageSelectorIsDisplayed(); + await expect(await taskListSinglePage.taskList().getDataTable().numberOfRows()).toBe(itemsPerPage.fiveValue); + await taskListSinglePage.taskList().getAllRowsNameColumn().then(async (list) => { await expect(ArrayUtil.arrayContainsArray(list, allTasksName.slice(15, 20))).toEqual(true); }); diff --git a/e2e/search/components/search-check-list.e2e.ts b/e2e/search/components/search-check-list.e2e.ts index f3afe87563..a23c5371d5 100644 --- a/e2e/search/components/search-check-list.e2e.ts +++ b/e2e/search/components/search-check-list.e2e.ts @@ -17,7 +17,6 @@ import { ApiService, - BrowserActions, LocalStorageUtil, LoginPage, StringUtil, @@ -83,7 +82,10 @@ describe('Search Checklist Component', () => { beforeEach(async () => { await navigationBarPage.clickContentServicesButton(); - await BrowserActions.getUrl(`${browser.baseUrl}/search;q=${randomName}`); + await searchBarPage.checkSearchIconIsVisible(); + await searchBarPage.clickOnSearchIcon(); + await searchBarPage.enterTextAndPressEnter(randomName); + await searchResults.dataTable.waitTillContentLoaded(); }); afterAll(async () => { diff --git a/lib/testing/src/lib/core/pages/data-table-component.page.ts b/lib/testing/src/lib/core/pages/data-table-component.page.ts index aac5c65515..79c8443038 100644 --- a/lib/testing/src/lib/core/pages/data-table-component.page.ts +++ b/lib/testing/src/lib/core/pages/data-table-component.page.ts @@ -257,15 +257,32 @@ export class DataTableComponentPage { } } - async checkContentIsDisplayed(columnName: string, columnValue: string): Promise { - Logger.log(`Wait content is displayed ${columnName} ${columnValue}`); + async checkContentIsDisplayed(columnName: string, columnValue: string, retry = 0): Promise { + Logger.log(`Wait content is displayed ${columnName} ${columnValue} retry: ${retry}`); const row = this.getCellElementByValue(columnName, columnValue); - await BrowserVisibility.waitUntilElementIsVisible(row); + + try { + await BrowserVisibility.waitUntilElementIsVisible(row); + } catch (error) { + if (retry < 3) { + retry++; + await this.checkContentIsDisplayed(columnName, columnValue, retry); + } + } } - async checkContentIsNotDisplayed(columnName: string, columnValue: string): Promise { + async checkContentIsNotDisplayed(columnName: string, columnValue: string, retry = 0): Promise { + Logger.log(`Wait content is displayed ${columnName} ${columnValue} retry: ${retry}`); const row = this.getCellElementByValue(columnName, columnValue); - await BrowserVisibility.waitUntilElementIsNotVisible(row); + + try { + await BrowserVisibility.waitUntilElementIsNotVisible(row); + } catch (error) { + if (retry < 3) { + retry++; + await this.checkContentIsNotDisplayed(columnName, columnValue, retry); + } + } } getRow(columnName: string, columnValue: string): ElementFinder { @@ -292,11 +309,11 @@ export class DataTableComponentPage { async waitTillContentLoaded(): Promise { await browser.sleep(500); - if (this.isSpinnerPresent()) { + if (await this.isSpinnerPresent()) { Logger.log('wait datatable loading spinner disappear'); await BrowserVisibility.waitUntilElementIsNotVisible(element(by.tagName('mat-spinner'))); - if (this.isEmpty()) { + if (await this.isEmpty()) { Logger.log('empty page'); } else { await this.waitFirstElementPresent(); @@ -304,10 +321,11 @@ export class DataTableComponentPage { } else { try { Logger.log('wait datatable loading spinner is present'); - await BrowserVisibility.waitUntilElementIsVisible(element(by.tagName('mat-spinner'))); + await BrowserVisibility.waitUntilElementIsVisible(element(by.tagName('mat-spinner')), 2000); } catch (error) { } - if (this.isEmpty()) { + + if (await this.isEmpty()) { Logger.log('empty page'); } else { await this.waitFirstElementPresent(); @@ -327,6 +345,18 @@ export class DataTableComponentPage { return isSpinnerPresent; } + private async isInfiniteSpinnerPresent(): Promise { + let isSpinnerPresent; + + try { + isSpinnerPresent = await element(by.tagName('mat-progress-bar')).isDisplayed(); + } catch (error) { + isSpinnerPresent = false; + } + + return isSpinnerPresent; + } + private async waitFirstElementPresent(): Promise { try { Logger.log('wait first element is present'); @@ -339,11 +369,11 @@ export class DataTableComponentPage { async waitTillContentLoadedInfinitePagination(): Promise { await browser.sleep(500); - if (this.isSpinnerPresent()) { + if (await this.isInfiniteSpinnerPresent()) { Logger.log('wait datatable loading spinner disappear'); await BrowserVisibility.waitUntilElementIsNotVisible(element(by.tagName('mat-progress-bar'))); - if (this.isEmpty()) { + if (await this.isEmpty()) { Logger.log('empty page'); } else { await this.waitFirstElementPresent(); @@ -351,15 +381,16 @@ export class DataTableComponentPage { } else { try { Logger.log('wait datatable loading spinner is present'); - await BrowserVisibility.waitUntilElementIsVisible(element(by.tagName('mat-progress-bar'))); + await BrowserVisibility.waitUntilElementIsVisible(element(by.tagName('mat-progress-bar')), 2000); } catch (error) { } - if (this.isEmpty()) { + if (await this.isEmpty()) { Logger.log('empty page'); } else { await this.waitFirstElementPresent(); } - } } + } + } async checkColumnIsDisplayed(column: string): Promise { await BrowserVisibility.waitUntilElementIsVisible(element(by.css(`div[data-automation-id="auto_id_entry.${column}"]`))); @@ -478,6 +509,8 @@ export class DataTableComponentPage { } async isEmpty(): Promise { + await browser.sleep(500); + let isDisplayed; try { @@ -485,6 +518,9 @@ export class DataTableComponentPage { } catch (error) { isDisplayed = false; } + + Logger.log(`empty page isDisplayed ${isDisplayed}`); + return isDisplayed; } diff --git a/lib/testing/src/lib/core/pages/login.page.ts b/lib/testing/src/lib/core/pages/login.page.ts index 36a0ac9b6e..8637d1cc71 100644 --- a/lib/testing/src/lib/core/pages/login.page.ts +++ b/lib/testing/src/lib/core/pages/login.page.ts @@ -57,8 +57,9 @@ export class LoginPage { Logger.log('Login With ' + username); const authType = await LocalStorageUtil.getConfigField('authType'); + const oauth: any = await LocalStorageUtil.getConfigField('oauth2'); - if (!authType || authType === 'OAUTH') { + if ((!authType || authType === 'OAUTH') && oauth.implicitFlow) { await this.loginSSOIdentityService(username, password); } else { await this.loginBasicAuth(username, password); diff --git a/lib/testing/src/lib/core/pages/snackbar.page.ts b/lib/testing/src/lib/core/pages/snackbar.page.ts index cdffb23704..5f06468c22 100644 --- a/lib/testing/src/lib/core/pages/snackbar.page.ts +++ b/lib/testing/src/lib/core/pages/snackbar.page.ts @@ -25,14 +25,14 @@ export class SnackbarPage { snackBarAction = element(by.css('simple-snack-bar button span')); snackBarContainerCss: Locator = by.css('.mat-snack-bar-container'); - async waitForSnackBarToAppear() { - return BrowserVisibility.waitUntilElementIsVisible(element.all(this.snackBarContainerCss).first(), 5000, + async waitForSnackBarToAppear(timeout = 5000) { + return BrowserVisibility.waitUntilElementIsVisible(element.all(this.snackBarContainerCss).first(), timeout, 'snackbar did not appear' ); } - async waitForSnackBarToClose() { - return BrowserVisibility.waitUntilElementIsNotVisible(element.all(this.snackBarContainerCss).first(), 5000); + async waitForSnackBarToClose(timeout = 5000) { + return BrowserVisibility.waitUntilElementIsNotVisible(element.all(this.snackBarContainerCss).first(), timeout); } async getSnackBarMessage(): Promise { diff --git a/lib/testing/src/lib/process-services-cloud/pages/edit-task-filter-cloud-component.page.ts b/lib/testing/src/lib/process-services-cloud/pages/edit-task-filter-cloud-component.page.ts index a4accf9691..376afca2c5 100644 --- a/lib/testing/src/lib/process-services-cloud/pages/edit-task-filter-cloud-component.page.ts +++ b/lib/testing/src/lib/process-services-cloud/pages/edit-task-filter-cloud-component.page.ts @@ -191,7 +191,7 @@ export class EditTaskFilterCloudComponentPage { async clearAssignee(): Promise { await BrowserActions.clearWithBackSpace(this.assignee, 250); - await browser.driver.sleep(1000); + await this.dataTable.waitTillContentLoaded(); } async clearField(locator: ElementFinder): Promise {