rwebspec 4.0 → 4.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/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
|