sakai-cle-test-api 0.0.7 → 0.0.9

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 (44) hide show
  1. data/lib/sakai-cle-test-api.rb +7 -2
  2. data/lib/sakai-cle-test-api/add_files.rb +198 -0
  3. data/lib/sakai-cle-test-api/admin_page_elements.rb +7 -3
  4. data/lib/sakai-cle-test-api/announcements.rb +274 -7
  5. data/lib/sakai-cle-test-api/assessments.rb +930 -27
  6. data/lib/sakai-cle-test-api/assignments.rb +769 -13
  7. data/lib/sakai-cle-test-api/basic_lti.rb +5 -1
  8. data/lib/sakai-cle-test-api/blogs.rb +54 -2
  9. data/lib/sakai-cle-test-api/calendar.rb +423 -8
  10. data/lib/sakai-cle-test-api/chat_room.rb +0 -0
  11. data/lib/sakai-cle-test-api/common_page_elements.rb +69 -172
  12. data/lib/sakai-cle-test-api/core-ext.rb +90 -0
  13. data/lib/sakai-cle-test-api/data_objects/announcement.rb +38 -0
  14. data/lib/sakai-cle-test-api/data_objects/assessment.rb +32 -0
  15. data/lib/sakai-cle-test-api/data_objects/assignment.rb +62 -0
  16. data/lib/sakai-cle-test-api/data_objects/event.rb +86 -0
  17. data/lib/sakai-cle-test-api/data_objects/lesson.rb +137 -0
  18. data/lib/sakai-cle-test-api/data_objects/resource.rb +174 -0
  19. data/lib/sakai-cle-test-api/data_objects/site.rb +213 -0
  20. data/lib/sakai-cle-test-api/data_objects/syllabus.rb +7 -0
  21. data/lib/sakai-cle-test-api/data_objects/topic.rb +0 -0
  22. data/lib/sakai-cle-test-api/data_objects/web_content_tool.rb +52 -0
  23. data/lib/sakai-cle-test-api/data_objects/wiki.rb +7 -0
  24. data/lib/sakai-cle-test-api/drop_box.rb +21 -0
  25. data/lib/sakai-cle-test-api/email_archive.rb +15 -1
  26. data/lib/sakai-cle-test-api/forums.rb +282 -8
  27. data/lib/sakai-cle-test-api/gem_ext.rb +45 -0
  28. data/lib/sakai-cle-test-api/gradebook.rb +19 -1
  29. data/lib/sakai-cle-test-api/gradebook2.rb +15 -1
  30. data/lib/sakai-cle-test-api/lessons.rb +440 -0
  31. data/lib/sakai-cle-test-api/messages.rb +551 -15
  32. data/lib/sakai-cle-test-api/news.rb +3 -1
  33. data/lib/sakai-cle-test-api/polls.rb +65 -3
  34. data/lib/sakai-cle-test-api/profile.rb +36 -2
  35. data/lib/sakai-cle-test-api/profile2.rb +315 -6
  36. data/lib/sakai-cle-test-api/resources.rb +138 -0
  37. data/lib/sakai-cle-test-api/rich_text.rb +13 -0
  38. data/lib/sakai-cle-test-api/sections.rb +198 -8
  39. data/lib/sakai-cle-test-api/site_page_elements.rb +4 -441
  40. data/lib/sakai-cle-test-api/syllabus.rb +149 -7
  41. data/lib/sakai-cle-test-api/tools_menu.rb +3 -20
  42. data/lib/sakai-cle-test-api/utilities.rb +260 -0
  43. data/sakai-cle-test-api.gemspec +2 -3
  44. metadata +21 -19
