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.
- data/README.md +4 -0
- data/lib/sambal-cle/base_page.rb +20 -0
- data/lib/sambal-cle/core-ext.rb +90 -0
- data/lib/sambal-cle/data_objects/announcement.rb +82 -0
- data/lib/sambal-cle/data_objects/assessment.rb +32 -0
- data/lib/sambal-cle/data_objects/assignment.rb +205 -0
- data/lib/sambal-cle/data_objects/blog.rb +46 -0
- data/lib/sambal-cle/data_objects/blogger.rb +49 -0
- data/lib/sambal-cle/data_objects/chat_room.rb +54 -0
- data/lib/sambal-cle/data_objects/event.rb +89 -0
- data/lib/sambal-cle/data_objects/forum.rb +212 -0
- data/lib/sambal-cle/data_objects/lesson.rb +185 -0
- data/lib/sambal-cle/data_objects/message.rb +57 -0
- data/lib/sambal-cle/data_objects/poll.rb +74 -0
- data/lib/sambal-cle/data_objects/resource.rb +209 -0
- data/lib/sambal-cle/data_objects/site.rb +295 -0
- data/lib/sambal-cle/data_objects/syllabus.rb +73 -0
- data/lib/sambal-cle/data_objects/web_content_tool.rb +51 -0
- data/lib/sambal-cle/data_objects/wiki.rb +63 -0
- data/lib/sambal-cle/date_makers.rb +118 -0
- data/lib/sambal-cle/gem_ext.rb +23 -0
- data/lib/sambal-cle/page_helper.rb +22 -0
- data/lib/sambal-cle/page_maker.rb +48 -0
- data/lib/sambal-cle/page_objects/account.rb +111 -0
- data/lib/sambal-cle/page_objects/aliases.rb +43 -0
- data/lib/sambal-cle/page_objects/announcements.rb +190 -0
- data/lib/sambal-cle/page_objects/assessments.rb +874 -0
- data/lib/sambal-cle/page_objects/assignments.rb +770 -0
- data/lib/sambal-cle/page_objects/basic_lti.rb +6 -0
- data/lib/sambal-cle/page_objects/blogger.rb +205 -0
- data/lib/sambal-cle/page_objects/blogs.rb +60 -0
- data/lib/sambal-cle/page_objects/calendar.rb +330 -0
- data/lib/sambal-cle/page_objects/calendar_summary.rb +1 -0
- data/lib/sambal-cle/page_objects/chat_room.rb +22 -0
- data/lib/sambal-cle/page_objects/drop_box.rb +9 -0
- data/lib/sambal-cle/page_objects/email_archive.rb +22 -0
- data/lib/sambal-cle/page_objects/entity_picker.rb +62 -0
- data/lib/sambal-cle/page_objects/evaluations.rb +158 -0
- data/lib/sambal-cle/page_objects/feedback.rb +36 -0
- data/lib/sambal-cle/page_objects/forms.rb +120 -0
- data/lib/sambal-cle/page_objects/forums.rb +254 -0
- data/lib/sambal-cle/page_objects/glossary.rb +117 -0
- data/lib/sambal-cle/page_objects/gradebook.rb +29 -0
- data/lib/sambal-cle/page_objects/gradebook2.rb +17 -0
- data/lib/sambal-cle/page_objects/home.rb +36 -0
- data/lib/sambal-cle/page_objects/jforums.rb +444 -0
- data/lib/sambal-cle/page_objects/job_scheduler.rb +121 -0
- data/lib/sambal-cle/page_objects/lessons.rb +361 -0
- data/lib/sambal-cle/page_objects/login.rb +28 -0
- data/lib/sambal-cle/page_objects/matrix.rb +241 -0
- data/lib/sambal-cle/page_objects/media_gallery.rb +13 -0
- data/lib/sambal-cle/page_objects/messages.rb +622 -0
- data/lib/sambal-cle/page_objects/my_workspace.rb +44 -0
- data/lib/sambal-cle/page_objects/news.rb +8 -0
- data/lib/sambal-cle/page_objects/podcasts.rb +27 -0
- data/lib/sambal-cle/page_objects/polls.rb +69 -0
- data/lib/sambal-cle/page_objects/portfolio_templates.rb +161 -0
- data/lib/sambal-cle/page_objects/portfolios.rb +162 -0
- data/lib/sambal-cle/page_objects/post_em.rb +1 -0
- data/lib/sambal-cle/page_objects/profile.rb +51 -0
- data/lib/sambal-cle/page_objects/profile2.rb +344 -0
- data/lib/sambal-cle/page_objects/public_search.rb +61 -0
- data/lib/sambal-cle/page_objects/realms.rb +19 -0
- data/lib/sambal-cle/page_objects/resources.rb +326 -0
- data/lib/sambal-cle/page_objects/resources_roster.rb +0 -0
- data/lib/sambal-cle/page_objects/rosters.rb +70 -0
- data/lib/sambal-cle/page_objects/rwiki.rb +34 -0
- data/lib/sambal-cle/page_objects/search.rb +34 -0
- data/lib/sambal-cle/page_objects/sections.rb +295 -0
- data/lib/sambal-cle/page_objects/single_user.rb +1 -0
- data/lib/sambal-cle/page_objects/site_setup.rb +621 -0
- data/lib/sambal-cle/page_objects/site_statistics.rb +1 -0
- data/lib/sambal-cle/page_objects/sites.rb +255 -0
- data/lib/sambal-cle/page_objects/styles.rb +74 -0
- data/lib/sambal-cle/page_objects/syllabus.rb +166 -0
- data/lib/sambal-cle/page_objects/user_membership.rb +57 -0
- data/lib/sambal-cle/page_objects/users.rb +88 -0
- data/lib/sambal-cle/randomizers.rb +117 -0
- data/lib/sambal-cle/rich_text.rb +38 -0
- data/lib/sambal-cle/utilities.rb +31 -0
- data/lib/sambal-cle/workflows.rb +223 -0
- data/lib/sambal-cle.rb +31 -0
- data/sambal-cle.gemspec +14 -0
- data/test/add_assignment_to_calendar_spec.rb +86 -0
- data/test/assignment_announcements_spec.rb +71 -0
- data/test/assignment_gradebook_spec.rb +98 -0
- data/test/config.yml.template +4 -0
- data/test/directory.yml.template +123 -0
- data/test/duplicate_site_spec.rb +244 -0
- 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
|