module ActionDispatch::SystemTesting::TestHelpers::ScreenshotHelper

Screenshot helper for system testing.

Attributes

_screenshot_counter[RW]

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 44
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. 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 screenshot will be displayed in your console, if supported.

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

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 30
def take_screenshot
  increment_unique
  save_html if save_html?
  save_image
  puts display_image
end

Private Instance Methods

absolute_html_path() click to toggle source
# File lib/action_dispatch/system_testing/test_helpers/screenshot_helper.rb, line 86
def absolute_html_path
  "#{absolute_path}.html"
end
absolute_image_path() click to toggle source
# File lib/action_dispatch/system_testing/test_helpers/screenshot_helper.rb, line 82
def absolute_image_path
  "#{absolute_path}.png"
end
absolute_path() click to toggle source
# File lib/action_dispatch/system_testing/test_helpers/screenshot_helper.rb, line 78
def absolute_path
  Rails.root.join("tmp/screenshots/#{image_name}")
end
display_image() click to toggle source
# File lib/action_dispatch/system_testing/test_helpers/screenshot_helper.rb, line 108
def display_image
  message = +"[Screenshot Image]: #{image_path}\n"
  message << +"[Screenshot HTML]: #{html_path}\n" if save_html?

  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 128
def failed?
  !passed? && !skipped?
end
html_path() click to toggle source
# File lib/action_dispatch/system_testing/test_helpers/screenshot_helper.rb, line 74
def html_path
  absolute_html_path.to_s
end
image_name() click to toggle source
# File lib/action_dispatch/system_testing/test_helpers/screenshot_helper.rb, line 64
def image_name
  sanitized_method_name = method_name.tr("/\\", "--")
  name = "#{unique}_#{sanitized_method_name}"
  name[0...225]
end
image_path() click to toggle source
# File lib/action_dispatch/system_testing/test_helpers/screenshot_helper.rb, line 70
def image_path
  absolute_image_path.to_s
end
increment_unique() click to toggle source
# File lib/action_dispatch/system_testing/test_helpers/screenshot_helper.rb, line 55
def increment_unique
  @_screenshot_counter ||= 0
  @_screenshot_counter += 1
end
inline_base64(path) click to toggle source
# File lib/action_dispatch/system_testing/test_helpers/screenshot_helper.rb, line 124
def inline_base64(path)
  Base64.strict_encode64(path)
end
output_type() click to toggle source
# File lib/action_dispatch/system_testing/test_helpers/screenshot_helper.rb, line 98
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_html() click to toggle source
# File lib/action_dispatch/system_testing/test_helpers/screenshot_helper.rb, line 90
def save_html
  page.save_page(absolute_html_path)
end
save_html?() click to toggle source
# File lib/action_dispatch/system_testing/test_helpers/screenshot_helper.rb, line 51
def save_html?
  ENV["RAILS_SYSTEM_TESTING_SCREENSHOT_HTML"] == "1"
end
save_image() click to toggle source
# File lib/action_dispatch/system_testing/test_helpers/screenshot_helper.rb, line 94
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 132
def supports_screenshot?
  Capybara.current_driver != :rack_test
end
unique() click to toggle source
# File lib/action_dispatch/system_testing/test_helpers/screenshot_helper.rb, line 60
def unique
  failed? ? "failures" : (_screenshot_counter || 0).to_s
end