better fix for flaky management settings test (#21171) (#21368)

* better fix for flaky management settings test

* implementing better click strategy for toggleAdvancedSettingCheckbox

* converting all of settings page to use preferred styles for clicks and finds

* PR feedback

* fixing issue with missing method

* fixing issue with missing method

* adding missing method

* fixing test

* fixing test issue
This commit is contained in:
Bill McConaghy 2018-07-27 17:29:21 -04:00 committed by GitHub
parent aad32a99b5
commit b4790ea924
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 107 additions and 96 deletions

View file

@ -18,56 +18,49 @@
*/
import { map as mapAsync } from 'bluebird';
export function SettingsPageProvider({ getService, getPageObjects }) {
const log = getService('log');
const retry = getService('retry');
const config = getService('config');
const remote = getService('remote');
const find = getService('find');
const flyout = getService('flyout');
const config = getService('config');
const defaultFindTimeout = config.get('timeouts.find');
const testSubjects = getService('testSubjects');
const PageObjects = getPageObjects(['header', 'common', 'visualize']);
const defaultFindTimeout = config.get('timeouts.find');
class SettingsPage {
async clickNavigation() {
// TODO: find better way to target the element
await remote.findDisplayedByCssSelector('.app-link:nth-child(5) a').click();
find.clickDisplayedByCssSelector('.app-link:nth-child(5) a');
}
async clickLinkText(text) {
await retry.try(async () => {
await remote.findDisplayedByLinkText(text).click();
});
await find.clickByDisplayedLinkText(text);
}
async clickKibanaSettings() {
await this.clickLinkText('Advanced Settings');
await find.clickByDisplayedLinkText('Advanced Settings');
await PageObjects.header.waitUntilLoadingHasFinished();
// Verify navigation is successful.
await testSubjects.existOrFail('managementSettingsTitle');
}
async clickKibanaSavedObjects() {
await this.clickLinkText('Saved Objects');
await find.clickByDisplayedLinkText('Saved Objects');
}
async clickKibanaIndices() {
log.debug('clickKibanaIndices link');
await this.clickLinkText('Index Patterns');
await find.clickByDisplayedLinkText('Index Patterns');
}
async getAdvancedSettings(propertyName) {
log.debug('in getAdvancedSettings');
const setting = await testSubjects.find(`advancedSetting-editField-${propertyName}`);
const setting = await testSubjects.find(`advancedSetting-editField-${propertyName}`);
return await setting.getProperty('value');
}
async getAdvancedSettingCheckbox(propertyName) {
log.debug('in getAdvancedSettingCheckbox');
const setting = await testSubjects.find(`advancedSetting-editField-${propertyName}`);
return await setting.getProperty('checked');
return await testSubjects.getProperty(`advancedSetting-editField-${propertyName}`, 'checked');
}
async clearAdvancedSettings(propertyName) {
@ -76,13 +69,9 @@ export function SettingsPageProvider({ getService, getPageObjects }) {
}
async setAdvancedSettingsSelect(propertyName, propertyValue) {
let option;
await retry.try(async () => {
option = await remote.findByCssSelector(
`[data-test-subj="advancedSetting-editField-${propertyName}"] option[value="${propertyValue}"]`
);
});
await option.click();
await find.clickByCssSelector(
`[data-test-subj="advancedSetting-editField-${propertyName}"] option[value="${propertyValue}"]`
);
await PageObjects.header.waitUntilLoadingHasFinished();
await testSubjects.click(`advancedSetting-saveEditField-${propertyName}`);
await PageObjects.header.waitUntilLoadingHasFinished();
@ -97,8 +86,7 @@ export function SettingsPageProvider({ getService, getPageObjects }) {
}
async toggleAdvancedSettingCheckbox(propertyName) {
const checkbox = await testSubjects.find(`advancedSetting-editField-${propertyName}`);
await checkbox.click();
testSubjects.click(`advancedSetting-editField-${propertyName}`);
await PageObjects.header.waitUntilLoadingHasFinished();
await testSubjects.click(`advancedSetting-saveEditField-${propertyName}`);
await PageObjects.header.waitUntilLoadingHasFinished();
@ -160,35 +148,25 @@ export function SettingsPageProvider({ getService, getPageObjects }) {
return await testSubjects.find('indexPatternTitle');
}
getConfigureHeader() {
return remote.setFindTimeout(defaultFindTimeout)
.findByCssSelector('h1');
async getConfigureHeader() {
return await find.byCssSelector('h1');
}
getTableHeader() {
return remote.setFindTimeout(defaultFindTimeout)
.findAllByCssSelector('table.euiTable thead tr th');
async getTableHeader() {
return await find.allByCssSelector('table.euiTable thead tr th');
}
sortBy(columnName) {
return remote.setFindTimeout(defaultFindTimeout)
.findAllByCssSelector('table.euiTable thead tr th button')
.then(function (chartTypes) {
function getChartType(chart) {
return chart.getVisibleText()
.then(function (chartString) {
if (chartString === columnName) {
return chart.click()
.then(function () {
return PageObjects.header.waitUntilLoadingHasFinished();
});
}
});
}
const getChartTypesPromises = chartTypes.map(getChartType);
return Promise.all(getChartTypesPromises);
});
async sortBy(columnName) {
const chartTypes = await find.allByCssSelector('table.euiTable thead tr th button');
async function getChartType(chart) {
const chartString = await chart.getVisibleText();
if (chartString === columnName) {
await chart.click();
await PageObjects.header.waitUntilLoadingHasFinished();
}
}
const getChartTypesPromises = chartTypes.map(getChartType);
return Promise.all(getChartTypesPromises);
}
getTableRow(rowNumber, colNumber) {
@ -210,8 +188,8 @@ export function SettingsPageProvider({ getService, getPageObjects }) {
async getScriptedFieldsTabCount() {
const selector = '[data-test-subj="tab-count-scriptedFields"]';
return await retry.try(async () => {
const theText = await remote.setFindTimeout(defaultFindTimeout / 10)
.findByCssSelector(selector).getVisibleText();
const theText = await (await find.byCssSelector(selector))
.getVisibleText();
return theText.replace(/\((.*)\)/, '$1');
});
}
@ -238,15 +216,17 @@ export function SettingsPageProvider({ getService, getPageObjects }) {
}
async setFieldTypeFilter(type) {
await remote.setFindTimeout(defaultFindTimeout)
.findByCssSelector('select[data-test-subj="indexedFieldTypeFilterDropdown"] > option[label="' + type + '"]')
.click();
await find.clickByCssSelector(
'select[data-test-subj="indexedFieldTypeFilterDropdown"] > option[label="' + type + '"]'
);
}
async setScriptedFieldLanguageFilter(language) {
await remote.setFindTimeout(defaultFindTimeout)
.findByCssSelector('select[data-test-subj="scriptedFieldLanguageFilterDropdown"] > option[label="' + language + '"]')
.click();
await find.clickByCssSelector(
'select[data-test-subj="scriptedFieldLanguageFilterDropdown"] > option[label="' +
language +
'"]'
);
}
async filterField(name) {
@ -257,14 +237,14 @@ export function SettingsPageProvider({ getService, getPageObjects }) {
async openControlsByName(name) {
await this.filterField(name);
const tableFields = await remote.setFindTimeout(defaultFindTimeout)
.findAllByCssSelector('table.euiTable tbody tr.euiTableRow td.euiTableRowCell:first-child')
.getVisibleText();
const tableFields = await (await find.byCssSelector(
'table.euiTable tbody tr.euiTableRow td.euiTableRowCell:first-child'
)).getVisibleText();
await remote.setFindTimeout(defaultFindTimeout)
.findAllByCssSelector(`table.euiTable tbody tr.euiTableRow:nth-child(${tableFields.indexOf(name) + 1})
td:last-child button`)
.click();
await find.clickByCssSelector(
`table.euiTable tbody tr.euiTableRow:nth-child(${tableFields.indexOf(name) + 1})
td:last-child button`
);
}
async increasePopularity() {
@ -319,9 +299,11 @@ export function SettingsPageProvider({ getService, getPageObjects }) {
async clickOptionalAddNewButton() {
const buttonParent = await testSubjects.find('createIndexPatternParent');
const buttonVisible = (await buttonParent.getProperty('innerHTML')).includes('createIndexPatternButton');
const buttonVisible = (await buttonParent.getProperty('innerHTML')).includes(
'createIndexPatternButton'
);
log.debug('found the button ' + buttonVisible);
if(buttonVisible) {
if (buttonVisible) {
await testSubjects.click('createIndexPatternButton');
}
}
@ -403,7 +385,7 @@ export function SettingsPageProvider({ getService, getPageObjects }) {
// Url adds Type, Url Template, and Label Template
// Date adds moment.js format pattern (Default: "MMMM Do YYYY, HH:mm:ss.SSS")
// String adds Transform
switch(format.format) {
switch (format.format) {
case 'url':
await this.setScriptedFieldUrlType(format.type);
await this.setScriptedFieldUrlTemplate(format.template);
@ -442,58 +424,62 @@ export function SettingsPageProvider({ getService, getPageObjects }) {
async setScriptedFieldLanguage(language) {
log.debug('set scripted field language = ' + language);
await remote.setFindTimeout(defaultFindTimeout)
.findByCssSelector('select[data-test-subj="editorFieldLang"] > option[value="' + language + '"]')
.click();
await find.clickByCssSelector(
'select[data-test-subj="editorFieldLang"] > option[value="' + language + '"]'
);
}
async setScriptedFieldType(type) {
log.debug('set scripted field type = ' + type);
await remote.setFindTimeout(defaultFindTimeout)
.findByCssSelector('select[data-test-subj="editorFieldType"] > option[value="' + type + '"]')
.click();
await find.clickByCssSelector(
'select[data-test-subj="editorFieldType"] > option[value="' + type + '"]'
);
}
async setFieldFormat(format) {
log.debug('set scripted field format = ' + format);
await remote.setFindTimeout(defaultFindTimeout)
.findByCssSelector('select[data-test-subj="editorSelectedFormatId"] > option[value="' + format + '"]')
.click();
await find.clickByCssSelector(
'select[data-test-subj="editorSelectedFormatId"] > option[value="' + format + '"]'
);
}
async setScriptedFieldUrlType(type) {
log.debug('set scripted field Url type = ' + type);
await remote.setFindTimeout(defaultFindTimeout)
.findByCssSelector('select[data-test-subj="urlEditorType"] > option[value="' + type + '"]')
.click();
await find.clickByCssSelector(
'select[data-test-subj="urlEditorType"] > option[value="' + type + '"]'
);
}
async setScriptedFieldUrlTemplate(template) {
log.debug('set scripted field Url Template = ' + template);
await remote.setFindTimeout(defaultFindTimeout)
.findByCssSelector('input[data-test-subj="urlEditorUrlTemplate"]')
.type(template);
const urlTemplateField = await find.byCssSelector(
'input[data-test-subj="urlEditorUrlTemplate"]'
);
await urlTemplateField.type(template);
}
async setScriptedFieldUrlLabelTemplate(labelTemplate) {
log.debug('set scripted field Url Label Template = ' + labelTemplate);
await remote.setFindTimeout(defaultFindTimeout)
.findByCssSelector('input[data-test-subj="urlEditorLabelTemplate"]')
.type(labelTemplate);
const urlEditorLabelTemplate = await find.byCssSelector(
'input[data-test-subj="urlEditorLabelTemplate"]'
);
await urlEditorLabelTemplate.type(labelTemplate);
}
async setScriptedFieldDatePattern(datePattern) {
log.debug('set scripted field Date Pattern = ' + datePattern);
await remote.setFindTimeout(defaultFindTimeout)
.findByCssSelector('input[data-test-subj="dateEditorPattern"]')
.clearValue().type(datePattern);
const datePatternField = await find.byCssSelector(
'input[data-test-subj="dateEditorPattern"]'
);
await datePatternField.clearValue();
await datePatternField.type(datePattern);
}
async setScriptedFieldStringTransform(stringTransform) {
log.debug('set scripted field string Transform = ' + stringTransform);
await remote.setFindTimeout(defaultFindTimeout)
.findByCssSelector('select[data-test-subj="stringEditorTransform"] > option[value="' + stringTransform + '"]')
.click();
await find.clickByCssSelector(
'select[data-test-subj="stringEditorTransform"] > option[value="' + stringTransform + '"]'
);
}
async setScriptedFieldPopularity(popularity) {
@ -584,8 +570,9 @@ export function SettingsPageProvider({ getService, getPageObjects }) {
}
async setImportIndexFieldOption(child) {
await find
.clickByCssSelector(`select[data-test-subj="managementChangeIndexSelection"] > option:nth-child(${child})`);
await find.clickByCssSelector(
`select[data-test-subj="managementChangeIndexSelection"] > option:nth-child(${child})`
);
}
async clickChangeIndexConfirmButton() {
@ -606,7 +593,9 @@ export function SettingsPageProvider({ getService, getPageObjects }) {
async waitUntilSavedObjectsTableIsNotLoading() {
return retry.try(async () => {
const exists = await find.existsByDisplayedByCssSelector('*[data-test-subj="savedObjectsTable"] .euiBasicTable-loading');
const exists = await find.existsByDisplayedByCssSelector(
'*[data-test-subj="savedObjectsTable"] .euiBasicTable-loading'
);
if (exists) {
throw new Error('Waiting');
}

View file

@ -140,6 +140,13 @@ export function FindProvider({ getService }) {
});
}
async findDisplayedByLinkText(selector, timeout = defaultFindTimeout) {
log.debug('Find.byLinkText: ' + selector);
return await this._ensureElementWithTimeout(timeout, async remote => {
return await remote.findDisplayedByLinkText(selector);
});
}
async byPartialLinkText(partialLinkText, timeout = defaultFindTimeout) {
log.debug(`find.byPartialLinkText(${partialLinkText})`);
return await this._ensureElementWithTimeout(timeout, async remote => {
@ -222,6 +229,21 @@ export function FindProvider({ getService }) {
await element.click();
});
}
async clickByDisplayedLinkText(linkText, timeout = defaultFindTimeout) {
log.debug(`clickByDisplayedLinkText(${linkText})`);
await retry.try(async () => {
const element = await this.findDisplayedByLinkText(linkText, timeout);
await remote.moveMouseTo(element);
await element.click();
});
}
async clickDisplayedByCssSelector(selector, timeout = defaultFindTimeout) {
await retry.try(async () => {
const element = await this.findDisplayedByCssSelector(selector, timeout);
await remote.moveMouseTo(element);
await element.click();
});
}
}
return new Find();