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.
@@ -0,0 +1,745 @@
1
+ # coding: UTF-8
2
+
3
+ # The Topmost Header menu bar, present on most pages,
4
+ # plus the Footer contents, too. This module also contains
5
+ # references to the notification pop-ups that appear in the upper
6
+ # right.
7
+ module HeaderFooterBar
8
+
9
+ include PageObject
10
+
11
+ # Page Object Definitions
12
+ link(:help, :id=>"help_tab")
13
+ float_menu(:my_dashboard, "You", "My dashboard", "MyDashboard")
14
+ float_menu(:my_messages, "You", "My messages", "MyMessages")
15
+ float_menu(:my_profile, "You", "My profile", "MyProfileBasicInfo")
16
+ float_menu(:my_library, "You", "My library", "MyLibrary")
17
+ float_menu(:my_memberships, "You", "My memberships", "MyMemberships")
18
+ float_menu(:my_contacts, "You", "My contacts", "MyContacts")
19
+ float_menu(:create_a_group, "Create + Collect", "Create a group", "CreateGroups") # Note that this MUST be "create_a_group" because "create_group" is already a method.
20
+ float_menu(:create_a_course, "Create + Collect", "Create a course", "CreateCourses")
21
+ float_menu(:create_a_research_project, "Create + Collect", "Create a research project", "CreateResearch")
22
+ float_menu(:explore_all_categories, "Explore", "Browse all categories", "AllCategoriesPage")
23
+ float_menu(:explore_content,"Explore","Content", "ExploreContent")
24
+ float_menu(:explore_people,"Explore","People", "ExplorePeople")
25
+ float_menu(:explore_groups,"Explore","Groups","ExploreGroups")
26
+ float_menu(:explore_courses,"Explore","Courses","ExploreCourses")
27
+ float_menu(:explore_research,"Explore","Research projects","ExploreResearch")
28
+ alias explore_research_projects explore_research
29
+
30
+ # Don't use this button directly when opening the collector. Instead, use the "toggle_collector" method
31
+ # so that the Collector Widget module will be included in the object's Class.
32
+ # You *can* use this, however, to close the collector.
33
+ button(:collector, :class=>"topnavigation_menuitem_counts_container collector_toggle")
34
+ button(:save, :text=>"Save")
35
+
36
+ link(:explore, :text=>"Explore")
37
+ link(:browse_all_categories, :text=>"Browse all categories")
38
+ text_field(:header_search, :id=>"topnavigation_search_input")
39
+ link(:you, :text=>"You")
40
+ button(:messages_container_button, :id=>"topnavigation_messages_container")
41
+ link(:create_collect, :id=>"navigation_create_and_add_link")
42
+ link(:user_options_name, :id=>"topnavigation_user_options_name")
43
+ link(:help, :id=>"help_tab")
44
+
45
+ link(:see_all, :id=>"topnavigation_search_see_all")
46
+
47
+ # Sign-in Menu items...
48
+ button(:sign_in_menu, :id=>"topnavigation_user_options_login")
49
+ text_field(:username, :id=>"topnavigation_user_options_login_fields_username")
50
+ text_field(:password, :id=>"topnavigation_user_options_login_fields_password")
51
+ button(:sign_in, :id=>"topnavigation_user_options_login_button_login")
52
+ span(:login_error, :id=>"topnav_login_username_error")
53
+ link(:sign_up_link, :id=>"navigation_anon_signup_link")
54
+
55
+ # Footer elements
56
+ div(:footer, :id=>/footercontainer\d+/)
57
+ button(:sakai_OAE_logo, :id=>"footer_logo_button")
58
+ link(:acknowledgements_link, :href=>"/acknowledgements") # :text=>"Created in collaboration with the Sakai Community"
59
+ link(:user_agreement_link, :text=>"User Agreement")
60
+ button(:location_button, :id=>"footer_location")
61
+ button(:language_button, :id=>"footer_language")
62
+ paragraph(:debug_info, :id=>"footer_debug_info")
63
+
64
+ # Custom Methods
65
+
66
+ # The page object for the Explore link the footer. Defined as a custom
67
+ # method using Watir-webdriver, because of issues using PageObject to do it.
68
+ def explore_footer_link
69
+ self.span(:id=>"footer_links_right").link(:text=>"Explore")
70
+ end
71
+
72
+ # Clicks the Explore button in the footer and returns the
73
+ # Page class for the main login page (since that's the page that loads).
74
+ def explore_footer
75
+ explore_footer_link.click
76
+ sleep 1
77
+ self.wait_for_ajax
78
+ LoginPage.new @browser
79
+ end
80
+
81
+ # The page object for the Browse link the footer. Defined as a custom
82
+ # method because of issues using PageObject to do it.
83
+ def browse_footer_link
84
+ self.span(:id=>"footer_links_right").link(:text=>"Browse")
85
+ end
86
+
87
+ # Clicks the Browse button in the footer
88
+ # And returns the AllCategories page class.
89
+ def browse_footer
90
+ browse_footer_link.click
91
+ self.wait_for_ajax
92
+ AllCategoriesPage.new @browser
93
+ end
94
+
95
+ # Clicks the Acknowledgements link in the page Footer.
96
+ def acknowledgements
97
+ self.acknowledgements_link
98
+ sleep 1
99
+ self.wait_for_ajax
100
+ Acknowledgements.new @browser
101
+ end
102
+
103
+ # Clicks the User Agreement link in the page footer.
104
+ def user_agreement
105
+ self.user_agreement_link
106
+ sleep 1
107
+ #wait_for_ajax
108
+ # New Class goes here.new @browser
109
+ end
110
+
111
+ # Clicks the location link in the page footer
112
+ def change_location
113
+ self.location_button
114
+ self.wait_for_ajax
115
+ self.class.class_eval { include AccountPreferencesPopUp }
116
+ end
117
+
118
+ # Clicks the language button in the page footer.
119
+ def change_language
120
+ self.language_button
121
+ self.wait_for_ajax
122
+ self.class.class_eval { include AccountPreferencesPopUp }
123
+ end
124
+
125
+ # A generic link-clicking method. It clicks on a page link with text that
126
+ # matches the supplied string. Since it uses Regex to find a match, the
127
+ # string can be a substring of the desired link's full text.
128
+ #
129
+ # This method should be used as AN ABSOLUTE LAST RESORT, however, since it does not
130
+ # instantiate a new page class. You will have to instantiate
131
+ # the target page class explicitly in the test script itself, if required.
132
+ def click_link(string)
133
+ name_link(string).click
134
+ self.wait_for_ajax
135
+ end
136
+
137
+ # Opens the User Options menu in the header menu bar,
138
+ # clicks the Preferences item, waits for the Account Preferences
139
+ # Pop up dialog to appear, and then includes the AccountPreferencesPopUp
140
+ # module in the currently instantiated Class Object.
141
+ def my_account
142
+ self.link(:id=>"topnavigation_user_options_name").fire_event("onmouseover")
143
+ self.link(:id=>"subnavigation_preferences_link").click
144
+ self.wait_for_ajax
145
+ self.class.class_eval { include AccountPreferencesPopUp }
146
+ end
147
+
148
+ # Logs in with the specified username and password variables.
149
+ # Returns the MyDashboard class object.
150
+ def login(username, password)
151
+ self.div(:id=>"topnavigation_user_options_login_wrapper").fire_event("onmouseover")
152
+ self.text_field(:id=>"topnavigation_user_options_login_fields_username").set username
153
+ self.text_field(:name=>"topnav_login_password").set password
154
+ self.button(:id=>"topnavigation_user_options_login_button_login").click
155
+ sleep 3 # TODO : Make into a wait clause
156
+ if self.button(:id=>"emailverify_continue_button").present?
157
+ self.button(:id=>"emailverify_continue_button").click
158
+ end
159
+ self.linger_for_ajax(2)
160
+ MyDashboard.new @browser
161
+ end
162
+ alias sign_in login
163
+ alias log_in login
164
+
165
+ # Clicks the Sign out command in the user menu in the header bar.
166
+ # returns the LoginPage class object.
167
+ def sign_out
168
+ self.link(:id=>"topnavigation_user_options_name").fire_event("onmouseover")
169
+ self.link(:id=>"subnavigation_logout_link").click
170
+ self.link(:text=>"Explore").wait_until_present
171
+ self.linger_for_ajax(2)
172
+ LoginPage.new @browser
173
+ end
174
+ alias logout sign_out
175
+ alias log_out sign_out
176
+
177
+ # Opens the Create + Add menu in the header bar,
178
+ # clicks on the Add Content item, waits for the Pop Up
179
+ # dialog to appear, then includes the AddContentContainer module
180
+ # in the currently instantiated Class Object.
181
+ def add_content
182
+ self.link(:id=>"navigation_create_and_add_link").fire_event("onmouseover")
183
+ self.link(:text=>"Add content").click
184
+ self.wait_until { self.text.include? "Collected items" }
185
+ self.class.class_eval { include AddContentContainer }
186
+ end
187
+
188
+ def add_collection
189
+
190
+ end
191
+
192
+ # Clicks the Colector icon in the header bar, to either display
193
+ # or hide the collector widget, depending on its current state.
194
+ def toggle_collector
195
+ self.collector
196
+ self.wait_for_ajax
197
+ self.class.class_eval { include CollectorWidget }
198
+ end
199
+
200
+ # Clicks the messages container button
201
+ def messages_container
202
+ self.messages_container_button
203
+ self.wait_for_ajax
204
+ self.class.class_eval { include MessagesContainerPopUp }
205
+ end
206
+
207
+ # Clicks the "Sign up" link. Returns the CreateNewAccount class object
208
+ def sign_up
209
+ self.sign_up_link
210
+ self.button(:id=>"save_account").wait_until_present
211
+ sleep 3
212
+ CreateNewAccount.new @browser
213
+ end
214
+
215
+ end
216
+
217
+ # This is the Header that appears in the Worlds context,
218
+ # So it appears for Courses, Groups, and Research
219
+ module HeaderBar
220
+
221
+ include PageObject
222
+
223
+ # Page Object Definitions
224
+ button(:join_group_button, :id=>/joinrequestbuttons_join_.*/)
225
+ button(:request_to_join_group_button, :id=>/joinrequestbuttons_request_.*/)
226
+ button(:request_pending_button, :id=>/joinrequestbuttons_pending_.*/)
227
+ button(:message_button, :text=>"Message")
228
+
229
+ # Custom Methods
230
+
231
+ # Returns the text contents of the page title div
232
+ def page_title
233
+ self.div(:id=>"s3d-page-container").div(:class=>"s3d-contentpage-title").text
234
+ end
235
+
236
+ # Clicks the "Join group" button.
237
+ def join_group
238
+ self.join_group_button
239
+ self.wait_until { notification_element.exists? }
240
+ end
241
+
242
+ # Clicks the "Request to join group" button
243
+ def request_to_join_group
244
+ self.request_to_join_group_button
245
+ self.wait_until { notification_element.exists? }
246
+ end
247
+
248
+ # Clicks the Message button in the page header (not the
249
+ # Header bar, but just below that), waits for the Message Pop Up
250
+ # dialog to load, and then includes the SendMessagePopUp
251
+ # module in the currently instantiated Class Object.
252
+ def message
253
+ self.message_button
254
+ self.wait_until { self.text.include? "Send Message" }
255
+ self.class.class_eval { include SendMessagePopUp }
256
+ end
257
+
258
+ # Clicks the Permissions button in the page header (below the
259
+ # Header bar, though), clicks "Add Content", then waits for the
260
+ # Add Content stuff to load, then includes the
261
+ # AddContentContainer module in the object's Class.
262
+ def add_content
263
+ self.button(:id=>"entity_group_permissions").click
264
+ self.button(:text=>"Add content").click
265
+ self.wait_until { self.text.include? "Collected items" }
266
+ self.class.class_eval { include AddContentContainer }
267
+ end
268
+
269
+ # Clicks the Permissions button in the page's header (distinct from
270
+ # the black header bar, mind you), clicks "Manage participants",
271
+ # waits for the Contacts and Memberships stuff to load, then
272
+ # includes the ManageParticipants module in the Class of the object
273
+ # calling the method.
274
+ def manage_participants
275
+ self.button(:id=>"entity_group_permissions").click
276
+ self.button(:text=>"Manage participants").click
277
+ self.wait_until { self.text.include? "My contacts and memberships" }
278
+ self.class.class_eval { include ManageParticipants }
279
+ end
280
+
281
+ # Clicks the "Join requests" item in the settings menu.
282
+ def join_requests
283
+ self.button(:id=>"entity_group_permissions").click
284
+ self.button(:id=>"ew_group_join_requests_link").click
285
+ self.wait_until { self.text.include? "Pending requests to join" }
286
+ self.class.class_eval { include PendingRequestsPopUp }
287
+ end
288
+
289
+ # Clicks the Permissions button in the page's header (distinct from
290
+ # the black header bar, mind you), clicks "Settings",
291
+ # waits for the Settings stuff to load, then
292
+ # includes the SettingsPopUp module in the Class of the object
293
+ # calling the method.
294
+ def settings
295
+ self.button(:id=>"entity_group_permissions").click
296
+ self.button(:text=>"Settings").click
297
+ sleep 0.4
298
+ self.wait_for_ajax
299
+ self.class.class_eval { include SettingsPopUp }
300
+ end
301
+
302
+ # Clicks the Permissions button in the page's header (distinct from
303
+ # the black header bar, mind you), clicks "Categories",
304
+ # waits for the Categories Pop Up to load, then
305
+ # includes the AddRemoveCategories module in the Class of the object
306
+ # calling the method.
307
+ def categories
308
+ self.button(:id=>"entity_group_permissions").click
309
+ self.button(:text=>"Categories").click
310
+ self.wait_until { self.text.include? "Assign a category" }
311
+ self.class.class_eval { include AddRemoveCategories }
312
+ end
313
+
314
+ # Clicks the down arrow next to the Avatar picture in the Page Header
315
+ # (not the Header bar), clicks the option to change the picture,
316
+ # then includes the ChangePicturePopup in the Class of the object
317
+ # calling the method.
318
+ def change_picture
319
+ self.div(:class=>"entity_profile_picture_down_arrow").fire_event("onclick")
320
+ self.link(:id=>"changepic_container_trigger").click
321
+ self.class.class_eval { include ChangePicturePopup }
322
+ end
323
+
324
+ end
325
+
326
+ # Modules for the most robust Left Menu Bar--the one that has context menus
327
+ # attached to each of the bar's items, and is found in the context of a particular
328
+ # Course, Group, or Research.
329
+ module LeftMenuBar
330
+
331
+ include PageObject
332
+
333
+ # Page Object Definitions
334
+ # ...none yet
335
+
336
+ # Custom Methods
337
+
338
+ # Use this to click left menu items that refer to multi-paged documents.
339
+ # It expands the menu to display the document's sub-pages.
340
+ def expand(name)
341
+ self.div(:id=>"lhnavigation_container").link(:text=>name).click
342
+ end
343
+
344
+ # Changes the title of the specified page ("from_string")
345
+ # to the string value specified by to_string.
346
+ def change_title_of(from_string, to_string)
347
+ self.link(:class=>/lhnavigation_page_title_value/, :text=>from_string).hover
348
+ self.wait_for_ajax #.wait_until { self.link(:class=>/lhnavigation_page_title_value/, :text=>from_string).parent.div(:class=>"lhnavigation_selected_submenu_image").visible? }
349
+ self.div(:class=>"lhnavigation_selected_submenu_image").hover
350
+ self.execute_script("$('#lhnavigation_submenu').css({left:'300px', top:'300px', display: 'block'})")
351
+ self.wait_for_ajax #.wait_until { self.link(:id=>"lhavigation_submenu_edittitle").visible? }
352
+ self.link(:id=>"lhavigation_submenu_edittitle").click
353
+ self.link(:class=>/lhnavigation_page_title_value/, :text=>from_string).parent.text_field(:class=>"lhnavigation_change_title").set("#{to_string}\n")
354
+ end
355
+
356
+ alias change_title change_title_of
357
+
358
+ # Deletes the page specified by page_name.
359
+ def delete_page(page_name)
360
+ self.link(:class=>/lhnavigation_page_title_value/, :text=>page_name).fire_event("onmouseover")
361
+ self.wait_for_ajax #.wait_until { self.link(:class=>/lhnavigation_page_title_value/, :text=>page_name).parent.div(:class=>"lhnavigation_selected_submenu_image").visible? }
362
+ self.div(:class=>"lhnavigation_selected_submenu_image").hover
363
+ self.execute_script("$('#lhnavigation_submenu').css({left:'300px', top:'300px', display: 'block'})")
364
+ self.wait_for_ajax #.wait_until { self.link(:id=>"lhavigation_submenu_edittitle").visible? }
365
+ self.link(:id=>"lhavigation_submenu_deletepage").click
366
+ self.wait_for_ajax
367
+ self.class.class_eval { include DeletePagePopUp }
368
+ end
369
+
370
+ # Opens the Permissions Pop Up for the specified Page.
371
+ def permissions_for_page(page_name)
372
+ self.link(:class=>/lhnavigation_page_title_value/, :text=>page_name).fire_event("onmouseover")
373
+ self.wait_until { self.link(:class=>/lhnavigation_page_title_value/, :text=>page_name).parent.div(:class=>"lhnavigation_selected_submenu_image").visible? }
374
+ self.div(:class=>"lhnavigation_selected_submenu_image").hover
375
+ self.execute_script("$('#lhnavigation_submenu').css({left:'328px', top:'349px', display: 'block'})")
376
+ self.wait_until { self.link(:id=>"lhavigation_submenu_edittitle").visible? }
377
+ self.link(:id=>"lhnavigation_submenu_permissions").click
378
+ sleep 0.2
379
+ self.wait_for_ajax
380
+ self.class.class_eval { include PermissionsPopUp }
381
+ end
382
+
383
+ alias permissions_of_page permissions_for_page
384
+ alias page_permissions permissions_for_page
385
+
386
+ # Opens the Profile Details for the specified Page by
387
+ # opening the page's drop-down menu in the left menu bar,
388
+ # clicking "View Profile", and then switching to the new
389
+ # browser tab/window that gets opened.
390
+ def view_profile_of_page(page_name)
391
+ self.link(:class=>/lhnavigation_page_title_value/, :text=>page_name).fire_event("onmouseover")
392
+ self.wait_for_ajax #.wait_until { self.link(:class=>/lhnavigation_page_title_value/, :text=>page_name).parent.div(:class=>"lhnavigation_selected_submenu_image").visible? }
393
+ self.div(:class=>"lhnavigation_selected_submenu_image").hover
394
+ self.execute_script("$('#lhnavigation_submenu').css({left:'328px', top:'349px', display: 'block'})")
395
+ self.wait_for_ajax #.wait_until { self.link(:id=>"lhavigation_submenu_edittitle").visible? }
396
+ self.link(:id=>"lhnavigation_submenu_profile").click
397
+ self.wait_for_ajax #.button(:title=>"Show debug info").wait_until_present
398
+ self.window(:title=>"rSmart | Content Profile").use
399
+ ContentDetailsPage.new self
400
+ end
401
+
402
+ alias view_profile_for_page view_profile_of_page
403
+ alias view_page_profile view_profile_of_page
404
+
405
+ # Clicks the "Add a new area" button.
406
+ def add_new_area
407
+ self.button(:id=>"group_create_new_area", :class=>"s3d-button s3d-header-button s3d-popout-button").click
408
+ self.wait_for_ajax
409
+ self.class.class_eval { include AddAreasPopUp }
410
+ end
411
+
412
+ alias add_a_new_area add_new_area
413
+ alias add_new_page add_new_area
414
+
415
+ # Returns an array containing the Course/Group area/page titles.
416
+ def public_pages
417
+ list = []
418
+ self.div(:id=>"lhnavigation_public_pages").links.each do |link|
419
+ list << link.text
420
+ end
421
+ return list
422
+ end
423
+
424
+ alias pages public_pages
425
+ alias areas public_pages
426
+
427
+ # Returns true if the specified page name appears in the list of items in the
428
+ # Left menu bar. Returns false if the specified menu can't be found.
429
+ # TODO - should be re-written to work more like the typical Ruby
430
+ # question-mark method: Should be applied to the string being tested, not the
431
+ # browser object.
432
+ def menu_available?(page_name)
433
+ self.link(:class=>/lhnavigation_page_title_value/, :text=>page_name).fire_event("onmouseover")
434
+ if self.link(:class=>/lhnavigation_page_title_value/, :text=>page_name).parent.div(:class=>"lhnavigation_selected_submenu_image").visible?
435
+ return true
436
+ else
437
+ return false
438
+ end
439
+ end
440
+
441
+ # Private methods...
442
+ private
443
+
444
+ def data_sakai_ref
445
+ hash = {}
446
+ current_id=""
447
+ self.div(:id=>"lhnavigation_container").lis.each do |li|
448
+ hash.store(li.text, li.html[/(?<=data-sakai-ref=").+-id\d+/])
449
+ end
450
+ hash.delete_if { |key, value| key == "" }
451
+ hash.each do |key, value|
452
+ next if self.div(:id=>value).exist? == false
453
+ next if self.div(:id=>value).visible? == false
454
+ if self.div(:id=>value).visible?
455
+ current_id = value
456
+ end
457
+ end
458
+ return current_id
459
+ end
460
+
461
+ end
462
+
463
+ # The left menu when on any of the "Explore" pages.
464
+ module LeftMenuBarSearch
465
+
466
+ include PageObject
467
+
468
+ # Page Object Definitions...
469
+ navigating_link(:all_types, "All types", "ExploreAll")
470
+ navigating_link(:content, "Content", "ExploreContent")
471
+ navigating_link(:people, "People", "ExplorePeople")
472
+ navigating_link(:groups, "Groups", "ExploreGroups")
473
+ navigating_link(:courses, "Courses", "ExploreCourses")
474
+ navigating_link(:research_projects, "Research projects", "ExploreResearch")
475
+
476
+ end
477
+
478
+ # The Left Menu Bar when in the context of the "You" pages
479
+ module LeftMenuBarYou
480
+
481
+ include PageObject
482
+
483
+ # Page Object Definitions
484
+ navigating_link(:basic_information, "Basic Information", "MyProfileBasicInfo")
485
+ navigating_link(:about_me, "About Me", "MyProfileAboutMe")
486
+ navigating_link(:online, "Online", "MyProfileOnline")
487
+ navigating_link(:contact_information, "Contact Information", "MyProfileContactInfo")
488
+ alias contact_info contact_information
489
+ navigating_link(:publications, "Publications", "MyProfilePublications")
490
+
491
+ permissions_menu(:about_me_permissions, "About Me")
492
+ permissions_menu(:online_permissions, "Online")
493
+ permissions_menu(:contact_information_permissions, "Contact Information")
494
+ permissions_menu(:publications_permissions, "Publications")
495
+
496
+ div(:profile_pic_arrow, :class=>"s3d-dropdown-menu-arrow entity_profile_picture_down_arrow")
497
+
498
+ link(:inbox_link, :text=>"Inbox")
499
+ link(:invitations_link, :text=>"Invitations")
500
+ link(:sent_link, :text=>"Sent")
501
+ link(:trash_link, :text=>"Trash")
502
+
503
+ # Custom Methods
504
+
505
+ # Clicks the Inbox link in the left-hand menu. Waits for the new page to
506
+ # load.
507
+ def inbox
508
+ self.inbox_link
509
+ sleep 1
510
+ self.wait_for_ajax
511
+ end
512
+
513
+ # Clicks the Invitations link in the left-hand menu. Waits for the new page to
514
+ # load.
515
+ def invitations
516
+ self.invitations_link
517
+ sleep 1
518
+ self.wait_for_ajax
519
+ end
520
+
521
+ # Clicks the Sent link in the left-hand menu. Waits for the new page to
522
+ # load.
523
+ def sent
524
+ self.sent_link
525
+ sleep 1
526
+ self.wait_for_ajax
527
+ end
528
+
529
+ # Clicks the Trash link in the left-hand menu. Waits for the new page to
530
+ # load.
531
+ def trash
532
+ self.trash_link
533
+ sleep 1
534
+ self.wait_for_ajax
535
+ end
536
+
537
+ # The div for the "Lock icon" next to the My messages menu
538
+ def my_messages_lock_icon
539
+ self.div(:text=>"My Messages").div(:class=>"lhnavigation_private")
540
+ end
541
+
542
+ # Expands/Collapses the My Messages Tree
543
+ def show_hide_my_messages_tree
544
+ self.div(:id=>"lhnavigation_container").link(:text=>"My Messages").click
545
+ end
546
+
547
+ # Opens the Pop Up dialog for changing the Avatar image for the
548
+ # current page.
549
+ def change_picture
550
+ profile_pic_arrow_element.fire_event("onclick")
551
+ self.link(:id=>"changepic_container_trigger").click
552
+ self.class.class_eval { include ChangePicturePopUp }
553
+ end
554
+
555
+ # Returns the number displayed in the left menu for the total
556
+ # unread messages. If there is no number displayed there, this
557
+ # method will return a zero. Note that the number returned is
558
+ # an Integer and not a String.
559
+ def unread_message_count
560
+ count_div = self.div(:text=>/My Messages/, :class=>"lhnavigation_item_content").div(:class=>"lhnavigation_levelcount")
561
+ if count_div.present?
562
+ count_div.text.to_i
563
+ else
564
+ 0
565
+ end
566
+ end
567
+
568
+ # Returns the number displayed in the left menu for the Inbox's
569
+ # unread messages. If there is no number displayed there, this
570
+ # method will return a zero. Note that the number returned is
571
+ # an Integer and not a String.
572
+ def unread_inbox_count
573
+ count_div = self.div(:text=>/Inbox/, :class=>"lhnavigation_subnav_item_content").div(:class=>"lhnavigation_sublevelcount")
574
+ if count_div.present?
575
+ count_div.text.to_i
576
+ else
577
+ 0
578
+ end
579
+ end
580
+
581
+ # Returns the number displayed in the left menu for the Invitation's
582
+ # unread messages. If there is no number displayed there, this
583
+ # method will return a zero. Note that the number returned is
584
+ # an Integer and not a String.
585
+ def unread_invitations_count
586
+ count_div = self.div(:text=>/Invitations/, :class=>"lhnavigation_subnav_item_content").div(:class=>"lhnavigation_sublevelcount")
587
+ if count_div.present?
588
+ count_div.text.to_i
589
+ else
590
+ 0
591
+ end
592
+ end
593
+
594
+ def my_library_count
595
+ count_div = name_link("My library").parent.div(:class=>"lhnavigation_levelcount")
596
+ count_div.present? ? count_div.text.to_i : 0
597
+ end
598
+
599
+ def my_contacts_count
600
+ count_div = self.div()
601
+ if count_div.present?
602
+ count_div.text.to_i
603
+ else
604
+ 0
605
+ end
606
+ end
607
+
608
+ end
609
+
610
+ # The left menu bar when creating Groups, Courses, or Research
611
+ module LeftMenuBarCreateWorlds
612
+
613
+ include PageObject
614
+
615
+ # Page Object Definitions
616
+ navigating_link(:group, "Group", "CreateGroups")
617
+ navigating_link(:course, "Course", "MyProfileCategories")
618
+ navigating_link(:research, "Research", "MyProfileAboutMe")
619
+
620
+ end
621
+
622
+ #
623
+ module PageRevisionsBar
624
+
625
+ include PageObject
626
+
627
+ end
628
+
629
+ # The Search field that will appear above some list pages
630
+ module SearchBar
631
+
632
+ include PageObject
633
+
634
+ # Custom Methods...
635
+
636
+ # Enters the specified text string in the search field.
637
+ # Includes a trailing line feed character so that the search
638
+ # will occur immediately, meaning you don't have to include a
639
+ # line in the script for clicking on the search button.
640
+ def search_for=(text)
641
+ self.text_field(:id=>"search_text").set("#{text}\n")
642
+ self.wait_for_ajax
643
+ end
644
+ alias search= search_for=
645
+ alias search search_for=
646
+ alias search_for search_for=
647
+ alias find search_for=
648
+ alias find= search_for=
649
+
650
+ end
651
+
652
+ # Methods for the 3 buttons that appear above all Document-type "Areas" in
653
+ # Groups/Courses.
654
+ module DocButtons
655
+
656
+ include PageObject
657
+
658
+ # Page Objects
659
+ button(:edit_page_button, :id=>"sakaidocs_editpage")
660
+ button(:add_page_button, :id=>"sakaidocs_addpage_top")
661
+ button(:page_revisions_button, :id=>"sakaidocs_revisions")
662
+
663
+ # Custom Methods...
664
+
665
+ # Clicks the Edit Page button.
666
+ def edit_page
667
+ self.back_to_top
668
+ edit_page_button
669
+ self.wait_for_ajax
670
+ self.class.class_eval { include DocumentWidget }
671
+ end
672
+
673
+ # Clicks the Add Page button, then enters the text string
674
+ # into the page title field, followed by a line feed.
675
+ def add_page(text)
676
+ self.back_to_top
677
+ add_page_button
678
+ self.wait_for_ajax
679
+ self.send_keys text + "\n"
680
+ end
681
+
682
+ # Clicks the Page Revisions button.
683
+ def page_revisions
684
+ self.back_to_top
685
+ page_revisions_button
686
+ self.wait_for_ajax
687
+
688
+ end
689
+
690
+ # Private methods...
691
+ private
692
+
693
+ # The generic method for editing widget settings. DO NOT USE!
694
+ def widget_settings
695
+ # jQuery
696
+ click_settings=%|$("#context_settings").trigger("mousedown");|
697
+
698
+ # watir-webdriver
699
+ edit_page
700
+ open_widget_menu
701
+ self.execute_script(click_settings)
702
+ self.wait_for_ajax
703
+ end
704
+
705
+ # The generic method for removing widgets. DO NOT USE!
706
+ def remove_widget
707
+ # JQuery
708
+ jq_remove = %|$("#context_remove").trigger("mousedown");|
709
+
710
+ # watir-webdriver
711
+ self.edit_page
712
+ self.open_widget_menu
713
+ self.execute_script(jq_remove)
714
+ self.wait_for_ajax
715
+ end
716
+
717
+ # The generic method for editing widget wrappings. DO NOT USE!
718
+ def widget_wrapping
719
+
720
+ #jQuery
721
+ jq_wrapping = %|$("#context_appearance_trigger").trigger("mousedown");|
722
+
723
+ #watir-webdriver
724
+ edit_page
725
+ open_widget_menu
726
+ self.execute_script(jq_wrapping)
727
+ self.wait_for_ajax
728
+ self.class.class_eval { include AppearancePopUp }
729
+ end
730
+
731
+ # The generic method for opening the widget menu. DO NOT USE!
732
+ def open_widget_menu(number=0)
733
+ # jQuery commands
734
+ click_widget=%|tinyMCE.get("elm1").selection.select(tinyMCE.get("elm1").dom.select('.widget_inline')[#{number}]);|
735
+ node_change=%|tinyMCE.get("elm1").nodeChanged();|
736
+
737
+ # watir-webdriver
738
+ self.wait_for_ajax
739
+ self.execute_script(click_widget)
740
+ self.wait_for_ajax
741
+ self.execute_script(node_change)
742
+ self.wait_for_ajax
743
+ end
744
+
745
+ end