sambal-cle 0.1.3
Sign up to get free protection for your applications and to get access to all the features.
- 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,205 @@
|
|
1
|
+
#================
|
2
|
+
# Blogger Pages
|
3
|
+
#================
|
4
|
+
|
5
|
+
# The top page of a Site's Blogger feature.
|
6
|
+
class Blogger < BasePage
|
7
|
+
|
8
|
+
frame_element
|
9
|
+
|
10
|
+
# Clicks the View All button, then reinstantiates the Class.
|
11
|
+
def view_all
|
12
|
+
frm.link(:text=>"View all").click
|
13
|
+
Blogger.new(@browser)
|
14
|
+
end
|
15
|
+
|
16
|
+
# Clicks the View Members Blog link, then instantiates the
|
17
|
+
# ViewMembersBlog Class.
|
18
|
+
def view_members_blog
|
19
|
+
frm.link(:text=>"View member's blog").click
|
20
|
+
ViewMembersBlog.new(@browser)
|
21
|
+
end
|
22
|
+
|
23
|
+
# Returns true if the specified post title exists in the list. Otherwise returns false.
|
24
|
+
def post_private?(post_title)
|
25
|
+
frm.table(:class=>"tableHeader").row(:text=>/#{Regexp.escape(post_title)}/).image(:alt=>"p").exist?
|
26
|
+
end
|
27
|
+
|
28
|
+
# Clicks the Create New Post link and instantiates the CreateBloggerPost Class.
|
29
|
+
def create_new_post
|
30
|
+
frm.link(:text=>"Create new post").click
|
31
|
+
CreateBloggerPost.new(@browser)
|
32
|
+
end
|
33
|
+
# Clicks on the specified post title, then instantiates
|
34
|
+
# the ViewBloggerPost Class.
|
35
|
+
def open_post(post_title)
|
36
|
+
frm.link(:text=>post_title).click
|
37
|
+
ViewBloggerPost.new(@browser)
|
38
|
+
end
|
39
|
+
|
40
|
+
# Returns an array containing the displayed post titles (as string objects).
|
41
|
+
def post_titles
|
42
|
+
titles = []
|
43
|
+
if frm.table(:class=>"tableHeader").exist?
|
44
|
+
table = frm.table(:class=>"tableHeader")
|
45
|
+
table.rows.each do |row|
|
46
|
+
if row.link(:class=>"aTitleHeader").exist?
|
47
|
+
titles << row.link(:class=>"aTitleHeader").text
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
return titles
|
52
|
+
end
|
53
|
+
|
54
|
+
element(:search_field) { |b| b.frm.text_field(:id=>"_id1:idSearch") }
|
55
|
+
element(:show_comments) { |b| b.frm.checkbox(:id=>"_id1:showComments") }
|
56
|
+
element(:show_full_content) { |b| b.frm.checkbox(:id=>"_id1:showFullContent") }
|
57
|
+
|
58
|
+
end
|
59
|
+
|
60
|
+
# The page showing contents of a user's Blog.
|
61
|
+
class ViewMembersBlog < BasePage
|
62
|
+
|
63
|
+
frame_element
|
64
|
+
|
65
|
+
# Clicks on the member name specified.
|
66
|
+
# The name string obviously needs to match the
|
67
|
+
# text of the link exactly.
|
68
|
+
def member(name)
|
69
|
+
frm.link(:text=>name).click
|
70
|
+
Blogger.new(@browser)
|
71
|
+
end
|
72
|
+
|
73
|
+
end
|
74
|
+
|
75
|
+
# The page where users create a Post for their Blogger blog.
|
76
|
+
class CreateBloggerPost < BasePage
|
77
|
+
|
78
|
+
frame_element
|
79
|
+
|
80
|
+
# Enters the specified string into the FCKEditor for the Abstract.
|
81
|
+
def abstract=(text)
|
82
|
+
frm.frame(:id, "PostForm:shortTextBox_inputRichText___Frame").td(:id, "xEditingArea").frame(:index=>0).send_keys(text)
|
83
|
+
end
|
84
|
+
|
85
|
+
# Enters the specified string into the FCKEditor for the Text of the Blog.
|
86
|
+
def text=(text)
|
87
|
+
frm().frame(:id, "PostForm:tab0:main_text_inputRichText___Frame").td(:id, "xEditingArea").frame(:index=>0).send_keys(text)
|
88
|
+
end
|
89
|
+
|
90
|
+
# Clicks the Add to document button in the text
|
91
|
+
# tab.
|
92
|
+
def add_text_to_document
|
93
|
+
frm.div(:id=>"PostForm:tab0").button(:value=>"Add to document").click
|
94
|
+
end
|
95
|
+
|
96
|
+
# Clicks the Add to Document button on the Image tab.
|
97
|
+
#
|
98
|
+
# This method will fail if the image tab is not the currently selected tab.
|
99
|
+
def add_image_to_document
|
100
|
+
frm.div(:id=>"PostForm:tab1").button(:value=>"Add to document").click
|
101
|
+
end
|
102
|
+
|
103
|
+
# Clicks the Add to Document button on the Link tab.
|
104
|
+
#
|
105
|
+
# This method will fail if the Link tab is not the currently selected tab.
|
106
|
+
def add_link_to_document
|
107
|
+
frm.div(:id=>"PostForm:tab2").button(:value=>"Add to document").click
|
108
|
+
end
|
109
|
+
|
110
|
+
# Clicks the Add to Document button on the File tab.
|
111
|
+
#
|
112
|
+
# This method will fail if the File tab is not the currently selected tab.
|
113
|
+
def add_file_to_document
|
114
|
+
frm.div(:id=>"PostForm:tab3").button(:value=>"Add to document").click
|
115
|
+
end
|
116
|
+
|
117
|
+
# Enters the specified filename in the file field for images.
|
118
|
+
#
|
119
|
+
# The file path can be entered as an optional second parameter.
|
120
|
+
def image_file(filename, filepath="")
|
121
|
+
frm.file_field(:name=>"PostForm:tab1:_id29").set(filepath + filename)
|
122
|
+
end
|
123
|
+
|
124
|
+
# Enters the specified directory/filename in the file field.
|
125
|
+
def file_field(filename, filepath="")
|
126
|
+
frm().file_field(:name=>"PostForm:tab3:_id51").set(filepath + filename)
|
127
|
+
end
|
128
|
+
|
129
|
+
# Clicks the Preview button and instantiates the PreviewBloggerPost Class.
|
130
|
+
def preview
|
131
|
+
frm().button(:value=>"Preview").click
|
132
|
+
PreviewBloggerPost.new(@browser)
|
133
|
+
end
|
134
|
+
|
135
|
+
# Clicks the Save button and instantiates the Blogger Class.
|
136
|
+
def save
|
137
|
+
frm.button(:value=>"Save").click
|
138
|
+
Blogger.new(@browser)
|
139
|
+
end
|
140
|
+
|
141
|
+
element(:title) { |b| b.frm.text_field(:id=>"PostForm:idTitle") }
|
142
|
+
element(:keywords) { |b| b.frm.text_field(:id=>"PostForm:keyWords") }
|
143
|
+
element(:access) { |b| b.frm.select(:id=>"PostForm:selectVisibility") }
|
144
|
+
element(:read_only) { |b| b.frm.checkbox(:id=>"PostForm:readOnlyCheckBox") }
|
145
|
+
element(:allow_comments) { |b| b.frm.checkbox(:id=>"PostForm:allowCommentsCheckBox") }
|
146
|
+
action(:text) { |b| b.frm.button(:value=>"Text").click }
|
147
|
+
action(:images) { |b| b.frm.button(:value=>"Images").click }
|
148
|
+
action(:links) { |b| b.frm.button(:value=>"Links").click }
|
149
|
+
element(:description) { |b| b.frm.text_field(:id=>"PostForm:tab2:idLinkDescription") }
|
150
|
+
element(:url) { |b| b.frm.text_field(:id=>"PostForm:tab2:idLinkExpression") }
|
151
|
+
action(:files) { |b| b.frm.button(:value=>"Files").click }
|
152
|
+
|
153
|
+
end
|
154
|
+
|
155
|
+
# The Preview page for a Blog post.
|
156
|
+
class PreviewBloggerPost < BasePage
|
157
|
+
|
158
|
+
frame_element
|
159
|
+
|
160
|
+
# Clicks the Back button and instantiates the CreateBloggerPost Class.
|
161
|
+
def back
|
162
|
+
frm().button(:value=>"Back").click
|
163
|
+
CreateBloggerPost.new(@browser)
|
164
|
+
end
|
165
|
+
|
166
|
+
# Clicks the Save button and instantiates the CreateBloggerPost Class.
|
167
|
+
def save
|
168
|
+
frm.button(:value=>"Save").click
|
169
|
+
CreateBloggerPost.new(@browser)
|
170
|
+
end
|
171
|
+
|
172
|
+
end
|
173
|
+
|
174
|
+
# The page for Viewing a blog post.
|
175
|
+
class ViewBloggerPost < BasePage
|
176
|
+
|
177
|
+
frame_element
|
178
|
+
|
179
|
+
# Clicks the button for adding a comment to a blog post, then
|
180
|
+
# instantiates the AddBloggerComment Class.
|
181
|
+
def add_comment
|
182
|
+
frm.button(:value=>"Add comment").click
|
183
|
+
AddBloggerComment.new(@browser)
|
184
|
+
end
|
185
|
+
|
186
|
+
end
|
187
|
+
|
188
|
+
# The page for adding a comment to a Blog post.
|
189
|
+
class AddBloggerComment < BasePage
|
190
|
+
|
191
|
+
frame_element
|
192
|
+
|
193
|
+
# Clicks the Save button and instantiates
|
194
|
+
# The ViewBloggerPost Class.
|
195
|
+
def save
|
196
|
+
frm.button(:value=>"Save").click
|
197
|
+
ViewBloggerPost.new(@browser)
|
198
|
+
end
|
199
|
+
|
200
|
+
# Enters the specified string into the FCKEditor box for the Comment.
|
201
|
+
def your_comment=(text)
|
202
|
+
frm.frame(:id, "_id1:_id11_inputRichText___Frame").td(:id, "xEditingArea").frame(:index=>0).send_keys(text)
|
203
|
+
end
|
204
|
+
|
205
|
+
end
|
@@ -0,0 +1,60 @@
|
|
1
|
+
class BlogsBase < BasePage
|
2
|
+
|
3
|
+
frame_element
|
4
|
+
|
5
|
+
class << self
|
6
|
+
def menu_elements
|
7
|
+
# AddBlogEntry
|
8
|
+
action(:add_blog_entry) { |b| b.frm.link(:text=>"Add blog entry").click }
|
9
|
+
end
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
class Blogs < BlogsBase
|
14
|
+
|
15
|
+
menu_elements
|
16
|
+
|
17
|
+
# Returns an array containing the list of Bloggers
|
18
|
+
# in the "All the blogs" table.
|
19
|
+
def blogger_list
|
20
|
+
bloggers = []
|
21
|
+
frm.table(:class=>"listHier lines").rows.each do |row|
|
22
|
+
bloggers << row[1].text
|
23
|
+
end
|
24
|
+
bloggers.delete_at(0)
|
25
|
+
return bloggers
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
class AddBlogEntry < BlogsBase
|
30
|
+
|
31
|
+
menu_elements
|
32
|
+
|
33
|
+
include FCKEditor
|
34
|
+
|
35
|
+
expected_element :editor
|
36
|
+
|
37
|
+
element(:editor) { |b| b.frm.frame(:id, "blog-text-input:1:input___Frame") }
|
38
|
+
|
39
|
+
def blog_text=(text)
|
40
|
+
editor.td(:id, "xEditingArea").frame(:index=>0).wait_until_present
|
41
|
+
editor.td(:id, "xEditingArea").frame(:index=>0).send_keys(text)
|
42
|
+
end
|
43
|
+
|
44
|
+
# BlogsList
|
45
|
+
action(:publish_entry) { |b| b.frm.button(:value=>"Publish entry").click }
|
46
|
+
# BlogsList
|
47
|
+
action(:save_draft){ |b| b.frm.button(:value=>"Save Draft").click }
|
48
|
+
|
49
|
+
element(:title) { |b| b.frm.text_field(:name=>"title-input") }
|
50
|
+
element(:only_site_admins) { |b| b.frm.radio(:id=>"instructors-only-radio") }
|
51
|
+
element(:all_members) { |b| b.frm.radio(:id=>"all-members-radio") }
|
52
|
+
element(:publicly_viewable) { |b| b.frm.radio(:id=>"public-viewable-radio") }
|
53
|
+
|
54
|
+
end
|
55
|
+
|
56
|
+
class BlogsList < BlogsBase
|
57
|
+
|
58
|
+
menu_elements
|
59
|
+
|
60
|
+
end
|
@@ -0,0 +1,330 @@
|
|
1
|
+
class CalendarBase < BasePage
|
2
|
+
|
3
|
+
frame_element
|
4
|
+
basic_page_elements
|
5
|
+
|
6
|
+
class << self
|
7
|
+
def menu_elements
|
8
|
+
# AddEditEvent
|
9
|
+
action(:add_event) { |b| b.frm.link(:text=>"Add").click }
|
10
|
+
|
11
|
+
# AddEditFields
|
12
|
+
action(:fields) { |b| b.frm.link(:text=>"Fields").click }
|
13
|
+
|
14
|
+
# ImportStepOne
|
15
|
+
action(:import) { |b| b.frm.link(:text=>"Import").click }
|
16
|
+
|
17
|
+
#TODO: Finish adding menu buttons here
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
end
|
22
|
+
|
23
|
+
# Top page of the Calendar
|
24
|
+
# For now it includes all views, though that probably
|
25
|
+
# means it will have to be re-instantiated every time
|
26
|
+
# a new view is selected.
|
27
|
+
class Calendar < CalendarBase
|
28
|
+
|
29
|
+
menu_elements
|
30
|
+
|
31
|
+
# Selects the specified item in the View select list.
|
32
|
+
element(:view) { |b| b.frm.select(:id=>"view") }
|
33
|
+
|
34
|
+
# Selects the specified item in the Show select list.
|
35
|
+
element(:show) { |b| b.frm.select(:id=>"timeFilterOption") }
|
36
|
+
alias :show_events :show
|
37
|
+
|
38
|
+
# Clicks the link to the specified event, then
|
39
|
+
# instantiates the EventDetail class.
|
40
|
+
def open_event(title)
|
41
|
+
truncated = title[0..5]
|
42
|
+
frm.link(:text=>/#{Regexp.escape(truncated)}/).click
|
43
|
+
end
|
44
|
+
|
45
|
+
# Returns the href value of the target link
|
46
|
+
# use for validation when you are testing whether the link
|
47
|
+
# will appear again on another screen, since often times
|
48
|
+
# validation by title text alone will not work.
|
49
|
+
def event_href(title)
|
50
|
+
truncated = title[0..5]
|
51
|
+
frm.link(:text=>/#{Regexp.escape(truncated)}/).href
|
52
|
+
end
|
53
|
+
|
54
|
+
# Selects the specified value in the start month select list.
|
55
|
+
element(:start_month) { |b| b.frm.select(:id=>"customStartMonth") }
|
56
|
+
|
57
|
+
# Selects the specified value in the start day select list.
|
58
|
+
element(:start_day) { |b| b.frm.select(:id=>"customStartDay") }
|
59
|
+
|
60
|
+
# Selects the specified value in the start year select list.
|
61
|
+
element(:start_year) { |b| b.frm.select(:id=>"customStartYear") }
|
62
|
+
|
63
|
+
# Selects the specified value in the end month select list.
|
64
|
+
element(:end_month) { |b| b.frm.select(:id=>"customEndMonth") }
|
65
|
+
|
66
|
+
# Selects the specified value in the End Day select list.
|
67
|
+
element(:end_day) { |b| b.frm.select(:id=>"customEndDay") }
|
68
|
+
|
69
|
+
# Selects the specified value in the End Year select list.
|
70
|
+
element(:end_year) { |b| b.frm.select(:id=>"customEndYear") }
|
71
|
+
|
72
|
+
# Clicks the Filter Events button, then re-instantiates
|
73
|
+
# the Calendar class to avoid the possibility of an
|
74
|
+
# ObsoleteElement error.
|
75
|
+
action(:filter_events) { |b| b.frm.button(:name=>"eventSubmit_doCustomdate").click }
|
76
|
+
|
77
|
+
# Clicks the Go to Today button, then reinstantiates
|
78
|
+
# the Calendar class.
|
79
|
+
action(:go_to_today) { |b| b.frm.button(:value=>"Go to Today").click }
|
80
|
+
|
81
|
+
# Returns an array for the listed events.
|
82
|
+
# This array contains more than simply strings of the event titles, because
|
83
|
+
# often the titles are truncated to fit on the screen. In addition, getting the "title"
|
84
|
+
# tag of the link is often problematic because titles can contain double-quotes, which
|
85
|
+
# will mess up the HTML of the anchor tag (there is probably an XSS vulnerability to
|
86
|
+
# exploit, there. This should be extensively tested.).
|
87
|
+
#
|
88
|
+
# Because of these issues, the array contains the title tag, the anchor text, and
|
89
|
+
# the entire href string for every event listed on the page. Having all three items
|
90
|
+
# available should ensure that verification steps don't give false results--especially
|
91
|
+
# when you are doing a negative test (checking that an event is NOT present).
|
92
|
+
def events_list
|
93
|
+
list = {}
|
94
|
+
if frm.table(:class=>"calendar").exist?
|
95
|
+
events_table = frm.table(:class=>"calendar")
|
96
|
+
else
|
97
|
+
events_table = frm.table(:class=>"listHier lines nolines")
|
98
|
+
end
|
99
|
+
events_table.links.each do |link|
|
100
|
+
list.store(link.title, {:text=>link.text,
|
101
|
+
:href=>link.href,
|
102
|
+
:html=>link.html[/(?<="location=").+doDescription/] }
|
103
|
+
)
|
104
|
+
end
|
105
|
+
list
|
106
|
+
end
|
107
|
+
alias event_list events_list
|
108
|
+
alias events event_list
|
109
|
+
|
110
|
+
# Clicks the "Previous X" button, where X might be Day, Week, or Month,
|
111
|
+
# then reinstantiates the Calendar class to ensure against any obsolete element
|
112
|
+
# errors.
|
113
|
+
action(:previous) { |b| b.frm.button(:name=>"eventSubmit_doPrev").click }
|
114
|
+
|
115
|
+
# Clicks the "Next X" button, where X might be Day, Week, or Month,
|
116
|
+
# then reinstantiates the Calendar class to ensure against any obsolete element
|
117
|
+
# errors.
|
118
|
+
action(:next) { |b| b.frm.button(:name=>"eventSubmit_doNext").click }
|
119
|
+
|
120
|
+
# Clicks the "Today" button and reinstantiates the class.
|
121
|
+
action(:today) { |b| b.frm.button(:value=>"Today").click }
|
122
|
+
|
123
|
+
action(:earlier) { |b| b.frm.link(:text=>"Earlier").click }
|
124
|
+
|
125
|
+
action(:later) { |b| b.frm.link(:text=>"Later").click }
|
126
|
+
|
127
|
+
# Clicks the "Set as Default View" button
|
128
|
+
action(:set_as_default_view) { |b| b.frm.link(:text=>"Set as Default View").click }
|
129
|
+
|
130
|
+
end
|
131
|
+
|
132
|
+
# The page that appears when you click on an event in the Calendar
|
133
|
+
class EventDetail < CalendarBase
|
134
|
+
|
135
|
+
menu_elements
|
136
|
+
# Clicks the Go to Today button, then instantiates
|
137
|
+
# the Calendar class.
|
138
|
+
action(:go_to_today) { |b| b.frm.button(:value=>"Go to Today").click }
|
139
|
+
|
140
|
+
action(:back_to_calendar) { |b| b.frm.button(:value=>"Back to Calendar").click }
|
141
|
+
|
142
|
+
action(:last_event) { |b| b.frm().button(:value=>"< Last Event").click }
|
143
|
+
|
144
|
+
action(:next_event) { |b| b.frm().button(:value=>"Next Event >").click }
|
145
|
+
|
146
|
+
value(:event_title) { |b| b.frm.div(:class=>"portletBody").h3.text }
|
147
|
+
|
148
|
+
action(:edit) { |b| b.frm.button(:value=>"Edit").click }
|
149
|
+
|
150
|
+
action(:remove_event) { |b| b.frm.button(:value=>"Remove event").click }
|
151
|
+
|
152
|
+
# Returns a hash object containing the contents of the event details
|
153
|
+
# table on the page, with each of the header column items as a Key
|
154
|
+
# and the associated data column as the corresponding Value.
|
155
|
+
def details
|
156
|
+
details = {}
|
157
|
+
frm.table(:class=>"itemSummary").rows.each do |row|
|
158
|
+
details.store(row.th.text, row.td.text)
|
159
|
+
end
|
160
|
+
details
|
161
|
+
end
|
162
|
+
|
163
|
+
value(:message_html) { |b| b.frm.th(text: "Description").parent.td.html }
|
164
|
+
|
165
|
+
end
|
166
|
+
|
167
|
+
#
|
168
|
+
class AddEditEvent < CalendarBase
|
169
|
+
|
170
|
+
include FCKEditor
|
171
|
+
|
172
|
+
menu_elements
|
173
|
+
|
174
|
+
expected_element :editor
|
175
|
+
|
176
|
+
# Calendar class
|
177
|
+
action(:save_event) { |b| b.frm.button(:value=>"Save Event").click }
|
178
|
+
|
179
|
+
def message=(text)
|
180
|
+
editor.td(:id, "xEditingArea").frame(:index=>0).send_keys(text)
|
181
|
+
end
|
182
|
+
|
183
|
+
# The FCKEditor object. Use this method to set up a "wait_until_present"
|
184
|
+
# step, since sometimes it takes a long time for this object to load.
|
185
|
+
element(:editor) { |b| b.frm.frame(:id, "description___Frame") }
|
186
|
+
|
187
|
+
action(:frequency) { |b| b.frm.button(:name=>"eventSubmit_doEditfrequency").click }
|
188
|
+
|
189
|
+
action(:add_attachments) { |b| b.frm.button(:value=>"Add Attachments").click }
|
190
|
+
|
191
|
+
action(:add_remove_attachments) { |b| b.frm.button(:value=>"Add/remove attachments").click }
|
192
|
+
|
193
|
+
# Returns true if the page has a link with the
|
194
|
+
# specified file name. Use for test case asserts.
|
195
|
+
def attachment?(file_name)
|
196
|
+
frm.link(:text=>file_name).exist?
|
197
|
+
end
|
198
|
+
|
199
|
+
# Use this method to enter text into custom fields
|
200
|
+
# on the page. The "field" variable is the name of the
|
201
|
+
# field, while the "text" is the string you want to put into
|
202
|
+
# it.
|
203
|
+
def custom_field_text(field, text)
|
204
|
+
frm.text_field(:name=>field).set(text)
|
205
|
+
end
|
206
|
+
|
207
|
+
element(:title) { |b| b.frm.text_field(:id=>"activitytitle") }
|
208
|
+
element(:month) { |b| b.frm.select(:id=>"month") }
|
209
|
+
element(:day) { |b| b.frm.select(:id=>"day") }
|
210
|
+
element(:year) { |b| b.frm.select(:id=>"yearSelect") }
|
211
|
+
element(:start_hour) { |b| b.frm.select(:id=>"startHour") }
|
212
|
+
element(:start_minute) { |b| b.frm.select(:id=>"startMinute") }
|
213
|
+
element(:start_meridian) { |b| b.frm.select(:id=>"startAmpm") }
|
214
|
+
element(:hours) { |b| b.frm.select(:id=>"duHour") }
|
215
|
+
element(:minutes) { |b| b.frm.select(:id=>"duMinute") }
|
216
|
+
element(:end_hour) { |b| b.frm.select(:id=>"endHour") }
|
217
|
+
element(:end_minute) { |b| b.frm.select(:id=>"endMinute") }
|
218
|
+
element(:end_meridian) { |b| b.frm.select(:id=>"endAmpm") }
|
219
|
+
element(:display_to_site) { |b| b.frm.radio(:id=>"site") }
|
220
|
+
element(:event_type) { |b| b.frm.select(:id=>"eventType") }
|
221
|
+
element(:location) { |b| b.frm.text_field(:name=>"location") }
|
222
|
+
|
223
|
+
end
|
224
|
+
|
225
|
+
# The page that appears when the Frequency button is clicked on the Add/Edit
|
226
|
+
# Event page.
|
227
|
+
class EventFrequency < CalendarBase
|
228
|
+
|
229
|
+
action(:save_frequency) { |b| b.frm.button(:value=>"Save Frequency").click }
|
230
|
+
|
231
|
+
action(:cancel) { |b| b.frm.button(:value=>"Cancel").click }
|
232
|
+
|
233
|
+
element(:event_frequency) { |b| b.frm.select(:id=>"frequencySelect") }
|
234
|
+
element(:interval) { |b| b.frm.select(:id=>"interval") }
|
235
|
+
element(:ends_after) { |b| b.frm.select(:name=>"count") }
|
236
|
+
element(:ends_month) { |b| b.frm.select(:id=>"endMonth") }
|
237
|
+
element(:ends_day) { |b| b.frm.select(:id=>"endDay") }
|
238
|
+
element(:ends_year) { |b| b.frm.select(:id=>"endYear") }
|
239
|
+
element(:after) { |b| b.frm.radio(:id=>"count") }
|
240
|
+
element(:on) { |b| b.frm.radio(:id=>"till") }
|
241
|
+
element(:never) { |b| b.frm.radio(:id=>"never") }
|
242
|
+
|
243
|
+
end
|
244
|
+
|
245
|
+
class AddEditFields < CalendarBase
|
246
|
+
|
247
|
+
# Clicks the Save Field Changes buton and instantiates
|
248
|
+
# The Calendar or EventDetail class--unless the Alert Message box appears,
|
249
|
+
# in which case it re-instantiates the class.
|
250
|
+
action(:save_field_changes) { |b| b.frm.button(:value=>"Save Field Changes").click }
|
251
|
+
|
252
|
+
action(:create_field) { |b| b.frm.button(:value=>"Create Field").click }
|
253
|
+
|
254
|
+
# Checks the checkbox for the specified field
|
255
|
+
def check_remove(field_name)
|
256
|
+
frm.table(:class=>/listHier lines/).row(:text=>/#{Regexp.escape(field_name)}/).checkbox.set
|
257
|
+
end
|
258
|
+
|
259
|
+
element(:field_name) { |b| b.frm.text_field(:id=>"textfield") }
|
260
|
+
|
261
|
+
end
|
262
|
+
|
263
|
+
class ImportStepOne < BasePage
|
264
|
+
|
265
|
+
frame_element
|
266
|
+
|
267
|
+
action(:continue) { |b| b.frm.button(:value=>"Continue").click }
|
268
|
+
element(:microsoft_outlook) { |b| b.frm.radio(:id=>"importType_Outlook") }
|
269
|
+
element(:meeting_maker) { |b| b.frm.radio(:id=>"importType_MeetingMaker") }
|
270
|
+
element(:generic_calendar_import) { |b| b.frm.radio(:id=>"importType_Generic") }
|
271
|
+
|
272
|
+
end
|
273
|
+
|
274
|
+
class ImportStepTwo < BasePage
|
275
|
+
|
276
|
+
frame_element
|
277
|
+
|
278
|
+
# Goes to ImportStepThree
|
279
|
+
action(:continue) { |b| b.frm.button(:value=>"Continue").click }
|
280
|
+
|
281
|
+
# Enters the specified filename in the file field.
|
282
|
+
#
|
283
|
+
# Note that the file path is an optional second parameter, if you do not want to
|
284
|
+
# include the full path in the filename.
|
285
|
+
def import_file(filename, filepath="")
|
286
|
+
frm.file_field(:name=>"importFile").set(filepath + filename)
|
287
|
+
end
|
288
|
+
|
289
|
+
end
|
290
|
+
|
291
|
+
class ImportStepThree < BasePage
|
292
|
+
|
293
|
+
frame_element
|
294
|
+
|
295
|
+
expected_element :import_events_for_site
|
296
|
+
|
297
|
+
# Goes to Calendar
|
298
|
+
action(:import_events) { |b| b.frm.button(:value=>"Import Events").click }
|
299
|
+
|
300
|
+
# Returns an array containing the list of Activity names on the page.
|
301
|
+
def events
|
302
|
+
list = []
|
303
|
+
frm.table(:class=>/listHier lines/).rows.each do |row|
|
304
|
+
if row.label(:for=>/eventSelected/).exist?
|
305
|
+
list << row.label.text
|
306
|
+
end
|
307
|
+
end
|
308
|
+
names = []
|
309
|
+
list.uniq!
|
310
|
+
list.each do | item |
|
311
|
+
name = item[/(?<=\s).+(?=\s\s\()/]
|
312
|
+
names << name
|
313
|
+
end
|
314
|
+
names
|
315
|
+
end
|
316
|
+
|
317
|
+
# Returns the date of the specified event
|
318
|
+
def event_date(event_name)
|
319
|
+
frm.table(:class=>/listHier lines/).row(:text=>/#{Regexp.escape(event_name)}/)[0].text
|
320
|
+
end
|
321
|
+
|
322
|
+
# Unchecks the checkbox for the specified event
|
323
|
+
def uncheck_event(event_name)
|
324
|
+
frm.table(:class=>/listHier lines/).row(:text=>/#{Regexp.escape(event_name)}/)
|
325
|
+
end
|
326
|
+
|
327
|
+
element(:import_events_for_site) { |b| b.frm.radio(:id=>"site") }
|
328
|
+
element(:import_events_for_selected_groups) { |b| b.frm.radio(:id=>"groups") }
|
329
|
+
|
330
|
+
end
|
@@ -0,0 +1 @@
|
|
1
|
+
# Work needs to be done here. :-)
|
@@ -0,0 +1,22 @@
|
|
1
|
+
#================
|
2
|
+
# Chat Room Pages
|
3
|
+
#================
|
4
|
+
|
5
|
+
#
|
6
|
+
class ChatRoom < BasePage
|
7
|
+
|
8
|
+
frame_element
|
9
|
+
|
10
|
+
value(:total_messages_shown) { |b| b.frame(:class=>"wcwmenu").div(:id=>"chat2_messages_shown_total").text }
|
11
|
+
|
12
|
+
action(:options) { |b| b.frm.link(text: "Options").click }
|
13
|
+
|
14
|
+
end
|
15
|
+
|
16
|
+
class ManageRooms < BasePage
|
17
|
+
|
18
|
+
frame_element
|
19
|
+
|
20
|
+
action(:add_room) { |b| b.frm.link(text: "Add Room").click }
|
21
|
+
|
22
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
#
|
2
|
+
class EmailArchive < BasePage
|
3
|
+
|
4
|
+
frame_element
|
5
|
+
|
6
|
+
# EmailArchiveOptions
|
7
|
+
action(:options){ |b| b.frm.link(:text=>"Options").click }
|
8
|
+
|
9
|
+
# Returns an array containing the
|
10
|
+
def email_list
|
11
|
+
end
|
12
|
+
|
13
|
+
element(:search_field) { |b| b.frm.text_field(:id=>"search") }
|
14
|
+
action(:search_button) { |b| b.frm.button(:value=>"Search").click }
|
15
|
+
|
16
|
+
end
|
17
|
+
|
18
|
+
class EmailArchiveOptions < BasePage
|
19
|
+
|
20
|
+
frame_element
|
21
|
+
|
22
|
+
end
|