@@ -0,0 +1,213 @@
1
+ class SiteObject
2
+
3
+ include PageObject
4
+ include Utilities
5
+ include ToolsMenu
6
+
7
+ attr_accessor :name, :id, :subject, :course, :section, :term, :authorizer,
8
+ :web_content_source, :email, :joiner_role, :creation_date, :web_content_title,
9
+ :description, :short_description
10
+
11
+ def initialize(browser, opts={})
12
+ @browser = browser
13
+
14
+ defaults = {
15
+ :subject => random_alphanums(8),
16
+ :course => random_alphanums(8),
17
+ :section => random_alphanums(8),
18
+ :authorizer => "admin",
19
+ :web_content_title => random_alphanums(15),
20
+ :web_content_source => "http://www.rsmart.com",
21
+ :email=>random_nicelink(32),
22
+ :joiner_role => "Student",
23
+ :description => random_alphanums(30),
24
+ :short_description => random_alphanums
25
+ }
26
+ options = defaults.merge(opts)
27
+
28
+ @subject=options[:subject]
29
+ @course=options[:course]
30
+ @section=options[:section]
31
+ @authorizer=options[:authorizer]
32
+ @web_content_source=options[:web_content_source]
33
+ @email=options[:email]
34
+ @joiner_role=options[:joiner_role]
35
+ @web_content_title=options[:web_content_title]
36
+ @description=options[:description]
37
+ @short_description=options[:short_description]
38
+ end
39
+
40
+ def create
41
+ my_workspace unless @browser.title=~/My Workspace/
42
+ site_setup unless @browser.title=~/Site Setup/
43
+ on_page SiteSetup do |page|
44
+ page.new
45
+ end
46
+ site_type = SiteType.new @browser
47
+
48
+ # Select the Course Site radio button
49
+
50
+ site_type.select_course_site
51
+
52
+ # Store the selected term value for use later
53
+ @term = site_type.academic_term_element.value
54
+
55
+ # Click continue
56
+ course_section = site_type.continue
57
+
58
+ # Fill in those fields, storing the entered values for later verification steps
59
+ course_section.subject = @subject
60
+
61
+ course_section.course = @course
62
+
63
+ course_section.section = @section
64
+
65
+ # Store site name for ease of coding and readability later
66
+ @name = "#{@subject} #{@course} #{@section} #{@term}"
67
+
68
+ # Click continue button
69
+ course_section.continue
70
+
71
+ # Add a valid instructor id
72
+ course_section.authorizers_username=@authorizer
73
+
74
+ # Click continue button
75
+ course_site = course_section.continue
76
+ course_site.editor.wait_until_present
77
+ sleep 1 #FIXME
78
+ course_site.source(course_site.editor)
79
+ course_site.source=@description
80
+ course_site.short_description=@short_description
81
+
82
+ # Click Continue
83
+ course_tools = course_site.continue
84
+
85
+ #Check All Tools
86
+ course_tools.check_all_tools
87
+
88
+ course_tools.continue
89
+ add_tools = AddMultipleTools.new @browser
90
+ add_tools.site_email_address=@email
91
+ add_tools.web_content_title=@web_content_title
92
+ add_tools.web_content_source=@web_content_source
93
+
94
+ # Click the Continue button
95
+ # Note that I am calling this element directly rather than using its Class definition
96
+ # because of an inexplicable ObsoleteElementError occuring in Selenium-Webdriver
97
+ @browser.frame(:index=>0).button(:name, "Continue").click
98
+
99
+ access = SiteAccess.new(@browser)
100
+
101
+ access.select_allow
102
+ access.joiner_role=@joiner_role
103
+
104
+ review = access.continue
105
+
106
+ site_setup = review.request_site
107
+
108
+ # Create a string that will match the new Site's "creation date" string
109
+ @creation_date = make_date(Time.now)
110
+ site_setup.search_field.wait_until_present
111
+ site_setup.search(Regexp.escape(@subject))
112
+
113
+ # Get the site id for storage
114
+ @browser.frame(:class=>"portletMainIframe").link(:href=>/xsl-portal.site/, :index=>0).href =~ /(?<=\/site\/).+/
115
+ @id = $~.to_s
116
+
117
+ end
118
+
119
+ def create_and_reuse_site(site_name)
120
+ my_workspace unless @browser.title=~/My Workspace/
121
+ site_setup unless @browser.title=~/Site Setup/
122
+ on_page SiteSetup do |page|
123
+ page.new
124
+ end
125
+ site_type = SiteType.new @browser
126
+
127
+ # Select the Course Site radio button
128
+
129
+ site_type.select_course_site
130
+
131
+ # Store the selected term value for use later
132
+ @term = site_type.academic_term_element.value
133
+
134
+ # Click continue
135
+ course_section = site_type.continue
136
+
137
+ # Fill in those fields, storing the entered values for later verification steps
138
+ course_section.subject = @subject
139
+
140
+ course_section.course = @course
141
+
142
+ course_section.section = @section
143
+
144
+ # Store site name for ease of coding and readability later
145
+ @name = "#{@subject} #{@course} #{@section} #{@term}"
146
+
147
+ # Click continue button
148
+ course_section.continue
149
+
150
+ # Add a valid instructor id
151
+ course_section.authorizers_username=@authorizer
152
+
153
+ # Click continue button
154
+ course_site = course_section.continue
155
+ course_site.editor.wait_until_present
156
+ course_site.source(course_site.editor)
157
+ course_site.source=@description
158
+ course_site.short_description=@short_description
159
+ # Click Continue
160
+ course_tools = course_site.continue
161
+
162
+ #Check All Tools
163
+ course_tools.check_all_tools
164
+ course_tools.select_yes
165
+ course_tools.import_sites=site_name
166
+ course_tools.continue
167
+ on_page ReUseMaterial do |page|
168
+ page.announcements_checkbox.set
169
+ page.calendar_checkbox.set
170
+ page.discussion_forums_checkbox.set
171
+ page.forums_checkbox.set
172
+ page.chat_room_checkbox.set
173
+ page.polls_checkbox.set
174
+ page.syllabus_checkbox.set
175
+ page.lessons_checkbox.set
176
+ page.resources_checkbox.set
177
+ page.assignments_checkbox.set
178
+ page.tests_and_quizzes_checkbox.set
179
+ page.gradebook_checkbox.set
180
+ page.gradebook2_checkbox.set
181
+ page.wiki_checkbox.set
182
+ page.news_checkbox.set
183
+ page.web_content_checkbox.set
184
+ page.site_statistics_checkbox.set
185
+ page.continue
186
+ end
187
+ on_page AddMultipleTools do |page|
188
+ page.site_email_address=@email
189
+ page.web_content_title=@web_content_title
190
+ page.web_content_source=@web_content_source
191
+ page.continue
192
+ end
193
+ on_page SiteAccess do |page|
194
+ page.select_allow
195
+ page.joiner_role=@joiner_role
196
+ page.continue
197
+ end
198
+ on_page ConfirmSiteSetup do |page|
199
+ page.request_site
200
+ end
201
+ # Create a string that will match the new Site's "creation date" string
202
+ @creation_date = make_date(Time.now)
203
+ on_page SiteSetup do |page|
204
+ page.search_field.wait_until_present
205
+ page.search(Regexp.escape(@subject))
206
+ end
207
+ # Get the site id for storage
208
+ @browser.frame(:class=>"portletMainIframe").link(:href=>/xsl-portal.site/, :index=>0).href =~ /(?<=\/site\/).+/
209
+ @id = $~.to_s
210
+
211
+ end
212
+
213
+ end
@@ -0,0 +1,7 @@
1
+ class SyllabusObject
2
+
3
+ include PageObject
4
+ include Utilities
5
+ include ToolsMenu
6
+
7
+ end
File without changes
@@ -0,0 +1,52 @@
1
+ class WebContentObject
2
+
3
+ include PageObject
4
+ include Utilities
5
+ include ToolsMenu
6
+
7
+ attr_accessor :title, :source, :site
8
+
9
+ def initialize(browser, opts={})
10
+ @browser = browser
11
+
12
+ defaults = {
13
+ :title=>random_alphanums,
14
+ :source=>"www.rsmart.com"
15
+ }
16
+ options = defaults.merge(opts)
17
+
18
+ @title=options[:title]
19
+ @source=options[:source]
20
+ @site=options[:site]
21
+ raise "You need to specify a site for your web content" if @site==nil
22
+ end
23
+
24
+ def create
25
+ my_workspace unless @browser.title=~/My Workspace/
26
+ site_setup unless @browser.title=~/Site Setup$/
27
+ on_page SiteSetup do |page|
28
+ page.edit @site
29
+ end
30
+ on_page SiteEditor do |page|
31
+ page.edit_tools
32
+ end
33
+ on_page EditSiteTools do |page|
34
+ page.check_web_content
35
+ page.continue
36
+ end
37
+ on_page AddMultipleTools do |page|
38
+ page.web_content_title=@title
39
+ page.web_content_source=@source
40
+ page.continue
41
+ end
42
+ on_page ConfirmSiteToolsEdits do |page|
43
+ page.finish_button.wait_until_present
44
+ page.finish
45
+ end
46
+ on_page SiteEditor do |page|
47
+ page.return_button.wait_until_present
48
+ page.return_to_sites_list
49
+ end
50
+ end
51
+
52
+ end
@@ -0,0 +1,7 @@
1
+ class WikiObject
2
+
3
+ include PageObject
4
+ include Utilities
5
+ include ToolsMenu
6
+
7
+ end
@@ -0,0 +1,21 @@
1
+ #================
2
+ # Drop Box pages
3
+ #================
4
+
5
+ #
6
+ class DropBox < AddFiles
7
+
8
+ include ToolsMenu
9
+
10
+ def initialize(browser)
11
+ @browser = browser
12
+
13
+ @@classes = {
14
+ :this => "DropBox",
15
+ :parent => "DropBox",
16
+ :second => "",
17
+ :third => ""
18
+ }
19
+ end
20
+
21
+ end
@@ -1,7 +1,21 @@
1
1
  #
