rwebspec 1.4.0.2 → 1.6

Sign up to get free protection for your applications and to get access to all the features.
data/CHANGELOG CHANGED
@@ -1,5 +1,42 @@
1
1
  CHANGELOG
2
2
  =========
3
+ 1.6
4
+ Include ScreenCapture
5
+
6
+ 1.5.4
7
+ Add syntax click_link("Duplicate Link", :index => 2) # second link
8
+
9
+ 1.5.3 (2010-01-06)
10
+ rename itest_plugin -> testwise_plugin
11
+ remove dependency on test-unit
12
+
13
+ 1.5.2
14
+ add contains matcher to driver and page
15
+ in page, page_text renamed to page_specific_text
16
+ more unit tests
17
+
18
+ 1.5.1
19
+ [Load Test helper
20
+ assert_text_present changed to check text view of web pages
21
+ detect ILOAD2 environment to determin to preivew load test or not
22
+
23
+ 1.5
24
+ [New] Supports Watir 1.6.5
25
+ [Fixes] Array@sum conflicts with ActiveSupport
26
+ [New] New database_checker
27
+ [Other] load_table define class under ITEST::Module
28
+
29
+ 1.4.2
30
+ [New] average, sum for array objects, such as [1,2,3,4].average
31
+ [New] support date format with today(:us), yesterday("%d/%m/%Y")
32
+ [TODO] click security alerts
33
+
34
+ 1.4.1
35
+ [New] Added LoadTestHelper
36
+ [New] add expect_page to web_browser
37
+ [Fix] nil error in random_str (test_utils.rb)
38
+ [New] Add alias methods for select_list (alias)
39
+
3
40
  1.4.0.2
4
41
  Fixed: reuse browser does not work
5
42
  Add gem dependency (Watir/Firewatir) depends on platforms
data/Rakefile CHANGED
@@ -12,6 +12,9 @@ $:.unshift(File.dirname(__FILE__) + "/lib")
12
12
  desc "Default task"
13
13
  task :default => [ :clean, :spec, :rdoc, :chm, :gem]
14
14
 
15
+ desc "Continous build"
16
+ task :build => [:clean, :spec]
17
+
15
18
  desc "Clean generated files"
16
19
  task :clean do
17
20
  rm_rf 'pkg'
@@ -69,7 +72,7 @@ end
69
72
  spec = Gem::Specification.new do |s|
70
73
  s.platform= Gem::Platform::RUBY
71
74
  s.name = "rwebspec"
72
- s.version = "1.4.0.2"
75
+ s.version = "1.6"
73
76
  s.summary = "Executable functional specification for web applications in RSpec syntax and Watir"
74
77
  # s.description = ""
75
78
 
@@ -89,14 +92,8 @@ spec = Gem::Specification.new do |s|
89
92
  s.files = s.files + Dir.glob( "sample/**/*")
90
93
  s.files = s.files + Dir.glob( "docs/**/*" )
91
94
  s.add_dependency(%q<rspec>, ["= 1.1.12"])
92
- if RUBY_PLATFORM.downcase.include?("mswin") or RUBY_PLATFORM.downcase.include?("mingw")
93
- s.add_dependency("watir", ">= 1.6.2")
94
- else
95
- s.add_dependency("firewatir", ">= 1.6.2")
96
- end
97
-
98
- s.add_dependency("commonwatir", ">= 1.6.2")
99
- s.add_dependency("test-unit", ">= 2.0.2")
95
+
96
+ s.add_dependency("commonwatir", ">= 1.6.5")
100
97
  end
101
98
 
102
99
  Rake::GemPackageTask.new(spec) do |pkg|
@@ -2,41 +2,53 @@ require 'test/unit/assertions'
2
2
 
3
3
  module RWebSpec
4
4
  module Assert
5
-
6
5
  include Test::Unit::Assertions
7
-
6
+
8
7
  def assert_not(condition, msg = "")
9
- assert(!condition, msg)
8
+ perform_assertion { assert(!condition, msg) }
10
9
  end
11
-
10
+
12
11
  def assert_nil(actual, msg="")
13
- assert(actual.nil?, msg)
12
+ perform_assertion { assert(actual.nil?, msg) }
14
13
  end
15
14
 
16
15
  def assert_not_nil(actual, msg="")
17
- assert(!actual.nil?, msg)
16
+ perform_assertion { assert(!actual.nil?, msg) }
18
17
  end
19
18
 
20
19
  def fail(message)
21
- assert(false, message)
20
+ perform_assertion { assert(false, message) }
22
21
  end
23
22
 
24
23
  # assertions
25
24
  def assert_title_equals(title)
26
25
  assert_equals(title, @web_browser.page_title)
27
26
  end
27
+
28
28
  alias assert_title assert_title_equals
29
29
 
30
30
  # Assert text present in page source (html)
31
- # assert_text_present("<h1>iTest2</h1>")
31
+ # assert_text_in_page_source("<b>iTest2</b> Cool") # <b>iTest2</b> Cool
32
+ def assert_text_in_page_source(text)
33
+ perform_assertion { assert((@web_browser.page_source.include? text), 'expected html: ' + text + ' not found') }
34
+ end
35
+
36
+ # Assert text not present in page source (html)
37
+ # assert_text_not_in_page_source("<b>iTest2</b> Cool") # <b>iTest2</b> Cool
38
+ def assert_text_not_in_page_source(text)
39
+ perform_assertion { assert(!(@web_browser.page_source.include? text), 'expected html: ' + text + ' found') }
40
+ end
41
+
42
+ # Assert text present in page source (html)
43
+ # assert_text_present("iTest2 Cool") # <b>iTest2</b> Cool
32
44
  def assert_text_present(text)
33
- assert((@web_browser.page_source.include? text), 'expected text: ' + text + ' not found')
45
+ perform_assertion { assert((@web_browser.text.include? text), 'expected text: ' + text + ' not found') }
34
46
  end
35
47
 
36
48
  # Assert text not present in page source (html)
37
- # assert_text_not_present("<h1>iTest2</h1>")
49
+ # assert_text_not_present("iTest2 Cool") # <b>iTest2</b> Cool
38
50
  def assert_text_not_present(text)
39
- assert(!(@web_browser.page_source.include? text), 'expected text: ' + text + ' found')
51
+ perform_assertion { assert(!(@web_browser.text.include? text), 'expected text: ' + text + ' found') }
40
52
  end
41
53
 
42
54
 
@@ -58,7 +70,7 @@ module RWebSpec
58
70
 
59
71
  def assert_link_not_present_with_exact(link_text)
60
72
  @web_browser.links.each { |link|
61
- assert(link_text != link.text, "unexpected link (exact): #{link_text} found")
73
+ perform_assertion { assert(link_text != link.text, "unexpected link (exact): #{link_text} found") }
62
74
  }
63
75
  end
64
76
 
@@ -76,7 +88,7 @@ module RWebSpec
76
88
 
77
89
  def assert_link_not_present_with_text(link_text)
78
90
  @web_browser.links.each { |link|
79
- assert(!link.text.include?(link_text), "unexpected link containing: #{link_text} found")
91
+ perform_assertion { assert(!link.text.include?(link_text), "unexpected link containing: #{link_text} found") }
80
92
  }
81
93
  end
82
94
 
@@ -86,20 +98,22 @@ module RWebSpec
86
98
  def assert_checkbox_not_selected(checkbox_name)
87
99
  @web_browser.checkboxes.each { |checkbox|
88
100
  if (checkbox.name == checkbox_name) then
89
- assert(!checkbox.isSet?, "Checkbox #{checkbox_name} is checked unexpectly")
101
+ perform_assertion { assert(!checkbox.isSet?, "Checkbox #{checkbox_name} is checked unexpectly") }
90
102
  end
91
103
  }
92
104
  end
93
- alias assert_checkbox_not_checked assert_checkbox_not_selected
105
+
106
+ alias assert_checkbox_not_checked assert_checkbox_not_selected
94
107
 
95
108
  def assert_checkbox_selected(checkbox_name)
96
109
  @web_browser.checkboxes.each { |checkbox|
97
110
  if (checkbox.name == checkbox_name) then
98
- assert(checkbox.isSet?, "Checkbox #{checkbox_name} not checked")
111
+ perform_assertion { assert(checkbox.isSet?, "Checkbox #{checkbox_name} not checked") }
99
112
  end
100
113
  }
101
114
  end
102
- alias assert_checkbox_checked assert_checkbox_selected
115
+
116
+ alias assert_checkbox_checked assert_checkbox_selected
103
117
 
104
118
  ##
105
119
  # select
@@ -107,20 +121,22 @@ module RWebSpec
107
121
  @web_browser.select_lists.each { |select|
108
122
  continue unless select.name == select_name
109
123
  select.o.each do |option| # items in the list
110
- assert(!(option.value == option_value), "unexpected select option: #{option_value} for #{select_name} found")
124
+ perform_assertion { assert(!(option.value == option_value), "unexpected select option: #{option_value} for #{select_name} found") }
111
125
  end
112
126
  }
113
127
  end
128
+
114
129
  alias assert_select_value_not_present assert_option_value_not_present
115
130
 
116
131
  def assert_option_not_present(select_name, option_label)
117
132
  @web_browser.select_lists.each { |select|
118
133
  next unless select.name == select_name
119
134
  select.o.each do |option| # items in the list
120
- assert(!(option.text == option_label), "unexpected select option: #{option_label} for #{select_name} found")
135
+ perform_assertion { assert(!(option.text == option_label), "unexpected select option: #{option_label} for #{select_name} found") }
121
136
  end
122
137
  }
123
138
  end
139
+
124
140
  alias assert_select_label_not_present assert_option_not_present
125
141
 
126
142
  def assert_option_value_present(select_name, option_value)
@@ -130,9 +146,11 @@ module RWebSpec
130
146
  return if option.value == option_value
131
147
  end
132
148
  }
