sakai-cle-test-api 0.0.2

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 ADDED
@@ -0,0 +1,7 @@
1
+ source "http://rubygems.org"
2
+
3
+ gem 'kuali-sakai-common-lib'
4
+ gem 'watir-webdriver'
5
+ gem 'selenium-webdriver'
6
+ gem 'page-object'
7
+ gem 'rake'
@@ -0,0 +1,44 @@
1
+ # Sakai CLE Functional Testing API
2
+
3
+ ## Description:
4
+
5
+ This is the development project for the Sakai CLE Functional Testing API gem for Ruby.
6
+
7
+ This API provides a framework for interacting with web sites for Sakai-OAE, using
8
+ Ruby and Watir-webdriver--but without needing to know either in detail.
9
+
10
+ ## Requirements:
11
+
12
+ ### Ruby 1.9.2 or higher
13
+
14
+ ### Ruby Gems:
15
+ [Watir-Webdriver](http://www.watirwebdriver.com)
16
+ [Page-Object](https://github.com/cheezy/page-object)
17
+
18
+ If you're just going to use the API for testing, then simply install it as you would any other Ruby gem: `gem install sakai-cle-test-api`
19
+
20
+ This repo is here if you're going to take part in extending the capabilities of the gem.
21
+
22
+ ## A Basic Usage Example for CLE:
23
+
24
+ ````ruby
25
+ #!/usr/bin/env ruby
26
+ require 'sakai-cle-test-api'
27
+
28
+ # create an instance of the SakaiCLE class, providing your test browser and the URL of
29
+ # The Sakai CLE welcome/login page...
30
+ sakai = SakaiCLE.new(:chrome, "https://cle-1.qa.rsmart.com/xsl-portal")
31
+
32
+ # Log in with your test user and password...
33
+ workspace = sakai.login("username", "password")
34
+ ````
35
+
36
+ ## Contribute
37
+
38
+ * Fork the project.
39
+ * Test drive your feature addition or bug fix. Adding specs is important and I will not accept a pull request that does not have tests.
40
+ * Make sure you describe your new feature with a cucumber scenario.
41
+ * Make sure you provide RDoc comments for any new public method you add. Remember, others will be using this gem.
42
+ * Commit, do not mess with Rakefile, version, or ChangeLog.
43
+ (if you want to have your own version, that is fine but bump version in a commit by itself I can ignore when I pull)
44
+ * Send me a pull request. Bonus points for topic branches.
@@ -0,0 +1,33 @@
1
+ require 'kuali-sakai-common-lib'
2
+ require 'watir-webdriver'
3
+ require 'page-object'
4
+ require 'cgi'
5
+
6
+ require 'sakai-cle-test-api/admin_page_elements'
7
+ require 'sakai-cle-test-api/app_functions'
8
+ require 'sakai-cle-test-api/common_page_elements'
9
+ require 'sakai-cle-test-api/site_page_elements'
10
+
11
+ # Initialize this class at the start of your test cases to
12
+ # open the specified test browser at the specified Sakai welcome page URL.
13
+ #
14
+ # The initialization will return the LoginPage class object as well as
15
+ # create the @browser variable used throughout the page classes.
16
+ class SakaiCLE
17
+
18
+ attr_reader :browser
19
+
20
+ def initialize(web_browser, url)
21
+
22
+ @url = url
23
+ @browser = Watir::Browser.new web_browser
24
+ @browser.window.resize_to(1400,900)
25
+ @browser.goto @url
26
+ @browser.button(:id=>"footer_logo_button").wait_until_present
27
+
28
+ $frame_index = 0 # TODO - Need to remove this and all dependent code.
29
+
30
+ Login.new @browser
31
+ end
32
+
33
+ end
@@ -0,0 +1,1462 @@
1
+ # Navigation links in Sakai's non-site pages
2
+ #
3
+ # == Synopsis
4
+ #
5
+ # Defines all objects in Sakai Pages that are found in the
6
+ # context of the Admin user, in "My Workspace". No classes in this
7
+ # script should refer to pages that appear in the context of
8
+ # a particular Site, even though, as in the case of Resources,
9
+ # Announcements, and Help, the page may exist in both contexts.
10
+ #
11
+ # Most classes use the PageObject gem
12
+ # to create methods to interact with the objects on the pages.
13
+ #
14
+ # Author :: Abe Heward (aheward@rsmart.com)
15
+
16
+ # Page-object is the gem that parses each of the listed objects.
17
+ # For an introduction to the tool, written by the author, visit:
18
+ # http://www.cheezyworld.com/2011/07/29/introducing-page-object-gem/
19
+ #
20
+ # For more extensive detail, visit:
21
+ # https://github.com/cheezy/page-object/wiki/page-object
22
+ #
23
+ # Also, see the bottom of this script for a Page Class template for
24
+ # copying when you create a new class.
25
+
26
+ #require 'page-object'
27
+ #require File.dirname(__FILE__) + '/app_functions.rb'
28
+
29
+ #================
30
+ # Aliases Pages
31
+ #================
32
+
33
+ # The Aliases page - "icon-sakai-aliases", found in the Administration Workspace
34
+ class Aliases
35
+
36
+ include PageObject
37
+ include ToolsMenu
38
+
39
+ in_frame(:index=>0) do |frame|
40
+ link(:new_alias, :text=>"New Alias", :frame=>frame)
41
+ text_field(:search_field, :id=>"search", :frame=>frame)
42
+ link(:search_button, :text=>"Search", :frame=>frame)
43
+ select_list(:select_page_size, :id=>"selectPageSize", :frame=>frame)
44
+ button(:next, :name=>"eventSubmit_doList_next", :frame=>frame)
45
+ button(:last, :name=>"eventSubmit_doList_last", :frame=>frame)
46
+ button(:previous, :name=>"eventSubmit_doList_prev", :frame=>frame)
47
+ button(:first, :name=>"eventSubmit_doList_first", :frame=>frame)
48
+ end
49
+
50
+ end
51
+
52
+ # The Page that appears when you create a New Alias
53
+ class AliasesCreate
54
+
55
+ include PageObject
56
+ include ToolsMenu
57
+
58
+ in_frame(:class=>"portletMainIframe") do |frame|
59
+ text_field(:alias_name, :id=>"id", :frame=>frame)
60
+ text_field(:target, :id=>"target", :frame=>frame)
61
+ button(:save, :name=>"eventSubmit_doSave", :frame=>frame)
62
+ button(:cancel, :name=>"eventSubmit_doCancel", :frame=>frame)
63
+
64
+ end
65
+
66
+ end
67
+
68
+ # Page for editing an existing Alias record
69
+ class EditAlias
70
+
71
+ include PageObject
72
+ include ToolsMenu
73
+
74
+ in_frame(:class=>"portletMainIframe") do |frame|
75
+ link(:remove_alias, :text=>"Remove Alias", :frame=>frame)
76
+ text_field(:target, :id=>"target", :frame=>frame)
77
+ button(:save, :name=>"eventSubmit_doSave", :frame=>frame)
78
+ button(:cancel, :name=>"eventSubmit_doCancel", :frame=>frame)
79
+
80
+ end
81
+
82
+ end
83
+
84
+
85
+ #================
86
+ # Login Pages
87
+ #================
88
+
89
+ # This is the page where users log in to the site.
90
+ class Login
91
+
92
+ include ToolsMenu
93
+
94
+ def search_public_courses_and_projects
95
+ self.frame(:index=>0).link(:text=>"Search Public Courses and Projects").click
96
+ SearchPublic.new(@browser)
97
+ end
98
+
99
+ # Logs in to Sakai using the
100
+ # specified credentials. Then it
101
+ # instantiates the MyWorkspace class.
102
+ def login(username, password)
103
+ frame = self.frame(:id, "ifrm")
104
+ frame.text_field(:id, "eid").set username
105
+ frame.text_field(:id, "pw").set password
106
+ frame.form(:method, "post").submit
107
+ $frame_index=0
108
+ MyWorkspace.new(@browser)
109
+ end
110
+ alias log_in login
111
+ alias sign_in login
112
+
113
+ end
114
+
115
+ # The page where you search for public courses and projects.
116
+ class SearchPublic
117
+
118
+ include ToolsMenu
119
+
120
+ def home
121
+ @browser.frame(:index=>0).link(:text=>"Home").click
122
+ Login.new(@browser)
123
+ end
124
+
125
+ def search_for=(string)
126
+ @browser.frame(:index=>0).text_field(:id=>"searchbox").set(Regexp.escape(string))
127
+ end
128
+
129
+ def search_for_sites
130
+ @browser.frame(:index=>0).button(:value=>"Search for Sites").click
131
+ SearchPublicResults.new(@browser)
132
+ end
133
+
134
+ end
135
+
136
+ # The page showing the results list of Site matches to a search of public sites/projects.
137
+ class SearchPublicResults
138
+
139
+ include ToolsMenu
140
+
141
+ def click_site(site_name)
142
+ @browser.frame(:index=>0).link(:text=>site_name).click
143
+ SiteSummaryPage.new(@browser)
144
+ end
145
+
146
+ def home
147
+ @browser.frame(:id=>"ifrm").link(:text=>"Home").click
148
+ Login.new(@browser)
149
+ end
150
+
151
+ end
152
+
153
+ # The page that appears when you click a Site in the Site Search Results page, when not logged
154
+ # in to Sakai.
155
+ class SiteSummaryPage
156
+
157
+ include ToolsMenu
158
+
159
+ def return_to_list
160
+ @browser.frame(:index=>0).button(:value=>"Return to List").click
161
+ SearchPublicResults.new(@browser)
162
+ end
163
+
164
+ def syllabus_attachments
165
+ links = []
166
+ @browser.frame(:id=>"ifrm").links.each do |link|
167
+ if link.href=~/Syllabus/
168
+ links << link.text
169
+ end
170
+ end
171
+ return links
172
+ end
173
+
174
+ end
175
+
176
+
177
+ #================
178
+ # Profile Pages
179
+ #================
180
+
181
+ #
182
+ class Profile
183
+
184
+ include PageObject
185
+ include ToolsMenu
186
+
187
+ def edit_my_profile
188
+ frm.link(:text=>"Edit my Profile").click
189
+ EditProfile.new(@browser)
190
+ end
191
+
192
+ def show_my_profile
193
+ frm.link(:text=>"Show my Profile").click
194
+ Profile.new @browser
195
+ end
196
+
197
+ def photo
198
+ source = frm.image(:id=>"profileForm:image1").src
199
+ return source.split("/")[-1]
200
+ end
201
+
202
+ def email
203
+ frm.link(:id=>"profileForm:email").text
204
+ end
205
+
206
+ end
207
+
208
+ #
209
+ class EditProfile
210
+
211
+ include PageObject
212
+ include ToolsMenu
213
+
214
+ def save
215
+ frm.button(:value=>"Save").click
216
+ Profile.new(@browser)
217
+ end
218
+
219
+ def picture_file=(filename)
220
+ frm.file_field(:name=>"editProfileForm:uploadFile.uploadId").set(File.expand_path(File.dirname(__FILE__)) + "/../../data/sakai-cle-test-api/" + filename)
221
+ end
222
+
223
+ in_frame(:class=>"portletMainIframe") do |frame|
224
+ text_field(:first_name, :id=>"editProfileForm:first_name", :frame=>frame)
225
+ text_field(:last_name, :id=>"editProfileForm:lname", :frame=>frame)
226
+ text_field(:nickname, :id=>"editProfileForm:nickname", :frame=>frame)
227
+ text_field(:position, :id=>"editProfileForm:position", :frame=>frame)
228
+ text_field(:email, :id=>"editProfileForm:email", :frame=>frame)
229
+ radio_button(:upload_new_picture, :value=>"pictureUpload", :frame=>frame)
230
+ end
231
+ end
232
+
233
+
234
+ #================
235
+ # Profile2 Pages
236
+ #================
237
+
238
+ module Profile2Nav
239
+
240
+ def preferences
241
+ frm.link(:class=>"icon preferences").click
242
+ Profile2Preferences.new @browser
243
+ end
244
+
245
+ def privacy
246
+ frm.link(:text=>"Privacy").click
247
+ Profile2Privacy.new @browser
248
+ end
249
+
250
+ def my_profile
251
+ frm.link(:text=>"My profile").click
252
+ Profile2.new(@browser)
253
+ end
254
+
255
+ def connections
256
+ frm.link(:class=>"icon connections").click
257
+ Profile2Connections.new @browser
258
+ end
259
+
260
+ def pictures
261
+ frm.link(:text=>"Pictures").click
262
+ Profile2Pictures.new @browser
263
+ end
264
+
265
+ def messages
266
+ frm.link(:text=>"Messages").click
267
+ Profile2Messages.new @browser
268
+ end
269
+
270
+ def search_for_connections
271
+ frm.link(:class=>"icon search").click
272
+ Profile2Search.new @browser
273
+ end
274
+
275
+ end
276
+
277
+ #
278
+ class Profile2
279
+
280
+ include PageObject
281
+ include ToolsMenu
282
+ include Profile2Nav
283
+
284
+ def edit_basic_info
285
+ frm.div(:id=>"mainPanel").span(:text=>"Basic Information").fire_event("onmouseover")
286
+ frm.div(:id=>"mainPanel").link(:href=>/myInfo:editButton/).click
287
+ sleep 0.5
288
+ Profile2.new @browser
289
+ end
290
+
291
+ def edit_contact_info
292
+ frm.div(:id=>"mainPanel").span(:text=>"Contact Information").fire_event("onmouseover")
293
+ frm.div(:id=>"mainPanel").link(:href=>/myContact:editButton/).click
294
+ sleep 0.5
295
+ Profile2.new @browser
296
+ end
297
+
298
+ def edit_staff_info
299
+ frm.div(:id=>"mainPanel").span(:text=>"Staff Information").fire_event("onmouseover")
300
+ frm.div(:id=>"mainPanel").link(:href=>/myStaff:editButton/).click
301
+ sleep 0.5
302
+ Profile2.new @browser
303
+ end
304
+
305
+ def edit_student_info
306
+ frm.div(:id=>"mainPanel").span(:text=>"Student Information").fire_event("onmouseover")
307
+ frm.div(:id=>"mainPanel").link(:href=>/myStudent:editButton/).click
308
+ sleep 0.5
309
+ Profile2.new @browser
310
+ end
311
+
312
+ def edit_social_networking
313
+ frm.div(:id=>"mainPanel").span(:text=>"Social Networking").fire_event("onmouseover")
314
+ frm.div(:id=>"mainPanel").link(:href=>/mySocialNetworking:editButton/).click
315
+ sleep 0.5
316
+ Profile2.new @browser
317
+ end
318
+
319
+ def edit_personal_info
320
+ frm.div(:id=>"mainPanel").span(:text=>"Personal Information").fire_event("onmouseover")
321
+ frm.div(:id=>"mainPanel").link(:href=>/myInterests:editButton/).click
322
+ sleep 0.5
323
+ Profile2.new @browser
324
+ end
325
+
326
+ def change_picture
327
+ frm.div(:id=>"myPhoto").fire_event("onmouseover")
328
+ frm.div(:id=>"myPhoto").link(:class=>"edit-image-button").click
329
+ sleep 0.5
330
+ Profile2.new @browser
331
+ end
332
+
333
+ # Enters the specified filename in the file field.
334
+ #
335
+ # Note that the file should be inside the data/sakai-cle-test-api folder.
336
+ # The file or folder name used for the filename variable
337
+ # should not include a preceding slash ("/") character.
338
+ def image_file=(filename)
339
+ frm.file_field(:name=>"picture").set(File.expand_path(File.dirname(__FILE__)) + "/../../data/sakai-cle-test-api/" + filename)
340
+ end
341
+
342
+ def upload
343
+ frm.button(:value=>"Upload").click
344
+ sleep 0.5
345
+ Profile2.new @browser
346
+ end
347
+
348
+ def personal_summary=(text)
349
+ frm.frame(:id=>"id1a_ifr").send_keys([:command, 'a'], :backspace)
350
+ frm.frame(:id=>"id1a_ifr").send_keys(text)
351
+ end
352
+
353
+ def birthday(day, month, year)
354
+ frm.text_field(:name=>"birthdayContainer:birthday").click
355
+ frm.select(:class=>"ui-datepicker-new-year").wait_until_present
356
+ frm.select(:class=>"ui-datepicker-new-year").select(year.to_i)
357
+ frm.select(:class=>"ui-datepicker-new-month").select(month)
358
+ frm.link(:text=>day.to_s).click
359
+ end
360
+
361
+ def save_changes
362
+ frm.button(:value=>"Save changes").click
363
+ Profile2.new @browser
364
+ end
365
+
366
+ # Returns the number (as a string) displayed next to
367
+ # the "Connections" link in the menu. If there are no
368
+ # connections then returns zero as a string object.
369
+ def connection_requests
370
+ begin
371
+ frm.link(:class=>/icon connections/).span(:class=>"new-items-count").text
372
+ rescue
373
+ return "0"
374
+ end
375
+ end
376
+
377
+ in_frame(:class=>"portletMainIframe") do |frame|
378
+ text_field(:say_something, :id=>"id1", :frame=>frame)
379
+ button(:say_it, :value=>"Say it", :frame=>frame)
380
+ # Basic Information
381
+ text_field(:nickname, :name=>"nicknameContainer:nickname", :frame=>frame)
382
+ # Contact Information
383
+ text_field(:email, :name=>"emailContainer:email", :frame=>frame)
384
+ text_field(:home_page, :name=>"homepageContainer:homepage", :frame=>frame)
385
+ text_field(:work_phone, :name=>"workphoneContainer:workphone", :frame=>frame)
386
+ text_field(:home_phone, :name=>"homephoneContainer:homephone", :frame=>frame)
387
+ text_field(:mobile_phone, :name=>"mobilephoneContainer:mobilephone", :frame=>frame)
388
+ text_field(:facsimile, :name=>"facsimileContainer:facsimile", :frame=>frame)
389
+ # Someday Staff Info fields should go here...
390
+
391
+ # Student Information
392
+ text_field(:degree_course, :name=>"courseContainer:course", :frame=>frame)
393
+ text_field(:subjects, :name=>"subjectsContainer:subjects", :frame=>frame)
394
+ # Social Networking
395
+
396
+ # Personal Information
397
+ text_area(:favorite_books, :name=>"booksContainer:favouriteBooks", :frame=>frame)
398
+ text_area(:favorite_tv_shows, :name=>"tvContainer:favouriteTvShows", :frame=>frame)
399
+ text_area(:favorite_movies, :name=>"moviesContainer:favouriteMovies", :frame=>frame)
400
+ text_area(:favorite_quotes, :name=>"quotesContainer:favouriteQuotes", :frame=>frame)
401
+ end
402
+ end
403
+
404
+ #
405
+ class Profile2Preferences
406
+
407
+ include PageObject
408
+ include ToolsMenu
409
+ include Profile2Nav
410
+
411
+ def save_settings
412
+ frm.button(:value=>"Save settings").click
413
+ Profile2Preferences.new(@browser)
414
+ end
415
+
416
+ in_frame(:class=>"portletMainIframe") do |frame|
417
+
418
+ end
419
+ end
420
+
421
+ #
422
+ class Profile2Privacy
423
+
424
+ include PageObject
425
+ include ToolsMenu
426
+ include Profile2Nav
427
+
428
+ in_frame(:class=>"portletMainIframe") do |frame|
429
+ select_list(:profile_image, :name=>"profileImageContainer:profileImage", :frame=>frame)
430
+ select_list(:basic_info, :name=>"basicInfoContainer:basicInfo", :frame=>frame)
431
+ select_list(:contact_info, :name=>"contactInfoContainer:contactInfo", :frame=>frame)
432
+ select_list(:staff_info, :name=>"staffInfoContainer:staffInfo", :frame=>frame)
433
+ select_list(:student_info, :name=>"studentInfoContainer:studentInfo", :frame=>frame)
434
+ select_list(:social_info, :name=>"socialNetworkingInfoContainer:socialNetworkingInfo", :frame=>frame)
435
+ select_list(:personal_info, :name=>"personalInfoContainer:personalInfo", :frame=>frame)
436
+ select_list(:view_connections, :name=>"myFriendsContainer:myFriends", :frame=>frame)
437
+ select_list(:see_status, :name=>"myStatusContainer:myStatus", :frame=>frame)
438
+ select_list(:view_pictures, :name=>"myPicturesContainer:myPictures", :frame=>frame)
439
+ select_list(:send_messages, :name=>"messagesContainer:messages", :frame=>frame)
440
+ select_list(:see_kudos_rating, :name=>"myKudosContainer:myKudos", :frame=>frame)
441
+ checkbox(:show_birth_year, :name=>"birthYearContainer:birthYear", :frame=>frame)
442
+ button(:save_settings, :value=>"Save settings", :frame=>frame)
443
+ end
444
+ end
445
+
446
+ #
447
+ class Profile2Search
448
+
449
+ include PageObject
450
+ include ToolsMenu
451
+
452
+ def search_by_name_or_email
453
+ frm.button(:value=>"Search by name or email").click
454
+ sleep 0.5
455
+ Profile2Search.new(@browser)
456
+ end
457
+
458
+ def search_by_common_interest
459
+ frm.button(:value=>"Search by common interest").click
460
+ sleep 0.5
461
+ Profile2Search.new(@browser)
462
+ end
463
+
464
+ def add_as_connection(name)
465
+ frm.div(:class=>"search-result", :text=>/#{Regexp.escape(name)}/).link(:class=>"icon connection-add").click
466
+ frm.div(:class=>"modalWindowButtons").wait_until_present
467
+ frm.div(:class=>"modalWindowButtons").button(:value=>"Add connection").click
468
+ frm.div(:class=>"modalWindowButtons").wait_while_present
469
+ sleep 0.5
470
+ Profile2Search.new @browser
471
+ end
472
+
473
+ def view(name)
474
+ frm.link(:text=>name).click
475
+ Profile2View.new(@browser)
476
+ end
477
+
478
+ # Returns an array containing strings of the names of the users returned
479
+ # in the search.
480
+ def results
481
+ results = []
482
+ frm.div(:class=>"portletBody").spans.each do |span|
483
+ if span.class_name == "search-result-info-name"
484
+ results << span.text
485
+ end
486
+ end
487
+ return results
488
+ end
489
+
490
+ def clear_results
491
+ frm.button(:value=>"Clear results").click
492
+ Profile2Search.new(@browser)
493
+ end
494
+
495
+ in_frame(:class=>"portletMainIframe") do |frame|
496
+ text_field(:persons_name_or_email, :name=>"searchName", :frame=>frame)
497
+ text_field(:common_interest, :name=>"searchInterest", :frame=>frame)
498
+ end
499
+ end
500
+
501
+ #
502
+ class Profile2Connections
503
+
504
+ include PageObject
505
+ include ToolsMenu
506
+ include Profile2Nav
507
+
508
+ def confirm_request(name)
509
+ frm.div(:class=>"connection", :text=>name).link(:title=>"Confirm connection request").click
510
+ frm.div(:class=>"modalWindowButtons").wait_until_present
511
+ frm.div(:class=>"modalWindowButtons").button(:value=>"Confirm connection request").click
512
+ frm.div(:class=>"modalWindowButtons").wait_while_present
513
+ sleep 0.5
514
+ Profile2Connections.new @browser
515
+ end
516
+
517
+ # Returns an array containing the names of the connected users.
518
+ def connections
519
+ results = []
520
+ frm.div(:class=>"portletBody").spans.each do |span|
521
+ if span.class_name == "connection-info-name"
522
+ results << span.text
523
+ end
524
+ end
525
+ return results
526
+ end
527
+
528
+ in_frame(:class=>"portletMainIframe") do |frame|
529
+
530
+ end
531
+ end
532
+
533
+ #
534
+ class Profile2View
535
+
536
+ include PageObject
537
+ include ToolsMenu
538
+ include Profile2Nav
539
+
540
+ #
541
+ def connection
542
+ frm.div(:class=>"leftPanel").span(:class=>/instruction icon/).text
543
+ end
544
+
545
+ #
546
+ def basic_information
547
+ hash = {}
548
+ begin
549
+ frm.div(:class=>"mainSection", :text=>/Basic Information/).table(:class=>"profileContent").rows.each do |row|
550
+ hash.store(row[0].text, row[1].text)
551
+ end
552
+ rescue Watir::Exception::UnknownObjectException
553
+
554
+ end
555
+ return hash
556
+ end
557
+
558
+ #
559
+ def contact_information
560
+ hash = {}
561
+ begin
562
+ frm.div(:class=>"mainSection", :text=>/Contact Information/).table(:class=>"profileContent").rows.each do |row|
563
+ hash.store(row[0].text, row[1].text)
564
+ end
565
+ rescue Watir::Exception::UnknownObjectException
566
+
567
+ end
568
+ return hash
569
+ end
570
+
571
+ #
572
+ def staff_information
573
+ hash = {}
574
+ begin
575
+ frm.div(:class=>"mainSection", :text=>/Staff Information/).table(:class=>"profileContent").rows.each do |row|
576
+ hash.store(row[0].text, row[1].text)
577
+ end
578
+ rescue Watir::Exception::UnknownObjectException
579
+
580
+ end
581
+ return hash
582
+ end
583
+
584
+ #
585
+ def student_information
586
+ hash = {}
587
+ begin
588
+ frm.div(:class=>"mainSection", :text=>/Student Information/).table(:class=>"profileContent").rows.each do |row|
589
+ hash.store(row[0].text, row[1].text)
590
+ end
591
+ rescue Watir::Exception::UnknownObjectException
592
+
593
+ end
594
+ return hash
595
+ end
596
+
597
+ #
598
+ def personal_information
599
+ hash = {}
600
+ begin
601
+ frm.div(:class=>"mainSection", :text=>/Personal Information/).table(:class=>"profileContent").rows.each do |row|
602
+ hash.store(row[0].text, row[1].text)
603
+ end
604
+ rescue Watir::Exception::UnknownObjectException
605
+
606
+ end
607
+ return hash
608
+ end
609
+
610
+ end
611
+
612
+
613
+
614
+ #================
615
+ # Realms Pages
616
+ #================
617
+
618
+ # Realms page
619
+ class Realms
620
+
621
+ include PageObject
622
+ include ToolsMenu
623
+
624
+ in_frame(:class=>"portletMainIframe") do |frame|
625
+ link(:new_realm, :text=>"New Realm", :frame=>frame)
626
+ link(:search, :text=>"Search", :frame=>frame)
627
+ select_list(:select_page_size, :name=>"selectPageSize", :frame=>frame)
628
+ button(:next, :name=>"eventSubmit_doList_next", :frame=>frame)
629
+ button(:last, :name=>"eventSubmit_doList_last", :frame=>frame)
630
+ button(:previous, :name=>"eventSubmit_doList_prev", :frame=>frame)
631
+ button(:first, :name=>"eventSubmit_doList_first", :frame=>frame)
632
+
633
+ end
634
+
635
+ end
636
+
637
+ #================
638
+ # Sections - Site Management
639
+ #================
640
+
641
+ # The Add Sections Page in Site Management
642
+ class AddSections
643
+
644
+ include PageObject
645
+ include ToolsMenu
646
+
647
+ in_frame(:class=>"portletMainIframe") do |frame|
648
+ link(:overview, :id=>"addSectionsForm:_idJsp3", :frame=>frame)
649
+ link(:student_memberships, :id=>"addSectionsForm:_idJsp12", :frame=>frame)
650
+ link(:options, :id=>"addSectionsForm:_idJsp17", :frame=>frame)
651
+ select_list(:num_to_add, :id=>"addSectionsForm:numToAdd", :frame=>frame)
652
+ select_list(:category, :id=>"addSectionsForm:category", :frame=>frame)
653
+ button(:add_sections, :id=>"addSectionsForm:_idJsp89", :frame=>frame)
654
+ button(:cancel, :id=>"addSectionsForm:_idJsp90", :frame=>frame)
655
+
656
+ # Note that the following field definitions are appropriate for
657
+ # ONLY THE FIRST instance of each of the fields. The Add Sections page
658
+ # allows for an arbitrary number of these fields to exist.
659
+ # If you are going to test the addition of multiple sections
660
+ # and/or meetings, then their elements will have to be
661
+ # explicitly called or defined in the test scripts themselves.
662
+ text_field(:name, :id=>"addSectionsForm:sectionTable:0:titleInput", :frame=>frame)
663
+ radio_button(:unlimited_size, :name=>"addSectionsForm:sectionTable:0:limit", :index=>0, :frame=>frame)
664
+ radio_button(:limited_size, :name=>"addSectionsForm:sectionTable:0:limit", :index=>1, :frame=>frame)
665
+ text_field(:max_enrollment, :id=>"addSectionsForm:sectionTable:0:maxEnrollmentInput", :frame=>frame)
666
+ checkbox(:monday, :id=>"addSectionsForm:sectionTable:0:meetingsTable:0:monday", :frame=>frame)
667
+ checkbox(:tuesday, :id=>"addSectionsForm:sectionTable:0:meetingsTable:0:tuesday", :frame=>frame)
668
+ checkbox(:wednesday, :id=>"addSectionsForm:sectionTable:0:meetingsTable:0:wednesday", :frame=>frame)
669
+ checkbox(:thursday, :id=>"addSectionsForm:sectionTable:0:meetingsTable:0:thursday", :frame=>frame)
670
+ checkbox(:friday, :id=>"addSectionsForm:sectionTable:0:meetingsTable:0:friday", :frame=>frame)
671
+ checkbox(:saturday, :id=>"addSectionsForm:sectionTable:0:meetingsTable:0:saturday", :frame=>frame)
672
+ checkbox(:sunday, :id=>"addSectionsForm:sectionTable:0:meetingsTable:0:sunday", :frame=>frame)
673
+ text_field(:start_time, :id=>"addSectionsForm:sectionTable:0:meetingsTable:0:startTime", :frame=>frame)
674
+ radio_button(:start_am, :name=>"addSectionsForm:sectionTable:0:meetingsTable:0:startTimeAm", :index=>0, :frame=>frame)
675
+ radio_button(:start_pm, :name=>"addSectionsForm:sectionTable:0:meetingsTable:0:startTimeAm", :index=>1, :frame=>frame)
676
+ text_field(:end_time, :id=>"addSectionsForm:sectionTable:0:meetingsTable:0:endTime", :frame=>frame)
677
+ radio_button(:end_am, :name=>"addSectionsForm:sectionTable:0:meetingsTable:0:endTimeAm", :index=>0, :frame=>frame)
678
+ radio_button(:end_pm, :name=>"addSectionsForm:sectionTable:0:meetingsTable:0:endTimeAm", :index=>1, :frame=>frame)
679
+ text_field(:location, :id=>"addSectionsForm:sectionTable:0:meetingsTable:0:location", :frame=>frame)
680
+ link(:add_days, :id=>"addSectionsForm:sectionTable:0:addMeeting", :frame=>frame)
681
+
682
+ end
683
+
684
+ end
685
+
686
+
687
+ # Exactly like the Add Sections page, but used when editing an existing section
688
+ class EditSections
689
+
690
+ include PageObject
691
+ include ToolsMenu
692
+
693
+ in_frame(:class=>"portletMainIframe") do |frame|
694
+ link(:overview, :id=>"editSectionsForm:_idJsp3", :frame=>frame)
695
+ link(:student_memberships, :id=>"editSectionsForm:_idJsp12", :frame=>frame)
696
+ link(:options, :id=>"editSectionsForm:_idJsp17", :frame=>frame)
697
+ select_list(:num_to_add, :id=>"editSectionsForm:numToAdd", :frame=>frame)
698
+ select_list(:category, :id=>"editSectionsForm:category", :frame=>frame)
699
+ button(:add_sections, :id=>"editSectionsForm:_idJsp89", :frame=>frame)
700
+ button(:cancel, :id=>"editSectionsForm:_idJsp90", :frame=>frame)
701
+
702
+ # Note that the following field definitions are appropriate for
703
+ # ONLY THE FIRST instance of each of the fields. The Edit Sections page
704
+ # allows for an arbitrary number of these fields to exist.
705
+ # If you are going to test the editing of multiple sections
706
+ # and/or meetings, then their elements will have to be
707
+ # explicitly called or defined in the test scripts themselves.
708
+ text_field(:name, :id=>"editSectionsForm:sectionTable:0:titleInput", :frame=>frame)
709
+ radio_button(:unlimited_size, :name=>"editSectionsForm:sectionTable:0:limit", :index=>0, :frame=>frame)
710
+ radio_button(:limited_size, :name=>"editSectionsForm:sectionTable:0:limit", :index=>1, :frame=>frame)
711
+ text_field(:max_enrollment, :id=>"editSectionsForm:sectionTable:0:maxEnrollmentInput", :frame=>frame)
712
+ checkbox(:monday, :id=>"editSectionsForm:sectionTable:0:meetingsTable:0:monday", :frame=>frame)
713
+ checkbox(:tuesday, :id=>"editSectionsForm:sectionTable:0:meetingsTable:0:tuesday", :frame=>frame)
714
+ checkbox(:wednesday, :id=>"editSectionsForm:sectionTable:0:meetingsTable:0:wednesday", :frame=>frame)
715
+ checkbox(:thursday, :id=>"editSectionsForm:sectionTable:0:meetingsTable:0:thursday", :frame=>frame)
716
+ checkbox(:friday, :id=>"editSectionsForm:sectionTable:0:meetingsTable:0:friday", :frame=>frame)
717
+ checkbox(:saturday, :id=>"editSectionsForm:sectionTable:0:meetingsTable:0:saturday", :frame=>frame)
718
+ checkbox(:sunday, :id=>"editSectionsForm:sectionTable:0:meetingsTable:0:sunday", :frame=>frame)
719
+ text_field(:start_time, :id=>"editSectionsForm:sectionTable:0:meetingsTable:0:startTime", :frame=>frame)
720
+ radio_button(:start_am, :name=>"editSectionsForm:sectionTable:0:meetingsTable:0:startTimeAm", :index=>0, :frame=>frame)
721
+ radio_button(:start_pm, :name=>"editSectionsForm:sectionTable:0:meetingsTable:0:startTimeAm", :index=>1, :frame=>frame)
722
+ text_field(:end_time, :id=>"editSectionsForm:sectionTable:0:meetingsTable:0:endTime", :frame=>frame)
723
+ radio_button(:end_am, :name=>"editSectionsForm:sectionTable:0:meetingsTable:0:endTimeAm", :index=>0, :frame=>frame)
724
+ radio_button(:end_pm, :name=>"editSectionsForm:sectionTable:0:meetingsTable:0:endTimeAm", :index=>1, :frame=>frame)
725
+ text_field(:location, :id=>"editSectionsForm:sectionTable:0:meetingsTable:0:location", :frame=>frame)
726
+ link(:add_days, :id=>"editSectionsForm:sectionTable:0:addMeeting", :frame=>frame)
727
+
728
+ end
729
+
730
+ end
731
+
732
+ # Options page for Sections
733
+ class SectionsOptions
734
+
735
+ include PageObject
736
+ include ToolsMenu
737
+
738
+ in_frame(:class=>"portletMainIframe") do |frame|
739
+ checkbox(:students_can_sign_up, :id=>"optionsForm:selfRegister", :frame=>frame)
740
+ checkbox(:students_can_switch_sections, :id=>"optionsForm:selfSwitch", :frame=>frame)
741
+ button(:update, :id=>"optionsForm:_idJsp50", :frame=>frame)
742
+ button(:cancel, :id=>"optionsForm:_idJsp51", :frame=>frame)
743
+ link(:overview, :id=>"optionsForm:_idJsp3", :frame=>frame)
744
+ link(:add_sections, :id=>"optionsForm:_idJsp8", :frame=>frame)
745
+ link(:student_memberships, :id=>"optionsForm:_idJsp12", :frame=>frame)
746
+
747
+ end
748
+
749
+ end
750
+
751
+ # The Sections page
752
+ # found in the SITE MANAGEMENT menu for a Site
753
+ class SectionsOverview
754
+
755
+ include PageObject
756
+ include ToolsMenu
757
+
758
+ in_frame(:class=>"portletMainIframe") do |frame|
759
+ link(:add_sections, :id=>"overviewForm:_idJsp8", :frame=>frame)
760
+ link(:student_memberships, :id=>"overviewForm:_idJsp12", :frame=>frame)
761
+ link(:options, :id=>"overviewForm:_idJsp17", :frame=>frame)
762
+ link(:sort_name, :id=>"overviewForm:sectionsTable:_idJsp54", :frame=>frame)
763
+ link(:sort_ta, :id=>"overviewForm:sectionsTable:_idJsp73", :frame=>frame)
764
+ link(:sort_day, :id=>"overviewForm:sectionsTable:_idJsp78", :frame=>frame)
765
+ link(:sort_time, :id=>"overviewForm:sectionsTable:_idJsp83", :frame=>frame)
766
+ link(:sort_location, :id=>"overviewForm:sectionsTable:_idJsp88", :frame=>frame)
767
+ link(:sort_current_size, :id=>"overviewForm:sectionsTable:_idJsp93", :frame=>frame)
768
+ link(:sort_avail, :id=>"overviewForm:sectionsTable:_idJsp97", :frame=>frame)
769
+
770
+ end
771
+
772
+ end
773
+
774
+ #================
775
+ # Sites Page - from Administration Workspace
776
+ #================
777
+
778
+ # Sites page - arrived at via the link with class="icon-sakai-sites"
779
+ class Sites
780
+
781
+ include PageObject
782
+ include ToolsMenu
783
+
784
+ # Clicks the first site Id link
785
+ # listed. Useful when you've run a search and
786
+ # you're certain you've got the result you want.
787
+ # It then instantiates the EditSiteInfo page class.
788
+ def click_top_item
789
+ frm.link(:href, /#{Regexp.escape("&panel=Main&sakai_action=doEdit")}/).click
790
+ EditSiteInfo.new(@browser)
791
+ end
792
+
793
+ # Clicks the specified Site in the list, using the
794
+ # specified id value to determine which item to click.
795
+ # It then instantiates the EditSiteInfo page class.
796
+ # Use this method when you know the target site ID.
797
+ def edit_site_id(id)
798
+ frm.text_field(:id=>"search_site").value=id
799
+ frm.link(:text=>"Site ID").click
800
+ frm.link(:text, id).click
801
+ EditSiteInfo.new(@browser)
802
+ end
803
+
804
+ # Clicks the New Site button, then instantiates
805
+ # the EditSiteInfo page class.
806
+ def new_site
807
+ frm.link(:text, "New Site").click
808
+ EditSiteInfo.new(@browser)
809
+ end
810
+
811
+ in_frame(:index=>0) do |frame|
812
+ text_field(:search_field, :id=>"search", :frame=>frame)
813
+ link(:search_button, :text=>"Search", :frame=>frame)
814
+ text_field(:search_site_id, :id=>"search_site", :frame=>frame)
815
+ link(:search_site_id_button, :text=>"Site ID", :frame=>frame)
816
+ text_field(:search_user_id, :id=>"search_user", :frame=>frame)
817
+ link(:search_user_id_button, :text=>"User ID", :frame=>frame)
818
+ button(:next, :name=>"eventSubmit_doList_next", :frame=>frame)
819
+ button(:last, :name=>"eventSubmit_doList_last", :frame=>frame)
820
+ button(:previous, :name=>"eventSubmit_doList_prev", :frame=>frame)
821
+ button(:first, :name=>"eventSubmit_doList_first", :frame=>frame)
822
+ select_list(:select_page_size, :name=>"selectPageSize", :frame=>frame)
823
+ button(:next, :name=>"eventSubmit_doList_next", :frame=>frame)
824
+ button(:last, :name=>"eventSubmit_doList_last", :frame=>frame)
825
+ button(:previous, :name=>"eventSubmit_doList_prev", :frame=>frame)
826
+ button(:first, :name=>"eventSubmit_doList_first", :frame=>frame)
827
+ end
828
+
829
+ end
830
+
831
+ # Page that appears when you've clicked a Site ID in the
832
+ # Sites section of the Administration Workspace.
833
+ class EditSiteInfo
834
+
835
+ include PageObject
836
+ include ToolsMenu
837
+
838
+ # Clicks the Remove Site button, then instantiates
839
+ # the RemoveSite page class.
840
+ def remove_site
841
+ frm.link(:text, "Remove Site").click
842
+ RemoveSite.new(@browser)
843
+ end
844
+
845
+ # Clicks the Save button, then instantiates the Sites
846
+ # page class.
847
+ def save
848
+ frm.button(:value=>"Save").click
849
+ Sites.new(@browser)
850
+ end
851
+
852
+ # Clicks the Save As link, then instantiates
853
+ # the SiteSaveAs page class.
854
+ def save_as
855
+ frm.link(:text, "Save As").click
856
+ SiteSaveAs.new(@browser)
857
+ end
858
+
859
+ # Gets the Site ID from the page.
860
+ def site_id_read_only
861
+ @browser.frame(:index=>0).table(:class=>"itemSummary").td(:class=>"shorttext", :index=>0).text
862
+ end
863
+
864
+ # Enters the specified text string in the text area of
865
+ # the FCKEditor.
866
+ def description=(text)
867
+ editor.td(:id, "xEditingArea").frame(:index=>0).send_keys(text)
868
+ end
869
+
870
+ # The FCKEditor object. Use this object for
871
+ # wait commands when the site is slow
872
+ def editor
873
+ @browser.frame(:index=>0).frame(:id, "description___Frame")
874
+ end
875
+
876
+ # Clicks the Properties button on the page,
877
+ # then instantiates the AddEditSiteProperties
878
+ # page class.
879
+ def properties
880
+ frm.button(:value=>"Properties").click
881
+ AddEditSiteProperties.new(@browser)
882
+ end
883
+
884
+ # Clicks the Pages button, then instantiates
885
+ # the AddEditPages page class.
886
+ def pages
887
+ frm.button(:value=>"Pages").click
888
+ AddEditPages.new(@browser)
889
+ end
890
+
891
+ in_frame(:class=>"portletMainIframe") do |frame|
892
+ # Non-navigating, interactive page objects go here
893
+ text_field(:site_id, :id=>"id", :frame=>frame)
894
+ text_field(:title, :id=>"title", :frame=>frame)
895
+ text_field(:type, :id=>"type", :frame=>frame)
896
+ text_area(:short_description, :id=>"shortDescription", :frame=>frame)
897
+ radio_button(:unpublished, :id=>"publishedfalse", :frame=>frame)
898
+ radio_button(:published, :id=>"publishedtrue", :frame=>frame)
899
+ radio_button(:public_view_yes, :id=>"pubViewtrue", :frame=>frame)
900
+ end
901
+
902
+ end
903
+
904
+ # The page you come to when editing a Site in Sites
905
+ # and you click on the Pages button
906
+ class AddEditPages
907
+
908
+ include PageObject
909
+ include ToolsMenu
910
+
911
+ # Clicks the link for New Page, then
912
+ # instantiates the NewPage page class.
913
+ def new_page
914
+ frm.link(:text=>"New Page").click
915
+ NewPage.new(@browser)
916
+ end
917
+
918
+ end
919
+
920
+ # Page for adding a new page to a Site.
921
+ class NewPage
922
+
923
+ include PageObject
924
+ include ToolsMenu
925
+
926
+ # Clicks the Tools button, then instantiates
927
+ # the AddEditTools class.
928
+ def tools
929
+ frm.button(:value=>"Tools").click
930
+ AddEditTools.new(@browser)
931
+ end
932
+
933
+ in_frame(:class=>"portletMainIframe") do |frame|
934
+ # Interactive page objects that do no navigation
935
+ # or page refreshes go here.
936
+ text_field(:title, :id=>"title", :frame=>frame)
937
+ end
938
+
939
+ end
940
+
941
+ # Page when editing a Site and adding/editing tools for pages.
942
+ class AddEditTools
943
+
944
+ include PageObject
945
+ include ToolsMenu
946
+
947
+ # Clicks the New Tool link, then instantiates
948
+ # the NewTool class.
949
+ def new_tool
950
+ frm.link(:text=>"New Tool").click
951
+ NewTool.new(@browser)
952
+ end
953
+
954
+ # Clicks the Save button, then
955
+ # instantiates the AddEditPages class.
956
+ def save
957
+ frm.button(:value=>"Save").click
958
+ AddEditPages.new(@browser)
959
+ end
960
+
961
+ end
962
+
963
+ # Page for creating a new tool for a page in a site
964
+ class NewTool
965
+
966
+ include PageObject
967
+ include ToolsMenu
968
+
969
+ # Clicks the Done button, the instantiates
970
+ # The AddEditTools class.
971
+ def done
972
+ frm.button(:value=>"Done").click
973
+ AddEditTools.new(@browser)
974
+ end
975
+
976
+ in_frame(:class=>"portletMainIframe") do |frame|
977
+ # Interactive page objects that do no navigation
978
+ # or page refreshes go here.
979
+ text_field(:title, :id=>"title", :frame=>frame)
980
+ text_field(:layout_hints, :id=>"layoutHints", :frame=>frame)
981
+ radio_button(:resources, :id=>"feature80", :frame=>frame)
982
+ end
983
+
984
+ end
985
+
986
+ # Page that appears when you click "Remove Site" when editing a Site in Sites
987
+ class RemoveSite
988
+
989
+ include PageObject
990
+ include ToolsMenu
991
+
992
+ # Clicks the Remove button, then
993
+ # instantiates the Sites class.
994
+ def remove
995
+ frm.button(:value=>"Remove").click
996
+ Sites.new(@browser)
997
+ end
998
+
999
+ end
1000
+
1001
+ # Page that appears when you click "Save As" when editing a Site in Sites
1002
+ class SiteSaveAs
1003
+
1004
+ include PageObject
1005
+ include ToolsMenu
1006
+
1007
+ # Clicks the Save button, then
1008
+ # instantiates the Sites class.
1009
+ def save
1010
+ frm.button(:value, "Save").click
1011
+ Sites.new(@browser)
1012
+ end
1013
+
1014
+ in_frame(:class=>"portletMainIframe") do |frame|
1015
+ text_field(:site_id, :id=>"id", :frame=>frame)
1016
+ end
1017
+
1018
+ end
1019
+
1020
+ class AddEditSiteProperties
1021
+
1022
+ include PageObject
1023
+ include ToolsMenu
1024
+
1025
+ # Clicks the New Property button
1026
+ def new_property
1027
+ frm.button(:value=>"New Property").click
1028
+ #Class.new(@browser)
1029
+ end
1030
+
1031
+ # Clicks the Done button, then instantiates
1032
+ # the EditSiteInfo class.
1033
+ def done
1034
+ frm.button(:value=>"Done").click
1035
+ EditSiteInfo.new(@browser)
1036
+ end
1037
+
1038
+ # Clicks the Save button, then instantiates
1039
+ # the Sites page class.
1040
+ def save
1041
+ frm.button(:value=>"Save").click
1042
+ Sites.new(@browser)
1043
+ end
1044
+
1045
+ in_frame(:class=>"portletMainIframe") do |frame|
1046
+ text_field(:name, :id=>"new_name", :frame=>frame)
1047
+ text_field(:value, :id=>"new_value", :frame=>frame)
1048
+ end
1049
+ end
1050
+
1051
+
1052
+
1053
+ #================
1054
+ # User's Account Page - in "My Settings"
1055
+ #================
1056
+
1057
+ # The Page for editing User Account details
1058
+ class EditAccount
1059
+
1060
+ include PageObject
1061
+ include ToolsMenu
1062
+
1063
+ # Clicks the update details button then
1064
+ # makes sure there isn't any error message present.
1065
+ # If there is, it reinstantiates the Edit Account Class,
1066
+ # otherwise it instantiates the UserAccount Class.
1067
+ def update_details
1068
+ frm.button(:value=>"Update Details").click
1069
+ # Need to check if the update took...
1070
+ if frm.div(:class=>"portletBody").h3.text=="My Account Details"
1071
+ # Apparently it did...
1072
+ UserAccount.new(@browser)
1073
+ elsif frm.div(:class=>"portletBody").h3.text=="Account Details"
1074
+ # We are on the edit page (or we're using the Admin account)...
1075
+ EditAccount.new(@browser)
1076
+ elsif frm.div(:class=>"portletBody").h3.text=="Users"
1077
+ Users.new(@browser)
1078
+ end
1079
+ end
1080
+
1081
+ in_frame(:class=>"portletMainIframe") do |frame|
1082
+ text_field(:first_name, :id=>"first-name", :frame=>frame)
1083
+ text_field(:last_name, :id=>"last-name", :frame=>frame)
1084
+ text_field(:email, :id=>"email", :frame=>frame)
1085
+ text_field(:current_password, :id=>"pwcur", :frame=>frame)
1086
+ text_field(:create_new_password, :id=>"pw", :frame=>frame)
1087
+ text_field(:verify_new_password, :id=>"pw0", :frame=>frame)
1088
+ end
1089
+
1090
+ end
1091
+
1092
+ # A Non-Admin User's Account page
1093
+ # Accessible via the "Account" link in "MY SETTINGS"
1094
+ #
1095
+ # IMPORTANT: this class does not use PageObject or the ToolsMenu!!
1096
+ # So, the only available method to navigate away from this page is
1097
+ # Home. Otherwise, you'll have to call the navigation link
1098
+ # Explicitly in the test case itself.
1099
+ #
1100
+ # Objects and methods used in this class must be explicitly
1101
+ # defined using Watir and Ruby code.
1102
+ #
1103
+ # Do NOT use the PageObject syntax in this class.
1104
+ class UserAccount
1105
+
1106
+ def initialize(browser)
1107
+ @browser = browser
1108
+ end
1109
+
1110
+ # Clicks the Modify Details button. Instantiates the EditAccount class.
1111
+ def modify_details
1112
+ @browser.frame(:index=>0).button(:name=>"eventSubmit_doModify").click
1113
+ EditAccount.new(@browser)
1114
+ end
1115
+
1116
+ # Gets the text of the User ID field.
1117
+ def user_id
1118
+ @browser.frame(:index=>0).table(:class=>"itemSummary", :index=>0)[0][1].text
1119
+ end
1120
+
1121
+ # Gets the text of the First Name field.
1122
+ def first_name
1123
+ @browser.frame(:index=>0).table(:class=>"itemSummary", :index=>0)[1][1].text
1124
+ end
1125
+
1126
+ # Gets the text of the Last Name field.
1127
+ def last_name
1128
+ @browser.frame(:index=>0).table(:class=>"itemSummary", :index=>0)[2][1].text
1129
+ end
1130
+
1131
+ # Gets the text of the Email field.
1132
+ def email
1133
+ @browser.frame(:index=>0).table(:class=>"itemSummary", :index=>0)[3][1].text
1134
+ end
1135
+
1136
+ # Gets the text of the Type field.
1137
+ def type
1138
+ @browser.frame(:index=>0).table(:class=>"itemSummary", :index=>0)[4][1].text
1139
+ end
1140
+
1141
+ # Gets the text of the Created By field.
1142
+ def created_by
1143
+ @browser.frame(:index=>0).table(:class=>"itemSummary", :index=>1)[0][1].text
1144
+ end
1145
+
1146
+ # Gets the text of the Created field.
1147
+ def created
1148
+ @browser.frame(:index=>0).table(:class=>"itemSummary", :index=>1)[1][1].text
1149
+ end
1150
+
1151
+ # Gets the text of the Modified By field.
1152
+ def modified_by
1153
+ @browser.frame(:index=>0).table(:class=>"itemSummary", :index=>1)[2][1].text
1154
+ end
1155
+
1156
+ # Gets the text of the Modified (date) field.
1157
+ def modified
1158
+ @browser.frame(:index=>0).table(:class=>"itemSummary", :index=>1)[3][1].text
1159
+ end
1160
+
1161
+ # Clicks the Home buton in the left menu.
1162
+ # instantiates the Home Class.
1163
+ def home
1164
+ @browser.link(:text, "Home").click
1165
+ Home.new(@browser)
1166
+ end
1167
+
1168
+ end
1169
+
1170
+ #================
1171
+ # Users Pages - From the Workspace
1172
+ #================
1173
+
1174
+ # The Page for editing User Account details
1175
+ class EditUser
1176
+
1177
+ include PageObject
1178
+ include ToolsMenu
1179
+
1180
+ in_frame(:class=>"portletMainIframe") do |frame|
1181
+ link(:remove_user, :text=>"Remove User", :frame=>frame)
1182
+ text_field(:first_name, :id=>"first-name", :frame=>frame)
1183
+ text_field(:last_name, :id=>"last-name", :frame=>frame)
1184
+ text_field(:email, :id=>"email", :frame=>frame)
1185
+ text_field(:create_new_password, :id=>"pw", :frame=>frame)
1186
+ text_field(:verify_new_password, :id=>"pw0", :frame=>frame)
1187
+ button(:update_details, :name=>"eventSubmit_doSave", :frame=>frame)
1188
+ button(:cancel_changes, :name=>"eventSubmit_doCancel", :frame=>frame)
1189
+ end
1190
+
1191
+ end
1192
+
1193
+ # The Users page - "icon-sakai-users"
1194
+ class Users
1195
+
1196
+ include PageObject
1197
+ include ToolsMenu
1198
+
1199
+ def new_user
1200
+ frm.link(:text=>"New User").click
1201
+ CreateNewUser.new @browser
1202
+ end
1203
+
1204
+ # Returns the contents of the Name cell
1205
+ # based on the specified user ID value.
1206
+ def name(user_id)
1207
+ frm.table(:class=>"listHier lines").row(:text=>/#{Regexp.escape(user_id)}/i)[1].text
1208
+ end
1209
+
1210
+ # Returns the contents of the Email cell
1211
+ # based on the specified user ID value.
1212
+ def email(user_id)
1213
+ frm.table(:class=>"listHier lines").row(:text=>/#{Regexp.escape(user_id)}/i)[2].text
1214
+ end
1215
+
1216
+ # Returns the contents of the Type cell
1217
+ # based on the specified user ID value.
1218
+ def type(user_id)
1219
+ frm.table(:class=>"listHier lines").row(:text=>/#{Regexp.escape(user_id)}/i)[3].text
1220
+ end
1221
+
1222
+ def search_button
1223
+ frm.link(:text=>"Search").click
1224
+ frm.table(:class=>"listHier lines").wait_until_present
1225
+ Users.new @browser
1226
+ end
1227
+
1228
+ in_frame(:class=>"portletMainIframe") do |frame|
1229
+ link(:clear_search, :text=>"Clear Search", :frame=>frame)
1230
+ text_field(:search_field, :id=>"search", :frame=>frame)
1231
+ select_list(:select_page_size, :name=>"selectPageSize", :frame=>frame)
1232
+ button(:next, :name=>"eventSubmit_doList_next", :frame=>frame)
1233
+ button(:last, :name=>"eventSubmit_doList_last", :frame=>frame)
1234
+ button(:previous, :name=>"eventSubmit_doList_prev", :frame=>frame)
1235
+ button(:first, :name=>"eventSubmit_doList_first", :frame=>frame)
1236
+ end
1237
+
1238
+ end
1239
+
1240
+ # The Create New User page
1241
+ class CreateNewUser
1242
+
1243
+ include PageObject
1244
+ include ToolsMenu
1245
+
1246
+ def save_details
1247
+ frm.button(:name=>"eventSubmit_doSave").click
1248
+ Users.new(@browser)
1249
+ end
1250
+
1251
+ in_frame(:class=>"portletMainIframe") do |frame|
1252
+ text_field(:user_id, :id=>"eid", :frame=>frame)
1253
+ text_field(:first_name, :id=>"first-name", :frame=>frame)
1254
+ text_field(:last_name, :id=>"last-name", :frame=>frame)
1255
+ text_field(:email, :id=>"email", :frame=>frame)
1256
+ text_field(:create_new_password, :id=>"pw", :frame=>frame)
1257
+ text_field(:verify_new_password, :id=>"pw0", :frame=>frame)
1258
+ select_list(:type, :name=>"type", :frame=>frame)
1259
+ button(:cancel_changes, :name=>"eventSubmit_doCancel", :frame=>frame)
1260
+ end
1261
+
1262
+ end
1263
+
1264
+
1265
+ #================
1266
+ # User Membership Pages from Administration Workspace
1267
+ #================
1268
+
1269
+ # User Membership page for admin users - "icon-sakai-usermembership"
1270
+ class UserMembership
1271
+
1272
+ include PageObject
1273
+ include ToolsMenu
1274
+
1275
+ # Returns an array containing the user names displayed in the search results.
1276
+ def names
1277
+ names = []
1278
+ frm.table(:class=>/listHier/).rows.each do |row|
1279
+ names << row[2].text
1280
+ end
1281
+ names.delete_at(0)
1282
+ return names
1283
+ end
1284
+
1285
+ # Returns the user id of the specified user (assuming that person
1286
+ # appears in the search results list, otherwise this method will
1287
+ # throw an error.)
1288
+ def user_id(name)
1289
+ frm.table(:class=>/listHier/).row(:text=>/#{Regexp.escape(name)}/)[0].text
1290
+ end
1291
+
1292
+ # Returns the user type of the specified user (assuming that person
1293
+ # appears in the search results list, otherwise this method will
1294
+ # throw an error.)
1295
+ def type(name)
1296
+ frm.table(:class=>/listHier/).row(:text=>/#{Regexp.escape(name)}/)[4].text
1297
+ end
1298
+
1299
+ # Returns the text contents of the "instruction" paragraph that
1300
+ # appears when there are no search results.
1301
+ def alert_text
1302
+ frm.p(:class=>"instruction").text
1303
+ end
1304
+
1305
+ in_frame(:class=>"portletMainIframe") do |frame|
1306
+ select_list(:user_type, :id=>"userlistForm:selectType", :frame=>frame)
1307
+ select_list(:user_authority, :id=>"userlistForm:selectAuthority", :frame=>frame)
1308
+ text_field(:search_field, :id=>"userlistForm:inputSearchBox", :frame=>frame)
1309
+ button(:search, :id=>"userlistForm:searchButton", :frame=>frame)
1310
+ button(:clear_search, :id=>"userlistForm:clearSearchButton", :frame=>frame)
1311
+ select_list(:page_size, :id=>"userlistForm:pager_pageSize", :frame=>frame)
1312
+ button(:export_csv, :id=>"userlistForm:exportCsv", :frame=>frame)
1313
+ button(:export_excel, :id=>"userlistForm:exportXls", :frame=>frame)
1314
+ link(:sort_user_id, :id=>"userlistForm:_idJsp13:_idJsp14", :frame=>frame)
1315
+ link(:sort_internal_user_id, :id=>"userlistForm:_idJsp13:_idJsp18", :frame=>frame)
1316
+ link(:sort_name, :id=>"userlistForm:_idJsp13:_idJsp21", :frame=>frame)
1317
+ link(:sort_email, :id=>"userlistForm:_idJsp13:_idJsp24", :frame=>frame)
1318
+ link(:sort_type, :id=>"userlistForm:_idJsp13:_idJsp28", :frame=>frame)
1319
+ link(:sort_authority, :id=>"userlistForm:_idJsp13:_idJsp31", :frame=>frame)
1320
+ link(:sort_created_on, :id=>"userlistForm:_idJsp13:_idJsp34", :frame=>frame)
1321
+ link(:sort_modified_on, :id=>"userlistForm:_idJsp13:_idJsp37", :frame=>frame)
1322
+ #(:, =>"", :frame=>frame)
1323
+
1324
+ end
1325
+
1326
+ end
1327
+
1328
+ #================
1329
+ # Job Scheduler pages in Admin Workspace
1330
+ #================
1331
+
1332
+ # The topmost page in the Job Scheduler in Admin Workspace
1333
+ class JobScheduler
1334
+
1335
+ include PageObject
1336
+ include ToolsMenu
1337
+
1338
+ # Clicks the Jobs link, then instantiates
1339
+ # the JobList Class.
1340
+ def jobs
1341
+ frm.link(:text=>"Jobs").click
1342
+ JobList.new(@browser)
1343
+ end
1344
+
1345
+ end
1346
+
1347
+ # The list of Jobs (click the Jobs button on Job Scheduler)
1348
+ class JobList
1349
+
1350
+ include PageObject
1351
+ include ToolsMenu
1352
+
1353
+ # Clicks the New Job link, then
1354
+ # instantiates the CreateNewJob Class.
1355
+ def new_job
1356
+ frm.link(:text=>"New Job").click
1357
+ CreateNewJob.new(@browser)
1358
+ end
1359
+
1360
+ # Clicks the link with the text "Triggers" associated with the
1361
+ # specified job name,
1362
+ # then instantiates the EditTriggers Class.
1363
+ def triggers(job_name)
1364
+ frm.div(:class=>"portletBody").table(:class=>"listHier lines").row(:text=>/#{Regexp.escape(job_name)}/).link(:text=>/Triggers/).click
1365
+ sleep 1
1366
+ EditTriggers.new(@browser)
1367
+ end
1368
+
1369
+ def event_log
1370
+ frm.link(:text=>"Event Log").click
1371
+ EventLog.new(@browser)
1372
+ end
1373
+
1374
+ end
1375
+
1376
+ # The Create New Job page
1377
+ class CreateNewJob
1378
+
1379
+ include PageObject
1380
+ include ToolsMenu
1381
+
1382
+ # Clicks the Post button, then
1383
+ # instantiates the JobList Class.
1384
+ def post
1385
+ frm.button(:value=>"Post").click
1386
+ JobList.new(@browser)
1387
+ end
1388
+
1389
+ in_frame(:class=>"portletMainIframe") do |frame|
1390
+ text_field(:job_name, :id=>"_id2:job_name", :frame=>frame)
1391
+ select_list(:type, :name=>"_id2:_id10", :frame=>frame)
1392
+ end
1393
+ end
1394
+
1395
+ # The page for Editing Triggers
1396
+ class EditTriggers
1397
+
1398
+ include PageObject
1399
+ include ToolsMenu
1400
+
1401
+ # Clicks the "Run Job Now" link, then
1402
+ # instantiates the RunJobConfirmation Class.
1403
+ def run_job_now
1404
+ frm.div(:class=>"portletBody").link(:text=>"Run Job Now").click
1405
+ RunJobConfirmation.new(@browser)
1406
+ end
1407
+
1408
+ def return_to_jobs
1409
+ frm.link(:text=>"Return_to_Jobs").click
1410
+ JobList.new(@browser)
1411
+ end
1412
+
1413
+ def new_trigger
1414
+ frm.link(:text=>"New Trigger").click
1415
+ CreateTrigger.new(@browser)
1416
+ end
1417
+
1418
+ end
1419
+
1420
+ # The Create Trigger page
1421
+ class CreateTrigger
1422
+
1423
+ include PageObject
1424
+ include ToolsMenu
1425
+
1426
+ def post
1427
+ frm.button(:value=>"Post").click
1428
+ EditTriggers.new(@browser)
1429
+ end
1430
+
1431
+ in_frame(:index=>0) do |frame|
1432
+ text_field(:name, :id=>"_id2:trigger_name", :frame=>frame)
1433
+ text_field(:cron_expression, :id=>"_id2:trigger_expression", :frame=>frame)
1434
+ end
1435
+ end
1436
+
1437
+
1438
+ # The page for confirming you want to run a job
1439
+ class RunJobConfirmation
1440
+
1441
+ include PageObject
1442
+ include ToolsMenu
1443
+
1444
+ # Clicks the "Run Now" button, then
1445
+ # instantiates the JobList Class.
1446
+ def run_now
1447
+ frm.button(:value=>"Run Now").click
1448
+ JobList.new(@browser)
1449
+ end
1450
+
1451
+ in_frame(:index=>0) do |frame|
1452
+ #(:, =>"", :frame=>frame)
1453
+ end
1454
+ end
1455
+
1456
+ # The page containing the Event Log
1457
+ class EventLog
1458
+
1459
+ include PageObject
1460
+ include ToolsMenu
1461
+
1462
+ end