2
2
  class EmailArchive
3
3
  include ToolsMenu
4
- include EmailArchiveMethods
4
+ include PageObject
5
+ def options
6
+ frm.link(:text=>"Options").click
7
+ EmailArchiveOptions.new(@browser)
8
+ end
9
+
10
+ # Returns an array containing the
11
+ def email_list
12
+ end
13
+
14
+ in_frame(:class=>"portletMainIframe") do |frame|
15
+ text_field(:search_field, :id=>"search", :frame=>frame)
16
+ button(:search_button, :value=>"Search", :frame=>frame)
17
+
18
+ end
5
19
  end
6
20
 
7
21
  class EmailArchiveOptions
@@ -1,39 +1,313 @@
1
1
  class Forums
2
2
  include ToolsMenu
3
- include ForumsMethods
3
+ # Pass this method a string that matches
4
+ # the title of a Forum on the page, it returns
5
+ # True if the specified forum row has "DRAFT" in it.
6
+ def draft?(title)
7
+ frm.table(:id=>"msgForum:forums").row(:text=>/#{Regexp.escape(title)}/).span(:text=>"DRAFT").exist?
8
+ end
9
+
10
+ def new_forum
11
+ frm.link(:text=>"New Forum").click
12
+ EditForum.new(@browser)
13
+ end
14
+
15
+ def new_topic_for_forum(name)
16
+ index = forum_titles.index(name)
17
+ frm.link(:text=>"New Topic", :index=>index).click
18
+ AddEditTopic.new(@browser)
19
+ end
20
+
21
+ def organize
22
+ frm.link(:text=>"Organize").click
23
+ OrganizeForums.new(@browser)
24
+ end
25
+
26
+ def template_settings
27
+ frm.link(:text=>"Template Settings").click
28
+ ForumTemplateSettings.new(@browser)
29
+ end
30
+
31
+ def forums_table
32
+ frm.div(:class=>"portletBody").table(:id=>"msgForum:forums")
33
+ end
34
+
35
+ def forum_titles
36
+ titles = []
37
+ title_links = frm.div(:class=>"portletBody").links.find_all { |link| link.class_name=="title" && link.id=="" }
38
+ title_links.each { |link| titles << link.text }
39
+ return titles
40
+ end
41
+
42
+ def topic_titles
43
+ titles = []
44
+ title_links = frm.div(:class=>"portletBody").links.find_all { |link| link.class_name == "title" && link.id != "" }
45
+ title_links.each { |link| titles << link.text }
46
+ return titles
47
+ end
48
+
49
+ def forum_settings(name)
50
+ index = forum_titles.index(name)
51
+ frm.link(:text=>"Forum Settings", :index=>index).click
52
+ EditForum.new(@browser)
53
+ end
54
+
55
+ def topic_settings(name)
56
+ index = topic_titles.index(name)
57
+ frm.link(:text=>"Topic Settings", :index=>index).click
58
+ AddEditTopic.new(@browser)
59
+ end
60
+
61
+ def delete_forum(name)
62
+ index = forum_titles.index(name)
63
+ frm.link(:id=>/msgForum:forums:\d+:delete/,:text=>"Delete", :index=>index).click
64
+ EditForum.new(@browser)
65
+ end
66
+
67
+ def delete_topic(name)
68
+ index = topic_titles.index(name)
69
+ frm.link(:id=>/topics:\d+:delete_confirm/, :text=>"Delete", :index=>index).click
70
+ AddEditTopic.new(@browser)
71
+ end
72
+
73
+ def open_forum(forum_title)
74
+ frm.link(:text=>forum_title).click
75
+ # New Class def goes here.
76
+ end
77
+
78
+ def open_topic(topic_title)
79
+ frm.link(:text=>topic_title).click
80
+ TopicPage.new(@browser)
81
+ end
4
82
  end
5
83
 
6
84
  class TopicPage
7
85
  include ToolsMenu
8
- include TopicPageMethods
86
+ def post_new_thread
87
+ frm.link(:text=>"Post New Thread").click
88
+ ComposeForumMessage.new(@browser)
89
+ end
90
+
91
+ def thread_titles
92
+ titles = []
93
+ message_table = frm.table(:id=>"msgForum:messagesInHierDataTable")
94
+ 1.upto(message_table.rows.size-1) do |x|
95
+ titles << message_table[x][1].span(:class=>"firstChild").link(:index=>0).text
96
+ end
97
+ return titles
98
+ end
99
+
100
+ def open_message(message_title)
101
+ frm.div(:class=>"portletBody").link(:text=>message_title).click
102
+ ViewForumThread.new(@browser)
103
+ end
104
+
105
+ def display_entire_message
106
+ frm.link(:text=>"Display Entire Message").click
107
+ TopicPage.new(@browser)
108
+ end
9
109
  end
10
110
 
11
111
  class ViewForumThread
12
112
  include ToolsMenu
13
- include ViewForumThreadMethods
113
+ def reply_to_thread
114
+ frm.link(:text=>"Reply to Thread").click
115
+ ComposeForumMessage.new(@browser)
116
+ end
117
+
118
+ def reply_to_message(index)
119
+ frm.link(:text=>"Reply", :index=>(index.to_i - 1)).click
120
+ ComposeForumMessage.new(@browser)
121
+ end
14
122
  end
15
123
 
16
124
  class ComposeForumMessage
17
125
  include ToolsMenu
18
- include ComposeForumMessageMethods
126
+ include PageObject
127
+ def post_message
128
+ frm.button(:text=>"Post Message").click
129
+ # Not sure if we need logic here...
130
+ TopicPage.new(@browser)
131
+ end
132
+
133
+ def editor
134
+ frm.frame(:id, "dfCompose:df_compose_body_inputRichText___Frame").td(:id, "xEditingArea").frame(:index=>0)
135
+ end
136
+
137
+ def message=(text)
138
+ editor.send_keys(text)
139
+ end
140
+
141
+ def reply_text
142
+ @browser.frame(:index=>1).div(:class=>"singleMessageReply").text
143
+ end
144
+
145
+ def add_attachments
146
+ #FIXME
147
+ end
148
+
149
+ def cancel
150
+ frm.button(:value=>"Cancel").click
151
+ # Logic for picking the correct page class
152
+ if frm.link(:text=>"Reply to Thread")
153
+ ViewForumThread.new(@browser)
154
+ elsif frm.link(:text=>"Post New Thread").click
155
+ TopicPage.new(@browser)
156
+ end
157
+ end
158
+
159
+ in_frame(:class=>"portletMainIframe") do |frame|
160
+ text_field(:title, :id=>"dfCompose:df_compose_title", :frame=>frame)
161
+
162
+ end
19
163
  end
20
164
 
21
165
  class ForumTemplateSettings
22
166
  include ToolsMenu
23
- include ForumTemplateSettingsMethods
167
+ def page_title
168
+ frm.div(:class=>"portletBody").h3(:index=>0).text
169
+ end
170
+
171
+ def save
172
+ frm.button(:value=>"Save").click
173
+ Forums.new(@browser)
174
+ end
175
+
176
+ def cancel
177
+ frm.button(:value=>"Cancel").click
178
+ Forums.new(@browser)
179
+ end
180
+ =begin
181
+ def site_role=(role)
182
+ frm.select(:id=>"revise:role").select(role)
183
+ 0.upto(frm.select(:id=>"revise:role").length - 1) do |x|
184
+ if frm.div(:class=>"portletBody").table(:class=>"permissionPanel jsfFormTable lines nolines", :index=>x).visible?
185
+ @@table_index = x
186
+
187
+ def permission_level=(value)
188
+ frm.select(:id=>"revise:perm:#{@@table_index}:level").select(value)
189
+ end
190
+
191
+ end
192
+ end
193
+ end
194
+ =end
24
195
  end
25
196
 
26
197
  class OrganizeForums
27
198
  include ToolsMenu
28
- include OrganizeForumsMethods
199
+ def save
200
+ frm.button(:value=>"Save").click
201
+ Forums.new(@browser)
202
+ end
203
+
204
+ # These are set to so that the user
205
+ # does not have to start the list at zero...
206
+ def forum(index)
207
+ frm.select(:id, "revise:forums:#{index.to_i - 1}:forumIndex")
208
+ end
209
+
210
+ def topic(forumindex, topicindex)
211
+ frm.select(:id, "revise:forums:#{forumindex.to_i - 1}:topics:#{topicindex.to_i - 1}:topicIndex")
212
+ end
29
213
  end
30
214
 
31
215
  class EditForum
32
216
  include ToolsMenu
33
- include EditForumMethods
217
+ include PageObject
218
+ def save
219
+ frm.button(:value=>"Save").click
220
+ Forums.new(@browser)
221
+ end
222
+
223
+ def save_and_add
224
+ frm.button(:value=>"Save Settings & Add Topic").click
225
+ AddEditTopic.new(@browser)
226
+ end
227
+
228
+ def editor
229
+ frm.div(:class=>"portletBody").frame(:id, "revise:df_compose_description_inputRichText___Frame").td(:id, "xEditingArea").frame(:index=>0)
230
+ end
231
+
232
+ def description=(text)
233
+ editor.send_keys(text)
234
+ end
235
+
236
+ def add_attachments
237
+ frm.button(:value=>/attachments/).click
238
+ ForumsAddAttachments.new(@browser)
239
+ end
240
+
241
+ in_frame(:class=>"portletMainIframe") do |frame|
242
+ text_field(:title, :id=>"revise:forum_title", :frame=>frame)
243
+ text_area(:short_description, :id=>"revise:forum_shortDescription", :frame=>frame)
244
+
245
+ end
34
246
  end
35
247
 
36
248
  class AddEditTopic
37
249
  include ToolsMenu
38
- include AddEditTopicMethods
250
+ include PageObject
251
+
252
+ @@table_index=0
253
+
254
+ def editor
255
+ frm.div(:class=>"portletBody").frame(:id, "revise:topic_description_inputRichText___Frame").td(:id, "xEditingArea").frame(:index=>0)
256
+ end
257
+
258
+ def description=(text)
259
+ editor.send_keys(text)
260
+ end
261
+
262
+ def save
263
+ frm.button(:value=>"Save").click
264
+ Forums.new(@browser)
265
+ end
266
+
267
+ def add_attachments
268
+ frm.button(:value=>/Add.+ttachment/).click
269
+ ForumsAddAttachments.new(@browser)
270
+ end
271
+
272
+ def roles
273
+ roles=[]
274
+ options = frm.select(:id=>"revise:role").options.to_a
275
+ options.each { |option| roles << option.text }
276
+ return roles
277
+ end
278
+
279
+ def site_role=(role)
280
+ frm.select(:id=>"revise:role").select(role)
281
+ 0.upto(frm.select(:id=>"revise:role").length - 1) do |x|
282
+ if frm.div(:class=>"portletBody").table(:class=>"permissionPanel jsfFormTable lines nolines", :index=>x).visible?
283
+ @@table_index = x
284
+
285
+ def permission_level=(value)
286
+ frm.select(:id=>"revise:perm:#{@@table_index}:level").select(value)
287
+ end
288
+
289
+ end
290
+ end
291
+ end
292
+
293
+ in_frame(:class=>"portletMainIframe") do |frame|
294
+ text_field(:title, :id=>"revise:topic_title", :frame=>frame)
295
+ text_area(:short_description, :id=>"revise:topic_shortDescription", :frame=>frame)
296
+
297
+ end
298
+ end
299
+
300
+ # TODO: Determine where this should go and a better way to organize the code
301
+ class ForumsAddAttachments < AddFiles
302
+
303
+ def initialize(browser)
304
+ @browser = browser
305
+
306
+ @@classes = {
307
+ :this => "ForumsAddAttachments",
308
+ :parent => "AddEditTopic",
309
+ :second => "EditForum"
310
+ }
311
+ end
312
+
39
313
  end