Skip to content

Commit c460ad3

Browse files
committed
Adding pages and components from osf-selenium-tests repository
0 parents  commit c460ad3

24 files changed

Lines changed: 1190 additions & 0 deletions

.gitignore

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
# OS generated files
2+
######################
3+
.DS_Store
4+
.DS_Store?
5+
._*
6+
.Spotlight-V100
7+
.Trashes
8+
Icon?
9+
ehthumbs.db
10+
Thumbs.db
11+
*.swp
12+
*~
13+
*.log
14+
15+
# Python
16+
#######################
17+
*.py[cod]
18+
*.so
19+
*.egg
20+
*.egg-info
21+
build
22+
eggs
23+
parts
24+
bin
25+
var
26+
sdist
27+
develop-eggs
28+
.installed.cfg
29+
lib64
30+
__pycache__
31+
pip-log.txt
32+
.coverage
33+
.tox
34+
nosetests.xml
35+
*.mo
36+
.idea
37+
.hg
38+
.hgignore
39+
.pytest_cache
40+
env/
41+
mathenv
42+
cover/
43+
.konchrc
44+
*.pyc
45+
*.log
46+
47+
# Private Info
48+
variables.py
49+
.env
50+
.cache/
51+
geckodriver.log

components/__init__.py

Whitespace-only changes.

components/dashboard.py

