Files
galaxy/test/selenium_tests/test_custom_builds.py
T
John Chilton 01eb5f04e6 Aggressively retry buggy submit_login() function in Selenium tests.
I don't get why when we click submit the user does not actually get logged in, but based on the last round of improved error messages this seems to be the case. You might think there is some callback in the login form that doesn't get registered by the time Selenium clicks the submit button - but this doesn't seem to be the case - I don't see any jquery magic happening in login.mako.

Should fix failures like this:

https://jenkins.galaxyproject.org/job/selenium/482/testReport/junit/selenium_tests.test_saved_histories/SavedHistoriesTestCase/test_history_publish/

I'd say at this point this is the most common problem in the Selenium tests.

This also introduces a framework for taking state snapshots of the Galaxy interface during tests that will only get written out if the tests fail. We now take screenshots before and after submitting the login form but this is a general purpose debugging mechanism that could be used other places.
2017-09-20 10:28:41 -04:00

103 lines
3.8 KiB
Python

import time
from .framework import (
retry_assertion_during_transitions,
selenium_test,
SharedStateSeleniumTestCase,
)
class CustomBuildsTestcase(SharedStateSeleniumTestCase):
def setUp(self):
super(CustomBuildsTestcase, self).setUp()
self.home() # ensure Galaxy is loaded
self.submit_login(self.user_email, retries=2)
@selenium_test
def test_build_add(self):
self.navigate_to_custom_builds_page()
self.add_custom_build(self.build_name1, self.build_key1)
self.assert_custom_builds_in_grid([self.build_name1])
@selenium_test
def test_build_delete(self):
self.navigate_to_custom_builds_page()
self.add_custom_build(self.build_name2, self.build_key2)
self.assert_custom_builds_in_grid([self.build_name2])
self.delete_custom_build(self.build_name2)
self.assert_custom_builds_in_grid([self.build_name2], False)
@retry_assertion_during_transitions
def assert_custom_builds_in_grid(self, expected_builds, present=True):
actual_builds = self.get_custom_builds()
intersection = set(actual_builds).intersection(expected_builds)
if present:
self.assertEqual(intersection, set(expected_builds))
else:
self.assertEqual(intersection, set())
def add_custom_build(self, build_name, build_key):
name_div = self.wait_for_selector('div[tour_id="name"')
name_input = name_div.find_element_by_css_selector('.ui-form-field input')
name_input.click()
name_input.send_keys(build_name)
key_div = self.wait_for_selector('div[tour_id="id"')
key_input = key_div.find_element_by_css_selector('.ui-form-field input')
key_input.click()
key_input.send_keys(build_key)
len_type_div = self.wait_for_selector('div[tour_id="len|type')
len_type_select = len_type_div.find_element_by_css_selector('.ui-form-field .ui-select')
len_type_select.click()
option = self.wait_for_sizzle_selector_clickable('div[role="option"]:contains("Len-file by copy/paste")')
option.click()
content_area = self.wait_for_and_click_selector('.ui-form-field > textarea')
content_area.send_keys('content')
self.wait_for_and_click_selector('button#save')
def delete_custom_build(self, build_name):
delete_button = None
grid = self.wait_for_selector('table.grid > tbody')
for row in grid.find_elements_by_tag_name('tr'):
td = row.find_elements_by_tag_name('td')
name = td[0].text
if name == build_name:
delete_button = td[3].find_element_by_css_selector('.ui-button-icon-plain')
break
if delete_button is None:
raise AssertionError('Failed to find custom build with name [%s]' % build_name)
delete_button.click()
def get_custom_builds(self):
time.sleep(1)
builds = []
grid = self.wait_for_selector('table.grid > tbody')
for row in grid.find_elements_by_tag_name('tr'):
name = row.find_elements_by_tag_name('td')[0].text
builds.append(name)
return builds
def navigate_to_custom_builds_page(self):
self.home()
self.click_masthead_user() # Open masthead menu
label = self.navigation_data['labels']['masthead']['menus']['user']
self.click_label(label)
self.wait_for_and_click_selector('a[href="/custom_builds"]')
def setup_shared_state(self):
CustomBuildsTestcase.user_email = self._get_random_email()
self.register(self.user_email)
CustomBuildsTestcase.build_name1 = self._get_random_name()
CustomBuildsTestcase.build_name2 = self._get_random_name()
CustomBuildsTestcase.build_key1 = self._get_random_name(len=5)
CustomBuildsTestcase.build_key2 = self._get_random_name(len=5)