sakai-oae-test-api 0.0.3 → 0.0.6

Sign up to get free protection for your applications and to get access to all the features.
Files changed (34) hide show
  1. data/Gemfile.lock +34 -0
  2. data/README.md +48 -40
  3. data/lib/sakai-oae-test-api.rb +7 -3
  4. data/lib/sakai-oae-test-api/cle_announcements.rb +0 -0
  5. data/lib/sakai-oae-test-api/cle_assessments.rb +146 -0
  6. data/lib/sakai-oae-test-api/cle_assignments.rb +87 -0
  7. data/lib/sakai-oae-test-api/cle_basic_lti.rb +0 -0
  8. data/lib/sakai-oae-test-api/cle_blogs.rb +0 -0
  9. data/lib/sakai-oae-test-api/cle_calendar.rb +65 -0
  10. data/lib/sakai-oae-test-api/cle_calendar_summary.rb +0 -0
  11. data/lib/sakai-oae-test-api/cle_chat_room.rb +0 -0
  12. data/lib/sakai-oae-test-api/cle_drop_box.rb +0 -0
  13. data/lib/sakai-oae-test-api/cle_email_archive.rb +27 -0
  14. data/lib/sakai-oae-test-api/cle_forums.rb +62 -0
  15. data/lib/sakai-oae-test-api/cle_gradebook.rb +20 -0
  16. data/lib/sakai-oae-test-api/cle_gradebook2.rb +21 -0
  17. data/lib/sakai-oae-test-api/cle_messages.rb +133 -0
  18. data/lib/sakai-oae-test-api/cle_news.rb +19 -0
  19. data/lib/sakai-oae-test-api/cle_polls.rb +34 -0
  20. data/lib/sakai-oae-test-api/cle_post_em.rb +13 -0
  21. data/lib/sakai-oae-test-api/cle_profile.rb +27 -0
  22. data/lib/sakai-oae-test-api/cle_profile2.rb +57 -0
  23. data/lib/sakai-oae-test-api/cle_resources_roster.rb +0 -0
  24. data/lib/sakai-oae-test-api/cle_rwiki.rb +0 -0
  25. data/lib/sakai-oae-test-api/cle_sections.rb +57 -0
  26. data/lib/sakai-oae-test-api/cle_single_user.rb +13 -0
  27. data/lib/sakai-oae-test-api/cle_site_statistics.rb +13 -0
  28. data/lib/sakai-oae-test-api/cle_syllabus.rb +55 -0
  29. data/lib/sakai-oae-test-api/global_methods.rb +1 -1
  30. data/lib/sakai-oae-test-api/page_classes.rb +0 -62
  31. data/lib/sakai-oae-test-api/pop_up_dialogs.rb +2 -1
  32. data/sakai-oae-test-api.gemspec +3 -3
  33. metadata +32 -7
  34. data/lib/sakai-oae-test-api/cle_frame_classes.rb +0 -2160
@@ -0,0 +1,13 @@
1
+ module SingleUserFrame
2
+ include GlobalMethods
3
+ include HeaderFooterBar
4
+ include LeftMenuBar
5
+ include HeaderBar
6
+ include DocButtons
7
+
8
+ # The frame object that contains all of the CLE Tests and Quizzes objects
9
+ def frm
10
+ self.frame(:src=>/TBD/)
11
+ end
12
+
13
+ end
@@ -0,0 +1,13 @@
1
+ module SiteStatisticsFrame
2
+ include GlobalMethods
3
+ include HeaderFooterBar
4
+ include LeftMenuBar
5
+ include HeaderBar
6
+ include DocButtons
7
+
8
+ # The frame object that contains all of the CLE Tests and Quizzes objects
9
+ def frm
10
+ self.frame(:src=>/TBD/)
11
+ end
12
+
13
+ end
@@ -0,0 +1,55 @@
1
+ module SyllabusFrame
2
+ include GlobalMethods
3
+ include HeaderFooterBar
4
+ include LeftMenuBar
5
+ include HeaderBar
6
+ include DocButtons
7
+
8
+ # The frame object that contains all of the CLE Tests and Quizzes objects
9
+ def frm
10
+ self.frame(:src=>/TBD/)
11
+ end
12
+
13
+ end
14
+
15
+ class Syllabus
16
+ include PageObject
17
+ include SyllabusFrame
18
+ include SyllabusMethods
19
+ end
20
+
21
+ class SyllabusEdit
22
+ include PageObject
23
+ include SyllabusFrame
24
+ include SyllabusEditMethods
25
+ end
26
+
27
+ class AddEditSyllabusItem
28
+ include PageObject
29
+ include SyllabusFrame
30
+ CLEElements.modularize(AddEditSyllabusItemMethods, :index=>2)
31
+ end
32
+
33
+ class SyllabusPreview
34
+ include PageObject
35
+ include SyllabusFrame
36
+ CLEElements.modularize(SyllabusPreviewMethods, :index=>2)
37
+ end
38
+
39
+ class SyllabusRedirect
40
+ include PageObject
41
+ include SyllabusFrame
42
+ CLEElements.modularize(SyllabusRedirectMethods, :index=>2)
43
+ end
44
+
45
+ class DeleteSyllabusItems
46
+ include PageObject
47
+ include SyllabusFrame
48
+ include DeleteSyllabusItemsMethods
49
+ end
50
+
51
+ class CreateEditSyllabus
52
+ include PageObject
53
+ include SyllabusFrame
54
+ include CreateEditSyllabusMethods
55
+ end
@@ -42,7 +42,7 @@ module GlobalMethods
42
42
  open_link(:forum, "Forum")
43
43
  open_link(:comments, "Comments")
44
44
  open_link(:jisc, "JISC")
45
- open_link(:assignments, "Assignments")
45
+ open_link(:assignments, "AssignmentsList")
46
46
  open_link(:feed, "RSS")
47
47
  open_link(:rss_feed, "RSS")
48
48
  open_link(:rss, "RSS")
@@ -50,22 +50,6 @@ class AllCategoriesPage
50
50
 
51
51
  end
52
52
 
53
- # TODO - Write a class description
54
- class Calendar
55
-
56
- include PageObject
57
- include HeaderFooterBar
58
- include LeftMenuBar
59
- include HeaderBar
60
- include DocButtons
61
- include GlobalMethods
62
-
63
- def calendar_frame
64
- self.frame(:src=>/sakai2calendar.launch.html/)
65
- end
66
-
67
- end
68
-
69
53
  # Methods related to the Content Details page.
70
54
  class ContentDetailsPage
71
55
 
@@ -1711,22 +1695,7 @@ class RSS
1711
1695
 
1712
1696
  end
1713
1697
 
1714
- # TODO - describe class
1715
- class Tests
1716
-
1717
- include PageObject
1718
- include GlobalMethods
1719
- include HeaderFooterBar
1720
- include LeftMenuBar
1721
- include HeaderBar
1722
- include DocButtons
1723
1698
 
1724
- # The frame object that contains all of the CLE Tests and Quizzes objects
1725
- def tests_frame
1726
- self.frame(:src=>/sakai2samigo.launch.html/)
1727
- end
1728
-
1729
- end
1730
1699
 
1731
1700
  # TODO - describe class
1732
1701
  class Files
@@ -1756,21 +1725,7 @@ class Files
1756
1725
 
1757
1726
  end
1758
1727
 
1759
- # Methods related to the Forum page in Courses/Groups
1760
- class Forum
1761
1728
 
1762
- include GlobalMethods
1763
- include LeftMenuBar
1764
- include HeaderBar
1765
- include HeaderFooterBar
1766
- include DocButtons
1767
-
1768
- # The frame that contains the CLE Forums objects
1769
- def forum_frame
1770
- self.frame(:src=>/sakai2forums.launch.html/)
1771
- end
1772
-
1773
- end
1774
1729
 
1775
1730
  # TODO - describe class
1776
1731
  class Gadget
@@ -1789,23 +1744,6 @@ class Gadget
1789
1744
 
1790
1745
 
1791
1746
 
1792
- end
1793
-
1794
- # TODO - describe class
1795
- class Gradebook
1796
-
1797
- include PageObject
1798
- include GlobalMethods
1799
- include HeaderFooterBar
1800
- include LeftMenuBar
1801
- include HeaderBar
1802
- include DocButtons
1803
-
1804
- # TODO - Describe method
1805
- def gradebook_frame
1806
- self.frame(:src=>/sakai2gradebook.launch.html/)
1807
- end
1808
-
1809
1747
  end
1810
1748
 
1811
1749
  # TODO - describe class
@@ -6,9 +6,10 @@ module AccountPreferencesPopUp
6
6
  include PageObject
7
7
 
8
8
  # Page Object Definitions
9
+ h1(:account_preferences_title, :id=>"accountpreferences_title")
9
10
  button(:preferences, :id=>"accountpreferences_preferences_tab")
10
11
  button(:privacy_settings, :id=>"accountpreferences_privacy_tab")
11
- button(:password, :id=>"accountpreferences_password_tab")
12
+ button(:password_tab, :id=>"accountpreferences_password_tab")
12
13
 
13
14
  select_list(:time_zone, :id=>"time_zone")
14
15
  select_list(:language, :id=>"pass_language")
@@ -1,16 +1,16 @@
1
1
  spec = Gem::Specification.new do |s|
2
2
  s.name = 'sakai-oae-test-api'
3
- s.version = '0.0.3'
3
+ s.version = '0.0.6'
4
4
  s.summary = %q{Sakai-OAE functional testing API for rSmart Academic}