Lines changed: 131 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,131 @@
1+
import settings
2+
from time import sleep
3+
4+
from selenium.webdriver.common.by import By
5+
from base.locators import Locator, GroupLocator, BaseElement
6+
7+
8+
class EmberCreateProjectModal(BaseElement):
9+
10+
modal = Locator(By.CLASS_NAME, 'modal-dialog')
11+
create_project_button = Locator(By.CSS_SELECTOR, '[data-test-create-project-submit]')
12+
cancel_button = Locator(By.CSS_SELECTOR, '[data-test-create-project-cancel]')
13+
title_input = Locator(By.CSS_SELECTOR, '._NewProject__label_fz56y2 input')
14+
select_all_link = Locator(By.XPATH, '//button[text()="Select all"]')
15+
remove_all_link = Locator(By.XPATH, '//button[text()="Remove all"]')
16+
more_arrow = Locator(By.CSS_SELECTOR, 'button[data-analytics-name="Toggle more"]')
17+
description_input = Locator(By.CLASS_NAME, 'project-desc')
18+
template_dropdown = Locator(By.CLASS_NAME, 'ember-power-select-placeholder')
19+
20+
def institution_selected(self, institution):
21+
try:
22+
logo = self.modal.find_element_by_name(institution)
23+
return '0.25' not in logo.value_of_css_property('opacity')
24+
except Exception:
25+
raise ValueError('Institution logo for {} not present in modal'.format(institution))
26+
27+
28+
class EmberProjectCreatedModal(BaseElement):
29+
30+
go_to_project_href_link = Locator(By.CSS_SELECTOR, '.modal-dialog a', settings.LONG_TIMEOUT)
31+
keep_working_here_button = Locator(By.CSS_SELECTOR, 'button.btn-default')
32+
33+
34+
class EmberProjectList(BaseElement):
35+
36+
search_input = Locator(By.CSS_SELECTOR, '._quick-search-input_1b28t4 > input')
37+
top_project_link = Locator(By.CLASS_NAME, '_DashboardItem_17nn6d')
38+
sort_title_asc_button = Locator(By.CSS_SELECTOR, '._quick-search-col_1b28t4 ._SortButton_1ifm79 [title~="ascending"]')
39+
sort_title_dsc_button = Locator(By.CSS_SELECTOR, '._quick-search-col_1b28t4 ._SortButton_1ifm79 [title~="descending"]')
40+
sort_date_asc_button = Locator(By.CSS_SELECTOR, '.col-md-3 ._quick-search-col_1b28t4 ._SortButton_1ifm79 [title~="ascending"]')
41+
sort_date_dsc_button = Locator(By.CSS_SELECTOR, '.col-md-3 ._quick-search-col_1b28t4 ._SortButton_1ifm79 [title~="descending"]')
42+
loading_dashboard_item = Locator(By.CLASS_NAME, '_loading-dashboard-item_1b28t4', settings.QUICK_TIMEOUT)
43+
44+
# Group Locators
45+
project_list_projects = GroupLocator(By.CSS_SELECTOR, '._quick-search-table_1b28t4 a')
46+
47+
def get_nth_project_link(self, n=0):
48+
if self.loading_dashboard_item.here_then_gone():
49+
try:
50+
element = self.project_list_projects[n - 1]
51+
return element.get_attribute('href')
52+
except IndexError:
53+
raise ValueError('Unable to find a project at position {}'.format(n))
54+
raise ValueError('Dashboard page is still loading.')
55+
56+
def get_list_length(self):
57+
if self.loading_dashboard_item.here_then_gone():
58+
return len(self.project_list_projects)
59+
raise ValueError('Dashboard page is still loading.')
60+
61+
62+
class CreateProjectModal(BaseElement):
63+
64+
modal = Locator(By.ID, 'addProjectFromHome')
65+
create_project_button = Locator(By.CSS_SELECTOR, '#addProject button.btn.btn-success')
66+
cancel_button = Locator(By.CSS_SELECTOR, '#addProjectFromHome > div > div > div.modal-footer > button.btn.btn-default')
67+
title_input = Locator(By.CSS_SELECTOR, '.form-control')
68+
select_all_link = Locator(By.XPATH, '//a[text()="Select all"]')
69+
remove_all_link = Locator(By.XPATH, '//a[text()="Remove all"]')
70+
more_arrow = Locator(By.CSS_SELECTOR, '#addProjectFromHome > div > div > div.modal-body > div > div.text-muted.pointer')
71+
description_input = Locator(By.CSS_SELECTOR, '#addProjectFromHome > div > div > div.modal-body > div > div:nth-child(4) > input')
72+
template_dropdown = Locator(By.ID, 'select2-chosen-2')
73+
74+
def institution_selected(self, institution):
75+
try:
76+
logo = self.modal.find_element(By.NAME, institution)
77+
return '0.25' not in logo.value_of_css_property('opacity')
78+
except Exception:
79+
raise ValueError('Institution logo for {} not present in modal'.format(institution))
80+
81+
82+
class ProjectCreatedModal(BaseElement):
83+
84+
go_to_project_href_link = Locator(By.XPATH, '//a[text()="Go to new project"]', settings.LONG_TIMEOUT)
85+
keep_working_here_button = Locator(By.CSS_SELECTOR, 'button[data-dismiss="modal"]', settings.TIMEOUT)
86+
87+
88+
class CreateCollectionModal(BaseElement):
89+
90+
modal = Locator(By.CSS_SELECTOR, '#addColl')
91+
name_input = Locator(By.CSS_SELECTOR, '#addCollInput')
92+
add_button = Locator(By.CSS_SELECTOR, '#addColl .btn-success')
93+
cancel_button = Locator(By.CSS_SELECTOR, '#addColl .btn-default')
94+
95+
96+
class DeleteCollectionModal(BaseElement):
97+
98+
modal = Locator(By.CSS_SELECTOR, '#removeColl')
99+
delete_button = Locator(By.CSS_SELECTOR, '#removeColl .btn-danger')
100+
cancel_button = Locator(By.CSS_SELECTOR, '#removeColl .btn-default')
101+
102+
103+
class ProjectList(BaseElement):
104+
105+
search_input = Locator(By.ID, 'searchQuery', settings.LONG_TIMEOUT)
106+
top_project_link = Locator(By.CSS_SELECTOR, 'div.quick-search-table > div:nth-child(3) > a:nth-child(1)')
107+
sort_title_asc_button = Locator(By.CSS_SELECTOR,
108+
'div.quick-search-table > div.row.node-col-headers.m-t-md > div.col-sm-3.col-md-6 > div > button:nth-child(1)')
109+
sort_title_dsc_button = Locator(By.CSS_SELECTOR,
110+
'div.quick-search-table > div.row.node-col-headers.m-t-md > div.col-sm-3.col-md-6 > div > button:nth-child(2)')
111+
sort_date_asc_button = Locator(By.CSS_SELECTOR,
112+
'div.quick-search-table > div.row.node-col-headers.m-t-md > div:nth-child(3) > div > span > button:nth-child(1)')
113+
sort_date_dsc_button = Locator(By.CSS_SELECTOR,
114+
'div.quick-search-table > div.row.node-col-headers.m-t-md > div:nth-child(3) > div > span > button:nth-child(2)')
115+
116+
# Group Locators
117+
project_list_projects = GroupLocator(By.CSS_SELECTOR, 'div.quick-search-table > div:nth-child(3) > a')
118+
119+
def get_nth_project_link(self, n=0):
120+
base_selector = 'div.quick-search-table > div:nth-child(3) > a:nth-child'
121+
try:
122+
selector = '{}({})'.format(base_selector, n)
123+
element = self.driver.find_element(By.CSS_SELECTOR, selector)
124+
guid = element.get_attribute('href').strip('/')
125+
return guid
126+
except Exception:
127+
raise ValueError('Unable to find a project at position {}'.format(n))
128+
129+
def get_list_length(self):
130+
sleep(0.4) # Need sleep to let quicksearch do its thing
131+
return len(self.project_list_projects)

