rwebspec 4.0 → 4.1.0
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG +6 -0
- data/README +1 -1
- data/Rakefile +7 -6
- data/lib/plugins/testwise_plugin.rb +5 -1
- data/lib/rwebspec-common/assert.rb +125 -41
- data/lib/rwebspec-common/test_utils.rb +2 -38
- data/lib/rwebspec-watir/driver.rb +62 -5
- data/lib/rwebspec-watir/web_browser.rb +1 -1
- data/lib/rwebspec-webdriver/driver.rb +64 -4
- data/lib/rwebspec-webdriver/web_browser.rb +60 -10
- metadata +20 -4
data/CHANGELOG
CHANGED
@@ -1,6 +1,12 @@
|
|
1
1
|
CHANGELOG
|
2
2
|
=========
|
3
3
|
|
4
|
+
4.1
|
5
|
+
[Fixed] - click_button, click_button_with_id support :index
|
6
|
+
[Refactored] - unit tests
|
7
|
+
[Feature] - Save screenshot for Selenium
|
8
|
+
[CHANGE] - open_browser(base_url, options) => open_browser(:base_url => "http://")
|
9
|
+
|
4
10
|
4.0
|
5
11
|
- Merge rwebspec-webdriver with rwebspec!
|
6
12
|
|
data/README
CHANGED
data/Rakefile
CHANGED
@@ -1,7 +1,8 @@
|
|
1
1
|
require 'rubygems'
|
2
2
|
require 'rspec/core/rake_task'
|
3
3
|
# require 'rake/rdoctask'
|
4
|
-
require '
|
4
|
+
require 'rubygems/package_task'
|
5
|
+
|
5
6
|
require 'rdoc' # require rdoc 2
|
6
7
|
# gem 'darkfish-rdoc'
|
7
8
|
# require 'darkfish-rdoc'
|
@@ -24,7 +25,7 @@ end
|
|
24
25
|
|
25
26
|
desc 'Run all specs'
|
26
27
|
RSpec::Core::RakeTask.new('spec') do |t|
|
27
|
-
t.rspec_opts = ['
|
28
|
+
t.rspec_opts = ['']
|
28
29
|
# t.libs = ["lib", "server/lib" ]
|
29
30
|
t.pattern = Dir['spec/**/*_spec.rb'].sort
|
30
31
|
end
|
@@ -77,7 +78,7 @@ end
|
|
77
78
|
spec = Gem::Specification.new do |s|
|
78
79
|
s.platform= Gem::Platform::RUBY
|
79
80
|
s.name = "rwebspec"
|
80
|
-
s.version = "4.0"
|
81
|
+
s.version = "4.1.0"
|
81
82
|
s.summary = "Web application functional specification in Ruby"
|
82
83
|
s.description = "Executable functional specification for web applications in RSpec syntax with Watir or Selenium"
|
83
84
|
|
@@ -97,13 +98,13 @@ spec = Gem::Specification.new do |s|
|
|
97
98
|
s.files = s.files + Dir.glob( "sample/**/*")
|
98
99
|
s.files = s.files + Dir.glob( "docs/**/*" )
|
99
100
|
s.add_dependency(%q<rspec>, [">= 2.10"])
|
100
|
-
s.add_dependency(%q<rspec-core>, ["
|
101
|
+
s.add_dependency(%q<rspec-core>, ["= 2.10.1"])
|
101
102
|
s.add_dependency("commonwatir", ">= 3.0")
|
102
|
-
|
103
|
+
unless RUBY_PLATFORM =~ /mingw/
|
103
104
|
s.add_dependency("selenium-webdriver")
|
104
105
|
end
|
105
106
|
end
|
106
107
|
|
107
|
-
|
108
|
+
Gem::PackageTask.new(spec) do |pkg|
|
108
109
|
pkg.need_zip = true
|
109
110
|
end
|
@@ -57,7 +57,11 @@ module RWebSpec
|
|
57
57
|
end
|
58
58
|
|
59
59
|
def notify_screenshot_location(image_file_path)
|
60
|
-
|
60
|
+
begin
|
61
|
+
connect_to_testwise(" SHOT", image_file_path)
|
62
|
+
rescue => e
|
63
|
+
puts "[DEBUG] failed to notify TestWise a screenshot"
|
64
|
+
end
|
61
65
|
end
|
62
66
|
|
63
67
|
# find out the line (and file) the execution is on, and notify iTest via Socket
|
@@ -80,11 +80,13 @@ module RWebSpec
|
|
80
80
|
# assert_link_present_with_text("Click ") # =>
|
81
81
|
#
|
82
82
|
def assert_link_present_with_text(link_text)
|
83
|
+
|
83
84
|
@web_browser.links.each { |link|
|
84
85
|
return if link.text.include?(link_text)
|
85
86
|
}
|
86
87
|
fail( "can't find the link containing text: #{link_text}")
|
87
|
-
|
88
|
+
|
89
|
+
end
|
88
90
|
|
89
91
|
def assert_link_not_present_with_text(link_text)
|
90
92
|
@web_browser.links.each { |link|
|
@@ -92,23 +94,43 @@ module RWebSpec
|
|
92
94
|
}
|
93
95
|
end
|
94
96
|
|
97
|
+
def is_selenium_element?(elem)
|
98
|
+
elem.class.name =~ /Selenium/
|
99
|
+
end
|
100
|
+
|
101
|
+
def element_name(elem)
|
102
|
+
elem.class.name =~ /Selenium/ ? elem['name'] : elem.name
|
103
|
+
end
|
104
|
+
|
105
|
+
def element_value(elem)
|
106
|
+
elem.class.name =~ /Selenium/ ? elem['value'] : elem.value
|
107
|
+
end
|
95
108
|
|
96
109
|
##
|
97
110
|
# Checkbox
|
98
111
|
def assert_checkbox_not_selected(checkbox_name)
|
99
112
|
@web_browser.checkboxes.each { |checkbox|
|
100
|
-
|
101
|
-
|
113
|
+
the_element_name = element_name(checkbox)
|
114
|
+
if (the_element_name == checkbox_name) then
|
115
|
+
if is_selenium_element?(checkbox)
|
116
|
+
perform_assertion { assert(!checkbox.selected?, "Checkbox #{checkbox_name} is checked unexpectly") }
|
117
|
+
else
|
118
|
+
perform_assertion { assert(!checkbox.set?, "Checkbox #{checkbox_name} is checked unexpectly") }
|
119
|
+
end
|
102
120
|
end
|
103
121
|
}
|
104
122
|
end
|
105
|
-
|
106
123
|
alias assert_checkbox_not_checked assert_checkbox_not_selected
|
107
124
|
|
108
125
|
def assert_checkbox_selected(checkbox_name)
|
109
126
|
@web_browser.checkboxes.each { |checkbox|
|
110
|
-
|
111
|
-
|
127
|
+
the_element_name = element_name(checkbox)
|
128
|
+
if (the_element_name == checkbox_name) then
|
129
|
+
if is_selenium_element?(checkbox)
|
130
|
+
perform_assertion { assert(checkbox.selected?, "Checkbox #{checkbox_name} not checked") }
|
131
|
+
else
|
132
|
+
perform_assertion { assert(checkbox.set?, "Checkbox #{checkbox_name} not checked") }
|
133
|
+
end
|
112
134
|
end
|
113
135
|
}
|
114
136
|
end
|
@@ -130,7 +152,8 @@ module RWebSpec
|
|
130
152
|
|
131
153
|
def assert_option_not_present(select_name, option_label)
|
132
154
|
@web_browser.select_lists.each { |select|
|
133
|
-
|
155
|
+
the_element_name = element_name(select)
|
156
|
+
next unless the_element_name == select_name
|
134
157
|
select.options.each do |option| # items in the list
|
135
158
|
perform_assertion { assert(!(option.text == option_label), "unexpected select option: #{option_label} for #{select_name} found") }
|
136
159
|
end
|
@@ -141,10 +164,19 @@ module RWebSpec
|
|
141
164
|
|
142
165
|
def assert_option_value_present(select_name, option_value)
|
143
166
|
@web_browser.select_lists.each { |select|
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
167
|
+
the_element_name = element_name(select)
|
168
|
+
next unless the_element_name == select_name
|
169
|
+
|
170
|
+
if RWebSpec.framework == "Watir"
|
171
|
+
select.options.each do |option| # items in the list
|
172
|
+
return if option.value == option_value
|
173
|
+
end
|
174
|
+
else
|
175
|
+
select.find_elements(:tag_name => "option" ).each do |option|
|
176
|
+
return if element_value(option) == option_value
|
177
|
+
end
|
178
|
+
end
|
179
|
+
|
148
180
|
}
|
149
181
|
fail("can't find the combo box with value: #{option_value}")
|
150
182
|
end
|
@@ -154,12 +186,21 @@ module RWebSpec
|
|
154
186
|
|
155
187
|
def assert_option_present(select_name, option_label)
|
156
188
|
@web_browser.select_lists.each { |select|
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
|
189
|
+
the_element_name = element_name(select)
|
190
|
+
next unless the_element_name == select_name
|
191
|
+
|
192
|
+
if RWebSpec.framework == "Watir"
|
193
|
+
select.options.each do |option| # items in the list
|
194
|
+
return if option.text == option_label
|
195
|
+
end
|
196
|
+
else
|
197
|
+
select.find_elements(:tag_name => "option" ).each do |option|
|
198
|
+
return if option.text == option_label
|
199
|
+
end
|
200
|
+
end
|
201
|
+
|
161
202
|
}
|
162
|
-
fail("can't find the
|
203
|
+
fail("can't find the combo box: #{select_name} with value: #{option_label}")
|
163
204
|
end
|
164
205
|
|
165
206
|
alias assert_select_label_present assert_option_present
|
@@ -167,12 +208,25 @@ module RWebSpec
|
|
167
208
|
|
168
209
|
def assert_option_equals(select_name, option_label)
|
169
210
|
@web_browser.select_lists.each { |select|
|
170
|
-
|
171
|
-
|
172
|
-
|
173
|
-
|
174
|
-
|
175
|
-
|
211
|
+
the_element_name = element_name(select)
|
212
|
+
next unless the_element_name == select_name
|
213
|
+
|
214
|
+
if RWebSpec.framework == "Watir"
|
215
|
+
|
216
|
+
select.options.each do |option| # items in the list
|
217
|
+
if (option.text == option_label) then
|
218
|
+
perform_assertion { assert_equal(select.value, option.value, "Select #{select_name}'s value is not equal to expected option label: '#{option_label}'") }
|
219
|
+
end
|
220
|
+
end
|
221
|
+
|
222
|
+
else
|
223
|
+
select.find_elements(:tag_name => "option" ).each do |option|
|
224
|
+
if (option.text == option_label) then
|
225
|
+
assert option.selected?
|
226
|
+
end
|
227
|
+
end
|
228
|
+
|
229
|
+
end
|
176
230
|
}
|
177
231
|
end
|
178
232
|
|
@@ -181,8 +235,14 @@ module RWebSpec
|
|
181
235
|
|
182
236
|
def assert_option_value_equals(select_name, option_value)
|
183
237
|
@web_browser.select_lists.each { |select|
|
184
|
-
|
185
|
-
|
238
|
+
the_element_name = element_name(select)
|
239
|
+
next unless the_element_name == select_name
|
240
|
+
|
241
|
+
if RWebSpec.framework == "Watir"
|
242
|
+
perform_assertion { assert_equal(select.value, option_value, "Select #{select_name}'s value is not equal to expected: '#{option_value}'") }
|
243
|
+
else
|
244
|
+
perform_assertion { assert_equal(element_value(select), option_value, "Select #{select_name}'s value is not equal to expected: '#{option_value}'") }
|
245
|
+
end
|
186
246
|
}
|
187
247
|
end
|
188
248
|
|
@@ -195,24 +255,31 @@ module RWebSpec
|
|
195
255
|
# radio_group is the name field, radio options 'value' field
|
196
256
|
def assert_radio_option_not_present(radio_group, radio_option)
|
197
257
|
@web_browser.radios.each { |radio|
|
198
|
-
|
199
|
-
|
258
|
+
the_element_name = element_name(radio)
|
259
|
+
if (the_element_name == radio_group) then
|
260
|
+
perform_assertion { assert(!(radio_option == element_value(radio) ), "unexpected radio option: " + radio_option + " found") }
|
200
261
|
end
|
201
262
|
}
|
202
263
|
end
|
203
264
|
|
204
265
|
def assert_radio_option_present(radio_group, radio_option)
|
205
266
|
@web_browser.radios.each { |radio|
|
206
|
-
|
267
|
+
the_element_name = element_name(radio)
|
268
|
+
return if (the_element_name == radio_group) and (radio_option == element_value(radio) )
|
207
269
|
}
|
208
270
|
fail("can't find the radio option : '#{radio_option}'")
|
209
271
|
end
|
210
272
|
|
211
273
|
def assert_radio_option_selected(radio_group, radio_option)
|
212
274
|
@web_browser.radios.each { |radio|
|
213
|
-
|
214
|
-
|
215
|
-
|
275
|
+
the_element_name = element_name(radio)
|
276
|
+
if (the_element_name == radio_group and radio_option == element_value(radio) ) then
|
277
|
+
if is_selenium_element?(radio)
|
278
|
+
perform_assertion { assert(radio.selected?, "Radio button #{radio_group}-[#{radio_option}] not checked") }
|
279
|
+
else
|
280
|
+
perform_assertion { assert(radio.set?, "Radio button #{radio_group}-[#{radio_option}] not checked") }
|
281
|
+
end
|
282
|
+
end
|
216
283
|
}
|
217
284
|
end
|
218
285
|
|
@@ -221,8 +288,13 @@ module RWebSpec
|
|
221
288
|
|
222
289
|
def assert_radio_option_not_selected(radio_group, radio_option)
|
223
290
|
@web_browser.radios.each { |radio|
|
224
|
-
|
225
|
-
|
291
|
+
the_element_name = element_name(radio)
|
292
|
+
if (the_element_name == radio_group and radio_option == element_value(radio) ) then
|
293
|
+
if is_selenium_element?(radio)
|
294
|
+
perform_assertion { assert(!radio.selected?, "Radio button #{radio_group}-[#{radio_option}] checked unexpected") }
|
295
|
+
else
|
296
|
+
perform_assertion { assert(!radio.set?, "Radio button #{radio_group}-[#{radio_option}] checked unexpected") }
|
297
|
+
end
|
226
298
|
end
|
227
299
|
}
|
228
300
|
end
|
@@ -234,26 +306,28 @@ module RWebSpec
|
|
234
306
|
# Button
|
235
307
|
def assert_button_not_present(button_id)
|
236
308
|
@web_browser.buttons.each { |button|
|
237
|
-
|
309
|
+
the_button_id = RWebSpec.framework == "Watir" ? button.id : button["id"]
|
310
|
+
perform_assertion { assert(the_button_id != button_id, "unexpected button id: #{button_id} found") }
|
238
311
|
}
|
239
312
|
end
|
240
313
|
|
241
314
|
def assert_button_not_present_with_text(text)
|
242
315
|
@web_browser.buttons.each { |button|
|
243
|
-
perform_assertion { assert(button
|
316
|
+
perform_assertion { assert(element_value(button) != text, "unexpected button id: #{text} found") }
|
244
317
|
}
|
245
318
|
end
|
246
319
|
|
247
320
|
def assert_button_present(button_id)
|
248
321
|
@web_browser.buttons.each { |button|
|
249
|
-
|
322
|
+
the_button_id = RWebSpec.framework == "Watir" ? button.id : button["id"]
|
323
|
+
return if button_id == the_button_id
|
250
324
|
}
|
251
325
|
fail("can't find the button with id: #{button_id}")
|
252
326
|
end
|
253
327
|
|
254
328
|
def assert_button_present_with_text(button_text)
|
255
|
-
@web_browser.buttons.each { |button|
|
256
|
-
return if button_text == button
|
329
|
+
@web_browser.buttons.each { |button|
|
330
|
+
return if button_text == element_value(button)
|
257
331
|
}
|
258
332
|
fail("can't find the button with text: #{button_text}")
|
259
333
|
end
|
@@ -269,7 +343,12 @@ module RWebSpec
|
|
269
343
|
# assert_exists("label", "receipt_date")
|
270
344
|
# assert_exists(:span, :receipt_date)
|
271
345
|
def assert_exists(tag, element_id)
|
272
|
-
|
346
|
+
if RWebSpec.framework == "Watir"
|
347
|
+
perform_assertion { assert(eval("#{tag}(:id, '#{element_id.to_s}').exists?"), "Element '#{tag}' with id: '#{element_id}' not found") }
|
348
|
+
else
|
349
|
+
perform_assertion { assert( @web_browser.driver.find_element(:tag_name => tag, :id => element_id))}
|
350
|
+
end
|
351
|
+
|
273
352
|
end
|
274
353
|
|
275
354
|
alias assert_exists? assert_exists
|
@@ -350,7 +429,12 @@ module RWebSpec
|
|
350
429
|
# assert_text_field_value("text1", "text already there") => true
|
351
430
|
#
|
352
431
|
def assert_text_field_value(textfield_name, text)
|
353
|
-
|
432
|
+
if RWebSpec.framework == "Watir"
|
433
|
+
perform_assertion { assert_equal(text, text_field(:name, textfield_name).value) }
|
434
|
+
else
|
435
|
+
the_element = @web_browser.driver.find_element(:name, textfield_name)
|
436
|
+
perform_assertion { assert_equal(text, element_value(the_element)) }
|
437
|
+
end
|
354
438
|
end
|
355
439
|
|
356
440
|
|
@@ -373,9 +457,9 @@ module RWebSpec
|
|
373
457
|
|
374
458
|
private
|
375
459
|
def table_source(table_id, options)
|
376
|
-
elem_table = table(:id, table_id.to_s)
|
460
|
+
elem_table = RWebSpec.framework == "Watir" ? table(:id, table_id.to_s) : @web_browser.driver.find_element(:id => table_id)
|
377
461
|
elem_table_text = elem_table.text
|
378
|
-
elem_table_html =
|
462
|
+
elem_table_html = RWebSpec.framework == "Watir" ? elem_table.html : elem_table["innerHTML"];
|
379
463
|
table_source = options[:just_plain_text] ? elem_table_text : elem_table_html
|
380
464
|
end
|
381
465
|
|
@@ -40,8 +40,8 @@ module RWebSpec
|
|
40
40
|
alias try_until try_for
|
41
41
|
|
42
42
|
def try(timeout = $testwise_polling_timeout, polling_interval = $testwise_polling_interval || 1, &block)
|
43
|
-
puts "Warning: method 'try' is deprecated (won't support in RWebSpec 3), use
|
44
|
-
|
43
|
+
puts "Warning: method 'try' is deprecated (won't support in RWebSpec 3), use try_for instead."
|
44
|
+
try_for(timeout, polling_interval) {
|
45
45
|
yield
|
46
46
|
}
|
47
47
|
end
|
@@ -92,42 +92,6 @@ module RWebSpec
|
|
92
92
|
end
|
93
93
|
|
94
94
|
|
95
|
-
|
96
|
-
# use win32screenshot library to save curernt active window, which shall be IE
|
97
|
-
#
|
98
|
-
# opts[:to_dir] => the direcotry to save image under
|
99
|
-
def take_screenshot(opts = {})
|
100
|
-
# puts "calling new take screenshot: #{$screenshot_supported}"
|
101
|
-
unless $screenshot_supported
|
102
|
-
puts " [WARN] Screenhost not supported, check whether win32screenshot gem is installed"
|
103
|
-
return
|
104
|
-
end
|
105
|
-
|
106
|
-
begin
|
107
|
-
screenshot_image_filename = "screenshot_" + Time.now.strftime("%m%d%H%M%S") + ".jpg"
|
108
|
-
the_dump_dir = opts[:to_dir] || default_dump_dir
|
109
|
-
FileUtils.mkdir_p(the_dump_dir) unless File.exists?(the_dump_dir)
|
110
|
-
screenshot_image_filepath = File.join(the_dump_dir, screenshot_image_filename)
|
111
|
-
screenshot_image_filepath.gsub!("/", "\\") if is_windows?
|
112
|
-
|
113
|
-
FileUtils.rm_f(screenshot_image_filepath) if File.exist?(screenshot_image_filepath)
|
114
|
-
|
115
|
-
if is_firefox? then
|
116
|
-
Win32::Screenshot::Take.of(:window, :title => /mozilla\sfirefox/i).write(screenshot_image_filepath)
|
117
|
-
elsif ie
|
118
|
-
Win32::Screenshot::Take.of(:window, :title => /internet\sexplorer/i).write(screenshot_image_filepath)
|
119
|
-
else
|
120
|
-
Win32::Screenshot::Take.of(:foreground).write(screenshot_image_filepath)
|
121
|
-
end
|
122
|
-
notify_screenshot_location(screenshot_image_filepath)
|
123
|
-
rescue ::DL::DLTypeError => de
|
124
|
-
puts "No screenshot libray found: #{de}"
|
125
|
-
rescue => e
|
126
|
-
puts "error on taking screenshot: #{e}"
|
127
|
-
end
|
128
|
-
|
129
|
-
end
|
130
|
-
|
131
95
|
#= Convenient functions
|
132
96
|
#
|
133
97
|
|
@@ -29,7 +29,7 @@ module RWebSpec
|
|
29
29
|
# 1. pass as first argument
|
30
30
|
# 2. If running using TestWise, used as confiured
|
31
31
|
# 3. Use default value set
|
32
|
-
def open_browser(
|
32
|
+
def open_browser(options = {})
|
33
33
|
|
34
34
|
begin
|
35
35
|
support_unicode
|
@@ -38,7 +38,12 @@ module RWebSpec
|
|
38
38
|
end
|
39
39
|
|
40
40
|
base_url ||= $TESTWISE_PROJECT_BASE_URL
|
41
|
-
|
41
|
+
if options && options.class == String
|
42
|
+
base_url ||= options
|
43
|
+
elsif options && options.class == Hash && options[:base_url]
|
44
|
+
base_url ||= options[:base_url]
|
45
|
+
end
|
46
|
+
|
42
47
|
base_url ||= $BASE_URL
|
43
48
|
raise "base_url must be set" if base_url.nil?
|
44
49
|
|
@@ -50,7 +55,7 @@ module RWebSpec
|
|
50
55
|
:go => true}
|
51
56
|
|
52
57
|
options = default_options.merge options
|
53
|
-
($TESTWISE_HIDE_BROWSER
|
58
|
+
($TESTWISE_HIDE_BROWSER) ? $HIDE_IE = true : $HIDE_IE = false
|
54
59
|
|
55
60
|
if base_url =~ /^file:/
|
56
61
|
uri_base = base_url
|
@@ -152,7 +157,7 @@ module RWebSpec
|
|
152
157
|
|
153
158
|
# Go to another page on the testing site.
|
154
159
|
#
|
155
|
-
# open_browser("http://www.itest2.com")
|
160
|
+
# open_browser(:base_url => "http://www.itest2.com")
|
156
161
|
# goto_page("/demo") # visit page http://www.itest2.com/demo
|
157
162
|
#
|
158
163
|
def goto_page(page)
|
@@ -165,7 +170,7 @@ module RWebSpec
|
|
165
170
|
|
166
171
|
# Go to another web site, normally different site being tested on
|
167
172
|
#
|
168
|
-
# open_browser("http://www.itest2.com")
|
173
|
+
# open_browser(:base_url => "http://www.itest2.com")
|
169
174
|
# goto_url("http://myorganized.info")
|
170
175
|
def goto_url(url)
|
171
176
|
@web_browser.goto_url url
|
@@ -751,6 +756,58 @@ module RWebSpec
|
|
751
756
|
def basic_authentication(username, password, options = {})
|
752
757
|
basic_authentication_ie(options[:title], username, password, options)
|
753
758
|
end
|
759
|
+
|
760
|
+
# TODO: Common driver module => this is shared by both Watir and Selenium
|
761
|
+
#
|
762
|
+
|
763
|
+
|
764
|
+
# TODO: Common driver module => this is shared by both Watir and Selenium
|
765
|
+
#
|
766
|
+
|
767
|
+
# use win32screenshot library or Selenium to save curernt active window
|
768
|
+
#
|
769
|
+
# opts[:to_dir] => the direcotry to save image under
|
770
|
+
def take_screenshot(to_file = nil, opts = {})
|
771
|
+
# puts "calling new take screenshot: #{$screenshot_supported}"
|
772
|
+
# unless $screenshot_supported
|
773
|
+
# puts " [WARN] Screenhost not supported, check whether win32screenshot gem is installed"
|
774
|
+
# return
|
775
|
+
# end
|
776
|
+
|
777
|
+
if to_file
|
778
|
+
screenshot_image_filepath = to_file
|
779
|
+
else
|
780
|
+
screenshot_image_filename = "screenshot_" + Time.now.strftime("%m%d%H%M%S") + ".jpg"
|
781
|
+
the_dump_dir = opts[:to_dir] || default_dump_dir
|
782
|
+
FileUtils.mkdir_p(the_dump_dir) unless File.exists?(the_dump_dir)
|
783
|
+
screenshot_image_filepath = File.join(the_dump_dir, screenshot_image_filename)
|
784
|
+
screenshot_image_filepath.gsub!("/", "\\") if is_windows?
|
785
|
+
|
786
|
+
FileUtils.rm_f(screenshot_image_filepath) if File.exist?(screenshot_image_filepath)
|
787
|
+
end
|
788
|
+
|
789
|
+
if RWebSpec.framework == "Watir"
|
790
|
+
begin
|
791
|
+
if is_firefox? then
|
792
|
+
Win32::Screenshot::Take.of(:window, :title => /mozilla\sfirefox/i).write(screenshot_image_filepath)
|
793
|
+
elsif ie
|
794
|
+
Win32::Screenshot::Take.of(:window, :title => /internet\sexplorer/i).write(screenshot_image_filepath)
|
795
|
+
else
|
796
|
+
Win32::Screenshot::Take.of(:foreground).write(screenshot_image_filepath)
|
797
|
+
end
|
798
|
+
notify_screenshot_location(screenshot_image_filepath)
|
799
|
+
rescue ::DL::DLTypeError => de
|
800
|
+
puts "No screenshot libray found: #{de}"
|
801
|
+
rescue => e
|
802
|
+
puts "error on taking screenshot: #{e}"
|
803
|
+
end
|
804
|
+
else
|
805
|
+
# save screenshot with selenium
|
806
|
+
@web_browser.driver.save_screenshot(screenshot_image_filepath)
|
807
|
+
notify_screenshot_location(screenshot_image_filepath)
|
808
|
+
end
|
809
|
+
|
810
|
+
end
|
754
811
|
|
755
812
|
# end of methods
|
756
813
|
|
@@ -295,7 +295,7 @@ module RWebSpec
|
|
295
295
|
|
296
296
|
# Go to a page
|
297
297
|
# Usage:
|
298
|
-
# open_browser("http://www.itest2.com"
|
298
|
+
# open_browser(:base_url => "http://www.itest2.com")
|
299
299
|
# ....
|
300
300
|
# goto_page("/purchase") # full url => http://www.itest.com/purchase
|
301
301
|
def goto_page(page)
|
@@ -29,8 +29,9 @@ module RWebSpec
|
|
29
29
|
#
|
30
30
|
# New Options:
|
31
31
|
# :browser => :ie | :firefox | :chrome
|
32
|
-
def open_browser(
|
32
|
+
def open_browser(options = {})
|
33
33
|
# puts "[DEBUG] [SeleniumDriver] Callling open_browser #{base_url}"
|
34
|
+
|
34
35
|
begin
|
35
36
|
support_unicode
|
36
37
|
rescue => e
|
@@ -38,6 +39,11 @@ module RWebSpec
|
|
38
39
|
end
|
39
40
|
|
40
41
|
base_url ||= $TESTWISE_PROJECT_BASE_URL
|
42
|
+
if options && options.class == String
|
43
|
+
base_url ||= options
|
44
|
+
elsif options && options.class == Hash && options[:base_url]
|
45
|
+
base_url ||= options[:base_url]
|
46
|
+
end
|
41
47
|
base_url ||= $BASE_URL
|
42
48
|
raise "base_url must be set" if base_url.nil?
|
43
49
|
|
@@ -80,7 +86,8 @@ module RWebSpec
|
|
80
86
|
end
|
81
87
|
|
82
88
|
# remembering browser handle for debugging need
|
83
|
-
$browser = @web_browser
|
89
|
+
$browser = @web_browser
|
90
|
+
|
84
91
|
return @web_browser
|
85
92
|
end
|
86
93
|
|
@@ -179,7 +186,7 @@ module RWebSpec
|
|
179
186
|
|
180
187
|
# Go to another page on the testing site.
|
181
188
|
#
|
182
|
-
# open_browser("http://www.itest2.com")
|
189
|
+
# open_browser(:base_url => "http://www.itest2.com")
|
183
190
|
# goto_page("/demo") # visit page http://www.itest2.com/demo
|
184
191
|
#
|
185
192
|
def goto_page(page)
|
@@ -191,7 +198,7 @@ module RWebSpec
|
|
191
198
|
|
192
199
|
# Go to another web site, normally different site being tested on
|
193
200
|
#
|
194
|
-
# open_browser("http://www.itest2.com")
|
201
|
+
# open_browser(:base_url => "http://www.itest2.com")
|
195
202
|
# goto_url("http://myorganized.info")
|
196
203
|
def goto_url(url)
|
197
204
|
puts "Calling web_browser goto: #{@web_browser.inspect}"
|
@@ -394,6 +401,8 @@ module RWebSpec
|
|
394
401
|
else
|
395
402
|
to_dir = ENV['TEMP_DIR'] || (is_windows? ? "C:\\temp" : "/tmp")
|
396
403
|
end
|
404
|
+
puts "Save screenshot to default dir: #{to_dir}"
|
405
|
+
return to_dir
|
397
406
|
end
|
398
407
|
|
399
408
|
# For current page souce to a file in specified folder for inspection
|
@@ -741,5 +750,56 @@ module RWebSpec
|
|
741
750
|
basic_authentication_ie(options[:title], username, password, options)
|
742
751
|
end
|
743
752
|
|
753
|
+
|
754
|
+
|
755
|
+
# TODO: Common driver module => this is shared by both Watir and Selenium
|
756
|
+
#
|
757
|
+
|
758
|
+
# use win32screenshot library or Selenium to save curernt active window
|
759
|
+
#
|
760
|
+
# opts[:to_dir] => the direcotry to save image under
|
761
|
+
def take_screenshot(to_file = nil, opts = {})
|
762
|
+
# puts "calling new take screenshot: #{$screenshot_supported}"
|
763
|
+
# unless $screenshot_supported
|
764
|
+
# puts " [WARN] Screenhost not supported, check whether win32screenshot gem is installed"
|
765
|
+
# return
|
766
|
+
# end
|
767
|
+
|
768
|
+
if to_file
|
769
|
+
screenshot_image_filepath = to_file
|
770
|
+
else
|
771
|
+
screenshot_image_filename = "screenshot_" + Time.now.strftime("%m%d%H%M%S") + ".jpg"
|
772
|
+
the_dump_dir = opts[:to_dir] || default_dump_dir
|
773
|
+
FileUtils.mkdir_p(the_dump_dir) unless File.exists?(the_dump_dir)
|
774
|
+
screenshot_image_filepath = File.join(the_dump_dir, screenshot_image_filename)
|
775
|
+
screenshot_image_filepath.gsub!("/", "\\") if is_windows?
|
776
|
+
|
777
|
+
FileUtils.rm_f(screenshot_image_filepath) if File.exist?(screenshot_image_filepath)
|
778
|
+
end
|
779
|
+
|
780
|
+
if RWebSpec.framework == "Watir"
|
781
|
+
begin
|
782
|
+
if is_firefox? then
|
783
|
+
Win32::Screenshot::Take.of(:window, :title => /mozilla\sfirefox/i).write(screenshot_image_filepath)
|
784
|
+
elsif ie
|
785
|
+
Win32::Screenshot::Take.of(:window, :title => /internet\sexplorer/i).write(screenshot_image_filepath)
|
786
|
+
else
|
787
|
+
Win32::Screenshot::Take.of(:foreground).write(screenshot_image_filepath)
|
788
|
+
end
|
789
|
+
notify_screenshot_location(screenshot_image_filepath)
|
790
|
+
rescue ::DL::DLTypeError => de
|
791
|
+
puts "No screenshot libray found: #{de}"
|
792
|
+
rescue => e
|
793
|
+
puts "error on taking screenshot: #{e}"
|
794
|
+
end
|
795
|
+
else
|
796
|
+
# save screenshot with selenium
|
797
|
+
@web_browser.driver.save_screenshot(screenshot_image_filepath)
|
798
|
+
notify_screenshot_location(screenshot_image_filepath)
|
799
|
+
end
|
800
|
+
|
801
|
+
end
|
802
|
+
|
803
|
+
|
744
804
|
end
|
745
805
|
end
|
@@ -37,8 +37,16 @@ module RWebSpec
|
|
37
37
|
when "ie"
|
38
38
|
initialize_ie_browser(existing_browser, options)
|
39
39
|
when "htmlunit"
|
40
|
-
|
40
|
+
initialize_htmlunit_browser(base_url, options)
|
41
41
|
end
|
42
|
+
|
43
|
+
begin
|
44
|
+
if options[:resize_to] && options[:resize_to].class == Array
|
45
|
+
@browser.manage.window.resize_to(options[:resize_to][0], options[:resize_to][1])
|
46
|
+
end
|
47
|
+
rescue => e
|
48
|
+
puts "[ERROR] failed to resize => #{options[:resize_to]}"
|
49
|
+
end
|
42
50
|
end
|
43
51
|
|
44
52
|
def initialize_firefox_browser(existing_browser, base_url, options)
|
@@ -83,7 +91,7 @@ module RWebSpec
|
|
83
91
|
else
|
84
92
|
@browser.speed = :zippy
|
85
93
|
end
|
86
|
-
return
|
94
|
+
return @browser
|
87
95
|
end
|
88
96
|
|
89
97
|
@browser = Selenium::WebDriver.for :ie
|
@@ -101,6 +109,7 @@ module RWebSpec
|
|
101
109
|
# else
|
102
110
|
# puts "close other browser instances not working yet in Ruby 1.9.1 version of Watir"
|
103
111
|
# end
|
112
|
+
|
104
113
|
end
|
105
114
|
|
106
115
|
# TODO resuse not working yet
|
@@ -258,12 +267,43 @@ module RWebSpec
|
|
258
267
|
end
|
259
268
|
end
|
260
269
|
|
261
|
-
|
270
|
+
# :links => removed
|
271
|
+
# :checkboxes => removed
|
272
|
+
# :radios => removed
|
273
|
+
# :select_lists => removed
|
274
|
+
# :buttons => removed
|
275
|
+
# :divs => removed
|
276
|
+
[:images, :text_fields, :dls, :dds, :dts, :ems, :lis, :maps, :spans, :strongs, :ps, :pres, :labels].each do |method|
|
262
277
|
define_method method do
|
263
278
|
@browser.send(method)
|
264
279
|
end
|
265
280
|
end
|
266
281
|
|
282
|
+
def links
|
283
|
+
@browser.find_elements(:tag_name, "a")
|
284
|
+
end
|
285
|
+
|
286
|
+
def checkboxes
|
287
|
+
@browser.find_elements(:xpath, "//input[@type='checkbox']")
|
288
|
+
end
|
289
|
+
|
290
|
+
def radios
|
291
|
+
@browser.find_elements(:xpath, "//input[@type='radio']")
|
292
|
+
end
|
293
|
+
|
294
|
+
def select_lists
|
295
|
+
@browser.find_elements(:tag_name, "select")
|
296
|
+
end
|
297
|
+
|
298
|
+
def buttons
|
299
|
+
button_array = @browser.find_elements(:tag_name, "button") + @browser.find_elements(:xpath, "//input[@type='submit']") + @browser.find_elements(:xpath, "//input[@type='button']")
|
300
|
+
return button_array
|
301
|
+
end
|
302
|
+
|
303
|
+
def divs
|
304
|
+
@browser.find_elements(:tag_name, "divs")
|
305
|
+
end
|
306
|
+
|
267
307
|
# current url
|
268
308
|
def current_url
|
269
309
|
@browser.current_url
|
@@ -373,7 +413,7 @@ module RWebSpec
|
|
373
413
|
|
374
414
|
# Go to a page
|
375
415
|
# Usage:
|
376
|
-
# open_browser("http://www.itest2.com"
|
416
|
+
# open_browser(:base_url => "http://www.itest2.com")
|
377
417
|
# ....
|
378
418
|
# goto_page("/purchase") # full url => http://www.itest.com/purchase
|
379
419
|
def goto_page(page)
|
@@ -435,8 +475,17 @@ module RWebSpec
|
|
435
475
|
# Click a button with give HTML id
|
436
476
|
# Usage:
|
437
477
|
# click_button_with_id("btn_sumbit")
|
478
|
+
# click_button_with_id("btn_sumbit", :index => 2) # the secone link with same id, not good gractice in HTML
|
438
479
|
def click_button_with_id(id, opts = {})
|
439
|
-
|
480
|
+
if opts && opts[:index] && opts[:index].to_i() > 0
|
481
|
+
elements = find_elements(:id, id)
|
482
|
+
the_index = opts[:index].to_i() - 1
|
483
|
+
first_match = elements[the_index]
|
484
|
+
first_match.click
|
485
|
+
else
|
486
|
+
find_element(:id, id).click
|
487
|
+
end
|
488
|
+
|
440
489
|
end
|
441
490
|
|
442
491
|
# Click a button with give name
|
@@ -459,14 +508,15 @@ module RWebSpec
|
|
459
508
|
if matching_buttons.size > 0
|
460
509
|
|
461
510
|
if opts && opts[:index]
|
462
|
-
|
463
|
-
|
511
|
+
the_index = opts[:index].to_i() - 1
|
512
|
+
puts "Call matching buttons: #{matching_buttons.inspect} => #{the_index}"
|
513
|
+
first_match = matching_buttons[the_index]
|
464
514
|
first_match.click
|
515
|
+
else
|
516
|
+
the_button = matching_buttons[0]
|
517
|
+
the_button.click
|
465
518
|
end
|
466
519
|
|
467
|
-
the_button = matching_buttons[0]
|
468
|
-
the_button.click
|
469
|
-
|
470
520
|
else
|
471
521
|
raise "No button with value: #{caption} found"
|
472
522
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rwebspec
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 4.1.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire: rwebspec
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date:
|
12
|
+
date: 2013-01-01 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rspec
|
@@ -32,7 +32,7 @@ dependencies:
|
|
32
32
|
requirement: !ruby/object:Gem::Requirement
|
33
33
|
none: false
|
34
34
|
requirements:
|
35
|
-
- -
|
35
|
+
- - '='
|
36
36
|
- !ruby/object:Gem::Version
|
37
37
|
version: 2.10.1
|
38
38
|
type: :runtime
|
@@ -40,7 +40,7 @@ dependencies:
|
|
40
40
|
version_requirements: !ruby/object:Gem::Requirement
|
41
41
|
none: false
|
42
42
|
requirements:
|
43
|
-
- -
|
43
|
+
- - '='
|
44
44
|
- !ruby/object:Gem::Version
|
45
45
|
version: 2.10.1
|
46
46
|
- !ruby/object:Gem::Dependency
|
@@ -59,6 +59,22 @@ dependencies:
|
|
59
59
|
- - ! '>='
|
60
60
|
- !ruby/object:Gem::Version
|
61
61
|
version: '3.0'
|
62
|
+
- !ruby/object:Gem::Dependency
|
63
|
+
name: selenium-webdriver
|
64
|
+
requirement: !ruby/object:Gem::Requirement
|
65
|
+
none: false
|
66
|
+
requirements:
|
67
|
+
- - ! '>='
|
68
|
+
- !ruby/object:Gem::Version
|
69
|
+
version: '0'
|
70
|
+
type: :runtime
|
71
|
+
prerelease: false
|
72
|
+
version_requirements: !ruby/object:Gem::Requirement
|
73
|
+
none: false
|
74
|
+
requirements:
|
75
|
+
- - ! '>='
|
76
|
+
- !ruby/object:Gem::Version
|
77
|
+
version: '0'
|
62
78
|
description: Executable functional specification for web applications in RSpec syntax
|
63
79
|
with Watir or Selenium
|
64
80
|
email: zhimin@agileway.com.au
|