5
5
  s.description = %q{The Sakai-OAE gem provides an API for interacting with the web pages and page elements in rSmart's deployment of the Sakai Open Academic Environment.}
6
6
  s.files = Dir.glob("**/**/**")
7
7
  s.test_files = Dir.glob("test/*test_rb")
8
8
  s.authors = ["Abraham Heward"]
9
9
  s.email = %w{'aheward@rsmart.com'}
10
- s.homepage = 'https://github.com/aheward/Kuali-Sakai-Functional-Test-Automation-Framework/tree/Sakai-CLE/Sakai/OAE/API'
10
+ s.homepage = 'https://github.com/aheward/Kuali-Sakai-Functional-Test-Automation-Framework/tree/master/Sakai/OAE/API'
11
11
  s.add_dependency 'page-object', '>= 0.6.6'
12
12
  s.add_dependency 'watir-webdriver', '>= 0.5.5'
13
13
  s.add_dependency 'selenium-webdriver', '>= 2.21.2'
14
- s.add_dependency 'kuali-sakai-common-lib', '>= 0.0.1'
14
+ s.add_dependency 'kuali-sakai-common-lib', '>= 0.0.6'
15
15
  s.required_ruby_version = '>= 1.9.2'
16
16
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sakai-oae-test-api
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.3
4
+ version: 0.0.6
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-05-14 00:00:00.000000000 Z
12
+ date: 2012-06-21 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: page-object
@@ -66,7 +66,7 @@ dependencies:
66
66
  requirements:
67
67
  - - ! '>='
68
68
  - !ruby/object:Gem::Version
69
- version: 0.0.1
69
+ version: 0.0.6
70
70
  type: :runtime
71
71
  prerelease: false
72
72
  version_requirements: !ruby/object:Gem::Requirement
@@ -74,7 +74,7 @@ dependencies:
74
74
  requirements:
75
75
  - - ! '>='
76
76
  - !ruby/object:Gem::Version
77
- version: 0.0.1
77
+ version: 0.0.6
78
78
  description: The Sakai-OAE gem provides an API for interacting with the web pages
79
79
  and page elements in rSmart's deployment of the Sakai Open Academic Environment.
80
80
  email:
@@ -84,7 +84,32 @@ extensions: []
84
84
  extra_rdoc_files: []
85
85
  files:
86
86
  - Gemfile
87
- - lib/sakai-oae-test-api/cle_frame_classes.rb
87
+ - Gemfile.lock
88
+ - lib/sakai-oae-test-api/cle_announcements.rb
89
+ - lib/sakai-oae-test-api/cle_assessments.rb
90
+ - lib/sakai-oae-test-api/cle_assignments.rb
91
+ - lib/sakai-oae-test-api/cle_basic_lti.rb
92
+ - lib/sakai-oae-test-api/cle_blogs.rb
93
+ - lib/sakai-oae-test-api/cle_calendar.rb
94
+ - lib/sakai-oae-test-api/cle_calendar_summary.rb
95
+ - lib/sakai-oae-test-api/cle_chat_room.rb
96
+ - lib/sakai-oae-test-api/cle_drop_box.rb
97
+ - lib/sakai-oae-test-api/cle_email_archive.rb
98
+ - lib/sakai-oae-test-api/cle_forums.rb
99
+ - lib/sakai-oae-test-api/cle_gradebook.rb
100
+ - lib/sakai-oae-test-api/cle_gradebook2.rb
101
+ - lib/sakai-oae-test-api/cle_messages.rb
102
+ - lib/sakai-oae-test-api/cle_news.rb
103
+ - lib/sakai-oae-test-api/cle_polls.rb
104
+ - lib/sakai-oae-test-api/cle_post_em.rb
105
+ - lib/sakai-oae-test-api/cle_profile.rb
106
+ - lib/sakai-oae-test-api/cle_profile2.rb
107
+ - lib/sakai-oae-test-api/cle_resources_roster.rb
108
+ - lib/sakai-oae-test-api/cle_rwiki.rb
109
+ - lib/sakai-oae-test-api/cle_sections.rb
110
+ - lib/sakai-oae-test-api/cle_single_user.rb
111
+ - lib/sakai-oae-test-api/cle_site_statistics.rb
112
+ - lib/sakai-oae-test-api/cle_syllabus.rb
88
113
  - lib/sakai-oae-test-api/gem_extensions.rb
89
114
  - lib/sakai-oae-test-api/global_methods.rb
90
115
  - lib/sakai-oae-test-api/page_classes.rb
@@ -94,7 +119,7 @@ files:
94
119
  - lib/sakai-oae-test-api.rb
95
120
  - README.md
96
121
  - sakai-oae-test-api.gemspec
97
- homepage: https://github.com/aheward/Kuali-Sakai-Functional-Test-Automation-Framework/tree/Sakai-CLE/Sakai/OAE/API
122
+ homepage: https://github.com/aheward/Kuali-Sakai-Functional-Test-Automation-Framework/tree/master/Sakai/OAE/API
98
123
  licenses: []
99
124
  post_install_message:
100
125
  rdoc_options: []
@@ -114,7 +139,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
114
139
  version: '0'
115
140
  requirements: []
116
141
  rubyforge_project:
117
- rubygems_version: 1.8.22
142
+ rubygems_version: 1.8.24
118
143
  signing_key:
119
144
  specification_version: 3
120
145
  summary: Sakai-OAE functional testing API for rSmart Academic
@@ -1,2160 +0,0 @@
1
- # coding: UTF-8
2
-
3
- #================
4
- # Assessments pages - "Samigo", a.k.a., "Tests & Quizzes"
5
- #================
6
-
7
- # This is a module containing methods that are
8
- # common to all the question pages inside the
9
- # Assessment section of a Site.
10
- module QuestionHelpers
11
-
12
- include PageObject
13
-
14
- # Saves the question by clicking the Save button, then makes the determination
15
- # whether to instantiate the EditAssessment class, or the EditQuestionPool class.
16
- def save
17
-
18
- quiz = frm.div(:class=>"portletBody").div(:index=>0).text
19
- pool = frm.div(:class=>"portletBody").div(:index=>1).text
20
-
21
- frm.button(:value=>"Save").click
22
-
23
- if quiz =~ /^Assessments/
24
- EditAssessment.new(@browser)
25
- elsif pool =~ /^Question Pools/
26
- EditQuestionPool.new(@browser)
27
- else
28
- puts "Unexpected text: "
29
- p pool
30
- p quiz
31
- end
32
-
33
- end
34
-
35
- in_frame(:index=>1) do |frame|
36
- link(:assessments, :text=>"Assessments", :frame=>frame)
37
- link(:assessment_types, :text=>"Assessment Types", :frame=>frame)
38
- link(:question_pools, :text=>"Question Pools", :frame=>frame)
39
- link(:questions, :text=>/Questions:/, :frame=>frame)
40
- end
41
-
42
- end
43
-
44
-
45
- # The Course Tools "Tests and Quizzes" page for a given site.
46
- # (Instructor view)
47
- class AssessmentsList
48
-
49
- include PageObject
50
-
51
- # This method reads the type of assessment selected for creation,
52
- # then clicks the Create button and instantiates the proper class.
53
- #
54
- # If the assessment is going to be made in the builder, then
55
- # EditAssessment is called. If from Markup text...
56
- def create
57
- builder_or_text = frm.radio(:value=>"1", :name=>"authorIndexForm:_id29").set?
58
-
59
- frm.button(:value=>"Create").click
60
-
61
- if builder_or_text == true
62
- EditAssessment.new(@browser)
63
- else
64
- # Need to add Markup page class, then add the reference here.
65
- end
66
-
67
- end
68
-
69
- # Clicks the Question Pools link, then instantiates
70
- # the QuestionPoolsList class.
71
- def question_pools
72
- #puts "clicking question pools"
73
- #10.times {frm.link(:text=>"Question Pools").flash}
74
- frm.link(:text=>"Question Pools").click
75
- #sleep 200
76
- #puts "clicked..."
77
- #frm.link(:text=>"Add New Pool").wait_until_present
78
- #frm.h3(:text=>"Question Pools").wait_until_present(120)
79
- QuestionPoolsList.new(@browser)
80
- end
81
-
82
- # Collects the titles of the Assessments listed as "Pending"
83
- # then returns them as an Array.
84
- def pending_assessment_titles
85
- titles =[]
86
- pending_table = frm.table(:id=>"authorIndexForm:coreAssessments")
87
- 1.upto(pending_table.rows.size-1) do |x|
88
- titles << pending_table[x][1].span(:id=>/assessmentTitle/).text
89
- end
90
- return titles
91
- end
92
-
93
- # Collects the titles of the Assessments listed as "Published"
94
- # then returns them as an Array.
95
- def published_assessment_titles
96
- titles =[]
97
- published_table = frm.div(:class=>"tier2", :index=>2).table(:class=>"listHier", :index=>0)
98
- 1.upto(published_table.rows.size-1) do |x|
99
- titles << published_table[x][1].span(:id=>/publishedAssessmentTitle/).text
100
- end
101
- return titles
102
- end
103
-
104
- # Returns an Array of the inactive Assessment titles displayed
105
- # in the list.
106
- def inactive_assessment_titles
107
- titles =[]
108
- inactive_table = frm.div(:class=>"tier2", :index=>2).table(:id=>"authorIndexForm:inactivePublishedAssessments")
109
- 1.upto(inactive_table.rows.size-1) do |x|
110
- titles << inactive_table[x][1].span(:id=>/inactivePublishedAssessmentTitle/).text
111
- end
112
- return titles
113
- end
114
-
115
- # Opens the selected test for scoring
116
- # then instantiates the AssessmentTotalScores class.
117
- def score_test(test_title)
118
- frm.tbody(:id=>"authorIndexForm:_id88:tbody_element").row(:text=>/#{Regexp.escape(test_title)}/).link(:id=>/authorIndexToScore/).click
119
- AssessmentTotalScores.new(@browser)
120
- end
121
-
122
- in_frame(:index=>1) do |frame|
123
- link(:assessment_types, :text=>"Assessment Types", :frame=>frame)
124
- text_field(:title, :id=>"authorIndexForm:title", :frame=>frame)
125
- radio_button(:create_using_builder) { |page| page.radio_button_element(:name=>"authorIndexForm:_id29", index=>0, :frame=>frame) }
126
- radio_button(:create_using_text) { |page| page.radio_button_element(:name=>"authorIndexForm:_id29", :index=>$frame_index, :frame=>frame) }
127
- select_list(:select_assessment_type, :id=>"authorIndexForm:assessmentTemplate", :frame=>frame)
128
- button(:import, :id=>"authorIndexForm:import", :frame=>frame)
129
- #(:, :=>"", :frame=>frame)
130
- #(:, :=>"", :frame=>frame)
131
-
132
- end
133
-
134
- end
135
-
136
- # Page that appears when previewing an assessment.
137
- # It shows the basic information about the assessment.
138
- class PreviewOverview
139
-
140
- include PageObject
141
-
142
- # Scrapes the value of the due date from the page. Returns it as a string.
143
- def due_date
144
- frm.div(:class=>"tier2").table(:index=>0)[0][0].text
145
- end
146
-
147
- # Scrapes the value of the time limit from the page. Returns it as a string.
148
- def time_limit
149
- frm.div(:class=>"tier2").table(:index=>0)[3][0].text
150
- end
151
-
152
- # Scrapes the submission limit from the page. Returns it as a string.
153
- def submission_limit
154
- frm.div(:class=>"tier2").table(:index=>0)[6][0].text
155
- end
156
-
157
- # Scrapes the Feedback policy from the page. Returns it as a string.
158
- def feedback
159
- frm.div(:class=>"tier2").table(:index=>0)[9][0].text
160
- end
161
-
162
- # Clicks the Done button, then instantiates
163
- # the EditAssessment class.
164
- def done
165
- frm.button(:name=>"takeAssessmentForm:_id5").click
166
- EditAssessment.new(@browser)
167
- end
168
-
169
- in_frame(:index=>1) do |frame|
170
- button(:begin_assessment, :id=>"takeAssessmentForm:beginAssessment3", :frame=>frame)
171
-
172
- end
173
-
174
- end
175
-
176
- # The Settings page for a particular Assessment
177
- class AssessmentSettings
178
-
179
- include PageObject
180
-
181
- # Scrapes the Assessment Type from the page and returns it as a string.
182
- def assessment_type_title
183
- frm.div(:class=>"tier2").table(:index=>0)[0][1].text
184
- end
185
-
186
- # Scrapes the Assessment Author information from the page and returns it as a string.
187
- def assessment_type_author
188
- frm.div(:class=>"tier2").table(:index=>$frame_index)[1][1].text
189
- end
190
-
191
- # Scrapes the Assessment Type Description from the page and returns it as a string.
192
- def assessment_type_description
193
- frm.div(:class=>"tier2").table(:index=>0)[2][1].text
194
- end
195
-
196
- # Clicks the Save Settings and Publish button
197
- # then instantiates the PublishAssessment class.
198
- def save_and_publish
199
- frm.button(:value=>"Save Settings and Publish").click
200
- PublishAssessment.new(@browser)
201
- end
202
-
203
- in_frame(:index=>1) do |frame|
204
- link(:open, :text=>"Open", :frame=>frame)
205
- link(:close, :text=>"Close", :frame=>frame)
206
- text_field(:title, :id=>"assessmentSettingsAction:intro:assessment_title", :frame=>frame)
207
- text_field(:authors, :id=>"assessmentSettingsAction:intro:assessment_author", :frame=>frame)
208
- text_area(:description, :id=>"assessmentSettingsAction:intro:_id44_textinput", :frame=>frame)
209
- button(:add_attachments_to_intro, :name=>"assessmentSettingsAction:intro:_id90", :frame=>frame)
210
- text_field(:available_date, :id=>"assessmentSettingsAction:startDate", :frame=>frame)
211
- text_field(:due_date, :id=>"assessmentSettingsAction:endDate", :frame=>frame)
212
- text_field(:retract_date, :id=>"assessmentSettingsAction:retractDate", :frame=>frame)
213
- radio_button(:released_to_anonymous) { |page| page.radio_button_element( :name=>"assessmentSettingsAction:_id117", :index=>$frame_index, :frame=>frame) }
214
- radio_button(:released_to_site) { |page| page.radio_button_element( :name=>"assessmentSettingsAction:_id117", :index=>$frame_index, :frame=>frame) }
215
- text_area(:specified_ips, :name=>"assessmentSettingsAction:_id132", :frame=>frame)
216
- text_field(:secondary_id, :id=>"assessmentSettingsAction:username", :frame=>frame)
217
- text_field(:secondary_pw, :id=>"assessmentSettingsAction:password", :frame=>frame)
218
- checkbox(:timed_assessment, :id=>"assessmentSettingsAction:selTimeAssess", :frame=>frame)
219
- select_list(:limit_hour, :id=>"assessmentSettingsAction:timedHours", :frame=>frame)
220
- select_list(:limit_mins, :id=>"assessmentSettingsAction:timedMinutes", :frame=>frame)
221
- radio_button(:linear_access) { |page| page.radio_button_element( :name=>"assessmentSettingsAction:itemNavigation", :index=>$frame_index, :frame=>frame) }
222
- radio_button(:random_access) { |page| page.radio_button_element( :name=>"assessmentSettingsAction:itemNavigation", :index=>$frame_index, :frame=>frame) }
223
- radio_button(:question_per_page) { |page| page.radio_button_element( :name=>"assessmentSettingsAction:assessmentFormat", :index=>$frame_index, :frame=>frame) }
224
- radio_button(:part_per_page) { |page| page.radio_button_element( :name=>"assessmentSettingsAction:assessmentFormat", :index=>$frame_index, :frame=>frame) }
225
- radio_button(:assessment_per_page) { |page| page.radio_button_element( :name=>"assessmentSettingsAction:assessmentFormat", :index=>2, :frame=>frame) }
226
- radio_button(:continuous_numbering) { |page| page.radio_button_element( :name=>"assessmentSettingsAction:itemNumbering", :index=>$frame_index, :frame=>frame) }
227
- radio_button(:restart_per_part) { |page| page.radio_button_element( :name=>"assessmentSettingsAction:itemNumbering", :index=>$frame_index, :frame=>frame) }
228
- checkbox(:add_mark_for_review, :id=>"assessmentSettingsAction:markForReview1", :frame=>frame)
229
- radio_button(:unlimited_submissions) { |page| page.radio_button_element( :name=>"assessmentSettingsAction:unlimitedSubmissions", :index=>$frame_index, :frame=>frame) }
230
- radio_button(:only_x_submissions) { |page| page.radio_button_element( :name=>"assessmentSettingsAction:unlimitedSubmissions", :index=>$frame_index, :frame=>frame) }
231
- text_field(:allowed_submissions, :id=>"assessmentSettingsAction:submissions_Allowed", :frame=>frame)
232
- radio_button(:late_submissions_not_accepted) { |page| page.radio_button_element( :name=>"assessmentSettingsAction:lateHandling", :index=>$frame_index, :frame=>frame) }
233
- radio_button(:late_submissions_accepted) { |page| page.radio_button_element( :name=>"assessmentSettingsAction:lateHandling", :index=>$frame_index, :frame=>frame) }
234
- text_area(:submission_message, :id=>"assessmentSettingsAction:_id245_textinput", :frame=>frame)
235
- text_field(:final_page_url, :id=>"assessmentSettingsAction:finalPageUrl", :frame=>frame)
236
- radio_button(:question_level_feedback) { |page| page.radio_button_element( :name=>"assessmentSettingsAction:feedbackAuthoring", :index=>$frame_index, :frame=>frame) }
237
- radio_button(:selection_level_feedback) { |page| page.radio_button_element( :name=>"assessmentSettingsAction:feedbackAuthoring", :index=>$frame_index, :frame=>frame) }
238
- radio_button(:both_feedback_levels) { |page| page.radio_button_element( :name=>"assessmentSettingsAction:feedbackAuthoring", :index=>2, :frame=>frame) }
239
- radio_button(:immediate_feedback) { |page| page.radio_button_element( :name=>"assessmentSettingsAction:feedbackDelivery", :index=>$frame_index, :frame=>frame) }
240
- radio_button(:feedback_on_submission) { |page| page.radio_button_element( :name=>"assessmentSettingsAction:feedbackDelivery", :index=>$frame_index, :frame=>frame) }
241
- radio_button(:no_feedback) { |page| page.radio_button_element( :name=>"assessmentSettingsAction:feedbackDelivery", :index=>2, :frame=>frame) }
242
- radio_button(:feedback_on_date) { |page| page.radio_button_element( :name=>"assessmentSettingsAction:feedbackDelivery", :index=>3, :frame=>frame) }
243
- text_field(:feedback_date, :id=>"assessmentSettingsAction:feedbackDate", :frame=>frame)
244
- radio_button(:only_release_scores) { |page| page.radio_button_element( :name=>"assessmentSettingsAction:feedbackComponentOption", :index=>$frame_index, :frame=>frame) }
245
- radio_button(:release_questions_and) { |page| page.radio_button_element( :name=>"assessmentSettingsAction:feedbackComponentOption", :index=>$frame_index, :frame=>frame) }
246
- checkbox(:release_student_response, :id=>"assessmentSettingsAction:feedbackCheckbox1", :frame=>frame)
247
- checkbox(:release_correct_response, :id=>"assessmentSettingsAction:feedbackCheckbox3", :frame=>frame)
248
- checkbox(:release_students_assessment_scores, :id=>"assessmentSettingsAction:feedbackCheckbox5", :frame=>frame)
249
- checkbox(:release_students_question_and_part_scores, :id=>"assessmentSettingsAction:feedbackCheckbox7", :frame=>frame)
250
- checkbox(:release_question_level_feedback, :id=>"assessmentSettingsAction:feedbackCheckbox2", :frame=>frame)
251
- checkbox(:release_selection_level_feedback, :id=>"assessmentSettingsAction:feedbackCheckbox4", :frame=>frame)
252
- checkbox(:release_graders_comments, :id=>"assessmentSettingsAction:feedbackCheckbox6", :frame=>frame)
253
- checkbox(:release_statistics, :id=>"assessmentSettingsAction:feedbackCheckbox8", :frame=>frame)
254
- radio_button(:student_ids_seen) { |page| page.radio_button_element( :name=>"assessmentSettingsAction:anonymousGrading1", :index=>$frame_index, :frame=>frame) }
255
- radio_button(:anonymous_grading) { |page| page.radio_button_element( :name=>"assessmentSettingsAction:anonymousGrading1", :index=>$frame_index, :frame=>frame) }
256
- #radio_button(:no_gradebook_options) { |page| page.radio_button_element( :name=>"", :index=>$frame_index, :frame=>frame) }
257
- #radio_button(:grades_sent_to_gradebook) { |page| page.radio_button_element( :name=>"", :index=>$frame_index, :frame=>frame) }
258
- #radio_button(:record_highest_score) { |page| page.radio_button_element( :name=>"", :index=>$frame_index, :frame=>frame) }
259
- #radio_button(:record_last_score) { |page| page.radio_button_element( :name=>"", :index=>$frame_index, :frame=>frame) }
260
- #radio_button(:background_color) { |page| page.radio_button_element( :name=>"", :index=>$frame_index, :frame=>frame) }
261
- #text_field(:color_value, :id=>"", :frame=>frame)
262
- #radio_button(:background_image) { |page| page.radio_button_element( :name=>"", :index=>$frame_index, :frame=>frame) }
263
- #text_field(:image_name, :=>"", :frame=>frame)
264
- #text_field(:keywords, :=>"", :frame=>frame)
265
- #text_field(:objectives, :=>"", :frame=>frame)
266
- #text_field(:rubrics, :=>"", :frame=>frame)
267
- #checkbox(:record_metadata_for_questions, :=>"", :frame=>frame)
268
- button(:save, :name=>"assessmentSettingsAction:_id383", :frame=>frame)
269
- button(:cancel, :name=>"assessmentSettingsAction:_id385", :frame=>frame)
270
-
271
- end
272
-
273
- end
274
-
275
- # Instructor's view of Students' assessment scores
276
- class AssessmentTotalScores
277
-
278
- include PageObject
279
-
280
- # Gets the user ids listed in the
281
- # scores table, returns them as an Array
282
- # object.
283
- #
284
- # Note that this method is only appropriate when student
285
- # identities are not being obscured on this page. If student
286
- # submissions are set to be anonymous then this method will fail
287
- # to return any ids.
288
- def student_ids
289
- ids = []
290
- scores_table = frm.table(:id=>"editTotalResults:totalScoreTable").to_a
291
- scores_table.delete_at(0)
292
- scores_table.each { |row| ids << row[1] }
293
- return ids
294
- end
295
-
296
- # Adds a comment to the specified student's comment box.
297
- #
298
- # Note that this method assumes that the student identities are not being
299
- # obscured on this page. If they are, then this method will not work for
300
- # selecting the appropriate comment box.
301
- def comment_for_student(student_id, comment)
302
- index_val = student_ids.index(student_id)
303
- frm.text_field(:name=>"editTotalResults:totalScoreTable:#{index_val}:_id345").value=comment
304
- end
305
-
306
- # Clicks the Submit Date link in the table header to sort/reverse sort the list.
307
- def sort_by_submit_date
308
- frm.link(:text=>"Submit Date").click
309
- end
310
-
311
- # Enters the specified string into the topmost box listed on the page.
312
- #
313
- # This method is especially useful when the student identities are obscured, since
314
- # in that situation you can't target a specific student's comment box, obviously.
315
- def comment_in_first_box=(comment)
316
- frm.text_field(:name=>"editTotalResults:totalScoreTable:0:_id345").value=comment
317
- end
318
-
319
- # Clicks the Update button, then instantiates
320
- # the AssessmentTotalScores class.
321
- def update
322
- frm.button(:value=>"Update").click
323
- AssessmentTotalScores.new(@browser)
324
- end
325
-
326
- # Clicks the Assessments link on the page
327
- # then instantiates the AssessmentsList class.
328
- def assessments
329
- frm.link(:text=>"Assessments").click
330
- AssessmentsList.new(@browser)
331
- end
332
-
333
- end
334
-
335
- # The page that appears when you're creating a new quiz
336
- # or editing an existing one
337
- class EditAssessment
338
-
339
- include PageObject
340
-
341
- # Allows insertion of a question at a specified
342
- # point in the Assessment. Must include the
343
- # part number, the question number, and the type of
344
- # question. Question Type must match the Type
345
- # value in the drop down.
346
- #
347
- # The method will instantiate the page class
348
- # based on the selected question type.
349
- def insert_question_after(part_num, question_num, qtype)
350
- if question_num.to_i == 0
351
- frm.select(:id=>"assesssmentForm:parts:#{part_num.to_i - 1}:changeQType").select(qtype)
352
- else
353
- frm.select(:id=>"assesssmentForm:parts:#{part_num.to_i - 1}:parts:#{question_num.to_i - 1}:changeQType").select(qtype)
354
- end
355
-
356
- page = case(qtype)
357
- when "Multiple Choice" then MultipleChoice.new(@browser)
358
- when "True False" then TrueFalse.new(@browser)
359
- when "Survey" then Survey.new(@browser)
360
- when "Short Answer/Essay" then ShortAnswer.new(@browser)
361
- when "Fill in the Blank" then FillInBlank.new(@browser)
362
- when "Numeric Response" then NumericResponse.new(@browser)
363
- when "Matching" then Matching.new(@browser)
364
- when "Audio Recording" then AudioRecording.new(@browser)
365
- when "File Upload" then FileUpload.new(@browser)
366
- else puts "#{qtype} is not a valid question type"
367
- end
368
-
369
- return page
370
-
371
- end
372
-
373
- # Allows removal of question by part number and question number.
374
- def remove_question(part_num, question_num)
375
- frm.link(:id=>"assesssmentForm:parts:#{part_num.to_i-1}:parts:#{question_num.to_i-1}:deleteitem").click
376
- end
377
-
378
- # Allows editing of a question by specifying its part number
379
- # and question number.
380
- def edit_question(part_num, question_num)
381
- frm.link(:id=>"assesssmentForm:parts:#{part_num.to_i-1}:parts:#{question_num.to_i-1}:modify").click
382
- end
383
-
384
- # Allows copying an Assessment part to a Pool.
385
- def copy_part_to_pool(part_num)
386
- frm.link(:id=>"assesssmentForm:parts:#{part_num.to_i-1}:copyToPool").click
387
- end
388
-
389
- # Allows removing a specified
390
- # Assessment part number.
391
- def remove_part(part_num)
392
- frm.link(:xpath, "//a[contains(@onclick, 'assesssmentForm:parts:#{part_num.to_i-1}:copyToPool')]").click
393
- end
394
-
395
- # Clicks the Add Part button, then
396
- # instantiates the AddEditAssessmentPart page class.
397
- def add_part
398
- frm.link(:text=>"Add Part").click
399
- AddEditAssessmentPart.new(@browser)
400
- end
401
-
402
- # Selects the desired question type from the
403
- # drop down list, then instantiates the appropriate
404
- # page class.
405
- def select_question_type(qtype)
406
- frm.select(:id=>"assesssmentForm:changeQType").select(qtype)
407
-
408
- page = case(qtype)
409
- when "Multiple Choice" then MultipleChoice.new(@browser)
410
- when "True False" then TrueFalse.new(@browser)
411
- when "Survey" then Survey.new(@browser)
412
- when "Short Answer/Essay" then ShortAnswer.new(@browser)
413
- when "Fill in the Blank" then FillInBlank.new(@browser)
414
- when "Numeric Response" then NumericResponse.new(@browser)
415
- when "Matching" then Matching.new(@browser)
416
- when "Audio Recording" then AudioRecording.new(@browser)
417
- when "File Upload" then FileUpload.new(@browser)
418
- else puts "#{qtype} is not a valid question type"
419
- end
420
-
421
- return page
422
-
423
- end
424
-
425
- # Clicks the Preview button,
426
- # then instantiates the PreviewOverview page class.
427
- def preview
428
- frm.link(:text=>"Preview").click
429
- PreviewOverview.new(@browser)
430
- end
431
-
432
- # Clicks the Settings link, then
433
- # instantiates the AssessmentSettings page class.
434
- def settings
435
- frm.link(:text=>"Settings").click
436
- AssessmentSettings.new(@browser)
437
- end
438
-
439
- # Clicks the Publish button, then
440
- # instantiates the PublishAssessment page class.
441
- def publish
442
- frm.link(:text=>"Publish").click
443
- PublishAssessment.new(@browser)
444
- end
445
-
446
- # Clicks the Question Pools button, then
447
- # instantiates the QuestionPoolsList page class.
448
- def question_pools
449
- frm.link(:text=>"Question Pools").click
450
- QuestionPoolsList.new(@browser)
451
- end
452
-
453
- # Allows retrieval of a specified question's
454
- # text, by part and question number.
455
- def get_question_text(part_number, question_number)
456
- frm.table(:id=>"assesssmentForm:parts:#{part_number.to_i-1}:parts").div(:class=>"tier3", :index=>question_number.to_i-1).text
457
- end
458
-
459
- in_frame(:index=>1) do |frame|
460
- link(:assessments, :text=>"Assessments", :frame=>frame)
461
- link(:assessment_types, :text=>"Assessment Types", :frame=>frame)
462
- link(:print, :text=>"Print", :frame=>frame)
463
- button(:update_points, :id=>"assesssmentForm:pointsUpdate", :frame=>frame)
464
- end
465
-
466
- end
467
-
468
- # This is the page for adding and editing a part of an assessment
469
- class AddEditAssessmentPart
470
-
471
- include PageObject
472
-
473
- # Clicks the Save button, then instantiates
474
- # the EditAssessment page class.
475
- def save
476
- frm.button(:name=>"modifyPartForm:_id89").click
477
- EditAssessment.new(@browser)
478
- end
479
-
480
- in_frame(:index=>1) do |frame|
481
- text_field(:title, :id=>"modifyPartForm:title", :frame=>frame)
482
- text_area(:information, :id=>"modifyPartForm:_id10_textinput", :frame=>frame)
483
- button(:add_attachments, :name=>"modifyPartForm:_id54", :frame=>frame)
484
- radio_button(:questions_one_by_one) { |page| page.radio_button_element(:index=>0, :name=>"modifyPartForm:_id60", :frame=>frame)}
485
- radio_button(:random_draw) { |page| page.radio_button_element(:index=>1, :name=>"modifyPartForm:_id60", :frame=>frame) }
486
- select_list(:pool_name, :id=>"modifyPartForm:assignToPool", :frame=>frame)
487
- text_field(:number_of_questions, :id=>"modifyPartForm:numSelected", :frame=>frame)
488
- text_field(:point_value_of_questions, :id=>"modifyPartForm:numPointsRandom", :frame=>frame)
489
- text_field(:negative_point_value, :id=>"modifyPartForm:numDiscountRandom", :frame=>frame)
490
- radio_button(:randomized_each_time) { |page| page.radio_button_element(:index=>0, :name=>"modifyPartForm:randomizationType", :frame=>frame) }
491
- radio_button(:randomized_once) { |page| page.radio_button_element(:index=>1, :name=>"modifyPartForm:randomizationType", :frame=>frame) }
492
- radio_button(:order_as_listed) { |page| page.radio_button_element(:index=>0, :name=>"modifyPartForm:_id81", :frame=>frame) }
493
- radio_button(:random_within_part) { |page| page.radio_button_element(:index=>1, :name=>"modifyPartForm:_id81", :frame=>frame) }
494
- text_field(:objective, :id=>"modifyPartForm:obj", :frame=>frame)
495
- text_field(:keyword, :id=>"modifyPartForm:keyword", :frame=>frame)
496
- text_field(:rubric, :id=>"modifyPartForm:rubric", :frame=>frame)
497
- button(:cancel, :name=>"modifyPartForm:_id90", :frame=>frame)
498
- end
499
-
500
- end
501
-
502
- # The review page once you've selected to Save and Publish
503
- # the assessment
504
- class PublishAssessment
505
-
506
- include PageObject
507
-
508
- # Clicks the Publish button, then
509
- # instantiates the AssessmentsList page class.
510
- def publish
511
- frm.button(:value=>"Publish").click
512
- AssessmentsList.new(@browser)
513
- end
514
-
515
- in_frame(:index=>1) do |frame|
516
- button(:cancel, :value=>"Cancel", :frame=>frame)
517
- button(:edit, :name=>"publishAssessmentForm:_id23", :frame=>frame)
518
- select_list(:notification, :id=>"publishAssessmentForm:number", :frame=>frame)
519
-
520
- end
521
-
522
- end
523
-
524
- # The page for setting up a multiple choice question
525
- class MultipleChoice
526
-
527
- include PageObject
528
- include QuestionHelpers
529
-
530
- in_frame(:class=>"portletMainIframe") do |frame|
531
- button(:cancel, :value=>"Cancel", :frame=>frame)
532
- text_field(:answer_point_value, :id=>"itemForm:answerptr", :frame=>frame)
533
- link(:whats_this, :text=>"(What's This?)", :frame=>frame)
534
- radio_button(:single_correct) { |page| page.radio_button_element(:name=>"itemForm:chooseAnswerTypeForMC", :index=>0, :frame=>frame) }
535
- radio_button(:enable_negative_marking) { |page| page.radio_button_element(:name=>"itemForm:partialCreadit_NegativeMarking", :index=>0, :frame=>frame) }
536
-
537
- # Element present when negative marking selected:
538
- text_field(:negative_point_value, :id=>"itemForm:answerdsc", :frame=>frame)
539
-
540
- radio_button(:enable_partial_credit) { |page| page.radio_button_element(:name=>"itemForm:partialCreadit_NegativeMarking", :index=>1, :frame=>frame) }
541
- link(:reset_to_default, :text=>"Reset to Default Grading Logic", :frame=>frame)
542
- radio_button(:multi_single) {|page| page.radio_button_element(:name=>"itemForm:chooseAnswerTypeForMC", :index=>1, :frame=>frame) }
543
- radio_button(:multi_multi) {|page| page.radio_button_element(:name=>"itemForm:chooseAnswerTypeForMC", :index=>2, :frame=>frame) }
544
- text_area(:question_text, :id=>"itemForm:_id82_textinput", :frame=>frame)
545
- button(:add_attachments, :name=>"itemForm:_id126", :frame=>frame)
546
-
547
- text_area(:answer_a, :id=>"itemForm:mcchoices:0:_id140_textinput", :frame=>frame)
548
- link(:remove_a, :id=>"itemForm:mcchoices:0:removelinkSingle", :frame=>frame)
549
- text_area(:answer_b, :id=>"itemForm:mcchoices:1:_id140_textinput", :frame=>frame)
550
- link(:remove_b, :id=>"itemForm:mcchoices:1:removelinkSingle", :frame=>frame)
551
- text_area(:answer_c, :id=>"itemForm:mcchoices:2:_id140_textinput", :frame=>frame)
552
- link(:remove_c, :id=>"itemForm:mcchoices:2:removelinkSingle", :frame=>frame)
553
- text_area(:answer_d, :id=>"itemForm:mcchoices:3:_id140_textinput", :frame=>frame)
554
- link(:remove_d, :id=>"itemForm:mcchoices:3:removelinkSingle", :frame=>frame)
555
-
556
- # Radio buttons that appear when "single correct" is selected
557
- radio_button(:a_correct, :name=>"itemForm:mcchoices:0:mcradiobtn", :frame=>frame)
558
- radio_button(:b_correct, :name=>"itemForm:mcchoices:1:mcradiobtn", :frame=>frame)
559
- radio_button(:c_correct, :name=>"itemForm:mcchoices:2:mcradiobtn", :frame=>frame)
560
- radio_button(:d_correct, :name=>"itemForm:mcchoices:3:mcradiobtn", :frame=>frame)
561
-
562
- # % Value fields that appear when "single correct" and "partial credit" selected
563
- text_field(:a_value, :id=>"itemForm:mcchoices:0:partialCredit", :frame=>frame)
564
- text_field(:b_value, :id=>"itemForm:mcchoices:1:partialCredit", :frame=>frame)
565
- text_field(:c_value, :id=>"itemForm:mcchoices:2:partialCredit", :frame=>frame)
566
- text_field(:d_value, :id=>"itemForm:mcchoices:3:partialCredit", :frame=>frame)
567
-
568
- link(:reset_score_values, :text=>"Reset Score Values", :frame=>frame)
569
-
570
- # Checkboxes that appear when "multiple correct" is selected
571
- checkbox(:a_correct, :name=>"itemForm:mcchoices:0:mccheckboxes", :frame=>frame)
572
- checkbox(:b_correct, :name=>"itemForm:mcchoices:1:mccheckboxes", :frame=>frame)
573
- checkbox(:c_correct, :name=>"itemForm:mcchoices:2:mccheckboxes", :frame=>frame)
574
- checkbox(:d_correct, :name=>"itemForm:mcchoices:3:mccheckboxes", :frame=>frame)
575
-
576
- select_list(:insert_additional_answers, :id=>"itemForm:insertAdditionalAnswerSelectMenu", :frame=>frame)
577
- radio_button(:randomize_answers_yes) {|page| page.radio_button_element(:index=>0, :name=>"itemForm:_id162", :frame=>frame) }
578
- radio_button(:randomize_answers_no) {|page| page.radio_button_element(:index=>1, :name=>"itemForm:_id162", :frame=>frame) }
579
- radio_button(:require_rationale_yes) {|page| page.radio_button_element(:index=>0, :name=>"itemForm:_id166", :frame=>frame) }
580
- radio_button(:require_rationale_no) {|page| page.radio_button_element(:index=>1, :name=>"itemForm:_id166", :frame=>frame) }
581
- select_list(:assign_to_part, :id=>"itemForm:assignToPart", :frame=>frame)
582
- select_list(:assign_to_pool, :id=>"itemForm:assignToPool", :frame=>frame)
583
- text_area(:feedback_for_correct, :id=>"itemForm:_id186_textinput", :frame=>frame)
584
- text_area(:feedback_for_incorrect, :id=>"itemForm:_id190_textinput", :frame=>frame)
585
-
586
- end
587
-
588
- end
589
-
590
- # The page for setting up a Survey question
591
- class Survey
592
-
593
- include PageObject
594
- include QuestionHelpers
595
-
596
- in_frame(:index=>1) do |frame|
597
- button(:cancel, :id=>"itemForm:_id63", :frame=>frame)
598
- text_area(:question_text, :id=>"itemForm:_id69_textinput", :frame=>frame)
599
- button(:add_attachments, :id=>"itemForm:_id113", :frame=>frame)
600
- radio_button(:yes_no) { |page| page.radio_button_element(:index=>0, :name=>"itemForm:selectscale", :frame=>frame) }
601
- radio_button(:disagree_agree) {|page| page.radio_button_element(:index=>1, :name=>"itemForm:selectscale", :frame=>frame) }
602
- radio_button(:disagree_undecided) {|page| page.radio_button_element(:index=>2, :name=>"itemForm:selectscale", :frame=>frame) }
603
- radio_button(:below_above) {|page| page.radio_button_element(:index=>3, :name=>"itemForm:selectscale", :frame=>frame)}
604
- radio_button(:strongly_agree) {|page| page.radio_button_element(:index=>4, :name=>"itemForm:selectscale", :frame=>frame)}
605
- radio_button(:unacceptable_excellent) {|page| page.radio_button_element(:index=>5, :name=>"itemForm:selectscale", :frame=>frame)}
606
- radio_button(:one_to_five) {|page| page.radio_button_element(:index=>6, :name=>"itemForm:selectscale", :frame=>frame)}
607
- radio_button(:one_to_ten) {|page| page.radio_button_element(:index=>7, :name=>"itemForm:selectscale", :frame=>frame)}
608
- text_area(:feedback, :id=>"itemForm:_id140_textinput", :frame=>frame)
609
- select_list(:assign_to_part, :id=>"itemForm:assignToPart", :frame=>frame)
610
- select_list(:assign_to_pool, :id=>"itemForm:assignToPool", :frame=>frame)
611
-
612
- end
613
-
614
- end
615
-
616
- # The page for setting up a Short Answer/Essay question
617
- class ShortAnswer
618
-
619
- include PageObject
620
- include QuestionHelpers
621
-
622
- in_frame(:index=>1) do |frame|
623
- button(:cancel, :id=>"itemForm:_id63", :frame=>frame)
624
- text_field(:answer_point_value, :id=>"itemForm:answerptr", :frame=>frame)
625
- text_area(:question_text, :id=>"itemForm:_id69_textinput", :frame=>frame)
626
- button(:add_attachments, :id=>"itemForm:_id113", :frame=>frame)
627
- text_area(:model_short_answer, :id=>"itemForm:_id129_textinput", :frame=>frame)
628
- text_area(:feedback, :id=>"itemForm:_id133_textinput", :frame=>frame)
629
- select_list(:assign_to_part, :id=>"itemForm:assignToPart", :frame=>frame)
630
- select_list(:assign_to_pool, :id=>"itemForm:assignToPool", :frame=>frame)
631
-
632
- end
633
-
634
- end
635
-
636
- # The page for setting up a Fill-in-the-blank question
637
- class FillInBlank
638
-
639
- include PageObject
640
- include QuestionHelpers
641
-
642
- in_frame(:index=>1) do |frame|
643
- button(:cancel, :id=>"itemForm:_id63", :frame=>frame)
644
- text_field(:answer_point_value, :id=>"itemForm:answerptr", :frame=>frame)
645
- text_area(:question_text, :id=>"itemForm:_id75_textinput", :frame=>frame)
646
- checkbox(:case_sensitive, :name=>"itemForm:_id76", :frame=>frame)
647
- checkbox(:mutually_exclusive, :name=>"itemForm:_id78", :frame=>frame)
648
- button(:add_attachments, :id=>"itemForm:_id126", :frame=>frame)
649
- select_list(:assign_to_part, :id=>"itemForm:assignToPart", :frame=>frame)
650
- select_list(:assign_to_pool, :id=>"itemForm:assignToPool", :frame=>frame)
651
-
652
- end
653
-
654
- end
655
-
656
- # The page for setting up a numeric response question
657
- class NumericResponse
658
-
659
- include PageObject
660
- include QuestionHelpers
661
-
662
- in_frame(:index=>1) do |frame|
663
- button(:cancel, :id=>"itemForm:_id63", :frame=>frame)
664
- text_field(:answer_point_value, :id=>"itemForm:answerptr", :frame=>frame)
665
- text_area(:question_text, :id=>"itemForm:_id73_textinput", :frame=>frame)
666
- button(:add_attachments, :id=>"itemForm:_id117", :frame=>frame)
667
- text_area(:feedback_for_correct, :id=>"itemForm:_id133_textinput", :frame=>frame)
668
- text_area(:feedback_for_incorrect, :id=>"itemForm:_id135_textinput", :frame=>frame)
669
- select_list(:assign_to_part, :id=>"itemForm:assignToPart", :frame=>frame)
670
- select_list(:assign_to_pool, :id=>"itemForm:assignToPool", :frame=>frame)
671
-
672
- end
673
-
674
- end
675
-
676
- # The page for setting up a matching question
677
- class Matching
678
-
679
- include PageObject
680
- include QuestionHelpers
681
-
682
- in_frame(:index=>1) do |frame|
683
- button(:cancel, :id=>"itemForm:_id63", :frame=>frame)
684
- text_field(:answer_point_value, :id=>"itemForm:answerptr", :frame=>frame)
685
- text_area(:question_text, :id=>"itemForm:_id78_textinput", :frame=>frame)
686
- button(:add_attachments, :id=>"itemForm:_id122", :frame=>frame)
687
- text_area(:choice, :id=>"itemForm:_id147_textinput", :frame=>frame)
688
- text_area(:match, :id=>"itemForm:_id151_textinput", :frame=>frame)
689
- button(:save_pairing, :name=>"itemForm:_id164", :frame=>frame)
690
- text_area(:feedback_for_correct, :id=>"itemForm:_id184_textinput", :frame=>frame)
691
- text_area(:feedback_for_incorrect, :id=>"itemForm:_id189_textinput", :frame=>frame)
692
- select_list(:assign_to_part, :id=>"itemForm:assignToPart", :frame=>frame)
693
- select_list(:assign_to_pool, :id=>"itemForm:assignToPool", :frame=>frame)
694
-
695
- end
696
-
697
- end
698
-
699
- # The page for setting up a True/False question
700
- class TrueFalse
701
-
702
- include PageObject
703
- include QuestionHelpers
704
-
705
- in_frame(:index=>1) do |frame|
706
- button(:cancel, :id=>"itemForm:_id63", :frame=>frame)
707
- text_field(:answer_point_value, :id=>"itemForm:answerptr", :frame=>frame)
708
- text_area(:question_text, :id=>"itemForm:_id77_textinput", :frame=>frame)
709
- button(:add_attachments, :id=>"itemForm:_id121", :frame=>frame)
710
- text_field(:negative_point_value, :id=>"itemForm:answerdsc", :frame=>frame)
711
- radio_button(:answer_true) {|page| page.radio_button_element(:index=>0, :name=>"itemForm:TF", :frame=>frame)}
712
- radio_button(:answer_false) {|page| page.radio_button_element(:index=>1, :name=>"itemForm:TF", :frame=>frame)}
713
- radio_button(:required_rationale_yes) {|page| page.radio_button_element(:index=>0, :name=>"itemForm:rational", :frame=>frame)}
714
- radio_button(:required_rationale_no) {|page| page.radio_button_element(:index=>1, :name=>"itemForm:rational", :frame=>frame)}
715
- text_area(:feedback_for_correct, :id=>"itemForm:_id148_textinput", :frame=>frame)
716
- text_area(:feedback_for_incorrect, :id=>"itemForm:_id152_textinput", :frame=>frame)
717
- select_list(:assign_to_part, :id=>"itemForm:assignToPart", :frame=>frame)
718
- select_list(:assign_to_pool, :id=>"itemForm:assignToPool", :frame=>frame)
719
-
720
- end
721
-
722
- end
723
-
724
- # The page for setting up a question that requires an audio response
725
- class AudioRecording
726
-
727
- include PageObject
728
- include QuestionHelpers
729
-
730
- in_frame(:index=>1) do |frame|
731
- button(:cancel, :id=>"itemForm:_id63", :frame=>frame)
732
- text_field(:answer_point_value, :id=>"itemForm:answerptr", :frame=>frame)
733
- text_area(:question_text, :id=>"itemForm:_id69_textinput", :frame=>frame)
734
- button(:add_attachments, :id=>"itemForm:_id113", :frame=>frame)
735
- text_field(:time_allowed, :id=>"itemForm:timeallowed", :frame=>frame)
736
- select_list(:number_of_attempts, :id=>"itemForm:noattempts", :frame=>frame)
737
- text_field(:feedback, :id=>"itemForm:_id146_textinput", :frame=>frame)
738
- select_list(:assign_to_part, :id=>"itemForm:assignToPart", :frame=>frame)
739
- select_list(:assign_to_pool, :id=>"itemForm:assignToPool", :frame=>frame)
740
-
741
- end
742
-
743
- end
744
-
745
- # The page for setting up a question that requires
746
- # attaching a file
747
- class FileUpload
748
-
749
- include PageObject
750
- include QuestionHelpers
751
-
752
- in_frame(:index=>1) do |frame|
753
- button(:cancel, :id=>"itemForm:_id63", :frame=>frame)
754
- text_field(:answer_point_value, :id=>"itemForm:answerptr", :frame=>frame)
755
- text_area(:question_text, :id=>"itemForm:_id69_textinput", :frame=>frame)
756
- button(:add_attachments, :id=>"itemForm:_id113", :frame=>frame)
757
- text_field(:feedback, :id=>"itemForm:_id130_textinput", :frame=>frame)
758
- select_list(:assign_to_part, :id=>"itemForm:assignToPart", :frame=>frame)
759
- select_list(:assign_to_pool, :id=>"itemForm:assignToPool", :frame=>frame)
760
-
761
- end
762
-
763
- end
764
-
765
- # The page that appears when you are editing a type of assessment
766
- class EditAssessmentType
767
-
768
- include PageObject
769
-
770
- in_frame(:index=>1) do |frame|
771
- #(:, :=>"", :frame=>frame)
772
- #(:, :=>"", :frame=>frame)
773
- #(:, :=>"", :frame=>frame)
774
- #(:, :=>"", :frame=>frame)
775
- #(:, :=>"", :frame=>frame)
776
-
777
- end
778
-
779
- end
780
-
781
- # The Page that appears when adding a new question pool
782
- class AddQuestionPool
783
-
784
- include PageObject
785
-
786
- # Clicks the Save button, then
787
- # instantiates the QuestionPoolsList page class.
788
- def save
789
- #10.times {frm.button(:id=>"questionpool:submit").flash}
790
- frm.button(:id=>"questionpool:submit").click
791
- #sleep 180
792
- #frm.button(:value=>"Create").wait_until_present(120)
793
- QuestionPoolsList.new(@browser)
794
- end
795
-
796
- def cancel
797
- frm.button(:value=>"Cancel").click
798
- QuestionPoolsList.new @browser
799
- end
800
-
801
- in_frame(:index=>1) do |frame|
802
- text_field(:pool_name, :id=>"questionpool:namefield", :frame=>frame)
803
- text_field(:department_group, :id=>"questionpool:orgfield", :frame=>frame)
804
- text_area(:description, :id=>"questionpool:descfield", :frame=>frame)
805
- text_field(:objectives, :id=>"questionpool:objfield", :frame=>frame)
806
- text_field(:keywords, :id=>"questionpool:keyfield", :frame=>frame)
807
-
808
- end
809
-
810
- end
811
-
812
- # The Page that appears when editing an existing question pool
813
- class EditQuestionPool
814
-
815
- include PageObject
816
-
817
- # Clicks the Add Question link, then
818
- # instantiates the SelectQuestionType class.
819
- def add_question
820
- frm.link(:id=>"editform:addQlink").click
821
- SelectQuestionType.new(@browser)
822
- end
823
-
824
- # Clicks the Question Pools link, then
825
- # instantiates the QuestionPoolsList class.
826
- def question_pools
827
- frm.link(:text=>"Question Pools").click
828
- QuestionPoolsList.new(@browser)
829
- end
830
-
831
- in_frame(:index=>1) do |frame|
832
- text_field(:pool_name, :id=>"editform:namefield", :frame=>frame)
833
- text_field(:department_group, :id=>"editform:orgfield", :frame=>frame)
834
- text_area(:description, :id=>"editform:descfield", :frame=>frame)
835
- text_field(:objectives, :id=>"editform:objfield", :frame=>frame)
836
- text_field(:keywords, :id=>"editform:keyfield", :frame=>frame)
837
- button(:update, :id=>"editform:Update", :frame=>frame)
838
- button(:save, :id=>"questionpool:submit", :frame=>frame)
839
- button(:cancel, :id=>"questionpool:_id11", :frame=>frame)
840
-
841
- end
842
-
843
- end
844
-
845
- # The page with the list of existing Question Pools
846
- class QuestionPoolsList
847
-
848
- include PageObject
849
-
850
- # Clicks the edit button, then instantiates
851
- # the EditQuestionPool page class.
852
- def edit_pool(name)
853
- frm.span(:text=>name).fire_event("onclick")
854
- EditQuestionPool.new(@browser)
855
- end
856
-
857
- # Clicks the Add New Pool link, then
858
- # instantiates the AddQuestionPool page class.
859
- def add_new_pool
860
- #puts "clicking add new pool..."
861
- #10.times {frm.link(:text=>"Add New Pool").flash}
862
- frm.link(:text=>"Add New Pool").click
863
- #puts "clicked..."
864
- #frm.text_field(:id=>"questionpool:namefield").wait_until_present(200)
865
- AddQuestionPool.new(@browser)
866
- end
867
-
868
- # Returns an array containing strings of the pool names listed
869
- # on the page.
870
- def pool_names
871
- names= []
872
- frm.table(:id=>"questionpool:TreeTable").rows.each do | row |
873
- if row.span(:id=>/questionpool.+poolnametext/).exist?
874
- names << row.span(:id=>/questionpool.+poolnametext/).text
875
- end
876
- end
877
- return names
878
- end
879
-
880
- # Clicks "Import" and then instantiates the
881
- # PoolImport page class.
882
- def import
883
- frm.link(:text=>"Import").click
884
- PoolImport.new(@browser)
885
- end
886
-
887
- # Clicks the Assessments link and then
888
- # instantiates the AssessmentsList page class.
889
- def assessments
890
- frm.link(:text=>"Assessments").click
891
- AssessmentsList.new(@browser)
892
- end
893
-
894
- in_frame(:index=>1) do |frame|
895
- link(:assessment_types, :text=>"Assessment Types", :frame=>frame)
896
- end
897
-
898
- end
899
-
900
- # The page that appears when you click to import
901
- # a pool.
902
- class PoolImport
903
-
904
- include PageObject
905
-
906
- # Enters the target file into the Choose File
907
- # file field. Note that it assumes the file is in
908
- # the data/sakai-cle-test-api folder in the expected resources
909
- # tree.
910
- def choose_file=(file_name)
911
- frm.file_field(:name=>"importPoolForm:_id6.upload").set(File.expand_path(File.dirname(__FILE__)) + "/../../data/sakai-cle-test-api/" + file_name)
912
- end
913
-
914
- # Clicks the Import button, then
915
- # instantiates the QuestionPoolsList
916
- # page class.
917
- def import
918
- frm.button(:value=>"Import").click
919
- QuestionPoolsList.new(@browser)
920
- end
921
-
922
- end
923
-
924
- # This page appears when adding a question to a pool
925
- class SelectQuestionType
926
-
927
- include PageObject
928
-
929
- # Selects the specified question type from the
930
- # drop-down list, then instantiates the appropriate
931
- # page class, based on the question type selected.
932
- def select_question_type(qtype)
933
- frm.select(:id=>"_id1:selType").select(qtype)
934
- frm.button(:value=>"Save").click
935
-
936
- page = case(qtype)
937
- when "Multiple Choice" then MultipleChoice.new(@browser)
938
- when "True False" then TrueFalse.new(@browser)
939
- when "Survey" then Survey.new(@browser)
940
- when "Short Answer/Essay" then ShortAnswer.new(@browser)
941
- when "Fill in the Blank" then FillInBlank.new(@browser)
942
- when "Numeric Response" then NumericResponse.new(@browser)
943
- when "Matching" then Matching.new(@browser)
944
- when "Audio Recording" then AudioRecording.new(@browser)
945
- when "File Upload" then FileUpload.new(@browser)
946
- else puts "nothing selected"
947
- end
948
-
949
- return page
950
-
951
- end
952
-
953
- in_frame(:index=>1) do |frame|
954
- button(:cancel, :value=>"Cancel", :frame=>frame)
955
- end
956
-
957
- end
958
-
959
- # Page of Assessments accessible to a student user
960
- #
961
- # It may be that we want to deprecate this class and simply use
962
- # the AssessmentsList class alone.
963
- class TakeAssessmentList
964
-
965
- include PageObject
966
-
967
- # Returns an array containing the assessment names that appear on the page.
968
- def available_assessments
969
- # define this later
970
- end
971
-
972
- # Method to get the titles of assessments that
973
- # the student user has submitted. The titles are
974
- # returned in an Array object.
975
- def submitted_assessments
976
- table_array = @browser.frame(:index=>1).table(:id=>"selectIndexForm:reviewTable").to_a
977
- table_array.delete_at(0)
978
- titles = []
979
- table_array.each { |row|
980
- unless row[0] == ""
981
- titles << row[0]
982
- end
983
- }
984
-
985
- return titles
986
-
987
- end
988
-
989
- # Clicks the specified assessment
990
- # then instantiates the BeginAssessment
991
- # page class.
992
- def take_assessment(name)
993
- begin
994
- frm.link(:text=>name).click
995
- rescue Watir::Exception::UnknownObjectException
996
- frm.link(:text=>CGI::escapeHTML(name)).click
997
- end
998
- BeginAssessment.new(@browser)
999
- end
1000
-
1001
- # This method is in need of improvement to make it
1002
- # more generalized for finding the correct test.
1003
- def feedback(test_name)
1004
- test_table = frm.table(:id=>"selectIndexForm:reviewTable").to_a
1005
- test_table.delete_if { |row| row[3] != "Immediate" }
1006
- index_value = test_table.index { |row| row[0] == test_name }
1007
- frm.link(:text=>"Feedback", :index=>index_value).click
1008
- # Need to add a call to a New class here, when it's written
1009
- end
1010
-
1011
- end
1012
-
1013
- # The student view of the overview page of an Assessment
1014
- class BeginAssessment
1015
-
1016
- include PageObject
1017
-
1018
- # Clicks the Begin Assessment button.
1019
- def begin_assessment
1020
- frm.button(:value=>"Begin Assessment").click
1021
- end
1022
-
1023
- # Clicks the Cancel button and instantiates the X Class.
1024
- def cancel
1025
- # Define this later
1026
- end
1027
-
1028
- # Selects the specified radio button answer
1029
- def multiple_choice_answer(letter)
1030
- index = case(letter.upcase)
1031
- when "A" then "0"
1032
- when "B" then "1"
1033
- when "C" then "2"
1034
- when "D" then "3"
1035
- when "E" then "4"
1036
- end
1037
- frm.radio(:name=>/takeAssessmentForm.+:deliverMultipleChoice.+:_id.+:#{index}/).click
1038
- end
1039
-
1040
- # Enters the answer into the specified blank number (1-based).
1041
- def fill_in_blank_answer(answer, blank_number)
1042
- index = blank_number.to_i-1
1043
- frm.text_field(:name=>/deliverFillInTheBlank:_id.+:#{index}/).value=answer
1044
- end
1045
-
1046
- # Clicks either the True or the False radio button, as specified.
1047
- def true_false_answer(answer)
1048
- answer.upcase=~/t/i ? index = 0 : index = 1
1049
- frm.radio(:name=>/deliverTrueFalse/, :index=>index).set
1050
- end
1051
-
1052
- # Enters the specified string into the Rationale text box.
1053
- def true_false_rationale(text)
1054
- frm.text_field(:name=>/:deliverTrueFalse:rationale/).value=text
1055
- end
1056
-
1057
- # Enters the specified text into the "Short Answer" field.
1058
- def short_answer(answer)
1059
- frm.text_field(:name=>/deliverShortAnswer/).value=answer
1060
- end
1061
-
1062
- # Selects the specified matching value, at the spot specified by the number (1-based counting).
1063
- def match_answer(answer, number)
1064
- index = number.to_i-1
1065
- frm.select(:name=>/deliverMatching/, :index=>index).select(answer)
1066
- end
1067
-
1068
- # Enters the specified file name (and subdirectory below the expected target Sakai-CLE path) in the file field.
1069
- def file_answer(file_name)
1070
- frm.file_field(:name=>/deliverFileUpload/).set(File.expand_path(File.dirname(__FILE__)) + "/../../data/sakai-cle-test-api/" + file_name)
1071
- frm.button(:value=>"Upload").click
1072
- end
1073
-
1074
- # Clicks the Next button and instantiates the BeginAssessment Class.
1075
- def next
1076
- frm.button(:value=>"Next").click
1077
- BeginAssessment.new(@browser)
1078
- end
1079
-
1080
- # Clicks the Submit for Grading button and instantiates the ConfirmSubmission Class.
1081
- def submit_for_grading
1082
- frm.button(:value=>"Submit for Grading").click
1083
- ConfirmSubmission.new(@browser)
1084
- end
1085
-
1086
- end
1087
-
1088
- # The confirmation page that appears when submitting an Assessment.
1089
- # The last step before actually submitting the the Assessment.
1090
- class ConfirmSubmission
1091
-
1092
- include PageObject
1093
-
1094
- # Clicks the Submit for Grading button and instantiates
1095
- # the SubmissionSummary Class.
1096
- def submit_for_grading
1097
- frm.button(:value=>"Submit for Grading").click
1098
- SubmissionSummary.new(@browser)
1099
- end
1100
-
1101
- end
1102
-
1103
- # The summary page that appears when an Assessment has been submitted.
1104
- class SubmissionSummary
1105
-
1106
- include PageObject
1107
-
1108
- # Clicks the Continue button and instantiates
1109
- # the TakeAssessmentList Class.
1110
- def continue
1111
- frm.button(:value=>"Continue").click
1112
- TakeAssessmentList.new(@browser)
1113
- end
1114
-
1115
- end
1116
-
1117
- #================
1118
- # Assignments Pages
1119
- #================
1120
-
1121
- module AssignmentsMenu
1122
-
1123
- include PageObject
1124
-
1125
- def assignments_frame
1126
- self.frame(:src=>/sakai2assignments.launch.html/)
1127
- end
1128
- alias frm assignments_frame
1129
-
1130
- def add_assignment
1131
- frm.link(:title=>"Add").click
1132
- frm.frame(:id=>"new_assignment_instructions___Frame").td(:id=>"xEditingArea").wait_until_present
1133
- AddAssignments.new @browser
1134
- end
1135
-
1136
- def grade_report
1137
- frm.link(:text=>"Grade Report").click
1138
- GradeReport.new @browser
1139
- end
1140
-
1141
- def student_view
1142
- frm.link(:text=>"Student View").click
1143
- StudentView.new @browser
1144
- end
1145
-
1146
- def permissions
1147
- frm.link(:text=>"Permissions").click
1148
- AssignmentsPermissions.new @browser
1149
- end
1150
-
1151
- def options
1152
- frm.link(:text=>"Options").click
1153
- AssignmentsOptions.new @browser
1154
- end
1155
-
1156
- def assignment_list
1157
- frm.link(:text=>"Assignment list").click
1158
- Assignments.new @browser
1159
- end
1160
-
1161
- # Clicks the Reorder button, then instantiates
1162
- # the AssignmentsReorder page class.
1163
- def reorder
1164
- frm.link(:text=>"Reorder").click
1165
- AssignmentsReorder.new(@browser)
1166
- end
1167
-
1168
- end # Assignments Menu module
1169
-
1170
- #
1171
- class Assignments # Note that the OAE portion of this class can be found in the page_classes file.
1172
-
1173
- include PageObject
1174
- include GlobalMethods
1175
- include HeaderFooterBar
1176
- include LeftMenuBar
1177
- include HeaderBar
1178
- include DocButtons
1179
- include AssignmentsMenu
1180
-
1181
- # Returns an array of the displayed assignment titles.
1182
- # Use for verification of test steps.
1183
- def assignments_titles
1184
- titles = []
1185
- frm.table(:class=>"listHier lines nolines").links(:href=>/doView_assignment/).each { |x| titles << x.text }
1186
- titles
1187
- end
1188
- alias assignment_titles assignments_titles
1189
- alias assignments_list assignments_titles
1190
- alias titles assignments_titles
1191
- alias list assignments_titles
1192
-
1193
- # Clicks the Edit link for the Assignment specified.
1194
- # Then it instantiates the AddAssignments page class.
1195
- def edit_assignment(assignment_name)
1196
- index = assignments_titles.index(assignment_name)
1197
- frm.link(:text=>"Edit", :index=>index).click
1198
- AddAssignments.new(@browser)
1199
- end
1200
-
1201
- # Checks the appropriate checkbox, based on the specified assignment_name
1202
- # Then clicks the Update button and confirms the deletion request.
1203
- def delete_assignment(assignment_name)
1204
- check_assignment(assignment_name)
1205
- frm.button(:value=>"Update").click
1206
- sleep 0.2
1207
- frm.button(:value=>"Delete").click
1208
- end
1209
-
1210
- # Clicks on the Duplicate link for the Assignment specified.
1211
- def duplicate_assignment(assignment_name)
1212
- index = assignments_titles.index(assignment_name)
1213
- frm.link(:text=>"Duplicate", :index=>index).click
1214
- end
1215
-
1216
- # Checks the checkbox for the specified Assignment,
1217
- # using the assignment id as the identifier.
1218
- def check_assignment(assignment_name)
1219
- assignment_row(assignment_name).checkbox.set
1220
- end
1221
-
1222
- # Opens the specified assignment for viewing
1223
- #
1224
- # Instantiates the student view or instructor/admin
1225
- # view based on the landing page attributes
1226
- def open_assignment(assignment_name)
1227
- frm.link(:text=>assignment_name).click
1228
- if frm.div(:class=>"portletBody").p(:class=>"instruction").exist? && frm.div(:class=>"portletBody").p(:class=>"instruction").text == "Add attachment(s), then choose the appropriate button at the bottom."
1229
- AssignmentStudent.new(@browser)
1230
- elsif frm.div(:class=>"portletBody").h3.text=="Viewing assignment..." || frm.div(:class=>"portletBody").h3.text.include?("Submitted") || frm.button(:value=>"Back to list").exist?
1231
- AssignmentsPreview.new(@browser)
1232
- else
1233
- frm.frame(:id, "Assignment.view_submission_text___Frame").td(:id, "xEditingArea").wait_until_present
1234
- AssignmentStudent.new(@browser)
1235
- end
1236
- end
1237
- alias view_assignment open_assignment
1238
-
1239
- # Gets the contents of the status column
1240
- # for the specified assignment
1241
- def status_of(assignment_name)
1242
- assignment_row(assignment_name).td(:headers=>"status").text
1243
- end
1244
-
1245
- # Clicks the View Submissions link for the specified
1246
- # Assignment, then instantiates the AssignmentSubmissionList
1247
- # page class.
1248
- def view_submissions_for(assignment_name)
1249
- assignment_row(assignment_name).link(:text=>"View Submissions").click
1250
- AssignmentSubmissionList.new(@browser)
1251
- end
1252
-
1253
- # Clicks the Grade link for the specified Assignment,
1254
- # then instantiates the AssignmentSubmissionList page class.
1255
- def grade(assignment_name)
1256
- assignment_row(assignment_name).link(:text=>"Grade").click
1257
- AssignmentSubmissionList.new(@browser)
1258
- end
1259
-
1260
- in_frame(:index=>2) do |frame|
1261
- link(:grade_report, :text=>"Grade Report", :frame=>frame)
1262
- link(:student_view, :text=>"Student View", :frame=>frame)
1263
- link(:options, :text=>"Options", :frame=>frame)
1264
- link(:sort_assignment_title, :text=>"Assignment title", :frame=>frame)
1265
- link(:sort_status, :text=>"Status", :frame=>frame)
1266
- link(:sort_open, :text=>"Open", :frame=>frame)
1267
- link(:sort_due, :text=>"Due", :frame=>frame)
1268
- link(:sort_in, :text=>"In", :frame=>frame)
1269
- link(:sort_new, :text=>"New", :frame=>frame)
1270
- link(:sort_scale, :text=>"Scale", :frame=>frame)
1271
- select_list(:view, :id=>"view", :frame=>frame)
1272
- select_list(:select_page_size, :id=>"selectPageSize", :frame=>frame)
1273
- button(:next, :name=>"eventSubmit_doList_next", :frame=>frame)
1274
- button(:last, :name=>"eventSubmit_doList_last", :frame=>frame)
1275
- button(:previous, :name=>"eventSubmit_doList_prev", :frame=>frame)
1276
- button(:first, :name=>"eventSubmit_doList_first", :frame=>frame)
1277
- button(:update, :name=>"eventSubmit_doDelete_confirm_assignment", :frame=>frame)
1278
- end
1279
-
1280
- # Private methods
1281
- private
1282
-
1283
- def assignment_row(assignment_name)
1284
- frm.table(:class=>"listHier lines nolines").row(:text=>/#{Regexp.escape(assignment_name)}/)
1285
- end
1286
-
1287
- end # Assignments
1288
-
1289
- #
1290
- class AddAssignments
1291
-
1292
- include PageObject
1293
- include AssignmentsMenu
1294
-
1295
- # Sends the specified text to the text box in the FCKEditor
1296
- # on the page.
1297
- def instructions=(instructions)
1298
- frm.frame(:id, "new_assignment_instructions___Frame").td(:id, "xEditingArea").frame(:index=>0).send_keys(instructions)
1299
- end
1300
-
1301
- # Clicks the Preview button, then instantiates
1302
- # the AssignmentsPreview page class.
1303
- def preview
1304
- frm.button(:value=>"Preview").click
1305
- AssignmentsPreview.new(@browser)
1306
- end
1307
-
1308
- # Clicks the Add Attachments or Add/Remove Attachments button, then
1309
- # instantiates the AssignmentsAttachments page class.
1310
- def add_attachments
1311
- frm.button(:value=>/(Add|Add \/ Remove) Attachments/).click
1312
- AssignmentsAttachments.new(@browser)
1313
- end
1314
- alias add_remove_attachments add_attachments
1315
-
1316
- # Returns an array listing the files attached to the assignment
1317
- def attached_files
1318
- array = []
1319
- frm.ul(:class=>/attachList/).lis.each { |li| array << li.link.text }
1320
- array
1321
- end
1322
-
1323
- in_frame(:index=>2) do |frame|
1324
- span(:gradebook_warning, :id=>"gradebookListWarnAssoc", :frame=>frame)
1325
- div(:alert_box, :class=>"alertMessage", :frame=>frame)
1326
- button(:save_draft, :name=>"save", :frame=>frame)
1327
- button(:cancel, :value=>"Cancel", :frame=>frame)
1328
- button(:post, :value=>"Post", :frame=>frame)
1329
- hidden_field(:assignment_id, :name=>"assignmentId", :frame=>frame)
1330
- text_field(:title, :id=>"new_assignment_title", :frame=>frame)
1331
- select_list(:open_month, :id=>"new_assignment_openmonth", :frame=>frame)
1332
- select_list(:open_day, :id=>"new_assignment_openday", :frame=>frame)
1333
- select_list(:open_year, :id=>"new_assignment_openyear", :frame=>frame)
1334
- select_list(:open_hour, :id=>"new_assignment_openhour", :frame=>frame)
1335
- select_list(:open_minute, :id=>"new_assignment_openmin", :frame=>frame)
1336
- select_list(:open_meridian, :id=>"new_assignment_openampm", :frame=>frame)
1337
- select_list(:due_month, :id=>"new_assignment_duemonth", :frame=>frame)
1338
- select_list(:due_day, :id=>"new_assignment_dueday", :frame=>frame)
1339
- select_list(:due_year, :id=>"new_assignment_dueyear", :frame=>frame)
1340
- select_list(:due_hour, :id=>"new_assignment_duehour", :frame=>frame)
1341
- select_list(:due_minute, :id=>"new_assignment_duemin", :frame=>frame)
1342
- select_list(:due_meridian, :id=>"new_assignment_dueampm", :frame=>frame)
1343
- select_list(:accept_month, :id=>"new_assignment_closemonth", :frame=>frame)
1344
- select_list(:accept_day, :id=>"new_assignment_closeday", :frame=>frame)
1345
- select_list(:accept_year, :id=>"new_assignment_closeyear", :frame=>frame)
1346
- select_list(:accept_hour, :id=>"new_assignment_closehour", :frame=>frame)
1347
- select_list(:accept_minute, :id=>"new_assignment_closemin", :frame=>frame)
1348
- select_list(:accept_meridian, :id=>"new_assignment_closeampm", :frame=>frame)
1349
- select_list(:student_submissions, :id=>"subType", :frame=>frame)
1350
- select_list(:grade_scale, :id=>"new_assignment_grade_type", :frame=>frame)
1351
- checkbox(:allow_resubmission, :id=>"allowResToggle", :frame=>frame)
1352
- select_list(:num_resubmissions, :id=>"allowResubmitNumber", :frame=>frame)
1353
- select_list(:resub_until_month, :id=>"allow_resubmit_closeMonth", :frame=>frame)
1354
- select_list(:resub_until_day, :id=>"allow_resubmit_closeDay", :frame=>frame)
1355
- select_list(:resub_until_year, :id=>"allow_resubmit_closeYear", :frame=>frame)
1356
- select_list(:resub_until_hour, :id=>"allow_resubmit_closeHour", :frame=>frame)
1357
- select_list(:resub_until_minute, :id=>"allow_resubmit_closeMin", :frame=>frame)
1358
- select_list(:resub_until_meridian, :id=>"allow_resubmit_closeAMPM", :frame=>frame)
1359
- text_field(:max_points, :name=>"new_assignment_grade_points", :frame=>frame)
1360
- checkbox(:add_due_date, :id=>"new_assignment_check_add_due_date", :frame=>frame)
1361
- checkbox(:add_open_announcement, :id=>"new_assignment_check_auto_announce", :frame=>frame)
1362
- checkbox(:add_honor_pledge, :id=>"new_assignment_check_add_honor_pledge", :frame=>frame)
1363
- checkbox(:use_turnitin, :id=>"new_assignment_use_review_service", :frame=>frame)
1364
- checkbox(:allow_students_to_view_report, :id=>"new_assignment_allow_student_view", :frame=>frame)
1365
- radio_button(:do_not_add_to_gradebook, :id=>"no",:name=>"new_assignment_add_to_gradebook", :frame=>frame)
1366
- radio_button(:add_to_gradebook, :id=>"add", :name=>"new_assignment_add_to_gradebook", :frame=>frame)
1367
- radio_button(:do_not_send_notifications, :id=>"notsendnotif", :frame=>frame)
1368
- radio_button(:send_notifications, :id=>"sendnotif", :frame=>frame)
1369
- radio_button(:send_summary_email, :id=>"sendnotifsummary", :frame=>frame)
1370
- radio_button(:do_not_send_grade_notif, :id=>"notsendreleasegradenotif", :frame=>frame)
1371
- radio_button(:send_grade_notif, :id=>"sendreleasegradenotif", :frame=>frame)
1372
- link(:add_model_answer, :id=>"modelanswer_add", :frame=>frame)
1373
- link(:add_private_note, :id=>"note_add", :frame=>frame)
1374
- link(:add_all_purpose_item, :id=>"allPurpose_add", :frame=>frame)
1375
- text_area(:model_answer, :id=>"modelanswer_text", :frame=>frame)
1376
- button(:model_answer_attach, :name=>"modelAnswerAttach", :frame=>frame)
1377
- select_list(:show_model_answer, :id=>"modelanswer_to", :frame=>frame)
1378
- button(:save_model_answer, :id=>"modelanswer_save", :frame=>frame)
1379
- button(:cancel_model_answer, :id=>"modelanswer_cancel", :frame=>frame)
1380
- text_area(:private_note, :id=>"note_text", :frame=>frame)
1381
- select_list(:share_note_with, :id=>"note_to", :frame=>frame)
1382
- button(:save_note, :id=>"note_save", :frame=>frame)
1383
- button(:cancel_note, :id=>"note_cancel", :frame=>frame)
1384
- text_field(:all_purpose_title, :id=>"allPurpose_title", :frame=>frame)
1385
- text_area(:all_purpose_text, :id=>"allPurpose_text", :frame=>frame)
1386
- button(:add_all_purpose_attachments, :id=>"allPurposeAttach", :frame=>frame)
1387
- radio_button(:show_this_all_purpose_item, :id=>"allPurposeHide1", :frame=>frame)
1388
- radio_button(:hide_this_all_purpose_item, :id=>"allPurposeHide2", :frame=>frame)
1389
- checkbox(:show_from, :id=>"allPurposeShowFrom", :frame=>frame)
1390
- checkbox(:show_until, :id=>"allPurposeShowTo", :frame=>frame)
1391
- select_list(:show_from_month, :id=>"allPurpose_releaseMonth", :frame=>frame)
1392
- select_list(:show_from_day, :id=>"allPurpose_releaseDay", :frame=>frame)
1393
- select_list(:show_from_year, :id=>"allPurpose_releaseYear", :frame=>frame)
1394
- select_list(:show_from_hour, :id=>"allPurpose_releaseHour", :frame=>frame)
1395
- select_list(:show_from_minute, :id=>"allPurpose_releaseMin", :frame=>frame)
1396
- select_list(:show_from_meridian, :id=>"allPurpose_releaseAMPM", :frame=>frame)
1397
- select_list(:show_until_month, :id=>"allPurpose_retractMonth", :frame=>frame)
1398
- select_list(:show_until_day, :id=>"allPurpose_retractDay", :frame=>frame)
1399
- select_list(:show_until_year, :id=>"allPurpose_retractYear", :frame=>frame)
1400
- select_list(:show_until_hour, :id=>"allPurpose_retractHour", :frame=>frame)
1401
- select_list(:show_until_minute, :id=>"allPurpose_retractMin", :frame=>frame)
1402
- select_list(:show_until_meridian, :id=>"allPurpose_retractAMPM", :frame=>frame)
1403
- link(:expand_guest_list, :id=>"expand_1", :frame=>frame)
1404
- link(:collapse_guest_list, :id=>"collapse_1", :frame=>frame)
1405
- link(:expand_TA_list, :id=>"expand_2", :frame=>frame)
1406
- link(:collapse_TA_list, :id=>"collapse_2", :frame=>frame)
1407
- link(:expand_instructor_list, :id=>"expand_3", :frame=>frame)
1408
- link(:collapse_instructor_list, :is=>"collapse_3", :frame=>frame)
1409
-
1410
- # Note that only the "All" checkboxes are defined, since other items may or may not be there
1411
- checkbox(:all_guests, :id=>"allPurpose_Guest", :frame=>frame)
1412
- checkbox(:all_TAs, :id=>"allPurpose_Teaching Assistant", :frame=>frame)
1413
- checkbox(:all_instructors, :id=>"allPurpose_Instructor", :frame=>frame)
1414
- end
1415
-
1416
- end # AddAssignments
1417
-
1418
- #
1419
- class AssignmentsPermissions
1420
-
1421
- include PageObject
1422
-
1423
- in_frame(:index=>2) do |frame|
1424
- button(:save, :value=>"Save", :frame=>frame)
1425
- checkbox(:evaluators_share_drafts, :id=>"Evaluatorasn.share.drafts", :frame=>frame)
1426
- checkbox(:organizers_share_drafts, :id=>"Organizerasn.share.drafts", :frame=>frame)
1427
- checkbox(:guests_all_groups, :id=>"Guestasn.all.groups", :frame=>frame)
1428
- checkbox(:guests_create_assignments, :id=>"Guestasn.new", :frame=>frame)
1429
- checkbox(:guests_submit_to_assigments, :id=>"Guestasn.submit", :frame=>frame)
1430
- checkbox(:guests_delete_assignments, :id=>"Guestasn.delete", :frame=>frame)
1431
- checkbox(:guests_read_assignments, :id=>"Guestasn.read", :frame=>frame)
1432
- checkbox(:guests_revise_assignments, :id=>"Guestasn.revise", :frame=>frame)
1433
- checkbox(:guests_grade_assignments, :id=>"Guestasn.grade", :frame=>frame)
1434
- checkbox(:guests_receive_notifications, :id=>"Guestasn.receive.notifications", :frame=>frame)
1435
- checkbox(:guests_share_drafts, :id=>"Guestasn.share.drafts", :frame=>frame)
1436
- checkbox(:instructors_all_groups, :id=>"Instructorasn.all.groups", :frame=>frame)
1437
- checkbox(:instructors_create_assignments, :id=>"Instructorasn.new", :frame=>frame)
1438
- checkbox(:instructors_submit_to_assigments, :id=>"Instructorasn.submit", :frame=>frame)
1439
- checkbox(:instructors_delete_assignments, :id=>"Instructorasn.delete", :frame=>frame)
1440
- checkbox(:instructors_read_assignments, :id=>"Instructorasn.read", :frame=>frame)
1441
- checkbox(:instructors_revise_assignments, :id=>"Instructorasn.revise", :frame=>frame)
1442
- checkbox(:instructors_grade_assignments, :id=>"Instructorasn.grade", :frame=>frame)
1443
- checkbox(:instructors_receive_notifications, :id=>"Instructorasn.receive.notifications", :frame=>frame)
1444
- checkbox(:instructors_share_drafts, :id=>"Instructorasn.share.drafts", :frame=>frame)
1445
- checkbox(:students_all_groups, :id=>"Studentasn.all.groups", :frame=>frame)
1446
- checkbox(:students_create_assignments, :id=>"Studentasn.new", :frame=>frame)
1447
- checkbox(:students_submit_to_assigments, :id=>"Studentasn.submit", :frame=>frame)
1448
- checkbox(:students_delete_assignments, :id=>"Studentasn.delete", :frame=>frame)
1449
- checkbox(:students_read_assignments, :id=>"Studentasn.read", :frame=>frame)
1450
- checkbox(:students_revise_assignments, :id=>"Studentasn.revise", :frame=>frame)
1451
- checkbox(:students_grade_assignments, :id=>"Studentasn.grade", :frame=>frame)
1452
- checkbox(:students_receive_notifications, :id=>"Studentasn.receive.notifications", :frame=>frame)
1453
- checkbox(:students_share_drafts, :id=>"Studentasn.share.drafts", :frame=>frame)
1454
- checkbox(:tas_all_groups, :id=>"Teaching Assistantasn.all.groups", :frame=>frame)
1455
- checkbox(:tas_create_assignments, :id=>"Teaching Assistantasn.new", :frame=>frame)
1456
- checkbox(:tas_submit_to_assigments, :id=>"Teaching Assistantasn.submit", :frame=>frame)
1457
- checkbox(:tas_delete_assignments, :id=>"Teaching Assistantasn.delete", :frame=>frame)
1458
- checkbox(:tas_read_assignments, :id=>"Teaching Assistantasn.read", :frame=>frame)
1459
- checkbox(:tas_revise_assignments, :id=>"Teaching Assistantasn.revise", :frame=>frame)
1460
- checkbox(:tas_grade_assignments, :id=>"Teaching Assistantasn.grade", :frame=>frame)
1461
- checkbox(:tas_receive_notifications, :id=>"Teaching Assistantasn.receive.notifications", :frame=>frame)
1462
- checkbox(:tas_share_drafts, :id=>"Teaching Assistantasn.share.drafts", :frame=>frame)
1463
- link(:undo_changes, :text=>"Undo changes", :frame=>frame)
1464
- button(:cancel, :id=>"eventSubmit_doCancel", :frame=>frame)
1465
- link(:permission, :text=>"Permission", :frame=>frame)
1466
- link(:guest, :text=>"Guest", :frame=>frame)
1467
- link(:instructor, :text=>"Instructor", :frame=>frame)
1468
- link(:student, :text=>"Student", :frame=>frame)
1469
- link(:teaching_assistant, :text=>"Teaching Assistant", :frame=>frame)
1470
- link(:same_permissions_for_all_groups, :text=>"Same site level permissions for all groups inside the site", :frame=>frame)
1471
- link(:create_new_assignments, :text=>"Create new assignment(s)", :frame=>frame)
1472
- link(:submit_to_assignments, :text=>"Submit to assignment(s)", :frame=>frame)
1473
- link(:delete_assignments, :text=>"Delete assignment(s)", :frame=>frame)
1474
- link(:read_assignments, :text=>"Read Assignment(s)", :frame=>frame)
1475
- link(:revise_assignments, :text=>"Revise assignment(s)", :frame=>frame)
1476
- link(:grade_submissions, :text=>"Grade assignment submission(s)", :frame=>frame)
1477
- link(:receive_email_notifications, :text=>"Receive email notifications", :frame=>frame)
1478
- link(:view_drafts_from_others, :text=>"Able to view draft assignment(s) created by other users", :frame=>frame)
1479
- end
1480
-
1481
- end # AssignmentsPermissions
1482
-
1483
- # Options page for Assignments
1484
- class AssignmentsOptions
1485
-
1486
- include PageObject
1487
- include AssignmentsMenu
1488
-
1489
- in_frame(:index=>2) do |frame|
1490
- radio_button(:default, :id=>"submission_list_option_default", :frame=>frame)
1491
- radio_button(:only_show_filtered_submissions, :id=>"submission_list_option_searchonly", :frame=>frame)
1492
- button(:update, :name=>"eventSubmit_doUpdate_options", :frame=>frame)
1493
- button(:cancel, :name=>"eventSubmit_doCancel_options", :frame=>frame)
1494
-
1495
- end
1496
-
1497
- end # AssignmentsOptions
1498
-
1499
- # Page that appears when you click to preview an Assignment
1500
- class AssignmentsPreview
1501
-
1502
- include PageObject
1503
- include AssignmentsMenu
1504
-
1505
- # Returns the text content of the page header
1506
- def header
1507
- frm.div(:class=>"portletBody").h3.text
1508
- end
1509
-
1510
- # Returns a hash object containing the contents of the Item Summary table.
1511
- # The hash's key is the header column and the value is the content column.
1512
- def item_summary
1513
- hash = {}
1514
- frm.table(:class=>"itemSummary").rows.each do |row|
1515
- hash.store(row.th.text, row.td.text)
1516
- end
1517
- hash
1518
- end
1519
-
1520
- # Grabs the Assignment Instructions text.
1521
- def assignment_instructions
1522
- frm.div(:class=>"textPanel").text
1523
- end
1524
-
1525
- # Grabs the instructor comments text.
1526
- def instructor_comments
1527
- frm.div(:class=>"portletBody").div(:class=>"textPanel", :index=>2).text
1528
- end
1529
-
1530
- in_frame(:index=>2) do |frame|
1531
- hidden_field(:assignment_id, :name=>"assignmentId", :frame=>frame)
1532
- link(:assignment_list, :text=>"Assignment List", :frame=>frame)
1533
- link(:permissions, :text=>"Permissions", :frame=>frame)
1534
- link(:options, :text=>"Options", :frame=>frame)
1535
- link(:hide_assignment, :href=>/doHide_preview_assignment_assignment/, :frame=>frame)
1536
- link(:show_assignment, :href=>/doShow_preview_assignment_assignment/, :frame=>frame)
1537
- link(:hide_student_view, :href=>/doHide_preview_assignment_student_view/, :frame=>frame)
1538
- link(:show_student_view, :href=>/doShow_preview_assignment_student_view/, :frame=>frame)
1539
- button(:edit, :name=>"revise", :frame=>frame)
1540
- button(:save_draft, :name=>"save", :frame=>frame)
1541
- button(:done, :name=>"done", :frame=>frame)
1542
- button(:back_to_list, :value=>"Back to list", :frame=>frame)
1543
- button(:post, :name=>"post", :frame=>frame)
1544
- button(:cancel, :value=>"Cancel", :frame=>frame)
1545
- end
1546
-
1547
- end
1548
-
1549
- # The reorder page for Assignments
1550
- class AssignmentsReorder
1551
-
1552
- include PageObject
1553
- include AssignmentsMenu
1554
-
1555
- in_frame(:index=>2) do |frame|
1556
- link(:add, :text=>"Add", :frame=>frame)
1557
- link(:assignment_list, :text=>"Assignment List", :frame=>frame)
1558
- link(:grade_report, :text=>"Grade Report", :frame=>frame)
1559
- link(:student_view, :text=>"Student View", :frame=>frame)
1560
- link(:permissions, :text=>"Permissions", :frame=>frame)
1561
- link(:options, :text=>"Options", :frame=>frame)
1562
- link(:sort_by_title, :text=>"Sort by title", :frame=>frame)
1563
- link(:sort_by_open_date, :text=>"Sort by open date", :frame=>frame)
1564
- link(:sort_by_due_date, :text=>"Sort by due date", :frame=>frame)
1565
- link(:undo_last, :text=>"Undo last", :frame=>frame)
1566
- link(:undo_all, :text=>"Undo all", :frame=>frame)
1567
- button(:cancel, :value=>"Cancel", :frame=>frame)
1568
- button(:save, :value=>"Save", :frame=>frame)
1569
- end
1570
-
1571
- end
1572
-
1573
- # A Student user's page for editing/submitting/view an assignment.
1574
- class AssignmentStudent
1575
-
1576
- include PageObject
1577
- include AssignmentsMenu
1578
-
1579
- # Returns a hash object containing the contents of the Item Summary table.
1580
- # The hash's Key is the header column and the value is the content column.
1581
- def item_summary
1582
- hash = {}
1583
- frm.table(:class=>"itemSummary").rows.each do |row|
1584
- hash.store(row.th.text, row.td.text)
1585
- end
1586
- return hash
1587
- end
1588
-
1589
- # Enters the specified text into the Assignment Text FCKEditor.
1590
- def assignment_text=(text)
1591
- frm.frame(:id, "Assignment.view_submission_text___Frame").td(:id, "xEditingArea").frame(:index=>0).send_keys(text)
1592
- end
1593
-
1594
- # Clears out any existing text from the Assignment Text FCKEditor.
1595
- def remove_assignment_text
1596
- frm.frame(:id, "Assignment.view_submission_text___Frame").div(:title=>"Select All").fire_event("onclick")
1597
- frm.frame(:id, "Assignment.view_submission_text___Frame").td(:id, "xEditingArea").frame(:index=>0).send_keys :backspace
1598
- end
1599
-
1600
- # This class variable allows adding an arbitrary number of
1601
- # files to the page, as long as the adding steps alternate between
1602
- # selecting the file and clicking the add more files button
1603
- @@file_number = 0
1604
-
1605
- # Enters the specified file name into the file field (the
1606
- # file is assumed to be in the data/sakai_cle folder in the
1607
- # correct file path relative to the script being run).
1608
- # Once the filename is entered in the field, the
1609
- # @@file_number class variable is increased by one
1610
- # in case any more files need to be added to the upload
1611
- # list.
1612
- def select_file=(file_name)
1613
- frm.file_field(:id=>"clonableUpload", :name=>"upload#{@@file_number}").set(File.expand_path(File.dirname(__FILE__)) + "/../../data/sakai-cle-test-api/" + file_name)
1614
- @@file_number += 1
1615
- end
1616
-
1617
- # Clicks the Submit button, then instantiates
1618
- # the appropriate page class, based on the
1619
- # page that gets loaded.
1620
- def submit
1621
- frm.button(:value=>"Submit").click
1622
- @@file_number=0
1623
- if frm.div(:class=>"portletBody").h3.text=~/Submission Confirmation/
1624
- SubmissionConfirmation.new(@browser)
1625
- elsif frm.button(:value=>"Back to list").exist?
1626
- SubmissionConfirmation.new(@browser)
1627
- else
1628
- AssessmentsList.new(@browser)
1629
- end
1630
- end
1631
-
1632
- # Clicks the Resubmit button, then instantiates
1633
- # the appropriate page class, based on the
1634
- # page that gets loaded.
1635
- #
1636
- # Resets @@file_number to zero so that file
1637
- # uploads will work if this page is visited again
1638
- # in the same script.
1639
- def resubmit
1640
- frm.button(:value=>"Resubmit").click
1641
- @@file_number=0
1642
- if frm.link(:text=>"Assignment title").exist?
1643
- puts "list..."
1644
- AssessmentsList.new(@browser)
1645
- else
1646
- SubmissionConfirmation.new(@browser)
1647
- end
1648
- end
1649
-
1650
- # Clicks the Preview button, then
1651
- # instantiates the AssignmentStudentPreview page class.
1652
- #
1653
- # Resets @@file_number to zero so that file
1654
- # uploads will work if this page is visited again
1655
- # in the same script.
1656
- def preview
1657
- frm.button(:value=>"Preview").click
1658
- @@file_number=0
1659
- AssignmentStudentPreview.new(@browser)
1660
- end
1661
-
1662
- # Clicks the Save Draft button, then
1663
- # instantiates the SubmissionConfirmation
1664
- # page class.
1665
- def save_draft
1666
- frm.button(:value=>"Save Draft").click
1667
- SubmissionConfirmation.new(@browser)
1668
- end
1669
-
1670
- # Clicks the link to select more files
1671
- # from the Workspace. Then instantiates
1672
- # the AssignmentsAttachments page class.
1673
- def select_more_files_from_workspace
1674
- frm.link(:id=>"attach").click
1675
- AssignmentsAttachments.new(@browser)
1676
- end
1677
-
1678
- in_frame(:index=>2) do |frame|
1679
- link(:add_another_file, :id=>"addMoreAttachmentControls", :frame=>frame)
1680
- h3(:header, :index=>0, :frame=>frame)
1681
- button(:cancel, :value=>"Cancel", :frame=>frame)
1682
- button(:back_to_list, :value=>"Back to list", :frame=>frame)
1683
- div(:instructor_comments, :class=>"textPanel", :index=>2, :frame=>frame)
1684
- end
1685
-
1686
- end
1687
-
1688
- # Page that appears when a Student User clicks to Preview an
1689
- # assignment that is in progress.
1690
- class AssignmentStudentPreview
1691
-
1692
- include PageObject
1693
- include AssignmentsMenu
1694
-
1695
- # Clicks the Submit button, then
1696
- # instantiates the SubmissionConfirmation
1697
- # page class.
1698
- def submit
1699
- frm.button(:value=>"Submit").click
1700
- SubmissionConfirmation.new(@browser)
1701
- end
1702
-
1703
- # Clicks the Save Draft button, then
1704
- # instantiates the SubmissionConfirmation
1705
- # page class.
1706
- def save_draft
1707
- frm.button(:value=>"Save Draft").click
1708
- SubmissionConfirmation.new(@browser)
1709
- end
1710
-
1711
- # Returns the contents of the submission box.
1712
- def submission_text
1713
- frm.div(:class=>"portletBody").div(:class=>/textPanel/).text
1714
- end
1715
-
1716
- # Returns an array of strings. Each element in the
1717
- # array is the name of attached files.
1718
- def attachments
1719
- names = []
1720
- frm.ul(:class=>"attachList indnt1").links.each { |link| names << link.text }
1721
- return names
1722
- end
1723
-
1724
- end
1725
-
1726
- # The page that appears when a Student user has fully submitted an assignment
1727
- # or saves it as a draft.
1728
- class SubmissionConfirmation
1729
-
1730
- include PageObject
1731
- include AssignmentsMenu
1732
-
1733
- # Returns the text of the success message on the page.
1734
- def confirmation_text
1735
- frm.div(:class=>"portletBody").div(:class=>"success").text
1736
- end
1737
-
1738
- # Returns the text of the assignment submission.
1739
- def submission_text
1740
- frm.div(:class=>"portletBody").div(:class=>"textPanel indnt2").text
1741
- end
1742
-
1743
- # Clicks the Back to list button, then
1744
- # instantiates the Assignments page class.
1745
- def back_to_list
1746
- frm.button(:value=>"Back to list").click
1747
- frm.link(:text=>"Assignment title").wait_until_present
1748
- Assignments.new(@browser)
1749
- end
1750
- end
1751
-
1752
- # The page that appears when you click on an assignment's "Grade" or "View Submission" link
1753
- # as an instructor. Shows the list of students and their
1754
- # assignment submission status.
1755
- class AssignmentSubmissionList
1756
-
1757
- include PageObject
1758
- include AssignmentsMenu
1759
-
1760
- # Clicks the Show Resubmission Settings button
1761
- def show_resubmission_settings
1762
- frm.image(:src, "/library/image/sakai/expand.gif?panel=Main").click
1763
- end
1764
-
1765
- # Clicks the Show Assignment Details button.
1766
- def show_assignment_details
1767
- frm.image(:src, "/library/image/sakai/expand.gif").click
1768
- end
1769
-
1770
- # Gets the Student table text and returns it in an Array object.
1771
- def student_table
1772
- table = frm.table(:class=>"listHier lines nolines").to_a
1773
- end
1774
-
1775
- # Clicks the Grade link for the specified student, then
1776
- # instantiates the AssignmentSubmission page class.
1777
- def grade(student_name)
1778
- frm.table(:class=>"listHier lines nolines").row(:text=>/#{Regexp.escape(student_name)}/).link(:text=>"Grade").click
1779
- frm.frame(:id, "grade_submission_feedback_comment___Frame").td(:id, "xEditingArea").frame(:index=>0).wait_until_present
1780
- AssignmentSubmission.new(@browser)
1781
- end
1782
-
1783
- # Gets the value of the status field for the specified
1784
- # Student. Note that the student's name needs to be entered
1785
- # so that it's unique for the row, but it does not have
1786
- # to match the entire name/id value--unless there are two
1787
- # students with the same name.
1788
- #
1789
- # Useful for verification purposes.
1790
- def submission_status_of(student_name)
1791
- frm.table(:class=>"listHier lines nolines").row(:text=>/#{Regexp.escape(student_name)}/)[4].text
1792
- end
1793
-
1794
- in_frame(:index=>2) do |frame|
1795
- text_field(:search_input, :id=>"search", :frame=>frame)
1796
- button(:find, :value=>"Find", :frame=>frame)
1797
- button(:clear, :value=>"Clear", :frame=>frame)
1798
- link(:download_all, :text=>"Download All", :frame=>frame)
1799
- link(:upload_all, :text=>"Upload All", :frame=>frame)
1800
- link(:release_grades, :text=>"Release Grades", :frame=>frame)
1801
- link(:sort_by_student, :text=>"Student", :frame=>frame)
1802
- link(:sort_by_submitted, :text=>"Submitted", :frame=>frame)
1803
- link(:sort_by_status, :text=>"Status", :frame=>frame)
1804
- link(:sort_by_grade, :text=>"Grade", :frame=>frame)
1805
- link(:sort_by_release, :text=>"Release", :frame=>frame)
1806
- select_list(:default_grade, :id=>"defaultGrade_1", :frame=>frame)
1807
- button(:apply, :name=>"apply", :frame=>frame)
1808
- select_list(:num_resubmissions, :id=>"allowResubmitNumber", :frame=>frame)
1809
- select_list(:accept_until_month, :id=>"allow_resubmit_closeMonth", :frame=>frame)
1810
- select_list(:accept_until_day, :id=>"allow_resubmit_closeDay", :frame=>frame)
1811
- select_list(:accept_until_year, :id=>"allow_resubmit_closeYear", :frame=>frame)
1812
- select_list(:accept_until_hour, :id=>"allow_resubmit_closeHour", :frame=>frame)
1813
- select_list(:accept_until_min, :id=>"allow_resubmit_closeMin", :frame=>frame)
1814
- select_list(:accept_until_meridian, :id=>"allow_resubmit_closeAMPM", :frame=>frame)
1815
- button(:update, :id=>"eventSubmit_doSave_resubmission_option", :frame=>frame)
1816
- select_list(:select_page_size, :id=>"selectPageSize", :frame=>frame)
1817
- button(:next, :name=>"eventSubmit_doList_next", :frame=>frame)
1818
- button(:last, :name=>"eventSubmit_doList_last", :frame=>frame)
1819
- button(:previous, :name=>"eventSubmit_doList_prev", :frame=>frame)
1820
- button(:first, :name=>"eventSubmit_doList_first", :frame=>frame)
1821
- button(:update, :name=>"eventSubmit_doDelete_confirm_assignment", :frame=>frame)
1822
-
1823
- end
1824
-
1825
- end
1826
-
1827
- # The page that shows a student's submitted assignment to an instructor user.
1828
- class AssignmentSubmission
1829
-
1830
- include PageObject
1831
- include AssignmentsMenu
1832
-
1833
- # Enters the specified text string in the FCKEditor box for the assignment text.
1834
- def assignment_text=(text)
1835
- frm.frame(:id, "grade_submission_feedback_text___Frame").td(:id, "xEditingArea").frame(:index=>0).send_keys(text)
1836
- end
1837
-
1838
- # Removes all the contents of the FCKEditor Assignment Text box.
1839
- def remove_assignment_text
1840
- frm.frame(:id, "grade_submission_feedback_text___Frame").div(:title=>"Select All").fire_event("onclick")
1841
- frm.frame(:id, "grade_submission_feedback_text___Frame").td(:id, "xEditingArea").frame(:index=>0).send_keys :backspace
1842
- end
1843
-
1844
- # Enters the specified string into the Instructor Comments FCKEditor box.
1845
- def instructor_comments=(text)
1846
- frm.frame(:id, "grade_submission_feedback_comment___Frame").td(:id, "xEditingArea").frame(:index=>0).send_keys(text)
1847
- end
1848
-
1849
- # Clicks the Add Attachments button, then instantiates the AssignmentsAttachments Class.
1850
- def add_attachments
1851
- frm.button(:name=>"attach").click
1852
- AssignmentsAttachments.new(@browser)
1853
- end
1854
-
1855
- # Clicks the Return to List button, then instantiates the
1856
- # AssignmentSubmissionList Class.
1857
- def return_to_list
1858
- frm.button(:value=>"Return to List").click
1859
- AssignmentSubmissionList.new(@browser)
1860
- end
1861
-
1862
- in_frame(:index=>2) do |frame|
1863
- select_list(:select_default_grade, :name=>"grade_submission_grade", :frame=>frame)
1864
- checkbox(:allow_resubmission, :id=>"allowResToggle", :frame=>frame)
1865
- select_list(:num_resubmissions, :id=>"allowResubmitNumberSelect", :frame=>frame)
1866
- select_list(:accept_until_month, :id=>"allow_resubmit_closeMonth", :frame=>frame)
1867
- select_list(:accept_until_day, :id=>"allow_resubmit_closeDay", :frame=>frame)
1868
- select_list(:accept_until_year, :id=>"allow_resubmit_closeYear", :frame=>frame)
1869
- select_list(:accept_until_hour, :id=>"allow_resubmit_closeHour", :frame=>frame)
1870
- select_list(:accept_until_min, :id=>"allow_resubmit_closeMin", :frame=>frame)
1871
- select_list(:accept_until_meridian, :id=>"allow_resubmit_closeAMPM", :frame=>frame)
1872
- button(:save_and_release, :value=>"Save and Release to Student", :frame=>frame)
1873
- button(:save_and_dont_release, :value=>"Save and Don't Release to Student", :frame=>frame)
1874
- end
1875
-
1876
- end
1877
-
1878
- # The Grade Report page accessed from the Assignments page
1879
- class GradeReport
1880
-
1881
- include PageObject
1882
- include AssignmentsMenu
1883
-
1884
- # Returns an array of hashes. Each hash is a line from the
1885
- # table. Hash keys are as follows:
1886
- # :name, :assignment, :grade, :scale, :submitted
1887
- def grade_report
1888
- array = []
1889
- frm.table(:class=>"listHier lines nolines").rows.each do |row|
1890
- next if row.td(:headers=>"studentname").exists? == false
1891
- hash = {}
1892
- hash[:student] = row.td(:headers=>"").text
1893
- hash[:assignment] = row.td(:headers=>"").text
1894
- hash[:grade] = row.td(:headers=>"").text
1895
- hash[:scale] = row.td(:headers=>"").text
1896
- hash[:submitted] = row.td(:headers=>"").text
1897
- array << hash
1898
- end
1899
- array
1900
- end
1901
-
1902
- in_frame(:index=>2) do |frame|
1903
- h3(:header, :index=>0, :frame=>frame)
1904
- paragraph(:instruction, :class=>"instruction", :frame=>frame)
1905
- link(:sort_by_student_name, :title=>" Sort by Last Name", :frame=>frame)
1906
- link(:sort_by_assignment, :title=>"Checkmark", :frame=>frame)
1907
- link(:sort_by_grade, :title=>" Sort by Grade", :frame=>frame)
1908
- link(:sort_by_scale, :title=>"Sort by Scale", :frame=>frame)
1909
- link(:sort_by_submitted, :title=>"Sort by Turned In Date", :frame=>frame)
1910
- select_list(:select_page_size, :id=>"selectPageSize", :frame=>frame)
1911
- end
1912
-
1913
- end
1914
-
1915
- # The Student View page accessed from the Assignments page
1916
- class StudentView
1917
-
1918
- include PageObject
1919
- include AssignmentsMenu
1920
-
1921
- in_frame(:index=>2) do |frame|
1922
- link(:sort_assignment_title, :text=>"Assignment title", :frame=>frame)
1923
- link(:sort_status, :text=>"Status", :frame=>frame)
1924
- link(:sort_open, :text=>"Open", :frame=>frame)
1925
- link(:sort_due, :text=>"Due", :frame=>frame)
1926
- link(:sort_scale, :text=>"Scale", :frame=>frame)
1927
- select_list(:select_page_size, :name=>"selectPageSize", :frame=>frame)
1928
- button(:next, :name=>"eventSubmit_doList_next", :frame=>frame)
1929
- button(:last, :name=>"eventSubmit_doList_last", :frame=>frame)
1930
- button(:previous, :name=>"eventSubmit_doList_prev", :frame=>frame)
1931
- button(:first, :name=>"eventSubmit_doList_first", :frame=>frame)
1932
- end
1933
-
1934
- end
1935
-
1936
- class AttachPageTools
1937
-
1938
- @@classes = { :this=>"Superclassdummy", :parent=>"Superclassdummy" }
1939
-
1940
- # Use this for debugging purposes only...
1941
- def what_is_parent?
1942
- puts @@classes[:parent]
1943
- end
1944
-
1945
- # Returns an array of the displayed folder names.
1946
- def folder_names
1947
- names = []
1948
- frm.table(:class=>/listHier lines/, :text=>/Title/).rows.each do |row|
1949
- next if row.td(:class=>"specialLink").exist? == false
1950
- next if row.td(:class=>"specialLink").link(:title=>"Folder").exist? == false
1951
- names << row.td(:class=>"specialLink").link(:title=>"Folder").text
1952
- end
1953
- return names
1954
- end
1955
-
1956
- # Returns an array containing the list of items that are
1957
- # slated to be attached.
1958
- def items_to_attach
1959
- array = []
1960
- frm.table(:text=>/Items to attach/).links(:href=>/access.content.attachment/).each { |link| array << link.text }
1961
- array
1962
- end
1963
-
1964
- # Returns an array of the file names currently listed
1965
- # on the page.
1966
- #
1967
- # It excludes folder names and does not include any items
1968
- # slated to be attached.
1969
- def file_names
1970
- names = []
1971
- frm.table(:class=>/listHier lines/, :text=>/Title/).rows.each do |row|
1972
- next if row.td(:class=>"specialLink").exist? == false
1973
- next if row.td(:class=>"specialLink").link(:title=>"Folder").exist?
1974
- names << row.td(:class=>"specialLink").link(:href=>/access.content/, :index=>1).text
1975
- end
1976
- return names
1977
- end
1978
-
1979
- # Clicks the Select button next to the specified file.
1980
- def select_file(filename)
1981
- frm.table(:class=>/listHier lines/).row(:text, /#{Regexp.escape(filename)}/).link(:text=>"Select").click
1982
- end
1983
-
1984
- # Clicks the Remove button.
1985
- def remove
1986
- frm.button(:value=>"Remove").click
1987
- end
1988
-
1989
- # Clicks the remove link for the specified item in the attachment list.
1990
- def remove_item(file_name)
1991
- frm.table(:class=>/listHier/).row(:text=>/#{Regexp.escape(file_name)}/).link(:href=>/doRemoveitem/).click
1992
- end
1993
-
1994
- # Clicks the Move button.
1995
- def move
1996
- frm.button(:value=>"Move").click
1997
- end
1998
-
1999
- # Clicks the Show Other Sites link.
2000
- def show_other_sites
2001
- frm.link(:text=>"Show other sites").click
2002
- end
2003
-
2004
- # Clicks on the specified folder image, which
2005
- # will open the folder tree and remain on the page.
2006
- def open_folder(foldername)
2007
- frm.table(:class=>/listHier lines/).row(:text=>/#{Regexp.escape(foldername)}/).link(:title=>"Open this folder").click
2008
- end
2009
-
2010
- # Clicks on the specified folder name, which should open
2011
- # the folder contents on a refreshed page.
2012
- def go_to_folder(foldername)
2013
- frm.link(:text=>foldername).click
2014
- end
2015
-
2016
- # Sets the URL field to the specified value.
2017
- def url=(url_string)
2018
- frm.text_field(:id=>"url").set(url_string)
2019
- end
2020
-
2021
- # Clicks the Add button next to the URL field.
2022
- def add
2023
- frm.button(:value=>"Add").click
2024
- end
2025
-
2026
- # Gets the value of the access level cell for the specified
2027
- # file.
2028
- def access_level(filename)
2029
- frm.table(:class=>/listHier lines/).row(:text=>/#{Regexp.escape(filename)}/)[6].text
2030
- end
2031
-
2032
- def edit_details(name)
2033
- frm.table(:class=>/listHier lines/).row(:text=>/#{Regexp.escape(name)}/).li(:text=>/Action/, :class=>"menuOpen").fire_event("onclick")
2034
- frm.table(:class=>/listHier lines/).row(:text=>/#{Regexp.escape(name)}/).link(:text=>"Edit Details").click
2035
- instantiate_class(:file_details)
2036
- end
2037
-
2038
- # Enters the specified file into the file field name. Method takes an optional
2039
- # file_path parameter that it will pre-pend before the supplied filename, allowing
2040
- # the file name and path name to be distinct variables.
2041
- #
2042
- # Does NOT instantiate any class, so use only when no page refresh occurs.
2043
- def upload_file(filename, file_path="")
2044
- frm.file_field(:id=>"upload").set(file_path + filename)
2045
- if frm.div(:class=>"alertMessage").exist?
2046
- sleep 2
2047
- upload_file(filename)
2048
- end
2049
- end
2050
-
2051
- # Clicks the Add Menu for the specified
2052
- # folder, then selects the Upload Files
2053
- # command in the menu that appears.
2054
- def upload_file_to_folder(folder_name)
2055
- upload_files_to_folder(folder_name)
2056
- end
2057
-
2058
- # Clicks the Add Menu for the specified
2059
- # folder, then selects the Upload Files
2060
- # command in the menu that appears.
2061
- def upload_files_to_folder(folder_name)
2062
- if frm.li(:text=>/A/, :class=>"menuOpen").exist?
2063
- frm.table(:class=>/listHier lines/).row(:text=>/#{Regexp.escape(folder_name)}/).li(:text=>/A/, :class=>"menuOpen").fire_event("onclick")
2064
- else
2065
- frm.table(:class=>/listHier lines/).row(:text=>/#{Regexp.escape(folder_name)}/).link(:text=>"Start Add Menu").fire_event("onfocus")
2066
- end
2067
- frm.table(:class=>/listHier lines/).row(:text=>/#{Regexp.escape(folder_name)}/).link(:text=>"Upload Files").click
2068
- instantiate_class(:upload_files)
2069
- end
2070
-
2071
- # Clicks the "Attach a copy" link for the specified
2072
- # file, then reinstantiates the Class.
2073
- # If an alert box appears, the method will call itself again.
2074
- # Note that this can lead to an infinite loop. Will need to fix later.
2075
- def attach_a_copy(file_name)
2076
- frm.table(:class=>/listHier lines/).row(:text=>/#{Regexp.escape(file_name)}/).link(:href=>/doAttachitem/).click
2077
- if frm.div(:class=>"alertMessage").exist?
2078
- sleep 1
2079
- attach_a_copy(file_name) # TODO - This can loop infinitely
2080
- end
2081
- instantiate_class(:this)
2082
- end
2083
-
2084
- # Clicks the Create Folders menu item in the
2085
- # Add menu of the specified folder.
2086
- def create_subfolders_in(folder_name)
2087
- frm.table(:class=>/listHier lines/).row(:text=>/#{Regexp.escape(folder_name)}/).link(:text=>"Start Add Menu").fire_event("onfocus")
2088
- frm.table(:class=>/listHier lines/).row(:text=>/#{Regexp.escape(folder_name)}/).link(:text=>"Create Folders").click
2089
- instantiate_class(:create_folders)
2090
- end
2091
-
2092
- # Takes the specified array object containing pointers
2093
- # to local file resources, then uploads those files to
2094
- # the folder specified, checks if they all uploaded properly and
2095
- # if not, re-tries the ones that failed the first time.
2096
- #
2097
- # Finally, it re-instantiates the AnnouncementsAttach page class.
2098
- def upload_multiple_files_to_folder(folder, file_array)
2099
-
2100
- upload = upload_files_to_folder folder
2101
-
2102
- file_array.each do |file|
2103
- upload.file_to_upload=file
2104
- upload.add_another_file
2105
- end
2106
-
2107
- resources = upload.upload_files_now
2108
-
2109
- file_array.each do |file|
2110
- file =~ /(?<=\/).+/
2111
- # puts $~.to_s # For debugging purposes
2112
- unless resources.file_names.include?($~.to_s)
2113
- upload_files = resources.upload_files_to_folder(folder)
2114
- upload_files.file_to_upload=file
2115
- resources = upload_files.upload_files_now
2116
- end
2117
- end
2118
- instantiate_class(:this)
2119
- end
2120
-
2121
- # Clicks the Continue button then
2122
- # decides which page class to instantiate
2123
- # based on the page that appears. This is going to need to be fixed.
2124
- def continue
2125
- frm.div(:class=>"highlightPanel").span(:id=>"submitnotifxxx").wait_while_present
2126
- frm.button(:value=>"Continue").click
2127
- end
2128
-
2129
- private
2130
-
2131
- # This is a private method that is only used inside this superclass.
2132
- def instantiate_class(key)
2133
- eval(@@classes[key]).new(@browser)
2134
- end
2135
-
2136
- # This is another private method--a better way to
2137
- # instantiate the @@classes hash variable.
2138
- def set_classes_hash(hash_object)
2139
- @@classes = hash_object
2140
- end
2141
-
2142
- end
2143
-
2144
- # Page for attaching files to Assignments
2145
- class AssignmentsAttachments < AttachPageTools
2146
-
2147
- include AssignmentsMenu
2148
-
2149
- def initialize(browser)
2150
- @browser = browser
2151
-
2152
- @@classes = {
2153
- :this => "AssignmentsAttachments",
2154
- :parent => "AddAssignments",
2155
- :second => "AssignmentStudent",
2156
- :third => "AssignmentSubmission"
2157
- }
2158
- end
2159
-
2160
- end