123456789_123456789_123456789_123456789_123456789_

Module: ActionDispatch::SystemTesting::TestHelpers::ScreenshotHelper

Relationships & Source Files
Extension / Inclusion / Inheritance Descendants
Included In:
Defined in: actionpack/lib/action_dispatch/system_testing/test_helpers/screenshot_helper.rb

Overview

Screenshot helper for system testing.

Instance Attribute Summary

Instance Method Summary

Instance Attribute Details

#_screenshot_counter (rw, private)

[ GitHub ]

  
# File 'actionpack/lib/action_dispatch/system_testing/test_helpers/screenshot_helper.rb', line 61

attr_accessor :_screenshot_counter

#failed?Boolean (readonly, private)

[ GitHub ]

  
# File 'actionpack/lib/action_dispatch/system_testing/test_helpers/screenshot_helper.rb', line 154

def failed?
  !passed? && !skipped?
end

#html_from_env?Boolean (readonly, private)

[ GitHub ]

  
# File 'actionpack/lib/action_dispatch/system_testing/test_helpers/screenshot_helper.rb', line 63

def html_from_env?
  ENV["RAILS_SYSTEM_TESTING_SCREENSHOT_HTML"] == "1"
end

#supports_screenshot?Boolean (readonly, private)

[ GitHub ]

  
# File 'actionpack/lib/action_dispatch/system_testing/test_helpers/screenshot_helper.rb', line 158

def supports_screenshot?
  Capybara.current_driver != :rack_test
end

Instance Method Details

#absolute_html_path (private)

[ GitHub ]

  
# File 'actionpack/lib/action_dispatch/system_testing/test_helpers/screenshot_helper.rb', line 106

def absolute_html_path
  "#{absolute_path}.html"
end

#absolute_image_path (private)

[ GitHub ]

  
# File 'actionpack/lib/action_dispatch/system_testing/test_helpers/screenshot_helper.rb', line 98

def absolute_image_path
  "#{absolute_path}.png"
end

#absolute_path (private)

[ GitHub ]

  
# File 'actionpack/lib/action_dispatch/system_testing/test_helpers/screenshot_helper.rb', line 90

def absolute_path
  Rails.root.join(screenshots_dir, image_name)
end

#display_image(html:, screenshot_output:) (private)

[ GitHub ]

  
# File 'actionpack/lib/action_dispatch/system_testing/test_helpers/screenshot_helper.rb', line 134

def display_image(html:, screenshot_output:)
  message = +"[Screenshot Image]: #{image_path}\n"
  message << +"[Screenshot HTML]: #{html_path}\n" if html

  case screenshot_output || output_type
  when "artifact"
    message << "\e]1338;url=artifact://#{absolute_image_path}\a\n"
  when "inline"
    name = inline_base64(File.basename(absolute_image_path))
    image = inline_base64(File.read(absolute_image_path))
    message << "\e]1337;File=name=#{name};height=400px;inline=1:#{image}\a\n"
  end

  message
end

#html_path (private)

[ GitHub ]

  
# File 'actionpack/lib/action_dispatch/system_testing/test_helpers/screenshot_helper.rb', line 86

def html_path
  absolute_html_path.to_s
end

#image_name (private)

[ GitHub ]

  
# File 'actionpack/lib/action_dispatch/system_testing/test_helpers/screenshot_helper.rb', line 76

def image_name
  sanitized_method_name = method_name.gsub(/[^\w]+/, "-")
  name = "#{unique}_#{sanitized_method_name}"
  name[0...225]
end

#image_path (private)

[ GitHub ]

  
# File 'actionpack/lib/action_dispatch/system_testing/test_helpers/screenshot_helper.rb', line 82

def image_path
  absolute_image_path.to_s
end

#increment_unique (private)

[ GitHub ]

  
# File 'actionpack/lib/action_dispatch/system_testing/test_helpers/screenshot_helper.rb', line 67

def increment_unique
  @_screenshot_counter ||= 0
  @_screenshot_counter += 1
end

#inline_base64(path) (private)