components/generic.py

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
import settings
2+
3+
from time import sleep
4+
from selenium.webdriver.common.by import By
5+
from base.locators import Locator, BaseElement
6+
7+
8+
class SignUpForm(BaseElement):
9+
name_input = Locator(By.NAME, 'fullName')
10+
email_one_input = Locator(By.NAME, 'email1')
11+
email_two_input = Locator(By.NAME, 'email2')
12+
password_input = Locator(By.NAME, 'password')
13+
terms_of_service_checkbox = Locator(By.NAME, 'acceptedTermsOfService')
14+
sign_up_button = Locator(By.CSS_SELECTOR, '[data-test-sign-up-button]')
15+
registration_success = Locator(By.CSS_SELECTOR, '.ext-success', settings.LONG_TIMEOUT)
16+
17+
def click_recaptcha(self):
18+
self.driver.switch_to.frame(self.driver.find_element_by_tag_name('iframe'))
19+
#only click the captcha checkbox if it isn't already checked
20+
if Locator(By.ID, 'recaptcha-anchor').get_element(self.driver, 'recaptcha-anchor').get_attribute('aria-checked') == 'false':
21+
Locator(By.CSS_SELECTOR, '.recaptcha-checkbox-border').get_element(self.driver, 'capcha').click()
22+
self.driver.switch_to.default_content()
23+
sleep(2)

components/navbars.py

