sambal-cle 0.1.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (90) hide show
  1. data/README.md +4 -0
  2. data/lib/sambal-cle/base_page.rb +20 -0
  3. data/lib/sambal-cle/core-ext.rb +90 -0
  4. data/lib/sambal-cle/data_objects/announcement.rb +82 -0
  5. data/lib/sambal-cle/data_objects/assessment.rb +32 -0
  6. data/lib/sambal-cle/data_objects/assignment.rb +205 -0
  7. data/lib/sambal-cle/data_objects/blog.rb +46 -0
  8. data/lib/sambal-cle/data_objects/blogger.rb +49 -0
  9. data/lib/sambal-cle/data_objects/chat_room.rb +54 -0
  10. data/lib/sambal-cle/data_objects/event.rb +89 -0
  11. data/lib/sambal-cle/data_objects/forum.rb +212 -0
  12. data/lib/sambal-cle/data_objects/lesson.rb +185 -0
  13. data/lib/sambal-cle/data_objects/message.rb +57 -0
  14. data/lib/sambal-cle/data_objects/poll.rb +74 -0
  15. data/lib/sambal-cle/data_objects/resource.rb +209 -0
  16. data/lib/sambal-cle/data_objects/site.rb +295 -0
  17. data/lib/sambal-cle/data_objects/syllabus.rb +73 -0
  18. data/lib/sambal-cle/data_objects/web_content_tool.rb +51 -0
  19. data/lib/sambal-cle/data_objects/wiki.rb +63 -0
  20. data/lib/sambal-cle/date_makers.rb +118 -0
  21. data/lib/sambal-cle/gem_ext.rb +23 -0
  22. data/lib/sambal-cle/page_helper.rb +22 -0
  23. data/lib/sambal-cle/page_maker.rb +48 -0
  24. data/lib/sambal-cle/page_objects/account.rb +111 -0
  25. data/lib/sambal-cle/page_objects/aliases.rb +43 -0
  26. data/lib/sambal-cle/page_objects/announcements.rb +190 -0
  27. data/lib/sambal-cle/page_objects/assessments.rb +874 -0
  28. data/lib/sambal-cle/page_objects/assignments.rb +770 -0
  29. data/lib/sambal-cle/page_objects/basic_lti.rb +6 -0
  30. data/lib/sambal-cle/page_objects/blogger.rb +205 -0
  31. data/lib/sambal-cle/page_objects/blogs.rb +60 -0
  32. data/lib/sambal-cle/page_objects/calendar.rb +330 -0
  33. data/lib/sambal-cle/page_objects/calendar_summary.rb +1 -0
  34. data/lib/sambal-cle/page_objects/chat_room.rb +22 -0
  35. data/lib/sambal-cle/page_objects/drop_box.rb +9 -0
  36. data/lib/sambal-cle/page_objects/email_archive.rb +22 -0
  37. data/lib/sambal-cle/page_objects/entity_picker.rb +62 -0
  38. data/lib/sambal-cle/page_objects/evaluations.rb +158 -0
  39. data/lib/sambal-cle/page_objects/feedback.rb +36 -0
  40. data/lib/sambal-cle/page_objects/forms.rb +120 -0
  41. data/lib/sambal-cle/page_objects/forums.rb +254 -0
  42. data/lib/sambal-cle/page_objects/glossary.rb +117 -0
  43. data/lib/sambal-cle/page_objects/gradebook.rb +29 -0
  44. data/lib/sambal-cle/page_objects/gradebook2.rb +17 -0
  45. data/lib/sambal-cle/page_objects/home.rb +36 -0
  46. data/lib/sambal-cle/page_objects/jforums.rb +444 -0
  47. data/lib/sambal-cle/page_objects/job_scheduler.rb +121 -0
  48. data/lib/sambal-cle/page_objects/lessons.rb +361 -0
  49. data/lib/sambal-cle/page_objects/login.rb +28 -0
  50. data/lib/sambal-cle/page_objects/matrix.rb +241 -0
  51. data/lib/sambal-cle/page_objects/media_gallery.rb +13 -0
  52. data/lib/sambal-cle/page_objects/messages.rb +622 -0
  53. data/lib/sambal-cle/page_objects/my_workspace.rb +44 -0
  54. data/lib/sambal-cle/page_objects/news.rb +8 -0
  55. data/lib/sambal-cle/page_objects/podcasts.rb +27 -0
  56. data/lib/sambal-cle/page_objects/polls.rb +69 -0
  57. data/lib/sambal-cle/page_objects/portfolio_templates.rb +161 -0
  58. data/lib/sambal-cle/page_objects/portfolios.rb +162 -0
  59. data/lib/sambal-cle/page_objects/post_em.rb +1 -0
  60. data/lib/sambal-cle/page_objects/profile.rb +51 -0
  61. data/lib/sambal-cle/page_objects/profile2.rb +344 -0
  62. data/lib/sambal-cle/page_objects/public_search.rb +61 -0
  63. data/lib/sambal-cle/page_objects/realms.rb +19 -0
  64. data/lib/sambal-cle/page_objects/resources.rb +326 -0
  65. data/lib/sambal-cle/page_objects/resources_roster.rb +0 -0
  66. data/lib/sambal-cle/page_objects/rosters.rb +70 -0
  67. data/lib/sambal-cle/page_objects/rwiki.rb +34 -0
  68. data/lib/sambal-cle/page_objects/search.rb +34 -0
  69. data/lib/sambal-cle/page_objects/sections.rb +295 -0
  70. data/lib/sambal-cle/page_objects/single_user.rb +1 -0
  71. data/lib/sambal-cle/page_objects/site_setup.rb +621 -0
  72. data/lib/sambal-cle/page_objects/site_statistics.rb +1 -0
  73. data/lib/sambal-cle/page_objects/sites.rb +255 -0
  74. data/lib/sambal-cle/page_objects/styles.rb +74 -0
  75. data/lib/sambal-cle/page_objects/syllabus.rb +166 -0
  76. data/lib/sambal-cle/page_objects/user_membership.rb +57 -0
  77. data/lib/sambal-cle/page_objects/users.rb +88 -0
  78. data/lib/sambal-cle/randomizers.rb +117 -0
  79. data/lib/sambal-cle/rich_text.rb +38 -0
  80. data/lib/sambal-cle/utilities.rb +31 -0
  81. data/lib/sambal-cle/workflows.rb +223 -0
  82. data/lib/sambal-cle.rb +31 -0
  83. data/sambal-cle.gemspec +14 -0
  84. data/test/add_assignment_to_calendar_spec.rb +86 -0
  85. data/test/assignment_announcements_spec.rb +71 -0
  86. data/test/assignment_gradebook_spec.rb +98 -0
  87. data/test/config.yml.template +4 -0
  88. data/test/directory.yml.template +123 -0
  89. data/test/duplicate_site_spec.rb +244 -0
  90. metadata +167 -0
