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 called during system test teardown.

# File 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
  metadata[:failure_screenshot_path] = relative_image_path if Minitest::Runnable.method_defined?(:metadata)
end
take_screenshot(html: false, screenshot: nil) 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 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 (iterm2.com/documentation-images.html).

`artifact`

: Display the screenshot in the terminal, using the terminal artifact format (buildkite.github.io/terminal-to-html/inline-images/).

# File 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

Private Instance Methods

absolute_html_path() click to toggle source
# File lib/action_dispatch/system_testing/test_helpers/screenshot_helper.rb, line 106
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 98
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 90
def absolute_path
  Rails.root.join(screenshots_dir, image_name)
end
display_image(html:, screenshot_output:) click to toggle source
# File 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
failed?() click to toggle source
# File lib/action_dispatch/system_testing/test_helpers/screenshot_helper.rb, line 154
def failed?
  !passed? && !skipped?
end
html_from_env?() click to toggle source
# File lib/action_dispatch/system_testing/test_helpers/screenshot_helper.rb, line 63
def html_from_env?
  ENV["RAILS_SYSTEM_TESTING_SCREENSHOT_HTML"] == "1"
end
html_path() click to toggle source
# File lib/action_dispatch/system_testing/test_helpers/screenshot_helper.rb, line 86
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 76
def image_name
  sanitized_method_name = method_name.gsub(/[^\w]+/, "-")
  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 82
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 67
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 150
def inline_base64(path)
  Base64.strict_encode64(path)
end
output_type() click to toggle source

rubocop:enable Lint/Debugger

# File 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() click to toggle source
# File 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() click to toggle source

rubocop:disable Lint/Debugger

# File lib/action_dispatch/system_testing/test_helpers/screenshot_helper.rb, line 111
def save_html
  page.save_page(absolute_html_path)
end
save_image() click to toggle source
# File lib/action_dispatch/system_testing/test_helpers/screenshot_helper.rb, line 115
def save_image
  page.save_screenshot(absolute_image_path)
end
screenshots_dir() click to toggle source
# File lib/action_dispatch/system_testing/test_helpers/screenshot_helper.rb, line 94
def screenshots_dir
  Capybara.save_path.presence || "tmp/screenshots"
end
show(img) click to toggle source
# File lib/action_dispatch/system_testing/test_helpers/screenshot_helper.rb, line 130
def show(img)
  puts img
end
supports_screenshot?() click to toggle source
# File lib/action_dispatch/system_testing/test_helpers/screenshot_helper.rb, line 158
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 72
def unique
  failed? ? "failures" : (_screenshot_counter || 0).to_s
end