133
- assert(false, "can't find the combob box with value: #{option_value}")
149
+ fail("can't find the combo box with value: #{option_value}")
134
150
  end
151
+
135
152
  alias assert_select_value_present assert_option_value_present
153
+ alias assert_menu_value_present assert_option_value_present
136
154
 
137
155
  def assert_option_present(select_name, option_label)
138
156
  @web_browser.select_lists.each { |select|
@@ -141,30 +159,36 @@ module RWebSpec
141
159
  return if option.text == option_label
142
160
  end
143
161
  }
144
- assert(false, "can't find the combob box: #{select_name} with value: #{option_label}")
162
+ fail("can't find the combob box: #{select_name} with value: #{option_label}")
145
163
  end
164
+
146
165
  alias assert_select_label_present assert_option_present
166
+ alias assert_menu_label_present assert_option_present
147
167
 
148
168
  def assert_option_equals(select_name, option_label)
149
169
  @web_browser.select_lists.each { |select|
150
170
  next unless select.name == select_name
151
171
  select.o.each do |option| # items in the list
152
172
  if (option.text == option_label) then
153
- assert_equal(select.value, option.value, "Select #{select_name}'s value is not equal to expected option label: '#{option_label}'")
173
+ perform_assertion { assert_equal(select.value, option.value, "Select #{select_name}'s value is not equal to expected option label: '#{option_label}'") }
154
174
  end
155
175
  end
156
176
  }
