capybara-screenshot-nocolor 1.0.5
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.
- checksums.yaml +7 -0
- data/.gitignore +7 -0
- data/.rspec +2 -0
- data/.travis.yml +17 -0
- data/Appraisals +31 -0
- data/CHANGELOG.md +198 -0
- data/Gemfile +7 -0
- data/LICENSE +19 -0
- data/README.md +240 -0
- data/Rakefile +40 -0
- data/capybara-screenshot.gemspec +38 -0
- data/gemfiles/cucumber.1.2.gemfile +9 -0
- data/gemfiles/cucumber.1.3.0.gemfile +9 -0
- data/gemfiles/latest.gemfile +8 -0
- data/gemfiles/rspec.2.14.gemfile +9 -0
- data/gemfiles/rspec.2.99.gemfile +9 -0
- data/gemfiles/rspec.3.0.gemfile +9 -0
- data/gemfiles/spinach.0.7.gemfile +9 -0
- data/gemfiles/spinach.0.8.0.gemfile +9 -0
- data/lib/capybara-screenshot.rb +157 -0
- data/lib/capybara-screenshot/capybara.rb +28 -0
- data/lib/capybara-screenshot/cucumber.rb +27 -0
- data/lib/capybara-screenshot/minitest.rb +27 -0
- data/lib/capybara-screenshot/pruner.rb +47 -0
- data/lib/capybara-screenshot/rspec.rb +92 -0
- data/lib/capybara-screenshot/rspec/base_reporter.rb +21 -0
- data/lib/capybara-screenshot/rspec/html_embed_reporter.rb +25 -0
- data/lib/capybara-screenshot/rspec/html_link_reporter.rb +37 -0
- data/lib/capybara-screenshot/rspec/text_reporter.rb +38 -0
- data/lib/capybara-screenshot/rspec/textmate_link_reporter.rb +19 -0
- data/lib/capybara-screenshot/saver.rb +87 -0
- data/lib/capybara-screenshot/spinach.rb +26 -0
- data/lib/capybara-screenshot/testunit.rb +39 -0
- data/lib/capybara-screenshot/version.rb +5 -0
- data/spec/cucumber/cucumber_spec.rb +93 -0
- data/spec/cucumber/step_definitions/step_definitions.rb +18 -0
- data/spec/cucumber/support/env.rb +17 -0
- data/spec/feature/minitest_spec.rb +110 -0
- data/spec/feature/testunit_spec.rb +81 -0
- data/spec/rspec/rspec_spec.rb +159 -0
- data/spec/spec_helper.rb +29 -0
- data/spec/spinach/spinach_spec.rb +64 -0
- data/spec/spinach/support/spinach_failure.rb +41 -0
- data/spec/support/common_setup.rb +59 -0
- data/spec/support/html_reporter_context.rb +28 -0
- data/spec/support/test_app.rb +13 -0
- data/spec/unit/base_reporter_spec.rb +25 -0
- data/spec/unit/capybara-screenshot_rspec_spec.rb +48 -0
- data/spec/unit/capybara-screenshot_spec.rb +88 -0
- data/spec/unit/capybara_spec.rb +50 -0
- data/spec/unit/pruner_spec.rb +108 -0
- data/spec/unit/rspec_reporters/html_embed_reporter_spec.rb +18 -0
- data/spec/unit/rspec_reporters/html_link_reporter_spec.rb +27 -0
- data/spec/unit/rspec_reporters/text_reporter_spec.rb +97 -0
- data/spec/unit/rspec_reporters/textmate_link_reporter_spec.rb +39 -0
- data/spec/unit/saver_spec.rb +282 -0
- metadata +247 -0
data/Rakefile
ADDED
@@ -0,0 +1,40 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'bundler/setup'
|
3
|
+
|
4
|
+
Bundler::GemHelper.install_tasks
|
5
|
+
|
6
|
+
require 'rspec/core/rake_task'
|
7
|
+
|
8
|
+
rspec_rake_task = RSpec::Core::RakeTask.new(:spec)
|
9
|
+
|
10
|
+
task default: [:spec]
|
11
|
+
|
12
|
+
def target_gem
|
13
|
+
gem_file = ENV['BUNDLE_GEMFILE'] || ''
|
14
|
+
targets = %w(cucumber spinach rspec)
|
15
|
+
|
16
|
+
target = gem_file.match(/(#{targets.join('|')})/)
|
17
|
+
if target && targets.include?(target[1])
|
18
|
+
target[1].to_sym
|
19
|
+
else
|
20
|
+
[]
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
namespace :travis do
|
25
|
+
task :ci => target_gem do
|
26
|
+
Rake::Task['spec'].invoke
|
27
|
+
end
|
28
|
+
|
29
|
+
task :cucumber do
|
30
|
+
rspec_rake_task.pattern = 'spec/cucumber'
|
31
|
+
end
|
32
|
+
|
33
|
+
task :spinach do
|
34
|
+
rspec_rake_task.pattern = 'spec/spinach'
|
35
|
+
end
|
36
|
+
|
37
|
+
task :rspec do
|
38
|
+
rspec_rake_task.pattern = 'spec/rspec'
|
39
|
+
end
|
40
|
+
end
|
@@ -0,0 +1,38 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
$:.push File.expand_path("../lib", __FILE__)
|
3
|
+
require "capybara-screenshot/version"
|
4
|
+
|
5
|
+
Gem::Specification.new do |s|
|
6
|
+
s.name = "capybara-screenshot-nocolor"
|
7
|
+
s.version = Capybara::Screenshot::VERSION
|
8
|
+
s.platform = Gem::Platform::RUBY
|
9
|
+
s.authors = ["Matthew O'Riordan"]
|
10
|
+
s.email = ["matthew.oriordan@gmail.com"]
|
11
|
+
s.homepage = "http://github.com/mattheworiordan/capybara-screenshot"
|
12
|
+
s.summary = %q{Automatically create snapshots when Cucumber steps fail with Capybara and Rails}
|
13
|
+
s.description = %q{When a Cucumber step fails, it is useful to create a screenshot image and HTML file of the current page}
|
14
|
+
s.license = 'MIT'
|
15
|
+
|
16
|
+
s.rubyforge_project = "capybara-screenshot"
|
17
|
+
|
18
|
+
if RUBY_VERSION < "1.9"
|
19
|
+
s.add_dependency 'capybara', ['>= 1.0', '< 2']
|
20
|
+
else
|
21
|
+
s.add_dependency 'capybara', ['>= 1.0', '< 3']
|
22
|
+
end
|
23
|
+
s.add_dependency 'launchy'
|
24
|
+
|
25
|
+
s.add_development_dependency 'rspec'
|
26
|
+
s.add_development_dependency 'timecop'
|
27
|
+
s.add_development_dependency 'cucumber'
|
28
|
+
s.add_development_dependency 'aruba'
|
29
|
+
s.add_development_dependency 'sinatra'
|
30
|
+
s.add_development_dependency 'test-unit'
|
31
|
+
s.add_development_dependency 'spinach'
|
32
|
+
s.add_development_dependency 'minitest'
|
33
|
+
|
34
|
+
s.files = `git ls-files`.split("\n")
|
35
|
+
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
36
|
+
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
37
|
+
s.require_paths = ["lib"]
|
38
|
+
end
|
@@ -0,0 +1,157 @@
|
|
1
|
+
module Capybara
|
2
|
+
module Screenshot
|
3
|
+
class << self
|
4
|
+
attr_accessor :autosave_on_failure
|
5
|
+
attr_accessor :registered_drivers
|
6
|
+
attr_accessor :filename_prefix_formatters
|
7
|
+
attr_accessor :append_timestamp
|
8
|
+
attr_accessor :append_random
|
9
|
+
attr_accessor :webkit_options
|
10
|
+
attr_writer :final_session_name
|
11
|
+
attr_accessor :prune_strategy
|
12
|
+
end
|
13
|
+
|
14
|
+
self.autosave_on_failure = true
|
15
|
+
self.registered_drivers = {}
|
16
|
+
self.filename_prefix_formatters = {}
|
17
|
+
self.append_timestamp = true
|
18
|
+
self.append_random = false
|
19
|
+
self.webkit_options = {}
|
20
|
+
self.prune_strategy = :keep_all
|
21
|
+
|
22
|
+
def self.append_screenshot_path=(value)
|
23
|
+
$stderr.puts "WARNING: Capybara::Screenshot.append_screenshot_path is deprecated. " +
|
24
|
+
"Please use Capybara::Screenshot::RSpec.add_link_to_screenshot_for_failed_examples instead."
|
25
|
+
RSpec.add_link_to_screenshot_for_failed_examples = value
|
26
|
+
end
|
27
|
+
|
28
|
+
def self.screenshot_and_save_page
|
29
|
+
saver = Saver.new(Capybara, Capybara.page)
|
30
|
+
saver.save
|
31
|
+
{:html => saver.html_path, :image => saver.screenshot_path}
|
32
|
+
end
|
33
|
+
|
34
|
+
def self.screenshot_and_open_image
|
35
|
+
require "launchy"
|
36
|
+
|
37
|
+
saver = Saver.new(Capybara, Capybara.page, false)
|
38
|
+
saver.save
|
39
|
+
Launchy.open saver.screenshot_path
|
40
|
+
{:html => nil, :image => saver.screenshot_path}
|
41
|
+
end
|
42
|
+
|
43
|
+
class << self
|
44
|
+
alias screen_shot_and_save_page screenshot_and_save_page
|
45
|
+
alias screen_shot_and_open_image screenshot_and_open_image
|
46
|
+
end
|
47
|
+
|
48
|
+
def self.filename_prefix_for(test_type, test)
|
49
|
+
filename_prefix_formatters.fetch(test_type) { |key|
|
50
|
+
filename_prefix_formatters[:default]
|
51
|
+
}.call(test)
|
52
|
+
end
|
53
|
+
|
54
|
+
def self.capybara_root
|
55
|
+
return @capybara_root if defined?(@capybara_root)
|
56
|
+
#If the path isn't set, default to the current directory
|
57
|
+
capybara_tmp_path = Capybara.save_and_open_page_path || '.'
|
58
|
+
|
59
|
+
@capybara = if defined?(::Rails)
|
60
|
+
::Rails.root.join capybara_tmp_path
|
61
|
+
elsif defined?(Padrino)
|
62
|
+
Padrino.root capybara_tmp_path
|
63
|
+
elsif defined?(Sinatra)
|
64
|
+
File.join(Sinatra::Application.root, capybara_tmp_path)
|
65
|
+
else
|
66
|
+
capybara_tmp_path
|
67
|
+
end.to_s
|
68
|
+
end
|
69
|
+
|
70
|
+
def self.register_driver(driver, &block)
|
71
|
+
self.registered_drivers[driver] = block
|
72
|
+
end
|
73
|
+
|
74
|
+
def self.register_filename_prefix_formatter(test_type, &block)
|
75
|
+
self.filename_prefix_formatters[test_type] = block
|
76
|
+
end
|
77
|
+
|
78
|
+
def self.final_session_name
|
79
|
+
@final_session_name || Capybara.session_name || :default
|
80
|
+
end
|
81
|
+
|
82
|
+
# Prune screenshots based on prune_strategy
|
83
|
+
# Will run only once unless force:true
|
84
|
+
def self.prune(options = {})
|
85
|
+
reset_prune_history if options[:force]
|
86
|
+
Capybara::Screenshot::Pruner.new(Capybara::Screenshot.prune_strategy).prune_old_screenshots unless @pruned_previous_screenshots
|
87
|
+
@pruned_previous_screenshots = true
|
88
|
+
end
|
89
|
+
|
90
|
+
# Reset prune history allowing further prunining on next failure
|
91
|
+
def self.reset_prune_history
|
92
|
+
@pruned_previous_screenshots = nil
|
93
|
+
end
|
94
|
+
end
|
95
|
+
end
|
96
|
+
|
97
|
+
# Register driver renderers.
|
98
|
+
# The block should return `:not_supported` if a screenshot could not be saved.
|
99
|
+
Capybara::Screenshot.class_eval do
|
100
|
+
register_driver(:default) do |driver, path|
|
101
|
+
driver.render(path)
|
102
|
+
end
|
103
|
+
|
104
|
+
register_driver(:rack_test) do |driver, path|
|
105
|
+
:not_supported
|
106
|
+
end
|
107
|
+
|
108
|
+
register_driver(:mechanize) do |driver, path|
|
109
|
+
:not_supported
|
110
|
+
end
|
111
|
+
|
112
|
+
register_driver(:selenium) do |driver, path|
|
113
|
+
driver.browser.save_screenshot(path)
|
114
|
+
end
|
115
|
+
|
116
|
+
register_driver(:poltergeist) do |driver, path|
|
117
|
+
driver.render(path, :full => true)
|
118
|
+
end
|
119
|
+
|
120
|
+
register_driver(:poltergeist_billy) do |driver, path|
|
121
|
+
driver.render(path, :full => true)
|
122
|
+
end
|
123
|
+
|
124
|
+
register_driver(:webkit) do |driver, path|
|
125
|
+
if driver.respond_to?(:save_screenshot)
|
126
|
+
driver.save_screenshot(path, webkit_options)
|
127
|
+
else
|
128
|
+
driver.render(path)
|
129
|
+
end
|
130
|
+
end
|
131
|
+
|
132
|
+
register_driver(:webkit_debug) do |driver, path|
|
133
|
+
driver.render(path)
|
134
|
+
end
|
135
|
+
|
136
|
+
register_driver(:terminus) do |driver, path|
|
137
|
+
if driver.respond_to?(:save_screenshot)
|
138
|
+
driver.save_screenshot(path)
|
139
|
+
else
|
140
|
+
:not_supported
|
141
|
+
end
|
142
|
+
end
|
143
|
+
end
|
144
|
+
|
145
|
+
# Register filename prefix formatters
|
146
|
+
Capybara::Screenshot.class_eval do
|
147
|
+
register_filename_prefix_formatter(:default) do |test|
|
148
|
+
'screenshot'
|
149
|
+
end
|
150
|
+
end
|
151
|
+
|
152
|
+
require 'capybara/dsl'
|
153
|
+
require 'capybara/util/save_and_open_page' if Capybara::VERSION.match(/^\d+/)[0] == '1' # no longer needed in Capybara version 2
|
154
|
+
|
155
|
+
require 'capybara-screenshot/saver'
|
156
|
+
require 'capybara-screenshot/capybara'
|
157
|
+
require 'capybara-screenshot/pruner'
|
@@ -0,0 +1,28 @@
|
|
1
|
+
require "capybara-screenshot"
|
2
|
+
|
3
|
+
module Capybara
|
4
|
+
module DSL
|
5
|
+
# Adds class methods to Capybara module and gets mixed into
|
6
|
+
# the current scope during Cucumber and RSpec tests
|
7
|
+
|
8
|
+
def screenshot_and_save_page
|
9
|
+
Capybara::Screenshot.screenshot_and_save_page
|
10
|
+
end
|
11
|
+
|
12
|
+
def screenshot_and_open_image
|
13
|
+
Capybara::Screenshot.screenshot_and_open_image
|
14
|
+
end
|
15
|
+
|
16
|
+
def using_session_with_screenshot(name)
|
17
|
+
using_session_without_screenshot(name) do
|
18
|
+
original_session_name = Capybara.session_name
|
19
|
+
Capybara::Screenshot.final_session_name = name
|
20
|
+
yield
|
21
|
+
Capybara::Screenshot.final_session_name = original_session_name
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
alias_method :using_session_without_screenshot, :using_session
|
26
|
+
alias_method :using_session, :using_session_with_screenshot
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
require "capybara-screenshot"
|
2
|
+
|
3
|
+
Before do |scenario|
|
4
|
+
Capybara::Screenshot.final_session_name = nil
|
5
|
+
end
|
6
|
+
|
7
|
+
After do |scenario|
|
8
|
+
if Capybara::Screenshot.autosave_on_failure && scenario.failed?
|
9
|
+
Capybara.using_session(Capybara::Screenshot.final_session_name) do
|
10
|
+
filename_prefix = Capybara::Screenshot.filename_prefix_for(:cucumber, scenario)
|
11
|
+
|
12
|
+
saver = Capybara::Screenshot::Saver.new(Capybara, Capybara.page, true, filename_prefix)
|
13
|
+
saver.save
|
14
|
+
saver.output_screenshot_path
|
15
|
+
|
16
|
+
# Trying to embed the screenshot into our output."
|
17
|
+
if File.exist?(saver.screenshot_path)
|
18
|
+
require "base64"
|
19
|
+
#encode the image into it's base64 representation
|
20
|
+
image = open(saver.screenshot_path, 'rb') {|io|io.read}
|
21
|
+
encoded_img = Base64.encode64(image)
|
22
|
+
#this will embed the image in the HTML report, embed() is defined in cucumber
|
23
|
+
embed(encoded_img, 'image/png;base64', "Screenshot of the error")
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
require "capybara-screenshot"
|
2
|
+
|
3
|
+
module Capybara::Screenshot::MiniTestPlugin
|
4
|
+
def before_setup
|
5
|
+
super
|
6
|
+
Capybara::Screenshot.final_session_name = nil
|
7
|
+
end
|
8
|
+
|
9
|
+
def after_teardown
|
10
|
+
super
|
11
|
+
if self.class.ancestors.map(&:to_s).include?('ActionDispatch::IntegrationTest')
|
12
|
+
if Capybara::Screenshot.autosave_on_failure && !passed?
|
13
|
+
Capybara.using_session(Capybara::Screenshot.final_session_name) do
|
14
|
+
filename_prefix = Capybara::Screenshot.filename_prefix_for(:minitest, self)
|
15
|
+
|
16
|
+
saver = Capybara::Screenshot::Saver.new(Capybara, Capybara.page, true, filename_prefix)
|
17
|
+
saver.save
|
18
|
+
saver.output_screenshot_path
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
class MiniTest::Unit::TestCase
|
26
|
+
include Capybara::Screenshot::MiniTestPlugin
|
27
|
+
end
|
@@ -0,0 +1,47 @@
|
|
1
|
+
module Capybara
|
2
|
+
module Screenshot
|
3
|
+
class Pruner
|
4
|
+
attr_reader :strategy
|
5
|
+
|
6
|
+
def initialize(strategy)
|
7
|
+
@strategy = strategy
|
8
|
+
|
9
|
+
@strategy_proc = case strategy
|
10
|
+
when :keep_all
|
11
|
+
-> { }
|
12
|
+
when :keep_last_run
|
13
|
+
-> { prune_with_last_run_strategy }
|
14
|
+
when Hash
|
15
|
+
raise ArgumentError, ":keep key is required" unless strategy[:keep]
|
16
|
+
raise ArgumentError, ":keep value must be number greater than zero" unless strategy[:keep].to_i > 0
|
17
|
+
-> { prune_with_numeric_strategy(strategy[:keep].to_i) }
|
18
|
+
else
|
19
|
+
fail "Invalid prune strategy #{strategy}. `:keep_all`or `{ keep: 10 }` are valid examples."
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
def prune_old_screenshots
|
24
|
+
strategy_proc.call
|
25
|
+
end
|
26
|
+
|
27
|
+
private
|
28
|
+
attr_reader :strategy_proc
|
29
|
+
|
30
|
+
def wildcard_path
|
31
|
+
File.expand_path('*', Screenshot.capybara_root)
|
32
|
+
end
|
33
|
+
|
34
|
+
def prune_with_last_run_strategy
|
35
|
+
FileUtils.rm_rf(Dir.glob(wildcard_path))
|
36
|
+
end
|
37
|
+
|
38
|
+
def prune_with_numeric_strategy(count)
|
39
|
+
files = Dir.glob(wildcard_path).sort_by do |file_name|
|
40
|
+
File.mtime(File.expand_path(file_name, Screenshot.capybara_root))
|
41
|
+
end
|
42
|
+
|
43
|
+
FileUtils.rm_rf(files[0...-count])
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|