METRON-1224 Add time range selection to search control (iraghumitra via james-sirota) closes apache/metron#796
Project: http://git-wip-us.apache.org/repos/asf/metron/repo Commit: http://git-wip-us.apache.org/repos/asf/metron/commit/5243366c Tree: http://git-wip-us.apache.org/repos/asf/metron/tree/5243366c Diff: http://git-wip-us.apache.org/repos/asf/metron/diff/5243366c Branch: refs/heads/master Commit: 5243366c48ef8d485af678e7c48b5f34170007b2 Parents: 128d4e7 Author: iraghumitra <[email protected]> Authored: Thu Oct 26 01:04:23 2017 -0700 Committer: jsirota <[email protected]> Committed: Thu Oct 26 01:04:23 2017 -0700 ---------------------------------------------------------------------- .../e2e/alerts-list/alerts-list.e2e-spec.ts | 191 ++++++++++++++++++ .../e2e/alerts-list/alerts-list.po.ts | 138 +++++++++++-- .../configure-table/configure-table.e2e-spec.ts | 22 +++ .../save-search/save-search.e2e-spec.ts | 8 +- .../e2e/mock-data/alerts_ui_e2e_index.data | 20 +- metron-interface/metron-alerts/package.json | 5 +- .../metron-alerts/src/_variables.scss | 23 +++ .../alerts-list/alerts-list.component.html | 3 + .../alerts-list/alerts-list.component.scss | 4 +- .../alerts/alerts-list/alerts-list.component.ts | 45 ++++- .../alerts/alerts-list/alerts-list.module.ts | 3 +- .../src/app/alerts/alerts-list/query-builder.ts | 83 +++++--- .../alerts/save-search/save-search.component.ts | 4 +- .../src/app/model/date-filter-value.ts | 28 +++ .../metron-alerts/src/app/model/filter.ts | 34 +++- .../metron-alerts/src/app/model/save-search.ts | 5 +- .../src/app/service/search.service.ts | 5 +- .../date-picker/date-picker.component.html | 17 ++ .../date-picker/date-picker.component.scss | 31 +++ .../date-picker/date-picker.component.spec.ts | 25 +++ .../shared/date-picker/date-picker.component.ts | 77 ++++++++ .../shared/date-picker/date-picker.module.ts | 15 ++ .../src/app/shared/pipes/map-keys.pipe.spec.ts | 8 + .../src/app/shared/pipes/map-keys.pipe.ts | 12 ++ .../src/app/shared/shared.module.ts | 3 + .../shared/time-range/time-range.component.html | 57 ++++++ .../shared/time-range/time-range.component.scss | 106 ++++++++++ .../time-range/time-range.component.spec.ts | 25 +++ .../shared/time-range/time-range.component.ts | 192 +++++++++++++++++++ .../app/shared/time-range/time-range.module.ts | 16 ++ .../metron-alerts/src/app/utils/constants.ts | 8 +- .../src/app/utils/elasticsearch-utils.ts | 12 ++ .../metron-alerts/src/app/utils/utils.ts | 184 ++++++++++++++++++ metron-interface/metron-alerts/src/styles.scss | 11 +- 34 files changed, 1342 insertions(+), 78 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/metron/blob/5243366c/metron-interface/metron-alerts/e2e/alerts-list/alerts-list.e2e-spec.ts ---------------------------------------------------------------------- diff --git a/metron-interface/metron-alerts/e2e/alerts-list/alerts-list.e2e-spec.ts b/metron-interface/metron-alerts/e2e/alerts-list/alerts-list.e2e-spec.ts index 6b2ffd0..b0574ee 100644 --- a/metron-interface/metron-alerts/e2e/alerts-list/alerts-list.e2e-spec.ts +++ b/metron-interface/metron-alerts/e2e/alerts-list/alerts-list.e2e-spec.ts @@ -147,4 +147,195 @@ describe('metron-alerts App', function() { }); + it('should have all time-range controls', () => { + let quickRanges = [ + 'Last 7 days', 'Last 30 days', 'Last 60 days', 'Last 90 days', 'Last 6 months', 'Last 1 year', 'Last 2 years', 'Last 5 years', + 'Yesterday', 'Day before yesterday', 'This day last week', 'Previous week', 'Previous month', 'Previous year', 'All time', + 'Today', 'Today so far', 'This week', 'This week so far', 'This month', 'This year', + 'Last 5 minutes', 'Last 15 minutes', 'Last 30 minutes', 'Last 1 hour', 'Last 3 hours', 'Last 6 hours', 'Last 12 hours', 'Last 24 hours' + ]; + + page.clickDateSettings(); + expect(page.getTimeRangeTitles()).toEqual(['Time Range', 'Quick Ranges']); + expect(page.getQuickTimeRanges()).toEqual(quickRanges); + expect(page.getValueForManualTimeRange()).toEqual([ 'now', 'now' ]); + expect(page.isManulaTimeRangeApplyButtonPresent()).toEqual(true); + expect(page.getTimeRangeButtonText()).toEqual('All time'); + page.clickDateSettings(); + + }); + + it('should have all time range values populated - 1', () => { + let secInADay = (24 * 60 * 60 * 1000); + + page.clickClearSearch(); + expect(page.getTimeRangeButtonAndSubText()).toEqualBcoz(['All time'], 'for all-time'); + + page.clickDateSettings(); + page.selectQuickTimeRange('Last 7 days'); + expect(page.getTimeRangeButtonAndSubText()).toEqualBcoz(['Last 7 days', String(secInADay * 7)], 'for last 7 days'); + + page.clickDateSettings(); + page.selectQuickTimeRange('Last 30 days'); + expect(page.getTimeRangeButtonAndSubText()).toEqualBcoz(['Last 30 days', String(secInADay * 30)], 'for last 30 days'); + + page.clickDateSettings(); + page.selectQuickTimeRange('Last 60 days'); + expect(page.getTimeRangeButtonAndSubText()).toEqualBcoz(['Last 60 days', String(secInADay * 60)], 'for last 60 days'); + + page.clickDateSettings(); + page.selectQuickTimeRange('Last 90 days'); + expect(page.getTimeRangeButtonAndSubText()).toEqualBcoz(['Last 90 days', String(secInADay * 90)], 'for last 90 days'); + + + page.clickDateSettings(); + page.selectQuickTimeRange('Last 1 year'); + expect(page.getTimeRangeButtonAndSubText()).toEqualBcoz(['Last 1 year', String(secInADay * 365)], 'for last 1 year'); + + page.clickDateSettings(); + page.selectQuickTimeRange('Last 2 years'); + expect(page.getTimeRangeButtonAndSubText()).toEqualBcoz(['Last 2 years', String((secInADay * 365 * 2) + secInADay)], 'for last 2 years'); + + page.clickDateSettings(); + page.selectQuickTimeRange('Last 5 years'); + expect(page.getTimeRangeButtonAndSubText()).toEqualBcoz(['Last 5 years', String((secInADay * 365 * 5) + secInADay)], 'for last 5 years'); + + page.clickClearSearch(); + }); + + it('should have all time range values populated - 2', () => { + let secInADay = (24*60*60*1000); + + page.clickDateSettings(); + page.selectQuickTimeRange('Yesterday'); + expect(page.getTimeRangeButtonAndSubText()).toEqualBcoz([ 'Yesterday', String(secInADay - 1000)], 'yesterday'); + + page.clickDateSettings(); + page.selectQuickTimeRange('Day before yesterday'); + expect(page.getTimeRangeButtonAndSubText()).toEqualBcoz([ 'Day before yesterday', String(secInADay - 1000)], 'day before yesterday'); + + page.clickDateSettings(); + page.selectQuickTimeRange('This day last week'); + expect(page.getTimeRangeButtonAndSubText()).toEqualBcoz([ 'This day last week', String(secInADay - 1000)], 'this day last week'); + + page.clickDateSettings(); + page.selectQuickTimeRange('Previous week'); + expect(page.getTimeRangeButtonAndSubText()).toEqualBcoz([ 'Previous week', String((secInADay * 7) - (1000))], 'for previous week'); + + page.clickClearSearch(); + }); + + it('should have all time range values populated - 3', () => { + let secInADay = (24*60*60*1000); + + page.clickDateSettings(); + page.selectQuickTimeRange('Today'); + expect(page.getTimeRangeButtonAndSubText()).toEqualBcoz([ 'Today', String(secInADay - 1000)], 'for today'); + + page.clickDateSettings(); + page.selectQuickTimeRange('This week'); + expect(page.getTimeRangeButtonAndSubText()).toEqualBcoz([ 'This week', String((secInADay*7) - 1000)], 'for this week'); + + page.clickClearSearch(); + }); + + it('should have all time range values populated - 4', () => { + let secInADay = (24*60*60*1000); + + page.clickDateSettings(); + page.selectQuickTimeRange('Last 5 minutes'); + expect(page.getTimeRangeButtonAndSubText()).toEqualBcoz([ 'Last 5 minutes', String(5 * 60 * 1000)], 'for last 5 minutes'); + + page.clickDateSettings(); + page.selectQuickTimeRange('Last 15 minutes'); + expect(page.getTimeRangeButtonAndSubText()).toEqualBcoz([ 'Last 15 minutes', String(15 * 60 * 1000)], 'for last 15 minutes'); + + page.clickDateSettings(); + page.selectQuickTimeRange('Last 30 minutes'); + expect(page.getTimeRangeButtonAndSubText()).toEqualBcoz([ 'Last 30 minutes', String(30 * 60 * 1000)], 'for last 30 minutes'); + + page.clickDateSettings(); + page.selectQuickTimeRange('Last 1 hour'); + expect(page.getTimeRangeButtonAndSubText()).toEqualBcoz([ 'Last 1 hour', String(60 * 60 * 1000)], 'for last 1 hour'); + + page.clickDateSettings(); + page.selectQuickTimeRange('Last 3 hours'); + expect(page.getTimeRangeButtonAndSubText()).toEqualBcoz([ 'Last 3 hours', String(3 * 60 * 60 * 1000)], 'for last 3 hours'); + + page.clickDateSettings(); + page.selectQuickTimeRange('Last 6 hours'); + expect(page.getTimeRangeButtonAndSubText()).toEqualBcoz([ 'Last 6 hours', String(6 * 60 * 60 * 1000)], 'for last 6 hours'); + + page.clickDateSettings(); + page.selectQuickTimeRange('Last 12 hours'); + expect(page.getTimeRangeButtonAndSubText()).toEqualBcoz([ 'Last 12 hours', String(12 * 60 * 60 * 1000)], 'for last 12 hours'); + + page.clickDateSettings(); + page.selectQuickTimeRange('Last 24 hours'); + expect(page.getTimeRangeButtonAndSubText()).toEqualBcoz([ 'Last 24 hours', String(24 * 60 * 60 * 1000)], 'for last 24 hours'); + + page.clickClearSearch(); + }); + + it('should disable date picker when timestamp is present in search', () => { + page.clickTableText('2017-09-13 18:02:20'); + expect(page.isDateSeettingDisabled()).toEqual(true); + + page.clickClearSearch(); + expect(page.isDateSeettingDisabled()).toEqual(false); + + page.clickTableText('alerts_ui_e2e'); + expect(page.isDateSeettingDisabled()).toEqual(false); + + page.clickClearSearch(); + }); + + it('should have now included when to date is empty', () => { + page.clickDateSettings(); + page.setDate(0, '2017', 'September', '13', '23', '29', '35'); + page.selectTimeRangeApplyButton(); + expect(page.getTimeRangeButtonTextForNow()).toEqual([ 'Date Range', '2017-09-13 23:29:35 to now' ]); + + page.clickClearSearch(); + }); + + it('should have all time-range included while searching', () => { + page.clearLocalStorage(); + page.clickDateSettings(); + + /* Select Last 5years for time range */ + page.selectQuickTimeRange('Last 5 years'); + expect(page.getTimeRangeButtonText()).toEqual('Last 5 years'); + + /* Select custom date for time range */ + page.clickDateSettings(); + page.setDate(0, '2017', 'September', '13', '23', '29', '35'); + page.setDate(1, '2017', 'September', '13', '23', '29', '40'); + page.selectTimeRangeApplyButton(); + expect(page.getChangesAlertTableTitle('Alerts (169)')).toEqual('Alerts (5)'); + + /* Save custom date in saved searches */ + page.saveSearch('e2e-2'); + page.clickSavedSearch(); + expect(page.getRecentSearchOptions()).toContain('timestamp:last-5-years', 'for recent search options'); + expect(page.getSavedSearchOptions()).toEqual(['e2e-2'], + 'for saved search options'); + page.clickCloseSavedSearch(); + + /* Clear Search should should show all rows */ + page.clickClearSearch(); + expect(page.getChangesAlertTableTitle('Alerts (5)')).toEqual('Alerts (169)'); + + /* Load the saved search */ + page.clickSavedSearch(); + page.loadSavedSearch('e2e-2'); + expect(page.getChangesAlertTableTitle('Alerts (169)')).toEqual('Alerts (5)'); + + /* Load recent search */ + page.clickSavedSearch(); + page.loadRecentSearch('last-5-years'); + expect(page.getChangesAlertTableTitle('Alerts (5)')).toEqual('Alerts (169)'); + + }); + }); http://git-wip-us.apache.org/repos/asf/metron/blob/5243366c/metron-interface/metron-alerts/e2e/alerts-list/alerts-list.po.ts ---------------------------------------------------------------------- diff --git a/metron-interface/metron-alerts/e2e/alerts-list/alerts-list.po.ts b/metron-interface/metron-alerts/e2e/alerts-list/alerts-list.po.ts index 7fee303..4a97917 100644 --- a/metron-interface/metron-alerts/e2e/alerts-list/alerts-list.po.ts +++ b/metron-interface/metron-alerts/e2e/alerts-list/alerts-list.po.ts @@ -17,7 +17,7 @@ */ import {browser, element, by, protractor} from 'protractor'; -import {waitForElementVisibility, waitForElementPresence} from '../utils/e2e_util'; +import {waitForElementVisibility, waitForElementPresence, waitForElementInVisibility} from '../utils/e2e_util'; export class MetronAlertsPage { navigateTo() { @@ -124,7 +124,7 @@ export class MetronAlertsPage { } getSettingsLabels() { - return element.all(by.css('form label:not(.switch)')).getText(); + return element.all(by.css('app-configure-rows form label:not(.switch)')).getText(); } getRefreshRateOptions() { @@ -152,12 +152,14 @@ export class MetronAlertsPage { } clickConfigureTable() { - element(by.css('app-alerts-list .fa.fa-cog.configure-table-icon')).click(); + let gearIcon = element(by.css('app-alerts-list .fa.fa-cog.configure-table-icon')); + waitForElementVisibility(gearIcon).then(() => gearIcon.click()); browser.sleep(1000); } clickCloseSavedSearch() { element(by.css('app-saved-searches .close-button')).click(); + browser.sleep(2000); } clickSavedSearch() { @@ -170,7 +172,7 @@ export class MetronAlertsPage { } clickTableText(name: string) { - waitForElementPresence(element.all(by.css('app-table-view tbody tr'))).then(() => element.all(by.linkText(name)).get(0).click()); + waitForElementPresence(element.all(by.css('app-table-view tbody tr a'))).then(() => element.all(by.linkText(name)).get(0).click()); } clickClearSearch() { @@ -195,26 +197,22 @@ export class MetronAlertsPage { getRecentSearchOptions() { browser.sleep(1000); - let map = {}; - let recentSearches = element.all(by.css('app-saved-searches metron-collapse')).get(0); - return recentSearches.all(by.css('a')).getText().then(title => { - return recentSearches.all(by.css('.collapse.show')).getText().then(values => { - map[title] = values; - return map; - }); - }); + return element(by.linkText('Recent Searches')).element(by.xpath('..')).all(by.css('li')).getText(); + } + + getDefaultRecentSearchValue() { + browser.sleep(1000); + return element(by.linkText('Recent Searches')).element(by.xpath('..')).all(by.css('i')).getText(); } getSavedSearchOptions() { browser.sleep(1000); - let map = {}; - let recentSearches = element.all(by.css('app-saved-searches metron-collapse')).get(1); - return recentSearches.all(by.css('a')).getText().then(title => { - return recentSearches.all(by.css('.collapse.show')).getText().then(values => { - map[title] = values; - return map; - }); - }); + return element(by.linkText('Saved Searches')).element(by.xpath('..')).all(by.css('li')).getText(); + } + + getDefaultSavedSearchValue() { + browser.sleep(1000); + return element(by.linkText('Saved Searches')).element(by.xpath('..')).all(by.css('i')).getText(); } getSelectedColumnNames() { @@ -288,8 +286,108 @@ export class MetronAlertsPage { }); } + isDateSeettingDisabled() { + return element.all(by.css('app-time-range button.btn.btn-search[disabled=""]')).count().then((count) => { return (count === 1); }); + } + + clickDateSettings() { + element(by.css('app-time-range button.btn-search')).click(); + browser.sleep(2000); + } + + getTimeRangeTitles() { + return element.all(by.css('app-time-range .title')).getText(); + } + + getQuickTimeRanges() { + return element.all(by.css('app-time-range .quick-ranges span')).getText(); + } + + getValueForManualTimeRange() { + return element.all(by.css('app-time-range input.form-control')). getAttribute('value'); + } + + isManulaTimeRangeApplyButtonPresent() { + return element.all(by.css('app-time-range')).all(by.buttonText('APPLY')).count().then(count => count === 1); + } + + selectQuickTimeRange(quickRange: string) { + element.all(by.cssContainingText('.quick-ranges span', quickRange)).get(0).click(); + browser.sleep(2000); + } + + getTimeRangeButtonText() { + return element.all(by.css('app-time-range button.btn-search span')).get(0).getText(); + } + + setDate(index: number, year: string, month: string, day: string, hour: string, min: string, sec: string) { + element.all(by.css('app-time-range .calendar')).get(index).click() + .then(() => element.all(by.css('.pika-select.pika-select-hour')).get(index).click()) + .then(() => element.all(by.css('.pika-select.pika-select-hour')).get(index).element(by.cssContainingText('option', hour)).click()) + .then(() => element.all(by.css('.pika-select.pika-select-minute')).get(index).click()) + .then(() => element.all(by.css('.pika-select.pika-select-minute')).get(index).element(by.cssContainingText('option', min)).click()) + .then(() => element.all(by.css('.pika-select.pika-select-second')).get(index).click()) + .then(() => element.all(by.css('.pika-select.pika-select-second')).get(index).element(by.cssContainingText('option', sec)).click()) + .then(() => element.all(by.css('.pika-select.pika-select-year')).get(index).click()) + .then(() => element.all(by.css('.pika-select.pika-select-year')).get(index).element(by.cssContainingText('option', year)).click()) + .then(() => element.all(by.css('.pika-select.pika-select-month')).get(index).click()) + .then(() => element.all(by.css('.pika-select.pika-select-month')).get(index).element(by.cssContainingText('option', month)).click()) + .then(() => element.all(by.css('.pika-table')).get(index).element(by.buttonText(day)).click()) + .then(() => waitForElementInVisibility(element.all(by.css('.pika-single')).get(index))); + + browser.sleep(1000); + } + + selectTimeRangeApplyButton() { + return element(by.css('app-time-range')).element(by.buttonText('APPLY')).click(); + } + + getChangesAlertTableTitle(previousText: string) { + // browser.pause(); + let title = element(by.css('.col-form-label-lg')); + return this.waitForTextChange(title, previousText).then(() => { + return title.getText(); + }); + } + getAlertStatusById(id: string) { return element(by.css('a[title="' + id +'"]')) .element(by.xpath('../..')).all(by.css('td a')).get(8).getText(); } + + loadSavedSearch(name: string) { + element.all(by.css('app-saved-searches metron-collapse')).get(1).element(by.css('li[title="'+ name +'"]')).click(); + browser.sleep(1000); + } + + loadRecentSearch(name: string) { + element.all(by.css('app-saved-searches metron-collapse')).get(0).all(by.css('li')).get(2).click(); + browser.sleep(1000); + } + + getTimeRangeButtonTextForNow() { + return element.all(by.css('app-time-range button span')).getText(); + } + + getTimeRangeButtonAndSubText() { + return waitForElementInVisibility(element(by.css('#time-range'))) + .then(() => element.all(by.css('app-time-range button span')).getText()) + .then(arr => { + let retArr = [arr[0]]; + for (let i=1; i < arr.length; i++) { + let dateStr = arr[i].split(' to '); + let fromTime = new Date(dateStr[0]).getTime(); + let toTime = new Date(dateStr[1]).getTime(); + retArr.push((toTime - fromTime) + ''); + } + return retArr; + }); + } + + renameColumn(name: string, value: string) { + element(by.cssContainingText('app-configure-table span', name)) + .element(by.xpath('../..')) + .element(by.css('.input')).sendKeys(value); + } + } http://git-wip-us.apache.org/repos/asf/metron/blob/5243366c/metron-interface/metron-alerts/e2e/alerts-list/configure-table/configure-table.e2e-spec.ts ---------------------------------------------------------------------- diff --git a/metron-interface/metron-alerts/e2e/alerts-list/configure-table/configure-table.e2e-spec.ts b/metron-interface/metron-alerts/e2e/alerts-list/configure-table/configure-table.e2e-spec.ts index 0834960..ddad558 100644 --- a/metron-interface/metron-alerts/e2e/alerts-list/configure-table/configure-table.e2e-spec.ts +++ b/metron-interface/metron-alerts/e2e/alerts-list/configure-table/configure-table.e2e-spec.ts @@ -56,6 +56,28 @@ describe('metron-alerts configure table', function() { page.toggleSelectCol('guid', 'method'); expect(page.getSelectedColumnNames()).toEqualBcoz(newColNamesColumnConfig, 'for guid added to selected column names'); page.saveConfigureColumns(); + }); + + it('should rename columns from table configuration', () => { + page.clearLocalStorage(); + page.navigateTo(); + + page.clickConfigureTable(); + page.renameColumn('enrichments:geo:ip_dst_addr:country', 'Country'); + page.saveConfigureColumns(); + + page.clickTableText('FR'); + expect(page.getSearchText()).toEqual('Country:FR'); + expect(page.getChangesAlertTableTitle('Alerts (169)')).toEqual('Alerts (25)'); + page.clickClearSearch(); + + expect(page.getChangesAlertTableTitle('Alerts (25)')).toEqual('Alerts (169)'); + page.setSearchText('Country:FR'); + expect(page.getChangesAlertTableTitle('Alerts (169)')).toEqual('Alerts (25)'); + page.clickClearSearch(); + + let columnNames = ['Score','id', 'timestamp','source:type','ip_src_addr','Country','ip_dst_addr','host','alert_status','','']; + expect(page.getTableColumnNames()).toEqualBcoz(columnNames, 'for renamed column names for alert list table'); }); http://git-wip-us.apache.org/repos/asf/metron/blob/5243366c/metron-interface/metron-alerts/e2e/alerts-list/save-search/save-search.e2e-spec.ts ---------------------------------------------------------------------- diff --git a/metron-interface/metron-alerts/e2e/alerts-list/save-search/save-search.e2e-spec.ts b/metron-interface/metron-alerts/e2e/alerts-list/save-search/save-search.e2e-spec.ts index b606284..350f11e 100644 --- a/metron-interface/metron-alerts/e2e/alerts-list/save-search/save-search.e2e-spec.ts +++ b/metron-interface/metron-alerts/e2e/alerts-list/save-search/save-search.e2e-spec.ts @@ -47,8 +47,10 @@ describe('metron-alerts Search', function() { page.clickSavedSearch(); expect(page.getSavedSearchTitle()).toEqualBcoz('Searches', 'for saved searches title'); - expect(page.getRecentSearchOptions()).toEqualBcoz({ 'Recent Searches': [ 'No Recent Searches' ] }, 'for recent search options'); - expect(page.getSavedSearchOptions()).toEqualBcoz({ 'Saved Searches': [ 'No Saved Searches' ] }, 'for saved search options'); + expect(page.getRecentSearchOptions()).toEqualBcoz([], 'for recent search options'); + expect(page.getSavedSearchOptions()).toEqualBcoz([], 'for saved search options'); + expect(page.getDefaultRecentSearchValue()).toEqualBcoz([ 'No Recent Searches' ], 'for recent search default value'); + expect(page.getDefaultSavedSearchValue()).toEqualBcoz([ 'No Saved Searches' ], 'for saved search default value'); page.clickCloseSavedSearch(); }); @@ -56,7 +58,7 @@ describe('metron-alerts Search', function() { it('should have all save search controls and they save search should be working', () => { page.saveSearch('e2e-1'); page.clickSavedSearch(); - expect(page.getSavedSearchOptions()).toEqualBcoz({ 'Saved Searches': [ 'e2e-1' ] }, 'for saved search options e2e-1'); + expect(page.getSavedSearchOptions()).toEqualBcoz([ 'e2e-1' ], 'for saved search options e2e-1'); page.clickCloseSavedSearch(); });
