capybara-screenshot 1.0.13 → 1.0.26

Sign up to get free protection for your applications and to get access to all the features.
Files changed (48) hide show
  1. checksums.yaml +5 -5
  2. data/.travis.yml +11 -12
  3. data/Appraisals +14 -16
  4. data/CHANGELOG.md +69 -0
  5. data/Gemfile +4 -3
  6. data/README.md +96 -30
  7. data/capybara-screenshot.gemspec +12 -5
  8. data/gemfiles/cucumber.1.3.gemfile +12 -0
  9. data/gemfiles/cucumber.2.4.gemfile +12 -0
  10. data/gemfiles/latest.gemfile +5 -2
  11. data/gemfiles/rspec.3.0.gemfile +5 -2
  12. data/gemfiles/rspec.3.3.gemfile +12 -0
  13. data/gemfiles/spinach.0.8.gemfile +12 -0
  14. data/lib/capybara-screenshot/callbacks.rb +44 -0
  15. data/lib/capybara-screenshot/capybara.rb +26 -10
  16. data/lib/capybara-screenshot/cucumber.rb +12 -5
  17. data/lib/capybara-screenshot/minitest.rb +1 -1
  18. data/lib/capybara-screenshot/pruner.rb +5 -1
  19. data/lib/capybara-screenshot/rspec/base_reporter.rb +1 -2
  20. data/lib/capybara-screenshot/rspec/html_embed_reporter.rb +14 -3
  21. data/lib/capybara-screenshot/rspec/html_link_reporter.rb +1 -1
  22. data/lib/capybara-screenshot/rspec/text_reporter.rb +2 -2
  23. data/lib/capybara-screenshot/rspec.rb +25 -3
  24. data/lib/capybara-screenshot/s3_saver.rb +39 -11
  25. data/lib/capybara-screenshot/saver.rb +60 -15
  26. data/lib/capybara-screenshot/version.rb +1 -1
  27. data/lib/capybara-screenshot.rb +38 -3
  28. data/spec/cucumber/cucumber_spec.rb +4 -8
  29. data/spec/feature/minitest_spec.rb +2 -6
  30. data/spec/feature/testunit_spec.rb +3 -7
  31. data/spec/rspec/rspec_spec.rb +36 -8
  32. data/spec/spinach/spinach_spec.rb +4 -8
  33. data/spec/support/aruba.rb +0 -1
  34. data/spec/support/common_setup.rb +13 -5
  35. data/spec/unit/capybara-screenshot_spec.rb +2 -1
  36. data/spec/unit/capybara_spec.rb +13 -0
  37. data/spec/unit/pruner_spec.rb +2 -2
  38. data/spec/unit/rspec_reporters/html_embed_reporter_spec.rb +13 -0
  39. data/spec/unit/rspec_reporters/text_reporter_spec.rb +6 -6
  40. data/spec/unit/s3_saver_spec.rb +196 -14
  41. data/spec/unit/saver_spec.rb +132 -16
  42. metadata +19 -17
  43. data/gemfiles/cucumber.1.2.gemfile +0 -9
  44. data/gemfiles/cucumber.1.3.0.gemfile +0 -9
  45. data/gemfiles/rspec.2.14.gemfile +0 -9
  46. data/gemfiles/rspec.2.99.gemfile +0 -9
  47. data/gemfiles/spinach.0.7.gemfile +0 -9
  48. data/gemfiles/spinach.0.8.0.gemfile +0 -9
@@ -15,13 +15,20 @@ After do |scenario|
15
15
 
16
16
  # Trying to embed the screenshot into our output."
17
17
  if File.exist?(saver.screenshot_path)
18
- require "base64"
19
- #encode the image into it's base64 representation
20
18
  image = open(saver.screenshot_path, 'rb') {|io|io.read}
21
19
  saver.display_image
