From fe4b4a4f00fad3d790808cfec69fddc462076521 Mon Sep 17 00:00:00 2001 From: Stacey Gammon Date: Tue, 4 Apr 2017 12:12:51 -0400 Subject: [PATCH] Add more trys and remove toast messages immediately --- test/functional/apps/dashboard/_dashboard.js | 76 ++++++----- .../apps/dashboard/_dashboard_save.js | 9 ++ .../apps/dashboard/_dashboard_time.js | 7 + test/functional/apps/dashboard/_view_edit.js | 16 +++ test/support/page_objects/dashboard_page.js | 41 +++--- test/support/page_objects/header_page.js | 127 ++++++++++-------- 6 files changed, 163 insertions(+), 113 deletions(-) diff --git a/test/functional/apps/dashboard/_dashboard.js b/test/functional/apps/dashboard/_dashboard.js index ed84012deffd31c..6706acb12c39834 100644 --- a/test/functional/apps/dashboard/_dashboard.js +++ b/test/functional/apps/dashboard/_dashboard.js @@ -36,6 +36,7 @@ bdd.describe('dashboard tab', function describeIndexTests() { bdd.it('should save and load dashboard', async function saveAndLoadDashboard() { const dashboardName = 'Dashboard Test 1'; await PageObjects.dashboard.saveDashboard(dashboardName); + await PageObjects.header.clickToastOK(); await PageObjects.dashboard.gotoDashboardLandingPage(); await PageObjects.common.try(function () { @@ -80,47 +81,47 @@ bdd.describe('dashboard tab', function describeIndexTests() { }); }); }); -}); -bdd.describe('filters', async function () { - bdd.it('are not selected by default', async function () { - const descriptions = await PageObjects.dashboard.getFilterDescriptions(1000); - expect(descriptions.length).to.equal(0); + bdd.describe('filters', async function () { + bdd.it('are not selected by default', async function () { + const descriptions = await PageObjects.dashboard.getFilterDescriptions(1000); + expect(descriptions.length).to.equal(0); + }); + + bdd.it('are added when a pie chart slice is clicked', async function () { + await PageObjects.dashboard.filterOnPieSlice(); + const descriptions = await PageObjects.dashboard.getFilterDescriptions(); + expect(descriptions.length).to.equal(1); + }); }); - bdd.it('are added when a pie chart slice is clicked', async function () { - await PageObjects.dashboard.filterOnPieSlice(); - const descriptions = await PageObjects.dashboard.getFilterDescriptions(); - expect(descriptions.length).to.equal(1); + bdd.it('retains dark theme in state', async function () { + await PageObjects.dashboard.clickEdit(); + await PageObjects.dashboard.useDarkTheme(true); + await PageObjects.header.clickVisualize(); + await PageObjects.header.clickDashboard(); + const isDarkThemeOn = await PageObjects.dashboard.isDarkThemeOn(); + expect(isDarkThemeOn).to.equal(true); }); -}); -bdd.it('retains dark theme in state', async function () { - await PageObjects.dashboard.clickEdit(); - await PageObjects.dashboard.useDarkTheme(true); - await PageObjects.header.clickVisualize(); - await PageObjects.header.clickDashboard(); - const isDarkThemeOn = await PageObjects.dashboard.isDarkThemeOn(); - expect(isDarkThemeOn).to.equal(true); -}); + bdd.it('should have shared-items-count set to the number of visualizations', function checkSavedItemsCount() { + const visualizations = PageObjects.dashboard.getTestVisualizations(); + return PageObjects.common.tryForTime(10000, () => PageObjects.dashboard.getSharedItemsCount()) + .then(function (count) { + PageObjects.common.log('shared-items-count = ' + count); + expect(count).to.eql(visualizations.length); + }); + }); -bdd.it('should have shared-items-count set to the number of visualizations', function checkSavedItemsCount() { - const visualizations = PageObjects.dashboard.getTestVisualizations(); - return PageObjects.common.tryForTime(10000, () => PageObjects.dashboard.getSharedItemsCount()) - .then(function (count) { - PageObjects.common.log('shared-items-count = ' + count); - expect(count).to.eql(visualizations.length); + bdd.it('should have panels with expected shared-item title and description', function checkTitles() { + const visualizations = PageObjects.dashboard.getTestVisualizations(); + return PageObjects.common.tryForTime(10000, function () { + return PageObjects.dashboard.getPanelSharedItemData() + .then(function (data) { + expect(data.map(item => item.title)).to.eql(visualizations.map(v => v.name)); + expect(data.map(item => item.description)).to.eql(visualizations.map(v => v.description)); + }); }); -}); - -bdd.it('should have panels with expected shared-item title and description', function checkTitles() { - const visualizations = PageObjects.dashboard.getTestVisualizations(); - return PageObjects.common.tryForTime(10000, function () { - return PageObjects.dashboard.getPanelSharedItemData() - .then(function (data) { - expect(data.map(item => item.title)).to.eql(visualizations.map(v => v.name)); - expect(data.map(item => item.description)).to.eql(visualizations.map(v => v.description)); - }); }); bdd.it('add new visualization link', async function checkTitles() { @@ -129,6 +130,8 @@ bdd.it('should have panels with expected shared-item title and description', fun await PageObjects.visualize.clickAreaChart(); await PageObjects.visualize.clickNewSearch(); await PageObjects.visualize.saveVisualization('visualization from add new link'); + await PageObjects.header.clickToastOK(); + await PageObjects.header.clickToastOK(); const visualizations = PageObjects.dashboard.getTestVisualizations(); return PageObjects.common.tryForTime(10000, async function () { @@ -138,4 +141,9 @@ bdd.it('should have panels with expected shared-item title and description', fun expect(panelTitles.length).to.eql(visualizations.length + 1); }); }); + + // To avoid load errors in subsequent tests that refresh the index. + bdd.it('Finish each test on the landing page', async () => { + await PageObjects.dashboard.gotoDashboardLandingPage(); + }); }); diff --git a/test/functional/apps/dashboard/_dashboard_save.js b/test/functional/apps/dashboard/_dashboard_save.js index 764f502d6ff7939..1b09253b90251ab 100644 --- a/test/functional/apps/dashboard/_dashboard_save.js +++ b/test/functional/apps/dashboard/_dashboard_save.js @@ -13,6 +13,7 @@ bdd.describe('dashboard save', function describeIndexTests() { bdd.it('warns on duplicate name for new dashboard', async function() { await PageObjects.dashboard.clickNewDashboard(); await PageObjects.dashboard.saveDashboard(dashboardName); + await PageObjects.header.clickToastOK(); let isConfirmOpen = await PageObjects.common.isConfirmModalOpen(); expect(isConfirmOpen).to.equal(false); @@ -38,6 +39,7 @@ bdd.describe('dashboard save', function describeIndexTests() { await PageObjects.dashboard.enterDashboardTitleAndClickSave(dashboardName); await PageObjects.common.clickConfirmOnModal(); + await PageObjects.header.clickToastOK(); // This is important since saving a new dashboard will cause a refresh of the page. We have to // wait till it finishes reloading or it might reload the url after simulating the @@ -54,6 +56,7 @@ bdd.describe('dashboard save', function describeIndexTests() { await PageObjects.header.isGlobalLoadingIndicatorHidden(); await PageObjects.dashboard.clickEdit(); await PageObjects.dashboard.saveDashboard(dashboardName); + await PageObjects.header.clickToastOK(); const isConfirmOpen = await PageObjects.common.isConfirmModalOpen(); expect(isConfirmOpen).to.equal(false); @@ -72,6 +75,7 @@ bdd.describe('dashboard save', function describeIndexTests() { bdd.it('Does not warn when only the prefix matches', async function() { await PageObjects.dashboard.saveDashboard(dashboardName.split(' ')[0]); + await PageObjects.header.clickToastOK(); const isConfirmOpen = await PageObjects.common.isConfirmModalOpen(); expect(isConfirmOpen).to.equal(false); @@ -86,4 +90,9 @@ bdd.describe('dashboard save', function describeIndexTests() { await PageObjects.common.clickCancelOnModal(); }); + + // To avoid load errors in subsequent tests that refresh the index. + bdd.it('Finish each test on the landing page', async () => { + await PageObjects.dashboard.gotoDashboardLandingPage(); + }); }); diff --git a/test/functional/apps/dashboard/_dashboard_time.js b/test/functional/apps/dashboard/_dashboard_time.js index b4d89660727123e..554a25d231850f0 100644 --- a/test/functional/apps/dashboard/_dashboard_time.js +++ b/test/functional/apps/dashboard/_dashboard_time.js @@ -22,6 +22,7 @@ bdd.describe('dashboard time', function dashboardSaveWithTime() { await PageObjects.dashboard.clickNewDashboard(); await PageObjects.dashboard.addVisualizations([PageObjects.dashboard.getTestVisualizationNames()[0]]); await PageObjects.dashboard.saveDashboard(dashboardName, { storeTimeWithDashboard: false }); + await PageObjects.header.clickToastOK(); }); bdd.it('Does not set the time picker on open', async function () { @@ -41,6 +42,7 @@ bdd.describe('dashboard time', function dashboardSaveWithTime() { await PageObjects.dashboard.clickEdit(); await PageObjects.header.setQuickTime('Today'); await PageObjects.dashboard.saveDashboard(dashboardName, { storeTimeWithDashboard: true }); + await PageObjects.header.clickToastOK(); }); bdd.it('sets quick time on open', async function () { @@ -56,6 +58,7 @@ bdd.describe('dashboard time', function dashboardSaveWithTime() { await PageObjects.dashboard.clickEdit(); await PageObjects.header.setAbsoluteRange(fromTime, toTime); await PageObjects.dashboard.saveDashboard(dashboardName, { storeTimeWithDashboard: true }); + await PageObjects.header.clickToastOK(); }); bdd.it('sets absolute time on open', async function () { @@ -83,4 +86,8 @@ bdd.describe('dashboard time', function dashboardSaveWithTime() { }); }); + // To avoid load errors in subsequent tests that refresh the index. + bdd.it('Finish each test on the landing page', async () => { + await PageObjects.dashboard.gotoDashboardLandingPage(); + }); }); diff --git a/test/functional/apps/dashboard/_view_edit.js b/test/functional/apps/dashboard/_view_edit.js index 7123fd146ee6dc3..cb1c60ca05cd353 100644 --- a/test/functional/apps/dashboard/_view_edit.js +++ b/test/functional/apps/dashboard/_view_edit.js @@ -27,6 +27,7 @@ bdd.describe('dashboard view edit mode', function viewEditModeTests() { await PageObjects.dashboard.clickNewDashboard(); await PageObjects.dashboard.addVisualizations(PageObjects.dashboard.getTestVisualizationNames()); await PageObjects.dashboard.saveDashboard(dashboardName); + await PageObjects.header.clickToastOK(); }); bdd.it('existing dashboard opens in view mode', async function () { @@ -66,6 +67,7 @@ bdd.describe('dashboard view edit mode', function viewEditModeTests() { bdd.describe('on an expanded panel', function () { bdd.it('are hidden in view mode', async function () { await PageObjects.dashboard.saveDashboard(dashboardName); + await PageObjects.header.clickToastOK(); await PageObjects.dashboard.toggleExpandPanel(); const editLinkExists = await PageObjects.common.doesTestSubjectExist('dashboardPanelEditLink'); @@ -101,6 +103,7 @@ bdd.describe('dashboard view edit mode', function viewEditModeTests() { bdd.it('save auto exits out of edit mode', async function () { await PageObjects.dashboard.saveDashboard(dashboardName); + await PageObjects.header.clickToastOK(); const isViewMode = await PageObjects.dashboard.getIsInViewMode(); expect(isViewMode).to.equal(true); @@ -114,6 +117,7 @@ bdd.describe('dashboard view edit mode', function viewEditModeTests() { const originalToTime = '2015-09-19 06:31:44.000'; await PageObjects.header.setAbsoluteRange(originalFromTime, originalToTime); await PageObjects.dashboard.saveDashboard(dashboardName, { storeTimeWithDashboard: true }); + await PageObjects.header.clickToastOK(); await PageObjects.dashboard.clickEdit(); await PageObjects.header.setAbsoluteRange('2013-09-19 06:31:44.000', '2013-09-19 06:31:44.000'); @@ -150,6 +154,7 @@ bdd.describe('dashboard view edit mode', function viewEditModeTests() { await PageObjects.dashboard.setTimepickerInDataRange(); await PageObjects.dashboard.filterOnPieSlice(); await PageObjects.dashboard.saveDashboard(dashboardName); + await PageObjects.header.clickToastOK(); // This may seem like a pointless line but there was a bug that only arose when the dashboard // was loaded initially @@ -187,6 +192,8 @@ bdd.describe('dashboard view edit mode', function viewEditModeTests() { await PageObjects.visualize.clickAreaChart(); await PageObjects.visualize.clickNewSearch(); await PageObjects.visualize.saveVisualization('new viz panel'); + await PageObjects.header.clickToastOK(); + await PageObjects.header.clickToastOK(); await PageObjects.dashboard.clickCancelOutOfEditMode(); @@ -221,12 +228,14 @@ bdd.describe('dashboard view edit mode', function viewEditModeTests() { const newToTime = '2015-09-19 06:31:44.000'; await PageObjects.header.setAbsoluteRange('2013-09-19 06:31:44.000', '2013-09-19 06:31:44.000'); await PageObjects.dashboard.saveDashboard(dashboardName, true); + await PageObjects.header.clickToastOK(); await PageObjects.dashboard.clickEdit(); await PageObjects.header.setAbsoluteRange(newToTime, newToTime); await PageObjects.dashboard.clickCancelOutOfEditMode(); await PageObjects.common.clickCancelOnModal(); await PageObjects.dashboard.saveDashboard(dashboardName, { storeTimeWithDashboard: true }); + await PageObjects.header.clickToastOK(); await PageObjects.dashboard.loadSavedDashboard(dashboardName); @@ -243,6 +252,7 @@ bdd.describe('dashboard view edit mode', function viewEditModeTests() { bdd.it('when time changed is not stored with dashboard', async function () { await PageObjects.dashboard.clickEdit(); await PageObjects.dashboard.saveDashboard(dashboardName, { storeTimeWithDashboard: false }); + await PageObjects.header.clickToastOK(); await PageObjects.dashboard.clickEdit(); await PageObjects.header.setAbsoluteRange('2013-10-19 06:31:44.000', '2013-12-19 06:31:44.000'); await PageObjects.dashboard.clickCancelOutOfEditMode(); @@ -256,6 +266,7 @@ bdd.describe('dashboard view edit mode', function viewEditModeTests() { await PageObjects.dashboard.setTimepickerInDataRange(); await PageObjects.dashboard.filterOnPieSlice(); await PageObjects.dashboard.saveDashboard(dashboardName); + await PageObjects.header.clickToastOK(); await PageObjects.dashboard.clickEdit(); await PageObjects.dashboard.clickCancelOutOfEditMode(); @@ -280,4 +291,9 @@ bdd.describe('dashboard view edit mode', function viewEditModeTests() { expect(query).to.equal(originalQuery); }); }); + + // To avoid load errors in subsequent tests that refresh the index. + bdd.it('Finish each test on the landing page', async () => { + await PageObjects.dashboard.gotoDashboardLandingPage(); + }); }); diff --git a/test/support/page_objects/dashboard_page.js b/test/support/page_objects/dashboard_page.js index 3071ae18833c1a7..ea4d2c68abc4948 100644 --- a/test/support/page_objects/dashboard_page.js +++ b/test/support/page_objects/dashboard_page.js @@ -33,18 +33,22 @@ export default class DashboardPage { * @returns {Promise} */ async onDashboardLandingPage() { - PageObjects.common.debug(`onDashboardLandingPage`); + PageObjects.common.debug('onDashboardLandingPage'); const exists = await PageObjects.common.doesCssSelectorExist('a[href="#/dashboard"]'); return !exists; } + async clickDashboardBreadcrumbLink() { + PageObjects.common.debug('clickDashboardBreadcrumbLink'); + return PageObjects.common.try(() => PageObjects.common.findByCssSelector('a[href="#/dashboard"]').click()); + } + async gotoDashboardLandingPage() { PageObjects.common.debug('gotoDashboardLandingPage'); const onPage = await this.onDashboardLandingPage(); if (!onPage) { await PageObjects.common.try(async () => { - const goToDashboardLink = await PageObjects.common.findByCssSelector('a[href="#/dashboard"]'); - await goToDashboardLink.click(); + await this.clickDashboardBreadcrumbLink(); // Once the searchFilter can be found, we know the page finished loading. await PageObjects.common.findTestSubject('searchFilter'); }); @@ -139,29 +143,22 @@ export default class DashboardPage { .click()); } - addVisualization(vizName) { - return this.clickAddVisualization() - .then(() => { - PageObjects.common.debug('filter visualization (' + vizName + ')'); - return this.filterVizNames(vizName); - }) + async addVisualization(vizName) { + await this.clickAddVisualization(); + PageObjects.common.debug('filter visualization (' + vizName + ')'); + await this.filterVizNames(vizName); // this second wait is usually enough to avoid the // 'stale element reference: element is not attached to the page document' // on the next step - .then(() => { - return PageObjects.common.sleep(1000); - }) - .then(() => { - // but wrap in a try loop since it can still happen - return PageObjects.common.try(() => { - PageObjects.common.debug('click visualization (' + vizName + ')'); - return this.clickVizNameLink(vizName); - }); - }) - // this second click of 'Add' collapses the Add Visualization pane - .then(() => { - return this.clickAddVisualization(); + await PageObjects.common.sleep(1000); + // but wrap in a try loop since it can still happen + await PageObjects.common.try(() => { + PageObjects.common.debug('click visualization (' + vizName + ')'); + return this.clickVizNameLink(vizName); }); + await PageObjects.header.clickToastOK(); + // this second click of 'Add' collapses the Add Visualization pane + await this.clickAddVisualization(); } async renameDashboard(dashName) { diff --git a/test/support/page_objects/header_page.js b/test/support/page_objects/header_page.js index a7e788afdc286ed..e0fc74acd88e810 100644 --- a/test/support/page_objects/header_page.js +++ b/test/support/page_objects/header_page.js @@ -49,8 +49,8 @@ export default class HeaderPage { } clickQuickButton() { - return this.remote.setFindTimeout(defaultFindTimeout) - .findByLinkText('Quick').click(); + return PageObjects.common.try( + () => this.remote.setFindTimeout(defaultFindTimeout).findByLinkText('Quick').click()); } isTimepickerOpen() { @@ -60,77 +60,90 @@ export default class HeaderPage { .catch(() => false); } - async clickAbsoluteButton() { - await PageObjects.common.try(async () => { - await this.remote.setFindTimeout(defaultFindTimeout); - const absoluteButton = await this.remote.findByLinkText('Absolute'); - await absoluteButton.click(); - }); - } - - clickQuickButton() { - return this.remote.setFindTimeout(defaultFindTimeout) - .findByLinkText('Quick').click(); + isAbsoluteSectionShowing() { + PageObjects.common.debug('isAbsoluteSectionShowing'); + return PageObjects.common.doesCssSelectorExist('input[ng-model=\'absolute.from\']'); } - async getFromTime() { - await this.ensureTimePickerIsOpen(); - return this.remote.setFindTimeout(defaultFindTimeout) - .findByCssSelector('input[ng-model=\'absolute.from\']') - .getProperty('value'); - } - - async getToTime() { - await this.ensureTimePickerIsOpen(); - return this.remote.setFindTimeout(defaultFindTimeout) - .findByCssSelector('input[ng-model=\'absolute.to\']') - .getProperty('value'); + async showAbsoluteSection() { + PageObjects.common.debug('showAbsoluteSection'); + const isAbsoluteSectionShowing = await this.isAbsoluteSectionShowing(); + if (!isAbsoluteSectionShowing) { + await PageObjects.common.try(async() => { + await this.remote.setFindTimeout(defaultFindTimeout); + const absoluteButton = await this.remote.findByLinkText('Absolute'); + await absoluteButton.click(); + // Check to make sure one of the elements on the absolute section is showing. + await this.getFromTime(); + }); + } } async getFromTime() { - await this.ensureTimePickerIsOpen(); - return this.remote.setFindTimeout(defaultFindTimeout) - .findByCssSelector('input[ng-model=\'absolute.from\']') - .getProperty('value'); + PageObjects.common.debug('getFromTime'); + return PageObjects.common.try(async () => { + await this.ensureTimePickerIsOpen(); + await this.showAbsoluteSection(); + return this.remote.setFindTimeout(defaultFindTimeout) + .findByCssSelector('input[ng-model=\'absolute.from\']') + .getProperty('value'); + }); } async getToTime() { - await this.ensureTimePickerIsOpen(); - return this.remote.setFindTimeout(defaultFindTimeout) - .findByCssSelector('input[ng-model=\'absolute.to\']') - .getProperty('value'); + PageObjects.common.debug('getToTime'); + return PageObjects.common.try(async () => { + await this.ensureTimePickerIsOpen(); + await this.showAbsoluteSection(); + return this.remote.setFindTimeout(defaultFindTimeout) + .findByCssSelector('input[ng-model=\'absolute.to\']') + .getProperty('value'); + }); } setFromTime(timeString) { - return this.remote.setFindTimeout(defaultFindTimeout) - .findByCssSelector('input[ng-model=\'absolute.from\']') - .clearValue() - .type(timeString); + PageObjects.common.debug(`setFromTime: ${timeString}`); + return PageObjects.common.try(async () => { + await this.ensureTimePickerIsOpen(); + await this.showAbsoluteSection(); + return this.remote.setFindTimeout(defaultFindTimeout) + .findByCssSelector('input[ng-model=\'absolute.from\']') + .clearValue() + .type(timeString); + }); } setToTime(timeString) { - return this.remote.setFindTimeout(defaultFindTimeout) - .findByCssSelector('input[ng-model=\'absolute.to\']') - .clearValue() - .type(timeString); + PageObjects.common.debug(`setToTime: ${timeString}`); + return PageObjects.common.try(async () => { + await this.ensureTimePickerIsOpen(); + await this.showAbsoluteSection(); + return this.remote.setFindTimeout(defaultFindTimeout) + .findByCssSelector('input[ng-model=\'absolute.to\']') + .clearValue() + .type(timeString); + }); } clickGoButton() { - const self = this; - return this.remote.setFindTimeout(defaultFindTimeout) - .findByClassName('kbn-timepicker-go') - .click() - .then(function () { - return self.waitUntilLoadingHasFinished(); + PageObjects.common.debug('clickGoButton'); + return PageObjects.common.try(async () => { + const self = this; + return this.remote.setFindTimeout(defaultFindTimeout) + .findByClassName('kbn-timepicker-go') + .click() + .then(function () { + return self.waitUntilLoadingHasFinished(); + }); }); } setAbsoluteRange(fromTime, toTime) { - PageObjects.common.debug('clickTimepicker'); + PageObjects.common.debug(`setAbsoluteRange: ${fromTime} to ${toTime}`); return this.clickTimepicker() .then(() => { PageObjects.common.debug('--Clicking Absolute button'); - return this.clickAbsoluteButton(); + return this.showAbsoluteSection(); }) .then(() => { PageObjects.common.debug('--Setting From Time : ' + fromTime); @@ -150,7 +163,7 @@ export default class HeaderPage { async ensureTimePickerIsOpen() { const isOpen = await PageObjects.header.isTimepickerOpen(); - PageObjects.common.debug(`time picker open: ${isOpen}`); + PageObjects.common.debug(`ensureTimePickerIsOpen: ${isOpen}`); if (!isOpen) { PageObjects.common.debug('--Opening time picker'); await PageObjects.header.clickTimepicker(); @@ -160,11 +173,8 @@ export default class HeaderPage { async setAbsoluteRange(fromTime, toTime) { PageObjects.common.debug(`Setting absolute range to ${fromTime} to ${toTime}`); await this.ensureTimePickerIsOpen(); - PageObjects.common.debug('--Clicking Absolute button'); - await this.clickAbsoluteButton(); - PageObjects.common.debug('--Setting From Time : ' + fromTime); + await this.showAbsoluteSection(); await this.setFromTime(fromTime); - PageObjects.common.debug('--Setting To Time : ' + toTime); await this.setToTime(toTime); await this.clickGoButton(); await this.isGlobalLoadingIndicatorHidden(); @@ -194,9 +204,12 @@ export default class HeaderPage { } clickToastOK() { - return this.remote.setFindTimeout(defaultFindTimeout) - .findByCssSelector('button[ng-if="notif.accept"]') - .click(); + PageObjects.common.debug('clickToastOK'); + return PageObjects.common.try(async () => ( + this.remote.setFindTimeout(defaultFindTimeout) + .findByCssSelector('button[ng-if="notif.accept"]') + .click() + )); } async waitUntilLoadingHasFinished() {