spec_ui 0.1.0 → 0.2.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/Manifest.txt +11 -10
- data/Rakefile +4 -0
- data/examples/selenium/Rakefile +11 -1
- data/examples/selenium/spec/google/find_rspecs_homepage_spec.rb +1 -1
- data/examples/selenium/spec/spec_helper.rb +1 -4
- data/examples/watir/Rakefile +11 -1
- data/examples/watir/spec/google/find_rspecs_homepage_spec.rb +2 -2
- data/examples/watir/spec/spec_helper.rb +6 -3
- data/lib/spec/ui.rb +2 -7
- data/lib/spec/ui/formatter.rb +103 -5
- data/lib/spec/ui/{rmagick_not_installed.png → images/rmagick_not_installed.png} +0 -0
- data/lib/spec/ui/{win32screenshot_not_installed.png → images/win32screenshot_not_installed.png} +0 -0
- data/lib/spec/ui/{wrong_win32screenshot.png → images/wrong_win32screenshot.png} +0 -0
- data/lib/spec/ui/{screenshot_helper.rb → screenshot_saver.rb} +12 -24
- data/lib/spec/ui/{selenium_helper.rb → selenium/driver_ext.rb} +0 -0
- data/lib/spec/ui/version.rb +1 -1
- data/lib/spec/ui/watir.rb +2 -0
- data/lib/spec/ui/watir/browser.rb +37 -0
- data/lib/spec/ui/watir/matchers.rb +97 -0
- data/spec/spec/ui/watir/matchers_spec.rb +40 -0
- data/spec/spec_helper.rb +2 -0
- metadata +14 -13
- data/lib/spec/ui/behaviour.rb +0 -6
- data/lib/spec/ui/configuration.rb +0 -7
- data/lib/spec/ui/rake_tasks.rb +0 -31
- data/lib/spec/ui/watir_helper.rb +0 -167
- data/lib/spec/ui/webapp_helper.rb +0 -23
data/Manifest.txt
CHANGED
@@ -3,18 +3,17 @@ Manifest.txt
|
|
3
3
|
README.txt
|
4
4
|
Rakefile
|
5
5
|
lib/spec/ui.rb
|
6
|
-
lib/spec/ui/behaviour.rb
|
7
|
-
lib/spec/ui/configuration.rb
|
8
6
|
lib/spec/ui/formatter.rb
|
9
|
-
lib/spec/ui/
|
10
|
-
lib/spec/ui/
|
11
|
-
lib/spec/ui/
|
12
|
-
lib/spec/ui/
|
7
|
+
lib/spec/ui/images/rmagick_not_installed.png
|
8
|
+
lib/spec/ui/images/win32screenshot_not_installed.png
|
9
|
+
lib/spec/ui/images/wrong_win32screenshot.png
|
10
|
+
lib/spec/ui/screenshot_saver.rb
|
11
|
+
lib/spec/ui/selenium
|
12
|
+
lib/spec/ui/selenium/driver_ext.rb
|
13
13
|
lib/spec/ui/version.rb
|
14
|
-
lib/spec/ui/
|
15
|
-
lib/spec/ui/
|
16
|
-
lib/spec/ui/
|
17
|
-
lib/spec/ui/wrong_win32screenshot.png
|
14
|
+
lib/spec/ui/watir.rb
|
15
|
+
lib/spec/ui/watir/browser.rb
|
16
|
+
lib/spec/ui/watir/matchers.rb
|
18
17
|
examples/selenium/Rakefile
|
19
18
|
examples/selenium/README.txt
|
20
19
|
examples/selenium/spec/google/find_rspecs_homepage_spec.rb
|
@@ -23,3 +22,5 @@ examples/watir/Rakefile
|
|
23
22
|
examples/watir/README.txt
|
24
23
|
examples/watir/spec/google/find_rspecs_homepage_spec.rb
|
25
24
|
examples/watir/spec/spec_helper.rb
|
25
|
+
spec/spec_helper.rb
|
26
|
+
spec/spec/ui/watir/matchers_spec.rb
|
data/Rakefile
CHANGED
@@ -46,3 +46,7 @@ hoe = Hoe.new(GEM_NAME, VERS) do |p|
|
|
46
46
|
#p.extra_deps - An array of rubygem dependencies.
|
47
47
|
#p.spec_extras - A hash of extra values to set in the gemspec.
|
48
48
|
end
|
49
|
+
|
50
|
+
$LOAD_PATH.unshift File.dirname(__FILE__) + '/../rspec/lib'
|
51
|
+
require 'spec/rake/spectask'
|
52
|
+
Spec::Rake::SpecTask.new
|
data/examples/selenium/Rakefile
CHANGED
@@ -1,2 +1,12 @@
|
|
1
1
|
require File.dirname(__FILE__) + '/spec/spec_helper'
|
2
|
-
|
2
|
+
require 'spec/rake/spectask'
|
3
|
+
|
4
|
+
desc "Run UI Specs"
|
5
|
+
Spec::Rake::SpecTask.new('spec:ui') do |t|
|
6
|
+
t.spec_files = FileList['spec/**/*.rb']
|
7
|
+
t.spec_opts = [
|
8
|
+
'--require', 'spec/spec_helper',
|
9
|
+
'--format', 'Spec::Ui::ScreenshotFormatter:spec_report.html',
|
10
|
+
'--format', 'progress',
|
11
|
+
]
|
12
|
+
end
|
data/examples/watir/Rakefile
CHANGED
@@ -1,2 +1,12 @@
|
|
1
1
|
require File.dirname(__FILE__) + '/spec/spec_helper'
|
2
|
-
|
2
|
+
require 'spec/rake/spectask'
|
3
|
+
|
4
|
+
desc "Run UI Specs"
|
5
|
+
Spec::Rake::SpecTask.new('spec:ui') do |t|
|
6
|
+
t.spec_files = FileList['spec/**/*.rb']
|
7
|
+
t.spec_opts = [
|
8
|
+
'--require', 'spec/spec_helper',
|
9
|
+
'--format', 'Spec::Ui::ScreenshotFormatter:spec_report.html',
|
10
|
+
'--format', 'progress',
|
11
|
+
]
|
12
|
+
end
|
@@ -26,9 +26,9 @@ describe "Google's search page" do
|
|
26
26
|
@browser.button(:name, "btnG").click
|
27
27
|
@browser.should_not have_text("Ali G")
|
28
28
|
end
|
29
|
-
|
29
|
+
|
30
30
|
after(:each) do
|
31
|
-
|
31
|
+
Spec::Ui::ScreenshotFormatter.browser = @browser
|
32
32
|
end
|
33
33
|
|
34
34
|
after(:all) do
|
@@ -5,7 +5,10 @@ $LOAD_PATH.unshift(File.dirname(__FILE__) + '/../../../lib')
|
|
5
5
|
require 'rubygems'
|
6
6
|
require 'spec'
|
7
7
|
require 'spec/ui'
|
8
|
+
require 'spec/ui/watir'
|
8
9
|
|
9
|
-
Spec::
|
10
|
-
|
11
|
-
|
10
|
+
class Spec::DSL::Behaviour
|
11
|
+
def before_eval #:nodoc:
|
12
|
+
include Spec::Matchers::Watir # This gives us Watir matchers
|
13
|
+
end
|
14
|
+
end
|
data/lib/spec/ui.rb
CHANGED
@@ -1,7 +1,2 @@
|
|
1
|
-
require
|
2
|
-
require
|
3
|
-
require File.dirname(__FILE__) + '/ui/webapp_helper'
|
4
|
-
require File.dirname(__FILE__) + '/ui/watir_helper'
|
5
|
-
require File.dirname(__FILE__) + '/ui/selenium_helper'
|
6
|
-
require File.dirname(__FILE__) + '/ui/screenshot_helper'
|
7
|
-
require File.dirname(__FILE__) + '/ui/rake_tasks'
|
1
|
+
require 'spec/ui/formatter'
|
2
|
+
require 'spec/ui/version'
|
data/lib/spec/ui/formatter.rb
CHANGED
@@ -1,14 +1,112 @@
|
|
1
|
+
require 'tempfile'
|
2
|
+
require 'base64'
|
3
|
+
require 'cgi'
|
4
|
+
require 'spec/ui/screenshot_saver'
|
5
|
+
|
1
6
|
module Spec
|
2
7
|
module Ui
|
3
8
|
class ScreenshotFormatter < Spec::Runner::Formatter::HtmlFormatter
|
4
|
-
|
5
|
-
|
9
|
+
class << self
|
10
|
+
include ScreenshotSaver
|
11
|
+
attr_reader :html
|
12
|
+
|
13
|
+
# Takes screenshot and snapshot of the +browser+'s html.
|
14
|
+
# This method calls #screenshot! so that method should not be called
|
15
|
+
# when this method is used.
|
16
|
+
# This method *must* be called in an after(:each) block.
|
17
|
+
def browser=(browser)
|
18
|
+
screenshot!
|
19
|
+
@html = browser.html
|
20
|
+
end
|
21
|
+
|
22
|
+
# Takes a screenshot of the current window. Use this method when
|
23
|
+
# you don't have a browser object.
|
24
|
+
def screenshot!
|
25
|
+
@png_path = Tempfile.new("spec:ui").path
|
26
|
+
save_screenshot(png_path)
|
27
|
+
end
|
28
|
+
|
29
|
+
def png_path
|
30
|
+
raise "Screenshot not taken. You must call #{self.class}#screenshot! or #{self.class}#browser=(@browser) from after(:each)" if @png_path.nil?
|
31
|
+
@png_path
|
32
|
+
end
|
33
|
+
|
34
|
+
# Resets the screenshot and html. Do not call this method from your specs.
|
35
|
+
def reset!
|
36
|
+
@png_path = nil
|
37
|
+
@html = nil
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
def global_scripts
|
42
|
+
super + <<-EOF
|
43
|
+
function showImage(e) {
|
44
|
+
w = window.open();
|
45
|
+
w.location = e.childNodes[0].src
|
46
|
+
}
|
47
|
+
|
48
|
+
// Lifted from Ruby RDoc
|
49
|
+
function toggleSource( id ) {
|
50
|
+
var elem
|
51
|
+
var link
|
52
|
+
|
53
|
+
if( document.getElementById )
|
54
|
+
{
|
55
|
+
elem = document.getElementById( id )
|
56
|
+
link = document.getElementById( "l_" + id )
|
57
|
+
}
|
58
|
+
else if ( document.all )
|
59
|
+
{
|
60
|
+
elem = eval( "document.all." + id )
|
61
|
+
link = eval( "document.all.l_" + id )
|
62
|
+
}
|
63
|
+
else
|
64
|
+
return false;
|
65
|
+
|
66
|
+
if( elem.style.display == "block" )
|
67
|
+
{
|
68
|
+
elem.style.display = "none"
|
69
|
+
link.innerHTML = "show source"
|
70
|
+
}
|
71
|
+
else
|
72
|
+
{
|
73
|
+
elem.style.display = "block"
|
74
|
+
link.innerHTML = "hide source"
|
75
|
+
}
|
76
|
+
}
|
77
|
+
EOF
|
78
|
+
end
|
79
|
+
|
80
|
+
def global_styles
|
81
|
+
super + <<-EOF
|
82
|
+
div.rspec-report textarea {
|
83
|
+
width: 100%;
|
84
|
+
}
|
85
|
+
|
86
|
+
div.rspec-report div.dyn-source {
|
87
|
+
background:#FFFFEE none repeat scroll 0%;
|
88
|
+
border:1px dotted black;
|
89
|
+
color:#000000;
|
90
|
+
display:none;
|
91
|
+
margin:0.5em 2em;
|
92
|
+
padding:0.5em;
|
93
|
+
}
|
94
|
+
EOF
|
6
95
|
end
|
7
|
-
end
|
8
96
|
|
9
|
-
class WebappFormatter < ScreenshotFormatter
|
10
97
|
def extra_failure_content(failure)
|
11
|
-
|
98
|
+
result = super(failure)
|
99
|
+
# Add embedded image to the report.
|
100
|
+
img_data = Base64.encode64(File.open(self.class.png_path, "rb").read)
|
101
|
+
result += " <div><a href=\"#\" onclick=\"showImage(this)\"><img width=\"25%\" height=\"25%\" src=\"data:image/png;base64,#{img_data}\" /></a></div>\n"
|
102
|
+
if self.class.html
|
103
|
+
escaped_html = CGI::escapeHTML(self.class.html)
|
104
|
+
source_id = "#{current_example_number}_source"
|
105
|
+
result += " <div>[<a id=\"l_#{source_id}\" href=\"javascript:toggleSource('#{source_id}')\">show source</a>]</div>\n"
|
106
|
+
result += " <div id=\"#{source_id}\" class=\"dyn-source\"><textarea rows=\"20\">#{escaped_html}</textarea></div>\n"
|
107
|
+
end
|
108
|
+
self.class.reset!
|
109
|
+
result
|
12
110
|
end
|
13
111
|
end
|
14
112
|
end
|
File without changes
|
data/lib/spec/ui/{win32screenshot_not_installed.png → images/win32screenshot_not_installed.png}
RENAMED
File without changes
|
File without changes
|
@@ -2,34 +2,25 @@ require 'fileutils'
|
|
2
2
|
|
3
3
|
module Spec
|
4
4
|
module Ui
|
5
|
-
module
|
6
|
-
def md(dir)
|
7
|
-
FileUtils.mkdir_p(dir) unless File.directory?(dir)
|
8
|
-
end
|
9
|
-
|
5
|
+
module ScreenshotSaver
|
10
6
|
if RUBY_PLATFORM =~ /darwin/
|
11
|
-
def save_screenshot(
|
12
|
-
md(dir)
|
13
|
-
img_path = "#{dir}/#{spec_number}.png"
|
7
|
+
def save_screenshot(png_path)
|
14
8
|
# How do we capture the current window??
|
15
|
-
`screencapture #{
|
9
|
+
`screencapture #{png_path}`
|
16
10
|
end
|
17
11
|
else # Win32
|
18
12
|
begin
|
13
|
+
# TODO: Move all this code to win32screenshot
|
19
14
|
require 'rubygems'
|
20
15
|
require 'RMagick'
|
21
16
|
gem 'win32screenshot', '>=0.0.2'
|
22
17
|
require 'win32screenshot'
|
23
|
-
def save_screenshot(
|
24
|
-
md(dir)
|
18
|
+
def save_screenshot(png_path)
|
25
19
|
width, height, bmp = ::Win32::Screenshot.foreground
|
26
20
|
begin
|
27
21
|
img = Magick::Image.from_blob(bmp)[0]
|
28
|
-
img_path = "#{dir}/#{spec_number}.png"
|
29
|
-
dir = File.dirname(img_path)
|
30
|
-
FileUtils.mkdir_p(dir) unless File.exist?(dir)
|
31
22
|
img.write(img_path)
|
32
|
-
|
23
|
+
nil
|
33
24
|
rescue Magick::ImageMagickError => e
|
34
25
|
if e.message =~ /Insufficient image data in file/
|
35
26
|
e.message << "\nTry this:\n1) Open your app (e.g. Internet Explorer)\n2) Resize the app to be bigger (without maximizing).\n3) close it so Windows remembers its size.\n" +
|
@@ -39,20 +30,17 @@ module Spec
|
|
39
30
|
end
|
40
31
|
end
|
41
32
|
rescue Gem::LoadError => e
|
42
|
-
def save_screenshot(
|
43
|
-
|
44
|
-
FileUtils.cp(File.dirname(__FILE__) + '/wrong_win32screenshot.png', "#{dir}/#{spec_number}.png")
|
33
|
+
def save_screenshot(png_path)
|
34
|
+
FileUtils.cp(File.dirname(__FILE__) + '/images/wrong_win32screenshot.png', png_path)
|
45
35
|
end
|
46
36
|
rescue LoadError => e
|
47
37
|
if(e.message =~ /win32screenshot/)
|
48
|
-
def save_screenshot(
|
49
|
-
|
50
|
-
FileUtils.cp(File.dirname(__FILE__) + '/win32screenshot_not_installed.png', "#{dir}/#{spec_number}.png")
|
38
|
+
def save_screenshot(png_path)
|
39
|
+
FileUtils.cp(File.dirname(__FILE__) + '/images/win32screenshot_not_installed.png', png_path)
|
51
40
|
end
|
52
41
|
else
|
53
|
-
def save_screenshot(
|
54
|
-
|
55
|
-
FileUtils.cp(File.dirname(__FILE__) + '/rmagick_not_installed.png', "#{dir}/#{spec_number}.png")
|
42
|
+
def save_screenshot(png_path)
|
43
|
+
FileUtils.cp(File.dirname(__FILE__) + '/images/rmagick_not_installed.png', png_path)
|
56
44
|
end
|
57
45
|
end
|
58
46
|
end
|
File without changes
|
data/lib/spec/ui/version.rb
CHANGED
@@ -0,0 +1,37 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
|
3
|
+
if RUBY_PLATFORM =~ /darwin/
|
4
|
+
require 'safariwatir'
|
5
|
+
Watir::Browser = Watir::Safari
|
6
|
+
else
|
7
|
+
require 'watir'
|
8
|
+
Watir::Browser = Watir::IE
|
9
|
+
|
10
|
+
class Watir::Browser
|
11
|
+
alias old_initialize initialize
|
12
|
+
# Brings the IE to the foreground (provided Win32::Screenshot is installed)
|
13
|
+
def initialize
|
14
|
+
result = old_initialize
|
15
|
+
::Win32::Screenshot.setForegroundWindow(self.getIE.hwnd) rescue nil
|
16
|
+
result
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
class Watir::Browser
|
22
|
+
def kill!
|
23
|
+
close
|
24
|
+
end
|
25
|
+
|
26
|
+
alias _old_goto goto
|
27
|
+
# Redefinition of Watir's original goto, which gives a better
|
28
|
+
# exception message (the URL is in the message)
|
29
|
+
def goto(url)
|
30
|
+
begin
|
31
|
+
_old_goto(url)
|
32
|
+
rescue => e
|
33
|
+
e.message << "\nURL: #{url}"
|
34
|
+
raise e
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
@@ -0,0 +1,97 @@
|
|
1
|
+
# Matchers for Watir::IE/Watir::Safari instances
|
2
|
+
module Spec::Matchers::Watir
|
3
|
+
class ContentMatcher # :nodoc
|
4
|
+
def initialize(kind, text_or_regexp)
|
5
|
+
@kind, @text_or_regexp = kind, text_or_regexp
|
6
|
+
end
|
7
|
+
|
8
|
+
def matches?(container)
|
9
|
+
@container = container
|
10
|
+
@content = container.__send__(@kind)
|
11
|
+
if @text_or_regexp.is_a?(Regexp)
|
12
|
+
!!@content =~ @text_or_regexp
|
13
|
+
else
|
14
|
+
!!@content.index(@text_or_regexp.to_s)
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
def failure_message
|
19
|
+
"Expected #{@container.class} to have #{@kind} matching #{@text_or_regexp}, but it was not found in:\n#{@content}"
|
20
|
+
end
|
21
|
+
|
22
|
+
def negative_failure_message
|
23
|
+
"Expected #{@container.class} to not have #{@kind} matching #{@text_or_regexp}, but it was found in:\n#{@content}"
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
# RSpec matcher that passes if @container#text matches +text_or_regexp+ (String or Regexp)
|
28
|
+
def have_text(text_or_regexp)
|
29
|
+
ContentMatcher.new(:text, text_or_regexp)
|
30
|
+
end
|
31
|
+
|
32
|
+
# RSpec matcher that passes if @container#html matches +text_or_regexp+ (String or Regexp)
|
33
|
+
def have_html(text_or_regexp)
|
34
|
+
ContentMatcher.new(:html, text_or_regexp)
|
35
|
+
end
|
36
|
+
|
37
|
+
class ElementMatcher # :nodoc
|
38
|
+
def initialize(kind, *args)
|
39
|
+
@kind, @args = kind, args
|
40
|
+
end
|
41
|
+
|
42
|
+
def matches?(container)
|
43
|
+
@container = container
|
44
|
+
begin
|
45
|
+
element = @container.__send__(@kind, *@args)
|
46
|
+
if element.respond_to?(:assert_exists)
|
47
|
+
# IE
|
48
|
+
element.assert_exists
|
49
|
+
true
|
50
|
+
else
|
51
|
+
# Safari
|
52
|
+
element.exists?
|
53
|
+
end
|
54
|
+
rescue ::Watir::Exception::UnknownObjectException => e
|
55
|
+
false
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
def failure_message
|
60
|
+
"Expected #{@container.class} to have #{@kind}(#{arg_string}), but it was not found"
|
61
|
+
end
|
62
|
+
|
63
|
+
def negative_failure_message
|
64
|
+
"Expected #{@container.class} to not have #{@kind}(#{arg_string}), but it was found"
|
65
|
+
end
|
66
|
+
|
67
|
+
def arg_string
|
68
|
+
@args.map{|a| a.inspect}.join(", ")
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
# All the xxx(what, how) methods in Watir
|
73
|
+
[
|
74
|
+
:button,
|
75
|
+
:cell,
|
76
|
+
:checkbox,
|
77
|
+
:div,
|
78
|
+
:file_field,
|
79
|
+
:form,
|
80
|
+
:hidden,
|
81
|
+
:image,
|
82
|
+
:label,
|
83
|
+
:link,
|
84
|
+
:p,
|
85
|
+
:radio,
|
86
|
+
:row,
|
87
|
+
:select_list,
|
88
|
+
:span,
|
89
|
+
:table,
|
90
|
+
:text_field
|
91
|
+
].each do |kind|
|
92
|
+
# RSpec matcher that passes if container##{kind}(*args) returns an existing #{kind} element.
|
93
|
+
define_method("have_#{kind}".to_sym) do |*args|
|
94
|
+
ElementMatcher.new(kind, *args)
|
95
|
+
end
|
96
|
+
end
|
97
|
+
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/../../../spec_helper'
|
2
|
+
require 'spec/ui/watir/matchers'
|
3
|
+
|
4
|
+
class BrowserStub
|
5
|
+
def label(*args)
|
6
|
+
LabelStub.new(*args)
|
7
|
+
end
|
8
|
+
end
|
9
|
+
|
10
|
+
class LabelStub
|
11
|
+
def initialize(how, what)
|
12
|
+
@how, @what = how, what
|
13
|
+
end
|
14
|
+
|
15
|
+
def exists?
|
16
|
+
@what
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
describe "Browser" do
|
21
|
+
include Spec::Matchers::Watir
|
22
|
+
|
23
|
+
before do
|
24
|
+
@b = BrowserStub.new
|
25
|
+
end
|
26
|
+
|
27
|
+
it "should support should have_label" do
|
28
|
+
lambda do
|
29
|
+
@b.should have_label(:foo, false)
|
30
|
+
end.should raise_error(Spec::Expectations::ExpectationNotMetError,
|
31
|
+
'Expected BrowserStub to have label(:foo, false), but it was not found')
|
32
|
+
end
|
33
|
+
|
34
|
+
it "should support should_not have_label" do
|
35
|
+
lambda do
|
36
|
+
@b.should_not have_label(:foo, true)
|
37
|
+
end.should raise_error(Spec::Expectations::ExpectationNotMetError,
|
38
|
+
'Expected BrowserStub to not have label(:foo, true), but it was found')
|
39
|
+
end
|
40
|
+
end
|
data/spec/spec_helper.rb
ADDED
metadata
CHANGED
@@ -1,10 +1,10 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
|
-
rubygems_version: 0.9.
|
2
|
+
rubygems_version: 0.9.2
|
3
3
|
specification_version: 1
|
4
4
|
name: spec_ui
|
5
5
|
version: !ruby/object:Gem::Version
|
6
|
-
version: 0.
|
7
|
-
date: 2007-05-
|
6
|
+
version: 0.2.0
|
7
|
+
date: 2007-05-10 00:00:00 +02:00
|
8
8
|
summary: Run UI RSpec examples with screenshot reports
|
9
9
|
require_paths:
|
10
10
|
- lib
|
@@ -34,18 +34,17 @@ files:
|
|
34
34
|
- README.txt
|
35
35
|
- Rakefile
|
36
36
|
- lib/spec/ui.rb
|
37
|
-
- lib/spec/ui/behaviour.rb
|
38
|
-
- lib/spec/ui/configuration.rb
|
39
37
|
- lib/spec/ui/formatter.rb
|
40
|
-
- lib/spec/ui/
|
41
|
-
- lib/spec/ui/
|
42
|
-
- lib/spec/ui/
|
43
|
-
- lib/spec/ui/
|
38
|
+
- lib/spec/ui/images/rmagick_not_installed.png
|
39
|
+
- lib/spec/ui/images/win32screenshot_not_installed.png
|
40
|
+
- lib/spec/ui/images/wrong_win32screenshot.png
|
41
|
+
- lib/spec/ui/screenshot_saver.rb
|
42
|
+
- lib/spec/ui/selenium
|
43
|
+
- lib/spec/ui/selenium/driver_ext.rb
|
44
44
|
- lib/spec/ui/version.rb
|
45
|
-
- lib/spec/ui/
|
46
|
-
- lib/spec/ui/
|
47
|
-
- lib/spec/ui/
|
48
|
-
- lib/spec/ui/wrong_win32screenshot.png
|
45
|
+
- lib/spec/ui/watir.rb
|
46
|
+
- lib/spec/ui/watir/browser.rb
|
47
|
+
- lib/spec/ui/watir/matchers.rb
|
49
48
|
- examples/selenium/Rakefile
|
50
49
|
- examples/selenium/README.txt
|
51
50
|
- examples/selenium/spec/google/find_rspecs_homepage_spec.rb
|
@@ -54,6 +53,8 @@ files:
|
|
54
53
|
- examples/watir/README.txt
|
55
54
|
- examples/watir/spec/google/find_rspecs_homepage_spec.rb
|
56
55
|
- examples/watir/spec/spec_helper.rb
|
56
|
+
- spec/spec_helper.rb
|
57
|
+
- spec/spec/ui/watir/matchers_spec.rb
|
57
58
|
test_files: []
|
58
59
|
|
59
60
|
rdoc_options: []
|
data/lib/spec/ui/behaviour.rb
DELETED
data/lib/spec/ui/rake_tasks.rb
DELETED
@@ -1,31 +0,0 @@
|
|
1
|
-
module Spec
|
2
|
-
module Ui
|
3
|
-
def self.create_tasks
|
4
|
-
require 'spec/rake/spectask'
|
5
|
-
|
6
|
-
if Spec::Runner.configuration.spec_ui_report_dir.nil?
|
7
|
-
STDERR.puts <<-EOF
|
8
|
-
You must tell Spec::Ui where the report should go.
|
9
|
-
Please put the following in your spec/spec_helper.rb file:
|
10
|
-
|
11
|
-
require 'spec'
|
12
|
-
require 'spec/ui'
|
13
|
-
|
14
|
-
Spec::Runner.configure do |config|
|
15
|
-
config.spec_ui_report_dir = File.dirname(__FILE__) + '/report'
|
16
|
-
end
|
17
|
-
EOF
|
18
|
-
end
|
19
|
-
|
20
|
-
FileUtils.rm_rf(Spec::Runner.configuration.spec_ui_report_dir) if File.exist?(Spec::Runner.configuration.spec_ui_report_dir)
|
21
|
-
FileUtils.mkdir_p(Spec::Runner.configuration.spec_ui_report_dir)
|
22
|
-
|
23
|
-
desc "Run UI Specs"
|
24
|
-
Spec::Rake::SpecTask.new('spec:ui') do |t|
|
25
|
-
t.spec_files = FileList['spec/**/*.rb']
|
26
|
-
t.spec_opts = ['--require', 'spec/spec_helper', '--format', 'Spec::Ui::WebappFormatter']
|
27
|
-
t.out = "#{Spec::Runner.configuration.spec_ui_report_dir}/index.html"
|
28
|
-
end
|
29
|
-
end
|
30
|
-
end
|
31
|
-
end
|
data/lib/spec/ui/watir_helper.rb
DELETED
@@ -1,167 +0,0 @@
|
|
1
|
-
require File.dirname(__FILE__) + '/webapp_helper'
|
2
|
-
require 'rubygems'
|
3
|
-
|
4
|
-
if RUBY_PLATFORM =~ /darwin/
|
5
|
-
require 'safariwatir'
|
6
|
-
Watir::Browser = Watir::Safari
|
7
|
-
else
|
8
|
-
require 'watir'
|
9
|
-
Watir::Browser = Watir::IE
|
10
|
-
|
11
|
-
class Watir::Browser
|
12
|
-
alias old_initialize initialize
|
13
|
-
# Brings the IE to the foreground (provided Win32::Screenshot is installed)
|
14
|
-
def initialize
|
15
|
-
result = old_initialize
|
16
|
-
::Win32::Screenshot.setForegroundWindow(self.getIE.hwnd) rescue nil
|
17
|
-
result
|
18
|
-
end
|
19
|
-
end
|
20
|
-
end
|
21
|
-
|
22
|
-
class Watir::Browser
|
23
|
-
def kill!
|
24
|
-
close
|
25
|
-
end
|
26
|
-
|
27
|
-
alias contain_text? contains_text
|
28
|
-
|
29
|
-
alias old_goto goto
|
30
|
-
# Redefinition of Watir's original goto, which gives a better
|
31
|
-
# exception message (the URL is in the message)
|
32
|
-
def goto(url)
|
33
|
-
begin
|
34
|
-
old_goto(url)
|
35
|
-
rescue => e
|
36
|
-
e.message << "\nURL: #{url}"
|
37
|
-
raise e
|
38
|
-
end
|
39
|
-
end
|
40
|
-
end
|
41
|
-
|
42
|
-
module Spec
|
43
|
-
# Matchers for Watir::IE/Watir::Safari instances
|
44
|
-
module Watir
|
45
|
-
# RSpec matcher that passes if @browser#text matches +text+ (String or Regexp)
|
46
|
-
def have_text(text)
|
47
|
-
Spec::Watir::HaveText.new(text)
|
48
|
-
end
|
49
|
-
|
50
|
-
class HaveText # :nodoc
|
51
|
-
def initialize(text_or_regexp)
|
52
|
-
@text_or_regexp = text_or_regexp
|
53
|
-
end
|
54
|
-
|
55
|
-
def matches?(browser)
|
56
|
-
@browser = browser
|
57
|
-
if @text_or_regexp.is_a?(Regexp)
|
58
|
-
!!browser.text =~ @text_or_regexp
|
59
|
-
else
|
60
|
-
!!browser.text.index(@text_or_regexp.to_s)
|
61
|
-
end
|
62
|
-
end
|
63
|
-
|
64
|
-
def failure_message
|
65
|
-
"Expected browser to have text matching #{@text_or_regexp}, but it was not found in:\n#{@browser.text}"
|
66
|
-
end
|
67
|
-
|
68
|
-
def negative_failure_message
|
69
|
-
"Expected browser to not have text matching #{@text_or_regexp}, but it was found in:\n#{@browser.text}"
|
70
|
-
end
|
71
|
-
end
|
72
|
-
|
73
|
-
# RSpec matcher that passes if @browser#html matches +text+ (String or Regexp)
|
74
|
-
def have_html(text)
|
75
|
-
Spec::Watir::HaveHtml.new(text)
|
76
|
-
end
|
77
|
-
|
78
|
-
class HaveHtml # :nodoc
|
79
|
-
def initialize(text_or_regexp)
|
80
|
-
@text_or_regexp = text_or_regexp
|
81
|
-
end
|
82
|
-
|
83
|
-
def matches?(browser)
|
84
|
-
@browser = browser
|
85
|
-
if @text_or_regexp.is_a?(Regexp)
|
86
|
-
!!browser.html =~ @text_or_regexp
|
87
|
-
else
|
88
|
-
!!browser.html.index(@text_or_regexp.to_s)
|
89
|
-
end
|
90
|
-
end
|
91
|
-
|
92
|
-
def failure_message
|
93
|
-
"Expected browser to have HTML matching #{@text_or_regexp}, but it was not found in:\n#{@browser.html}"
|
94
|
-
end
|
95
|
-
|
96
|
-
def negative_failure_message
|
97
|
-
"Expected browser to not have HTML matching #{@text_or_regexp}, but it was found in:\n#{@browser.html}"
|
98
|
-
end
|
99
|
-
end
|
100
|
-
|
101
|
-
# RSpec matcher that passes if @browser#link(+how+,+what+) returns an existing link.
|
102
|
-
def have_link(how, what)
|
103
|
-
Spec::Watir::HaveLink.new(how, what)
|
104
|
-
end
|
105
|
-
|
106
|
-
class HaveLink # :nodoc
|
107
|
-
def initialize(how, what)
|
108
|
-
@how, @what = how, what
|
109
|
-
end
|
110
|
-
|
111
|
-
def matches?(browser)
|
112
|
-
@browser = browser
|
113
|
-
begin
|
114
|
-
link = @browser.link(@how, @what)
|
115
|
-
if link.respond_to?(:assert_exists)
|
116
|
-
# IE
|
117
|
-
link.assert_exists
|
118
|
-
true
|
119
|
-
else
|
120
|
-
# Safari
|
121
|
-
link.exists?
|
122
|
-
end
|
123
|
-
rescue ::Watir::Exception::UnknownObjectException => e
|
124
|
-
false
|
125
|
-
end
|
126
|
-
end
|
127
|
-
|
128
|
-
def failure_message
|
129
|
-
"Expected browser to have link(#{@how}, #{@what}), but it was not found"
|
130
|
-
end
|
131
|
-
|
132
|
-
def negative_failure_message
|
133
|
-
"Expected browser not to have link(#{@how}, #{@what}), but it was found"
|
134
|
-
end
|
135
|
-
end
|
136
|
-
|
137
|
-
# RSpec matcher that passes if @browser#text_field(+how+,+what+) returns an existing text field.
|
138
|
-
def have_text_field(how, what)
|
139
|
-
Spec::Watir::HaveTextField.new(how, what)
|
140
|
-
end
|
141
|
-
|
142
|
-
class HaveTextField # :nodoc
|
143
|
-
def initialize(how, what)
|
144
|
-
@how, @what = how, what
|
145
|
-
end
|
146
|
-
|
147
|
-
def matches?(browser)
|
148
|
-
@browser = browser
|
149
|
-
begin
|
150
|
-
text_field = @browser.text_field(@how, @what)
|
151
|
-
text_field.assert_exists
|
152
|
-
true
|
153
|
-
rescue ::Watir::Exception::UnknownObjectException => e
|
154
|
-
false
|
155
|
-
end
|
156
|
-
end
|
157
|
-
|
158
|
-
def failure_message
|
159
|
-
"Expected browser to have text_field(#{@how}, #{@what}), but it was not found"
|
160
|
-
end
|
161
|
-
|
162
|
-
def negative_failure_message
|
163
|
-
"Expected browser not to have text_field(#{@how}, #{@what}), but it was found"
|
164
|
-
end
|
165
|
-
end
|
166
|
-
end
|
167
|
-
end
|
@@ -1,23 +0,0 @@
|
|
1
|
-
require 'spec'
|
2
|
-
require File.dirname(__FILE__) + '/screenshot_helper'
|
3
|
-
require File.dirname(__FILE__) + '/formatter'
|
4
|
-
|
5
|
-
module Spec
|
6
|
-
module Ui
|
7
|
-
module WebappHelper
|
8
|
-
include Spec::Ui::ScreenshotHelper
|
9
|
-
@@spec_number = 0
|
10
|
-
|
11
|
-
# Call this method from your teardown block to have source and screenshot written to disk.
|
12
|
-
def save_screenshot_and_source(browser)
|
13
|
-
save_screenshot(Spec::Runner.configuration.spec_ui_image_dir, @@spec_number)
|
14
|
-
save_source(Spec::Runner.configuration.spec_ui_image_dir, @@spec_number, browser.html)
|
15
|
-
@@spec_number += 1
|
16
|
-
end
|
17
|
-
|
18
|
-
def save_source(dir, spec_number, html)
|
19
|
-
File.open("#{dir}/#{spec_number}.html", "w") {|io| io.write(html)}
|
20
|
-
end
|
21
|
-
end
|
22
|
-
end
|
23
|
-
end
|