diff --git a/base.py b/base.py index 359fa44..5d68bb4 100644 --- a/base.py +++ b/base.py @@ -221,18 +221,55 @@ def add_contributor(self, user): self.get_element('#addContributors a[data-bind="click:submit"]').click() def remove_contributor(self, user_data): - # mouse over to the contribute's name - element_to_hover_over \ - = self.get_element('#contributors a[data-fullname="' - + user_data["fullname"]+'"]') - hover = ActionChains(self.driver).move_to_element(element_to_hover_over) - hover.perform() + wait(self.driver, 3).until( + ec.visibility_of_element_located( + ( + By.CSS_SELECTOR, + '#contributors a[data-fullname="' + user_data["full_name"]+'"]' + ) + ) + ) + + self.driver.find_element_by_css_selector( + 'HEADER#overview.subhead UL.nav.navbar-nav' + ).find_element_by_link_text( + 'Contributors' + ).click() + + wait(self.driver, 3).until( + ec.visibility_of_element_located( + ( + By.CSS_SELECTOR, + 'div.col-md-7 div#contributors' + ) + ) + ) # click the remove icon - element_to_hover_over.find_element_by_css_selector("i").click() + self.driver.find_element_by_css_selector( + "div.col-md-7 div#contributors li[data-fullname='" + user_data["full_name"]+"']" + ).find_element_by_link_text("-").click() - self.get_element("div.modal-dialog button[class='btn btn-primary']")\ - .click() + wait(self.driver, 3).until( + ec.visibility_of_element_located( + ( + By.CSS_SELECTOR, + "div.modal-dialog button[class='btn btn-primary']" + ) + ) + ) + with WaitForPageReload(self.driver): + + # click the "OK" button + self.driver.find_element_by_css_selector( + "div.modal-dialog button[class='btn btn-primary']" + ).click() + + self.driver.find_element_by_css_selector( + 'HEADER#overview.subhead UL.nav.navbar-nav' + ).find_element_by_link_text( + 'Dashboard' + ).click() def get_log(self): diff --git a/config.py b/config.py index 55dd6eb..151d997 100644 --- a/config.py +++ b/config.py @@ -8,7 +8,7 @@ selenium_wait_time = 5 # Domain to use for all tests. -osf_home = 'http://staging.openscienceframework.org' +osf_home = 'http://localhost:5000' # make sure there is no trailing slash. osf_home = osf_home.rstrip('/') diff --git a/pages/project.py b/pages/project.py index 7ff7793..f341163 100644 --- a/pages/project.py +++ b/pages/project.py @@ -81,16 +81,14 @@ def can_add_contributors(self): @property def can_remove_contributors(self): - element_to_hover_over = self.driver.find_element_by_css_selector( - '#contributors span.contributor a') - ActionChains( - self.driver - ).move_to_element(element_to_hover_over).perform() + elem = self.driver.find_element_by_css_selector( + 'HEADER#overview.subhead UL.nav.navbar-nav' + ).find_elements_by_link_text( + 'Contributors' + ) # click the remove icon - return bool( - len(element_to_hover_over.find_elements_by_css_selector("i")) - ) + return bool(len(elem)) @property def can_view_file(self): @@ -339,14 +337,26 @@ def remove_contributor(self, user): ) ) ) - element_to_hover_over = self.driver.find_element_by_css_selector( - '#contributors a[data-fullname="' + user.full_name+'"]' + + self.driver.find_element_by_css_selector( + 'HEADER#overview.subhead UL.nav.navbar-nav' + ).find_element_by_link_text( + 'Contributors' + ).click() + + WebDriverWait(self.driver, 3).until( + EC.visibility_of_element_located( + ( + By.CSS_SELECTOR, + 'div.col-md-7 div#contributors' + ) + ) ) - hover = ActionChains(self.driver).move_to_element(element_to_hover_over) - hover.perform() # click the remove icon - element_to_hover_over.find_element_by_css_selector("i").click() + self.driver.find_element_by_css_selector( + "div.col-md-7 div#contributors li[data-fullname='" + user.full_name+"']" + ).find_element_by_link_text("-").click() WebDriverWait(self.driver, 3).until( EC.visibility_of_element_located( @@ -363,6 +373,12 @@ def remove_contributor(self, user): "div.modal-dialog button[class='btn btn-primary']" ).click() + self.driver.find_element_by_css_selector( + 'HEADER#overview.subhead UL.nav.navbar-nav' + ).find_element_by_link_text( + 'Dashboard' + ).click() + def add_contributor(self, user, children=False): # click the "add" link @@ -477,7 +493,7 @@ def title(self): :returns: ``str`` """ - return self.driver.find_element_by_css_selector('h1 span#nodeTitleEditable').text + return self.driver.find_element_by_css_selector('h1#nodeTitleEditable').text @title.setter def title(self, value): diff --git a/tests/projects/test_contributor_organize.py b/tests/projects/test_contributor_organize.py new file mode 100644 index 0000000..451b82a --- /dev/null +++ b/tests/projects/test_contributor_organize.py @@ -0,0 +1,123 @@ +from nose.tools import * +from pages.helpers import create_user +from tests.fixtures import ProjectFixture +from selenium.webdriver import ActionChains +from selenium.webdriver.common.by import By +from selenium.webdriver.support.ui import WebDriverWait +from selenium.webdriver.support import expected_conditions as EC + + +class ReorderContributorTest(ProjectFixture): + @classmethod + def setUpClass(cls): + super(ReorderContributorTest, cls).setUpClass() + cls.users.append(create_user()) + cls.page.add_contributor(cls.users[-1], children=True) + cls.page.driver.find_element_by_css_selector( + 'HEADER#overview.subhead UL.nav.navbar-nav' + ).find_element_by_link_text( + 'Contributors' + ).click() + + WebDriverWait(cls.page.driver, 3).until( + EC.visibility_of_element_located( + (By.CSS_SELECTOR, + 'div.col-md-7 div#contributors') + ) + ) + # Second method: by element + ac = ActionChains(cls.page.driver) + a = cls.page.driver.find_elements_by_css_selector( + 'div.col-md-7 div#contributors li' + )[0] + b = cls.page.driver.find_elements_by_css_selector( + 'div.col-md-7 div#contributors li' + )[1] + ac.click_and_hold(a).perform() + a_chain = ActionChains(cls.page.driver) + a_chain.move_to_element(b).perform() + a_chain.release(b).perform() + + def test_reorder_contributors(self): + assert_equal( + self.page.driver.find_elements_by_css_selector( + 'div.col-md-7 div#contributors li' + )[0].find_elements_by_css_selector( + 'a' + )[1].text, + self.users[1].full_name, + ) + + def test_contributor_present(self): + assert_equal(self.users[1].full_name, self.page.contributors[0].full_name) + assert_equal(self.users[0].full_name, self.page.contributors[1].full_name) + + +class SortContributorTest(ProjectFixture): + @classmethod + def setUpClass(cls): + super(SortContributorTest, cls).setUpClass() + cls.users.append(create_user()) + cls.page.add_contributor(cls.users[-1], children=True) + cls.page.driver.find_element_by_css_selector( + 'HEADER#overview.subhead UL.nav.navbar-nav' + ).find_element_by_link_text( + 'Contributors' + ).click() + + WebDriverWait(cls.page.driver, 3).until( + EC.visibility_of_element_located( + (By.CSS_SELECTOR, + 'div.col-md-7 div#contributors') + ) + ) + + cls.page.driver.find_element_by_css_selector( + "button#sort" + ).click() + + WebDriverWait(cls.page.driver, 3).until( + EC.visibility_of_element_located( + (By.CSS_SELECTOR, + 'div.modal-dialog div.modal-footer button.btn.btn-primary') + ) + ) + + cls.page.driver.find_element_by_css_selector( + 'div.modal-dialog div.modal-footer button.btn.btn-primary' + ).click() + + WebDriverWait(cls.page.driver, 3).until( + EC.visibility_of_element_located( + (By.CSS_SELECTOR, + 'div.col-md-7 div#contributors') + ) + ) + + def test_sort_contributors(self): + if self.users[1].full_name < self.users[0].full_name: + assert_equal( + self.page.driver.find_elements_by_css_selector( + 'div.col-md-7 div#contributors li' + )[0].find_elements_by_css_selector( + 'a' + )[1].text, + self.users[1].full_name, + ) + else: + assert_equal( + self.page.driver.find_elements_by_css_selector( + 'div.col-md-7 div#contributors li' + )[0].find_elements_by_css_selector( + 'a' + )[1].text, + self.users[0].full_name, + ) + + def test_contributor_present(self): + if self.users[1].full_name < self.users[0].full_name: + assert_equal(self.users[1].full_name, self.page.contributors[0].full_name) + assert_equal(self.users[0].full_name, self.page.contributors[1].full_name) + else: + assert_equal(self.users[0].full_name, self.page.contributors[0].full_name) + assert_equal(self.users[1].full_name, self.page.contributors[1].full_name)