22
- #this will embed the image in the HTML report, embed() is defined in cucumber
23
- encoded_img = Base64.encode64(image)
24
- embed(encoded_img, 'image/png;base64', "Screenshot of the error")
20
+
21
+ # cucumber5 deprecates embed in favor of attach
22
+ if respond_to? :attach
23
+ #this will embed the image in the HTML report, attach() is defined in cucumber
24
+ attach(image, 'image/png')
25
+ else
26
+ #encode the image into it's base64 representation
27
+ require "base64"
28
+ encoded_img = Base64.encode64(image)
29
+ #this will embed the image in the HTML report, embed() is defined in cucumber
30
+ embed(encoded_img, 'image/png;base64', "Screenshot of the error")
31
+ end
25
32
  end
26
33
  end
27
34
  end
@@ -27,7 +27,7 @@ begin
27
27
  class Minitest::Test
28
28
  include Capybara::Screenshot::MiniTestPlugin
29
29
  end
30
- rescue NameError => e
30
+ rescue NameError
31
31
  class MiniTest::Unit::TestCase
32
32
  include Capybara::Screenshot::MiniTestPlugin
33
33
  end
@@ -13,6 +13,7 @@ module Capybara
13
13
  lambda { prune_with_last_run_strategy }
14
14
  when Hash
15
15
  raise ArgumentError, ":keep key is required" unless strategy[:keep]
16
+ raise ArgumentError, ":keep must be a Integer" unless strategy[:keep].kind_of?(Integer)
16
17
  raise ArgumentError, ":keep value must be number greater than zero" unless strategy[:keep].to_i > 0
17
18
  lambda { prune_with_numeric_strategy(strategy[:keep].to_i) }
18
19
  else
@@ -25,7 +26,10 @@ module Capybara
25
26
  end
26
27
 
27
28
  private
28
- attr_reader :strategy_proc
29
+
30
+ def strategy_proc
31
+ @strategy_proc
32
+ end
29
33
 
30
34
  def wildcard_path
31
35
  File.expand_path('*.{html,png}', Screenshot.capybara_root)
@@ -3,7 +3,7 @@ module Capybara
3
3
  module RSpec
4
4
  module BaseReporter
5
5
 
6
- # Automatically set up method aliases (very much like ActiveSupport's `alias_method_chain`)
6
+ # Automatically set up method aliases (very much like ActiveSupport's `alias_method_chain`)
7
7
  # when the module gets included.
8
8
  def enhance_with_screenshot(method)
9
9
  with_method, without_method = "#{method}_with_screenshot", "#{method}_without_screenshot"
@@ -14,7 +14,6 @@ module Capybara
14
14
  end
15
15
  end
16
16
  end
17
-
18
17
  end
19
18
  end
20
19
  end
@@ -1,5 +1,6 @@
1
1
  require 'capybara-screenshot/rspec/base_reporter'
2
2
  require 'base64'
3
+ require 'uri'
3
4
 
4
5
  module Capybara
5
6
  module Screenshot
@@ -13,12 +14,22 @@ module Capybara
13
14
  example = @failed_examples.last
14
15
  # Ignores saved html file, only saved image will be embedded (if present)
15
16
  if (screenshot = example.metadata[:screenshot]) && screenshot[:image]
16
- image = File.binread(screenshot[:image])
17
- encoded_img = Base64.encode64(image)
18
- result += "<img src='data:image/png;base64,#{encoded_img}' style='display: block'>"
17
+ result += "<img src='#{image_tag_source(screenshot[:image])}' style='display: block'>"
19
18
  end
20
19
  result
21
20
  end
21
+
22
+ private
23
+
24
+ def image_tag_source(path)
25
+ if URI.regexp(%w[http https]) =~ path
26
+ path
27
+ else
28
+ image = File.binread(path)
29
+ encoded_img = Base64.encode64(image)
30
+ "data:image/png;base64,#{encoded_img}"
31
+ end
32
+ end
22
33
  end
23
34
  end
24
35
  end
