Stabilize flaky visualize test (#27470)

* Stabilize flaky visualize test

- don’t wait for header unnecessarily.  - use clickWhenNotDisabled instead of click. - use an outer retry to account for stale elements from pie chart likely not editing render complete correctly

* More fixes

- fix interval selection so it doesn’t accidentally click Go.  - fix legit bug with non existent _source field being used in a test. - Don’t “click Go” when not needed.

* Clean up

- can’t run pie chart tests multiple times in a row.  - remove more unnecessary clickGos
This commit is contained in:
Stacey Gammon 2018-12-20 17:04:15 -05:00 committed by GitHub
parent 66b3e48c6c
commit fd28ce3eae
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
11 changed files with 23 additions and 45 deletions

View file

@ -152,9 +152,6 @@ export default function ({ getService, getPageObjects }) {
await PageObjects.visualize.clickMapZoomIn();
await PageObjects.visualize.clickMapZoomIn();
await PageObjects.visualize.clickGo();
await PageObjects.header.waitUntilLoadingHasFinished();
await PageObjects.visualize.saveVisualizationExpectSuccess('Visualization TileMap');
await PageObjects.header.clickDashboard();

View file

@ -186,7 +186,7 @@ export default function ({ getService, getPageObjects }) {
await PageObjects.header.setAbsoluteRange(fromTime, toTime);
await PageObjects.visualize.clickMetricEditor();
await PageObjects.visualize.selectAggregation('Top Hit', 'metrics');
await PageObjects.visualize.selectField('_source', 'metrics');
await PageObjects.visualize.selectField('agent.raw', 'metrics');
await PageObjects.visualize.clickGo();
const data = await PageObjects.visualize.getTableVisData();
log.debug(data);

View file

@ -123,7 +123,6 @@ export default function ({ getService, getPageObjects }) {
await PageObjects.visualize.selectField('@timestamp');
await PageObjects.visualize.setInterval('Daily');
await PageObjects.visualize.clickGo();
await PageObjects.header.waitUntilLoadingHasFinished();
const data = await PageObjects.visualize.getTableVisData();
log.debug(data.split('\n'));
expect(data.trim().split('\n')).to.be.eql([
@ -142,7 +141,6 @@ export default function ({ getService, getPageObjects }) {
await PageObjects.visualize.selectField('@timestamp');
await PageObjects.visualize.setInterval('Daily');
await PageObjects.visualize.clickGo();
await PageObjects.header.waitUntilLoadingHasFinished();
const data = await PageObjects.visualize.getTableVisData();
expect(data.trim().split('\n')).to.be.eql([
'2015-09-20', '4,757',

View file

@ -40,7 +40,6 @@ export default function ({ getService, getPageObjects }) {
await comboBox.set('indexPatternSelect-0', 'logstash- ');
await comboBox.set('fieldSelect-0', FIELD_NAME);
await PageObjects.visualize.clickGo();
await PageObjects.header.waitUntilLoadingHasFinished();
});
@ -128,16 +127,12 @@ export default function ({ getService, getPageObjects }) {
await PageObjects.visualize.clickVisEditorTab('options');
await PageObjects.visualize.checkCheckbox('inputControlEditorUpdateFiltersOnChangeCheckbox');
await PageObjects.visualize.clickGo();
await PageObjects.header.waitUntilLoadingHasFinished();
});
after(async () => {
await PageObjects.visualize.clickVisEditorTab('options');
await PageObjects.visualize.uncheckCheckbox('inputControlEditorUpdateFiltersOnChangeCheckbox');
await PageObjects.visualize.clickGo();
await PageObjects.header.waitUntilLoadingHasFinished();
});
it('should not display staging control buttons', async () => {
@ -165,7 +160,6 @@ export default function ({ getService, getPageObjects }) {
await PageObjects.visualize.clickVisEditorTab('options');
await PageObjects.visualize.checkCheckbox('inputControlEditorUseTimeFilterCheckbox');
await PageObjects.visualize.clickGo();
await PageObjects.header.waitUntilLoadingHasFinished();
// Expect control to be disabled because no terms could be gathered with time filter applied
const input = await find.byCssSelector('[data-test-subj="inputControl0"] input');
@ -194,7 +188,6 @@ export default function ({ getService, getPageObjects }) {
await comboBox.set('fieldSelect-0', 'geo.src');
await PageObjects.visualize.clickGo();
await PageObjects.header.waitUntilLoadingHasFinished();
});
it('should fetch new options when string field is filtered', async () => {
@ -211,7 +204,6 @@ export default function ({ getService, getPageObjects }) {
it('should not fetch new options when non-string is filtered', async () => {
await comboBox.set('fieldSelect-0', 'clientip');
await PageObjects.visualize.clickGo();
await PageObjects.header.waitUntilLoadingHasFinished();
const initialOptions = await comboBox.getOptionsList('listControlSelect0');
expect(initialOptions.trim().split('\n').join()).to.equal(
@ -242,7 +234,6 @@ export default function ({ getService, getPageObjects }) {
await PageObjects.visualize.setSelectByOptionText('parentSelect-1', 'geo.src');
await PageObjects.visualize.clickGo();
await PageObjects.header.waitUntilLoadingHasFinished();
});
it('should disable child control when parent control is not set', async () => {

View file

@ -24,7 +24,7 @@ export default function ({ getService, getPageObjects }) {
const filterBar = getService('filterBar');
const PageObjects = getPageObjects(['common', 'visualize', 'header']);
describe('visualize app', function describeIndexTests() {
describe('inspector', function describeIndexTests() {
before(async function () {
const fromTime = '2015-09-19 06:31:44.000';
const toTime = '2015-09-23 18:31:44.000';
@ -35,8 +35,6 @@ export default function ({ getService, getPageObjects }) {
log.debug('Set absolute time range from \"' + fromTime + '\" to \"' + toTime + '\"');
await PageObjects.header.setAbsoluteRange(fromTime, toTime);
await PageObjects.visualize.clickGo();
await PageObjects.header.waitUntilLoadingHasFinished();
});
describe('inspector table', function indexPatternCreation() {

View file

@ -108,7 +108,6 @@ export default function ({ getService, getPageObjects }) {
await PageObjects.visualize.toggleMissingBucket();
log.debug('clickGo');
await PageObjects.visualize.clickGo();
await PageObjects.common.sleep(1003);
const pieData = await PageObjects.visualize.getPieChartLabels();
log.debug(`pieData.length = ${pieData.length}`);
expect(pieData).to.eql(expectedTableData);
@ -177,7 +176,6 @@ export default function ({ getService, getPageObjects }) {
await PageObjects.visualize.selectField('machine.os.raw');
await PageObjects.visualize.toggleDisabledAgg(2);
await PageObjects.visualize.clickGo();
await PageObjects.header.waitUntilLoadingHasFinished();
const pieData = await PageObjects.visualize.getPieChartLabels();
log.debug('pieData.length = ' + pieData.length);
@ -202,8 +200,6 @@ export default function ({ getService, getPageObjects }) {
it('should show correct result when agg is re-enabled', async () => {
await PageObjects.visualize.toggleDisabledAgg(2);
await PageObjects.visualize.clickGo();
await PageObjects.header.waitUntilLoadingHasFinished();
await PageObjects.common.sleep(2000);
const expectedTableData = [
'0', 'win 7', 'win xp', 'win 8', 'ios', 'osx', '40,000', 'win 8', 'ios', 'win 7', 'win xp', 'osx', '80,000',

View file

@ -51,7 +51,6 @@ export default function ({ getService, getPageObjects }) {
});
await PageObjects.visualize.selectOrderBy('_key');
await PageObjects.visualize.clickGo();
await PageObjects.header.waitUntilLoadingHasFinished();
});

View file

@ -80,7 +80,6 @@ export default function ({ getService, getPageObjects }) {
await PageObjects.visualize.selectField('geo.coordinates');
});
await PageObjects.visualize.clickGo();
await PageObjects.header.waitUntilLoadingHasFinished();
});
/**
@ -206,7 +205,6 @@ export default function ({ getService, getPageObjects }) {
await PageObjects.visualize.toggleOpenEditor(2);
await PageObjects.visualize.toggleIsFilteredByCollarCheckbox();
await PageObjects.visualize.clickGo();
await PageObjects.header.waitUntilLoadingHasFinished();
await PageObjects.visualize.openInspector();
const tableHeaders = await PageObjects.visualize.getInspectorTableHeaders();
await PageObjects.visualize.closeInspector();
@ -216,7 +214,6 @@ export default function ({ getService, getPageObjects }) {
after(async () => {
await PageObjects.visualize.toggleIsFilteredByCollarCheckbox();
await PageObjects.visualize.clickGo();
await PageObjects.header.waitUntilLoadingHasFinished();
});
});
});

View file

@ -399,7 +399,7 @@ export function VisualizePageProvider({ getService, getPageObjects }) {
await find.clickByCssSelector(selector);
const input = await find.byCssSelector(`${selector} input.ui-select-search`);
await input.type(myString);
await browser.pressKeys('\uE006');
await browser.pressKeys(Keys.RETURN);
});
await PageObjects.common.sleep(500);
}
@ -499,20 +499,16 @@ export function VisualizePageProvider({ getService, getPageObjects }) {
}
async selectField(fieldValue, groupName = 'buckets', childAggregationType = null) {
log.debug(`selectField ${fieldValue}`);
const selector = `
[group-name="${groupName}"]
vis-editor-agg-params:not(.ng-hide)
${childAggregationType ? `vis-editor-agg-params[group-name="'${childAggregationType}'"]:not(.ng-hide)` : ''}
.field-select
`;
await retry.try(async () => {
await find.clickByCssSelector(selector);
const input = await find.byCssSelector(`${selector} input.ui-select-search`);
await input.type(fieldValue);
await browser.pressKeys('\uE006');
});
await PageObjects.common.sleep(500);
await find.clickByCssSelector(selector);
await find.setValue(`${selector} input.ui-select-search`, fieldValue);
await browser.pressKeys(Keys.RETURN);
}
async selectFieldById(fieldValue, id) {
@ -543,9 +539,14 @@ export function VisualizePageProvider({ getService, getPageObjects }) {
}
async setInterval(newValue) {
log.debug(`Visualize.setInterval(${newValue})`);
const input = await find.byCssSelector('select[ng-model="agg.params.interval"]');
await input.type(newValue);
await browser.pressKeys(Keys.RETURN);
// The interval element will only interpret space as "select this" if there
// was a long enough gap from the typing above to the space click. Hence the
// need for the sleep.
await PageObjects.common.sleep(500);
await browser.pressKeys(Keys.SPACE);
}
async setCustomInterval(newValue) {
@ -594,7 +595,7 @@ export function VisualizePageProvider({ getService, getPageObjects }) {
}
async clickGo() {
await testSubjects.click('visualizeEditorRenderButton');
await testSubjects.clickWhenNotDisabled('visualizeEditorRenderButton');
await PageObjects.header.waitUntilLoadingHasFinished();
// For some reason there are two `data-render-complete` tags on each visualization in the visualize page.
const countOfDataCompleteFlags = 2;
@ -886,10 +887,15 @@ export function VisualizePageProvider({ getService, getPageObjects }) {
}
async getPieChartLabels() {
const chartTypes = await find.allByCssSelector('path.slice', defaultFindTimeout * 2);
// Outer retry is because because of stale element references getting thrown on grabbing the data-label.
// I suspect it's due to a rendering bug with pie charts not emitting the render-complete flag
// when actually done rendering.
return await retry.try(async () => {
const chartTypes = await find.allByCssSelector('path.slice', defaultFindTimeout * 2);
const getChartTypesPromises = chartTypes.map(async chart => await chart.getAttribute('data-label'));
return await Promise.all(getChartTypesPromises);
const getChartTypesPromises = chartTypes.map(async chart => await chart.getAttribute('data-label'));
return await Promise.all(getChartTypesPromises);
});
}
async expectPieChartError() {
return await testSubjects.existOrFail('visLibVisualizeError');

View file

@ -109,6 +109,7 @@ export function FindProvider({ getService }) {
}
async setValue(selector, text) {
log.debug(`find.setValue(${selector}, ${text})`);
return await retry.try(async () => {
const element = await this.byCssSelector(selector);
await element.click();

View file

@ -98,12 +98,9 @@ export default function ({ getService, getPageObjects }) {
await PageObjects.visualize.clickNewSearch();
log.debug('Set absolute time range from \"' + fromTime + '\" to \"' + toTime + '\"');
await PageObjects.header.setAbsoluteRange(fromTime, toTime);
await PageObjects.visualize.clickGo();
await PageObjects.header.waitUntilLoadingHasFinished();
await PageObjects.visualize.waitForVisualization();
await PageObjects.visualize.saveVisualizationExpectSuccess(vizName1);
await PageObjects.security.logout();
});
it('rbac read only role can not save a visualization', async function () {
@ -120,8 +117,6 @@ export default function ({ getService, getPageObjects }) {
await PageObjects.visualize.clickNewSearch();
log.debug('Set absolute time range from \"' + fromTime + '\" to \"' + toTime + '\"');
await PageObjects.header.setAbsoluteRange(fromTime, toTime);
await PageObjects.visualize.clickGo();
await PageObjects.header.waitUntilLoadingHasFinished();
await PageObjects.visualize.waitForVisualization();
await PageObjects.visualize.saveVisualizationExpectFail(vizName1);
await PageObjects.security.logout();