From eefc268eae2961186a84dc396921326549ea4822 Mon Sep 17 00:00:00 2001 From: Evgeny Anatskiy Date: Wed, 23 Aug 2017 13:46:54 +0200 Subject: [PATCH 01/10] add the first test: history grid --- .../test_published_history_grid.py | 74 +++++++++++++++++++ 1 file changed, 74 insertions(+) create mode 100644 test/selenium_tests/test_published_history_grid.py diff --git a/test/selenium_tests/test_published_history_grid.py b/test/selenium_tests/test_published_history_grid.py new file mode 100644 index 00000000000..562da9f60fc --- /dev/null +++ b/test/selenium_tests/test_published_history_grid.py @@ -0,0 +1,74 @@ +import requests + +from .framework import SeleniumTestCase, selenium_test + + +class HistoryGridTestCase(SeleniumTestCase): + + # @selenium_test + # def test_history_grid_accessible(self): + # full_url = self.build_url('histories/list_published') + # response = requests.get(full_url) + # assert response.status_code == 200 + + @selenium_test + def test_history_grid_histories(self): + self.setup_user_and_histories() + self.navigate_to_published_histories_page() + + # Get Histories + histories = [] + grid = self.wait_for_selector('#grid-table-body') + for row in grid.find_elements_by_tag_name('tr'): + cell = row.find_elements_by_tag_name('td')[0] # Name + histories.append(cell.text) + + assert histories == ['Second', 'First'] + + def setup_user_and_histories(self): + self.register() + self.create_and_publish_history('First') + self.create_and_publish_history('Second') + + def create_and_publish_history(self, name): + self.click_history_options() # Open history options menu + + create_history_link = self.driver.find_element_by_link_text( + 'Create New') + create_history_link.click() + + # Rename the history + editable_text_input_element = self.click_to_rename_history() + editable_text_input_element.send_keys(name) + self.send_enter(editable_text_input_element) + self.publish_current_history() + + def publish_current_history(self): + self.navigate_to_history_publish_page() + with self.main_panel(): + selector = 'input[name="make_accessible_and_publish"]' + publish_button = self.wait_for_selector(selector) + publish_button.click() + + def navigate_to_history_publish_page(self): + # self.click_history_option('Share or Publish') # doesn't work! + + self.click_history_options() # Open history options menu + # publish_link = self.wait_for_selector('a[href^="/history/sharing"]') + publish_link = self.driver.find_element_by_link_text('Share or Publish') + publish_link.click() + + def navigate_to_published_histories_page(self): + self.click_masthead_user() # Open masthead menu + self.click_label( + self.navigation_data['labels']['masthead']['menus']['libraries']) + selector = 'a[href="/histories/list_published"]' + histories_link = self.wait_for_selector(selector) + histories_link.click() + + def click_to_rename_history(self): + self.history_panel_name_element().click() + return self.wait_for_selector(self.edit_title_input_selector()) + + def edit_title_input_selector(self): + return self.test_data['historyPanel']['selectors']['history']['nameEditableTextInput'] From b664f26aa0d7a3ad151f236ba569efecb09a5526 Mon Sep 17 00:00:00 2001 From: Evgeny Anatskiy Date: Wed, 23 Aug 2017 20:28:26 +0200 Subject: [PATCH 02/10] add standard search test --- .../test_published_history_grid.py | 83 ++++++++++++++----- 1 file changed, 61 insertions(+), 22 deletions(-) diff --git a/test/selenium_tests/test_published_history_grid.py b/test/selenium_tests/test_published_history_grid.py index 562da9f60fc..d1c9cf996bc 100644 --- a/test/selenium_tests/test_published_history_grid.py +++ b/test/selenium_tests/test_published_history_grid.py @@ -1,9 +1,16 @@ +import time + import requests from .framework import SeleniumTestCase, selenium_test class HistoryGridTestCase(SeleniumTestCase): + _user1_email = None + _user2_email = None + + # def setUp(self): + # super(HistoryGridTestCase, self).setUp() # @selenium_test # def test_history_grid_accessible(self): @@ -13,29 +20,60 @@ class HistoryGridTestCase(SeleniumTestCase): @selenium_test def test_history_grid_histories(self): - self.setup_user_and_histories() + self.setup_users_and_histories() + self.navigate_to_published_histories_page() + histories = self.get_histories_names() + assert histories == ['Second', 'First'] + + @selenium_test + def test_history_grid_standard_search(self): self.navigate_to_published_histories_page() - # Get Histories - histories = [] + input_selector = '#input-free-text-search-filter' + search_input = self.wait_for_selector(input_selector) + search_input.send_keys('first') + self.send_enter(search_input) + time.sleep(1) # search delay + + histories = self.get_histories_names() + assert histories == ['First'] + + # @selenium_test + # def test_history_grid_advanced_search(self): + # pass + + # @selenium_test + # def test_history_grid_sort_by_name(self): + # pass + + # @selenium_test + # def test_history_grid_sort_by_owner(self): + # pass + + # @selenium_test + # def test_history_grid_sort_by_rating(self): + # pass + + def get_histories_names(self): + names = [] grid = self.wait_for_selector('#grid-table-body') for row in grid.find_elements_by_tag_name('tr'): cell = row.find_elements_by_tag_name('td')[0] # Name - histories.append(cell.text) + names.append(cell.text) + return names - assert histories == ['Second', 'First'] - - def setup_user_and_histories(self): - self.register() + def setup_users_and_histories(self): + self._user1_email = self._get_random_email() + self.register(self._user1_email) self.create_and_publish_history('First') + self.logout_if_needed() + + self._user2_email = self._get_random_email() + self.register(self._user2_email) self.create_and_publish_history('Second') def create_and_publish_history(self, name): - self.click_history_options() # Open history options menu - - create_history_link = self.driver.find_element_by_link_text( - 'Create New') - create_history_link.click() + self.click_history_option('Create New') # Rename the history editable_text_input_element = self.click_to_rename_history() @@ -44,21 +82,14 @@ class HistoryGridTestCase(SeleniumTestCase): self.publish_current_history() def publish_current_history(self): - self.navigate_to_history_publish_page() + self.click_history_option('Share or Publish') with self.main_panel(): selector = 'input[name="make_accessible_and_publish"]' publish_button = self.wait_for_selector(selector) publish_button.click() - def navigate_to_history_publish_page(self): - # self.click_history_option('Share or Publish') # doesn't work! - - self.click_history_options() # Open history options menu - # publish_link = self.wait_for_selector('a[href^="/history/sharing"]') - publish_link = self.driver.find_element_by_link_text('Share or Publish') - publish_link.click() - def navigate_to_published_histories_page(self): + self.home() self.click_masthead_user() # Open masthead menu self.click_label( self.navigation_data['labels']['masthead']['menus']['libraries']) @@ -66,6 +97,14 @@ class HistoryGridTestCase(SeleniumTestCase): histories_link = self.wait_for_selector(selector) histories_link.click() + def click_history_option(self, option_label): + self.home() + self.click_history_options() # Open history menu + + # Click labelled option + menu_option = self.driver.find_element_by_link_text(option_label) + menu_option.click() + def click_to_rename_history(self): self.history_panel_name_element().click() return self.wait_for_selector(self.edit_title_input_selector()) From 0e1cbc09f8a604c1b45127faf30170ba1b67bb1b Mon Sep 17 00:00:00 2001 From: Evgeny Anatskiy Date: Wed, 23 Aug 2017 21:11:22 +0200 Subject: [PATCH 03/10] add 'sort by name/owner' tests --- .../test_published_history_grid.py | 59 +++++++++++-------- 1 file changed, 33 insertions(+), 26 deletions(-) diff --git a/test/selenium_tests/test_published_history_grid.py b/test/selenium_tests/test_published_history_grid.py index d1c9cf996bc..65cd6f9764f 100644 --- a/test/selenium_tests/test_published_history_grid.py +++ b/test/selenium_tests/test_published_history_grid.py @@ -1,13 +1,17 @@ import time -import requests +# import requests from .framework import SeleniumTestCase, selenium_test +# Test case data +USER1_EMAIL = 'test_user1@test.test' +USER2_EMAIL = 'test_user2@test.test' +HISTORY1_NAME = 'First' +HISTORY2_NAME = 'Second' + class HistoryGridTestCase(SeleniumTestCase): - _user1_email = None - _user2_email = None # def setUp(self): # super(HistoryGridTestCase, self).setUp() @@ -22,8 +26,8 @@ class HistoryGridTestCase(SeleniumTestCase): def test_history_grid_histories(self): self.setup_users_and_histories() self.navigate_to_published_histories_page() - histories = self.get_histories_names() - assert histories == ['Second', 'First'] + histories = self.get_histories() + assert histories == [HISTORY2_NAME, HISTORY1_NAME] @selenium_test def test_history_grid_standard_search(self): @@ -31,46 +35,49 @@ class HistoryGridTestCase(SeleniumTestCase): input_selector = '#input-free-text-search-filter' search_input = self.wait_for_selector(input_selector) - search_input.send_keys('first') + search_input.send_keys(HISTORY1_NAME) self.send_enter(search_input) - time.sleep(1) # search delay - histories = self.get_histories_names() - assert histories == ['First'] + histories = self.get_histories() + assert histories == [HISTORY1_NAME] # @selenium_test # def test_history_grid_advanced_search(self): # pass - # @selenium_test - # def test_history_grid_sort_by_name(self): - # pass + @selenium_test + def test_history_grid_sort_by_name(self): + self.navigate_to_published_histories_page() + sort_link = self.wait_for_selector('th#name-header > a') + sort_link.click() + histories = self.get_histories() + assert histories == [HISTORY1_NAME, HISTORY2_NAME] - # @selenium_test - # def test_history_grid_sort_by_owner(self): - # pass + @selenium_test + def test_history_grid_sort_by_owner(self): + self.navigate_to_published_histories_page() + sort_link = self.wait_for_selector('th#username-header > a') + sort_link.click() + histories = self.get_histories() + assert histories == [HISTORY1_NAME, HISTORY2_NAME] - # @selenium_test - # def test_history_grid_sort_by_rating(self): - # pass + def get_histories(self): + time.sleep(1) - def get_histories_names(self): names = [] grid = self.wait_for_selector('#grid-table-body') for row in grid.find_elements_by_tag_name('tr'): cell = row.find_elements_by_tag_name('td')[0] # Name names.append(cell.text) + return names def setup_users_and_histories(self): - self._user1_email = self._get_random_email() - self.register(self._user1_email) - self.create_and_publish_history('First') + self.register(USER1_EMAIL) + self.create_and_publish_history(HISTORY1_NAME) self.logout_if_needed() - - self._user2_email = self._get_random_email() - self.register(self._user2_email) - self.create_and_publish_history('Second') + self.register(USER2_EMAIL) + self.create_and_publish_history(HISTORY2_NAME) def create_and_publish_history(self, name): self.click_history_option('Create New') From 72195e14baa5e5f3131f2364858e71c4e4fb960c Mon Sep 17 00:00:00 2001 From: Evgeny Anatskiy Date: Fri, 25 Aug 2017 22:51:58 +0200 Subject: [PATCH 04/10] [WIP]: add advanced search tests --- .../test_published_history_grid.py | 145 +++++++++++++++--- 1 file changed, 124 insertions(+), 21 deletions(-) diff --git a/test/selenium_tests/test_published_history_grid.py b/test/selenium_tests/test_published_history_grid.py index 65cd6f9764f..7c9c4b84e61 100644 --- a/test/selenium_tests/test_published_history_grid.py +++ b/test/selenium_tests/test_published_history_grid.py @@ -9,13 +9,14 @@ USER1_EMAIL = 'test_user1@test.test' USER2_EMAIL = 'test_user2@test.test' HISTORY1_NAME = 'First' HISTORY2_NAME = 'Second' +HISTORY3_NAME = 'Third' +HISTORY1_TAGS = ['tag1', 'tag2'] +HISTORY2_TAGS = ['tag3'] +HISTORY3_ANNOT = 'some description' class HistoryGridTestCase(SeleniumTestCase): - # def setUp(self): - # super(HistoryGridTestCase, self).setUp() - # @selenium_test # def test_history_grid_accessible(self): # full_url = self.build_url('histories/list_published') @@ -27,10 +28,10 @@ class HistoryGridTestCase(SeleniumTestCase): self.setup_users_and_histories() self.navigate_to_published_histories_page() histories = self.get_histories() - assert histories == [HISTORY2_NAME, HISTORY1_NAME] + assert histories == [HISTORY2_NAME, HISTORY3_NAME, HISTORY1_NAME] @selenium_test - def test_history_grid_standard_search(self): + def test_history_grid_search_standard(self): self.navigate_to_published_histories_page() input_selector = '#input-free-text-search-filter' @@ -41,9 +42,44 @@ class HistoryGridTestCase(SeleniumTestCase): histories = self.get_histories() assert histories == [HISTORY1_NAME] - # @selenium_test - # def test_history_grid_advanced_search(self): - # pass + @selenium_test + def test_history_grid_search_advanced(self): + self.navigate_to_published_histories_page() + + advanced_search_selector = '#standard-search .advanced-search-toggle' + advanced_search_link = self.wait_for_selector(advanced_search_selector) + advanced_search_link.click() + + name_filter_selector = '#input-name-filter' + annot_filter_selector = '#input-annotation-filter' + owner_filter_selector = '#input-username-filter' + tags_filter_selector = '#input-tags-filter' + + # Search by name + self.set_filter(name_filter_selector, HISTORY1_NAME) + histories = self.get_histories() + assert histories == [HISTORY1_NAME] + self.unset_filter('name', HISTORY1_NAME) + + # TODO: Search by annotation + # annotation = HISTORY3_ANNOT.split(' ')[0] + # self.set_filter(annot_filter_selector, annotation) + # histories = self.get_histories() + # assert histories == [HISTORY3_NAME] + # self.unset_filter('annotation', annotation) + + # Search by owner + owner = USER2_EMAIL.split('@')[0] + self.set_filter(owner_filter_selector, owner) + histories = self.get_histories() + assert histories == [HISTORY2_NAME] + self.unset_filter('username', owner) + + # Search by tags + self.set_filter(tags_filter_selector, HISTORY1_TAGS[0]) + histories = self.get_histories() + assert histories == [HISTORY1_NAME] + self.unset_filter('tags', HISTORY1_TAGS[0]) @selenium_test def test_history_grid_sort_by_name(self): @@ -51,7 +87,7 @@ class HistoryGridTestCase(SeleniumTestCase): sort_link = self.wait_for_selector('th#name-header > a') sort_link.click() histories = self.get_histories() - assert histories == [HISTORY1_NAME, HISTORY2_NAME] + assert histories == [HISTORY1_NAME, HISTORY2_NAME, HISTORY3_NAME] @selenium_test def test_history_grid_sort_by_owner(self): @@ -59,10 +95,10 @@ class HistoryGridTestCase(SeleniumTestCase): sort_link = self.wait_for_selector('th#username-header > a') sort_link.click() histories = self.get_histories() - assert histories == [HISTORY1_NAME, HISTORY2_NAME] + assert histories == [HISTORY1_NAME, HISTORY3_NAME, HISTORY2_NAME] def get_histories(self): - time.sleep(1) + time.sleep(1.5) names = [] grid = self.wait_for_selector('#grid-table-body') @@ -72,21 +108,89 @@ class HistoryGridTestCase(SeleniumTestCase): return names + def set_filter(self, selector, value): + filter_input = self.wait_for_selector(selector) + time.sleep(.5) + filter_input.click() + filter_input.send_keys(value) + self.send_enter(filter_input) + + def unset_filter(self, filter_key, filter_value): + close_link_selector = 'a[filter_key="%s"][filter_val="%s"]' % \ + (filter_key, filter_value) + close_link = self.wait_for_selector(close_link_selector) + close_link.click() + time.sleep(.5) + + def set_tags(self, tags): + tag_icon_selector = self.test_data['historyPanel']['selectors'] \ + ['history']['tagIcon'] + tag_area_selector = self.test_data['historyPanel']['selectors'] \ + ['history']['tagArea'] + + tag_area = self.driver.find_element_by_css_selector(tag_area_selector) + if not tag_area.is_displayed(): + tag_icon = self.wait_for_selector(tag_icon_selector) + tag_icon.click() + time.sleep(.5) + + tag_area_selector += ' .tags-input input' + tag_area = self.wait_for_selector(tag_area_selector) + tag_area.click() + + for tag in tags: + tag_area.send_keys(tag) + self.send_enter(tag_area) + time.sleep(.5) + + def set_annotation(self, annotation): + anno_icon_selector = self.test_data['historyPanel']['selectors'] \ + ['history']['annoIcon'] + anno_area_selector = self.test_data['historyPanel']['selectors'] \ + ['history']['annoArea'] + + annon_icon = self.wait_for_selector(anno_icon_selector) + annon_icon.click() + + annon_area = self.wait_for_selector(anno_area_selector) + + # TODO: complete the function + + # annon_area.click() + + # anno_area_editable_selector = anno_area_selector + ' textarea' + # # anno_done_button_selector = anno_area_selector + ' button' + # annon_area_editable = self.wait_for_selector( + # anno_area_editable_selector) + # # anno_done_button = self.wait_for_selector(anno_done_button_selector) + + # annon_area_editable.click() + # annon_area_editable.send_keys('some annotation') + # # anno_done_button.click() + def setup_users_and_histories(self): self.register(USER1_EMAIL) - self.create_and_publish_history(HISTORY1_NAME) - self.logout_if_needed() - self.register(USER2_EMAIL) - self.create_and_publish_history(HISTORY2_NAME) + self.create_history(HISTORY1_NAME) + self.set_tags(HISTORY1_TAGS) + self.publish_current_history() - def create_and_publish_history(self, name): + self.create_history(HISTORY3_NAME) + # self.set_annotation(HISTORY3_ANNOT) + self.publish_current_history() + self.logout_if_needed() + + self.register(USER2_EMAIL) + self.create_history(HISTORY2_NAME) + self.set_tags(HISTORY2_TAGS) + self.publish_current_history() + + def create_history(self, name): self.click_history_option('Create New') # Rename the history editable_text_input_element = self.click_to_rename_history() editable_text_input_element.send_keys(name) self.send_enter(editable_text_input_element) - self.publish_current_history() def publish_current_history(self): self.click_history_option('Share or Publish') @@ -114,7 +218,6 @@ class HistoryGridTestCase(SeleniumTestCase): def click_to_rename_history(self): self.history_panel_name_element().click() - return self.wait_for_selector(self.edit_title_input_selector()) - - def edit_title_input_selector(self): - return self.test_data['historyPanel']['selectors']['history']['nameEditableTextInput'] + edit_title_input_selector = self.test_data['historyPanel'] \ + ['selectors']['history']['nameEditableTextInput'] + return self.wait_for_selector(edit_title_input_selector) From 2403916c7b6a29810e74cb3485d3634ef904dde6 Mon Sep 17 00:00:00 2001 From: Evgeny Anatskiy Date: Sat, 26 Aug 2017 13:17:05 +0200 Subject: [PATCH 05/10] test clicking tags --- .../test_published_history_grid.py | 26 ++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-) diff --git a/test/selenium_tests/test_published_history_grid.py b/test/selenium_tests/test_published_history_grid.py index 7c9c4b84e61..ac1037804d2 100644 --- a/test/selenium_tests/test_published_history_grid.py +++ b/test/selenium_tests/test_published_history_grid.py @@ -12,6 +12,7 @@ HISTORY2_NAME = 'Second' HISTORY3_NAME = 'Third' HISTORY1_TAGS = ['tag1', 'tag2'] HISTORY2_TAGS = ['tag3'] +HISTORY3_TAGS = ['tag1'] HISTORY3_ANNOT = 'some description' @@ -78,7 +79,7 @@ class HistoryGridTestCase(SeleniumTestCase): # Search by tags self.set_filter(tags_filter_selector, HISTORY1_TAGS[0]) histories = self.get_histories() - assert histories == [HISTORY1_NAME] + assert histories == [HISTORY3_NAME, HISTORY1_NAME] self.unset_filter('tags', HISTORY1_TAGS[0]) @selenium_test @@ -97,6 +98,28 @@ class HistoryGridTestCase(SeleniumTestCase): histories = self.get_histories() assert histories == [HISTORY1_NAME, HISTORY3_NAME, HISTORY2_NAME] + @selenium_test + def test_history_grid_tag_click(self): + self.navigate_to_published_histories_page() + + tags = None + grid = self.wait_for_selector('#grid-table-body') + for row in grid.find_elements_by_tag_name('tr'): + cell = row.find_elements_by_tag_name('td')[0] # Name + if cell.text == HISTORY1_NAME: + tags = row.find_elements_by_tag_name('td')[4] # Tags + break + assert tags is not None + + tag_button_selector = '.tag-area > .tag-button:first-child > .tag-name' + tag_button = tags.find_element_by_css_selector(tag_button_selector) + assert tag_button.text == HISTORY1_TAGS[0] + + tag_button.click() + + histories = self.get_histories() + assert histories == [HISTORY3_NAME, HISTORY1_NAME] + def get_histories(self): time.sleep(1.5) @@ -175,6 +198,7 @@ class HistoryGridTestCase(SeleniumTestCase): self.publish_current_history() self.create_history(HISTORY3_NAME) + self.set_tags(HISTORY3_TAGS) # self.set_annotation(HISTORY3_ANNOT) self.publish_current_history() self.logout_if_needed() From 2f547b09737d6711e44de7d9c7600384aa97038e Mon Sep 17 00:00:00 2001 From: Evgeny Anatskiy Date: Sat, 26 Aug 2017 13:50:21 +0200 Subject: [PATCH 06/10] small improvements --- .../test_published_history_grid.py | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/test/selenium_tests/test_published_history_grid.py b/test/selenium_tests/test_published_history_grid.py index ac1037804d2..031986d7a67 100644 --- a/test/selenium_tests/test_published_history_grid.py +++ b/test/selenium_tests/test_published_history_grid.py @@ -1,7 +1,5 @@ import time -# import requests - from .framework import SeleniumTestCase, selenium_test # Test case data @@ -10,6 +8,7 @@ USER2_EMAIL = 'test_user2@test.test' HISTORY1_NAME = 'First' HISTORY2_NAME = 'Second' HISTORY3_NAME = 'Third' +HISTORY4_NAME = 'Four' HISTORY1_TAGS = ['tag1', 'tag2'] HISTORY2_TAGS = ['tag3'] HISTORY3_TAGS = ['tag1'] @@ -18,12 +17,6 @@ HISTORY3_ANNOT = 'some description' class HistoryGridTestCase(SeleniumTestCase): - # @selenium_test - # def test_history_grid_accessible(self): - # full_url = self.build_url('histories/list_published') - # response = requests.get(full_url) - # assert response.status_code == 200 - @selenium_test def test_history_grid_histories(self): self.setup_users_and_histories() @@ -39,10 +32,16 @@ class HistoryGridTestCase(SeleniumTestCase): search_input = self.wait_for_selector(input_selector) search_input.send_keys(HISTORY1_NAME) self.send_enter(search_input) - histories = self.get_histories() assert histories == [HISTORY1_NAME] + self.unset_filter('free-text-search', HISTORY1_NAME) + search_input = self.wait_for_selector(input_selector) + search_input.send_keys(HISTORY4_NAME) + self.send_enter(search_input) + histories = self.get_histories() + assert histories == ['No Items'] + @selenium_test def test_history_grid_search_advanced(self): self.navigate_to_published_histories_page() From da1518db48265617cb2e2a00f9b738058c648f4b Mon Sep 17 00:00:00 2001 From: Evgeny Anatskiy Date: Sat, 26 Aug 2017 14:24:23 +0200 Subject: [PATCH 07/10] set annotations --- .../test_published_history_grid.py | 48 ++++++++++--------- 1 file changed, 25 insertions(+), 23 deletions(-) diff --git a/test/selenium_tests/test_published_history_grid.py b/test/selenium_tests/test_published_history_grid.py index 031986d7a67..da9d28607d4 100644 --- a/test/selenium_tests/test_published_history_grid.py +++ b/test/selenium_tests/test_published_history_grid.py @@ -61,12 +61,12 @@ class HistoryGridTestCase(SeleniumTestCase): assert histories == [HISTORY1_NAME] self.unset_filter('name', HISTORY1_NAME) - # TODO: Search by annotation - # annotation = HISTORY3_ANNOT.split(' ')[0] - # self.set_filter(annot_filter_selector, annotation) - # histories = self.get_histories() - # assert histories == [HISTORY3_NAME] - # self.unset_filter('annotation', annotation) + # Search by annotation + annotation = HISTORY3_ANNOT.split(' ')[0] + self.set_filter(annot_filter_selector, annotation) + histories = self.get_histories() + assert histories == [HISTORY3_NAME] + self.unset_filter('annotation', annotation) # Search by owner owner = USER2_EMAIL.split('@')[0] @@ -150,8 +150,7 @@ class HistoryGridTestCase(SeleniumTestCase): tag_area_selector = self.test_data['historyPanel']['selectors'] \ ['history']['tagArea'] - tag_area = self.driver.find_element_by_css_selector(tag_area_selector) - if not tag_area.is_displayed(): + if not self.is_displayed(tag_area_selector): tag_icon = self.wait_for_selector(tag_icon_selector) tag_icon.click() time.sleep(.5) @@ -171,24 +170,23 @@ class HistoryGridTestCase(SeleniumTestCase): anno_area_selector = self.test_data['historyPanel']['selectors'] \ ['history']['annoArea'] - annon_icon = self.wait_for_selector(anno_icon_selector) - annon_icon.click() + if not self.is_displayed(anno_area_selector): + annon_icon = self.wait_for_selector(anno_icon_selector) + annon_icon.click() + anno_area_selector += ' .annotation' annon_area = self.wait_for_selector(anno_area_selector) + time.sleep(.5) + annon_area.click() - # TODO: complete the function + area_editable_selector = anno_area_selector + ' textarea' + done_button_selector = anno_area_selector + ' button' + annon_area_editable = self.wait_for_selector(area_editable_selector) + anno_done_button = self.wait_for_selector(done_button_selector) - # annon_area.click() - - # anno_area_editable_selector = anno_area_selector + ' textarea' - # # anno_done_button_selector = anno_area_selector + ' button' - # annon_area_editable = self.wait_for_selector( - # anno_area_editable_selector) - # # anno_done_button = self.wait_for_selector(anno_done_button_selector) - - # annon_area_editable.click() - # annon_area_editable.send_keys('some annotation') - # # anno_done_button.click() + annon_area_editable.click() + annon_area_editable.send_keys(annotation) + anno_done_button.click() def setup_users_and_histories(self): self.register(USER1_EMAIL) @@ -198,7 +196,7 @@ class HistoryGridTestCase(SeleniumTestCase): self.create_history(HISTORY3_NAME) self.set_tags(HISTORY3_TAGS) - # self.set_annotation(HISTORY3_ANNOT) + self.set_annotation(HISTORY3_ANNOT) self.publish_current_history() self.logout_if_needed() @@ -244,3 +242,7 @@ class HistoryGridTestCase(SeleniumTestCase): edit_title_input_selector = self.test_data['historyPanel'] \ ['selectors']['history']['nameEditableTextInput'] return self.wait_for_selector(edit_title_input_selector) + + def is_displayed(self, selector): + element = self.driver.find_element_by_css_selector(selector) + return element.is_displayed() From 2dda34a00240a9af990a23c14cd73abb87db4268 Mon Sep 17 00:00:00 2001 From: Evgeny Anatskiy Date: Sat, 26 Aug 2017 14:27:23 +0200 Subject: [PATCH 08/10] rename the file --- ...published_history_grid.py => test_published_histories_grid.py} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename test/selenium_tests/{test_published_history_grid.py => test_published_histories_grid.py} (100%) diff --git a/test/selenium_tests/test_published_history_grid.py b/test/selenium_tests/test_published_histories_grid.py similarity index 100% rename from test/selenium_tests/test_published_history_grid.py rename to test/selenium_tests/test_published_histories_grid.py From 773029bd364037943a810506a79cebca85f2a260 Mon Sep 17 00:00:00 2001 From: Evgeny Anatskiy Date: Mon, 28 Aug 2017 12:12:18 +0200 Subject: [PATCH 09/10] fix flake8 issues --- .../test_published_histories_grid.py | 15 +++++---------- 1 file changed, 5 insertions(+), 10 deletions(-) diff --git a/test/selenium_tests/test_published_histories_grid.py b/test/selenium_tests/test_published_histories_grid.py index da9d28607d4..53be8297394 100644 --- a/test/selenium_tests/test_published_histories_grid.py +++ b/test/selenium_tests/test_published_histories_grid.py @@ -145,10 +145,8 @@ class HistoryGridTestCase(SeleniumTestCase): time.sleep(.5) def set_tags(self, tags): - tag_icon_selector = self.test_data['historyPanel']['selectors'] \ - ['history']['tagIcon'] - tag_area_selector = self.test_data['historyPanel']['selectors'] \ - ['history']['tagArea'] + tag_icon_selector = self.test_data['historyPanel']['selectors']['history']['tagIcon'] + tag_area_selector = self.test_data['historyPanel']['selectors']['history']['tagArea'] if not self.is_displayed(tag_area_selector): tag_icon = self.wait_for_selector(tag_icon_selector) @@ -165,10 +163,8 @@ class HistoryGridTestCase(SeleniumTestCase): time.sleep(.5) def set_annotation(self, annotation): - anno_icon_selector = self.test_data['historyPanel']['selectors'] \ - ['history']['annoIcon'] - anno_area_selector = self.test_data['historyPanel']['selectors'] \ - ['history']['annoArea'] + anno_icon_selector = self.test_data['historyPanel']['selectors']['history']['annoIcon'] + anno_area_selector = self.test_data['historyPanel']['selectors']['history']['annoArea'] if not self.is_displayed(anno_area_selector): annon_icon = self.wait_for_selector(anno_icon_selector) @@ -239,8 +235,7 @@ class HistoryGridTestCase(SeleniumTestCase): def click_to_rename_history(self): self.history_panel_name_element().click() - edit_title_input_selector = self.test_data['historyPanel'] \ - ['selectors']['history']['nameEditableTextInput'] + edit_title_input_selector = self.test_data['historyPanel']['selectors']['history']['nameEditableTextInput'] return self.wait_for_selector(edit_title_input_selector) def is_displayed(self, selector): From a464fe9db6ab993e282feb1ba9ec4eea78ada376 Mon Sep 17 00:00:00 2001 From: John Chilton Date: Tue, 29 Aug 2017 06:26:37 -0400 Subject: [PATCH 10/10] Rework published histories selenium test a bit. - Wait for elements to be clickable before clicking them. - Allow individual tests to be run on their own and out of order. - Use randomly generated emails - the tests still can't really be applied to an external Galaxy test server but this gets us closer. --- .../test_published_histories_grid.py | 84 +++++++++---------- 1 file changed, 42 insertions(+), 42 deletions(-) diff --git a/test/selenium_tests/test_published_histories_grid.py b/test/selenium_tests/test_published_histories_grid.py index 53be8297394..b0b76b99ed8 100644 --- a/test/selenium_tests/test_published_histories_grid.py +++ b/test/selenium_tests/test_published_histories_grid.py @@ -3,8 +3,6 @@ import time from .framework import SeleniumTestCase, selenium_test # Test case data -USER1_EMAIL = 'test_user1@test.test' -USER2_EMAIL = 'test_user2@test.test' HISTORY1_NAME = 'First' HISTORY2_NAME = 'Second' HISTORY3_NAME = 'Third' @@ -17,12 +15,14 @@ HISTORY3_ANNOT = 'some description' class HistoryGridTestCase(SeleniumTestCase): + def setUp(self): + super(HistoryGridTestCase, self).setUp() + self.ensure_users_and_histories() + @selenium_test def test_history_grid_histories(self): - self.setup_users_and_histories() self.navigate_to_published_histories_page() - histories = self.get_histories() - assert histories == [HISTORY2_NAME, HISTORY3_NAME, HISTORY1_NAME] + self.assert_grid_histories_are([HISTORY2_NAME, HISTORY3_NAME, HISTORY1_NAME]) @selenium_test def test_history_grid_search_standard(self): @@ -32,15 +32,13 @@ class HistoryGridTestCase(SeleniumTestCase): search_input = self.wait_for_selector(input_selector) search_input.send_keys(HISTORY1_NAME) self.send_enter(search_input) - histories = self.get_histories() - assert histories == [HISTORY1_NAME] + self.assert_grid_histories_are([HISTORY1_NAME]) self.unset_filter('free-text-search', HISTORY1_NAME) search_input = self.wait_for_selector(input_selector) search_input.send_keys(HISTORY4_NAME) self.send_enter(search_input) - histories = self.get_histories() - assert histories == ['No Items'] + self.assert_grid_histories_are(['No Items']) @selenium_test def test_history_grid_search_advanced(self): @@ -57,28 +55,24 @@ class HistoryGridTestCase(SeleniumTestCase): # Search by name self.set_filter(name_filter_selector, HISTORY1_NAME) - histories = self.get_histories() - assert histories == [HISTORY1_NAME] + self.assert_grid_histories_are([HISTORY1_NAME]) self.unset_filter('name', HISTORY1_NAME) # Search by annotation annotation = HISTORY3_ANNOT.split(' ')[0] self.set_filter(annot_filter_selector, annotation) - histories = self.get_histories() - assert histories == [HISTORY3_NAME] + self.assert_grid_histories_are([HISTORY3_NAME]) self.unset_filter('annotation', annotation) # Search by owner - owner = USER2_EMAIL.split('@')[0] + owner = self.user2_email.split('@')[0] self.set_filter(owner_filter_selector, owner) - histories = self.get_histories() - assert histories == [HISTORY2_NAME] + self.assert_grid_histories_are([HISTORY2_NAME]) self.unset_filter('username', owner) # Search by tags self.set_filter(tags_filter_selector, HISTORY1_TAGS[0]) - histories = self.get_histories() - assert histories == [HISTORY3_NAME, HISTORY1_NAME] + self.assert_grid_histories_are([HISTORY3_NAME, HISTORY1_NAME]) self.unset_filter('tags', HISTORY1_TAGS[0]) @selenium_test @@ -86,16 +80,14 @@ class HistoryGridTestCase(SeleniumTestCase): self.navigate_to_published_histories_page() sort_link = self.wait_for_selector('th#name-header > a') sort_link.click() - histories = self.get_histories() - assert histories == [HISTORY1_NAME, HISTORY2_NAME, HISTORY3_NAME] + self.assert_grid_histories_are([HISTORY1_NAME, HISTORY2_NAME, HISTORY3_NAME]) @selenium_test def test_history_grid_sort_by_owner(self): self.navigate_to_published_histories_page() sort_link = self.wait_for_selector('th#username-header > a') sort_link.click() - histories = self.get_histories() - assert histories == [HISTORY1_NAME, HISTORY3_NAME, HISTORY2_NAME] + self.assert_grid_histories_are([HISTORY1_NAME, HISTORY3_NAME, HISTORY2_NAME]) @selenium_test def test_history_grid_tag_click(self): @@ -116,10 +108,9 @@ class HistoryGridTestCase(SeleniumTestCase): tag_button.click() - histories = self.get_histories() - assert histories == [HISTORY3_NAME, HISTORY1_NAME] + self.assert_grid_histories_are([HISTORY3_NAME, HISTORY1_NAME]) - def get_histories(self): + def get_histories(self, sleep=False): time.sleep(1.5) names = [] @@ -130,17 +121,23 @@ class HistoryGridTestCase(SeleniumTestCase): return names + def assert_grid_histories_are(self, expected_histories, sort_matters=True): + actual_histories = self.get_histories() + if not sort_matters: + expected_histories = set(expected_histories) + actual_histories = set(actual_histories) + + self.assertEqual(expected_histories, actual_histories) + def set_filter(self, selector, value): - filter_input = self.wait_for_selector(selector) - time.sleep(.5) - filter_input.click() + filter_input = self.wait_for_selector_clickable(selector) filter_input.send_keys(value) self.send_enter(filter_input) def unset_filter(self, filter_key, filter_value): close_link_selector = 'a[filter_key="%s"][filter_val="%s"]' % \ (filter_key, filter_value) - close_link = self.wait_for_selector(close_link_selector) + close_link = self.wait_for_selector_clickable(close_link_selector) close_link.click() time.sleep(.5) @@ -149,12 +146,11 @@ class HistoryGridTestCase(SeleniumTestCase): tag_area_selector = self.test_data['historyPanel']['selectors']['history']['tagArea'] if not self.is_displayed(tag_area_selector): - tag_icon = self.wait_for_selector(tag_icon_selector) + tag_icon = self.wait_for_selector_clickable(tag_icon_selector) tag_icon.click() - time.sleep(.5) tag_area_selector += ' .tags-input input' - tag_area = self.wait_for_selector(tag_area_selector) + tag_area = self.wait_for_selector_clickable(tag_area_selector) tag_area.click() for tag in tags: @@ -167,25 +163,29 @@ class HistoryGridTestCase(SeleniumTestCase): anno_area_selector = self.test_data['historyPanel']['selectors']['history']['annoArea'] if not self.is_displayed(anno_area_selector): - annon_icon = self.wait_for_selector(anno_icon_selector) + annon_icon = self.wait_for_selector_clickable(anno_icon_selector) annon_icon.click() anno_area_selector += ' .annotation' - annon_area = self.wait_for_selector(anno_area_selector) - time.sleep(.5) + annon_area = self.wait_for_selector_clickable(anno_area_selector) annon_area.click() area_editable_selector = anno_area_selector + ' textarea' done_button_selector = anno_area_selector + ' button' - annon_area_editable = self.wait_for_selector(area_editable_selector) - anno_done_button = self.wait_for_selector(done_button_selector) + annon_area_editable = self.wait_for_selector_clickable(area_editable_selector) + anno_done_button = self.wait_for_selector_clickable(done_button_selector) annon_area_editable.click() annon_area_editable.send_keys(annotation) anno_done_button.click() - def setup_users_and_histories(self): - self.register(USER1_EMAIL) + def ensure_users_and_histories(self): + if getattr(HistoryGridTestCase, "user1_email", None): + return + + HistoryGridTestCase.user1_email = self._get_random_email() + HistoryGridTestCase.user2_email = self._get_random_email() + self.register(self.user1_email) self.create_history(HISTORY1_NAME) self.set_tags(HISTORY1_TAGS) self.publish_current_history() @@ -196,7 +196,7 @@ class HistoryGridTestCase(SeleniumTestCase): self.publish_current_history() self.logout_if_needed() - self.register(USER2_EMAIL) + self.register(self.user2_email) self.create_history(HISTORY2_NAME) self.set_tags(HISTORY2_TAGS) self.publish_current_history() @@ -213,7 +213,7 @@ class HistoryGridTestCase(SeleniumTestCase): self.click_history_option('Share or Publish') with self.main_panel(): selector = 'input[name="make_accessible_and_publish"]' - publish_button = self.wait_for_selector(selector) + publish_button = self.wait_for_selector_clickable(selector) publish_button.click() def navigate_to_published_histories_page(self): @@ -222,7 +222,7 @@ class HistoryGridTestCase(SeleniumTestCase): self.click_label( self.navigation_data['labels']['masthead']['menus']['libraries']) selector = 'a[href="/histories/list_published"]' - histories_link = self.wait_for_selector(selector) + histories_link = self.wait_for_selector_clickable(selector) histories_link.click() def click_history_option(self, option_label):