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 35
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 23
def take_screenshot
  save_image
  puts display_image
end

Private Instance Methods

display_image() click to toggle source
# File lib/action_dispatch/system_testing/test_helpers/screenshot_helper.rb, line 65
def display_image
  message = "[Screenshot]: #{image_path}\n"

  case output_type
  when "artifact"
    message << "\e]1338;url=artifact://#{image_path}\a\n"
  when "inline"
    name = inline_base64(File.basename(image_path))
    image = inline_base64(File.read(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 84
def failed?
  !passed? && !skipped?
end
image_name() click to toggle source
# File lib/action_dispatch/system_testing/test_helpers/screenshot_helper.rb, line 40
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 44
def image_path
  "tmp/screenshots/#{image_name}.png"
end
inline_base64(path) click to toggle source
# File lib/action_dispatch/system_testing/test_helpers/screenshot_helper.rb, line 80
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 52
def output_type
  # Environment variables have priority
  output_type = ENV["RAILS_SYSTEM_TESTING_SCREENSHOT"] || ENV["CAPYBARA_INLINE_SCREENSHOT"]

  # If running in a CI environment, default to simple
  output_type ||= "simple" if ENV["CI"]

  # Default
  output_type ||= "inline"

  output_type
end
save_image() click to toggle source
# File lib/action_dispatch/system_testing/test_helpers/screenshot_helper.rb, line 48
def save_image
  page.save_screenshot(Rails.root.join(image_path))
end
supports_screenshot?() click to toggle source
# File lib/action_dispatch/system_testing/test_helpers/screenshot_helper.rb, line 88
def supports_screenshot?
  Capybara.current_driver != :rack_test
end