@@ -22,7 +22,7 @@ module Capybara
22
22
  end
23
23
 
24
24
  def link_to_screenshot(title, path)
25
- url = URI.escape("file://#{path}")
25
+ url = URI::DEFAULT_PARSER.escape("file://#{path}")
26
26
  title = CGI.escape_html(title)
27
27
  attributes = attributes_for_screenshot_link(url).map { |name, val| %{#{name}="#{CGI.escape_html(val)}"} }.join(" ")
28
28
  "<a #{attributes}>#{title}</a>"
@@ -26,8 +26,8 @@ module Capybara
26
26
  private
27
27
  def output_screenshot_info(example)
28
28
  return unless (screenshot = example.metadata[:screenshot])
29
- output.puts(long_padding + CapybaraScreenshot::Helpers.yellow("HTML screenshot: file://#{screenshot[:html]}")) if screenshot[:html]
30
- output.puts(long_padding + CapybaraScreenshot::Helpers.yellow("Image screenshot: file://#{screenshot[:image]}")) if screenshot[:image]
29
+ output.puts(long_padding + CapybaraScreenshot::Helpers.yellow("HTML screenshot: #{screenshot[:html]}")) if screenshot[:html]
30
+ output.puts(long_padding + CapybaraScreenshot::Helpers.yellow("Image screenshot: #{screenshot[:image]}")) if screenshot[:image]
31
31
  end
32
32
 
33
33
  def long_padding
@@ -43,7 +43,8 @@ module Capybara
43
43
  "RSpec::Core::Formatters::JsonFormatter" => Capybara::Screenshot::RSpec::JsonReporter,
44
44
  "RSpec::Core::Formatters::TextMateFormatter" => Capybara::Screenshot::RSpec::TextMateLinkReporter, # RSpec 2
45
45
  "RSpec::Mate::Formatters::TextMateFormatter" => Capybara::Screenshot::RSpec::TextMateLinkReporter, # RSpec 3
46
- "Fuubar" => Capybara::Screenshot::RSpec::TextReporter
46
+ "Fuubar" => Capybara::Screenshot::RSpec::TextReporter,
47
+ "Spec::Runner::Formatter::TeamcityFormatter" => Capybara::Screenshot::RSpec::TextReporter
47
48
  }
48
49
 
49
50
  class << self
@@ -52,7 +53,7 @@ module Capybara
52
53
  def after_failed_example(example)
53
54
  if example.example_group.include?(Capybara::DSL) # Capybara DSL method has been included for a feature we can snapshot
54
55
  Capybara.using_session(Capybara::Screenshot.final_session_name) do
55
- if Capybara.page.current_url != '' && Capybara::Screenshot.autosave_on_failure && example.exception
56
+ if Capybara::Screenshot.autosave_on_failure && failed?(example) && Capybara.page.current_url != ''
56
57
  filename_prefix = Capybara::Screenshot.filename_prefix_for(:rspec, example)
57
58
 
58
59
  saver = Capybara::Screenshot.new_saver(Capybara, Capybara.page, true, filename_prefix)
@@ -65,6 +66,18 @@ module Capybara
65
66
  end
66
67
  end
67
68
  end
69
+
70
+ private
71
+
72
+ def failed?(example)
73
+ return true if example.exception
74
+ return false unless defined?(::RSpec::Expectations::FailureAggregator)
75
+
76
+ failure_notifier = ::RSpec::Support.failure_notifier
77
+ return false unless failure_notifier.is_a?(::RSpec::Expectations::FailureAggregator)
78
+
79
+ failure_notifier.failures.any? || failure_notifier.other_errors.any?
80
+ end
68
81
  end
69
82
 
70
83
  self.add_link_to_screenshot_for_failed_examples = true
@@ -77,7 +90,15 @@ RSpec.configure do |config|
77
90
  Capybara::Screenshot.final_session_name = nil
78
91
  end
79
92
 
80
- config.after do |example_from_block_arg|
93
+ # TODO: DRY refactor into a method?
94
+ # Add support for Rails system specs (previously only worked with feature specs)
95
+ config.after(type: :system) do |example_from_block_arg|
96
+ # RSpec 3 no longer defines `example`, but passes the example as block argument instead
97
+ example = config.respond_to?(:expose_current_running_example_as) ? example_from_block_arg : self.example
98
+
99
+ Capybara::Screenshot::RSpec.after_failed_example(example)
100
+ end
101
+ config.after(type: :feature) do |example_from_block_arg|
81
102
  # RSpec 3 no longer defines `example`, but passes the example as block argument instead
82
103
  example = config.respond_to?(:expose_current_running_example_as) ? example_from_block_arg : self.example
83
104
 
@@ -88,6 +109,7 @@ RSpec.configure do |config|
88
109
  if Capybara::Screenshot::RSpec.add_link_to_screenshot_for_failed_examples
89
110
  RSpec.configuration.formatters.each do |formatter|
90
111
  next unless (reporter_module = Capybara::Screenshot::RSpec::REPORTERS[formatter.class.to_s])
112
+ next if formatter.singleton_class.included_modules.include?(reporter_module)
91
113
  formatter.singleton_class.send :include, reporter_module
92
114
  end
93
115
  end
@@ -1,17 +1,22 @@
1
- require 'aws-sdk'
1
+ require 'aws-sdk-s3'
2
2
 
3
3
  module Capybara
4
4
  module Screenshot
5
5
  class S3Saver
6
6
  DEFAULT_REGION = 'us-east-1'
7
7
 
8
- def initialize(saver, s3_client, bucket_name)
8
+ attr_accessor :html_path, :screenshot_path
9
+
10
+ def initialize(saver, s3_client, bucket_name, object_configuration, options={})
9
11
  @saver = saver
10
12
  @s3_client = s3_client
11
13
  @bucket_name = bucket_name
14
+ @bucket_host = options[:bucket_host]
15
+ @key_prefix = options[:key_prefix]
16
+ @object_configuration = object_configuration
12
17
  end
13
18
 
14
- def self.new_with_configuration(saver, configuration)
19
+ def self.new_with_configuration(saver, configuration, object_configuration)
15
20
  default_s3_client_credentials = {
16
21
  region: DEFAULT_REGION
17
22
  }
@@ -23,19 +28,31 @@ module Capybara
23
28
  s3_client = Aws::S3::Client.new(s3_client_credentials)
24
29
  bucket_name = configuration.fetch(:bucket_name)
25
30
 
26
- new(saver, s3_client, bucket_name)
31
+ new(saver, s3_client, bucket_name, object_configuration, configuration)
27
32
  rescue KeyError
28
33
  raise "Invalid S3 Configuration #{configuration}. Please refer to the documentation for the necessary configurations."
29
34
  end
30
35
 
31
36
  def save_and_upload_screenshot
32
- save_and do |local_file_path|
37
+ save_and do |type, local_file_path|
33
38
  File.open(local_file_path) do |file|
39
+ s3_upload_path = "#{@key_prefix}#{File.basename(local_file_path)}"
40
+
41
+ object_payload = {
42
+ bucket: bucket_name,
43
+ key: s3_upload_path,
44
+ body: file
45
+ }
46
+
47
+ object_payload.merge!(object_configuration) unless object_configuration.empty?
48
+
34
49
  s3_client.put_object(
35
- bucket: bucket_name,
36
- key: File.basename(local_file_path),
37
- body: file
50
+ object_payload
38
51
  )
52
+
53
+ host = bucket_host || determine_bucket_host
54
+
55
+ send("#{type}_path=", "https://#{host}/#{s3_upload_path}")
39
56
  end
40
57
  end
41
58
  end
@@ -51,13 +68,24 @@ module Capybara
51
68
  private
52
69
  attr_reader :saver,
53
70
  :s3_client,
54
- :bucket_name
71
+ :bucket_name,
72
+ :bucket_host,
73
+ :object_configuration
74
+ :key_prefix
75
+
76
+ ##
77
+ # Reads the bucket location using a S3 get_bucket_location request.
78
+ # Requires the +s3:GetBucketLocation+ policy.
79
+ def determine_bucket_host
80
+ s3_region = s3_client.get_bucket_location(bucket: bucket_name).location_constraint
81
+ "#{bucket_name}.s3-#{s3_region}.amazonaws.com"
82
+ end
55
83
 
56
84
  def save_and
57
85
  saver.save
58
86
 
59
- yield(saver.html_path) if block_given? && saver.html_saved?
60
- yield(saver.screenshot_path) if block_given? && saver.screenshot_saved?
87
+ yield(:html, saver.html_path) if block_given? && saver.html_saved?
88
+ yield(:screenshot, saver.screenshot_path) if block_given? && saver.screenshot_saved?
61
89
  end
62
90
  end
63
91
  end
@@ -1,9 +1,16 @@
1
1
  require 'capybara-screenshot/helpers'
2
+ require 'capybara-screenshot/callbacks'
2
3
 
3
4
  module Capybara
4
5
  module Screenshot
5
6
  class Saver
7
+ include Capybara::Screenshot::Callbacks
8
+
9
+ define_callback :after_save_html
10
+ define_callback :after_save_screenshot
11
+
6
12
  attr_reader :capybara, :page, :file_base_name
13
+
7
14
  def initialize(capybara, page, html_save=true, filename_prefix='screenshot')
8
15
  @capybara, @page, @html_save = capybara, page, html_save
9
16
  time_now = Time.now
@@ -19,34 +26,50 @@ module Capybara
19
26
  end
20
27
 
21
28
  def save
22
- # if current_path empty then nothing to screen shot as browser has not loaded any URL
23
- return if capybara.current_path.to_s.empty?
24
-
25
- save_html if @html_save
26
- save_screenshot
29
+ current_path do |path|
30
+ within_offending_window do
31
+ if path.empty?
32
+ warn 'WARN: Screenshot could not be saved. `page.current_path` is empty.'
33
+ else
34
+ begin
35
+ save_html if @html_save
36
+ rescue StandardError => e
37
+ warn "WARN: HTML source could not be saved. An exception is raised: #{e.inspect}."
38
+ end
39
+
40
+ begin
41
+ save_screenshot
42
+ rescue StandardError => e
43
+ warn "WARN: Screenshot could not be saved. An exception is raised: #{e.inspect}."
44
+ end
45
+ end
46
+ end
47
+ end
27
48
  end
28
49
 
29
50
  def save_html
30
51
  path = html_path
31
- clear_save_and_open_page_path do
52
+ clear_save_path do
32
53
  if Capybara::VERSION.match(/^\d+/)[0] == '1'
33
- capybara.save_page(page.body, "#{path}")
54
+ capybara.save_page(page.body, path.to_s)
34
55
  else
35
- capybara.save_page("#{path}")
56
+ capybara.save_page(path.to_s)
36
57
  end
37
58
  end
38
59
  @html_saved = true
60
+ run_callbacks :after_save_html, html_path if html_saved?
39
61
  end
40
62
 
41
63
  def save_screenshot
42
64
  path = screenshot_path
43
- clear_save_and_open_page_path do
65
+ clear_save_path do
44
66
  result = Capybara::Screenshot.registered_drivers.fetch(capybara.current_driver) { |driver_name|
45
67
  warn "capybara-screenshot could not detect a screenshot driver for '#{capybara.current_driver}'. Saving with default with unknown results."
46
68
  Capybara::Screenshot.registered_drivers[:default]
47
69
  }.call(page.driver, path)
48
70
  @screenshot_saved = result != :not_supported
49
71
  end
72
+ run_callbacks :after_save_screenshot, screenshot_path if screenshot_saved?
50
73
  end
51
74
 
52
75
  def html_path
@@ -65,15 +88,15 @@ module Capybara
65
88
  @screenshot_saved
66
89
  end
67
90
 
68
- # If Capybara.save_and_open_page_path is set then
91
+ # If Capybara::Screenshot.capybara_tmp_path is set then
69
92
  # the html_path or screenshot_path can be appended to this path in
70
93
  # some versions of Capybara instead of using it as an absolute path
71
- def clear_save_and_open_page_path
72
- old_path = Capybara.save_and_open_page_path
73
- Capybara.save_and_open_page_path = nil
94
+ def clear_save_path
95
+ old_path = Capybara::Screenshot.capybara_tmp_path
96
+ Capybara::Screenshot.capybara_tmp_path = nil
74
97
  yield
75
98
  ensure
76
- Capybara.save_and_open_page_path = old_path
99
+ Capybara::Screenshot.capybara_tmp_path = old_path
77
100
  end
78
101
 
79
102
  def output_screenshot_path
@@ -88,6 +111,16 @@ module Capybara
88
111
 
89
112
  private
90
113
 
114
+ def current_path
115
+ # the current_path may raise error in selenium
116
+ begin
117
+ path = page.current_path.to_s
118
+ rescue StandardError => e
119
+ warn "WARN: Screenshot could not be saved. `page.current_path` raised exception: #{e.inspect}."
120
+ end
121
+ yield path if path
122
+ end
123
+
91
124
  def output(message)
92
125
  puts " #{CapybaraScreenshot::Helpers.yellow(message)}"
93
126
  end
@@ -101,13 +134,25 @@ module Capybara
101
134
  # which('ruby') #=> /usr/bin/ruby
102
135
  def which(cmd)
103
136
  exts = ENV['PATHEXT'] ? ENV['PATHEXT'].split(';') : ['']
137
+
104
138
  ENV['PATH'].split(File::PATH_SEPARATOR).each do |path|
105
139
  exts.each { |ext|
106
140
  exe = File.join(path, "#{cmd}#{ext}")
107
141
  return exe if File.executable?(exe) && !File.directory?(exe)
108
142
  }
109
143
  end
110
- return nil
144
+
145
+ nil
146
+ end
147
+
148
+ def within_offending_window
149
+ return yield unless Thread.current[:capybara_screenshot_offending_window]
150
+
151
+ page.within_window(Thread.current[:capybara_screenshot_offending_window]) do
152
+ yield
153
+ end
154
+
155
+ Thread.current[:capybara_screenshot_offending_window] = nil
111
156
  end
112
157
  end
113
158
  end
@@ -1,5 +1,5 @@
1
1
  module Capybara
2
2
  module Screenshot
3
- VERSION = '1.0.13'
3
+ VERSION = '1.0.26'
4
4
  end
5
5
  end
@@ -10,6 +10,7 @@ module Capybara
10
10
  attr_writer :final_session_name
11
11
  attr_accessor :prune_strategy
12
12
  attr_accessor :s3_configuration
13
+ attr_accessor :s3_object_configuration
13
14
  end
14
15
 
15
16
  self.autosave_on_failure = true
@@ -20,6 +21,7 @@ module Capybara
20
21
  self.webkit_options = {}
21
22
  self.prune_strategy = :keep_all
22
23
  self.s3_configuration = {}
24
+ self.s3_object_configuration = {}
23
25
 
24
26
  def self.append_screenshot_path=(value)
25
27
  $stderr.puts "WARNING: Capybara::Screenshot.append_screenshot_path is deprecated. " +
@@ -56,7 +58,7 @@ module Capybara
56
58
  end
57
59
 
58
60
  def self.capybara_root
59
- @capybara_root ||= if defined?(::Rails) && ::Rails.root.present?
61
+ @capybara_root ||= if defined?(::Rails) && ::Rails.respond_to?(:root) && ::Rails.root.present?
60
62
  ::Rails.root.join capybara_tmp_path
61
63
  elsif defined?(Padrino)
62
64
  File.expand_path(capybara_tmp_path, Padrino.root)
@@ -97,12 +99,20 @@ module Capybara
97
99
 
98
100
  unless s3_configuration.empty?
99
101
  require 'capybara-screenshot/s3_saver'
100
- saver = S3Saver.new_with_configuration(saver, s3_configuration)
102
+ saver = S3Saver.new_with_configuration(saver, s3_configuration, s3_object_configuration)
101
103
  end
102
104
 
103
105
  return saver
104
106
  end
105
107
 
108
+ def self.after_save_html &block
109
+ Saver.after_save_html(&block)
110
+ end
111
+
112
+ def self.after_save_screenshot &block
113
+ Saver.after_save_screenshot(&block)
114
+ end
115
+
106
116
  private
107
117
 
108
118
  # If the path isn't set, default to the current directory
@@ -115,6 +125,19 @@ module Capybara
115
125
  Capybara.save_and_open_page_path
116
126
  end || '.'
117
127
  end
128
+
129
+ # Configure the path unless '.'
130
+ def self.capybara_tmp_path=(path)
131
+ return if path == '.'
132
+
133
+ # `#save_and_open_page_path` is deprecated
134
+ # https://github.com/jnicklas/capybara/blob/48ab1ede946dec2250a2d1d8cbb3313f25096456/History.md#L37
135
+ if Capybara.respond_to?(:save_path)
136
+ Capybara.save_path = path
137
+ else
138
+ Capybara.save_and_open_page_path = path
139
+ end
140
+ end
118
141
  end
119
142
  end
120
143
 
@@ -133,10 +156,14 @@ Capybara::Screenshot.class_eval do
133
156
  :not_supported
134
157
  end
135
158
 
136
- register_driver(:selenium) do |driver, path|
159
+ selenium_block = proc do |driver, path|
137
160
  driver.browser.save_screenshot(path)
138
161
  end
139
162
 
163
+ register_driver :selenium, &selenium_block
164
+ register_driver :selenium_chrome, &selenium_block
165
+ register_driver :selenium_chrome_headless, &selenium_block
166
+
140
167
  register_driver(:poltergeist) do |driver, path|
141
168
  driver.render(path, :full => true)
142
169
  end
@@ -163,6 +190,14 @@ Capybara::Screenshot.class_eval do
163
190
  :not_supported
164
191
  end
165
192
  end
193
+
194
+ register_driver(:apparition) do |driver, path|
195
+ driver.save_screenshot(path)
196
+ end
197
+
198
+ register_driver(:cuprite) do |driver, path|
199
+ driver.render(path, :full => true)
200
+ end
166
201
  end
167
202
 
168
203
  # Register filename prefix formatters
@@ -3,10 +3,6 @@ require "spec_helper"
3
3
  describe "Using Capybara::Screenshot with Cucumber" do
4
4
  include CommonSetup
5
5
 
6
- before do
7
- setup_aruba
8
- end
9
-
10
6
  let(:cmd) { 'cucumber' }
11
7
 
12
8
  def run_failing_case(failure_message, code)
@@ -30,13 +26,13 @@ describe "Using Capybara::Screenshot with Cucumber" do
30
26
 
31
27
  write_file('features/cucumber.feature', code)
32
28
 
33
- run_simple_with_retry cmd, false
29
+ run_simple_with_retry cmd
34
30
 
35
31
  expect(last_command_started.output).to_not match(/failed|failure/i) if options[:assert_all_passed]
36
32
  end
37
33
 
38
34
  it 'saves a screenshot on failure' do
39
- run_failing_case %q{Unable to find link or button "you'll never find me"}, <<-CUCUMBER
35
+ run_failing_case %q{Unable to find (visible )?link or button "you'll never find me"}, <<-CUCUMBER
40
36
  Feature: Failure
41
37
  Scenario: Failure
42
38
  Given I visit "/"
@@ -56,7 +52,7 @@ describe "Using Capybara::Screenshot with Cucumber" do
56
52
  end
57
53
 
58
54
  it 'saves a screenshot for the correct session for failures using_session' do
59
- run_failing_case(%q{Unable to find link or button "you'll never find me"}, <<-CUCUMBER)
55
+ run_failing_case(%q{Unable to find (visible )?link or button "you'll never find me"}, <<-CUCUMBER)
60
56
  Feature: Failure
61
57
  Scenario: Failure in different session
62
58
  Given I visit "/"
@@ -72,7 +68,7 @@ describe "Using Capybara::Screenshot with Cucumber" do
72
68
  end
73
69
 
74
70
  it 'on failure it prunes previous screenshots when strategy is set' do
75
- run_failing_case %q{Unable to find link or button "you'll never find me"}, <<-CUCUMBER
71
+ run_failing_case %q{Unable to find (visible )?link or button "you'll never find me"}, <<-CUCUMBER
76
72
  Feature: Prune
77
73
  Scenario: Screenshots are pruned if strategy is set
78
74
  Given I visit "/"
@@ -3,10 +3,6 @@ require "spec_helper"
3
3
  describe "Using Capybara::Screenshot with MiniTest" do
4
4
  include CommonSetup
5
5
 
6
- before do
7
- setup_aruba
8
- end
9
-
10
6
  def run_failing_case(code)
11
7
  write_file('test_failure.rb', <<-RUBY)
12
8
  #{ensure_load_paths_valid}
@@ -26,8 +22,8 @@ describe "Using Capybara::Screenshot with MiniTest" do
26
22
  RUBY
27
23
 
28
24
  cmd = 'bundle exec ruby test_failure.rb'
29
- run_simple_with_retry cmd, false
30
- expect(last_command_started.output).to include %q{Unable to find link or button "you'll never find me"}
25
+ run_simple_with_retry cmd
26
+ expect(last_command_started.output).to match %r{Unable to find (visible )?link or button "you'll never find me"}
31
27
  end
32
28
 
33
29
  it 'saves a screenshot on failure' do
@@ -3,10 +3,6 @@ require "spec_helper"
3
3
  describe "Using Capybara::Screenshot with Test::Unit" do
4
4
  include CommonSetup
5
5
 
6
- before do
7
- setup_aruba
8
- end
9
-
10
6
  def run_failing_case(code, integration_path = '.')
11
7
  write_file("#{integration_path}/test_failure.rb", <<-RUBY)
12
8
  #{ensure_load_paths_valid}
@@ -18,7 +14,7 @@ describe "Using Capybara::Screenshot with Test::Unit" do
18
14
 
19
15
  #{setup_test_app}
20
16
  Capybara::Screenshot.register_filename_prefix_formatter(:testunit) do | fault |
21
- raise "expected fault" unless fault.exception.message.include? %q{Unable to find link or button "you'll never find me"}
17
+ raise "expected fault" unless fault.exception.message.match %r{Unable to find (visible )?link or button "you'll never find me"}
22
18
  'my_screenshot'
23
19
  end
24
20
 
@@ -32,8 +28,8 @@ describe "Using Capybara::Screenshot with Test::Unit" do
32
28
  RUBY
33
29
 
34
30
  cmd = "bundle exec ruby #{integration_path}/test_failure.rb"
35
- run_simple_with_retry cmd, false
36
- expect(last_command_started.output).to include %q{Unable to find link or button "you'll never find me"}
31
+ run_simple_with_retry cmd
32
+ expect(last_command_started.output).to match %r{Unable to find (visible )?link or button "you'll never find me"}
37
33
  end
38
34
 
39
35
  it "saves a screenshot on failure for any test in path 'test/integration'" do