Lines changed: 108 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,108 @@
1+
from base.locators import BaseElement, Locator
2+
3+
from selenium.webdriver.common.by import By
4+
5+
6+
#This is the navbar for legacy non-ember pages
7+
class HomeNavbar(BaseElement):
8+
service_dropdown = Locator(By.CSS_SELECTOR, '.fa-caret-down')
9+
home_link = Locator(By.CSS_SELECTOR, '.service-dropdown [data-analytics-name="HOME"]')
10+
preprints_link = Locator(By.CSS_SELECTOR, 'a[data-analytics-name="PREPRINTS"]')
11+
registries_link = Locator(By.CSS_SELECTOR, 'a[data-analytics-name="REGISTRIES"]')
12+
meetings_link = Locator(By.CSS_SELECTOR, 'a[data-analytics-name="MEETINGS"]')
13+
institutions_link = Locator(By.CSS_SELECTOR, 'a[data-analytics-name="INSTITUTIONS"]')
14+
search_link = Locator(By.ID, 'navbar-search')
15+
support_link = Locator(By.ID, 'navbar-support')
16+
donate_link = Locator(By.ID, 'navbar-donate')
17+
18+
user_dropdown = Locator(By.CSS_SELECTOR, 'ul.navbar-nav > li:nth-child(6) > a')
19+
user_dropdown_profile = Locator(By.CSS_SELECTOR, 'ul.dropdown-menu-right > li:nth-child(1)')
20+
user_dropdown_support = Locator(By.CSS_SELECTOR, 'ul.dropdown-menu-right > li:nth-child(2)')
21+
user_dropdown_settings = Locator(By.CSS_SELECTOR, 'ul.dropdown-menu-right > li:nth-child(3)')
22+
logout_link = Locator(By.CSS_SELECTOR, '#secondary-navigation > ul > li.dropdown.open > ul > li:nth-child(4) > a')
23+
sign_up_button = Locator(By.CSS_SELECTOR, 'a.btn-success:nth-child(1)')
24+
sign_in_button = Locator(By.CSS_SELECTOR, '.btn-top-login')
25+
current_service = Locator(By.CSS_SELECTOR, '#navbarScope .current-service > strong')
26+
27+
def verify(self):
28+
return len(self.driver.find_elements(By.ID, 'navbarScope')) == 1
29+
30+
def is_logged_in(self):
31+
return self.user_dropdown.present()
32+
33+
def is_logged_out(self):
34+
return self.sign_in_button.present()
35+
36+
37+
class EmberNavbar(HomeNavbar):
38+
search_link = Locator(By.CSS_SELECTOR, '[data-test-nav-search-link]')
39+
support_link = Locator(By.CSS_SELECTOR, '[data-test-nav-support-link]')
40+
donate_link = Locator(By.CSS_SELECTOR, '[data-test-nav-donate-link]')
41+
sign_up_button = Locator(By.CSS_SELECTOR, '[data-test-ad-sign-up-button]')
42+
sign_in_button = Locator(By.CSS_SELECTOR, '[data-test-sign-in-button]')
43+
44+
logout_link = Locator(By.CSS_SELECTOR, '[data-test-ad-logout]')
45+
my_projects_link = Locator(By.CSS_SELECTOR, '[data-test-nav-my-projects-link]')
46+
my_quick_files_link = Locator(By.CSS_SELECTOR, '[data-test-nav-quickfiles-link]')
47+
48+
49+
class PreprintsNavbar(EmberNavbar):
50+
title = Locator(By.CSS_SELECTOR, '.navbar-title')
51+
52+
home_link = Locator(By.CSS_SELECTOR, 'ul.dropdown-menu.service-dropdown > li:nth-child(1) > a')
53+
preprints_link = Locator(By.CSS_SELECTOR, 'ul.dropdown-menu.service-dropdown > li:nth-child(2) > a')
54+
registries_link = Locator(By.CSS_SELECTOR, 'ul.dropdown-menu.service-dropdown > li:nth-child(3) > a')
55+
meetings_link = Locator(By.CSS_SELECTOR, 'ul.dropdown-menu.service-dropdown > li:nth-child(4) > a')
56+
institutions_link = Locator(By.CSS_SELECTOR, 'ul.dropdown-menu.service-dropdown > li:nth-child(5) > a')
57+
58+
my_preprints_link = Locator(By.CSS_SELECTOR, '#secondary-navigation > ul > li:nth-last-child(6) > a')
59+
add_a_preprint_link = Locator(By.CSS_SELECTOR, '#secondary-navigation > ul > li:nth-last-child(5) > a')
60+
search_link = Locator(By.CSS_SELECTOR, '#secondary-navigation > ul > li:nth-last-child(4) > a')
61+
support_link = Locator(By.CSS_SELECTOR, '#secondary-navigation > ul > li:nth-last-child(3) > a')
62+
donate_link = Locator(By.CSS_SELECTOR, '#secondary-navigation > ul > li.navbar-donate-button')
63+
sign_up_button = Locator(By.CSS_SELECTOR, 'a.btn-success:nth-child(1)')
64+
sign_in_button = Locator(By.CSS_SELECTOR, '.btn-top-login')
65+
66+
user_dropdown_profile = Locator(By.CSS_SELECTOR, 'ul.dropdown-menu-right > li:nth-child(1)')
67+
user_dropdown_support = Locator(By.CSS_SELECTOR, 'ul.dropdown-menu-right > li:nth-child(2)')
68+
user_dropdown_settings = Locator(By.CSS_SELECTOR, 'ul.dropdown-menu-right > li:nth-child(3)')
69+
logout_link = Locator(By.CSS_SELECTOR, '#secondary-navigation > ul > li.dropdown.open > ul > li:nth-child(4) > a')
70+
71+
def verify(self):
72+
return self.current_service.text == 'PREPRINTS'
73+
74+
75+
class RegistriesNavbar(EmberNavbar):
76+
home_link = Locator(By.CSS_SELECTOR, 'ul._ServiceDropdownMenu_nar5mu > li:nth-child(1) > a')
77+
preprints_link = Locator(By.CSS_SELECTOR, 'ul._ServiceDropdownMenu_nar5mu > li:nth-child(2) > a')
78+
registries_link = Locator(By.CSS_SELECTOR, 'ul._ServiceDropdownMenu_nar5mu > li:nth-child(3) > a')
79+
meetings_link = Locator(By.CSS_SELECTOR, 'ul._ServiceDropdownMenu_nar5mu > li:nth-child(4) > a')
80+
institutions_link = Locator(By.CSS_SELECTOR, 'ul._ServiceDropdownMenu_nar5mu > li:nth-child(5) > a')
81+
82+
help_link = Locator(By.CSS_SELECTOR, 'a[data-test-help]')
83+
donate_link = Locator(By.CSS_SELECTOR, 'a[data-test-donate]')
84+
join_link = Locator(By.CSS_SELECTOR, 'a[data-test-join]')
85+
login_link = Locator(By.CSS_SELECTOR, 'a[data-test-login]')
86+
87+
# For Registries Only -> This clicks the gravatar image. (Same effect)
88+
user_dropdown = Locator(By.CSS_SELECTOR, 'img[data-test-gravatar]')
89+
user_dropdown_profile = Locator(By.CSS_SELECTOR, 'ul.dropdown-menu-right > li:nth-child(1) > a')
90+
user_dropdown_support = Locator(By.CSS_SELECTOR, 'ul.dropdown-menu-right > li:nth-child(2) > a')
91+
user_dropdown_settings = Locator(By.CSS_SELECTOR, 'a[data-analytics-name="Settings"]')
92+
93+
add_new_link = Locator(By.CSS_SELECTOR, 'a[data-test-add-new-button]')
94+
95+
def verify(self):
96+
return self.current_service.text == 'REGISTRIES'
97+
98+
99+
class MeetingsNavbar(EmberNavbar):
100+
101+
def verify(self):
102+
return self.current_service.text == 'MEETINGS'
103+
104+
105+
class InstitutionsNavbar(EmberNavbar):
106+
107+
def verify(self):
108+
return self.current_service.text == 'INSTITUTIONS'

