module ActionDispatch::SystemTesting::TestHelpers::ScreenshotHelper

Screenshot helper for system testing.

Public Instance Methods

take_failed_screenshot() click to toggle source

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

take_failed_screenshot is included in application_system_test_case.rb that is generated with the application. To take screenshots when a test fails add take_failed_screenshot to the teardown block before clearing sessions.

# File lib/action_dispatch/system_testing/test_helpers/screenshot_helper.rb, line 36
def take_failed_screenshot
  take_screenshot if failed? && supports_screenshot?
end
take_screenshot() click to toggle source

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.

The screenshot will be displayed in your console, if supported.

You can set the RAILS_SYSTEM_TESTING_SCREENSHOT environment variable to control the output. Possible values are:

# File lib/action_dispatch/system_testing/test_helpers/screenshot_helper.rb, line 24
def take_screenshot
  save_image
  puts display_image
end

Private Instance Methods

absolute_image_path() click to toggle source
# File lib/action_dispatch/system_testing/test_helpers/screenshot_helper.rb, line 49
def absolute_image_path
  Rails.root.join("tmp/screenshots/#{image_name}.png")
end
display_image() click to toggle source
# File lib/action_dispatch/system_testing/test_helpers/screenshot_helper.rb, line 67
def display_image
  message = "[Screenshot]: #{image_path}\n".dup

  case 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
failed?() click to toggle source
# File lib/action_dispatch/system_testing/test_helpers/screenshot_helper.rb, line 86
def failed?
  !passed? && !skipped?
end
image_name() click to toggle source
# File lib/action_dispatch/system_testing/test_helpers/screenshot_helper.rb, line 41
def image_name
  failed? ? "failures_#{method_name}" : method_name
end
image_path() click to toggle source
# File lib/action_dispatch/system_testing/test_helpers/screenshot_helper.rb, line 45
def image_path
  @image_path ||= absolute_image_path.relative_path_from(Pathname.pwd).to_s
end
inline_base64(path) click to toggle source
# File lib/action_dispatch/system_testing/test_helpers/screenshot_helper.rb, line 82
def inline_base64(path)
  Base64.encode64(path).gsub("\n", "")
end
output_type() click to toggle source
# File lib/action_dispatch/system_testing/test_helpers/screenshot_helper.rb, line 57
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
save_image() click to toggle source
# File lib/action_dispatch/system_testing/test_helpers/screenshot_helper.rb, line 53
def save_image
  page.save_screenshot(absolute_image_path)
end
supports_screenshot?() click to toggle source
# File lib/action_dispatch/system_testing/test_helpers/screenshot_helper.rb, line 90
def supports_screenshot?
  Capybara.current_driver != :rack_test
end