157
177
  end
178
+
158
179
  alias assert_select_label assert_option_equals
180
+ alias assert_menu_label assert_option_equals
159
181
 
160
182
  def assert_option_value_equals(select_name, option_value)
161
183
  @web_browser.select_lists.each { |select|
162
184
  next unless select.name == select_name
163
- assert_equal(select.value, option_value, "Select #{select_name}'s value is not equal to expected: '#{option_value}'")
185
+ perform_assertion { assert_equal(select.value, option_value, "Select #{select_name}'s value is not equal to expected: '#{option_value}'") }
164
186
  }
165
187
  end
188
+
166
189
  alias assert_select_value assert_option_value_equals
167
-
190
+ alias assert_menu_value assert_option_value_equals
191
+
168
192
  ##
169
193
  # radio
170
194
 
@@ -172,11 +196,11 @@ module RWebSpec
172
196
  def assert_radio_option_not_present(radio_group, radio_option)
173
197
  @web_browser.radios.each { |radio|
174
198
  if (radio.name == radio_group) then
175
- assert(!(radio_option == radio.value), "unexpected radio option: " + radio_option + " found")
199
+ perform_assertion { assert(!(radio_option == radio.value), "unexpected radio option: " + radio_option + " found") }
176
200
  end
177
201
  }
