sakai-oae-test-api 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/Gemfile +7 -0
- data/lib/sakai-oae-test-api.rb +37 -0
- data/lib/sakai-oae-test-api/cle_frame_classes.rb +2160 -0
- data/lib/sakai-oae-test-api/gem_extensions.rb +168 -0
- data/lib/sakai-oae-test-api/global_methods.rb +109 -0
- data/lib/sakai-oae-test-api/page_classes.rb +1949 -0
- data/lib/sakai-oae-test-api/pop_up_dialogs.rb +1273 -0
- data/lib/sakai-oae-test-api/toolbars_and_menus.rb +745 -0
- data/lib/sakai-oae-test-api/widgets.rb +495 -0
- data/sakai-oae-test-api.gemspec +16 -0
- metadata +121 -0
@@ -0,0 +1,1273 @@
|
|
1
|
+
# coding: UTF-8
|
2
|
+
|
3
|
+
# Methods related to the My Account Pop Up dialog.
|
4
|
+
module AccountPreferencesPopUp
|
5
|
+
|
6
|
+
include PageObject
|
7
|
+
|
8
|
+
# Page Object Definitions
|
9
|
+
button(:preferences, :id=>"accountpreferences_preferences_tab")
|
10
|
+
button(:privacy_settings, :id=>"accountpreferences_privacy_tab")
|
11
|
+
button(:password, :id=>"accountpreferences_password_tab")
|
12
|
+
|
13
|
+
select_list(:time_zone, :id=>"time_zone")
|
14
|
+
select_list(:language, :id=>"pass_language")
|
15
|
+
|
16
|
+
text_field(:current_password, :id=>"curr_pass")
|
17
|
+
text_field(:new_password, :id=>"new_pass")
|
18
|
+
text_field(:retype_password, :id=>"retype_pass")
|
19
|
+
|
20
|
+
button(:save_new_password, :text=>"Save new password")
|
21
|
+
button(:save_preferences, :text=>"Save preferences")
|
22
|
+
button(:save_privacy_settings, :text=>"Save privacy settings")
|
23
|
+
|
24
|
+
span(:new_password_error, :id=>"new_pass_error")
|
25
|
+
span(:retype_password_error, :id=>"retype_pass_error")
|
26
|
+
|
27
|
+
# Custom methods...
|
28
|
+
|
29
|
+
# Need this custom Cancel button method because there are three different
|
30
|
+
# cancel buttons on this pop-up. This method will find the one that works
|
31
|
+
# and click on it.
|
32
|
+
def cancel
|
33
|
+
case
|
34
|
+
when self.div(:id=>"accountpreferences_preferContainer").visible?
|
35
|
+
self.div(:id=>"accountpreferences_preferContainer").button(:class=>"s3d-link-button s3d-bold accountpreferences_cancel").click
|
36
|
+
when self.div(:id=>"accountpreferences_changePrivacyContainer").visible?
|
37
|
+
self.div(:id=>"accountpreferences_changePrivacyContainer").button(:class=>"s3d-link-button s3d-bold accountpreferences_cancel").click
|
38
|
+
when self.div(:id=>"accountpreferences_changePassContainer").visible?
|
39
|
+
self.div(:id=>"accountpreferences_changePassContainer").button(:class=>"s3d-link-button s3d-bold accountpreferences_cancel").click
|
40
|
+
else
|
41
|
+
puts "\nCouldn't find the cancel button!\n"
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
end # AccountPreferencesPopUp
|
46
|
+
|
47
|
+
# Page Objects and Methods for the Add Areas Pop up dialog.
|
48
|
+
# Many page objects in this module are NOT defined using the
|
49
|
+
# Page Object gem, so they will need to be handled differently
|
50
|
+
# than usual. See the descriptions of the methods for more detail.
|
51
|
+
module AddAreasPopUp
|
52
|
+
|
53
|
+
include PageObject
|
54
|
+
|
55
|
+
# Page Object Definitions...
|
56
|
+
|
57
|
+
# Common elements...
|
58
|
+
button(:done_add_button, :id=>"addarea_create_doc_button" )
|
59
|
+
button(:cancel, :class=>"s3d-link-button jqmClose s3d-bold", :text=>"Cancel")
|
60
|
+
|
61
|
+
# New...
|
62
|
+
button(:new_container, :text=>"New", :class=>"s3d-button s3d-link-button")
|
63
|
+
text_field(:new_doc_name, :name=>"addarea_new_name", :class=>"addarea_name_field")
|
64
|
+
select_list(:new_doc_permissions, :id=>"addarea_new_permissions")
|
65
|
+
select_list(:number_of_pages, :id=>"addarea_new_numberofpages")
|
66
|
+
text_area(:new_doc_tags_and_categories, :name=>"addarea_new_tagsandcategories")
|
67
|
+
button(:list_categories_button, :text=>"List categories")
|
68
|
+
|
69
|
+
# Currently viewing...
|
70
|
+
button(:currently_viewing, :text=>"Currently viewing")
|
71
|
+
|
72
|
+
# My library...
|
73
|
+
button(:from_my_library, :class=>"s3d-button s3d-link-button subnav_button", :text=>"My library")
|
74
|
+
|
75
|
+
# Everywhere...
|
76
|
+
button(:everywhere, :text=>"Everywhere")
|
77
|
+
|
78
|
+
# Content list...
|
79
|
+
button(:content_list, :text=>"Content list")
|
80
|
+
|
81
|
+
# Participants list...
|
82
|
+
button(:participants_list, :text=>"Participants list")
|
83
|
+
|
84
|
+
# Widgets...
|
85
|
+
button(:widgets, :text=>"Widgets")
|
86
|
+
|
87
|
+
# Custom Methods...
|
88
|
+
|
89
|
+
# Clicks the list categories link.
|
90
|
+
def list_categories
|
91
|
+
self.list_categories_button
|
92
|
+
self.wait_for_ajax
|
93
|
+
self.class.class_eval { include AddRemoveCategories }
|
94
|
+
end
|
95
|
+
|
96
|
+
# The "Search Everywhere" text field. Due to a strange bug with
|
97
|
+
# Watir-webdriver and/or PageObject, we're using this method for the
|
98
|
+
# definition of the field, so if you need to enter a text string into it
|
99
|
+
# you'll need to use Watir-webdriver's ".set" method, like this:
|
100
|
+
# page_object.search_everywhere.set "text string"
|
101
|
+
def search_everywhere
|
102
|
+
self.text_field(:id=>"addarea_existing_everywhere_search")
|
103
|
+
end
|
104
|
+
|
105
|
+
# Defines the Existing Document Name field based on the currently
|
106
|
+
# selected tab. Test script steps will need to use Watir's .set method
|
107
|
+
# for entering text strings into the fields.
|
108
|
+
def existing_doc_name
|
109
|
+
a = "addarea_existing_mylibrary_container"
|
110
|
+
b = "addarea_existing_everywhere_container"
|
111
|
+
c = "addarea_existing_currentlyviewing_container"
|
112
|
+
case
|
113
|
+
when self.div(:id=>a).visible?
|
114
|
+
return self.div(:id=>a).text_field(:name=>"addarea_existing_name")
|
115
|
+
when self.div(:id=>b).visible?
|
116
|
+
return self.div(:id=>b).text_field(:name=>"addarea_existing_name")
|
117
|
+
when self.div(:id=>c).visible?
|
118
|
+
return self.div(:id=>c).text_field(:name=>"addarea_existing_name")
|
119
|
+
end
|
120
|
+
end
|
121
|
+
|
122
|
+
# Defines the Existing Doc Permissions select list field.
|
123
|
+
# To select an item from this field you'll need to include Watir's
|
124
|
+
# .select method in your test script step, like this:
|
125
|
+
# page_object.existing_doc_permissions.select "option"
|
126
|
+
def existing_doc_permissions
|
127
|
+
a = "addarea_existing_mylibrary_container"
|
128
|
+
b = "addarea_existing_everywhere_container"
|
129
|
+
c = "addarea_existing_currentlyviewing_container"
|
130
|
+
case
|
131
|
+
when self.div(:id=>a).visible?
|
132
|
+
return self.div(:id=>a).select(:name=>"addarea_existing_permissions")
|
133
|
+
when self.div(:id=>b).visible?
|
134
|
+
return self.div(:id=>b).select(:name=>"addarea_existing_permissions")
|
135
|
+
when self.div(:id=>c).visible?
|
136
|
+
return self.div(:id=>c).select(:name=>"addarea_existing_permissions")
|
137
|
+
end
|
138
|
+
end
|
139
|
+
|
140
|
+
# The div containing the search results list.
|
141
|
+
# This method is primarily for use in the procedural methods
|
142
|
+
# in this module rather than for steps in a test script (because it
|
143
|
+
# only refers to the "Everywhere" list.
|
144
|
+
def search_results
|
145
|
+
self.div(:id=>"addarea_existing_everywhere_bottom")
|
146
|
+
end
|
147
|
+
|
148
|
+
# The name field for adding a Content List page. Use of this method
|
149
|
+
# in a test script will require including a Watir method. For example,
|
150
|
+
# if you want to send the field a text string, you'll use the .set
|
151
|
+
# method, like this: page_object.content_list_name.set "Name"
|
152
|
+
def content_list_name
|
153
|
+
self.text_field(:id=>"addarea_contentlist_name")
|
154
|
+
end
|
155
|
+
|
156
|
+
# The permissions field for adding a Content List page. Use of this method
|
157
|
+
# in a test script will require including a Watir method. For example,
|
158
|
+
# if you want to send the field a text string, you'll use the .set
|
159
|
+
# method, like this: page_object.content_list_permissions.select "Option"
|
160
|
+
def content_list_permissions
|
161
|
+
self.select(:id=>"addarea_contentlist_permissions")
|
162
|
+
end
|
163
|
+
|
164
|
+
# The name field for adding a Participant List page. Use of this method
|
165
|
+
# in a test script will require including a Watir method. For example,
|
166
|
+
# if you want to send the field a text string, you'll use the .set
|
167
|
+
# method, like this: page_object.participants_list_name.set "Name"
|
168
|
+
def participants_list_name
|
169
|
+
self.text_field(:id=>"addarea_participants_name")
|
170
|
+
end
|
171
|
+
|
172
|
+
# The permissions field for adding a Participants List page. Use of this method
|
173
|
+
# in a test script will require including a Watir method. For example,
|
174
|
+
# if you want to send the field a text string, you'll use the .set
|
175
|
+
# method, like this: page_object.participants_list_permissions.select "Option"
|
176
|
+
def participants_list_permissions
|
177
|
+
@browser.select(:id=>"addarea_participants_permissions")
|
178
|
+
end
|
179
|
+
|
180
|
+
# The text field for entering the widget name. When using this method directly,
|
181
|
+
# be sure to remember that it will require Watir-webdriver methods, as well.
|
182
|
+
# However, it should not be necessary to call this method directly, as it is
|
183
|
+
# used as a helper for other methods in this class.
|
184
|
+
def widget_name
|
185
|
+
self.text_field(:id=>"addarea_widgets_name")
|
186
|
+
end
|
187
|
+
|
188
|
+
# The select list field for selecting the widget. When using this method directly,
|
189
|
+
# be sure to remember that it will require Watir-webdriver methods, as well.
|
190
|
+
# However, it should not be necessary to call this method directly, as it is
|
191
|
+
# used as a helper for other methods in this class.
|
192
|
+
def select_widget
|
193
|
+
self.select(:id=>"addarea_widgets_widget")
|
194
|
+
end
|
195
|
+
|
196
|
+
# The select list for defining the widget permissions. When using this method directly,
|
197
|
+
# be sure to remember that it will require Watir-webdriver methods, as well.
|
198
|
+
# However, it should not be necessary to call this method directly, as it is
|
199
|
+
# used as a helper for other methods in this class.
|
200
|
+
def widget_permissions
|
201
|
+
self.select(:id=>"addarea_widgets_permissions")
|
202
|
+
end
|
203
|
+
|
204
|
+
# Clicks the "Done, add" button in the Add Area flyout dialog, then
|
205
|
+
# waits for the Ajax calls to drop to zero.
|
206
|
+
def create
|
207
|
+
self.done_add_button
|
208
|
+
self.wait_for_ajax
|
209
|
+
end
|
210
|
+
|
211
|
+
alias done_add create
|
212
|
+
|
213
|
+
# This method expects to be passed a hash object like this:
|
214
|
+
# { :name=>"The name of the target document",
|
215
|
+
# :title=>"The placement title string",
|
216
|
+
# :visible=>"Who can see it" }
|
217
|
+
# The method adds an existing document using the specified hash contents.
|
218
|
+
# Note that it uses the "Everywhere" page, so if you want to use
|
219
|
+
# one of the other pages for the search, you'll have to code all steps in
|
220
|
+
# the test script itself.
|
221
|
+
def add_from_existing(document)
|
222
|
+
self.everywhere
|
223
|
+
search_everywhere.set(document[:name] + "\n")
|
224
|
+
self.wait_for_ajax #
|
225
|
+
search_results.li(:text=>/#{Regexp.escape(document[:name])}/).fire_event("onclick")
|
226
|
+
existing_doc_name.set document[:title]
|
227
|
+
existing_doc_permissions.select document[:visible]
|
228
|
+
|
229
|
+
self.create
|
230
|
+
end
|
231
|
+
|
232
|
+
alias add_existing_document add_from_existing
|
233
|
+
alias add_existing_doc add_from_existing
|
234
|
+
alias add_an_existing_document add_from_existing
|
235
|
+
|
236
|
+
# Adds a Participant List Area to the Group/Course. The passed
|
237
|
+
# object needs to be a hash with :name and :visible keys and values.
|
238
|
+
def add_participant_list(list)
|
239
|
+
participants_list
|
240
|
+
participants_list_name.set list[:name]
|
241
|
+
participants_list_permissions.select list[:visible]
|
242
|
+
|
243
|
+
create
|
244
|
+
end
|
245
|
+
|
246
|
+
alias add_participants_list add_participant_list
|
247
|
+
|
248
|
+
# Adds a new Content Library area to a Group/Course.
|
249
|
+
# The method requires a hash for the variable, with :name and :visible keys and values.
|
250
|
+
def add_content_list(document)
|
251
|
+
content_list
|
252
|
+
content_list_name.set document[:name]
|
253
|
+
content_list_permissions.select document[:visible]
|
254
|
+
create
|
255
|
+
end
|
256
|
+
|
257
|
+
alias add_a_content_library add_content_list
|
258
|
+
alias add_content_library add_content_list
|
259
|
+
|
260
|
+
# Adds a new Widget Area to a Group/Course. The method
|
261
|
+
# requires that the passed variable be a hash, with :name,
|
262
|
+
# :widget, and :visible keys and values.
|
263
|
+
def add_widget_page(document)
|
264
|
+
widgets
|
265
|
+
select_widget.select document[:widget]
|
266
|
+
widget_name.set document[:name]
|
267
|
+
widget_permissions.select document[:visible]
|
268
|
+
create
|
269
|
+
end
|
270
|
+
|
271
|
+
alias add_widget add_widget_page
|
272
|
+
alias add_a_widget add_widget_page
|
273
|
+
alias add_a_widget_page add_widget_page
|
274
|
+
|
275
|
+
end # AddAreasPopUp
|
276
|
+
|
277
|
+
# Page objects in the Add content dialog box
|
278
|
+
module AddContentContainer
|
279
|
+
|
280
|
+
include PageObject
|
281
|
+
|
282
|
+
# Page Objects
|
283
|
+
|
284
|
+
# Upload content tab...
|
285
|
+
link(:upload_content, :text=>"Upload content")
|
286
|
+
|
287
|
+
text_field(:file_title, :id=>"newaddcontent_upload_content_title")
|
288
|
+
text_area(:file_description, :id=>"newaddcontent_upload_content_description")
|
289
|
+
# "tags and categories" field is defined below...
|
290
|
+
select_list(:who_can_see_file, :id=>"newaddcontent_upload_content_permissions")
|
291
|
+
select_list(:file_copyright, :id=>"newaddcontent_upload_content_copyright")
|
292
|
+
|
293
|
+
# Create new document tab...
|
294
|
+
link(:create_new_document, :text=>"Create new document")
|
295
|
+
|
296
|
+
text_field(:name_document, :id=>"newaddcontent_add_document_title")
|
297
|
+
text_area(:document_description, :id=>"newaddcontent_add_document_description")
|
298
|
+
# "tags and categories" field is defined below...
|
299
|
+
select_list(:who_can_see_document, :id=>"newaddcontent_add_document_permissions")
|
300
|
+
select_list(:document_copyright, :id=>"newaddcontent_upload_content_copyright")
|
301
|
+
|
302
|
+
# Use existing content tab...
|
303
|
+
link(:all_content, :text=>"All content")
|
304
|
+
link(:add_content_my_library, :text=>"My Library")
|
305
|
+
|
306
|
+
# Add link tab...
|
307
|
+
link(:add_link, :text=>"Add link")
|
308
|
+
|
309
|
+
text_field(:paste_link_address, :id=>"newaddcontent_add_link_url")
|
310
|
+
text_field(:link_title, :id=>"newaddcontent_add_link_title")
|
311
|
+
text_area(:link_description, :id=>"newaddcontent_add_link_description")
|
312
|
+
# "tags and categories" field is defined below...
|
313
|
+
|
314
|
+
# button(:add, :text=>"Add") Must be defined with a custom method. See below...
|
315
|
+
|
316
|
+
# Collected items column...
|
317
|
+
select_list(:save_all_to, :id=>"newaddcontent_saveto")
|
318
|
+
|
319
|
+
button(:list_categories, :text=>"List categories")
|
320
|
+
|
321
|
+
button(:done_add_collected_button, :text=>"Done, add collected")
|
322
|
+
|
323
|
+
# Progress Indicator that appears while files are uploading
|
324
|
+
div(:progress_indicator, :id=>"sakai_progressindicator")
|
325
|
+
|
326
|
+
# Custom Methods...
|
327
|
+
|
328
|
+
# Clicks the "Add" button that moves items into the
|
329
|
+
# "Collected Items" list.
|
330
|
+
def add
|
331
|
+
active_content_div.button(:text=>"Add").click
|
332
|
+
sleep 0.1
|
333
|
+
self.wait_until { self.done_add_collected_button_element.enabled? }
|
334
|
+
end
|
335
|
+
|
336
|
+
# Works to enter text into any of the "Tags and Categories"
|
337
|
+
# fields on the "Add Content" dialog.
|
338
|
+
def tags_and_categories=(text)
|
339
|
+
active_content_div.text_field(:id=>/as-input-\d+/).set("#{text}\n")
|
340
|
+
self.wait_for_ajax
|
341
|
+
end
|
342
|
+
|
343
|
+
# Removes the item from the selected list.
|
344
|
+
def remove(item)
|
345
|
+
name_li(item).button(:title=>"Remove").click
|
346
|
+
self.wait_for_ajax
|
347
|
+
end
|
348
|
+
|
349
|
+
# Enters the specified text in the Search field.
|
350
|
+
# Note that the method appends a line feed on the string, so the search will
|
351
|
+
# happen immediately when it is invoked.
|
352
|
+
def search_for_content=(text)
|
353
|
+
self.text_field(:class=>"newaddcontent_existingitems_search").set("#{text}\n")
|
354
|
+
end
|
355
|
+
|
356
|
+
# Checks the checkbox for the specified item.
|
357
|
+
def check_content(item)
|
358
|
+
name_li(item).wait_until_present
|
359
|
+
name_li(item).checkbox.set
|
360
|
+
end
|
361
|
+
|
362
|
+
alias check_item check_content
|
363
|
+
alias check_document check_content
|
364
|
+
|
365
|
+
# Enters the specified filename in the file field.
|
366
|
+
#
|
367
|
+
# The method takes an optional file_path parameter.
|
368
|
+
# This allows the file_name parameter to be a variable
|
369
|
+
# distinct from the path containing the file.
|
370
|
+
def upload_file=(file_name, file_path="")
|
371
|
+
self.file_field(:name=>"fileData").wait_until_present
|
372
|
+
self.file_field(:name=>"fileData").set(file_path + file_name)
|
373
|
+
end
|
374
|
+
|
375
|
+
# Clicks the "Done, add collected" button, then waits for
|
376
|
+
# the page to refresh and any ajax calls to complete.
|
377
|
+
def done_add_collected
|
378
|
+
self.done_add_collected_button
|
379
|
+
self.progress_indicator_element.wait_while_present
|
380
|
+
end
|
381
|
+
|
382
|
+
# Private methods...
|
383
|
+
private
|
384
|
+
|
385
|
+
# A helper method for determining what div
|
386
|
+
# is currently visible.
|
387
|
+
def active_content_div
|
388
|
+
case
|
389
|
+
when self.div(:id=>"newaddcontent_upload_content_template").visible?
|
390
|
+
return self.div(:id=>"newaddcontent_upload_content_template")
|
391
|
+
when self.div(:id=>"newaddcontent_add_document_template").visible?
|
392
|
+
return self.div(:id=>"newaddcontent_add_document_template")
|
393
|
+
when self.div(:id=>"newaddcontent_add_existing_template").visible?
|
394
|
+
return self.div(:id=>"newaddcontent_add_existing_template")
|
395
|
+
when self.div(:id=>"newaddcontent_add_link_template").visible?
|
396
|
+
return self.div(:id=>"newaddcontent_add_link_template")
|
397
|
+
end
|
398
|
+
end
|
399
|
+
|
400
|
+
end # AddContentContainer
|
401
|
+
|
402
|
+
# Page Objects and Methods related to the Pop Up for Categories.
|
403
|
+
module AddRemoveCategories
|
404
|
+
|
405
|
+
include PageObject
|
406
|
+
|
407
|
+
# Page Objects
|
408
|
+
|
409
|
+
button(:save_categories, :text=>"Assign and save")
|
410
|
+
button(:dont_save, :text=>"Don't save")
|
411
|
+
|
412
|
+
# Custom Methods...
|
413
|
+
|
414
|
+
# Opens the specified category tree.
|
415
|
+
def open_tree(text)
|
416
|
+
self.link(:title=>text).parent.ins.fire_event("onclick")
|
417
|
+
end
|
418
|
+
|
419
|
+
# Checks the specified category.
|
420
|
+
def check_category(text)
|
421
|
+
if self.link(:title=>text).exists? == false
|
422
|
+
puts "\nCategory...\n#{text}\n...not found in list!\n\nPlease check for typos in your test data.\n"
|
423
|
+
end
|
424
|
+
if self.link(:title=>text).visible? == false
|
425
|
+
self.link(:title=>text).parent.parent.parent.ins.click
|
426
|
+
end
|
427
|
+
if self.link(:title=>text).parent.class_name =~ /jstree-unchecked/
|
428
|
+
self.link(:title=>text).click
|
429
|
+
end
|
430
|
+
sleep 0.3
|
431
|
+
end
|
432
|
+
|
433
|
+
# Returns an array of the categories selected in the pop-up container.
|
434
|
+
def selected_categories
|
435
|
+
list = []
|
436
|
+
self.div(:id=>"assignlocation_jstree_selected_container").lis.each do |li|
|
437
|
+
list << li.text
|
438
|
+
end
|
439
|
+
return list
|
440
|
+
end
|
441
|
+
|
442
|
+
end # AddRemoveCategories
|
443
|
+
|
444
|
+
# Page Objects and Methods related to the "Add widgets" pop-up on the Dashboard
|
445
|
+
module AddRemoveWidgets
|
446
|
+
|
447
|
+
include PageObject
|
448
|
+
|
449
|
+
# Clicks the Close button on the dialog for adding/removing widgets
|
450
|
+
# to/from the Dashboard. Returns the MyDashboard class object.
|
451
|
+
def close_add_widget
|
452
|
+
self.div(:class=>"s3d-dialog-close jqmClose").fire_event("onclick")
|
453
|
+
self.wait_for_ajax
|
454
|
+
MyDashboard.new @browser
|
455
|
+
end
|
456
|
+
|
457
|
+
# Adds all widgets to the dashboard
|
458
|
+
def add_all_widgets
|
459
|
+
array = self.div(:id=>"add_goodies_body").lis.select { |li| li.class_name == "add" }
|
460
|
+
sub_array = array.select { |li| li.visible? }
|
461
|
+
sub_array.each do |li|
|
462
|
+
li.button(:text=>"Add").click
|
463
|
+
self.wait_for_ajax
|
464
|
+
end
|
465
|
+
close_add_widget
|
466
|
+
end
|
467
|
+
|
468
|
+
# Removes all widgets from the dashboard
|
469
|
+
def remove_all_widgets
|
470
|
+
array = self.div(:id=>"add_goodies_body").lis.select { |li| li.class_name == "remove" }
|
471
|
+
sub_array = array.select { |li| li.visible? }
|
472
|
+
sub_array.each do |li|
|
473
|
+
li.button(:text=>"Remove").click
|
474
|
+
self.wait_for_ajax
|
475
|
+
end
|
476
|
+
close_add_widget
|
477
|
+
end
|
478
|
+
|
479
|
+
# Clicks the "Add" button for the specified widget
|
480
|
+
def add_widget(name)
|
481
|
+
self.div(:id=>"add_goodies_body").li(:text=>/#{Regexp.escape(name)}/).button.click
|
482
|
+
end
|
483
|
+
|
484
|
+
# Unchecks the checkbox for the specified widget.
|
485
|
+
def remove_widget(name)
|
486
|
+
self.div(:id=>"add_goodies_body").li(:text=>/#{Regexp.escape(name)}/, :id=>/_remove_/).button.click
|
487
|
+
end
|
488
|
+
|
489
|
+
end # AddRemoveWidgets
|
490
|
+
|
491
|
+
# Page Objects and Methods related to the Pop Up Dialog for Contacts
|
492
|
+
module AddToContactsPopUp
|
493
|
+
|
494
|
+
include PageObject
|
495
|
+
|
496
|
+
# Page Object
|
497
|
+
button(:invite_button, :text=>"Invite")
|
498
|
+
button(:dont_invite, :text=>"Don't Invite")
|
499
|
+
|
500
|
+
text_area(:personal_note, :id=>"addtocontacts_form_personalnote")
|
501
|
+
|
502
|
+
checkbox(:is_my_classmate, :value=>"Classmate")
|
503
|
+
checkbox(:is_my_supervisor, :value=>"Supervisor")
|
504
|
+
checkbox(:is_being_supervised_by_me, :value=>"Supervised")
|
505
|
+
checkbox(:is_my_lecturer, :value=>"Lecturer")
|
506
|
+
checkbox(:is_my_student, :value=>"Student")
|
507
|
+
checkbox(:is_my_colleague, :value=>"Colleague")
|
508
|
+
checkbox(:is_my_college_mate, :value=>"College Mate")
|
509
|
+
checkbox(:shares_an_interest_with_me, :value=>"Shares Interests")
|
510
|
+
|
511
|
+
# Custom Methods...
|
512
|
+
|
513
|
+
# Clicks the Invite button then waits for ajax calls to
|
514
|
+
# calm down.
|
515
|
+
def invite
|
516
|
+
self.invite_button
|
517
|
+
sleep 0.5
|
518
|
+
self.wait_for_ajax
|
519
|
+
end
|
520
|
+
|
521
|
+
end # AddToContactsPopUp
|
522
|
+
|
523
|
+
#
|
524
|
+
module AddToGroupsPopUp
|
525
|
+
|
526
|
+
include PageObject
|
527
|
+
|
528
|
+
|
529
|
+
|
530
|
+
end # AddToGroupsPopUp
|
531
|
+
|
532
|
+
#
|
533
|
+
module AppearancePopUp
|
534
|
+
|
535
|
+
include PageObject
|
536
|
+
|
537
|
+
# Page Object
|
538
|
+
|
539
|
+
# Custom Methods...
|
540
|
+
|
541
|
+
end
|
542
|
+
|
543
|
+
# Page Objects and Custom Methods related to the "Select your profile picture" pop-up dialog
|
544
|
+
module ChangePicturePopUp
|
545
|
+
|
546
|
+
include PageObject
|
547
|
+
|
548
|
+
# Page Objects
|
549
|
+
|
550
|
+
h1(:pop_up_title, :class=>"s3d-dialog-header")
|
551
|
+
file_field(:pic_file, :id=>"profilepicture")
|
552
|
+
button(:upload, :id=>"profile_upload")
|
553
|
+
button(:save, :id=>"save_new_selection")
|
554
|
+
button(:cancel, :text=>"Cancel")
|
555
|
+
div(:error_message, :id=>"changepic_nofile_error")
|
556
|
+
image(:thumbnail, :id=>"thumbnail_img")
|
557
|
+
|
558
|
+
# Custom Methods...
|
559
|
+
|
560
|
+
# Uploads the specified file name for the Avatar photo.
|
561
|
+
# The method takes an optional file_path parameter that allows
|
562
|
+
# the file_name and its file_path to be distinct variables.
|
563
|
+
def upload_a_new_picture(file_name, file_path="")
|
564
|
+
self.back_to_top
|
565
|
+
#puts(File.expand_path(file_path + file_name)
|
566
|
+
self.pic_file_element.when_visible { self.pic_file=(file_path + file_name) }
|
567
|
+
self.upload
|
568
|
+
self.linger_for_ajax(5)
|
569
|
+
end
|
570
|
+
|
571
|
+
# Clicks the Save button for the Change Picture Pop Up.
|
572
|
+
def save_new_selection
|
573
|
+
self.save_element.when_visible { self.save }
|
574
|
+
self.wait_for_ajax
|
575
|
+
end
|
576
|
+
|
577
|
+
def thumbnail_source
|
578
|
+
self.thumbnail_element.src
|
579
|
+
end
|
580
|
+
|
581
|
+
end
|
582
|
+
|
583
|
+
#
|
584
|
+
module CommentsPopUp
|
585
|
+
|
586
|
+
include PageObject
|
587
|
+
|
588
|
+
end
|
589
|
+
|
590
|
+
# Objects in the Pop Up dialog for setting viewing permissions for Content
|
591
|
+
module ContentPermissionsPopUp
|
592
|
+
|
593
|
+
include PageObject
|
594
|
+
|
595
|
+
# Page Objects
|
596
|
+
radio_button(:anyone_public, :id=>"contentpermissions_see_public")
|
597
|
+
radio_button(:logged_in_people_only, :id=>"contentpermissions_see_everyone")
|
598
|
+
radio_button(:private_to_the_shared_with_list, :id=>"contentpermissions_see_private")
|
599
|
+
select_list(:content_permissions, :id=>"contentpermissions_members_autosuggest_permissions")
|
600
|
+
text_area(:sharing_message, :id=>"contentpermissions_members_autosuggest_text")
|
601
|
+
button(:share_button, :id=>"contentpermissions_members_autosuggest_sharebutton")
|
602
|
+
button(:save_and_close_button, :id=>"contentpermissions_apply_permissions")
|
603
|
+
button(:cancel, :class=>"s3d-link-button jqmClose s3d-bold")
|
604
|
+
|
605
|
+
# Custom Methods...
|
606
|
+
|
607
|
+
# Enters the specified name in the "Who can edit it or
|
608
|
+
# who is it associated with?" search field. Then clicks
|
609
|
+
# on the first item in the search results menu--which means
|
610
|
+
# that this method assumes the search will be successful
|
611
|
+
# and the first item listed is the desired item to select.
|
612
|
+
def share_with=(name)
|
613
|
+
self.text_field(:id=>/contentpermissionscontainer\d+/).set name
|
614
|
+
sleep 0.6
|
615
|
+
self.wait_for_ajax
|
616
|
+
self.div(:class=>"as-results").li(:id=>"as-result-item-0").fire_event "onclick"
|
617
|
+
self.wait_for_ajax
|
618
|
+
end
|
619
|
+
|
620
|
+
# Clicks the "Save and close" button then waits for all ajax calls
|
621
|
+
# to finish
|
622
|
+
def save_and_close
|
623
|
+
save_and_close_button
|
624
|
+
self.wait_for_ajax
|
625
|
+
end
|
626
|
+
|
627
|
+
# Clicks the "Share" button and waits for the ajax calls to finish.
|
628
|
+
def share
|
629
|
+
self.button(:id=>"contentpermissions_members_autosuggest_sharebutton").flash
|
630
|
+
self.button(:id=>"contentpermissions_members_autosuggest_sharebutton").click
|
631
|
+
self.wait_for_ajax
|
632
|
+
end
|
633
|
+
|
634
|
+
end
|
635
|
+
|
636
|
+
# Methods for the Pop-up dialog that appears when you want to remove
|
637
|
+
# content from Libraries.
|
638
|
+
module DeleteContentPopUp
|
639
|
+
|
640
|
+
include PageObject
|
641
|
+
|
642
|
+
button(:remove_from_library_button, :text=>"Remove from library")
|
643
|
+
button(:delete_from_the_system_button, :text=>"Delete from the system")
|
644
|
+
|
645
|
+
# Clicks the cancel button on the Pop-up and waits for the Ajax calls to finish
|
646
|
+
def cancel
|
647
|
+
begin
|
648
|
+
self.div(:id=>"deletecontent_dialog").button(:text=>"Cancel").click
|
649
|
+
rescue
|
650
|
+
self.button(:text=>"Cancel").click
|
651
|
+
end
|
652
|
+
self.wait_for_ajax
|
653
|
+
end
|
654
|
+
alias cancel_deleting_content cancel
|
655
|
+
|
656
|
+
# Clicks the 'Remove from library' button and
|
657
|
+
# waits for the Ajax calls to complete.
|
658
|
+
def remove_from_library
|
659
|
+
self.remove_from_library_button
|
660
|
+
self.remove_from_library_button_element.wait_while_present
|
661
|
+
sleep 1.5
|
662
|
+
self.wait_for_ajax
|
663
|
+
end
|
664
|
+
|
665
|
+
# Clicks the 'Delete from the system' button and waits for
|
666
|
+
# The Ajax calls to complete.
|
667
|
+
def delete_from_the_system
|
668
|
+
self.delete_from_the_system_button
|
669
|
+
sleep 2
|
670
|
+
self.wait_for_ajax
|
671
|
+
end
|
672
|
+
|
673
|
+
# TODO - Define this method
|
674
|
+
def remove_from_the_system_anyway
|
675
|
+
|
676
|
+
end
|
677
|
+
|
678
|
+
# TODO - Define this method
|
679
|
+
def remove_from_this_library_only
|
680
|
+
|
681
|
+
end
|
682
|
+
|
683
|
+
end
|
684
|
+
|
685
|
+
# Methods for the "Delete" Pop-up dialog.
|
686
|
+
module DeletePagePopUp
|
687
|
+
|
688
|
+
include PageObject
|
689
|
+
|
690
|
+
# Page Objects
|
691
|
+
button(:delete_button, :id=>"lhnavigation_delete_confirm")
|
692
|
+
button(:dont_delete_button, :class=>"s3d-link-button s3d-bold jqmClose")
|
693
|
+
|
694
|
+
# Custom Methods
|
695
|
+
|
696
|
+
# Clicks the Delete button, then waits for any ajax calls to finish.
|
697
|
+
def delete
|
698
|
+
self.delete_button
|
699
|
+
self.wait_for_ajax
|
700
|
+
end
|
701
|
+
|
702
|
+
# Clicks the "Don't delete" button, then waits for any Ajax calls
|
703
|
+
# to complete
|
704
|
+
def dont_delete
|
705
|
+
self.dont_delete_button
|
706
|
+
self.wait_for_ajax
|
707
|
+
end
|
708
|
+
|
709
|
+
end
|
710
|
+
|
711
|
+
#
|
712
|
+
module DiscussionPopUp
|
713
|
+
|
714
|
+
include PageObject
|
715
|
+
|
716
|
+
# Page Objects
|
717
|
+
|
718
|
+
# Custom Methods
|
719
|
+
|
720
|
+
end
|
721
|
+
|
722
|
+
#
|
723
|
+
module ExportAsTemplate
|
724
|
+
|
725
|
+
include PageObject
|
726
|
+
|
727
|
+
# Page Objects
|
728
|
+
|
729
|
+
# Custom Methods
|
730
|
+
|
731
|
+
end
|
732
|
+
|
733
|
+
#
|
734
|
+
module FilesAndDocsPopUp
|
735
|
+
|
736
|
+
include PageObject
|
737
|
+
|
738
|
+
# Page Objects
|
739
|
+
link(:display_settings, :id=>"embedcontent_tab_display")
|
740
|
+
text_field(:name, :class=>"as-input")
|
741
|
+
button(:dont_add_button, :class=>"s3d-link-button s3d-bold embedcontent_dont_add")
|
742
|
+
|
743
|
+
# Custom Methods...
|
744
|
+
|
745
|
+
# Clicks the "Don't add" button, then waits for any Ajax calls
|
746
|
+
# to complete
|
747
|
+
def dont_add
|
748
|
+
self.dont_add_button
|
749
|
+
self.wait_for_ajax
|
750
|
+
end
|
751
|
+
|
752
|
+
end
|
753
|
+
|
754
|
+
#
|
755
|
+
module GoogleGadgetPopUp
|
756
|
+
|
757
|
+
include PageObject
|
758
|
+
|
759
|
+
# Page Objects
|
760
|
+
|
761
|
+
# Custom Methods
|
762
|
+
|
763
|
+
end
|
764
|
+
|
765
|
+
# Page Objects and Methods related to the Pop Up that appears for modifying
|
766
|
+
# the settings for the Google Maps Widget.
|
767
|
+
module GoogleMapsPopUp
|
768
|
+
|
769
|
+
include PageObject
|
770
|
+
|
771
|
+
# Page Objects
|
772
|
+
text_field(:location, :id=>"googlemaps_input_text_location")
|
773
|
+
button(:search_button, :id=>"googlemaps_button_search")
|
774
|
+
button(:dont_add, :id=>"googlemaps_cancel")
|
775
|
+
button(:add_map, :id=>"googlemaps_save")
|
776
|
+
radio_button(:large, :id=>"googlemaps_radio_large")
|
777
|
+
radio_button(:small, :id=>"googlemaps_radio_small")
|
778
|
+
|
779
|
+
# Custom Methods...
|
780
|
+
|
781
|
+
# Clicks the "Search" button, then waits for 2.5 seconds.
|
782
|
+
def search
|
783
|
+
self.search_button
|
784
|
+
sleep 2.5
|
785
|
+
end
|
786
|
+
|
787
|
+
end
|
788
|
+
|
789
|
+
#
|
790
|
+
module InlineContentPopUp
|
791
|
+
|
792
|
+
include PageObject
|
793
|
+
|
794
|
+
# Page Objects
|
795
|
+
|
796
|
+
# Custom Methods
|
797
|
+
|
798
|
+
end
|
799
|
+
|
800
|
+
#
|
801
|
+
module LeaveWorldPopUp
|
802
|
+
|
803
|
+
include PageObject
|
804
|
+
|
805
|
+
# Clicks the "Yes, Apply" button and waits for
|
806
|
+
# Ajax calls to finish
|
807
|
+
def yes_apply
|
808
|
+
self.button(:id=>"mymemberships_delete_membership_confirm").click
|
809
|
+
sleep 1.5
|
810
|
+
self.linger_for_ajax(2)
|
811
|
+
end
|
812
|
+
|
813
|
+
# Clicks the "Cancel" button and waits for Ajax
|
814
|
+
# calls to complete
|
815
|
+
def cancel
|
816
|
+
self.div(:id=>"mymemberships_delete_membership_dialog").button(:class=>"s3d-link-button s3d-bold jqmClose").click
|
817
|
+
self.linger_for_ajax(1)
|
818
|
+
end
|
819
|
+
|
820
|
+
end
|
821
|
+
|
822
|
+
# Page Objects and Methods related to the Pop Up that allows modifying a
|
823
|
+
# Group's/Course's participants.
|
824
|
+
module ManageParticipants
|
825
|
+
|
826
|
+
include PageObject
|
827
|
+
|
828
|
+
# Page Objects
|
829
|
+
checkbox(:add_all_contacts, :id=>"addpeople_select_all_contacts")
|
830
|
+
checkbox(:remove_all_contacts, :id=>"addpeople_select_all_selected_contacts")
|
831
|
+
button(:remove_selected, :text=>"Remove selected")
|
832
|
+
button(:save, :class=>"s3d-button s3d-overlay-action-button addpeople_finish_adding")
|
833
|
+
button(:cancel, :class=>"s3d-link-button jqmClose s3d-bold")
|
834
|
+
select_list(:role_for_selected_members, :id=>"addpeople_selected_all_permissions")
|
835
|
+
|
836
|
+
# Custom Methods
|
837
|
+
|
838
|
+
# Checks the specified contact for adding.
|
839
|
+
def add_contact(contact)
|
840
|
+
self.li(:text=>contact).checkbox(:class=>"addpeople_checkbox").set
|
841
|
+
end
|
842
|
+
|
843
|
+
alias check_contact add_contact
|
844
|
+
alias add_participant add_contact
|
845
|
+
|
846
|
+
# Adds the specified contact to the members list (does not save, though).
|
847
|
+
# This method assumes the specified name will be found in the search.
|
848
|
+
# It makes no allowances for failing to find the target user/member.
|
849
|
+
def add_by_search(name)
|
850
|
+
name.split("", 2).each do |letter|
|
851
|
+
self.text_field(:id=>/addpeople/, :class=>"as-input").focus
|
852
|
+
self.text_field(:id=>/addpeople/, :class=>"as-input").send_keys(letter)
|
853
|
+
self.wait_until { self.div(:id=>/^as-results-/).visible? }
|
854
|
+
if self.li(:text=>/#{Regexp.escape(name)}/, :id=>/as-result-item-\d+/).present?
|
855
|
+
self.li(:text=>/#{Regexp.escape(name)}/, :id=>/as-result-item-\d+/).click
|
856
|
+
break
|
857
|
+
end
|
858
|
+
end
|
859
|
+
end
|
860
|
+
alias add_contact_by_search add_by_search
|
861
|
+
alias add_participant_by_search add_by_search
|
862
|
+
alias search_and_add_participant add_by_search
|
863
|
+
alias add_by_search= add_by_search
|
864
|
+
|
865
|
+
alias done_apply_settings save
|
866
|
+
alias apply_and_save save
|
867
|
+
|
868
|
+
alias dont_apply cancel
|
869
|
+
|
870
|
+
# Checks to remove the specified contact.
|
871
|
+
def check_remove_contact(contact)
|
872
|
+
self.div(:id=>"addpeople_selected_contacts_container").link(:text=>contact).parent.checkbox.set
|
873
|
+
end
|
874
|
+
|
875
|
+
# Unchecks the remove checkbox for the specified contact
|
876
|
+
def uncheck_remove_contact(contact)
|
877
|
+
self.div(:id=>"addpeople_selected_contacts_container").link(:text=>contact).parent.checkbox.clear
|
878
|
+
end
|
879
|
+
|
880
|
+
# For the specified contact, updates to the specified role.fd
|
881
|
+
def set_role_for(contact, role)
|
882
|
+
self.div(:id=>"addpeople_selected_contacts_container").link(:text=>contact).parent.select(:class=>"addpeople_selected_permissions").select(role)
|
883
|
+
end
|
884
|
+
|
885
|
+
end
|
886
|
+
|
887
|
+
#
|
888
|
+
module OurAgreementPopUp
|
889
|
+
|
890
|
+
include PageObject
|
891
|
+
|
892
|
+
# Page Objects
|
893
|
+
button(:no_button, :id=>"acceptterms_action_dont_accept")
|
894
|
+
button(:yes_button, :id=>"acceptterms_action_accept")
|
895
|
+
|
896
|
+
# Custom Methods
|
897
|
+
|
898
|
+
# Clicks the "No, please log me out" button, then returns the
|
899
|
+
# LoginPage class object.
|
900
|
+
def no_please_log_me_out
|
901
|
+
|
902
|
+
end
|
903
|
+
|
904
|
+
# Clicks the "Yes, I accept" button, then returns the MyDashboard
|
905
|
+
# class object.
|
906
|
+
def yes_I_accept
|
907
|
+
self.yes_button
|
908
|
+
self.wait_for_ajax
|
909
|
+
MyDashboard.new @browser
|
910
|
+
end
|
911
|
+
|
912
|
+
end
|
913
|
+
|
914
|
+
#
|
915
|
+
module OwnerInfoPopUp
|
916
|
+
|
917
|
+
include PageObject
|
918
|
+
|
919
|
+
# Page Objects
|
920
|
+
button(:close_owner_info, :id=>"personinfo_close_button")
|
921
|
+
|
922
|
+
# Custom Methods
|
923
|
+
|
924
|
+
# Clicks the button to send a message to the owner.
|
925
|
+
def message_owner
|
926
|
+
self.button(:text=>"Message").click
|
927
|
+
self.wait_for_ajax
|
928
|
+
self.class.class_eval { include SendMessagePopUp }
|
929
|
+
end
|
930
|
+
|
931
|
+
# Clicks the button to add the owner to the user's contacts list
|
932
|
+
def add_to_contacts
|
933
|
+
self.button(:text=>"Add to contacts").click
|
934
|
+
self.wait_for_ajax
|
935
|
+
self.class.class_eval { include AddToContactsPopUp }
|
936
|
+
end
|
937
|
+
|
938
|
+
# Clicks the link to go to the owner's profile page. Returns the
|
939
|
+
# ViewPerson class object.
|
940
|
+
def view_owner_profile
|
941
|
+
self.span(:id=>"personinfo_user_name").link.click
|
942
|
+
sleep 2
|
943
|
+
ViewPerson.new @browser
|
944
|
+
end
|
945
|
+
|
946
|
+
end
|
947
|
+
|
948
|
+
# The Pending Requests Pop-Up for Groups/Courses/Projects
|
949
|
+
module PendingRequestsPopUp
|
950
|
+
|
951
|
+
include PageObject
|
952
|
+
|
953
|
+
# Page Objects
|
954
|
+
button(:done_button, :text=>"Done")
|
955
|
+
|
956
|
+
# Custom Methods...
|
957
|
+
|
958
|
+
# Clicks the "Add as a member" link for the
|
959
|
+
# specified user.
|
960
|
+
def add_as_member(name)
|
961
|
+
self.div(:class=>"fl-force-left joinrequests_details",:text=>/#{Regexp.escape(name)}/).button(:text=>"Add as a member").click
|
962
|
+
self.linger_for_ajax(3)
|
963
|
+
end
|
964
|
+
alias add_as_a_member add_as_member
|
965
|
+
|
966
|
+
# Clicks the "ignore" button for the specified
|
967
|
+
# user
|
968
|
+
def ignore(name)
|
969
|
+
self.div(:class=>"fl-force-left joinrequests_details",:text=>/#{Regexp.escape(name)}/).button(:text=>"Ignore").click
|
970
|
+
self.linger_for_ajax(3)
|
971
|
+
end
|
972
|
+
|
973
|
+
def done
|
974
|
+
self.done_button
|
975
|
+
self.linger_for_ajax(3)
|
976
|
+
end
|
977
|
+
|
978
|
+
end
|
979
|
+
|
980
|
+
# Objects and Methods for the Area Permissions Pop Up dialog
|
981
|
+
module PermissionsPopUp
|
982
|
+
|
983
|
+
include PageObject
|
984
|
+
|
985
|
+
# Page Objects
|
986
|
+
h1(:permissions_header, :class=>"s3d-dialog-header")
|
987
|
+
radio_button(:anyone_public, :id=>"areapermissions_see_public")
|
988
|
+
radio_button(:anyone_logged_in, :id=>"areapermissions_see_loggedin")
|
989
|
+
radio_button(:specific_roles_only, :id=>"areapermissions_see_private")
|
990
|
+
|
991
|
+
checkbox(:lecturers_can_see, :id=>"areapermissions_see_lecturer")
|
992
|
+
checkbox(:teaching_assistants_can_see, :id=>"areapermissions_see_ta")
|
993
|
+
checkbox(:students_can_see, :id=>"areapermissions_see_student")
|
994
|
+
|
995
|
+
checkbox(:lecturers_can_edit, :id=>"areapermissions_edit_lecturer")
|
996
|
+
checkbox(:teaching_assistants_can_edit, :id=>"areapermissions_edit_ta")
|
997
|
+
checkbox(:students_can_edit, :id=>"areapermissions_edit_student")
|
998
|
+
|
999
|
+
button(:cancel_button, :class=>"s3d-link-button jqmClose s3d-bold")
|
1000
|
+
button(:apply_permissions_button, :id=>"areapermissions_apply_permissions")
|
1001
|
+
|
1002
|
+
# Custom Methods
|
1003
|
+
|
1004
|
+
# Clicks the "Apply permissions" button
|
1005
|
+
def apply_permissions
|
1006
|
+
self.apply_permissions_button
|
1007
|
+
sleep 0.3
|
1008
|
+
#wait_for_ajax(2)
|
1009
|
+
end
|
1010
|
+
|
1011
|
+
# Clicks the "Cancel" button
|
1012
|
+
def cancel
|
1013
|
+
self.cancel_button
|
1014
|
+
self.linger_for_ajax(2)
|
1015
|
+
end
|
1016
|
+
|
1017
|
+
end
|
1018
|
+
|
1019
|
+
# Methods and objects for the Profile Permissions Pop Up--that appears when
|
1020
|
+
# you select the Permissions item for the "My Profile" pages.
|
1021
|
+
module ProfilePermissionsPopUp
|
1022
|
+
|
1023
|
+
include PageObject
|
1024
|
+
|
1025
|
+
select_list(:can_be_seen_by, :id=>"userpermissions_area_general_visibility")
|
1026
|
+
button(:apply_permissions_button, :id=>"userpermissions_apply_permissions")
|
1027
|
+
|
1028
|
+
# Clicks the "Apply permissions" button
|
1029
|
+
def apply_permissions
|
1030
|
+
self.apply_permissions_button
|
1031
|
+
self.linger_for_ajax
|
1032
|
+
end
|
1033
|
+
|
1034
|
+
# Clicks the "Cancel" button
|
1035
|
+
def cancel
|
1036
|
+
self.div(:id=>"userpermissions_container").button(:class=>"s3d-link-button jqmClose s3d-bold").click
|
1037
|
+
end
|
1038
|
+
|
1039
|
+
end
|
1040
|
+
|
1041
|
+
#
|
1042
|
+
module RemoteContentPopUp
|
1043
|
+
|
1044
|
+
include PageObject
|
1045
|
+
|
1046
|
+
end
|
1047
|
+
|
1048
|
+
#
|
1049
|
+
module RemoveContactsPopUp
|
1050
|
+
|
1051
|
+
include PageObject
|
1052
|
+
|
1053
|
+
# Page Objects
|
1054
|
+
button(:remove_contact_button, :id=>"contacts_delete_contact_confirm")
|
1055
|
+
button(:cancel_button, :class=>"s3d-link-button s3d-bold jqmClose")
|
1056
|
+
|
1057
|
+
# Custom Methods...
|
1058
|
+
|
1059
|
+
# Clicks the Remove contact button and waits for the Ajax calls
|
1060
|
+
# to complete.
|
1061
|
+
def remove_contact
|
1062
|
+
self.remove_contact_button
|
1063
|
+
sleep 0.5
|
1064
|
+
self.linger_for_ajax
|
1065
|
+
end
|
1066
|
+
|
1067
|
+
end
|
1068
|
+
|
1069
|
+
#
|
1070
|
+
module RSSFeedPopUp
|
1071
|
+
|
1072
|
+
include PageObject
|
1073
|
+
|
1074
|
+
end
|
1075
|
+
|
1076
|
+
# Methods related to the Save Content Pop Up dialog.
|
1077
|
+
module SaveContentPopUp
|
1078
|
+
|
1079
|
+
include PageObject
|
1080
|
+
|
1081
|
+
select_list(:saving_to, :id=>"savecontent_select")
|
1082
|
+
button(:add_button, :id=>"savecontent_save", :text=>"Add") # Don't use this method for clicking the button. Use the method below.
|
1083
|
+
button(:cancel_button, :class=>"savecontent_close s3d-link-button s3d-bold") # Don't use this method for clicking the button. Use the method below.
|
1084
|
+
|
1085
|
+
# Clicks the Add button and waits for Ajax calls to finish
|
1086
|
+
def add
|
1087
|
+
self.add_button
|
1088
|
+
self.linger_for_ajax
|
1089
|
+
end
|
1090
|
+
|
1091
|
+
# Clicks the Cancel button and waits for Ajax calls to finish
|
1092
|
+
def cancel
|
1093
|
+
self.cancel_button
|
1094
|
+
self.linger_for_ajax
|
1095
|
+
end
|
1096
|
+
|
1097
|
+
end
|
1098
|
+
|
1099
|
+
# The Email message fields in My Messages and the pop up dialog
|
1100
|
+
# that appears when in the Worlds context
|
1101
|
+
# (or when you click the little envelop icon in lists of People).
|
1102
|
+
module SendMessagePopUp
|
1103
|
+
|
1104
|
+
include PageObject
|
1105
|
+
|
1106
|
+
list_item(:no_results, :class=>"as-message")
|
1107
|
+
|
1108
|
+
# The "See all" page element definition.
|
1109
|
+
def see_all_element
|
1110
|
+
current_div.link(:id=>"inbox_back_to_messages")
|
1111
|
+
end
|
1112
|
+
|
1113
|
+
# Clicks the "See all" element on the page.
|
1114
|
+
def see_all
|
1115
|
+
see_all_element.click
|
1116
|
+
end
|
1117
|
+
|
1118
|
+
# Removes the recipient from the To list for the email by
|
1119
|
+
# clicking on the item's "x" button.
|
1120
|
+
def remove_recipient(name)
|
1121
|
+
name_li(name).link(:text=>"×").click
|
1122
|
+
end
|
1123
|
+
|
1124
|
+
# Returns an array containing the listed message recipients
|
1125
|
+
def message_recipients
|
1126
|
+
recipients = []
|
1127
|
+
self.lis(:id=>/as-selection-/).each do |li|
|
1128
|
+
string = li.text
|
1129
|
+
string.gsub!("×\n","")
|
1130
|
+
recipients << string
|
1131
|
+
end
|
1132
|
+
return recipients
|
1133
|
+
end
|
1134
|
+
|
1135
|
+
# Enters the specified text string into the
|
1136
|
+
# "Send this message to" text box, then clicks
|
1137
|
+
# The matching item in the results list box.
|
1138
|
+
def send_this_message_to=(name)
|
1139
|
+
name.split("", 4).each do |letter|
|
1140
|
+
current_div.text_field(:id=>"sendmessage_to_autoSuggest", :class=>"as-input").focus
|
1141
|
+
current_div.text_field(:id=>"sendmessage_to_autoSuggest", :class=>"as-input").send_keys(letter)
|
1142
|
+
self.wait_until { self.div(:id=>"as-results-sendmessage_to_autoSuggest").visible? }
|
1143
|
+
if self.li(:text=>/#{Regexp.escape(name)}/, :id=>/as-result-item-\d+/).present?
|
1144
|
+
self.li(:text=>/#{Regexp.escape(name)}/, :id=>/as-result-item-\d+/).click
|
1145
|
+
break
|
1146
|
+
end
|
1147
|
+
end
|
1148
|
+
end
|
1149
|
+
|
1150
|
+
# The "Subject" text field page element definition.
|
1151
|
+
def subject_element
|
1152
|
+
current_div.text_field(:id=>"comp-subject")
|
1153
|
+
end
|
1154
|
+
|
1155
|
+
# Enters the specified text string into the
|
1156
|
+
# "Subject" field
|
1157
|
+
def subject=(text)
|
1158
|
+
subject_element.set text
|
1159
|
+
end
|
1160
|
+
|
1161
|
+
# The "Body" text area element for the message.
|
1162
|
+
def body_element
|
1163
|
+
current_div.textarea(:id=>"comp-body")
|
1164
|
+
end
|
1165
|
+
|
1166
|
+
# Enters the specified text string into the Body
|
1167
|
+
# field.
|
1168
|
+
def body=(text)
|
1169
|
+
body_element.set text
|
1170
|
+
end
|
1171
|
+
|
1172
|
+
# The "Send message" button element on the page.
|
1173
|
+
def send_message_element
|
1174
|
+
current_div.button(:id=>"send_message")
|
1175
|
+
end
|
1176
|
+
|
1177
|
+
# Clicks the "Send message" button
|
1178
|
+
def send_message
|
1179
|
+
send_message_element.click
|
1180
|
+
self.wait_for_ajax
|
1181
|
+
end
|
1182
|
+
|
1183
|
+
# Clicks the "Don't send" button
|
1184
|
+
def dont_send
|
1185
|
+
current_div.button(:id=>"send_message_cancel").click
|
1186
|
+
self.linger_for_ajax(2)
|
1187
|
+
end
|
1188
|
+
|
1189
|
+
# Clicks the link for accepting a join request inside a Manager's join
|
1190
|
+
# request email
|
1191
|
+
def accept_join_request
|
1192
|
+
self.link(:text=>/=joinrequests/).click
|
1193
|
+
# currently this opens a page in a new tab. So it's best not to use it.
|
1194
|
+
# UGLY!!!
|
1195
|
+
# TODO - Refactor this ugly method. They may change the behavior so that a new tab isn't opened
|
1196
|
+
end
|
1197
|
+
|
1198
|
+
# Private Methods
|
1199
|
+
private
|
1200
|
+
|
1201
|
+
def current_div
|
1202
|
+
begin
|
1203
|
+
self.div(:id=>"sendmessage_dialog_box")
|
1204
|
+
#return active_div
|
1205
|
+
rescue
|
1206
|
+
begin
|
1207
|
+
return active_div
|
1208
|
+
rescue NoMethodError
|
1209
|
+
return self
|
1210
|
+
end
|
1211
|
+
end
|
1212
|
+
end
|
1213
|
+
|
1214
|
+
end
|
1215
|
+
|
1216
|
+
# The Settings Pop Up dialog for Courses/Groups/Research...
|
1217
|
+
module SettingsPopUp
|
1218
|
+
|
1219
|
+
include PageObject
|
1220
|
+
|
1221
|
+
text_field(:title, :id=>"worldsettings_title")
|
1222
|
+
text_area(:description, :id=>"worldsettings_description")
|
1223
|
+
text_area(:tags, :id=>"worldsettings_tags")
|
1224
|
+
select_list(:can_be_discovered_by, :id=>"worldsettings_can_be_found_in")
|
1225
|
+
select_list(:membership, :id=>"worldsettings_membership")
|
1226
|
+
|
1227
|
+
button(:apply_settings_button, :id=>"worldsettings_apply_button")
|
1228
|
+
|
1229
|
+
# Clicks the "Apply settings" button and waits for Ajax calls to complete.
|
1230
|
+
def apply_settings
|
1231
|
+
self.apply_settings_button
|
1232
|
+
self.wait_for_ajax
|
1233
|
+
end
|
1234
|
+
|
1235
|
+
end
|
1236
|
+
|
1237
|
+
# Methods related to the Pop Up for Sharing Content with others.
|
1238
|
+
module ShareWithPopUp
|
1239
|
+
|
1240
|
+
include PageObject
|
1241
|
+
|
1242
|
+
text_field(:share_with_field, :id=>/newsharecontentcontainer\d+/)
|
1243
|
+
|
1244
|
+
# Clicks the arrow for adding a custom message to the share.
|
1245
|
+
def add_a_message
|
1246
|
+
self.span(:id=>"newsharecontent_message_arrow").fire_event('onclick')
|
1247
|
+
end
|
1248
|
+
|
1249
|
+
text_area(:message_text, :id=>"newsharecontent_message")
|
1250
|
+
|
1251
|
+
button(:share, :id=>"sharecontent_send_button")
|
1252
|
+
button(:cancel, :id=>"newsharecontent_cancel")
|
1253
|
+
|
1254
|
+
# Enters the specified name value into the "Share with" field, a character
|
1255
|
+
# at a time, then waits for the search results to return the expected name.
|
1256
|
+
# When the name is found in the results list, it gets clicked on.
|
1257
|
+
def share_with=(name)
|
1258
|
+
|
1259
|
+
name.split("", 5).each do |letter|
|
1260
|
+
self.share_with_field_element.focus
|
1261
|
+
self.share_with_field_element.send_keys(letter)
|
1262
|
+
self.wait_until { self.ul(:class=>"as-list").present? }
|
1263
|
+
if self.li(:text=>/#{Regexp.escape(name)}/, :id=>/as-result-item-\d+/).present?
|
1264
|
+
@browser.li(:text=>/#{Regexp.escape(name)}/, :id=>/as-result-item-\d+/).click
|
1265
|
+
break
|
1266
|
+
end
|
1267
|
+
end
|
1268
|
+
|
1269
|
+
end
|
1270
|
+
|
1271
|
+
# Gonna add the social network validations later
|
1272
|
+
|
1273
|
+
end
|