From e48ad46f8adcf680e55facca9987cc1813ec52e1 Mon Sep 17 00:00:00 2001 From: Elena Stoeva <59341489+ElenaStoeva@users.noreply.github.com> Date: Fri, 22 Nov 2024 10:46:09 +0200 Subject: [PATCH] [Index Management FTR] Improve delete indices test (#200941) Closes https://github.com/elastic/kibana/issues/192351 Closes https://github.com/elastic/kibana/issues/200660 Closes https://github.com/elastic/kibana/issues/193599 Closes https://github.com/elastic/kibana/issues/192532 ## Summary This PR improves the IM functional test for indices table. In https://github.com/elastic/kibana/issues/192351, the failure most likely occurred because the webdriver tried to interact with elements that are no longer in the DOM - in this case the index rows and table. To avoid this, we are adding a try-catch for `StaleElementReferenceError` in the `expectIndexIsDeleted` test helper. In https://github.com/elastic/kibana/issues/192351, https://github.com/elastic/kibana/issues/20066, and https://github.com/elastic/kibana/issues/193599, the error most likely was caused because the check if an index row exists was performed before the row element was removed from the DOM, therefore it was incorrectly failing. To fix this, we are adding a retry so that the check is retried in case it fails. --- .../page_objects/index_management_page.ts | 35 ++++++++++++++----- .../management/index_management/indices.ts | 5 ++- 2 files changed, 31 insertions(+), 9 deletions(-) diff --git a/x-pack/test/functional/page_objects/index_management_page.ts b/x-pack/test/functional/page_objects/index_management_page.ts index e5a2604294675..e0e2a555540be 100644 --- a/x-pack/test/functional/page_objects/index_management_page.ts +++ b/x-pack/test/functional/page_objects/index_management_page.ts @@ -221,14 +221,33 @@ export function IndexManagementPageProvider({ getService }: FtrProviderContext) }, async expectIndexIsDeleted(indexName: string) { - const table = await find.byCssSelector('table'); - const rows = await table.findAllByTestSubject('indexTableRow'); - const indexNames: string[] = await Promise.all( - rows.map(async (row) => { - return await (await row.findByTestSubject('indexTableIndexNameLink')).getVisibleText(); - }) - ); - expect(indexNames.includes(indexName)).to.be(false); + try { + const table = await find.byCssSelector('table'); + const rows = await table.findAllByTestSubject('indexTableRow'); + + const indexNames = await Promise.all( + rows.map(async (row) => { + try { + return await ( + await row.findByTestSubject('indexTableIndexNameLink') + ).getVisibleText(); + } catch (error) { + // If the current row is stale, it has already been removed + if (error.name === 'StaleElementReferenceError') return undefined; + throw error; // Rethrow unexpected errors + } + }) + ).then((names) => names.filter((name) => name !== undefined)); + + expect(indexNames.includes(indexName)).to.be(false); + } catch (error) { + if (error.name === 'StaleElementReferenceError') { + // If the table itself is stale, it means all rows have been removed + return; // Pass the test since the table is gone + } else { + throw error; // Rethrow unexpected errors + } + } }, async manageIndex(indexName: string) { const id = `checkboxSelectIndex-${indexName}`; diff --git a/x-pack/test_serverless/functional/test_suites/common/management/index_management/indices.ts b/x-pack/test_serverless/functional/test_suites/common/management/index_management/indices.ts index 0d8f091123627..a88d1977a0abb 100644 --- a/x-pack/test_serverless/functional/test_suites/common/management/index_management/indices.ts +++ b/x-pack/test_serverless/functional/test_suites/common/management/index_management/indices.ts @@ -15,6 +15,7 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => { const esDeleteAllIndices = getService('esDeleteAllIndices'); const testIndexName = `index-ftr-test-${Math.random()}`; const es = getService('es'); + const retry = getService('retry'); describe('Indices', function () { this.tags(['skipSvlSearch']); @@ -73,7 +74,9 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => { }); it('can delete index', async () => { await pageObjects.indexManagement.confirmDeleteModalIsVisible(); - await pageObjects.indexManagement.expectIndexIsDeleted(testIndexName); + await retry.try(async () => { + await pageObjects.indexManagement.expectIndexIsDeleted(testIndexName); + }); }); }); });