rwebspec 1.9 → 1.9.2
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG +8 -2
- data/Rakefile +3 -3
- data/lib/rwebspec/driver.rb +8 -30
- data/lib/rwebspec/rspec_helper.rb +1 -1
- data/lib/rwebspec/test_utils.rb +5 -1
- data/lib/rwebspec/testwise_plugin.rb +92 -82
- data/lib/rwebspec/web_browser.rb +8 -16
- data/lib/rwebspec/web_page.rb +2 -2
- metadata +7 -7
data/CHANGELOG
CHANGED
data/Rakefile
CHANGED
@@ -70,9 +70,9 @@ end
|
|
70
70
|
spec = Gem::Specification.new do |s|
|
71
71
|
s.platform= Gem::Platform::RUBY
|
72
72
|
s.name = "rwebspec"
|
73
|
-
s.version = "1.9"
|
73
|
+
s.version = "1.9.2"
|
74
74
|
s.summary = "Executable functional specification for web applications in RSpec syntax and Watir"
|
75
|
-
|
75
|
+
s.description = "Executable functional specification for web applications in RSpec syntax and Watir"
|
76
76
|
|
77
77
|
s.author = "Zhimin Zhan"
|
78
78
|
s.email = "zhimin@agileway.com.au"
|
@@ -91,7 +91,7 @@ spec = Gem::Specification.new do |s|
|
|
91
91
|
s.files = s.files + Dir.glob( "docs/**/*" )
|
92
92
|
s.add_dependency(%q<rspec>, ["= 1.1.12"])
|
93
93
|
|
94
|
-
s.add_dependency("commonwatir", ">=
|
94
|
+
s.add_dependency("commonwatir", ">= 2.0")
|
95
95
|
end
|
96
96
|
|
97
97
|
Rake::GemPackageTask.new(spec) do |pkg|
|
data/lib/rwebspec/driver.rb
CHANGED
@@ -41,6 +41,7 @@ module RWebSpec
|
|
41
41
|
puts "Unicode may not work in IE, #{e}"
|
42
42
|
end
|
43
43
|
|
44
|
+
base_url ||= $TESTWISE_PROJECT_BASE_URL
|
44
45
|
base_url ||= $ITEST2_PROJECT_BASE_URL
|
45
46
|
base_url ||= $BASE_URL
|
46
47
|
raise "base_url must be set" if base_url.nil?
|
@@ -53,8 +54,8 @@ module RWebSpec
|
|
53
54
|
:go => true}
|
54
55
|
|
55
56
|
options = default_options.merge options
|
56
|
-
options[:firefox] = true if "Firefox" == $ITEST2_BROWSER || "Firefox" == $BROWSER
|
57
|
-
($ITEST2_HIDE_BROWSER) ? $HIDE_IE = true : $HIDE_IE = false
|
57
|
+
options[:firefox] = true if "Firefox" == $ITEST2_BROWSER || "Firefox" == $TESTWISE_BROWSER || "Firefox" == $BROWSER
|
58
|
+
($TESTWISE_HIDE_BROWSER || $ITEST2_HIDE_BROWSER) ? $HIDE_IE = true : $HIDE_IE = false
|
58
59
|
|
59
60
|
if base_url =~ /^file:/
|
60
61
|
uri_base = base_url
|
@@ -196,7 +197,7 @@ module RWebSpec
|
|
196
197
|
if url && url =~ /^http/
|
197
198
|
http_response = client.get(url).body
|
198
199
|
else
|
199
|
-
base_url = $ITEST2_PROJECT_BASE_URL || $BASE_URL
|
200
|
+
base_url = $TESTWISE_PROJECT_BASE_URL || $ITEST2_PROJECT_BASE_URL || $BASE_URL
|
200
201
|
http_response = client.get("#{base_url}#{url}").body
|
201
202
|
end
|
202
203
|
|
@@ -397,14 +398,14 @@ module RWebSpec
|
|
397
398
|
end
|
398
399
|
|
399
400
|
def default_dump_dir
|
400
|
-
if $ITEST2_RUNNING_SPEC_ID && $ITEST2_WORKING_DIR
|
401
|
+
if ($TESTWISE_RUNNING_SPEC_ID && $TESTWISE_WORKING_DIR) || ($ITEST2_RUNNING_SPEC_ID && $ITEST2_WORKING_DIR)
|
401
402
|
|
402
|
-
$ITEST2_DUMP_DIR = File.join($ITEST2_WORKING_DIR, "dump")
|
403
|
+
$TESTWISE_DUMP_DIR = $ITEST2_DUMP_DIR = File.join($ITEST2_WORKING_DIR, "dump")
|
403
404
|
FileUtils.mkdir($ITEST2_DUMP_DIR) unless File.exists?($ITEST2_DUMP_DIR)
|
404
405
|
|
405
|
-
spec_run_id = $ITEST2_RUNNING_SPEC_ID
|
406
|
+
spec_run_id = $TESTWISE_RUNNING_SPEC_ID || $ITEST2_RUNNING_SPEC_ID
|
406
407
|
spec_run_dir_name = spec_run_id.to_s.rjust(4, "0") unless spec_run_id == "unknown"
|
407
|
-
to_dir = File.join($
|
408
|
+
to_dir = File.join($TESTWISE_DUMP_DIR, spec_run_dir_name)
|
408
409
|
else
|
409
410
|
to_dir = ENV['TEMP_DIR'] || (is_windows? ? "C:\\temp" : "/tmp")
|
410
411
|
end
|
@@ -973,29 +974,6 @@ module RWebSpec
|
|
973
974
|
end
|
974
975
|
end
|
975
976
|
|
976
|
-
# take_screenshot to save the current active window
|
977
|
-
# TODO can't move mouse
|
978
|
-
def take_screenshot_old
|
979
|
-
if is_windows? && $ITEST2_DUMP_PAGE
|
980
|
-
begin
|
981
|
-
puts "[DEBUG] Capturing screenshots..."
|
982
|
-
screenshot_image_filename = "rwebspec_" + Time.now.strftime("%m%d%H%M%S") + ".jpg"
|
983
|
-
the_dump_dir = default_dump_dir
|
984
|
-
FileUtils.mkdir_p(the_dump_dir) unless File.exists?(the_dump_dir)
|
985
|
-
screenshot_image_filepath = File.join(the_dump_dir, screenshot_image_filename)
|
986
|
-
|
987
|
-
screenshot_image_filepath.gsub!("/", "\\") if is_windows?
|
988
|
-
screen_capture(screenshot_image_filepath, true)
|
989
|
-
|
990
|
-
notify_screenshot_location(screenshot_image_filepath)
|
991
|
-
rescue
|
992
|
-
puts "error: #{Failed to capture screen}"
|
993
|
-
end
|
994
|
-
end
|
995
|
-
end
|
996
|
-
|
997
|
-
|
998
|
-
|
999
977
|
# use win32screenshot library to save curernt active window, which shall be IE
|
1000
978
|
#
|
1001
979
|
def take_screenshot
|
@@ -80,7 +80,7 @@ module RWebSpec
|
|
80
80
|
|
81
81
|
# When running
|
82
82
|
def debugging?
|
83
|
-
$ITEST2_DEBUGGING && $ITEST2_RUNNING_AS == "test_case"
|
83
|
+
($ITEST2_DEBUGGING && $ITEST2_RUNNING_AS == "test_case") || ($TESTWISE_DEBUGGING && $TESTWISE_RUNNING_AS == "test_case")
|
84
84
|
end
|
85
85
|
|
86
86
|
# RSpec Matchers
|
data/lib/rwebspec/test_utils.rb
CHANGED
@@ -133,7 +133,11 @@ module RWebSpec
|
|
133
133
|
# Generate a given number of words. If a range is passed, it will generate
|
134
134
|
# a random number of words within that range.
|
135
135
|
def words(total)
|
136
|
-
|
136
|
+
if total.class == Range
|
137
|
+
(1..interpret_value(total)).map { WORDS[random_number(total.min, total.max)] }.join(' ')
|
138
|
+
else
|
139
|
+
(1..interpret_value(total)).map { WORDS[random_number(0, total)] }.join(' ')
|
140
|
+
end
|
137
141
|
end
|
138
142
|
|
139
143
|
# Generate a given number of sentences. If a range is passed, it will generate
|
@@ -1,83 +1,93 @@
|
|
1
|
-
require 'socket'
|
2
|
-
|
3
|
-
module RWebSpec
|
4
|
-
module TestWisePlugin
|
5
|
-
|
6
|
-
def debug(message)
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
1
|
+
require 'socket'
|
2
|
+
|
3
|
+
module RWebSpec
|
4
|
+
module TestWisePlugin
|
5
|
+
|
6
|
+
def debug(message)
|
7
|
+
Thread.pass
|
8
|
+
connect_to_testwise(" DEBUG", message.to_s + "\r\n") if $RUN_IN_TESTWISE && message
|
9
|
+
end
|
10
|
+
|
11
|
+
|
12
|
+
# Support of iTest to ajust the intervals between keystroke/mouse operations
|
13
|
+
def operation_delay
|
14
|
+
begin
|
15
|
+
if $ITEST2_OPERATION_DELAY && $ITEST2_OPERATION_DELAY > 0 &&
|
16
|
+
$ITEST2_OPERATION_DELAY < 30000 then # max 30 seconds
|
17
|
+
Thread.pass
|
18
|
+
sleep($ITEST2_OPERATION_DELAY / 1000)
|
19
|
+
end
|
20
|
+
|
21
|
+
if $TESTWISE_OPERATION_DELAY && $TESTWISE_OPERATION_DELAY > 0 &&
|
22
|
+
$TESTWISE_OPERATION_DELAY < 30000 then # max 30 seconds
|
23
|
+
Thread.pass
|
24
|
+
sleep($TESTWISE_OPERATION_DELAY / 1000)
|
25
|
+
end
|
26
|
+
|
27
|
+
while $TESTWISE_PAUSE || $ITEST2_PAUSE
|
28
|
+
Thread.pass
|
29
|
+
debug("Paused, waiting ...")
|
30
|
+
sleep 1
|
31
|
+
end
|
32
|
+
rescue => e
|
33
|
+
puts "Error on delaying: #{e}"
|
34
|
+
# ignore
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
def notify_screenshot_location(image_file_path)
|
39
|
+
connect_to_testwise(" SHOT", image_file_path)
|
40
|
+
end
|
41
|
+
|
42
|
+
# find out the line (and file) the execution is on, and notify iTest via Socket
|
43
|
+
def dump_caller_stack
|
44
|
+
return unless ($TESTWISE_TRACE_EXECUTION || $ITEST2_TRACE_EXECUTION)
|
45
|
+
begin
|
46
|
+
trace_lines = []
|
47
|
+
trace_file = nil
|
48
|
+
found_first_spec_reference = false
|
49
|
+
caller.each_with_index do |position, idx|
|
50
|
+
next unless position =~ /\A(.*?):(\d+)/
|
51
|
+
trace_file = $1
|
52
|
+
if trace_file =~ /(_spec|_test|_rwebspec)\.rb\s*$/ || trace_file =~ /\.feature$/
|
53
|
+
found_first_spec_reference = true
|
54
|
+
trace_lines << position
|
55
|
+
break
|
56
|
+
end
|
57
|
+
trace_lines << position
|
58
|
+
break if trace_file =~ /example\/example_methods\.rb$/ or trace_file =~ /example\/example_group_methods\.rb$/
|
59
|
+
break if trace_lines.size > 10
|
60
|
+
# TODO: send multiple trace to be parse with pages.rb
|
61
|
+
# break if trace_file =~ /example\/example_methods\.rb$/ or trace_file =~ /example\/example_group_methods\.rb$/ or trace_file =~ /driver\.rb$/ or trace_file =~ /timeout\.rb$/ # don't include rspec or ruby trace
|
62
|
+
end
|
63
|
+
|
64
|
+
# (trace_file.include?("_spec.rb") || trace_file.include?("_rwebspec.rb") || trace_file.include?("_test.rb") || trace_file.include?("_cmd.rb"))
|
65
|
+
if !trace_lines.empty?
|
66
|
+
connect_to_testwise(" TRACE", trace_lines.reverse.join("|"))
|
67
|
+
end
|
68
|
+
|
69
|
+
rescue => e
|
70
|
+
puts "failed to capture log: #{e}"
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
|
75
|
+
def connect_to_testwise (message_type, body)
|
76
|
+
Thread.pass
|
77
|
+
begin
|
78
|
+
the_message = message_type + "|" + body
|
79
|
+
if @last_message == the_message then # ignore the message same as preivous one
|
80
|
+
return
|
81
|
+
end
|
82
|
+
itest_port = $TESTWISE_TRACE_PORT || $ITEST2_TRACE_PORT || 7025
|
83
|
+
itest_socket = Socket.new(Socket::AF_INET, Socket::SOCK_STREAM, 0)
|
84
|
+
itest_socket.connect(Socket.pack_sockaddr_in(itest_port, '127.0.0.1'))
|
85
|
+
itest_socket.puts(the_message)
|
86
|
+
@last_message = the_message
|
87
|
+
itest_socket.close
|
88
|
+
rescue => e
|
89
|
+
end
|
90
|
+
end
|
91
|
+
|
92
|
+
end
|
83
93
|
end
|
data/lib/rwebspec/web_browser.rb
CHANGED
@@ -111,24 +111,16 @@ module RWebSpec
|
|
111
111
|
end
|
112
112
|
|
113
113
|
def initialize_ie_browser(existing_browser, options)
|
114
|
-
|
115
|
-
|
116
|
-
if $
|
117
|
-
|
118
|
-
@browser.set_fast_speed if $ITEST2_TYPING_SPEED == 'fast'
|
119
|
-
else
|
120
|
-
@browser.speed = :zippy
|
121
|
-
end
|
122
|
-
return
|
123
|
-
end
|
124
|
-
|
125
|
-
@browser = Watir::IE.new
|
126
|
-
if $ITEST2_EMULATE_TYPING && $ITEST2_TYPING_SPEED then
|
127
|
-
@browser.set_slow_speed if $ITEST2_TYPING_SPEED == 'slow'
|
128
|
-
@browser.set_fast_speed if $ITEST2_TYPING_SPEED == 'fast'
|
114
|
+
@browser = existing_browser || Watir::IE.new
|
115
|
+
if ($TESTWISE_EMULATE_TYPING && $TESTWISE_TYPING_SPEED) || ($ITEST2_EMULATE_TYPING && $ITEST2_TYPING_SPEED) then
|
116
|
+
@browser.set_slow_speed if $TESTWISE_TYPING_SPEED == "slow" || $ITEST2_TYPING_SPEED == 'slow'
|
117
|
+
@browser.set_fast_speed if $TESTWISE_TYPING_SPEED == 'fast' || $ITEST2_TYPING_SPEED == 'fast'
|
129
118
|
else
|
130
119
|
@browser.speed = :zippy
|
131
120
|
end
|
121
|
+
|
122
|
+
return if existing_browser
|
123
|
+
|
132
124
|
@browser.activeObjectHighLightColor = options[:highlight_colour]
|
133
125
|
@browser.visible = options[:visible] unless $HIDE_IE
|
134
126
|
#NOTE: close_others fails
|
@@ -144,7 +136,7 @@ module RWebSpec
|
|
144
136
|
end
|
145
137
|
|
146
138
|
def self.reuse(base_url, options)
|
147
|
-
if self.is_windows? && $ITEST2_BROWSER != "Firefox"
|
139
|
+
if self.is_windows? && ($TESTWISE_BROWSER != "Firefox" && $ITEST2_BROWSER != "Firefox")
|
148
140
|
Watir::IE.each do |browser_window|
|
149
141
|
return WebBrowser.new(base_url, browser_window, options)
|
150
142
|
end
|
data/lib/rwebspec/web_page.rb
CHANGED
@@ -34,8 +34,8 @@ module RWebSpec
|
|
34
34
|
@web_tester = the_browser
|
35
35
|
@page_specific_text = page_specific_text
|
36
36
|
begin
|
37
|
-
snapshot if $ITEST2_DUMP_PAGE
|
38
|
-
delay = $ITEST2_PAGE_DELAY
|
37
|
+
snapshot if $TESTWISE_DUMP_PAGE || $ITEST2_DUMP_PAGE
|
38
|
+
delay = $TESTWISE_PAGE_DELAY || $ITEST2_PAGE_DELAY
|
39
39
|
sleep(delay)
|
40
40
|
rescue => e
|
41
41
|
end
|
metadata
CHANGED
@@ -5,7 +5,8 @@ version: !ruby/object:Gem::Version
|
|
5
5
|
segments:
|
6
6
|
- 1
|
7
7
|
- 9
|
8
|
-
|
8
|
+
- 2
|
9
|
+
version: 1.9.2
|
9
10
|
platform: ruby
|
10
11
|
authors:
|
11
12
|
- Zhimin Zhan
|
@@ -13,7 +14,7 @@ autorequire: rwebspec
|
|
13
14
|
bindir: bin
|
14
15
|
cert_chain: []
|
15
16
|
|
16
|
-
date: 2011-08-
|
17
|
+
date: 2011-08-18 00:00:00 +10:00
|
17
18
|
default_executable:
|
18
19
|
dependencies:
|
19
20
|
- !ruby/object:Gem::Dependency
|
@@ -38,13 +39,12 @@ dependencies:
|
|
38
39
|
- - ">="
|
39
40
|
- !ruby/object:Gem::Version
|
40
41
|
segments:
|
41
|
-
-
|
42
|
-
-
|
43
|
-
|
44
|
-
version: 1.8.1
|
42
|
+
- 2
|
43
|
+
- 0
|
44
|
+
version: "2.0"
|
45
45
|
type: :runtime
|
46
46
|
version_requirements: *id002
|
47
|
-
description:
|
47
|
+
description: Executable functional specification for web applications in RSpec syntax and Watir
|
48
48
|
email: zhimin@agileway.com.au
|
49
49
|
executables: []
|
50
50
|
|