@@ -0,0 +1,874 @@
1
+
2
+ #================
3
+ # Assessments pages - "Samigo", a.k.a., "Tests & Quizzes"
4
+ #================
5
+
6
+ # Base Class for building Assessments
7
+ class AssessmentsBase <BasePage
8
+
9
+ frame_element
10
+ class << self
11
+ def menu_bar_elements
12
+ action(:assessments) { |b| b.frm.link(:text=>"Assessments").click }
13
+ action(:assessment_types) { |b| b.frm.link(:text=>"Assessment Types").click }
14
+ # Clicks the Question Pools link, goes to
15
+ # the QuestionPoolsList class.
16
+ action(:question_pools) { |b| b.frm.link(:text=>"Question Pools").click }
17
+ action(:questions) { |b| b.frm.link(:text=>/Questions:/).click }
18
+ end
19
+
20
+ def question_page_elements
21
+ element(:answer_point_value) { |b| b.frm.text_field(:id=>"itemForm:answerptr") }
22
+ element(:assign_to_part) { |b| b.frm.select(:id=>"itemForm:assignToPart") }
23
+ element(:assign_to_pool) { |b| b.frm.select(:id=>"itemForm:assignToPool") }
24
+ element(:question_text) { |b| b.frm.text_field(:class=>"simple_text_area", :index=>0) }
25
+ action(:save) { |b| b.frm.button(:value=>"Save").click }
26
+ action(:cancel) { |b| b.frm.button(:id=>"itemForm:_id63").click }
27
+ action(:add_attachments) { |b| b.frm.button(:value=>"Add Attachments").click }
28
+ end
29
+
30
+ def pool_page_elements
31
+ element(:pool_name) { |b| b.frm.text_field(:id=>/:namefield/) }
32
+ element(:department_group) { |b| b.frm.text_field(:id=>/:orgfield/) }
33
+ element(:description) { |b| b.frm.text_field(:id=>/:descfield/) }
34
+ element(:objectives) { |b| b.frm.text_field(:id=>/:objfield/) }
35
+ element(:keywords) { |b| b.frm.text_field(:id=>/:keyfield/) }
36
+ # QuestionPoolsList
37
+ action(:save) { |b| b.frm.button(:id=>"questionpool:submit").click }
38
+ action(:cancel) { |b| b.frm.button(:value=>"Cancel").click }
39
+ end
40
+ end
41
+ end
42
+
43
+ # The Course Tools "Tests and Quizzes" page for a given site.
44
+ # (Instructor view)
45
+ class AssessmentsList < AssessmentsBase
46
+
47
+ menu_bar_elements
48
+
49
+ expected_element :title
50
+
51
+ # If the assessment is going to be made in the builder, then
52
+ # use EditAssessment. There's no page class for markup text, yet.
53
+ action(:create) { |b| b.frm.button(:value=>"Create").click }
54
+
55
+ # Collects the titles of the Assessments listed as "Pending"
56
+ # then returns them as an Array.
57
+ def pending_assessment_titles
58
+ titles =[]
59
+ pending_table = frm.table(:id=>"authorIndexForm:coreAssessments")
60
+ 1.upto(pending_table.rows.size-1) do |x|
61
+ titles << pending_table[x][1].span(:id=>/assessmentTitle/).text
62
+ end
63
+ return titles
64
+ end
65
+
66
+ # Collects the titles of the Assessments listed as "Published"
67
+ # then returns them as an Array.
68
+ def published_assessment_titles
69
+ titles =[]
70
+ published_table = frm.div(:class=>"tier2", :index=>2).table(:class=>"listHier", :index=>0)
71
+ 1.upto(published_table.rows.size-1) do |x|
72
+ titles << published_table[x][1].span(:id=>/publishedAssessmentTitle/).text
73
+ end
74
+ return titles
75
+ end
76
+
77
+ # Returns an Array of the inactive Assessment titles displayed
78
+ # in the list.
79
+ def inactive_assessment_titles
80
+ titles =[]
81
+ inactive_table = frm.div(:class=>"tier2", :index=>2).table(:id=>"authorIndexForm:inactivePublishedAssessments")
82
+ 1.upto(inactive_table.rows.size-1) do |x|
83
+ titles << inactive_table[x][1].span(:id=>/inactivePublishedAssessmentTitle/).text
84
+ end
85
+ return titles
86
+ end
87
+
88
+ # Opens the selected test for scoring
89
+ # then instantiates the AssessmentTotalScores class.
90
+ # @param test_title [String] the title of the test to be clicked.
91
+ def score_test(test_title)
92
+ frm.tbody(:id=>"authorIndexForm:_id88:tbody_element").row(:text=>/#{Regexp.escape(test_title)}/).link(:id=>/authorIndexToScore/).click
93
+ AssessmentTotalScores.new(@browser)
94
+ end
95
+
96
+ element(:title) { |b| b.frm.text_field(:id=>"authorIndexForm:title") }
97
+ element(:create_using_builder) { |b| b.frm.radio(:name=>"authorIndexForm:_id29", :index=>0) }
98
+ element(:create_using_text) { |b| b.frm.radio(:name=>"authorIndexForm:_id29") }
99
+ element(:select_assessment_type) { |b| b.frm.select(:id=>"authorIndexForm:assessmentTemplate") }
100
+ action(:import) { |b| b.frm.button(:id=>"authorIndexForm:import").click }
101
+
102
+ end
103
+
104
+ # Page that appears when previewing an assessment.
105
+ # It shows the basic information about the assessment.
106
+ class PreviewOverview < BasePage
107
+
108
+ frame_element
109
+
110
+ # Scrapes the value of the due date from the page. Returns it as a string.
111
+ def due_date
112
+ frm.div(:class=>"tier2").table(:index=>0)[0][0].text
113
+ end
114
+
115
+ # Scrapes the value of the time limit from the page. Returns it as a string.
116
+ def time_limit
117
+ frm.div(:class=>"tier2").table(:index=>0)[3][0].text
118
+ end
119
+
120
+ # Scrapes the submission limit from the page. Returns it as a string.
121
+ def submission_limit
122
+ frm.div(:class=>"tier2").table(:index=>0)[6][0].text
123
+ end
124
+
125
+ # Scrapes the Feedback policy from the page. Returns it as a string.
126
+ def feedback
127
+ frm.div(:class=>"tier2").table(:index=>0)[9][0].text
128
+ end
129
+
130
+ # Clicks the Done button, then instantiates
131
+ # the EditAssessment class.
132
+ def done
133
+ frm.button(:name=>"takeAssessmentForm:_id5").click
134
+ EditAssessment.new(@browser)
135
+ end
136
+
137
+ action(:begin_assessment) { |b| b.frm.button(:id=>"takeAssessmentForm:beginAssessment3").click }
138
+
139
+ end
140
+
141
+ # The Settings page for a particular Assessment
142
+ class AssessmentSettings < AssessmentsBase
143
+
144
+ menu_bar_elements
145
+
146
+ # Scrapes the Assessment Type from the page and returns it as a string.
147
+ def assessment_type_title
148
+ frm.div(:class=>"tier2").table(:index=>0)[0][1].text
149
+ end
150
+
151
+ # Scrapes the Assessment Author information from the page and returns it as a string.
152
+ def assessment_type_author
153
+ frm.div(:class=>"tier2").table(:index=>0)[1][1].text
154
+ end
155
+
156
+ # Scrapes the Assessment Type Description from the page and returns it as a string.
157
+ def assessment_type_description
158
+ frm.div(:class=>"tier2").table(:index=>0)[2][1].text
159
+ end
160
+
161
+ # Clicks the Save Settings and Publish button
162
+ # then instantiates the PublishAssessment class.
163
+ def save_and_publish
164
+ frm.button(:value=>"Save Settings and Publish").click
165
+ PublishAssessment.new(@browser)
166
+ end
167
+
168
+ action(:open) { |b| b.frm.link(:text=>"Open") }
169
+ action(:close) { |b| b.frm.link(:text=>"Close") }
170
+ element(:title) { |b| b.frm.text_field(:id=>"assessmentSettingsAction:intro:assessment_title") }
171
+ element(:authors) { |b| b.frm.text_field(:id=>"assessmentSettingsAction:intro:assessment_author") }
172
+ element(:description) { |b| b.frm.text_field(:id=>"assessmentSettingsAction:intro:_id44_textinput") }
173
+ action(:add_attachments_to_intro) { |b| b.frm.button(:name=>"assessmentSettingsAction:intro:_id90").click }
174
+ element(:available_date) { |b| b.frm.text_field(:id=>"assessmentSettingsAction:startDate") }
175
+ element(:due_date) { |b| b.frm.text_field(:id=>"assessmentSettingsAction:endDate") }
176
+ element(:retract_date) { |b| b.frm.text_field(:id=>"assessmentSettingsAction:retractDate") }
177
+ element(:released_to_anonymous) { |b| b.frm.radio(:name=>"assessmentSettingsAction:_id117") }
178
+ element(:released_to_site) { |b| b.frm.radio(:name=>"assessmentSettingsAction:_id117") }
179
+ element(:specified_ips) { |b| b.frm.text_field(:name=>"assessmentSettingsAction:_id132") }
180
+ element(:secondary_id) { |b| b.frm.text_field(:id=>"assessmentSettingsAction:username") }
181
+ element(:secondary_pw) { |b| b.frm.text_field(:id=>"assessmentSettingsAction:password") }
182
+ element(:timed_assessment) { |b| b.frm.checkbox(:id=>"assessmentSettingsAction:selTimeAssess") }
183
+ element(:limit_hour) { |b| b.frm.select(:id=>"assessmentSettingsAction:timedHours") }
184
+ element(:limit_mins) { |b| b.frm.select(:id=>"assessmentSettingsAction:timedMinutes") }
185
+ element(:linear_access) { |b| b.frm.radio(:name=>"assessmentSettingsAction:itemNavigation") }
186
+ element(:random_access) { |b| b.frm.radio(:name=>"assessmentSettingsAction:itemNavigation") }
187
+ element(:question_per_page) { |b| b.frm.radio(:name=>"assessmentSettingsAction:assessmentFormat") }
188
+ element(:part_per_page) { |b| b.frm.radio(:name=>"assessmentSettingsAction:assessmentFormat") }
189
+ element(:assessment_per_page) { |b| b.frm.radio(:name=>"assessmentSettingsAction:assessmentFormat") }
190
+ element(:continuous_numbering) { |b| b.frm.radio(:name=>"assessmentSettingsAction:itemNumbering") }
191
+ element(:restart_per_part) { |b| b.frm.radio(:name=>"assessmentSettingsAction:itemNumbering") }
192
+ element(:add_mark_for_review) { |b| b.frm.text_field(:id=>"assessmentSettingsAction:markForReview1") }
193
+ element(:unlimited_submissions) { |b| b.frm.radio(:name=>"assessmentSettingsAction:unlimitedSubmissions") }
194
+ element(:only_x_submissions) { |b| b.frm.radio(:name=>"assessmentSettingsAction:unlimitedSubmissions") }
195
+ element(:allowed_submissions) { |b| b.frm.text_field(:id=>"assessmentSettingsAction:submissions_Allowed") }
196
+ element(:late_submissions_not_accepted) { |b| b.frm.radio(:name=>"assessmentSettingsAction:lateHandling") }
197
+ element(:late_submissions_accepted) { |b| b.frm.radio(:name=>"assessmentSettingsAction:lateHandling") }
198
+ element(:submission_message) { |b| b.frm.text_field(:id=>"assessmentSettingsAction:_id245_textinput") }
199
+ element(:final_page_url) { |b| b.frm.text_field(:id=>"assessmentSettingsAction:finalPageUrl") }
200
+ element(:question_level_feedback) { |b| b.frm.radio(:name=>"assessmentSettingsAction:feedbackAuthoring") }
201
+ element(:selection_level_feedback) { |b| b.frm.radio(:name=>"assessmentSettingsAction:feedbackAuthoring") }
202
+ element(:both_feedback_levels) { |b| b.frm.radio(:name=>"assessmentSettingsAction:feedbackAuthoring") }
203
+ element(:immediate_feedback) { |b| b.frm.radio(:name=>"assessmentSettingsAction:feedbackDelivery") }
204
+ element(:feedback_on_submission) { |b| b.frm.radio(:name=>"assessmentSettingsAction:feedbackDelivery") }
205
+ element(:no_feedback) { |b| b.frm.radio(:name=>"assessmentSettingsAction:feedbackDelivery") }
206
+ element(:feedback_on_date) { |b| b.frm.radio(:name=>"assessmentSettingsAction:feedbackDelivery") }
207
+ element(:feedback_date) { |b| b.frm.text_field(:id=>"assessmentSettingsAction:feedbackDate") }
208
+ element(:only_release_scores) { |b| b.frm.radio(:name=>"assessmentSettingsAction:feedbackComponentOption") }
209
+ element(:release_questions_and) { |b| b.frm.radio(:name=>"assessmentSettingsAction:feedbackComponentOption") }
210
+ element(:release_student_response) { |b| b.frm.text_field(:id=>"assessmentSettingsAction:feedbackCheckbox1") }
211
+ element(:release_correct_response) { |b| b.frm.text_field(:id=>"assessmentSettingsAction:feedbackCheckbox3") }
212
+ element(:release_students_assessment_scores) { |b| b.frm.text_field(:id=>"assessmentSettingsAction:feedbackCheckbox5") }
213
+ element(:release_students_question_and_part_scores) { |b| b.frm.text_field(:id=>"assessmentSettingsAction:feedbackCheckbox7") }
214
+ element(:release_question_level_feedback) { |b| b.frm.text_field(:id=>"assessmentSettingsAction:feedbackCheckbox2") }
215
+ element(:release_selection_level_feedback) { |b| b.frm.text_field(:id=>"assessmentSettingsAction:feedbackCheckbox4") }
216
+ element(:release_graders_comments) { |b| b.frm.checkbox(:id=>"assessmentSettingsAction:feedbackCheckbox6") }
217
+ element(:release_statistics) { |b| b.frm.checkbox(:id=>"assessmentSettingsAction:feedbackCheckbox8") }
218
+ element(:student_ids_seen) { |b| b.frm.radio(:name=>"assessmentSettingsAction:anonymousGrading1") }
219
+ element(:anonymous_grading) { |b| b.frm.radio(:name=>"assessmentSettingsAction:anonymousGrading1") }
220
+ #radio_button(:no_gradebook_options) { |b| b.frm.radio(:name=>"") }
221
+ #radio_button(:grades_sent_to_gradebook) { |b| b.frm.radio(:name=>"") }
222
+ #radio_button(:record_highest_score) { |b| b.frm.radio(:name=>"") }
223
+ #radio_button(:record_last_score) { |b| b.frm.radio(:name=>"") }
224
+ #radio_button(:background_color) { |b| b.frm.radio(:name=>"") }
225
+ #text_field(:color_value, :id=>"") }
226
+ #radio_button(:background_image) { |b| b.frm.radio(:name=>"") }
227
+ #text_field(:image_name, :=>"") }
228
+ #text_field(:keywords, :=>"") }
229
+ #text_field(:objectives, :=>"") }
230
+ #text_field(:rubrics, :=>"") }
231
+ #checkbox(:record_metadata_for_questions, :=>"") }
232
+ action(:save) { |b| b.frm.button(:name=>"assessmentSettingsAction:_id383").click }
233
+ action(:cancel) { |b| b.frm.button(:name=>"assessmentSettingsAction:_id385").click }
234
+
235
+ end
236
+
237
+ # Instructor's view of Students' assessment scores
238
+ class AssessmentTotalScores < BasePage
239
+
240
+ frame_element
241
+
242
+ # Gets the user ids listed in the
243
+ # scores table, returns them as an Array
244
+ # object.
245
+ #
246
+ # Note that this method is only appropriate when student
247
+ # identities are not being obscured on this page. If student
248
+ # submissions are set to be anonymous then this method will fail
249
+ # to return any ids.
250
+ def student_ids
251
+ ids = []
252
+ scores_table = frm.table(:id=>"editTotalResults:totalScoreTable").to_a
253
+ scores_table.delete_at(0)
254
+ scores_table.each { |row| ids << row[1] }
255
+ return ids
256
+ end
257
+
258
+ # Adds a comment to the specified student's comment box.
259
+ #
260
+ # Note that this method assumes that the student identities are not being
261
+ # obscured on this page. If they are, then this method will not work for
262
+ # selecting the appropriate comment box.
263
+ # @param student_id [String] the target student id
264
+ # @param comment [String] the text of the comment being made to the student
265
+ def comment_for_student(student_id, comment)
266
+ index_val = student_ids.index(student_id)
267
+ frm.text_field(:name=>"editTotalResults:totalScoreTable:#{index_val}:_id345").value=comment
268
+ end
269
+
270
+ # Clicks the Submit Date link in the table header to sort/reverse sort the list.
271
+ def sort_by_submit_date
272
+ frm.link(:text=>"Submit Date").click
273
+ end
274
+
275
+ # Enters the specified string into the topmost box listed on the page.
276
+ #
277
+ # This method is especially useful when the student identities are obscured, since
278
+ # in that situation you can't target a specific student's comment box, obviously.
279
+ # @param comment [String] the text to be entered into the Comment box
280
+ def comment_in_first_box=(comment)
281
+ frm.text_field(:name=>"editTotalResults:totalScoreTable:0:_id345").value=comment
282
+ end
283
+
284
+ # Clicks the Update button, then instantiates
285
+ # the AssessmentTotalScores class.
286
+ def update
287
+ frm.button(:value=>"Update").click
288
+ AssessmentTotalScores.new(@browser)
289
+ end
290
+
291
+ # Clicks the Assessments link on the page
292
+ # then instantiates the AssessmentsList class.
293
+ def assessments
294
+ frm.link(:text=>"Assessments").click
295
+ AssessmentsList.new(@browser)
296
+ end
297
+
298
+ end
299
+
300
+ # The page that appears when you're creating a new quiz
301
+ # or editing an existing one
302
+ class EditAssessment < AssessmentsBase
303
+
304
+ menu_bar_elements
305
+
306
+ # Allows insertion of a question at a specified
307
+ # point in the Assessment. Must include the
308
+ # part number, the question number, and the type of
309
+ # question. Question Type must match the Type
310
+ # value in the drop down.
311
+ def insert_question_after(part_num, question_num, qtype)
312
+ if question_num.to_i == 0
313
+ frm.select(:id=>"assesssmentForm:parts:#{part_num.to_i - 1}:changeQType").select(qtype)
314
+ else
315
+ frm.select(:id=>"assesssmentForm:parts:#{part_num.to_i - 1}:parts:#{question_num.to_i - 1}:changeQType").select(qtype)
316
+ end
317
+ end
318
+
319
+ # Allows removal of question by part number and question number.
320
+ # @param part_num [String] the Part number containing the question you want to remove
321
+ # @param question_num [String] the number of the question you want to remove
322
+ def remove_question(part_num, question_num)
323
+ frm.link(:id=>"assesssmentForm:parts:#{part_num.to_i-1}:parts:#{question_num.to_i-1}:deleteitem").click
324
+ end
325
+
326
+ # Allows editing of a question by specifying its part number
327
+ # and question number.
328
+ # @param part_num [String] the Part number containing the question you want
329
+ # @param question_num [String] the number of the question you want
330
+ def edit_question(part_num, question_num)
331
+ frm.link(:id=>"assesssmentForm:parts:#{part_num.to_i-1}:parts:#{question_num.to_i-1}:modify").click
332
+ end
333
+
334
+ # Allows copying an Assessment part to a Pool.
335
+ # @param part_num [String] the part number of the assessment you want
336
+ def copy_part_to_pool(part_num)
337
+ frm.link(:id=>"assesssmentForm:parts:#{part_num.to_i-1}:copyToPool").click
338
+ end
339
+
340
+ # Allows removing a specified
341
+ # Assessment part number.
342
+ # @param part_num [String] the part number of the assessment you want
343
+ def remove_part(part_num)
344
+ frm.link(:xpath, "//a[contains(@onclick, 'assesssmentForm:parts:#{part_num.to_i-1}:copyToPool')]").click
345
+ end
346
+
347
+ # Clicks the Add Part button, then
348
+ # instantiates the AddEditAssessmentPart page class.
349
+ def add_part
350
+ frm.link(:text=>"Add Part").click
351
+ AddEditAssessmentPart.new(@browser)
352
+ end
353
+
354
+ # Selects the desired question type from the
355
+ # drop down list.
356
+ element(:question_type) { |b| b.frm.select(:id=>"assesssmentForm:changeQType").select(qtype) }
357
+
358
+ # Clicks the Preview button,
359
+ # then instantiates the PreviewOverview page class.
360
+ def preview
361
+ frm.link(:text=>"Preview").click
362
+ PreviewOverview.new(@browser)
363
+ end
364
+
365
+ # Clicks the Settings link, then
366
+ # instantiates the AssessmentSettings page class.
367
+ def settings
368
+ frm.link(:text=>"Settings").click
369
+ AssessmentSettings.new(@browser)
370
+ end
371
+
372
+ # Clicks the Publish button, then
373
+ # instantiates the PublishAssessment page class.
374
+ def publish
375
+ frm.link(:text=>"Publish").click
376
+ PublishAssessment.new(@browser)
377
+ end
378
+
379
+ # Clicks the Question Pools button, then
380
+ # instantiates the QuestionPoolsList page class.
381
+ def question_pools
382
+ frm.link(:text=>"Question Pools").click
383
+ QuestionPoolsList.new(@browser)
384
+ end
385
+
386
+ # Allows retrieval of a specified question's
387
+ # text, by part and question number.
388
+ # @param part_num [String] the Part number containing the question you want
389
+ # @param question_num [String] the number of the question you want
390
+ def get_question_text(part_number, question_number)
391
+ frm.table(:id=>"assesssmentForm:parts:#{part_number.to_i-1}:parts").div(:class=>"tier3", :index=>question_number.to_i-1).text
392
+ end
393
+
394
+ action(:print) { |b| b.frm.button(:text=>"Print").click }
395
+ action(:update_points) { |b| b.frm.button(:id=>"assesssmentForm:pointsUpdate").click }
396
+
397
+ end
398
+
399
+ # This is the page for adding and editing a part of an assessment
400
+ class AddEditAssessmentPart < BasePage
401
+
402
+ frame_element
403
+
404
+ # Clicks the Save button, then instantiates
405
+ # the EditAssessment page class.
406
+ def save
407
+ frm.button(:name=>"modifyPartForm:_id89").click
408
+ EditAssessment.new(@browser)
409
+ end
410
+
411
+ element(:title) { |b| b.frm.text_field(:id=>"modifyPartForm:title") }
412
+ element(:information) { |b| b.frm.text_field(:id=>"modifyPartForm:_id10_textinput") }
413
+ action(:add_attachments) { |b| b.frm.button(:name=>"modifyPartForm:_id54").click }
414
+ element(:questions_one_by_one) { |b| b.frm.radio(:index=>0, :name=>"modifyPartForm:_id60") }
415
+ element(:random_draw) { |b| b.frm.radio(:index=>1, :name=>"modifyPartForm:_id60") }
416
+ element(:pool_name) { |b| b.frm.select(:id=>"modifyPartForm:assignToPool") }
417
+ element(:number_of_questions) { |b| b.frm.text_field(:id=>"modifyPartForm:numSelected") }
418
+ element(:point_value_of_questions) { |b| b.frm.text_field(:id=>"modifyPartForm:numPointsRandom") }
419
+ element(:negative_point_value) { |b| b.frm.text_field(:id=>"modifyPartForm:numDiscountRandom") }
420
+ element(:randomized_each_time) { |b| b.frm.radio(:index=>0, :name=>"modifyPartForm:randomizationType") }
421
+ element(:randomized_once) { |b| b.frm.radio(:index=>1, :name=>"modifyPartForm:randomizationType") }
422
+ element(:order_as_listed) { |b| b.frm.radio(:index=>0, :name=>"modifyPartForm:_id81") }
423
+ element(:random_within_part) { |b| b.frm.radio(:index=>1, :name=>"modifyPartForm:_id81") }
424
+ element(:objective) { |b| b.frm.text_field(:id=>"modifyPartForm:obj") }
425
+ element(:keyword) { |b| b.frm.text_field(:id=>"modifyPartForm:keyword") }
426
+ element(:rubric) { |b| b.frm.text_field(:id=>"modifyPartForm:rubric") }
427
+ action(:cancel) { |b| b.frm.button(:name=>"modifyPartForm:_id90").click }
428
+
429
+ end
430
+
431
+ # The review page once you've selected to Save and Publish
432
+ # the assessment
433
+ class PublishAssessment < BasePage
434
+
435
+ frame_element
436
+ # Clicks the Publish button, then
437
+ # instantiates the AssessmentsList page class.
438
+ def publish
439
+ frm.button(:value=>"Publish").click
440
+ AssessmentsList.new(@browser)
441
+ end
442
+
443
+ action(:cancel) { |b| b.frm.button(:value=>"Cancel").click }
444
+ action(:edit) { |b| b.frm.button(:name=>"publishAssessmentForm:_id23").click }
445
+ element(:notification) { |b| b.frm.select(:id=>"publishAssessmentForm:number") }
446
+
447
+ end
448
+
449
+ # The page for setting up a multiple choice question
450
+ class MultipleChoice < AssessmentsBase
451
+
452
+ menu_bar_elements
453
+ question_page_elements
454
+
455
+ action(:whats_this) { |b| b.frm.link(:text=>"(What's This?)").click }
456
+ element(:single_correct) { |b| b.frm.radio(:name=>"itemForm:chooseAnswerTypeForMC", :index=>0) }
457
+ element(:enable_negative_marking) { |b| b.frm.radio(:name=>"itemForm:partialCreadit_NegativeMarking", :index=>0) }
458
+
459
+ # Element present when negative marking selected:
460
+ element(:negative_point_value) { |b| b.frm.text_field(:id=>"itemForm:answerdsc") }
461
+
462
+ element(:enable_partial_credit) { |b| b.frm.radio(:name=>"itemForm:partialCreadit_NegativeMarking", :index=>1) }
463
+ action(:reset_to_default) { |b| b.frm.link(:text=>"Reset to Default Grading Logic").click }
464
+ element(:multi_single) { |b| b.frm.radio(:name=>"itemForm:chooseAnswerTypeForMC", :index=>1) }
465
+ element(:multi_multi) { |b| b.frm.radio(:name=>"itemForm:chooseAnswerTypeForMC", :index=>2) }
466
+
467
+ element(:answer_a) { |b| b.frm.text_field(:id=>"itemForm:mcchoices:0:_id140_textinput") }
468
+ action(:remove_a) { |b| b.frm.link(:id=>"itemForm:mcchoices:0:removelinkSingle").click }
469
+ element(:answer_b) { |b| b.frm.text_field(:id=>"itemForm:mcchoices:1:_id140_textinput") }
470
+ action(:remove_b) { |b| b.frm.link(:id=>"itemForm:mcchoices:1:removelinkSingle").click }
471
+ element(:answer_c) { |b| b.frm.text_field(:id=>"itemForm:mcchoices:2:_id140_textinput") }
472
+ action(:remove_c) { |b| b.frm.link(:id=>"itemForm:mcchoices:2:removelinkSingle").click }
473
+ element(:answer_d) { |b| b.frm.text_field(:id=>"itemForm:mcchoices:3:_id140_textinput") }
474
+ action(:remove_d) { |b| b.frm.link(:id=>"itemForm:mcchoices:3:removelinkSingle").click }
475
+
476
+ # Radio buttons that appear when "single correct" is selected
477
+ element(:a_correct) { |b| b.frm.radio(:name=>"itemForm:mcchoices:0:mcradiobtn") }
478
+ element(:b_correct) { |b| b.frm.radio(:name=>"itemForm:mcchoices:1:mcradiobtn") }
479
+ element(:c_correct) { |b| b.frm.radio(:name=>"itemForm:mcchoices:2:mcradiobtn") }
480
+ element(:d_correct) { |b| b.frm.radio(:name=>"itemForm:mcchoices:3:mcradiobtn") }
481
+
482
+ # % Value fields that appear when "single correct" and "partial credit" selected
483
+ element(:a_value) { |b| b.frm.text_field(:id=>"itemForm:mcchoices:0:partialCredit") }
484
+ element(:b_value) { |b| b.frm.text_field(:id=>"itemForm:mcchoices:1:partialCredit") }
485
+ element(:c_value) { |b| b.frm.text_field(:id=>"itemForm:mcchoices:2:partialCredit") }
486
+ element(:d_value) { |b| b.frm.text_field(:id=>"itemForm:mcchoices:3:partialCredit") }
487
+
488
+ action(:reset_score_values) { |b| b.frm.link(:text=>"Reset Score Values").click }
489
+
490
+ # Checkboxes that appear when "multiple correct" is selected
491
+ element(:check_a_correct) { |b| b.frm.checkbox(:name=>"itemForm:mcchoices:0:mccheckboxes") }
492
+ element(:check_b_correct) { |b| b.frm.checkbox(:name=>"itemForm:mcchoices:1:mccheckboxes") }
493
+ element(:check_c_correct) { |b| b.frm.checkbox(:name=>"itemForm:mcchoices:2:mccheckboxes") }
494
+ element(:check_d_correct) { |b| b.frm.checkbox(:name=>"itemForm:mcchoices:3:mccheckboxes") }
495
+
496
+ element(:insert_additional_answers) { |b| b.frm.select(:id=>"itemForm:insertAdditionalAnswerSelectMenu") }
497
+ element(:randomize_answers_yes) { |b| b.frm.radio(:index=>0, :name=>"itemForm:_id162") }
498
+ element(:randomize_answers_no) { |b| b.frm.radio(:index=>1, :name=>"itemForm:_id162") }
499
+ element(:require_rationale_yes) { |b| b.frm.radio(:index=>0, :name=>"itemForm:_id166") }
500
+ element(:require_rationale_no) { |b| b.frm.radio(:index=>1, :name=>"itemForm:_id166") }
501
+
502
+ end
503
+
504
+ # The page for setting up a Survey question
505
+ class Survey < AssessmentsBase
506
+
507
+ menu_bar_elements
508
+ question_page_elements
509
+
510
+ element(:yes_no) { |b| b.frm.radio(:index=>0, :name=>"itemForm:selectscale") }
511
+ element(:disagree_agree) { |b| b.frm.radio(:index=>1, :name=>"itemForm:selectscale") }
512
+ element(:disagree_undecided) { |b| b.frm.radio(:index=>2, :name=>"itemForm:selectscale") }
513
+ element(:below_above) { |b| b.frm.radio(:index=>3, :name=>"itemForm:selectscale") }
514
+ element(:strongly_agree) { |b| b.frm.radio(:index=>4, :name=>"itemForm:selectscale") }
515
+ element(:unacceptable_excellent) { |b| b.frm.radio(:index=>5, :name=>"itemForm:selectscale") }
516
+ element(:one_to_five) { |b| b.frm.radio(:index=>6, :name=>"itemForm:selectscale") }
517
+ element(:one_to_ten) { |b| b.frm.radio(:index=>7, :name=>"itemForm:selectscale") }
518
+
519
+ end
520
+
521
+ # The page for setting up a Short Answer/Essay question
522
+ class ShortAnswer < AssessmentsBase
523
+
524
+ menu_bar_elements
525
+ question_page_elements
526
+
527
+ element(:model_short_answer) { |b| b.frm.text_field(:id=>"itemForm:_id129_textinput") }
528
+
529
+ end
530
+
531
+ # The page for setting up a Fill-in-the-blank question
532
+ class FillInBlank < AssessmentsBase
533
+
534
+ menu_bar_elements
535
+ question_page_elements
536
+
537
+ element(:case_sensitive) { |b| b.frm.checkbox(:name=>"itemForm:_id76") }
538
+ element(:mutually_exclusive) { |b| b.frm.checkbox(:name=>"itemForm:_id78") }
539
+
540
+ end
541
+
542
+ # The page for setting up a numeric response question
543
+ class NumericResponse < AssessmentsBase
544
+
545
+ menu_bar_elements
546
+ question_page_elements
547
+
548
+ end
549
+
550
+ # The page for setting up a matching question
551
+ class Matching < AssessmentsBase
552
+
553
+ menu_bar_elements
554
+ question_page_elements
555
+
556
+ element(:choice) { |b| b.frm.text_field(:id=>"itemForm:_id147_textinput") }
557
+ element(:match) { |b| b.frm.text_field(:id=>"itemForm:_id151_textinput") }
558
+ action(:save_pairing) { |b| b.frm.button(:name=>"itemForm:_id164").click }
559
+
560
+ end
561
+
562
+ # The page for setting up a True/False question
563
+ class TrueFalse < AssessmentsBase
564
+
565
+ menu_bar_elements
566
+ question_page_elements
567
+
568
+ element(:negative_point_value) { |b| b.frm.text_field(:id=>"itemForm:answerdsc") }
569
+ element(:answer_true) { |b| b.frm.radio(:index=>0, :name=>"itemForm:TF") }
570
+ element(:answer_false) { |b| b.frm.radio(:index=>1, :name=>"itemForm:TF") }
571
+ element(:required_rationale_yes) { |b| b.frm.radio(:index=>0, :name=>"itemForm:rational") }
572
+ element(:required_rationale_no) { |b| b.frm.radio(:index=>1, :name=>"itemForm:rational") }
573
+
574
+ end
575
+
576
+ # The page for setting up a question that requires an audio response
577
+ class AudioRecording < AssessmentsBase
578
+
579
+ menu_bar_elements
580
+ question_page_elements
581
+
582
+ element(:time_allowed) { |b| b.frm.text_field(:id=>"itemForm:timeallowed") }
583
+ element(:number_of_attempts) { |b| b.frm.select(:id=>"itemForm:noattempts") }
584
+
585
+ end
586
+
587
+ # The page for setting up a question that requires
588
+ # attaching a file
589
+ class FileUpload < AssessmentsBase
590
+
591
+ menu_bar_elements
592
+ question_page_elements
593
+
594
+ end
595
+
596
+ # The page that appears when you are editing a type of assessment
597
+ class EditAssessmentType < AssessmentsBase
598
+
599
+
600
+ end
601
+
602
+ # The Page that appears when adding a new question pool
603
+ class AddQuestionPool < AssessmentsBase
604
+
605
+ pool_page_elements
606
+
607
+ end
608
+
609
+ # The Page that appears when editing an existing question pool
610
+ class EditQuestionPool < AssessmentsBase
611
+
612
+ pool_page_elements
613
+
614
+ # Clicks the Add Question link, then
615
+ # instantiates the SelectQuestionType class.
616
+ def add_question
617
+ frm.link(:id=>"editform:addQlink").click
618
+ SelectQuestionType.new(@browser)
619
+ end
620
+
621
+ # Clicks the Question Pools link, then
622
+ # instantiates the QuestionPoolsList class.
623
+ def question_pools
624
+ frm.link(:text=>"Question Pools").click
625
+ QuestionPoolsList.new(@browser)
626
+ end
627
+
628
+ action(:update) { |b| b.frm.button(:id=>"editform:Update").click }
629
+
630
+ end
631
+
632
+ # The page with the list of existing Question Pools
633
+ class QuestionPoolsList < AssessmentsBase
634
+
635
+ # Clicks the edit button, next is
636
+ # the EditQuestionPool page class.
637
+ # @param name [String] the name of the pool you want to edit
638
+ def edit_pool(name)
639
+ frm.span(:text=>name).fire_event("onclick")
640
+ end
641
+
642
+ # Clicks the Add New Pool link, then
643
+ # instantiates the AddQuestionPool page class.
644
+ def add_new_pool
645
+ #puts "clicking add new pool..."
646
+ #10.times {frm.link(:text=>"Add New Pool").flash}
647
+ frm.link(:text=>"Add New Pool").click
648
+ #puts "clicked..."
649
+ #frm.text_field(:id=>"questionpool:namefield").wait_until_present(200)
650
+ AddQuestionPool.new(@browser)
651
+ end
652
+
653
+ # Returns an array containing strings of the pool names listed
654
+ # on the page.
655
+ def pool_names
656
+ names= []
657
+ frm.table(:id=>"questionpool:TreeTable").rows.each do | row |
658
+ if row.span(:id=>/questionpool.+poolnametext/).exist?
659
+ names << row.span(:id=>/questionpool.+poolnametext/).text
660
+ end
661
+ end
662
+ return names
663
+ end
664
+
665
+ # Clicks "Import" and then instantiates the
666
+ # PoolImport page class.
667
+ def import
668
+ frm.link(:text=>"Import").click
669
+ PoolImport.new(@browser)
670
+ end
671
+
672
+ # Clicks the Assessments link and then
673
+ # instantiates the AssessmentsList page class.
674
+ def assessments
675
+ frm.link(:text=>"Assessments").click
676
+ AssessmentsList.new(@browser)
677
+ end
678
+
679
+ end
680
+
681
+ # The page that appears when you click to import
682
+ # a pool.
683
+ class PoolImport < AssessmentsBase
684
+
685
+ # Enters the target file into the Choose File
686
+ # file field. Including the file path separately is optional.
687
+ # @param file_name [String] the name of the file you want to choose. Can include path info, if desired.
688
+ # @param file_path [String] Optional. This is the path information for the file location.
689
+ def choose_file(file_name, file_path="")
690
+ frm.file_field(:name=>"importPoolForm:_id6.upload").set(file_path + file_name)
691
+ end
692
+
693
+ # Clicks the Import button, then
694
+ # instantiates the QuestionPoolsList
695
+ # page class.
696
+ def import
697
+ frm.button(:value=>"Import").click
698
+ QuestionPoolsList.new(@browser)
699
+ end
700
+
701
+ end
702
+
703
+ # This page appears when adding a question to a pool
704
+ class SelectQuestionType < AssessmentsBase
705
+
706
+ # Selects the specified question type from the
707
+ # drop-down list, then instantiates the appropriate
708
+ # page class, based on the question type selected.
709
+ # @param qtype [String] the text of the question type you want to select from the drop down list.
710
+ def select_question_type(qtype)
711
+ frm.select(:id=>"_id1:selType").select(qtype)
712
+ frm.button(:value=>"Save").click
713
+ end
714
+
715
+ action(:cancel) { |b| b.frm.button(:value=>"Cancel").click }
716
+
717
+ end
718
+
719
+ # Page of Assessments accessible to a student user
720
+ #
721
+ # It may be that we want to deprecate this class and simply use
722
+ # the AssessmentsList class alone.
723
+ class TakeAssessmentList < AssessmentsBase
724
+
725
+ # Returns an array containing the assessment names that appear on the page.
726
+ def available_assessments
727
+ # define this later
728
+ end
729
+
730
+ # Method to get the titles of assessments that
731
+ # the student user has submitted. The titles are
732
+ # returned in an Array object.
733
+ def submitted_assessments
734
+ table_array = @browser.frame(:index=>1).table(:id=>"selectIndexForm:reviewTable").to_a
735
+ table_array.delete_at(0)
736
+ titles = []
737
+ table_array.each { |row|
738
+ unless row[0] == ""
739
+ titles << row[0]
740
+ end
741
+ }
742
+
743
+ return titles
744
+
745
+ end
746
+
747
+ # Clicks the specified assessment
748
+ # then instantiates the BeginAssessment
749
+ # page class.
750
+ # @param name [String] the name of the assessment you want to take
751
+ def take_assessment(name)
752
+ begin
753
+ frm.link(:text=>name).click
754
+ rescue Watir::Exception::UnknownObjectException
755
+ frm.link(:text=>CGI::escapeHTML(name)).click
756
+ end
757
+ BeginAssessment.new(@browser)
758
+ end
759
+
760
+ # TODO This method is in need of improvement to make it more generalized for finding the correct test.
761
+ #
762
+ def feedback(test_name)
763
+ test_table = frm.table(:id=>"selectIndexForm:reviewTable").to_a
764
+ test_table.delete_if { |row| row[3] != "Immediate" }
765
+ index_value = test_table.index { |row| row[0] == test_name }
766
+ frm.link(:text=>"Feedback", :index=>index_value).click
767
+ # Need to add a call to a New class here, when it's written
768
+ end
769
+
770
+ end
771
+
772
+ # The student view of the overview page of an Assessment
773
+ class BeginAssessment < AssessmentsBase
774
+
775
+ # Clicks the Begin Assessment button.
776
+ def begin_assessment
777
+ frm.button(:value=>"Begin Assessment").click
778
+ end
779
+
780
+ # Clicks the Cancel button and instantiates the X Class.
781
+ def cancel
782
+ # Define this later
783
+ end
784
+
785
+ # Selects the specified radio button answer
786
+ def multiple_choice_answer(letter)
787
+ # TODO: Convert this to a hash instead of case statement
788
+ index = case(letter.upcase)
789
+ when "A" then "0"
790
+ when "B" then "1"
791
+ when "C" then "2"
792
+ when "D" then "3"
793
+ when "E" then "4"
794
+ end
795
+ frm.radio(:name=>/takeAssessmentForm.+:deliverMultipleChoice.+:_id.+:#{index}/).click
796
+ end
797
+
798
+ # Enters the answer into the specified blank number (1-based).
799
+ # @param answer [String]
800
+ def fill_in_blank_answer(answer, blank_number)
801
+ index = blank_number.to_i-1
802
+ frm.text_field(:name=>/deliverFillInTheBlank:_id.+:#{index}/).value=answer
803
+ end
804
+
805
+ # Clicks either the True or the False radio button, as specified.
806
+ def true_false_answer(answer)
807
+ answer.upcase=~/t/i ? index = 0 : index = 1
808
+ frm.radio(:name=>/deliverTrueFalse/, :index=>index).set
809
+ end
810
+
811
+ # Enters the specified string into the Rationale text box.
812
+ def true_false_rationale(text)
813
+ frm.text_field(:name=>/:deliverTrueFalse:rationale/).value=text
814
+ end
815
+
816
+ # Enters the specified text into the "Short Answer" field.
817
+ def short_answer(answer)
818
+ frm.text_field(:name=>/deliverShortAnswer/).value=answer
819
+ end
820
+
821
+ # Selects the specified matching value, at the spot specified by the number (1-based counting).
822
+ def match_answer(answer, number)
823
+ index = number.to_i-1
824
+ frm.select(:name=>/deliverMatching/, :index=>index).select(answer)
825
+ end
826
+
827
+ # Enters the specified file name in the file field. You can include the path to the file
828
+ # as an optional second parameter.
829
+ def file_answer(file_name, file_path="")
830
+ frm.file_field(:name=>/deliverFileUpload/).set(file_path + file_name)
831
+ frm.button(:value=>"Upload").click
832
+ end
833
+
834
+ # Clicks the Next button and instantiates the BeginAssessment Class.
835
+ def next
836
+ frm.button(:value=>"Next").click
837
+ BeginAssessment.new(@browser)
838
+ end
839
+
840
+ # Clicks the Submit for Grading button and instantiates the ConfirmSubmission Class.
841
+ def submit_for_grading
842
+ frm.button(:value=>"Submit for Grading").click
843
+ ConfirmSubmission.new(@browser)
844
+ end
845
+ end
846
+
847
+ # The confirmation page that appears when submitting an Assessment.
848
+ # The last step before actually submitting the the Assessment.
849
+ class ConfirmSubmission < AssessmentsBase
850
+
851
+ # Clicks the Submit for Grading button and instantiates
852
+ # the SubmissionSummary Class.
853
+ def submit_for_grading
854
+ frm.button(:value=>"Submit for Grading").click
855
+ SubmissionSummary.new(@browser)
856
+ end
857
+
858
+ value(:validation) { |b| b.frm.span(:class=>"validation").text }
859
+
860
+ end
861
+
862
+ # The summary page that appears when an Assessment has been submitted.
863
+ class SubmissionSummary < AssessmentsBase
864
+
865
+ # Clicks the Continue button and instantiates
866
+ # the TakeAssessmentList Class.
867
+ def continue
868
+ frm.button(:value=>"Continue").click
869
+ TakeAssessmentList.new(@browser)
870
+ end
871
+
872
+ value(:summary_info) { |b| b.frm.div(:class=>"tier1").text }
873
+
874
+ end