sakai-cle-test-api 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
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