From e3e411109f0e2ab2ac49d2c9d850a44bf3582e4e Mon Sep 17 00:00:00 2001 From: Dmitry Lemeshko Date: Tue, 5 May 2020 16:24:04 +0300 Subject: [PATCH] [test/functional] Tsfy page objects (#64887) * [test/functional/page_objects] tsfy console, context, header, timepicker & timelion * [test/functional/page_objects] tsfy shield & error * fix ts-check issue Co-authored-by: Elastic Machine --- .../apps/discover/_discover_histogram.js | 2 +- .../{console_page.js => console_page.ts} | 43 +++--- .../{context_page.js => context_page.ts} | 21 +-- .../{error_page.js => error_page.ts} | 17 ++- .../{header_page.js => header_page.ts} | 20 +-- test/functional/page_objects/index.ts | 12 +- .../{shield_page.js => shield_page.ts} | 6 +- .../{time_picker.js => time_picker.ts} | 140 +++++++++--------- .../{timelion_page.js => timelion_page.ts} | 22 +-- 9 files changed, 144 insertions(+), 139 deletions(-) rename test/functional/page_objects/{console_page.js => console_page.ts} (65%) rename test/functional/page_objects/{context_page.js => context_page.ts} (86%) rename test/functional/page_objects/{error_page.js => error_page.ts} (74%) rename test/functional/page_objects/{header_page.js => header_page.ts} (87%) rename test/functional/page_objects/{shield_page.js => shield_page.ts} (85%) rename test/functional/page_objects/{time_picker.js => time_picker.ts} (77%) rename test/functional/page_objects/{timelion_page.js => timelion_page.ts} (85%) diff --git a/test/functional/apps/discover/_discover_histogram.js b/test/functional/apps/discover/_discover_histogram.js index dcd185eba00e6e..20e69ef8345c6f 100644 --- a/test/functional/apps/discover/_discover_histogram.js +++ b/test/functional/apps/discover/_discover_histogram.js @@ -56,7 +56,7 @@ export default function({ getService, getPageObjects }) { await PageObjects.common.navigateToApp('discover'); await PageObjects.discover.selectIndexPattern('long-window-logstash-*'); // NOTE: For some reason without setting this relative time, the abs times will not fetch data. - await PageObjects.timePicker.setCommonlyUsedTime('superDatePickerCommonlyUsed_Last_1 year'); + await PageObjects.timePicker.setCommonlyUsedTime('Last_1 year'); }); after(async () => { await esArchiver.unload('long_window_logstash'); diff --git a/test/functional/page_objects/console_page.js b/test/functional/page_objects/console_page.ts similarity index 65% rename from test/functional/page_objects/console_page.js rename to test/functional/page_objects/console_page.ts index 33d13d3064333a..d8eb692a250444 100644 --- a/test/functional/page_objects/console_page.js +++ b/test/functional/page_objects/console_page.ts @@ -17,46 +17,47 @@ * under the License. */ -import Bluebird from 'bluebird'; +import { FtrProviderContext } from '../ftr_provider_context'; +import { WebElementWrapper } from '../services/lib/web_element_wrapper'; -export function ConsolePageProvider({ getService }) { +export function ConsolePageProvider({ getService }: FtrProviderContext) { const testSubjects = getService('testSubjects'); const retry = getService('retry'); - async function getVisibleTextFromAceEditor(editor) { - const lines = await editor.findAllByClassName('ace_line_group'); - const linesText = await Bluebird.map(lines, l => l.getVisibleText()); - return linesText.join('\n'); - } + class ConsolePage { + public async getVisibleTextFromAceEditor(editor: WebElementWrapper) { + const lines = await editor.findAllByClassName('ace_line_group'); + const linesText = await Promise.all(lines.map(async line => await line.getVisibleText())); + return linesText.join('\n'); + } - return new (class ConsolePage { - async getRequestEditor() { + public async getRequestEditor() { return await testSubjects.find('request-editor'); } - async getRequest() { + public async getRequest() { const requestEditor = await this.getRequestEditor(); - return await getVisibleTextFromAceEditor(requestEditor); + return await this.getVisibleTextFromAceEditor(requestEditor); } - async getResponse() { + public async getResponse() { const responseEditor = await testSubjects.find('response-editor'); - return await getVisibleTextFromAceEditor(responseEditor); + return await this.getVisibleTextFromAceEditor(responseEditor); } - async clickPlay() { + public async clickPlay() { await testSubjects.click('sendRequestButton'); } - async collapseHelp() { + public async collapseHelp() { await testSubjects.click('help-close-button'); } - async openSettings() { + public async openSettings() { await testSubjects.click('consoleSettingsButton'); } - async setFontSizeSetting(newSize) { + public async setFontSizeSetting(newSize: number) { await this.openSettings(); // while the settings form opens/loads this may fail, so retry for a while @@ -70,13 +71,15 @@ export function ConsolePageProvider({ getService }) { await testSubjects.click('settings-save-button'); } - async getFontSize(editor) { + public async getFontSize(editor: WebElementWrapper) { const aceLine = await editor.findByClassName('ace_line'); return await aceLine.getComputedStyle('font-size'); } - async getRequestFontSize() { + public async getRequestFontSize() { return await this.getFontSize(await this.getRequestEditor()); } - })(); + } + + return new ConsolePage(); } diff --git a/test/functional/page_objects/context_page.js b/test/functional/page_objects/context_page.ts similarity index 86% rename from test/functional/page_objects/context_page.js rename to test/functional/page_objects/context_page.ts index 6ab082bf652921..9cbada532cde32 100644 --- a/test/functional/page_objects/context_page.js +++ b/test/functional/page_objects/context_page.ts @@ -18,14 +18,15 @@ */ import rison from 'rison-node'; - +import { FtrProviderContext } from '../ftr_provider_context'; +// @ts-ignore not TS yet import getUrl from '../../../src/test_utils/get_url'; const DEFAULT_INITIAL_STATE = { columns: ['@message'], }; -export function ContextPageProvider({ getService, getPageObjects }) { +export function ContextPageProvider({ getService, getPageObjects }: FtrProviderContext) { const browser = getService('browser'); const config = getService('config'); const retry = getService('retry'); @@ -34,7 +35,7 @@ export function ContextPageProvider({ getService, getPageObjects }) { const log = getService('log'); class ContextPage { - async navigateTo(indexPattern, anchorId, overrideInitialState = {}) { + public async navigateTo(indexPattern: string, anchorId: string, overrideInitialState = {}) { const initialState = rison.encode({ ...DEFAULT_INITIAL_STATE, ...overrideInitialState, @@ -53,23 +54,23 @@ export function ContextPageProvider({ getService, getPageObjects }) { await PageObjects.common.sleep(1000); } - async getPredecessorCountPicker() { + public async getPredecessorCountPicker() { return await testSubjects.find('predecessorsCountPicker'); } - async getSuccessorCountPicker() { + public async getSuccessorCountPicker() { return await testSubjects.find('successorsCountPicker'); } - async getPredecessorLoadMoreButton() { + public async getPredecessorLoadMoreButton() { return await testSubjects.find('predecessorsLoadMoreButton'); } - async getSuccessorLoadMoreButton() { + public async getSuccessorLoadMoreButton() { return await testSubjects.find('successorsLoadMoreButton'); } - async clickPredecessorLoadMoreButton() { + public async clickPredecessorLoadMoreButton() { log.debug('Click Predecessor Load More Button'); await retry.try(async () => { const predecessorButton = await this.getPredecessorLoadMoreButton(); @@ -79,7 +80,7 @@ export function ContextPageProvider({ getService, getPageObjects }) { await PageObjects.header.waitUntilLoadingHasFinished(); } - async clickSuccessorLoadMoreButton() { + public async clickSuccessorLoadMoreButton() { log.debug('Click Successor Load More Button'); await retry.try(async () => { const sucessorButton = await this.getSuccessorLoadMoreButton(); @@ -89,7 +90,7 @@ export function ContextPageProvider({ getService, getPageObjects }) { await PageObjects.header.waitUntilLoadingHasFinished(); } - async waitUntilContextLoadingHasFinished() { + public async waitUntilContextLoadingHasFinished() { return await retry.try(async () => { const successorLoadMoreButton = await this.getSuccessorLoadMoreButton(); const predecessorLoadMoreButton = await this.getPredecessorLoadMoreButton(); diff --git a/test/functional/page_objects/error_page.js b/test/functional/page_objects/error_page.ts similarity index 74% rename from test/functional/page_objects/error_page.js rename to test/functional/page_objects/error_page.ts index 8ae0bd554989ed..332ce835d0b1c0 100644 --- a/test/functional/page_objects/error_page.js +++ b/test/functional/page_objects/error_page.ts @@ -16,14 +16,16 @@ * specific language governing permissions and limitations * under the License. */ -import expect from '@kbn/expect'; -export function ErrorPageProvider({ getPageObjects }) { - const PageObjects = getPageObjects(['common']); +import expect from '@kbn/expect/expect.js'; +import { FtrProviderContext } from '../ftr_provider_context'; + +export function ErrorPageProvider({ getPageObjects }: FtrProviderContext) { + const { common } = getPageObjects(['common']); class ErrorPage { - async expectForbidden() { - const messageText = await PageObjects.common.getBodyText(); + public async expectForbidden() { + const messageText = await common.getBodyText(); expect(messageText).to.eql( JSON.stringify({ statusCode: 403, @@ -32,8 +34,9 @@ export function ErrorPageProvider({ getPageObjects }) { }) ); } - async expectNotFound() { - const messageText = await PageObjects.common.getBodyText(); + + public async expectNotFound() { + const messageText = await common.getBodyText(); expect(messageText).to.eql( JSON.stringify({ statusCode: 404, diff --git a/test/functional/page_objects/header_page.js b/test/functional/page_objects/header_page.ts similarity index 87% rename from test/functional/page_objects/header_page.js rename to test/functional/page_objects/header_page.ts index d0a237e8f42d08..5f180347338221 100644 --- a/test/functional/page_objects/header_page.js +++ b/test/functional/page_objects/header_page.ts @@ -17,7 +17,9 @@ * under the License. */ -export function HeaderPageProvider({ getService, getPageObjects }) { +import { FtrProviderContext } from '../ftr_provider_context'; + +export function HeaderPageProvider({ getService, getPageObjects }: FtrProviderContext) { const config = getService('config'); const log = getService('log'); const retry = getService('retry'); @@ -29,13 +31,13 @@ export function HeaderPageProvider({ getService, getPageObjects }) { const defaultFindTimeout = config.get('timeouts.find'); class HeaderPage { - async clickDiscover() { + public async clickDiscover() { await appsMenu.clickLink('Discover'); await PageObjects.common.waitForTopNavToBeVisible(); await this.awaitGlobalLoadingIndicatorHidden(); } - async clickVisualize() { + public async clickVisualize() { await appsMenu.clickLink('Visualize'); await this.awaitGlobalLoadingIndicatorHidden(); await retry.waitFor('first breadcrumb to be "Visualize"', async () => { @@ -49,7 +51,7 @@ export function HeaderPageProvider({ getService, getPageObjects }) { }); } - async clickDashboard() { + public async clickDashboard() { await appsMenu.clickLink('Dashboard'); await retry.waitFor('dashboard app to be loaded', async () => { const isNavVisible = await testSubjects.exists('top-nav'); @@ -59,12 +61,12 @@ export function HeaderPageProvider({ getService, getPageObjects }) { await this.awaitGlobalLoadingIndicatorHidden(); } - async clickStackManagement() { + public async clickStackManagement() { await appsMenu.clickLink('Management'); await this.awaitGlobalLoadingIndicatorHidden(); } - async waitUntilLoadingHasFinished() { + public async waitUntilLoadingHasFinished() { try { await this.isGlobalLoadingIndicatorVisible(); } catch (exception) { @@ -77,19 +79,19 @@ export function HeaderPageProvider({ getService, getPageObjects }) { await this.awaitGlobalLoadingIndicatorHidden(); } - async isGlobalLoadingIndicatorVisible() { + public async isGlobalLoadingIndicatorVisible() { log.debug('isGlobalLoadingIndicatorVisible'); return await testSubjects.exists('globalLoadingIndicator', { timeout: 1500 }); } - async awaitGlobalLoadingIndicatorHidden() { + public async awaitGlobalLoadingIndicatorHidden() { await testSubjects.existOrFail('globalLoadingIndicator-hidden', { allowHidden: true, timeout: defaultFindTimeout * 10, }); } - async awaitKibanaChrome() { + public async awaitKibanaChrome() { log.debug('awaitKibanaChrome'); await testSubjects.find('kibanaChrome', defaultFindTimeout * 10); } diff --git a/test/functional/page_objects/index.ts b/test/functional/page_objects/index.ts index db58c3c2c7d195..4077036cbe793e 100644 --- a/test/functional/page_objects/index.ts +++ b/test/functional/page_objects/index.ts @@ -18,15 +18,11 @@ */ import { CommonPageProvider } from './common_page'; -// @ts-ignore not TS yet import { ConsolePageProvider } from './console_page'; -// @ts-ignore not TS yet import { ContextPageProvider } from './context_page'; import { DashboardPageProvider } from './dashboard_page'; import { DiscoverPageProvider } from './discover_page'; -// @ts-ignore not TS yet import { ErrorPageProvider } from './error_page'; -// @ts-ignore not TS yet import { HeaderPageProvider } from './header_page'; import { HomePageProvider } from './home_page'; // @ts-ignore not TS yet @@ -34,14 +30,10 @@ import { MonitoringPageProvider } from './monitoring_page'; import { NewsfeedPageProvider } from './newsfeed_page'; // @ts-ignore not TS yet import { PointSeriesPageProvider } from './point_series_page'; -// @ts-ignore not TS yet import { SettingsPageProvider } from './settings_page'; import { SharePageProvider } from './share_page'; -// @ts-ignore not TS yet import { ShieldPageProvider } from './shield_page'; -// @ts-ignore not TS yet -import { TimePickerPageProvider } from './time_picker'; -// @ts-ignore not TS yet +import { TimePickerProvider } from './time_picker'; import { TimelionPageProvider } from './timelion_page'; import { VisualBuilderPageProvider } from './visual_builder_page'; import { VisualizePageProvider } from './visualize_page'; @@ -67,7 +59,7 @@ export const pageObjects = { share: SharePageProvider, shield: ShieldPageProvider, timelion: TimelionPageProvider, - timePicker: TimePickerPageProvider, + timePicker: TimePickerProvider, visualBuilder: VisualBuilderPageProvider, visualize: VisualizePageProvider, visEditor: VisualizeEditorPageProvider, diff --git a/test/functional/page_objects/shield_page.js b/test/functional/page_objects/shield_page.ts similarity index 85% rename from test/functional/page_objects/shield_page.js rename to test/functional/page_objects/shield_page.ts index 4b85c65a12f2c1..2b9c59373a8bc3 100644 --- a/test/functional/page_objects/shield_page.js +++ b/test/functional/page_objects/shield_page.ts @@ -17,11 +17,13 @@ * under the License. */ -export function ShieldPageProvider({ getService }) { +import { FtrProviderContext } from '../ftr_provider_context'; + +export function ShieldPageProvider({ getService }: FtrProviderContext) { const testSubjects = getService('testSubjects'); class ShieldPage { - async login(user, pwd) { + async login(user: string, pwd: string) { await testSubjects.setValue('loginUsername', user); await testSubjects.setValue('loginPassword', pwd); await testSubjects.click('loginSubmit'); diff --git a/test/functional/page_objects/time_picker.js b/test/functional/page_objects/time_picker.ts similarity index 77% rename from test/functional/page_objects/time_picker.js rename to test/functional/page_objects/time_picker.ts index 2394abc9c21854..92f0d090ff5ee3 100644 --- a/test/functional/page_objects/time_picker.js +++ b/test/functional/page_objects/time_picker.ts @@ -18,65 +18,90 @@ */ import moment from 'moment'; +import { FtrProviderContext } from '../ftr_provider_context.d'; +import { WebElementWrapper } from '../services/lib/web_element_wrapper'; -export function TimePickerPageProvider({ getService, getPageObjects }) { +export function TimePickerProvider({ getService, getPageObjects }: FtrProviderContext) { const log = getService('log'); const retry = getService('retry'); const find = getService('find'); const browser = getService('browser'); const testSubjects = getService('testSubjects'); - const PageObjects = getPageObjects(['header', 'common']); + const { header, common } = getPageObjects(['header', 'common']); + + type CommonlyUsed = + | 'Today' + | 'This_week' + | 'Last_15 minutes' + | 'Last_30 minutes' + | 'Last_1 hour' + | 'Last_24 hours' + | 'Last_7 days' + | 'Last_30 days' + | 'Last_90 days' + | 'Last_1 year'; + + class TimePicker { + defaultStartTime = 'Sep 19, 2015 @ 06:31:44.000'; + defaultEndTime = 'Sep 23, 2015 @ 18:31:44.000'; - class TimePickerPage { - async timePickerExists() { - return await testSubjects.exists('superDatePickerToggleQuickMenuButton'); - } - - formatDateToAbsoluteTimeString(date) { - // toISOString returns dates in format 'YYYY-MM-DDTHH:mm:ss.sssZ' - // Need to replace T with space and remove timezone - const DEFAULT_DATE_FORMAT = 'MMM D, YYYY @ HH:mm:ss.SSS'; - return moment(date).format(DEFAULT_DATE_FORMAT); + async setDefaultAbsoluteRange() { + await this.setAbsoluteRange(this.defaultStartTime, this.defaultEndTime); } - async getTimePickerPanel() { + private async getTimePickerPanel() { return await find.byCssSelector('div.euiPopover__panel-isOpen'); } - async waitPanelIsGone(panelElement) { + private async waitPanelIsGone(panelElement: WebElementWrapper) { await find.waitForElementStale(panelElement); } + public async timePickerExists() { + return await testSubjects.exists('superDatePickerToggleQuickMenuButton'); + } + /** - * @param {String} commonlyUsedOption 'superDatePickerCommonlyUsed_This_week' + * Sets commonly used time + * @param option 'Today' | 'This_week' | 'Last_15 minutes' | 'Last_24 hours' ... */ - async setCommonlyUsedTime(commonlyUsedOption) { + async setCommonlyUsedTime(option: CommonlyUsed) { await testSubjects.click('superDatePickerToggleQuickMenuButton'); - await testSubjects.click(commonlyUsedOption); + await testSubjects.click(`superDatePickerCommonlyUsed_${option}`); } - async inputValue(dataTestsubj, value) { + private async inputValue(dataTestSubj: string, value: string) { if (browser.isFirefox) { - const input = await testSubjects.find(dataTestsubj); + const input = await testSubjects.find(dataTestSubj); await input.clearValue(); await input.type(value); } else if (browser.isInternetExplorer) { - const input = await testSubjects.find(dataTestsubj); + const input = await testSubjects.find(dataTestSubj); const currentValue = await input.getAttribute('value'); await input.type(browser.keys.ARROW_RIGHT.repeat(currentValue.length)); await input.type(browser.keys.BACK_SPACE.repeat(currentValue.length)); await input.type(value); await input.click(); } else { - await testSubjects.setValue(dataTestsubj, value); + await testSubjects.setValue(dataTestSubj, value); } } + private async showStartEndTimes() { + // This first await makes sure the superDatePicker has loaded before we check for the ShowDatesButton + await testSubjects.exists('superDatePickerToggleQuickMenuButton', { timeout: 20000 }); + const isShowDatesButton = await testSubjects.exists('superDatePickerShowDatesButton'); + if (isShowDatesButton) { + await testSubjects.click('superDatePickerShowDatesButton'); + } + await testSubjects.exists('superDatePickerstartDatePopoverButton'); + } + /** * @param {String} fromTime MMM D, YYYY @ HH:mm:ss.SSS * @param {String} toTime MMM D, YYYY @ HH:mm:ss.SSS */ - async setAbsoluteRange(fromTime, toTime) { + public async setAbsoluteRange(fromTime: string, toTime: string) { log.debug(`Setting absolute range to ${fromTime} to ${toTime}`); await this.showStartEndTimes(); @@ -86,7 +111,7 @@ export function TimePickerPageProvider({ getService, getPageObjects }) { await testSubjects.click('superDatePickerAbsoluteTab'); await testSubjects.click('superDatePickerAbsoluteDateInput'); await this.inputValue('superDatePickerAbsoluteDateInput', toTime); - await PageObjects.common.sleep(500); + await common.sleep(500); // set from time await testSubjects.click('superDatePickerstartDatePopoverButton'); @@ -110,30 +135,18 @@ export function TimePickerPageProvider({ getService, getPageObjects }) { } await this.waitPanelIsGone(panel); - await PageObjects.header.awaitGlobalLoadingIndicatorHidden(); + await header.awaitGlobalLoadingIndicatorHidden(); } - get defaultStartTime() { - return 'Sep 19, 2015 @ 06:31:44.000'; - } - get defaultEndTime() { - return 'Sep 23, 2015 @ 18:31:44.000'; + public async isOff() { + return await find.existsByCssSelector('.euiDatePickerRange--readOnly'); } - async setDefaultAbsoluteRange() { - await this.setAbsoluteRange(this.defaultStartTime, this.defaultEndTime); - } - - async isOff() { - const element = await find.byClassName('euiDatePickerRange--readOnly'); - return !!element; - } - - async isQuickSelectMenuOpen() { + public async isQuickSelectMenuOpen() { return await testSubjects.exists('superDatePickerQuickMenu'); } - async openQuickSelectTimeMenu() { + public async openQuickSelectTimeMenu() { log.debug('openQuickSelectTimeMenu'); const isMenuOpen = await this.isQuickSelectMenuOpen(); if (!isMenuOpen) { @@ -144,7 +157,7 @@ export function TimePickerPageProvider({ getService, getPageObjects }) { } } - async closeQuickSelectTimeMenu() { + public async closeQuickSelectTimeMenu() { log.debug('closeQuickSelectTimeMenu'); const isMenuOpen = await this.isQuickSelectMenuOpen(); if (isMenuOpen) { @@ -155,17 +168,7 @@ export function TimePickerPageProvider({ getService, getPageObjects }) { } } - async showStartEndTimes() { - // This first await makes sure the superDatePicker has loaded before we check for the ShowDatesButton - await testSubjects.exists('superDatePickerToggleQuickMenuButton', { timeout: 20000 }); - const isShowDatesButton = await testSubjects.exists('superDatePickerShowDatesButton'); - if (isShowDatesButton) { - await testSubjects.click('superDatePickerShowDatesButton'); - } - await testSubjects.exists('superDatePickerstartDatePopoverButton'); - } - - async getRefreshConfig(keepQuickSelectOpen = false) { + public async getRefreshConfig(keepQuickSelectOpen = false) { await this.openQuickSelectTimeMenu(); const interval = await testSubjects.getAttribute( 'superDatePickerRefreshIntervalInput', @@ -198,7 +201,7 @@ export function TimePickerPageProvider({ getService, getPageObjects }) { }; } - async getTimeConfig() { + public async getTimeConfig() { await this.showStartEndTimes(); const start = await testSubjects.getVisibleText('superDatePickerstartDatePopoverButton'); const end = await testSubjects.getVisibleText('superDatePickerendDatePopoverButton'); @@ -208,15 +211,14 @@ export function TimePickerPageProvider({ getService, getPageObjects }) { }; } - async getTimeDurationForSharing() { - return await retry.try(async () => { - const element = await testSubjects.find('dataSharedTimefilterDuration'); - const data = await element.getAttribute('data-shared-timefilter-duration'); - return data; - }); + public async getTimeDurationForSharing() { + return await testSubjects.getAttribute( + 'dataSharedTimefilterDuration', + 'data-shared-timefilter-duration' + ); } - async getTimeConfigAsAbsoluteTimes() { + public async getTimeConfigAsAbsoluteTimes() { await this.showStartEndTimes(); // get to time @@ -237,17 +239,15 @@ export function TimePickerPageProvider({ getService, getPageObjects }) { }; } - async getTimeDurationInHours() { + public async getTimeDurationInHours() { const DEFAULT_DATE_FORMAT = 'MMM D, YYYY @ HH:mm:ss.SSS'; const { start, end } = await this.getTimeConfigAsAbsoluteTimes(); - const startMoment = moment(start, DEFAULT_DATE_FORMAT); const endMoment = moment(end, DEFAULT_DATE_FORMAT); - - return moment.duration(moment(endMoment) - moment(startMoment)).asHours(); + return moment.duration(endMoment.diff(startMoment)).asHours(); } - async pauseAutoRefresh() { + public async pauseAutoRefresh() { log.debug('pauseAutoRefresh'); const refreshConfig = await this.getRefreshConfig(true); if (!refreshConfig.isPaused) { @@ -259,7 +259,7 @@ export function TimePickerPageProvider({ getService, getPageObjects }) { await this.closeQuickSelectTimeMenu(); } - async resumeAutoRefresh() { + public async resumeAutoRefresh() { log.debug('resumeAutoRefresh'); const refreshConfig = await this.getRefreshConfig(true); if (refreshConfig.isPaused) { @@ -270,22 +270,22 @@ export function TimePickerPageProvider({ getService, getPageObjects }) { await this.closeQuickSelectTimeMenu(); } - async setHistoricalDataRange() { + public async setHistoricalDataRange() { await this.setDefaultAbsoluteRange(); } - async setDefaultDataRange() { + public async setDefaultDataRange() { const fromTime = 'Jan 1, 2018 @ 00:00:00.000'; const toTime = 'Apr 13, 2018 @ 00:00:00.000'; await this.setAbsoluteRange(fromTime, toTime); } - async setLogstashDataRange() { + public async setLogstashDataRange() { const fromTime = 'Apr 9, 2018 @ 00:00:00.000'; const toTime = 'Apr 13, 2018 @ 00:00:00.000'; await this.setAbsoluteRange(fromTime, toTime); } } - return new TimePickerPage(); + return new TimePicker(); } diff --git a/test/functional/page_objects/timelion_page.js b/test/functional/page_objects/timelion_page.ts similarity index 85% rename from test/functional/page_objects/timelion_page.js rename to test/functional/page_objects/timelion_page.ts index 88eda5da5ce15f..1075c19a105c04 100644 --- a/test/functional/page_objects/timelion_page.js +++ b/test/functional/page_objects/timelion_page.ts @@ -17,7 +17,9 @@ * under the License. */ -export function TimelionPageProvider({ getService, getPageObjects }) { +import { FtrProviderContext } from '../ftr_provider_context'; + +export function TimelionPageProvider({ getService, getPageObjects }: FtrProviderContext) { const testSubjects = getService('testSubjects'); const log = getService('log'); const PageObjects = getPageObjects(['common', 'header']); @@ -25,7 +27,7 @@ export function TimelionPageProvider({ getService, getPageObjects }) { const kibanaServer = getService('kibanaServer'); class TimelionPage { - async initTests() { + public async initTests() { await kibanaServer.uiSettings.replace({ defaultIndex: 'logstash-*', }); @@ -36,29 +38,29 @@ export function TimelionPageProvider({ getService, getPageObjects }) { await PageObjects.common.navigateToApp('timelion'); } - async setExpression(expression) { + public async setExpression(expression: string) { const input = await testSubjects.find('timelionExpressionTextArea'); await input.clearValue(); await input.type(expression); } - async updateExpression(updates) { + public async updateExpression(updates: string) { const input = await testSubjects.find('timelionExpressionTextArea'); await input.type(updates); await PageObjects.common.sleep(500); } - async getExpression() { + public async getExpression() { const input = await testSubjects.find('timelionExpressionTextArea'); return input.getVisibleText(); } - async getSuggestionItemsText() { + public async getSuggestionItemsText() { const elements = await testSubjects.findAll('timelionSuggestionListItem'); return await Promise.all(elements.map(async element => await element.getVisibleText())); } - async clickSuggestion(suggestionIndex = 0, waitTime = 500) { + public async clickSuggestion(suggestionIndex = 0, waitTime = 500) { const elements = await testSubjects.findAll('timelionSuggestionListItem'); if (suggestionIndex > elements.length) { throw new Error( @@ -70,7 +72,7 @@ export function TimelionPageProvider({ getService, getPageObjects }) { await PageObjects.common.sleep(waitTime); } - async saveTimelionSheet() { + public async saveTimelionSheet() { await testSubjects.click('timelionSaveButton'); await testSubjects.click('timelionSaveAsSheetButton'); await testSubjects.click('timelionFinishSaveButton'); @@ -78,12 +80,12 @@ export function TimelionPageProvider({ getService, getPageObjects }) { await testSubjects.waitForDeleted('timelionSaveSuccessToast'); } - async expectWriteControls() { + public async expectWriteControls() { await testSubjects.existOrFail('timelionSaveButton'); await testSubjects.existOrFail('timelionDeleteButton'); } - async expectMissingWriteControls() { + public async expectMissingWriteControls() { await testSubjects.missingOrFail('timelionSaveButton'); await testSubjects.missingOrFail('timelionDeleteButton'); }