178
202
  end
179
-
203
+
180
204
  def assert_radio_option_present(radio_group, radio_option)
181
205
  @web_browser.radios.each { |radio|
182
206
  return if (radio.name == radio_group) and (radio_option == radio.value)
@@ -187,34 +211,36 @@ module RWebSpec
187
211
  def assert_radio_option_selected(radio_group, radio_option)
188
212
  @web_browser.radios.each { |radio|
189
213
  if (radio.name == radio_group and radio_option == radio.value) then
190
- assert(radio.isSet?, "Radio button #{radio_group}-[#{radio_option}] not checked")
214
+ perform_assertion { assert(radio.isSet?, "Radio button #{radio_group}-[#{radio_option}] not checked") }
191
215
  end
192
216
  }
193
217
  end
194
- alias assert_radio_button_checked assert_radio_option_selected
195
- alias assert_radio_option_checked assert_radio_option_selected
196
-
218
+
219
+ alias assert_radio_button_checked assert_radio_option_selected
220
+ alias assert_radio_option_checked assert_radio_option_selected
221
+
197
222
  def assert_radio_option_not_selected(radio_group, radio_option)
198
223
  @web_browser.radios.each { |radio|
199
224
  if (radio.name == radio_group and radio_option == radio.value) then
200
- assert(!radio.isSet?, "Radio button #{radio_group}-[#{radio_option}] checked unexpected")
225
+ perform_assertion { assert(!radio.isSet?, "Radio button #{radio_group}-[#{radio_option}] checked unexpected") }
201
226
  end
202
227
  }
203
228
  end
229
+
204
230
  alias assert_radio_button_not_checked assert_radio_option_not_selected
205
231
  alias assert_radio_option_not_checked assert_radio_option_not_selected
206
-
232
+
207
233
  ##
208
234
  # Button
209
235
  def assert_button_not_present(button_id)
210
236
  @web_browser.buttons.each { |button|
211
- assert(button.id != button_id, "unexpected button id: #{button_id} found")
237
+ perform_assertion { assert(button.id != button_id, "unexpected button id: #{button_id} found") }
212
238
  }
213
239
  end
214
240
 
215
241
  def assert_button_not_present_with_text(text)
216
242
  @web_browser.buttons.each { |button|
217
- assert(button.value != text, "unexpected button id: #{text} found")
243
+ perform_assertion { assert(button.value != text, "unexpected button id: #{text} found") }
218
244
  }
219
245
  end
220
246
 
@@ -222,44 +248,37 @@ module RWebSpec
222
248
  @web_browser.buttons.each { |button|
223
249
  return if button_id == button.id
224
250
  }
225
- assert(false, "can't find the button with id: #{button_id}")
251
+ fail("can't find the button with id: #{button_id}")
226
252
  end
227
253
 
228
254
  def assert_button_present_with_text(button_text)
229
255
  @web_browser.buttons.each { |button|
230
256
  return if button_text == button.value
231
257
  }
232
- assert(false, "can't find the button with text: #{button_text}")
258
+ fail("can't find the button with text: #{button_text}")
233
259
  end
234
260
 
235
261
 
236
262
  def assert_equals(expected, actual, msg=nil)
237
- assert(expected == actual, (msg.nil?) ? "Expected: #{expected} diff from actual: #{actual}" : msg)
263
+ perform_assertion { assert(expected == actual, (msg.nil?) ? "Expected: #{expected} diff from actual: #{actual}" : msg) }
238
264
  end
239
265
 
240
266
 
241
-
242
267
  # Check a HTML element exists or not
243
268
  # Example:
244
269
  # assert_exists("label", "receipt_date")
245
270
  # assert_exists(:span, :receipt_date)
246
- def assert_exists(tag, element_id) {}
247
- begin
248
- assert eval("#{tag}(:id, '#{element_id.to_s}').exists?")
249
- rescue => e
250
- raise "Element '#{tag}' with id: '#{element_id}' not found, #{e}"
251
- end
271
+ def assert_exists(tag, element_id)
272
+ perform_assertion { assert(eval("#{tag}(:id, '#{element_id.to_s}').exists?"), "Element '#{tag}' with id: '#{element_id}' not found") }
252
273
  end
274
+
253
275
  alias assert_exists? assert_exists
254
276
  alias assert_element_exists assert_exists
255
277
 
256
- def assert_not_exists(tag, element_id) {}
257
- begin
258
- assert_not eval("#{tag}(:id, '#{element_id.to_s}').exists?")
259
- raise "Unexpected element'#{tag}' + with id: '#{element_id}' found"
260
- rescue => e
261
- end
278
+ def assert_not_exists(tag, element_id)
279
+ perform_assertion { assert_not(eval("#{tag}(:id, '#{element_id.to_s}').exists?"), "Unexpected element'#{tag}' + with id: '#{element_id}' found")}
262
280
  end
281
+
263
282
  alias assert_not_exists? assert_not_exists
264
283
  alias assert_element_not_exists? assert_not_exists
265
284
 
@@ -268,23 +287,16 @@ module RWebSpec
268
287
  # assert_visible(:div, "public_notice")
269
288
  # assert_visible(:span, "public_span")
270
289
  def assert_visible(tag, element_id)
271
- begin
272
- assert(eval("#{tag}(:id, '#{element_id.to_s}').visible?"))
273
- rescue => e
274
- raise "Element '#{tag}' with id: '#{element_id}' not visible, #{e}"
275
- end
290
+ perform_assertion { assert(eval("#{tag}(:id, '#{element_id.to_s}').visible?"), "Element '#{tag}' with id: '#{element_id}' not visible") }
276
291
  end
277
292
 
278
293
  # Assert tag with element id is hidden?, example
279
294
  # assert_hidden(:div, "secret")
280
295
  # assert_hidden(:span, "secret_span")
281
296
  def assert_hidden(tag, element_id)
282
- begin
283
- assert(!eval("#{tag}(:id, '#{element_id.to_s}').visible?"))
284
- rescue => e
285
- raise "Element '#{tag}' with id: '#{element_id}' is visible, #{e}"
286
- end
297
+ perform_assertion { assert(!eval("#{tag}(:id, '#{element_id.to_s}').visible?"), "Element '#{tag}' with id: '#{element_id}' is visible") }
287
298
  end
299
+
288
300
  alias assert_not_visible assert_hidden
289
301
 
290
302
 
@@ -312,13 +324,15 @@ module RWebSpec
312
324
  # assert_text_present_in_table("t1", ">A<") # => true
313
325
  # assert_text_present_in_table("t1", ">A<", :just_plain_text => true) # => false
314
326
  def assert_text_present_in_table(table_id, text, options = { :just_plain_text => false })
315
- assert(table_source(table_id, options).include?(text), "the text #{text} not found in table #{table_id}")
327
+ perform_assertion { assert(table_source(table_id, options).include?(text), "the text #{text} not found in table #{table_id}") }
316
328
  end
329
+
317
330
  alias assert_text_in_table assert_text_present_in_table
318
331
 
319
332
  def assert_text_not_present_in_table(table_id, text, options = { :just_plain_text => false })
320
- assert_not(table_source(table_id, options).include?(text), "the text #{text} not found in table #{table_id}")
333
+ perform_assertion { assert_not(table_source(table_id, options).include?(text), "the text #{text} not found in table #{table_id}") }
321
334
  end
335
+
322
336
  alias assert_text_not_in_table assert_text_not_present_in_table
323
337
 
324
338
  # Assert a text field (with given name) has the value
@@ -328,17 +342,17 @@ module RWebSpec
328
342
  # assert_text_field_value("text1", "text already there") => true
329
343
  #
330
344
  def assert_text_field_value(textfield_name, text)
331
- assert_equal(text, text_field(:name, textfield_name).value)
345
+ perform_assertion { assert_equal(text, text_field(:name, textfield_name).value) }
332
346
  end
333
347
 
334
-
348
+
335
349
  #-- Not tested
336
350
  # -----
337
-
351
+
338
352
  def assert_text_in_element(element_id, text)
339
353
  elem = element_by_id(element_id)
340
354
  assert_not_nil(elem.innerText, "element #{element_id} has no text")
341
- assert(elem.innerText.include?(text), "the text #{text} not found in element #{element_id}")
355
+ perform_assertion { assert(elem.innerText.include?(text), "the text #{text} not found in element #{element_id}") }
342
356
  end
343
357
 
344
358
  # Use
@@ -348,14 +362,25 @@ module RWebSpec
348
362
  # def assert_position_in_list(list_element_id)
349
363
  # raise "not implemented"
350
364
  # end
351
-
365
+
352
366
  private
353
367
  def table_source(table_id, options)
354
- elem_table = table(:id, table_id.to_s)
355
- elem_table_text = elem_table.text
368
+ elem_table = table(:id, table_id.to_s)
369
+ elem_table_text = elem_table.text
356
370
  elem_table_html = is_firefox? ? elem_table.innerHTML : elem_table.html
357
371
  table_source = options[:just_plain_text] ? elem_table_text : elem_table_html
358
372
  end
359
-
373
+
374
+
375
+ def perform_assertion(&block)
376
+ begin
377
+ yield
378
+ rescue StandardError => e
379
+ # puts "[DEBUG] Assertion error: #{e}"
380
+ take_screenshot
381
+ raise e
382
+ end
383
+ end
384
+
360
385
  end
361
386
  end
@@ -0,0 +1,74 @@
1
+ require 'active_record' # change rwebspec/database
2
+
3
+ module RWebSpec
4
+ module DatabaseChecker
5
+
6
+ # Example
7
+ # connect_to_database mysql_db(:host => "localhost", :database => "lavabuild_local", :user => "root", :password => ""), true
8
+ def mysql_db(settings)
9
+ options = {:adapter => "mysql"}
10
+ options.merge!(settings)
11
+ end
12
+
13
+ # connect_to_database sqlite3_db(:database => File.join(File.dirname(__FILE__), "testdata", "sample.sqlite3")), true
14
+ def sqlite3_db(settings)
15
+ options = {:adapter => "sqlite3"}
16
+ options.merge!(settings)
17
+ end
18
+
19
+ def sqlserver_db(settings)
20
+ options = {:adapter => "sqlserver"}
21
+ options[:username] ||= settings[:user]
22
+ options.merge!(settings)
23
+ end
24
+
25
+ def sqlserver_db_dbi(options)
26
+ options[:user] ||= options[:username]
27
+ options[:username] ||= options[:user]
28
+ conn_str = "DBI:ADO:Provider=SQLOLEDB;Data Source=#{options[:host]};Initial Catalog=#{options[:database]};User ID=\"#{options[:user]}\";password=\"#{options[:password]}\" "
29
+ dbh = DBI.connect(conn_str)
30
+ end
31
+
32
+ def clear_database_connection
33
+ begin
34
+ ActiveRecord::Base.remove_connection
35
+ rescue => e
36
+ puts "failed o clear database connection: #{e}"
37
+ end
38
+ end
39
+
40
+ # Connect to databse, example
41
+ # mysql_db(:host => "localhost", :database => "lavabuild_local", :user => "root", :password => "")
42
+ def connect_to_database(db_settings, force = false)
43
+ # only setup database connection once
44
+ if force
45
+ ActiveRecord::Base.establish_connection(db_settings)
46
+ else
47
+ begin
48
+ ActiveRecord::Base.connection
49
+ rescue => e
50
+ require 'pp'
51
+ pp db_settings
52
+ puts "failed to connect: #{e}"
53
+ ActiveRecord::Base.establish_connection(db_settings)
54
+ end
55
+ end
56
+ end
57
+
58
+ def load_table(table_name)
59
+ begin
60
+ ActiveRecord::Base.connection
61
+ rescue =>e
62
+ raise "No database connection setup yet, use connect_to_database() method"
63
+ end
64
+ class_name = table_name.classify
65
+ # define the class, so can use ActiveRecord in
66
+ # such as
67
+ # Perosn.count.should == 2
68
+ def_class = "class ::#{class_name} < ActiveRecord::Base; end"
69
+ eval def_class
70
+ return def_class
71
+ end
72
+
73
+ end
74
+ end