components/project.py

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
import settings
2+
3+
from selenium.webdriver.common.by import By
4+
from base.locators import Locator, GroupLocator, BaseElement
5+
6+
7+
class FileWidget(BaseElement):
8+
loading_indicator = Locator(By.CSS_SELECTOR, '#treeGrid .ball-scale', settings.VERY_LONG_TIMEOUT)
9+
file_expander = Locator(By.CSS_SELECTOR, '.fa-plus')
10+
filter_button = Locator(By.CSS_SELECTOR, '.fangorn-toolbar-icon .fa-search')
11+
filter_input = Locator(By.CSS_SELECTOR, '#folderRow .form-control')
12+
13+
# Group Locators
14+
component_and_file_titles = GroupLocator(By.CSS_SELECTOR, '.td-title')
15+
16+
class LogWidget(BaseElement):
17+
loading_indicator = Locator(By.CSS_SELECTOR, '#logFeed .ball-scale')
18+
19+
# Group Locators
20+
log_items = GroupLocator(By.CSS_SELECTOR, '#logFeed .db-activity-item')

components/user.py

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
from selenium.webdriver.common.by import By
2+
from base.locators import Locator, BaseElement
3+
4+
5+
class SettingsSideNavigation(BaseElement):
6+
profile_information_link = Locator(By.XPATH, '//a[text()="Profile information"]')
7+
account_settings_link = Locator(By.XPATH, '//a[text()="Account settings"]')
8+
configure_addons_link = Locator(By.XPATH, '//a[text()="Configure add-on accounts"]')
9+
notifications_link = Locator(By.XPATH, '//a[text()="Notifications"]')
10+
developer_apps_link = Locator(By.XPATH, '//a[text()="Developer apps"]')
11+
personal_access_tokens_link = Locator(By.XPATH, '//a[text()="Personal access tokens"]')

pages/__init__.py

Whitespace-only changes.

0 commit comments

Comments
 (0)