[ GitHub ]

  
# File 'actionpack/lib/action_dispatch/system_testing/test_helpers/screenshot_helper.rb', line 150

def inline_base64(path)
  Base64.strict_encode64(path)
end

#output_type (private)

[ GitHub ]

  
# File 'actionpack/lib/action_dispatch/system_testing/test_helpers/screenshot_helper.rb', line 120

def output_type
  # Environment variables have priority
  output_type = ENV["RAILS_SYSTEM_TESTING_SCREENSHOT"] || ENV["CAPYBARA_INLINE_SCREENSHOT"]

  # Default to outputting a path to the screenshot
  output_type ||= "simple"

  output_type
end

#relative_image_path (private)

[ GitHub ]

  
# File 'actionpack/lib/action_dispatch/system_testing/test_helpers/screenshot_helper.rb', line 102

def relative_image_path
  "#{absolute_path.relative_path_from(Rails.root)}.png"
end

#save_html (private)

[ GitHub ]

  
# File 'actionpack/lib/action_dispatch/system_testing/test_helpers/screenshot_helper.rb', line 111

def save_html
  page.save_page(absolute_html_path)
end

#save_image (private)

[ GitHub ]

  
# File 'actionpack/lib/action_dispatch/system_testing/test_helpers/screenshot_helper.rb', line 115

def save_image
  page.save_screenshot(absolute_image_path)
end

#screenshots_dir (private)

[ GitHub ]

  
# File 'actionpack/lib/action_dispatch/system_testing/test_helpers/screenshot_helper.rb', line 94

def screenshots_dir
  Capybara.save_path.presence || "tmp/screenshots"
end

#show(img) (private)

[ GitHub ]

  
# File 'actionpack/lib/action_dispatch/system_testing/test_helpers/screenshot_helper.rb', line 130

def show(img)
  puts img
end

#take_failed_screenshot

Takes a screenshot of the current page in the browser if the test failed.

take_failed_screenshot is called during system test teardown.

[ GitHub ]

  
# File 'actionpack/lib/action_dispatch/system_testing/test_helpers/screenshot_helper.rb', line 53

def take_failed_screenshot
  return unless failed? && supports_screenshot? && Capybara::Session.instance_created?

  take_screenshot
  [:failure_screenshot_path] = relative_image_path if Minitest::Runnable.method_defined?(:)
end

#take_screenshot(html: false, screenshot: nil)

Takes a screenshot of the current page in the browser.

take_screenshot can be used at any point in your system tests to take a screenshot of the current state. This can be useful for debugging or automating visual testing. You can take multiple screenshots per test to investigate changes at different points during your test. These will be named with a sequential prefix (or ‘failed’ for failing tests)

The default screenshots directory is tmp/screenshots but you can set a different one with Capybara.save_path

You can use the html argument or set the RAILS_SYSTEM_TESTING_SCREENSHOT_HTML environment variable to save the HTML from the page that is being screenshotted so you can investigate the elements on the page at the time of the screenshot

You can use the screenshot argument or set the RAILS_SYSTEM_TESTING_SCREENSHOT environment variable to control the output. Possible values are:

{simple} (default)

: Only displays the screenshot path. This is the default value.

{inline}

: Display the screenshot in the terminal using the iTerm image protocol

    (https://iterm2.com/documentation-images.html).

{artifact}

: Display the screenshot in the terminal, using the terminal artifact

format (https://buildkite.github.io/terminal-to-html/inline-images/).
[ GitHub ]

  
# File 'actionpack/lib/action_dispatch/system_testing/test_helpers/screenshot_helper.rb', line 41

def take_screenshot(html: false, screenshot: nil)
  showing_html = html || html_from_env?

  increment_unique
  save_html if showing_html
  save_image
  show display_image(html: showing_html, screenshot_output: screenshot)
end

#unique (private)

[ GitHub ]

  
# File 'actionpack/lib/action_dispatch/system_testing/test_helpers/screenshot_helper.rb', line 72

def unique
  failed? ? "failures" : (_screenshot_counter || 0).to_s
end